<!--

/**
 * formvalidate.js
 * JavaScript library for form field validation.
 * Developed by eVelopers Corporation $$
 * $Workfile: $
 * $Author: belov$
 *
 * $Log:
 * $
 *
*/

var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"

var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"


var whitespace = "\b\t\n\r";
var phoneNumberDelimiters = "()- ";
var validUSPhoneChars = digits + phoneNumberDelimiters;

var validWorldPhoneChars = digits + phoneNumberDelimiters + "+";

var SSNDelimiters = "- ";
var lowerYear=1900;
var defaultDatePattern="dd.MM.yyyy"
//  "M"        month in year           (Text & Number)
//  "d"       day in month            (Number)            
//  "y"        year                    (Number)
// "/""-"" ",""."                              (Delimiters)
//(Text): 4 or more pattern letters--use full form, < 4--use short or abbreviated form if one exists. 
//(Number): the minimum number of digits. Shorter numbers are zero-padded to this amount. Year is handled specially; that is, if the count of 'y' is 2, the Year will be truncated to 2 digits. 
//(Text & Number): 3 or over, use Text, otherwise use Number. 
var groupingSeparator=" ";
var decimalSeparator=".";
var currencySymbol="$"


var validSSNChars = digits + SSNDelimiters;
var digitsInSocialSecurityNumber = 9;
var digitsInUSPhoneNumber = 10;
var ZIPCodeDelimiters = "-";
var ZIPCodeDelimeter = "-"
var validZIPCodeChars = digits + ZIPCodeDelimiters
var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9
var creditCardDelimiters = " "
var mPrefix = "You did not enter a value into the "
var mSuffix = " field. This is a required field. Please enter it now."


var sUSLastName = "Last Name"
var sUSFirstName = "First Name"
var sWorldLastName = "Family Name"
var sWorldFirstName = "Given Name"
var sTitle = "Title"
var sCompanyName = "Company Name"
var sUSAddress = "Street Address"
var sWorldAddress = "Address"
var sCity = "City"
var sStateCode = "State Code"
var sWorldState = "State, Province, or Prefecture"
var sCountry = "Country"
var sZIPCode = "ZIP Code"
var sWorldPostalCode = "Postal Code"
var sPhone = "Phone Number"
var sFax = "Fax Number"
var sDateOfBirth = "Date of Birth"
var sExpirationDate = "Expiration Date"
var sEmail = "Email"
var sSSN = "Social Security Number"
var sCreditCardNumber = "Credit Card Number"
var sOtherInfo = "Other Information"

var iStateCode = "This field must be a valid two character U.S. state abbreviation (like CA for California). Please reenter it now."
var iZIPCode = "This field must be a 5 or 9 digit U.S. ZIP Code (like 94043). Please reenter it now."
var iUSPhone = "This field must be a 10 digit U.S. phone number (like 415 555 1212). Please reenter it now."
var iWorldPhone = "This field must be a valid international phone number. Please reenter it now."
var iSSN = "This field must be a 9 digit U.S. social security number (like 123 45 6789). Please reenter it now."
var iEmail = "This field must be a valid email address (like foo@bar.com). Please reenter it now."
var iCreditCard = "This field must be a valid credit card number. Please reenter it now."
var iCreditCardPrefix = "This is not a valid "
var iCreditCardSuffix = " credit card number. (Click the link on this form to see a list of sample numbers.) Please reenter it now."
var iDay = "This field must be a day number between 1 and 31.  Please reenter it now."
var iMonth = "This field must be a month number between 1 and 12.  Please reenter it now."
var iYear = "This field must be a 4 digit year number.  Please reenter it now."
var iDatePrefix = "The Day, Month, and Year for "
var iDateSuffix = " do not form a valid date.  Please reenter them now."
var iDate = "This field must be a valid date. Please reenter it now."

var iInteger = "This field must be a whole number value. Please reenter it now."
var iPositiveInteger = "This field must be a positive whole number value. Please reenter it now."
var iAlphabetic = "This field must contain only letters. Please reenter it now."
var iNumber = "This field must contain only numeric values. Please reenter it now."
var iCustom = "Invalid value.  Please reenter."

