// FormChek.js
// http://developer.netscape.com/docs/examples/javascript/formval/FormChek.js

var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var whitespace = " \t\n\r";
var defaultEmptyOK = false;

function policy(passwordToTest) {
     var ret=true;
	 ret=passwordToTest.length>=6;
	 var digits="0123456789";
	 var upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	 var lower="abcdefghijklmnopqrstuvwxyz";
	 var hasDigits=false;
	 var hasUpper=false;
	 var hasLower=false;
	 var hasSpecial=false;
	 for (var i=0;i<passwordToTest.length;i++) {
	    hasDigits=hasDigits || digits.indexOf(passwordToTest.substr(i,1))>=0;
		hasUpper=hasUpper || uppercaseLetters.indexOf(passwordToTest.substr(i,1))>=0;
		hasLower=hasLower || lowercaseLetters.indexOf(passwordToTest.substr(i,1))>=0;
		hasSpecial=hasSpecial || (lower.indexOf(passwordToTest.substr(i,1))<0 && upper.indexOf(passwordToTest.substr(i,1))<0 && digits.indexOf(passwordToTest.substr(i,1))<0  && whitespace.indexOf(passwordToTest.substr(i,1))<0)
	 }
	 ret=ret && hasDigits && ((hasUpper && hasLower) || hasSpecial) ;
	 return ret;		 
}

function password_strength(password)
{
	var desc = new Array();
	desc[0] = LBPw1;
	desc[1] = LBPw2;
	desc[2] = LBPw3;
	desc[3] = LBPw4;
	desc[4] = LBPw5;
	desc[5] = LBPw6;

	var points = 0;

	//---- if password is bigger than 4 , give 1 point.
	if (password.length > 4) points++;

	//---- if password has both lowercase and uppercase characters , give 1 point.	
	if ( ( password.match(/[a-z]/) ) && ( password.match(/[A-Z]/) ) ) points++;

	//---- if password has at least one number , give 1 point.
	if (password.match(/\d+/)) points++;

	//---- if password has at least one special caracther , give 1 point.
	if ( password.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,(,)]/) )	points++;

	//---- if password is bigger than 12 ,  give 1 point.
	if (password.length > 12) points++;

	//---- Showing  description for password strength.
	document.getElementById("password_description").innerHTML = desc[points];
	
	//---- Changeing CSS class.
	document.getElementById("password_strength").className = "strength" + points;
}

function makeArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 0
	} 
	return this
}

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;


function isEmpty(s) {
	return ((s == null) || (s.length == 0))
}


function isWhitespace(s) {   
	var i;
	if (isEmpty(s)) return true;
	for (i = 0; i < s.length; i++) {   
		var c = s.charAt(i);
		if (whitespace.indexOf(c) == -1) return false;
	}
	return true;
}

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 stripInitialWhitespace(s) {
	var i = 0;
	while ((i < s.length) && charInString (s.charAt(i), whitespace))
		i++;
	return s.substring (i, s.length);
}

function isLetter(c) { 
	return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}

function isDigit(c) {
	return ((c >= "0") && (c <= "9"))
}

function isLetterOrDigit(c) {   
	return (isLetter(c) || isDigit(c))
}

function isNumber( aValue )
{
	var expresion = /^(([\d]{2,3},)?|([1-9]{1},)?)([\d]{3},)*([\d]{3})(\.[0-9]*)?$|^[0-9]*(\.[0-9]*)?$/;
	var compara = expresion.exec( aValue );
	var r = ( compara != null );
	return r;
}

function isInteger(s) {
	var i;
	if (isEmpty(s)) 
		if (isInteger.arguments.length == 1) return defaultEmptyOK;
	else return (isInteger.arguments[1] == true);
	for (i = 0; i < s.length; i++) {   
		var c = s.charAt(i);
		if (!isDigit(c)) return false;
	}
	return true;
}

function isSignedInteger(s) {
	if (isEmpty(s)) 
		if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
		else return (isSignedInteger.arguments[1] == true);
	else {
		var startPos = 0;
		var secondArg = defaultEmptyOK;
		if (isSignedInteger.arguments.length > 1)
			secondArg = isSignedInteger.arguments[1];
		if ((s.charAt(0) == "-") || (s.charAt(0) == "+"))
			startPos = 1;    
		return (isInteger(s.substring(startPos, s.length), secondArg))
	}
}


function isPositiveInteger(s) {	
	var secondArg = defaultEmptyOK;
	if (isPositiveInteger.arguments.length > 1)
		secondArg = isPositiveInteger.arguments[1];
	return (isSignedInteger(s, secondArg) && ( (isEmpty(s) && secondArg)  || (parseInt (s, 10) > 0) ) );
}


