function TrimLeft( strInput)
{
  var l = strInput.length, i = 0;
  if( strInput.indexOf( ' ', 0) == 0)
    while( ( i < l) && ( strInput.charAt( i) == ' '))
      i++;
  return strInput.substring( i, l);
}

function TrimRight( strInput)
{
  var l = strInput.length, i = l - 1;
  if( strInput.lastIndexOf( ' ') == i)
    while( ( i > 0) && ( strInput.charAt( i) == ' '))
      i--;
  return strInput.substring( 0, i + 1);
}

function Trim( strInput)
{
  return TrimRight( TrimLeft( strInput));
}

function IsFarsiNumber( sInput)
{
  var isNumber = true;
  var i = 0, l = sInput.length;
  while( isNumber && ( i < l))
  {
    if( sInput.charCodeAt( i) < 1776)
    {
      if( ( sInput.charCodeAt( i) < 48) || ( sInput.charCodeAt( i) > 57))
        isNumber = false;
    }    
    else
      if( sInput.charCodeAt( i) > 1785)
        isNumber = false;
    i++;
  }
  return isNumber;
}

function IsFarsi( sInput)
{
  var FarsiCodes = new Array
  ( 
    1523, 1524, 1548, 1563, 1567, 1569, 1571, 1570, 1575, 1576, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585,
    1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609,
    1610, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1662, 1670, 1688, 1705,
    1711, 1728, 1740, 1749, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785,
    64342, 64343, 64344, 64345, 64378, 64379, 64380, 64381, 64394, 64395, 64398, 64399, 64400, 64401, 64402, 64403,
    64404, 64405, 64420, 64421, 64508, 64509, 64510, 64830, 64831, 65152, 65153, 65154, 65155, 65156, 65157, 65158,
    65159, 65160, 65163, 65164, 65165, 65166, 65167, 65168, 65169, 65170, 65171, 65172, 65173, 65174, 65175, 65176,
    65177, 65178, 65179, 65180, 65181, 65182, 65183, 65184, 65185, 65186, 65187, 65188, 65189, 65190, 65191, 65192,
    65193, 65194, 65195, 65196, 65197, 65198, 65199, 65200, 65201, 65202, 65203, 65204, 65205, 65206, 65207, 65208,
    65209, 65210, 65211, 65212, 65213, 65214, 65215, 65217, 65218, 65219, 65220, 65221, 65222, 65223, 65224, 65225,
    65226, 65227, 65228, 65229, 65230, 65231, 65232, 65233, 65234, 65235, 65236, 65237, 65238, 65239, 65240, 65241,
    65242, 65243, 65244, 65245, 65246, 65247, 65248, 65249, 65250, 65251, 65252, 65253, 65254, 65255, 65256, 65257,
    65258, 65259, 65260, 65261, 65262, 65263, 65264, 65265, 65266, 65267, 65268, 65269, 65271, 65272, 65270, 65273,
    65274, 65275, 65276
  );
  NumCodes = new Array( 48, 49, 50, 51, 52, 53, 54, 55, 56, 57);
  var s = new String();
  s = FarsiCodes.toString() + NumCodes.toString();
  
  var bIsFarsi = true;
  for( i = 0; ( i < sInput.length) && bIsFarsi; i++)
    if( s.indexOf( sInput.charCodeAt( i), 0) == -1)
      bIsFarsi = false;
  return bIsFarsi;
}

function IsLatin( sInput)
{
  var bIsLatin = true;
  for( i = 0; ( i < sInput.length) && bIsLatin; i++)
    bIsLatin = ( sInput.charCodeAt( i) < 256)
  return bIsLatin;
}

