var defaultEmptyOK = false;
var jsWhitespace = " \t\n\r";
var jsBackspace = String.fromCharCode(8);		// backspace		\b
var jsTab = String.fromCharCode(9);				// tab				\t
var jsLinefeed = String.fromCharCode(10);		// linefeed			\n
//var jsFormfeed = String.fromCharCode(12);		// formfeed			\f
var jsCarriageReturn = String.fromCharCode(13);	// carriage return	\r
var jsDoubleQuote = String.fromCharCode(34);	// double quote		\"
var jsSingleQuote = String.fromCharCode(39);	// single quote		\'
var jsBackslash = String.fromCharCode(92);		// backslash		\\

function lTrim(Value, Character) {
	var iCount = 0;
	var iLength = Value.length;

	if (Character.indexOf(Value.charAt(0)) != -1) {
		while (iCount < iLength && Character.indexOf(Value.charAt(iCount)) != -1) {
			iCount++;
		}

		Value = Value.substring(iCount, iLength);
	}

	return Value;
}

function rTrim(Value, Character) {
	var iCount = Value.length - 1;

	if (Character.indexOf(Value.charAt(String.length - 1)) != false) {
		while (iCount >= 0 && Character.indexOf(Value.charAt(iCount)) != -1) {
			iCount--;
		}

		Value = Value.substring(0, iCount + 1);
	}

	return Value;
}

function trim(String, Character) {
	return lTrim(rTrim(String, Character), Character);
}
//------------------------------------------------------------------------------

function isWhitespace (sString) {
	var sChar = "";

	if (isEmpty(sString)) return true;

	for (var iCount = 0; iCount < sString.length; iCount++) {   
		sChar = sString.charAt(iCount);

		if (jsWhitespace.indexOf(sChar) == -1) return false;
	}

	return true;	// all characters are whitespace
}

function isEmpty(s) {
	return ((s == null) || (s.length == 0));
}

function isEmailAddress(EmailAddress) {
	return (EmailAddress.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1);
}

function contains(Text, Characters) {
	if (Text.length == 0) {
		return false;
	};

	for (var iCharacterCount = 0; iCharacterCount < Text.length; iCharacterCount++) {
		if (Characters.indexOf(Text.charAt(iCharacterCount)) >= 0) {
			return true;
		};
	};

	return false;
}

function stripCharacter(string, character) {
	var spaces = string.length;

	for(var iCount = 1; iCount < spaces; ++iCount){
		string = string.replace(character, "");   
	}

	return string;
}

//------------------------------------------------------------------------------

 function validDate(iDayIn, iMonthIn, iYearIn) {
  var iDay = parseInt(iDayIn);
  var iMonth = parseInt(iMonthIn);
  var iYear = parseInt(iYearIn);
  var iFeb = 28;
  var iReturn = 0;

  if (iMonth == 2 && isLeapYear(iYear) == true) iFeb = 29;

  switch (iMonth) {
   case 2:
	if (iDay > iFeb) iReturn = iFeb;
	break;

   case 4:
	if (iDay > 30) iReturn = iMonth;
	break;

   case 6:
	if (iDay > 30) iReturn = iMonth;
	break;

   case 9:
	if (iDay > 30) iReturn = iMonth;
	break;

   case 11:
	if (iDay > 30) iReturn = iMonth;
	break;
  }

  return iReturn;
 }

//------------------------------------------------------------------------------

 function falseDate(iValue) {
  var sError = "";

  switch(iValue) {
   case 4:
	sError = numberToMonth(iValue) + " has 30 days\n";
	break;

   case 6:
	sError = numberToMonth(iValue) + " has 30 days\n";
	break;

   case 9:
	sError = numberToMonth(iValue) + " has 30 days\n";
	break;

   case 11:
	sError = numberToMonth(iValue) + " has 30 days\n";
	break;

   case 28:
	sError = "February has 28 days\n";
	break;

   case 29:
	sError = "February has 29 days (leap year)\n";
	break;
  }

  return sError;
 }

function countOccurrences(Input, CharString) {
	var iStart = 0;
	var iFound = 0;
	var iInputLength = Input.length;

	while (Input.indexOf(CharString, iStart) > -1) {
		if (Input.indexOf(CharString, iStart) > -1) iFound++;

		iStart = Input.indexOf(CharString, iStart) + 1;
	}

	return iFound;
}

function getOccurrence(Input, CharString, Occurrence) {
	var iStart = 0;
	var iFound = 0;
	var iInputLength = Input.length;
	var iOccurrence = -1;

	while (Input.indexOf(CharString, iStart) > -1 && Occurrence != iFound) {
		if (Input.indexOf(CharString, iStart) > -1) {
			iFound++;
			iOccurrence = Input.indexOf(CharString, iStart);
		}

		iStart = Input.indexOf(CharString, iStart) + 1;
	}

	return iOccurrence;
}