var pEntryPrompt = "Please enter a "
var pStateCode = "2 character code (like CA)."
var pZIPCode = "5 or 9 digit U.S. ZIP Code (like 94043)."
var pUSPhone = "10 digit U.S. phone number (like 415 555 1212)."
var pWorldPhone = "international phone number."
var pSSN = "9 digit U.S. social security number (like 123 45 6789)."
var pEmail = "valid email address (like foo@bar.com)."
var pCreditCard = "valid credit card number."
var pDay = "day number between 1 and 31."
var pMonth = "month number between 1 and 12."
var pYear = "4 digit year number."

//************************************************************************************
function makeArray(n) {
   for (var i = 1; i <= n; i++) {
      this[i] = 0
   }
   return this
}


var nameOfMonth= new Array();
nameOfMonth[1]="Jan";
nameOfMonth[2]="Feb";
nameOfMonth[3]="Mar";
nameOfMonth[4]="Apr";
nameOfMonth[5]="May";
nameOfMonth[6]="Jun";
nameOfMonth[7]="Jul";
nameOfMonth[8]="Aug";
nameOfMonth[9]="Sep";
nameOfMonth[10]="Oct";
nameOfMonth[11]="Nov";
nameOfMonth[12]="Dec";

var nameOfMonthFull= ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

var daysInMonth = makeArray(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;   // must programmatically check this
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;

var USStateCodeDelimiter = "|";
var USStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP"
//************************************************************************************
function isEmpty(s)
{   
	if((s == null) || (s.length == 0)) return true;
	var reg = new RegExp("^\\s+$","g");
	return reg.test(s);

}
//************************************************************************************
function trim(s)
{
 s=s.replace(/^([\s]+)/,"");
 s=s.replace(/([\s]+)$/,"");
 return s;
} 
//************************************************************************************
function stripCharsInBag (s, bag)

{   var i;
    var returnString = "";

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}
//************************************************************************************
function stripCharsNotInBag (s, bag)

{   var i;
    var returnString = "";

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (bag.indexOf(c) != -1) returnString += c;
    }

    return returnString;
}
//************************************************************************************
function stripWhitespace (s)

{   return stripCharsInBag (s, whitespace)
}

//************************************************************************************
function charInString (c, s)
{   for (i = 0; i < s.length; i++)
    {   if (s.charAt(i) == c) return true;
    }
    return false
}
//************************************************************************************

function stripInitialWhitespace (s)

{   var i = 0;

    while ((i < s.length) && charInString (s.charAt(i), whitespace))
       i++;

    return s.substring (i, s.length);
}
//************************************************************************************
//Allows blanks as well as letters
function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) || (c==" "))
}

function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c))
}
//************************************************************************************
function isInteger (s)
{   
    var reg = new RegExp("^\\d+$","g");
	return reg.test(s);
}

//************************************************************************************
function isSignedInteger (s)
{   
        var startPos = 0;

            if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;
        return (isInteger(s.substring(startPos, s.length)))
    
}

//************************************************************************************
function isPositiveInteger (s)
{  

    return (isSignedInteger(s)
         &&  (parseInt (s) > 0)  );
}
//************************************************************************************

function isNonnegativeInteger (s)
{  
    return (isSignedInteger(s)
         && (parseInt (s) >= 0) );
}
//************************************************************************************

function isNegativeInteger (s)
{  
    return (isSignedInteger(s)
         &&(parseInt (s) < 0)  );
}

//************************************************************************************
function isNonpositiveInteger (s)
{   
    return (isSignedInteger(s)
         && (parseInt (s) <= 0) );
}

//************************************************************************************
function isFloat (s)
{   var i;
    var seenDecimalPoint = false;

    
    if (s == ".") return false;
	var resArr=s.match(/(e[\-\+]?\d+)$/gi);
	if(resArr&&resArr.length>1)return false;
	if(resArr&&resArr.length==1)
	  s=s.replace(/\B(e[\-\+]?)/gi,"");
    for (i = 0; i < s.length; i++)
    {
        // Check that current character is number.
        var c = s.charAt(i);

        if ((c == ".") && !seenDecimalPoint) seenDecimalPoint = true;
        else if (!isDigit(c)) return false;
    }

    return true;
}
//************************************************************************************
function isSignedFloat (s)
{   
        var startPos = 0;
        // skip leading + or -
        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;
        return (isFloat(s.substring(startPos, s.length)))
    
}