function isNonnegativeInteger(s) {
	var secondArg = defaultEmptyOK;
	if (isNonnegativeInteger.arguments.length > 1)
		secondArg = isNonnegativeInteger.arguments[1];
	return (isSignedInteger(s, secondArg) && ( (isEmpty(s) && secondArg)  || (parseInt (s, 10) >= 0) ) );
}

function isNegativeInteger(s) {
	var secondArg = defaultEmptyOK;
	if (isNegativeInteger.arguments.length > 1)
		secondArg = isNegativeInteger.arguments[1];
	return (isSignedInteger(s, secondArg) && ( (isEmpty(s) && secondArg)  || (parseInt (s, 10) < 0) ) );
}

function isNonpositiveInteger(s) {
	var secondArg = defaultEmptyOK;
	if (isNonpositiveInteger.arguments.length > 1)
		secondArg = isNonpositiveInteger.arguments[1];
	return (isSignedInteger(s, secondArg) && ( (isEmpty(s) && secondArg)  || (parseInt (s, 10) <= 0) ) );
}


function isFloat(s) {	
	var i;
	var seenDecimalPoint = false;
	var decimalPointDelimiter = ".";

	if (isEmpty(s)) 
		if (isFloat.arguments.length == 1) return defaultEmptyOK;
		else return (isFloat.arguments[1] == true);
	if (s == decimalPointDelimiter) return false;
	for (i = 0; i < s.length; i++) {   
	       	var c = s.charAt(i);
		if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
		else if (!isDigit(c)) return false;
	}
	return true;
}


function isSignedFloat(s) {
	if (isEmpty(s)) 
		if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
		else return (isSignedFloat.arguments[1] == true);
	else {
		var startPos = 0;
		var secondArg = defaultEmptyOK;
		if (isSignedFloat.arguments.length > 1)
			secondArg = isSignedFloat.arguments[1];
		if ((s.charAt(0) == "-") || (s.charAt(0) == "+"))
			startPos = 1;    
		return (isFloat(s.substring(startPos, s.length), secondArg))
	}
}


function isAlphabetic(s) {
	var i;
	if (isEmpty(s)) 
		if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
	else return (isAlphabetic.arguments[1] == true);
	for (i = 0; i < s.length; i++) {   
		var c = s.charAt(i);
		if (!isLetter(c))
			return false;
	}
	return true;
}

function isAlphanumeric(s){
	var i;
	if (isEmpty(s))
		if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
		else return (isAlphanumeric.arguments[1] == true);
	for (i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if (! (isLetter(c) || isDigit(c) ) )
			return false;
	}
	return true;
}


function reformat(s){
	var arg;
	var sPos = 0;
	var resultString = "";
	for (var i = 1; i < reformat.arguments.length; i++) {
		arg = reformat.arguments[i];
		if (i % 2 == 1) resultString += arg;
		else {
			resultString += s.substring(sPos, sPos + arg);
			sPos += arg;
		}
	}
	return resultString;
}

function isEmail(s) {
	if (isEmpty(s)) 
		if (isEmail.arguments.length == 1) return defaultEmptyOK;
		else return (isEmail.arguments[1] == true);
	if (isWhitespace(s)) return false;
	var i = 1;
	var sLength = s.length;
	while ((i < sLength) && (s.charAt(i) != "@")) { 
		i++
	}
	if ((i >= sLength) || (s.charAt(i) != "@")) return false;
	else i += 2;
	while ((i < sLength) && (s.charAt(i) != ".")) { 
		i++
	}
	if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
	else return true;
}


function isYear(s){
	if (isEmpty(s))
		if (isYear.arguments.length == 1) {
			return defaultEmptyOK;
		} else {
			return (isYear.arguments[1] == true);
		}
	if (!isNonnegativeInteger(s)) return false;
		return (s.length == 4);
}


function isIntegerInRange(s, a, b) {
	if (isEmpty(s)) 
		if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
	else return (isIntegerInRange.arguments[1] == true);
	if (!isInteger(s, false)) return false;
	var num = parseInt(s, 10);
	return ((num >= a) && (num <= b));
}

function isMonth(s) {
	if (isEmpty(s)) 
		if (isMonth.arguments.length == 1) return defaultEmptyOK;
	else return (isMonth.arguments[1] == true);
	return isIntegerInRange (s, 1, 12);
}

function isDay(s) {
	if (isEmpty(s)) 
		if (isDay.arguments.length == 1) return defaultEmptyOK;
	else return (isDay.arguments[1] == true);   
	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, false) && isMonth(month, false) && isDay(day, false))) return false;
	var intYear = parseInt(year, 10);
	var intMonth = parseInt(month, 10);
	var intDay = parseInt(day, 10);
	if (intDay > daysInMonth[intMonth]) return false; 
	if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;
	return true;
}