function formatNumber(Expression, NumDigitsAfterDecimal, IncludeLeadingDigit, UseParensForNegativeNumbers, GroupDigits) { 
	if (isNaN(parseInt(Expression))) return Expression;

	var iExpressionTemp = Expression;
	var iSign = Expression < 0 ? -1 : 1;		// Get sign of number

	// Adjust number so only the specified number of numbers after
	// the decimal point are shown.
	iExpressionTemp *= Math.pow(10,NumDigitsAfterDecimal);
	iExpressionTemp = Math.round(Math.abs(iExpressionTemp))
	iExpressionTemp /= Math.pow(10,NumDigitsAfterDecimal);
	iExpressionTemp *= iSign;					// Readjust for sign


	// Create a string object to do our formatting on
	var iExpressionTempStr = new String(iExpressionTemp);

	// See if we need to strip out the leading zero or not.
	if (!IncludeLeadingDigit && Expression < 1 && Expression > -1 && Expression != 0)
		if (Expression > 0)
			iExpressionTempStr = iExpressionTempStr.substring(1,iExpressionTempStr.length);
		else
			iExpressionTempStr = "-" + iExpressionTempStr.substring(2,iExpressionTempStr.length);

	// See if we need to put in the commas
	if (GroupDigits && (Expression >= 1000 || Expression <= -1000)) {
		var iStart = iExpressionTempStr.indexOf(".");
		if (iStart < 0) iStart = iExpressionTempStr.length;

		iStart -= 3;
		while (iStart >= 1) {
			iExpressionTempStr = iExpressionTempStr.substring(0,iStart) + "," + iExpressionTempStr.substring(iStart,iExpressionTempStr.length)
			iStart -= 3;
		}		
	}

	// See if we need to use parenthesis
	if (UseParensForNegativeNumbers && Expression < 0) iExpressionTempStr = "(" + iExpressionTempStr.substring(1,iExpressionTempStr.length) + ")";

	return iExpressionTempStr;		// Return our formatted string!
}

function valueExists(Value) {
	return !(typeof(Value) == "undefined");
}

function stripHTML(HTML) {
	return HTML.replace(/(<([^>]+)>)/ig,"");
}

function toJS(input) {
	var sTemporary = "";

	sTemporary = input.replace(jsBackslash, "\\");
	sTemporary = sTemporary.replace(jsBackspace, "\b");
	sTemporary = sTemporary.replace(jsTab, "\t");
	sTemporary = sTemporary.replace(jsLinefeed, "\n");
	sTemporary = sTemporary.replace(jsCarriageReturn, "\r");
	sTemporary = sTemporary.replace(jsDoubleQuote, jsBackslash + jsDoubleQuote);
	sTemporary = sTemporary.replace(jsSingleQuote, "\'");
	sTemporary = sTemporary.replace(jsBackspace, "\b");

	return sTemporary;
}

function getPasswordStrength(password) {
	var iPasswordStrength = 0;

	// PASSWORD LENGTH
	if (password.length < 5) {									// length 4 or less
		iPasswordStrength += 3;
	} else if (password.length > 4 && password.length < 8) {	// length between 5 and 7
		iPasswordStrength += 6;
	} else if (password.length > 7 && password.length < 16) {	// length between 8 and 15
		iPasswordStrength += 16;
	} else if (password.length > 15) {							// length 16 or more
		iPasswordStrength += 18;
	};

	// LETTERS
	if (password.match(/[a-z]/)) {								// at least one lower case letter
		iPasswordStrength += 1;
	};

	if (password.match(/[A-Z]/)) {								// at least one upper case letter
		iPasswordStrength += 5;
	};

	// NUMBERS
	if (password.match(/\d+/)) {								// at least one number
		iPasswordStrength += 5;
	};

	if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) {			// at least three numbers
		iPasswordStrength += 5;
	};

	// SPECIAL CHAR
	if (password.match(/.[!,@,#,$,%,^,&,*,?,_,~]/)) {			// at least one special character
		iPasswordStrength += 5;
	};

	// at least two special characters
	if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) {
		iPasswordStrength += 5;
	};

	// COMBOS
	// both upper and lower case
	if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) {
		iPasswordStrength += 2;
	};

	// both letters and numbers
	if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) {
		iPasswordStrength += 2;
	};

	// letters, numbers, and special characters
	if (password.match(/([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/)) {
		iPasswordStrength += 2;
	};

	return iPasswordStrength;
}

function passwordStrength(passwordStrengthTag, password) {
	var iPasswordStrength = getPasswordStrength(password);
	var sVerdict = "weak";
	var sColour = "";

	if (iPasswordStrength < 16) {
	   sVerdict = "very weak";
	   sColour = "red";
	} else if (iPasswordStrength > 15 && iPasswordStrength < 25) {
	   sVerdict = "weak";
	   sColour = "red";
	} else if (iPasswordStrength > 24 && iPasswordStrength < 35) {
	   sVerdict = "medium";
	   sColour = "orange";
	} else if (iPasswordStrength > 34 && iPasswordStrength < 45) {
	   sVerdict = "strong";
	   sColour = "green";
	} else {
	   sVerdict = "very strong";
	   sColour = "green";
	};

	$(passwordStrengthTag).innerHTML = "<span style=\"color:" + sColour + "\">" + sVerdict + "</span>";
}