//************************************************************************************
function isPositiveFloat (s)
{   
	return ( isSignedFloat(s) &&  (parseFloat (s) > 0)  );
}

//************************************************************************************
function isFloatInRange (s, a, b)
{     if (!isFloat(s)) return false;

    var num = parseFloat(s);
    return ((num >= a) && (num <= b));
}

//************************************************************************************
function isAlphabetic (s) {   
    var i;
    
    for (i = 0; i < s.length; i++) {
        // Check that current character is letter.
        var c = s.charAt(i);

        if (!isLetter(c))
            return false;
    }

    // All characters are letters.
    return true;
}
//************************************************************************************
function isAlphanumeric (s) {   
    var i;
      for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);

        if (! (isLetter(c) || isDigit(c) ) )
        return false;
    }

    return true;
}

//************************************************************************************
function isEmail (s)
{   
   if (window.RegExp) {
    var reg1str = "( )|(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)|(^_+@)|(^\\-+@)";
    var reg2str = "^[\\w\\.\\-]+@((\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,6}|[0-9]{1,3})(\\]?)|[a-zA-Z0-9\\-]{2,})$";
    var reg1 = new RegExp(reg1str);
    var reg2 = new RegExp(reg2str);
    if (!reg1.test(s) && reg2.test(s))
      return true;
    return false;
  } else {
    if(str.indexOf("@") >= 0)
      return true;
    return false;
  }
}
//************************************************************************************
function isIntegerInRange (s, a, b)
{     if (!isInteger(s)) return false;

    var num = parseInt (s,10);
    return ((num >= a) && (num <= b));
}
//************************************************************************************
function isYear (s)
{     if (!isNonnegativeInteger(s)) return false;
	if(parseInt(s)<lowerYear) return false;
    return ((s.length == 4));
}
//************************************************************************************
function isMonth (s)
{  	
    return isIntegerInRange (s, 1, 12);
}

//************************************************************************************
function isDay (s)
{      
    return isIntegerInRange (s, 1, 31);
}

//************************************************************************************
function daysInFebruary (year)
{
    return ( ((year % 4 == 0) && (!(year % 100 == 0) || (year % 400 == 0) ) ) ? 29 : 28 );
}
//************************************************************************************
function isDate (year, month, day)
{
    if (! (isYear(year) && isMonth(month) && isDay(day))) return false;

    var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);
    if (intDay > daysInMonth[intMonth]) return false;    
    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

    return true;
}
//************************************************************************************
function isFullNameOfMonth (s)
{
 for(i=1;i<=12;i++)
 {
 if(s==nameOfMonthFull[i])return i;
 }
 return -1;
}
//************************************************************************************
function isNameOfMonth (s)
{
 for(i=1;i<=12;i++)
 {
 if(s==nameOfMonth[i])return i;
 }
 return -1;
}
//************************************************************************************
function prompt (s)
{   window.status = s
}

//************************************************************************************
function promptEntry (s)
{   window.status = pEntryPrompt + s
}
//************************************************************************************
  //comparison 'date' with 'somedate'
  //return -1 if date<somedate
   //return 0 if date==somedate
    //return 1 if date>somedate
   function compDate(date,somedate,pattern)
   {
   if(!pattern||pattern=="")pattern=defaultDatePattern;  
   if(date==somedate)return 0;
   if((somedate=="")||(date==""))return 0;
     dArray = dateConv(date,pattern);
     sdArray = dateConv(somedate,pattern);

	 
	if(dArray[2]*1<sdArray[2]*1)return -1;
	if(dArray[2]*1>sdArray[2]*1)return 1;
	if(dArray[2]*1==sdArray[2]*1){
          if(dArray[0]*1<sdArray[0]*1)return -1;
	      if(dArray[0]*1>sdArray[0]*1)return 1;
	      if(dArray[0]*1==sdArray[0]*1){
		      if(dArray[1]*1<sdArray[1]*1)return -1;
	          if(dArray[1]*1>sdArray[1]*1)return 1;
	          if(dArray[1]*1==sdArray[1]*1)return 0;
		  }
	}	  	  
	return 0;
   }