function IsCorrect( Obj, e)
{
  var emailPat = /^(\".*\"|[A-Za-z]\w*)@(\[\d{1,3}(\.\d{1,3}){3}]|[A-Za-z]\w*(\.[A-Za-z]\w*)+)$/;
  var bIsCorrect = true;
  var doCheckFunc = new String();
  var elemValue;
  if( ( e.type == 'text') || ( e.type == 'select-one') || ( e.type == 'password') || ( e.type == 'textarea') || ( e.type == 'hidden'))
    elemValue = e.value;
  else if( e.type == 'span')
    elemValue = e.innerText;
  if( ( e.type == 'text') || ( e.type == 'select-one') || ( e.type == 'password') || ( e.type == 'textarea') || ( e.type == 'hidden') || ( e.type == 'span'))
  {
    doCheckFunc = e.doCheck;
    if( ( doCheckFunc == '') || ( doCheckFunc == null))
      doCheckFunc = e.docheck;
    if( doCheckFunc != null)
      if( doCheckFunc == 'IsFilled')
        bIsCorrect = ( Trim( elemValue) != '');
      else if( doCheckFunc == 'IsNumeric')
        bIsCorrect = ( ( Trim( elemValue) != '') && !isNaN( elemValue));
      else if( doCheckFunc == 'IsNumericEx')
        bIsCorrect = ( Trim( e.value) == '') || !isNaN( e.value);
      else if( doCheckFunc == 'IsFarsiNumber')
        bIsCorrect = ( ( Trim( elemValue) != '') && IsFarsiNumber( elemValue));
      else if( doCheckFunc == 'IsFarsiNumberEx')
        bIsCorrect = IsFarsiNumber( elemValue);
      else if( doCheckFunc == 'CheckLen')
        bIsCorrect = ( elemValue.length >= e.minLen);
      else if( doCheckFunc == 'reEnter')
        bIsCorrect = ( elemValue == eval( 'Obj.' + e.MasterInput + '.value'));
      else if( doCheckFunc == 'IsEmail')
      {
        var AtPos = e.value.indexOf( '@', 0);
        var DotPosAfterAt = e.value.indexOf( '.', AtPos);
        bIsCorrect = ( AtPos > 0) && ( ( DotPosAfterAt - AtPos) > 1) && ( e.value.length > ( DotPosAfterAt + 1));
//        bIsCorrect = ( e.value.match( emailPat) != null);
      }
      else if( doCheckFunc == 'IsEmailEx')
      {
        bIsCorrect = ( Trim( e.value) == '');
        var AtPos = e.value.indexOf( '@', 0);
        var DotPosAfterAt = e.value.indexOf( '.', AtPos);
        bIsCorrect = bIsCorrect || ( AtPos > 0) && ( ( DotPosAfterAt - AtPos) > 1) && ( e.value.length > ( DotPosAfterAt + 1));
      }
      else if( doCheckFunc == 'IsFarsi')
        bIsCorrect = ( ( Trim( elemValue) != '') && IsFarsi( elemValue));
      else if( doCheckFunc == 'IsFarsiEx')
        bIsCorrect = IsFarsi( elemValue);
      else if( doCheckFunc == 'IsLatin')
        bIsCorrect = ( ( Trim( elemValue) != '') && IsLatin( elemValue));
      else if( doCheckFunc == 'IsLatinEx')
        bIsCorrect = IsLatin( elemValue);
      else
        bIsCorrect = eval( doCheckFunc + '( \'' + elemValue + '\');');
  }
  return bIsCorrect;
}

function ShowError( e, ErrorType)
{
  if( ErrorType.toLowerCase() == 'alert')
  {
    alert( e.ErrorMsg);
    if( ( e.type == 'text') || ( e.type == 'password') || ( e.type == 'textarea'))
    {
      e.focus();
      e.select();
    }
  }
  else
  {
    var ErrorSpan;
    ErrorSpan = eval( e.ErrorSpan);
    if( ErrorSpan == null)
      ErrorSpan = document.all[ e.id + '_Error'];
    if( ErrorSpan != null)
    {
      ErrorSpan.style.display = '';
      ErrorSpan.innerHTML = e.ErrorMsg;
    }
    else
      alert( e.ErrorMsg);
  }
  return;
}

function ShowDefault( e, ErrorType)
{
  var ErrorSpan = document.all[ e.id + '_Error'];
  if( ErrorSpan != null)
  {
    ErrorSpan.style.display = '';
    ErrorSpan.innerHTML = e.DefaultMsg;
  }
}

function Check( Obj)
{
  var FirstInvalidInput = null;
  var bIsCorrect = true, bDoSubmit = true;
  var i = 0;
  var doFormCheck = eval( 'Obj.' + Obj.bDoCheck + '.value');
  var ErrorType   = new String();
  if( ( Obj.ErrorType == null) || ( Obj.ErrorType == ''))
    ErrorType = 'alert';
  else
    ErrorType = Obj.ErrorType.toLowerCase();
  if( doFormCheck == 1)
    while( ( i < Obj.elements.length) && ( bIsCorrect || ( ErrorType.toLowerCase() != 'alert')))
    {
      var e = Obj.elements[ i++];
      if( !IsCorrect( Obj, e))
      {
        if( FirstInvalidInput == null)
          FirstInvalidInput = e;
        bIsCorrect = false;
        bDoSubmit  = false;
        ShowError( e, ErrorType);
      }
      else
        if( ErrorType.toLowerCase() != 'alert')
          ShowDefault( e, ErrorType);
    }/* while( ...) */
  if( ( ErrorType.toLowerCase() != 'alert') && !bDoSubmit && ( FirstInvalidInput != null))
  {
    if( ( FirstInvalidInput.type == 'text') || ( FirstInvalidInput.type == 'password') || ( FirstInvalidInput.type == 'textarea'))
    {
      FirstInvalidInput.focus();
      FirstInvalidInput.select();
    }
  }
  return bDoSubmit;
}/* function */