// ---------------------------------------------------------

function getFirstChar(s) {
	if (isEmpty(s)) return "";
	return s.substring(0,1);
}

function getStringAfter(s, separator) {
	if (isEmpty(s)) return "";
	if (s.indexOf(separator) == -1) return "";
	return s.substring(s.indexOf(separator)+1, s.length);
}

function getStringBefore(s, separator) {
	if (isEmpty(s)) return "";
	if (s.indexOf(separator) == -1) return s;
	return s.substring(0, s.indexOf(separator));
}

function replaceChar(s, currentC, newC) {
	var tempStr = "";
	for (i = 0; i < s.length; i++) {
		if (s.charAt(i) == currentC) {
			tempStr += newC; 
		} else {
			tempStr += s.charAt(i);
		}
	}
	return tempStr;
}			

var dateFormat = "dmy";
var dateSeparator = "/";

function getDateFormat(s) {
	s = s.toLowerCase();
	var dateFormat = getFirstChar(s);
	s = getStringAfter(s, dateSeparator);
	dateFormat += getFirstChar(s);
	s = getStringAfter(s, dateSeparator);
	dateFormat += getFirstChar(s);
	dateFormat = replaceChar(dateFormat, "a", "y");
	return dateFormat;
}
	

function validateDate(s) {

	var firstParam 	= getStringBefore(s, dateSeparator);
	var tempStr 	= getStringAfter(s, dateSeparator);
	var secondParam = getStringBefore(tempStr, dateSeparator);
	var thirdParam 	= getStringAfter(tempStr, dateSeparator);
	var year;
	var month;
	var day;
	var dFormat;
	if (validateDate.arguments.length == 1) {
		dFormat = dateFormat;
	} else {
		dFormat = validateDate.arguments[1];
		dFormat = getDateFormat(dFormat);
	}
	if (dFormat.charAt(0) == 'm') { month 	= firstParam; };
	if (dFormat.charAt(0) == 'd') { day 	= firstParam; };
	if (dFormat.charAt(0) == 'y') { year 	= firstParam; };
	if (dFormat.charAt(1) == 'm') { month 	= secondParam; };
	if (dFormat.charAt(1) == 'd') { day 	= secondParam; };
	if (dFormat.charAt(1) == 'y') { year 	= secondParam; };
	if (dFormat.charAt(2) == 'm') { month 	= thirdParam; };
	if (dFormat.charAt(2) == 'd') { day 	= thirdParam; };
	if (dFormat.charAt(2) == 'y') { year 	= thirdParam; };
	return(isDate(year, month, day));
}



function getDateString(year, month, day) {
	var dateString = year;
	if (month.length == 1) {
		dateString += "0" + month;
	} else {
		dateString += "" + month;
	}
	if (day.length == 1) {
		dateString += "0" + day;
	} else {
		dateString += "" + day;
	}
	return dateString;
}


function reformatDate(s) {
	var firstParam 	= getStringBefore(s, dateSeparator);
	var tempStr 	= getStringAfter(s, dateSeparator);
	var secondParam = getStringBefore(tempStr, dateSeparator);
	var thirdParam 	= getStringAfter(tempStr, dateSeparator);
	var year;
	var month;
	var day;
	var dFormat;
	if (reformatDate.arguments.length == 1) {
		dFormat = dateFormat;
	} else {
		dFormat = getDateFormat(reformatDate.arguments[1]);
	}
	if (dFormat.charAt(0) == 'm') { month 	= firstParam; };
	if (dFormat.charAt(0) == 'd') { day 	= firstParam; };
	if (dFormat.charAt(0) == 'y') { year 	= firstParam; };
	if (dFormat.charAt(1) == 'm') { month 	= secondParam; };
	if (dFormat.charAt(1) == 'd') { day 	= secondParam; };
	if (dFormat.charAt(1) == 'y') { year 	= secondParam; };
	if (dFormat.charAt(2) == 'm') { month 	= thirdParam; };
	if (dFormat.charAt(2) == 'd') { day 	= thirdParam; };
	if (dFormat.charAt(2) == 'y') { year 	= thirdParam; };
	return(getDateString(year, month, day));
}

function compareDates(dateStart, dateEnd) {
	if (compareDates.arguments.length == 2) {
		dFormat = dateFormat;
	} else {
		dFormat = compareDates.arguments[2];
	}
	if (reformatDate(dateStart, dFormat) > reformatDate(dateEnd, dFormat)) { 
		return true;
	} else {
		return false;
	}
}

function Error( error, item )
{
    alert( error );
    if( item != null )
    {
        item.focus();
        item.select();
    }

    return false;
}