//************************************************************************************
function warnEmpty (s)
{    
 
     message[message.length]=mPrefix+'"'+s+'"'+mSuffix;
    return false;
}
//************************************************************************************

function warnInvalid (attachmentName,s)
{ 
    attachment="Wrong data in \""+attachmentName+"\" field: "; 
     message[message.length]=attachment+s;
  return false;
}
//************************************************************************************
//********************************Validate functions**********************************
//************************************************************************************
function checkEmpty(theField,nameInMessage,errMessage)
{ 
  if(nameInMessage=="")
     nameInMessage=theField.name;
  if (isEmpty(theField.value))
  { 
    if(errMessage=="")
	 return warnEmpty(nameInMessage)
	else
	 return warnInvalid (nameInMessage,errMessage)
 }
  return true;
}  
//************************************************************************************
function checkEmptyMultipleSelect(theSelect,nameInMessage,errMessage)
{ 
  if(nameInMessage=="")
     nameInMessage=theSelect.name;
document.Form1.select1.options[document.Form1.select1.options.selectedIndex]
 for(i=0;i<theSelect.options.length;i++) {
  if(theSelect.options[i].selected) {
    if (isEmpty(theSelect.options[i].value))
    { 
     if(errMessage=="")
	   return warnInvalid (nameInMessage,"The list of chosen values contain empty value.")
	 else
	  return warnInvalid (nameInMessage,errMessage)
    }
   }
  }
   
  return true;
}  
//************************************************************************************
//*********************************digitPatternToRegexp*******************************
function digitPatternToRegexp(pattern) {
           var result="";
           var del=pattern.indexOf("."); // look delimiter
           var group=-1;
           if (del>0)
              group=pattern.substring(0,del).lastIndexOf(","); //look grouping symbol
           else group=pattern.lastIndexOf(",");
           if ((del>=0) && (group>=0)) { //have delimiter and grouping
             var groupSize=del-group-1;
              if (groupSize>0) {
                 var sign=pattern.substring(group-1,group);
                 if (sign=="0"|| sign=="#")
                    group--;
                 result+=checkDigitPattern(pattern.substring(0,group));
                 var fract=pattern.substring(del+1);
                 if (fract.indexOf("0")>=0) { //if has 0, need symbol(s) after decimal point
                    result+="(["+groupingSeparator+"]?\\d?{"+groupSize+"})(["+
                      groupingSeparator+"]\\d{"+groupSize+"})*["+decimalSeparator+"]";
                    result+=checkDigitPattern(fract);
                 }
                 else {
                    result+="(["+groupingSeparator+"]?\\d?{"+groupSize+"})(["+
                      groupingSeparator+"]\\d{"+groupSize+"})*(["+decimalSeparator+"]";
                    result+=checkDigitPattern(fract);
                    result+=")?";
                 }
              }
           }
           else if (del>0) {
              var fract=pattern.substring(del+1);
              if (fract.indexOf("0")>=0) { //if has 0, need symbol(s) after decimal point
                 result+=checkDigitPattern(pattern.substring(0,del),true);
                 result+="["+decimalSeparator+"]";
                 result+=checkDigitPattern(fract,false);
              }
              else {
                  result+=checkDigitPattern(pattern.substring(0,del),true);
                  result+="(["+decimalSeparator+"]";
                  result+=checkDigitPattern(fract,false);
                  result+=")?";
              }
           }
           else result=checkDigitPattern(pattern);
           return result="^"+result+"$";
    }
//************************************************************************************
function checkDigitPattern( pattern,extendDigit) {
           var replaced=false;
           var sb=pattern;
            out="";
           for (var i=0; i<sb.length; i++) {
               var c=sb.charAt(i);
               switch (c) {
                     case '0':
                          out+="\\d";// \d operator
                          break;
                     case '#':
                          if (extendDigit && !replaced) {
                             out+="\\d*";// \d* operator
                             replaced=true;
                          }
                          else out+="\\d?";// \d? operator
                          break;
                     case ' ':
                          out+=" ";// \s operator
                          break;
                     case '.':
                          out+='[';
                          out+=decimalSeparator;
                          out+=']';
                          break;
                     case ',':
                          out+='[';
                          out+=groupingSeparator;
                          out+=']';
                          break;
                     case '¤':
                          out+='[';
                          out+=currencySymbol;
                          out+=']';
                          break;
                     case 'X': //any other symbol
                          out+="\\w";
                          break;
                     case '-': //minus sign
                          out+="["+minusSign+"]?";
                          break;
                     default: //this symbol
                       out+="["+c+"]";
               }
           }
           return out;
    }
