

var checkObjects	= new Array();
var errors		= "";
var returnVal		= false;
var language		= new Array();
language["header"]	= "The following error(s) occured:"
language["start"]	= "->";
language["field"]	= " Field ";
language["require"]	= " is required";
language["min"]		= " and must consist of at least ";
language["max"]		= " and must not contain more than ";
language["minmax"]	= " and no more than ";
language["chars"]	= " characters";
language["num"]		= " and must contain a number";
language["decimal"]     = " should be a decimal number in ";
language["int"]		= " should be a positive Integer";
language["faxno"]	= " is not a valid FAX number";
language["email"]	= " must contain a valid e-mail address";
language["decptright"]	= "x";
language["decptleft"]	= "x";
language["decpt"]	= ".";


// VARIABLE DECLARATIONS

var digits = "0123456789";

var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"

var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"


// whitespace characters
var whitespace = " \t\n\r";


// decimal point character differs by language and culture
var decimalPointDelimiter = "."


// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";


// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = digits + phoneNumberDelimiters + "+";



function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}



// Returns true if character c is a digit
// (0 .. 9).

function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}



// Returns true if character c is a letter or digit.

function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c))
}


function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}

// Removes all characters which appear in string bag from string s.

function stripCharsInBag (s, bag)

{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        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 (var x = 0; x < s.length; x++)
    {   if (s.charAt(x) == c)
	{  return true;
	}
    }
    return false;
}



// -----------------------------------------------------------------------------
// define - Call this function in the beginning of the page. I.e. onLoad.
// n = name of the input field (Required)
// type= string, num, email (Required)
// min = the value must have at least [min] characters (Optional)
// max = the value must have maximum [max] characters (Optional)
// d = (Optional)
//
// NOTE : if type == "decimal",
//        then min = number of digits at the left hand side of "." (Mandatory)
//             max = total number of digits around "." (Mandatory)
// -----------------------------------------------------------------------------

function define(n, type, HTMLname, min, max, d) {
	var p;
	var i;
	var x;
	if (!d) d = document;
	if ((p=n.indexOf("?"))>0 && parent.frames.length) {
		d = parent.frames[n.substring(p+1)].document;
		n = n.substring(0,p);
	}
	if (!(x = d[n]) && d.all) x = d.all[n];

	for (i = 0; !x && i < d.forms.length; i++) {
		x = d.forms[i][n];
	}
	for (i = 0; !x && d.layers && i < d.layers.length; i++) {
		x = define(n, type, HTMLname, min, max, d.layers[i].document);
		return x;
	}
	eval("V_"+n+" = new formResult(x, type, HTMLname, min, max);");
	checkObjects[eval(checkObjects.length)] = eval("V_"+n);
	return 0
}


function formResult(form, type, HTMLname, min, max) {
this.form = form;
this.type = type;
this.HTMLname = HTMLname;
this.min  = min;
this.max  = max;
}