//************************************************************************************
function reformatNumber(strnum,pattern)
{
}	
//************************************************************************************
function checkNumber(theField,nameInMessage,errMessage,pattern)
{  
   
   if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iNumber;
   
   if (!pattern||pattern==""){
     if (!isSignedFloat(theField.value))
       return warnInvalid (nameInMessage,errMessage);
	 return true;
   } else {
     reg=new RegExp(digitPatternToRegexp(pattern),"g");
	 if(!reg.test(theField.value)){
	     if (!isSignedFloat(theField.value)) {
              return warnInvalid (nameInMessage,errMessage);
	     }else {
	          return warnInvalid (nameInMessage,"This Number does not correspond format: "+pattern);
		 }
	 }	  
   }
   return true;
}

//************************************************************************************
function checkPositiveNumber(theField,nameInMessage,errMessage,pattern)
{  
   if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iNumber;
   
   if (!pattern||pattern==""){
     if (!isPositiveFloat(theField.value))
       return warnInvalid (nameInMessage,errMessage);
	 return true;
   } else {
     reg=new RegExp(digitPatternToRegexp(pattern),"g");
	 if(!reg.test(theField.value)){
	     if (!isPositiveFloat(theField.value)) {
              return warnInvalid (nameInMessage,errMessage);
	     }else {
	          return warnInvalid (nameInMessage,"This Number does not correspond format: "+pattern);
		 }
	 }	  
   }
   return true;
}

//************************************************************************************
function checkInteger (theField,nameInMessage,errMessage)
{  
  if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iInteger;
   if (!isSignedInteger(theField.value))
       return warnInvalid (nameInMessage, errMessage);
   else return true;
}

//************************************************************************************
function checkPositiveInteger (theField,nameInMessage,errMessage)
{  
    if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iPositiveInteger;
    if (theField.value.substring(0,1)=="+")
       sNum = theField.value.substring(1);
    else
       sNum = theField.value;
       
    if (!isInteger(sNum))
       return warnInvalid (nameInMessage, errMessage);
    return true;
} 
//************************************************************************************
function checkPositiveIntegerNotNull (theField,nameInMessage,errMessage)
{  
    if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iPositiveInteger;
    if (theField.value.substring(0,1)=="+")
       sNum = theField.value.substring(1);
    else
       sNum = theField.value;
       
    if (! isPositiveInteger(sNum))
       return warnInvalid (nameInMessage, errMessage);
    else return true;
} 
//************************************************************************************
function checkIntegerInRange (theField,a,b,nameInMessage,errMessage)
{  
    if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
//   if(errMessage=="")errMessage=iPositiveInteger;
    if (theField.value.substring(0,1)=="+")
       sNum = theField.value.substring(1);
    else
       sNum = theField.value;
       
    if (! isIntegerInRange(sNum, a, b))
       return warnInvalid (nameInMessage, errMessage);
    else return true;
}

//************************************************************************************
function checkFloatInRange (theField,a,b,nameInMessage,errMessage)
{  
    if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;

    if (theField.value.substring(0,1)=="+")
       sNum = theField.value.substring(1);
    else
       sNum = theField.value;
       
    if (! isFloatInRange(sNum, a, b))
       return warnInvalid (nameInMessage, errMessage);
    else return true;
}

//************************************************************************************
function checkAlphabetic (theField,nameInMessage,errMessage)
{   if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iAlphabetic;
   if (!isAlphabetic(theField.value))
       return warnInvalid (nameInMessage, errMessage);
    else return true;
}
//************************************************************************************
function checkEmail (theField,nameInMessage,errMessage)
{   if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iEmail;
   theField.value=trim(theField.value)
   if (!isEmail(theField.value))
       return warnInvalid (nameInMessage, errMessage);
    else return true;
}
//************************************************************************************
function checkYear (theField,nameInMessage,errMessage)
{  if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iYear;
    if (!isYear(theField.value))
       return warnInvalid (nameInMessage, errMessage);
    else return true;
}
//************************************************************************************

function checkMonth (theField,nameInMessage,errMessage)
{  if (isEmpty(theField.value))return true;
    if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iMonth;
    if (!isMonth(theField.value))
       return warnInvalid (nameInMessage, errMessage);
    else return true;
}

//************************************************************************************
function checkDay (theField,nameInMessage,errMessage)
{  if (isEmpty(theField.value))return true;
     if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iDay;
    if (!isDay(theField.value))
       return warnInvalid (nameInMessage, errMessage);
    else return true;
}
//************************************************************************************
//*********************************datePatternToRegexp********************************
function parsePattern(s)
{
  var del="*";
  var reg = new RegExp("^(d{1,2}|M{2,}|y{2,4})\\/(d{1,2}|M{2,}|y{2,4})\\/(d{1,2}|M{2,}|y{2,4})$", "g");
      del=(reg.test(s))?"\/":"*";
      if(del=="*"){
	      reg.compile("^(d{1,2}|M{2,}|y{2,4})\\-(d{1,2}|M{2,}|y{2,4})\\-(d{1,2}|M{2,}|y{2,4})$", "g")
		  del=(reg.test(s))?"\-":"*";}
		  if(del=="*"){
	          reg.compile("^(d{1,2}|M{2,}|y{2,4})\\,(d{1,2}|M{2,}|y{2,4})\\,(d{1,2}|M{2,}|y{2,4})$", "g")
		     del=(reg.test(s))?"\,":"*";}
		     if(del=="*"){
	            reg.compile("^(d{1,2}|M{2,}|y{2,4}) (d{1,2}|M{2,}|y{2,4}) (d{1,2}|M{2,}|y{2,4})$", "g")
		        del=(reg.test(s))?" ":"*";} 
				if(del=="*"){
	                reg.compile("^(d{1,2}|M{2,}|y{2,4})(\\.)(d{1,2}|M{2,}|y{2,4})(\\.)(d{1,2}|M{2,}|y{2,4})$", "g")
		            del=(reg.test(s))?".":"*";}
              
	
if(del=="*")alert("Pattern is wrong!");	
var tempArr=s.split(del);
if(tempArr.length!=3)alert("Pattern is wrong!");	
var tempstr="";
for (var i in tempArr) {
 tempArr[i]=tempArr[i].replace(/d/g,"\\d")
 tempArr[i]=tempArr[i].replace(/y/g,"\\d")
 tempArr[i]=tempArr[i].replace(/M{4,}/g,"[a-zA-z]{4,}")
 tempArr[i]=tempArr[i].replace(/M{3}/g,"[a-zA-z]{3}")
 tempArr[i]=tempArr[i].replace(/M/g,"\\d")
}
newpat=tempArr[0]+del+tempArr[1]+del+tempArr[2]
return new Array(newpat,del)
}
//***********************************************************************************
//
function dateConv(s,pattern)
{
 if(!pattern||pattern=="")pattern=defaultDatePattern;  
 var arrPattern= parsePattern(pattern);
 var reg = new RegExp(arrPattern[0],"g");
 if(!reg.test(s))return new Array();
 sArray = s.split(arrPattern[1])
 if ( (sArray.length < 3) || (sArray.length > 3))return new Array();
 patternArray = pattern.split(arrPattern[1]);
 var d=-1;
 var m=-1;
 var y=-1;
 for (var i=0;i<patternArray.length;i++) {
   d=(patternArray[i].indexOf("d")!=-1)?i:d;
   m=(patternArray[i].indexOf("M")!=-1)?i:m;
   y=(patternArray[i].indexOf("y")!=-1)?i:y;
 }
 if(sArray[m].length==3){
    sArray[m]=(sArray[m].substring(0,1)).toUpperCase()+(sArray[m].substring(1,3)).toLowerCase();
	sArray[m]=isNameOfMonth(sArray[m])
}
if(sArray[m].length>3){
    sArray[m]=(sArray[m].substring(0,1)).toUpperCase()+(sArray[m].substring(1,sArray[m].length)).toLowerCase();
	sArray[m]=isFullNameOfMonth(sArray[m])

}

  return new Array(sArray[m],sArray[d],sArray[y]);

}
//***********************************************************************************
//dateArr[0]-month(MM)
//dateArr[1]-day(dd)
//dateArr[2]-year(yyyy)
function dateConvBack(dateArr,pattern)
{
 if(!pattern||pattern=="")pattern=defaultDatePattern;
 var newDate=pattern;
 newDate=newDate.replace(/d{1,2}/g,dateArr[1]);
 newDate=newDate.replace(/y{4}/g,dateArr[2]);
 newDate=newDate.replace(/y{2}/g,(dateArr[2]+"").substring(2));
 newDate=newDate.replace(/M{4,}/g,nameOfMonthFull[parseInt(dateArr[0],10)-1]);
 newDate=newDate.replace(/M{3}/g,nameOfMonth[parseInt(dateArr[0],10)]);
 newDate=newDate.replace(/M{2}/g,dateArr[0]);
 return newDate;
 
}
//************************************************************************************