function validate() {

if (checkObjects.length > 0) {
	errorObject = "";

	for (i = 0; i < checkObjects.length; i++) {
	validateObject = new Object();
	validateObject.form = checkObjects[i].form;
	validateObject.HTMLname = checkObjects[i].HTMLname;
	validateObject.val = checkObjects[i].form.value;
	validateObject.len = checkObjects[i].form.value.length;
	validateObject.min = checkObjects[i].min;
	validateObject.max = checkObjects[i].max;
	validateObject.type = checkObjects[i].type;
	//alert ( " Validate Object type i = " + i + ", " + validateObject.type ) ;

	checkStrOk = false;
 		if(validateObject.type == "posint" ) {
			//alert (" type = posint " ) ;
			//alert ("val = " + validateObject.val + ", max = " + validateObject.max ) ;
			if ( ! isposInt(validateObject.val)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['int'] + "\n";
			} else if ( parseInt(validateObject.val,10) < parseInt(validateObject.min,10) ) { errors += language['start'] + language['field'] + validateObject.HTMLname + " should be greater than or equal to " + validateObject.min + "\n";
			} else if ( parseInt(validateObject.val,10) > parseInt(validateObject.max,10) ) { errors += language['start'] + language['field'] + validateObject.HTMLname + " should be smaller than or equal to " + validateObject.max + "\n";
			}
                } else if( validateObject.type == "decimal") {
                        if (!validateObject.val || isNaN(validateObject.val)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + "\n"; }
                        if (validateObject.val != 0) {
                                var valStr = new String(validateObject.val);
                                var decimalPt = validateObject.val.indexOf(".");
                                var strLen = valStr.length;
                                var decimalFormat = "";
                                for (var ndigits = 0; ndigits <= validateObject.max; ndigits++) {
          if (ndigits < validateObject.min) { decimalFormat = language['decptleft'] + decimalFormat; }
          else if (ndigits > validateObject.min) { decimalFormat = decimalFormat + language['decptright'] ; }
          else { decimalFormat = decimalFormat + language['decpt']; }
                                }
                                if (decimalPt < 0) { decimalPt = strLen; }
                                if (strLen - decimalPt - 1 > validateObject.max - validateObject.min || decimalPt > validateObject.min) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['decimal'] + decimalFormat + " format \n"; }
                        }                
		} else if( validateObject.type == "num" || validateObject.type == "string") {
			if ((validateObject.type == "num" && validateObject.len < validateObject.min) || (validateObject.type == "num" && isNaN(validateObject.val))) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + "\n (No comma separator should be used in inputing an amount) \n";
			} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
			} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";
			} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
			} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
			}
		} else if( validateObject.type == "faxno" ) {
			//alert (" type = fax no " ) ;
			//if ( ! isFaxNumber(validateObject.val ) ) {errors += language['start'] + language['field'] + validateObject.HTMLname + language['faxno'] + "\n";
			//} else if ( validateObject.len < validateObject.min ) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min  + language['chars'] + "\n";
			if ( ! isFaxNumber(validateObject.val) ) { errors += "Fax Number allows the following characters only: " + validWorldPhoneChars + "\n";
			} else if ( validateObject.len < validateObject.min ) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min  + language['chars'] + "\n";
			} else if ( validateObject.len > validateObject.max) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
			}
		} else if(validateObject.type == "email" ) {
			// Checking existense of "@" and ".". Length of must >= 5 and the "." must not directly precede or follow the "@"
			if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
			} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";
			} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
			} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
			} else if (validateObject.len > 0)
			{	checkStrOk = true;
			}

			if(checkStrOk)
			{	if ((validateObject.val.indexOf("@") == -1) || (validateObject.val.charAt(0) == ".") || (validateObject.val.charAt(0) == "@") || (validateObject.len < validateObject.min) || (validateObject.val.indexOf(".") == -1) || (validateObject.val.charAt(validateObject.val.indexOf("@")+1) == ".") || (validateObject.val.charAt(validateObject.val.indexOf("@")-1) == ".")) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['email'] + "\n"; }
			}
		}
	}
}
if (errors) {
	alert(language["header"].concat("\n" + errors));
	errors = "";
	returnVal = false;
} else {
	returnVal = true;
}
return returnVal;
}

var daysofmonth    = new makeArray( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

var daysofmonthLY  = new makeArray( 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);


function makeArray() {
    this[0] = makeArray.arguments.length;
    for (i = 0; i<makeArray.arguments.length; i++)
        this[i+1] = makeArray.arguments[i];
}


function y2k(number) { return (number < 1000) ? number + 1900 : number; }


function padout(number) { return (number < 10) ? '0' + number : number; }


function LeapYear(year) {
    if ((year/4)   != Math.floor(year/4))   return false;
    if ((year/100) != Math.floor(year/100)) return true;
    if ((year/400) != Math.floor(year/400)) return false;
    return true;
}


function ValidDate(year,month,day) {

// Month input value should be ranged from 1 to 12
if (year == "" && month == "" && day == "" )
        {return true;
       }
else
{
if (year == "" || month == "" || day == "" )
        {return false;
       }
 else
       {
   	 if ( (LeapYear(year) && (day > daysofmonthLY[month])) || (!LeapYear(year) && (day > daysofmonth[month])) )
        	return false;
    	else
        	return true; 
       }
}
}

function ValidTime(hour,min) {
	if (CheckHour(hour) && CheckMinute(min))
		return true;
	else
       		return false; 

}
function CheckHour(hour) {
if (hour != "")
    {
        if (parseInt(hour)< 0 || parseInt(hour)> 24)
        {   return false;
        }       
    }
    return true;
}
function CheckMinute(min) {
if (min != "")
    {
        if (parseInt(min)< 0 || parseInt(min)> 60)
        {       return false;
        }       
    }
    return true;

}
function isposInt(elm) {

		var trim_elm = trim(elm) ;
		if (trim_elm.length == 0 ) return false ;
		if (trim_elm != "" ) {
		    for (var i=1; i<trim_elm.length+1; i++) {
		            if (trim_elm.charAt(i-1) < "0" || trim_elm.charAt(i-1) > "9") {
			return false;
		            }

		    }
		    return true ;
		} else {
		    return false;
		}
}

function isposValue(elm) {

		var trim_elm = trim(elm) ;
		if (trim_elm.length == 0 ) return false ;
		if (trim_elm != "" ) {
		    for (var i=1; i<trim_elm.length+1; i++) {
		            if ((trim_elm.charAt(i-1) != ".") && (trim_elm.charAt(i-1) < "0" || trim_elm.charAt(i-1) > "9")) {
			    return false;
		            }

		    }
		    return true ;
		} else {
		    return false;
		}
}

function isValidNumber(elm) {

		var trim_elm = trim(elm) ;
		var count = 0;
		for (var i=0; i<trim_elm.length; i++) {
		 if (trim_elm.charAt(i) == '.') {
		 count = count + 1;
		}
		 if (!(count == 1  || (trim_elm.charAt(i) >= '0' && trim_elm.charAt(i) <= '9'))) {
		 return false;
		 }

		}
		return true;
}

function isPhoneNumber(elm) {
	
		var trim_elm = trim(elm) ;
		if (trim_elm.length < 8 ) return false ;
		if (trim_elm != "" ) {
		    for (var i=1; i<trim_elm.length+1; i++) {
		            if ( (trim_elm.charAt(i-1) != "-")&& (trim_elm.charAt(i-1) != "(")&& (trim_elm.charAt(i-1) != ")") && (trim_elm.charAt(i-1) < "0" || trim_elm.charAt(i-1) > "9")) {
			    return false;
		            }

		    }
		    return true ;
		} else {
		    return false;
		}

}


function trim(strText){
  while (strText.substring(0,1) == ' ')
    strText = strText.substring(1, strText.length);
  while (strText.substring(strText.length-1,strText.length) == ' ')
    strText = strText.substring(0, strText.length-1);
  return strText;
}

function isDateAGreater(yAA,mAA,dAA,yBB,mBB,dBB)
{   var greater = false;

    yA = parseInt(yAA, 10);
    mA = parseInt(mAA, 10);
    dA = parseInt(dAA, 10);
    yB = parseInt(yBB, 10);
    mB = parseInt(mBB, 10);
    dB = parseInt(dBB, 10);

    if ( yA > yB)
    {   greater = true ;
    }
    else
    {   if ( yA == yB )
        {   if ( mA > mB)
            {   greater = true ;
	    }
            else
            {   if ( mA == mB )
                {   if ( dA > dB )
                    {   greater = true ;
	            }
                }
            }
        }
    }
    return greater ;
}

function isDateAGreaterEqual(yAA,mAA,dAA,yBB,mBB,dBB)
{   var greater = false;

    yA = parseInt(yAA, 10);
    mA = parseInt(mAA, 10);
    dA = parseInt(dAA, 10);
    yB = parseInt(yBB, 10);
    mB = parseInt(mBB, 10);
    dB = parseInt(dBB, 10);

    if ( yA > yB)
    {   greater = true ;
    }
    else
    {   if ( yA == yB )
        {   if ( mA > mB)
            {   greater = true ;
	    }
            else
            {   if ( mA == mB )
                {   if ( dA >= dB )
                    {   greater = true ;
	            }
                }
            }
        }
    }
    return greater ;
}

function isFaxNumber(input_str) {
		//alert (" run isFaxNumber = " + input_str + ", validchar = " + validWorldPhoneChars) ;
		var trim_input_str = trim(input_str) ;
		if (trim_input_str.length == 0 ) return true ;
            	for (var i=0; i<trim_input_str.length; i++) {
			if (! charInString(trim_input_str.charAt(i),validWorldPhoneChars ) ) {
					return false;
		        }
		}
  	      return true ;

}


 function hasSpace(value)
{	len = value.length;
	if (len > 0)
	{	count = 0;
		for (i=0;i<=len-1;i++)
		{	if (value.charAt(i) == " ")
			{ count++; }
		}
		if (count == len)
			return true;
		else
			return false;
	}
	else
		return true;
}

var formSubmitCount = 0;
function checkFormSubmit(){
	if (formSubmitCount == 0){
		formSubmitCount++;
		return true;
	} else {
		return false;
	}
}

function invalidLength(item,length,errMsg)
{
     var trim_elm = trim(item.value) ;
    if ( item.value.length < length  || trim_elm.length == 0) {
       alert(errMsg);
       item.focus();
       return true;
    }
    return false;
}