//check date by "pattern":
//  M        month in year           (Text & Number)
//  d        day in month            (Number)            
//  y        year                    (Number)
//(Text): 4 or more pattern letters--use full form, < 4--use short or abbreviated form if one exists. 
//(Number): the minimum number of digits. Shorter numbers are zero-padded to this amount. Year is handled specially; that is, if the count of 'y' is 2, the Year will be truncated to 2 digits. 
//(Text & Number): 3 or over, use Text, otherwise use Number. 
//
//field which must contain date -tneField
 function checkDate(theField,nameInMessage,errMessage,pattern) 
 { 
  if(!pattern||pattern=="")pattern=defaultDatePattern;  
  if (isEmpty(theField.value))return true;  
     if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage=iDate;
     
   strDate=theField.value;
    sArray =dateConv(strDate,pattern);
    
    if ( (sArray.length < 3) || (sArray.length > 3))
        return warnInvalid (nameInMessage, errMessage);        
    
    month = sArray[0];
    day = sArray[1];
    year = sArray[2];
	
    if(year.length!=4||parseInt(year)==0)return warnInvalid (nameInMessage, errMessage);
    if (isDate(year, month, day))
        return true;
    else
       return warnInvalid (nameInMessage, errMessage);        
}
 //************************************************************************************

 function checkLess(theField,nameInMessage,errMessage,maxval)
 {   if (isEmpty(theField.value))return true;
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage="This field must be no more than "+maxval;
   if(parseFloat(theField.value)>maxval){
   return  warnInvalid (nameInMessage,errMessage);
  }
   return true;
  }
   //************************************************************************************
   function checkNotLess(theField,nameInMessage,errMessage,minval)
 { 
     if (isEmpty(theField.value))return true;
  if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage="This field can not be less than "+minval;
   if(parseFloat(theField.value)<minval){
   return  warnInvalid (nameInMessage,errMessage);
  }
   return true;
  }
   //************************************************************************************
   function checkMinMax(theField,nameInMessage,errMessage,minval,maxval)
   {
    if(!checkNotLess(theField,nameInMessage,errMessage,minval))return false;
	else if(!checkLess(theField,nameInMessage,errMessage,maxval)) return false;
	return true;
   }
	 
  //************************************************************************************
  // Check length of string 'str'(must be less then 'corrLength')
  function checkLength(theField,nameInMessage,errMessage,corrLength)
  {
    if (isEmpty(theField.value))return true;
  if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage="This field must be no more than "+corrLength+" symbols";
   if((theField.value).length>corrLength)return warnInvalid (nameInMessage,errMessage);
   return true;
  }
  
//*******************************************************************************************


 function checkDateLess(theField,nameInMessage,errMessage,maxval,pattern)
 { 
 if(!pattern||pattern=="")pattern=defaultDatePattern;  
     if (isEmpty(theField.value))return true;
  if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage="This Date must be less than "+maxval;
   if(compDate(theField.value,maxval,pattern)<0){
   return  warnInvalid (nameInMessage,errMessage);
  }
   return true;
  }
   //************************************************************************************
   function checkDateNotLess(theField,nameInMessage,errMessage,minval,pattern)
 { 
 if(!pattern||pattern=="")pattern=defaultDatePattern;  
     if (isEmpty(theField.value))return true;
  if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage="This Date can not be less than "+minval;
   if(compDate(theField.value,minval,pattern)>0){
   return  warnInvalid (nameInMessage,errMessage);
  }
   return true;
  }
  //************************************************************************************
   function checkDateMinMax(theField,nameInMessage,errMessage,minval,maxval,pattern)
   {
   if(!pattern||pattern=="")pattern=defaultDatePattern;  
    if(!checkDateNotLess(theField,nameInMessage,errMessage,minval,pattern))return false;
	else if(!checkDateLess(theField,nameInMessage,errMessage,maxval,pattern)) return false;
	return true;
   }
//************************************************************************************
//*********************************phonePatternToRegexp********************************
  function phonePatternToRegexp(pattern) {
           var sb=pattern;
		   if(sb=="#")return "^[a-zA-Z0-9 \\-\\+]+$";
           var result="^";
           for (var i=0; i<sb.length; i++) {
               var c=sb.charAt(i);
               switch (c) {
                     case '0':
                          result+=("\\d");// \d operator
                          break;
                     case '#':
                          result+=("\\d?");// \d? operator
                          break;
                     default: //this symbol
                          result+=("["+c+"]");
               }
           }
           return result+"$";
    }
  //************************************************************************************
function checkPhone (theField,nameInMessage,errMessage,pattern)
{ 
   if (isEmpty(theField.value))
                      return true;
   if (!pattern||pattern=="")
          pattern="#";
   if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")
       errMessage="This field must be a valid  phone number ("+pattern+"). Please reenter it now.";
   reg=new RegExp(phonePatternToRegexp(pattern),"g");
   if(!reg.test(theField.value))
       return warnInvalid (nameInMessage,errMessage);
   return true;
}
//************************************************************************************
function checkRegExpPattern (theField,nameInMessage,errMessage,pattern)
{
 if(!pattern||pattern=="")pattern="^.*$";  
     if (isEmpty(theField.value)) return true;
  if(nameInMessage=="")
       nameInMessage=theField.name;
   if(errMessage=="")errMessage="does not correspond format ";
   var reg=new RegExp(pattern,"g");
   if(!reg.test(theField.value)){
   return  warnInvalid (nameInMessage,errMessage);
  }
   return true;
}
//************************************************************************************
function checkURL (theField)
{
  str= new String(theField.value);
  str = str.substr(0,7);
  if (str !="http://" && theField.value!="")	 theField.value = "http://" + theField.value;
  return true;
}
//************************************************************************************
function checkPassword (theField,nameInMessage,errMessage)
{
  return true;
}
//************************************************************************************
function alertErrMessage(typeMess)
{ if(alertErrMessage.arguments.length ==0)typeMess='error'
  var content="N      "+(typeMess.charAt(0)).toUpperCase()+typeMess.substring(1)+"\n";
  for(i=0;i<message.length;i++) {
   content+=(i+1)+".   "+message[i]+"\n";
  }
  alert(content);
}
//************************************************************************************
function parseTime(tInp, nameInMess, convert) {
	
	var tMess = nameInMess + " should be in the following format: hh:mm[AM|PM]";
	
	//if (!tInp.value) return true;
	
	
	if (tInp.value == "" || !tInp.value) { tInp.value="00:00"; return true;}

	tVal = tInp.value.toUpperCase();
	if ( tVal.indexOf(":") <= 0) 
		{
		 message[message.length] = tMess;
 		 return false;
		}
	
	var hh = parseInt( tVal.substring( 0, tVal.indexOf(":") ), 10);
	var mm = parseInt( tVal.substring( tVal.indexOf(":")+1, tVal.indexOf(":")+3 ), 10);
	var ss = "";
	if ( isNaN(hh) || isNaN(mm) || hh<0 || hh>23 || mm<0 || mm>59) 
		{
		 message[message.length] = tMess;
 		 return false;
		}
	
	if ( convert ) 
		{
		 if (tVal.indexOf("PM")>0 && hh<12 ) 
		 	{
			 hh += 12;
			}
		 if (tVal.indexOf("AM")>0 && hh==12 ) 
			{
			 hh = 0;
			 if (mm == 0 ) 
			 	{
				 ss = ":01";
				}
			}
		 tInp.value = (hh<10 ? "0" + hh : hh) + ":" + mm + ss;
		} 
	else 
		{
		 return true;
		}
	
	}
//************************************************************************************

//-->