
var undefined = "";
var not_found = -1;
var not_selected = -1;
var any_string = "(?*)";
var letters = "[A-Za-z]+";
var word_characters = "[A-Za-z0-9_]";
var non_word_characters = "[^A-Za-z0-9_]";
var spaces = "([ \t\n\r\f])";
var non_spaces = "([^ \t\n\r\f])";
var signs = "([+\-]{0,1})";
var number_formats = new Object();

var ua = navigator.userAgent;
var isFireFoxOneFive = (ua.indexOf("Firefox/3.") != 1 || ua.indexOf("Firefox/1.5") != -1 || ua.indexOf("Firefox/2.") != -1);
var isCamino = ua.indexOf("Camino/") != -1;
var isSafariFive = ua.indexOf("Safari/5") != -1;

//alert("ua="+ua);

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;

number_formats.thousand_separators = 1;
number_formats.no_thousand_separators = 2;
number_formats.default_format = number_formats.no_thousand_separators;

function Language(English_name, French_name, thousand_separator, decimal) {
	this.English_name = English_name;
	this.French_name = French_name;
	this.name = English_name;
	this.thousand_separator = thousand_separator;
	this.decimal = decimal;
}

var English = new Language("English", "Anglais", ",", ".");
var French = new Language("French", "Français", " ", ",");
var Default_Language = English;

function isLoginID(login_ID, min_login_ID_length, max_login_ID_length) {
	if (!min_login_ID_length) {
		min_login_ID_length = 4;
	}
	if (!max_login_ID_length) {
		max_login_ID_length = 25;
	}
	var valid_login_ID = new RegExp("^[A-Za-z0-9]{" + min_login_ID_length + "," + max_login_ID_length + "}$");
	return valid_login_ID.test(login_ID);
}

function isRegPassword(password, min_password_length, max_password_length) {

  if (password == "$$$$$")
	  return true;

	if (!min_password_length) {
		min_password_length = 8;
	}
	if (!max_password_length) {
		max_password_length = 40;
	}
	var valid_password = new RegExp("^[A-Za-z0-9\-*!@&%^#_\$\.\?]{" + min_password_length + "," + max_password_length + "}$");
	if (valid_password.test(password) == true) {
	
	  //valid_password = new RegExp("[A-Z]{1,}");
	  //if (valid_password.test(password) == true) {
	//	  return true;
	//	} else {
	//		return false;
	//  }
	
	  if (chkPass(password))
		  return true;
		else
		  return false;
		
	} else {
		return false;
	}
}

function isPassword(password, min_password_length, max_password_length) {
	if (!min_password_length) {
		min_password_length = 5;
	}
	if (!max_password_length) {
		max_password_length = 40;
	}
	var valid_password = new RegExp("^[A-Za-z0-9\-*!@&%^#_\$\.\?]{" + min_password_length + "," + max_password_length + "}$");
	return valid_password.test(password);
}

function isName(name) {
	var valid_name = new RegExp("^[A-Za-z][A-Za-z\-'\. ]{0,}$");
	return valid_name.test(name);
}

function isTitle(name) {
	var valid_name = new RegExp("^[A-Za-z0-9][A-Za-z0-9\-*!@&%^#_\$'\.\, ]{0,}$");
	return valid_name.test(name);
}

function isMiddleInitial(middle_initial) {
	var valid_middle_initial = new RegExp("^([A-Za-z]){1,2}$");
	return valid_middle_initial.test(middle_initial);	
}

function isPostalCode(postal_code) {
	var valid_postal_code = new RegExp("^[A-Za-z][0-9][A-Za-z][ ]{0,1}[0-9][A-Za-z][0-9]$");
	return valid_postal_code.test(postal_code);
}

function isPostalCode2(postal_code) {
	var valid_postal_code = new RegExp("^[A-Za-z0-9 ]{0,}$");
	return valid_postal_code.test(postal_code);
}

function isAreaCode(area_code) {
	var area_code_digits = "([1-9][0-9]{2})";
	var valid_area_code = new RegExp("^(" + area_code_digits + "||([(]" + area_code_digits + "[)]))$");
    if (area_code == undefined)
		return false;
	else
		{
		area_code = area_code.toString();
		return valid_area_code.test(area_code);
		}
}

function isPhoneNumber(phone_number) {
	var valid_phone_number = new RegExp("^[1-9][0-9]{2}[\-]{0,1}[0-9]{4}$");
	if (phone_number == undefined)
		return false;
	else
		return valid_phone_number.test(phone_number);
}

function isPhoneNumber2(phone_number) {
	var valid_phone_number = new RegExp("^[0-9 \-\(\)]{5,}$");
	if (phone_number == undefined)
		return false;
	else
		return valid_phone_number.test(phone_number);
}

function isPhoneExt(phone_ext) {
	var valid_phone_number = new RegExp("^[0-9]{0,10}");
	return valid_phone_number.test(phone_ext);
}

function isEmailAddress(email_address) {
	var period_pattern = "([A-Za-z0-9][A-Za-z0-9_\-]{0,255})";
	var before_at_sign_pattern = "(" + period_pattern + "([.]" + period_pattern + "){0,255})"; 
	var after_at_sign_pattern = "(" + period_pattern + "([.]" + period_pattern + "){1,255})";
	var valid_email_address = new RegExp("^" + before_at_sign_pattern + "@" + after_at_sign_pattern + "$");
	return valid_email_address.test(email_address);
}

function isAddress(address) {
	var valid_address = new RegExp("^[A-Za-z0-9#][A-Za-z0-9\-'\.#\, ]{0,255}$");
	return valid_address.test(address);
}

function isMultiAddress(address) {
	var valid_address = new RegExp("^[A-Za-z0-9#\t\n\r][A-Za-z0-9\-'\.# \t\n\r]{0,499}$");
	return valid_address.test(address);
}

function isSuite(suite) {
  if (suite.length == 0) return true;
	var valid_suite = new RegExp("^[A-Za-z0-9#][A-Za-z0-9\-'\.# ]{0,255}$");
	return valid_suite.test(suite);
}

function isCity(city) {
	var valid_city = new RegExp("^[A-Za-z][A-Za-z\-'\. ]{0,255}$");
	return valid_city.test(city);
}

function isIntersect(intersect) {
	var valid_intersect = new RegExp("^[A-Za-z][A-Za-z\-'\. ]{0,255}$");
	return valid_intersect.test(intersect);
}

function isSpecial(special) {
	var valid_special = new RegExp("^[A-Za-z0-9\-'\.\, ]{0,255}$");
	return valid_special.test(special);
}

function isNote(note) {
	var valid_note;
	if (isFireFoxOneFive || isCamino || isSafariFive)
		valid_note = new RegExp("^[A-Za-z0-9\-'*!@&%\^#_\?\$\.\,\;()\+=\"\{\}£~`|:\/ \t\n\r]{0,32000}$");
	else
		valid_note = new RegExp("^[]A-Za-z0-9\-'*!@&%\^#_\?\$\.\,\;()\"\{\}\/=\+|:£~` \t\n\r[]{0,32000}$");
	return valid_note.test(note);
}


function isPhoneNumber3(note) {
	var valid_note;
	valid_note = new RegExp("^[0-9\-()\+ ]{0,255}$");
	return valid_note.test(note);
}

function isCCNumber(ccnumber) {
  var valid_ccnumber = new RegExp("^[0-9\- ]{13,}$");
  //var valid_ccnumber = /[^\d ]/;
  return valid_ccnumber.test(ccnumber);
}

function isValidCreditCard(type, ccnum) {
   if (type == "Visa") {
      // Visa: length 16, prefix 4, dashes optional.
      var re = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
   } else if (type == "Master Card") {
      // Mastercard: length 16, prefix 51-55, dashes optional.
      var re = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
   } else if (type == "Disc") {
      // Discover: length 16, prefix 6011, dashes optional.
      var re = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
   } else if (type == "AmEx") {
      // American Express: length 15, prefix 34 or 37.
      var re = /^3[4,7]\d{13}$/;
   } else if (type == "Diners") {
      // Diners: length 14, prefix 30, 36, or 38.
      var re = /^3[0,6,8]\d{12}$/;
	 } else {
	    var re = /^[0-9\- ]{13,}$/;
   }
   if (!re.test(ccnum)) return false;
   // Checksum ("Mod 10")
   // Add even digits in even length strings or odd digits in odd length strings.
   var checksum = 0;
   for (var i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
      checksum += parseInt(ccnum.charAt(i-1));
   }
   // Analyze odd digits in even length strings or even digits in odd length strings.
   for (var i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
      var digit = parseInt(ccnum.charAt(i-1)) * 2;
      if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
   }
   if ((checksum % 10) == 0) return true; else return false;
}

function isDateFormat(date) {
	// date format: dd-mm-yyyy

	var valid_date = new RegExp("^[0-3][0-9]\-[0-1][0-9]\-[12][0-9]{3}");

	if (!valid_date.test(date)) return false;
	var sParts=date.split("-")
	return isDate(sParts[2],sParts[1],sParts[0]);
}

function daysInFebruary (year)
{   // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    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,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 isDay(day) {
    var num = parseInt(day,10);
    return ((num >= 1) && (num <= 31));
}

function isMonth(month) {
    var num = parseInt(month,10);
   
    return ((num >= 1) && (num <= 12));
}

function isYear(year) {
	var valid_year = new RegExp("^[1-9][0-9]{3}$");
	year = year.toString();
	return valid_year.test(year);
}

function isNumeric(str) {
  var valid_numeric = new RegExp("^[0-9]{1,}$");
  //var valid_ccnumber = /[^\d ]/;
  return valid_numeric.test(str);
}

function isPositiveInteger(positive_integer, language) {
	if (language == null) {
		language = English;
	}
	var valid_positive_integer = new RegExp("^([+]{0,1})([1-9][0-9]{0,2})((([" + language.thousand_separator +"][0-9]{3}){0,})|[0-9]{0,})$");
	positive_integer = positive_integer.toString();
	return valid_positive_integer.test(positive_integer);
}

function isNegativeInteger(negative_integer, language) {
	if (language == null) {
		language = English;
	}
	var valid_negative_integer = new RegExp("^([-])([1-9][0-9]{0,2})((([" + language.thousand_separator +"][0-9]{3}){0,})|[0-9]{0,})$");
	negative_integer = negative_integer.toString();
	return valid_negative_integer.test(negative_integer);
}

function isWholeNumber(whole_number, language) {
	if (language == null) {
		language = English;
	}
	var valid_whole_number = new RegExp("^(0|([+]{0,1})([1-9][0-9]{0,2})((([" + language.thousand_separator +"][0-9]{3}){0,})|[0-9]{0,}))$");
	whole_number = whole_number.toString();
	return valid_whole_number.test(whole_number);
}

function isInteger(integer, language) {
	if (language == null) {
		language = English;
	}
	integer = integer.toString();
	return (isWholeNumber(integer, language) || isNegativeInteger(integer, language));
}

function isDecimal(decimal, decimal_place, language) {
	if (language == null) {
		language = English;
	}
	decimal = decimal.toString();
	if (decimal_place == "*") {
		decimal_place = undefined;
	} else if ((decimal_place != null) && (decimal_place != undefined) && (!isWholeNumber(decimal_place, language))) {
		return false;
	}
	var valid_decimal = new RegExp("^(" + signs + "[0]{0,1}([" + language.decimal + "]([0-9]{1," + decimal_place + "})))$");
	return valid_decimal.test(decimal);
}

function isRealNumber(real_number, decimal_place, language) {
	if (language == null) {
		language = English;
	}
	real_number = real_number.toString();
	var sign = real_number.substring(0, 1);
	var integer = new String(real_number);
	var decimal;
	var decimal_index = 0;
	
	if (!real_number) {
		return false;	
	}
	if ((sign == "+") || (sign == "-")) {
		real_number = real_number.substring(1, real_number.length);
	}
	decimal_index = real_number.indexOf(language.decimal, decimal_index);
	if (decimal_index != not_found) {
		integer = real_number.substring(0, decimal_index);
		decimal = real_number.substring(decimal_index, real_number.length);
	}
	if ((integer) && (!isInteger(integer, language))) {
		return false;
	}
	if ((decimal) && (!isDecimal(decimal, decimal_place, language))) {
		return false;
	}
	return true;
}

function isDollarAmount(dollar_amount, slanguage) {
	if (slanguage == null || slanguage=="English" || slanguage==English) {
		language = English;
	}
	else
		language = French;
	var cent_decimal_place = 2;
	dollar_amount = dollar_amount.toString();
	return isRealNumber(dollar_amount, cent_decimal_place, language);
}

function isStockID(stock_ID) {
	var valid_stock_ID = new RegExp("^[A-Za-z0-9]{50}$");
	return valid_stock_ID.test(stock_ID);
}

function isWebsiteAddress(Website_address) {
	var valid_Website_address = new RegExp("^(http(s){0,1}:\/\/){0,1}((" + word_characters + "{1,})[.]{0,1})[/]{0,1}(" + non_spaces + "){0,}$");
	return true;
}

function isWebsiteAddress1(Website_address) {
	var valid_Website_address = new RegExp("^(http(s){0,1}[:][/][/]){0,1}((" + word_characters + "{1,})[.]{1,})[/]{0,1}(" + non_spaces + "){0,}$");
	return true;
}

function isWebsiteAddress2(Website_address) {
	var valid_Website_address = new RegExp("^(http(s){0,1}[:][/][/]){1}((" + word_characters + "{1,})[.]{1,})[/]{0,1}(" + non_spaces + "){0,}$");
	return valid_Website_address.test(Website_address);
}

function isDescription(name) {
	var valid_name = new RegExp("^[A-Za-z0-9][A-Za-z0-9\-*!@&%^#_\$'\.\,<>()\?\"\/: ]{0,}$");
	return valid_name.test(name);
}

function isMultiDescription(name) {
	var valid_name = new RegExp("^[A-Za-z0-9][A-Za-z0-9\-*!@&%^#_\$'\.\,<>()\?\"\/: \t\n\r]{0,}$");
	return valid_name.test(name);
}

function SelectedCheckboxes(checkbox) {

	var result = new Array();
	var checked_index = 0;
	var checkbox_size = checkbox.length;
	if (checkbox[0].type != "checkbox") {
		alert("An object pointing to a checkbox must be passed to this procedure.");
	} else {
		for (option_index = 0; option_index < checkbox_size; option_index++) {
			if (checkbox[option_index].checked) {
				result[checked_index++] = option_index;
			}
		}
		return result;
	}
}

function CheckedRadioButton(radio_button) {
	if (radio_button[0].type != "radio") {
		alert("An object pointing to a radio button must be passed to this procedure.");
	} else {
		for (option_index = 0; option_index < radio_button.length; option_index++) {
			if (radio_button[option_index].checked) {
				return option_index;
			}
		}
		return not_selected;
	}
}

function TitleCase(text) {
	if (text.length) {
		return text.substr(0, 1).toUpperCase() + text.substr(1, text.length - 1).toLowerCase();
	} else {
		return undefined;
	}
}

function RepeatString(string, repeat_total) {
	var result = new String(undefined);
	for (var repeat_index = 0; repeat_index < repeat_total; repeat_index++) {
		result += string;
	}
	return result;
}


function RoundOff(number, decimal_place, language) {
	number = number.toString();
	var result = new String(undefined);
	var power_of_10 = 1;
	var decimal_index = not_found;
	var digits_after_decimal = 0;

	if (!isRealNumber(number, undefined, language)) {
		alert("function RoundOff:\n\nThe number to be rounded off must a valid number.");
		return false;	
	}
	
	if (decimal_place == undefined) {
		alert("function RoundOff:\n\nPlease specify the decimal place to which the number must be rounded off.");
		decimal_place = 0;
	
	} else if ((decimal_place < 0) || (!isWholeNumber(decimal_place, language))) {
		alert("function RoundOff:\n\nThe decimal place must a valid whole number greater or equal to 0.");
		return false;
	}
	
	if (language == null) {
		language = English;
	}
	with (Math) {	
		power_of_10 = pow(10, decimal_place);
		result = round(ConvertNumber(number, language) * power_of_10) / power_of_10;
	}
	result = result.toString();
	result = result.replace( '.', language.decimal );
	decimal_index = result.indexOf(language.decimal);
 	digits_after_decimal = (decimal_index != not_found) ? result.substring(decimal_index + 1, result.length) : "";
	if (digits_after_decimal.length < decimal_place) {

		if (decimal_index == not_found) {
			result += language.decimal;
		}
		
		result += RepeatString("0", decimal_place - digits_after_decimal.length);
	}
	
	return result;
}


function ConvertNumber(real_number, language) {
	var digits_total = 0;
	var next_thousand_separator_index = not_found;
	var current_thousand_separator_index = not_found;
	var decimal_index = 0;
	var period = ".";

	if (language == null) {
		language = English;
	}

	real_number = real_number.toString();
	while ((next_thousand_separator_index = real_number.indexOf(language.thousand_separator, current_thousand_separator_index)) != not_found) {
		digits_total = real_number.length;
		real_number = real_number.substring(0, next_thousand_separator_index) + real_number.substring(next_thousand_separator_index + 1, digits_total);

		current_thousand_separator_index = next_thousand_separator_index;
	
	}

	if ((decimal_index = real_number.indexOf(language.decimal, decimal_index)) != not_found) {
		real_number = real_number.substring(0, decimal_index) + period + real_number.substring(decimal_index + 1, real_number.length);
	}

	return real_number;

}


function RemoveLeadingSpaces(text) {

	var pattern = new RegExp("^" + spaces + "+(" + non_spaces + ".*){0,1}$");
	var result = new String(undefined);
	text = text.toString();
	if (pattern.test(text)) {
		result = text.match(pattern)[2];
	} else {
		result = text;
	}
	return result;
}


function RemoveTrailingSpaces(text) {

	var pattern = new RegExp("^(.*" + non_spaces + "){0,1}" + spaces + "+$");
	var result = new String(undefined);
	text = text.toString();
	if (pattern.test(text)) {
		result = text.match(pattern)[1];
	} else {
		result = text;
	}
	return result;
}

function RemoveOuterSpaces(text) {
	return RemoveTrailingSpaces(RemoveLeadingSpaces(text));
}

function RemoveAllSpaces(text) {
	text = text.toString();
	var character_total = text.length;
	var current_character = new String(undefined);
	var result = new String(undefined);
	for (var character_index = 0; character_index < character_total; character_index++) {
		current_character = text.substr(character_index, 1);
		if (spaces.indexOf(current_character) == not_found) {
			result += current_character;
		}
	}
	return result;
}


function FormatNumber(number, format, language) {
	var period = ".";
	if (format == null) {
		format = number_formats.default_format;
	}
	if (language == null) {
		language = English;
	}
	number = number.toString();
	switch (format) {
		case number_formats.no_thousand_separators:
			number.replace(language.thousand_separator, undefined);
			number.replace(language.decimal, period);
			break;
		case number_formats.thousand_separators:
			number.replace(language.thousand_separator, undefined);
			number.replace(language.decimal, period);
			break;
	}
	return number;
}


function RoundOff2(number, decimal_place, language) {
	number = number.toString();
	var result = new String(undefined);
	var power_of_10 = 1;
	var decimal_index = number.indexOf(language.decimal);
	var digits_after_decimal = 0;
	var decimal_digits_count = (decimal_index != not_found) ? number.substring(decimal_index + 1, number.length).length : 0;
	if (!isRealNumber(number, undefined, language)) {
		alert("function RoundOff:\n\nThe number to be rounded off must a valid number.");
		return false;	
	}
	if (decimal_place == undefined) {
		alert("function RoundOff:\n\nPlease specify the decimal place to which the number must be rounded off.");
		decimal_place = 0;
	} else if ((decimal_place < 0) || (!isWholeNumber(decimal_place, language))) {
		alert("function RoundOff:\n\nThe decimal place must a valid whole number greater or equal to 0.");
		return false;
	}
	if (language == null) {
		language = English;
	}
	if (decimal_digits_count == decimal_place) {
		result = number;
	} else {
		with (Math) {	
			power_of_10 = pow(10, decimal_place);
			result = round(ConvertNumber(number, language) * power_of_10) / power_of_10;
		}
		result = result.toString();
		result = result.replace( '.', language.decimal );
		decimal_index = result.indexOf(language.decimal);
		decimal_digits_count = (decimal_index != not_found) ? result.substring(decimal_index + 1, result.length).length : 0;
		if (decimal_digits_count < decimal_place) {
			if (decimal_index == not_found) {
				result += language.decimal;
			}
			result += RepeatString("0", decimal_place - digits_after_decimal.length);
		}
	}
	return result;
}


function replaceSubstring(inputString, fromString, toString) {
   var temp = inputString;
   if (fromString == "") {
      return inputString;
   }
   if (toString.indexOf(fromString) == -1) { 
      while (temp.indexOf(fromString) != -1) {
         var toTheLeft = temp.substring(0, temp.indexOf(fromString));
         var toTheRight = temp.substring(temp.indexOf(fromString)+fromString.length, temp.length);
         temp = toTheLeft + toString + toTheRight;
      }
   } else {
      var midStrings = new Array("~", "`", "_", "^", "#");
      var midStringLen = 1;
      var midString = "";
      while (midString == "") {
         for (var i=0; i < midStrings.length; i++) {
            var tempMidString = "";
            for (var j=0; j < midStringLen; j++) { tempMidString += midStrings[i]; }
            if (fromString.indexOf(tempMidString) == -1) {
               midString = tempMidString;
               i = midStrings.length + 1;
            }
         }
      }
      while (temp.indexOf(fromString) != -1) {
         var toTheLeft = temp.substring(0, temp.indexOf(fromString));
         var toTheRight = temp.substring(temp.indexOf(fromString)+fromString.length, temp.length);
         temp = toTheLeft + midString + toTheRight;
      }
      while (temp.indexOf(midString) != -1) {
         var toTheLeft = temp.substring(0, temp.indexOf(midString));
         var toTheRight = temp.substring(temp.indexOf(midString)+midString.length, temp.length);
         temp = toTheLeft + toString + toTheRight;
      }
   }
   return temp;
}

function strtrim(arg)
{
    return arg.replace(/^\s+/,'').replace(/\s+$/,'');
}

function isLicenseNumber(license_number) {
	var valid_license_number = new RegExp("^[0-9]{1}[0-9\-]{4,8}$");
	if (license_number == undefined)
		return false;
	else {
		if (!valid_license_number.test(license_number)) {
		  return false;
		} else {
		  var valid_license_nonzero = new RegExp("[1-9]");
		  return valid_license_nonzero.test(license_number);
		}
	}	
}

function isHygienistLicenseNumber(license_number) {
	var valid_license_number = new RegExp("^[0-9]{1}[0-9\-]{2,6}[0-9A-Za-z]{2}$");
	if (license_number == undefined)
		return false;
	else {
		if (!valid_license_number.test(license_number)) {
		  return false;
		} else {
		  var valid_license_nonzero = new RegExp("[1-9]");
		  return valid_license_nonzero.test(license_number);
		}
	}	
}

String.prototype.strReverse = function() {
	var newstring = "";
	for (var s=0; s < this.length; s++) {
		newstring = this.charAt(s) + newstring;
	}
	return newstring;
	//strOrig = ' texttotrim ';
	//strReversed = strOrig.revstring();
};

function chkPass(pwd) {
	//var oScorebar = document.getElementById("scorebar");
	//var oScore = document.getElementById("score");
	//var oComplexity = document.getElementById("complexity");
	var nScore = 0;
	var nLength = 0;
	var nAlphaUC = 0;
	var nAlphaLC = 0;
	var nNumber = 0;
	var nSymbol = 0;
	var nMidChar = 0;
	var nRequirements = 0;
	var nAlphasOnly = 0;
	var nNumbersOnly = 0;
	var nRepChar = 0;
	var nConsecAlphaUC = 0;
	var nConsecAlphaLC = 0;
	var nConsecNumber = 0;
	var nConsecSymbol = 0;
	var nConsecCharType = 0;
	var nSeqAlpha = 0;
	var nSeqNumber = 0;
	var nSeqChar = 0;
	var nReqChar = 0;
	var nReqCharType = 3;
	var nMultLength = 4;
	var nMultAlphaUC = 3;
	var nMultAlphaLC = 3;
	var nMultNumber = 4;
	var nMultSymbol = 6;
	var nMultMidChar = 2;
	var nMultRequirements = 2;
	var nMultRepChar = 1;
	var nMultConsecAlphaUC = 2;
	var nMultConsecAlphaLC = 2;
	var nMultConsecNumber = 2;
	var nMultConsecSymbol = 1;
	var nMultConsecCharType = 0;
	var nMultSeqAlpha = 3;
	var nMultSeqNumber = 3;
	var nTmpAlphaUC = "";
	var nTmpAlphaLC = "";
	var nTmpNumber = "";
	var nTmpSymbol = "";
	var sAlphaUC = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sAlphaLC = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sNumber = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sSymbol = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sMidChar = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sRequirements = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sAlphasOnly = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sNumbersOnly = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sRepChar = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sConsecAlphaUC = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sConsecAlphaLC = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sConsecNumber = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sSeqAlpha = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sSeqNumber = "&nbsp;&nbsp;&nbsp;&nbsp;0";
	var sAlphas = "abcdefghijklmnopqrstuvwxyz";
	var sNumerics = "01234567890";
	var sComplexity = "Too Short";
	var sStandards = "Below";
	var nMinPwdLen = 8;
	if (document.all) { var nd = 0; } else { var nd = 1; }
	if (pwd) {
		nScore = parseInt(pwd.length * nMultLength);
		nLength = pwd.length;
		var arrPwd = pwd.replace (/\s+/g,"").split(/\s*/);
		var arrPwdLen = arrPwd.length;
		
		/* Loop through password to check for Symbol, Numeric, Lowercase and Uppercase pattern matches */
		for (var a=0; a < arrPwdLen; a++) {
			if (arrPwd[a].match(new RegExp(/[A-Z]/g))) {
				if (nTmpAlphaUC !== "") { if ((nTmpAlphaUC + 1) == a) { nConsecAlphaUC++; nConsecCharType++; } }
				nTmpAlphaUC = a;
				nAlphaUC++;
			}
			else if (arrPwd[a].match(new RegExp(/[a-z]/g))) { 
				if (nTmpAlphaLC !== "") { if ((nTmpAlphaLC + 1) == a) { nConsecAlphaLC++; nConsecCharType++; } }
				nTmpAlphaLC = a;
				nAlphaLC++;
			}
			else if (arrPwd[a].match(new RegExp(/[0-9]/g))) { 
				if (a > 0 && a < (arrPwdLen - 1)) { nMidChar++; }
				if (nTmpNumber !== "") { if ((nTmpNumber + 1) == a) { nConsecNumber++; nConsecCharType++; } }
				nTmpNumber = a;
				nNumber++;
			}
			else if (arrPwd[a].match(new RegExp(/[^a-zA-Z0-9_]/g))) { 
				if (a > 0 && a < (arrPwdLen - 1)) { nMidChar++; }
				if (nTmpSymbol !== "") { if ((nTmpSymbol + 1) == a) { nConsecSymbol++; nConsecCharType++; } }
				nTmpSymbol = a;
				nSymbol++;
			}
			/* Internal loop through password to check for repeated characters */
			for (var b=0; b < arrPwdLen; b++) {
				if (arrPwd[a].toLowerCase() == arrPwd[b].toLowerCase() && a != b) { nRepChar++; }
			}
		}
		
		/* Check for sequential alpha string patterns (forward and reverse) */
		for (var s=0; s < 23; s++) {
			var sFwd = sAlphas.substring(s,parseInt(s+3));
			var sRev = sFwd.strReverse();
			if (pwd.toLowerCase().indexOf(sFwd) != -1 || pwd.toLowerCase().indexOf(sRev) != -1) { nSeqAlpha++; nSeqChar++;}
		}
		
		/* Check for sequential numeric string patterns (forward and reverse) */
		for (var s=0; s < 8; s++) {
			var sFwd = sNumerics.substring(s,parseInt(s+3));
			var sRev = sFwd.strReverse();
			if (pwd.toLowerCase().indexOf(sFwd) != -1 || pwd.toLowerCase().indexOf(sRev) != -1) { nSeqNumber++; nSeqChar++;}
		}
		
	/* Modify overall score value based on usage vs requirements */

		/* General point assignment */
		//document.getElementById("nLengthBonus").innerHTML = "+ " + nScore; 
		if (nAlphaUC > 0 && nAlphaUC < nLength) {	
			nScore = parseInt(nScore + ((nLength - nAlphaUC) * 2));
			sAlphaUC = "+ " + parseInt((nLength - nAlphaUC) * 2); 
		}
		if (nAlphaLC > 0 && nAlphaLC < nLength) {	
			nScore = parseInt(nScore + ((nLength - nAlphaLC) * 2)); 
			sAlphaLC = "+ " + parseInt((nLength - nAlphaLC) * 2);
		}
		if (nNumber > 0 && nNumber < nLength) {	
			nScore = parseInt(nScore + (nNumber * nMultNumber));
			sNumber = "+ " + parseInt(nNumber * nMultNumber);
		}
		if (nSymbol > 0) {	
			nScore = parseInt(nScore + (nSymbol * nMultSymbol));
			sSymbol = "+ " + parseInt(nSymbol * nMultSymbol);
		}
		if (nMidChar > 0) {	
			nScore = parseInt(nScore + (nMidChar * nMultMidChar));
			sMidChar = "+ " + parseInt(nMidChar * nMultMidChar);
		}
		//document.getElementById("nAlphaUCBonus").innerHTML = sAlphaUC; 
		//document.getElementById("nAlphaLCBonus").innerHTML = sAlphaLC;
		//document.getElementById("nNumberBonus").innerHTML = sNumber;
		//document.getElementById("nSymbolBonus").innerHTML = sSymbol;
		//document.getElementById("nMidCharBonus").innerHTML = sMidChar;
		
		/* Point deductions for poor practices */
		if ((nAlphaLC > 0 || nAlphaUC > 0) && nSymbol === 0 && nNumber === 0) {  // Only Letters
			nScore = parseInt(nScore - nLength);
			nAlphasOnly = nLength;
			sAlphasOnly = "- " + nLength;
		}
		if (nAlphaLC === 0 && nAlphaUC === 0 && nSymbol === 0 && nNumber > 0) {  // Only Numbers
			nScore = parseInt(nScore - nLength); 
			nNumbersOnly = nLength;
			sNumbersOnly = "- " + nLength;
		}
		if (nRepChar > 0) {  // Same character exists more than once
			nScore = parseInt(nScore - (nRepChar * nRepChar));
			sRepChar = "- " + nRepChar;
		}
		if (nConsecAlphaUC > 0) {  // Consecutive Uppercase Letters exist
			nScore = parseInt(nScore - (nConsecAlphaUC * nMultConsecAlphaUC)); 
			sConsecAlphaUC = "- " + parseInt(nConsecAlphaUC * nMultConsecAlphaUC);
		}
		if (nConsecAlphaLC > 0) {  // Consecutive Lowercase Letters exist
			nScore = parseInt(nScore - (nConsecAlphaLC * nMultConsecAlphaLC)); 
			sConsecAlphaLC = "- " + parseInt(nConsecAlphaLC * nMultConsecAlphaLC);
		}
		if (nConsecNumber > 0) {  // Consecutive Numbers exist
			nScore = parseInt(nScore - (nConsecNumber * nMultConsecNumber));  
			sConsecNumber = "- " + parseInt(nConsecNumber * nMultConsecNumber);
		}
		if (nSeqAlpha > 0) {  // Sequential alpha strings exist (3 characters or more)
			nScore = parseInt(nScore - (nSeqAlpha * nMultSeqAlpha)); 
			sSeqAlpha = "- " + parseInt(nSeqAlpha * nMultSeqAlpha);
		}
		if (nSeqNumber > 0) {  // Sequential numeric strings exist (3 characters or more)
			nScore = parseInt(nScore - (nSeqNumber * nMultSeqNumber)); 
			sSeqNumber = "- " + parseInt(nSeqNumber * nMultSeqNumber);
		}
		//document.getElementById("nAlphasOnlyBonus").innerHTML = sAlphasOnly; 
		//document.getElementById("nNumbersOnlyBonus").innerHTML = sNumbersOnly; 
		//document.getElementById("nRepCharBonus").innerHTML = sRepChar; 
		//document.getElementById("nConsecAlphaUCBonus").innerHTML = sConsecAlphaUC; 
		//document.getElementById("nConsecAlphaLCBonus").innerHTML = sConsecAlphaLC; 
		//document.getElementById("nConsecNumberBonus").innerHTML = sConsecNumber;
		//document.getElementById("nSeqAlphaBonus").innerHTML = sSeqAlpha; 
		//document.getElementById("nSeqNumberBonus").innerHTML = sSeqNumber; 

		/* Determine if mandatory requirements have been met and set image indicators accordingly */
		var arrChars = [nLength,nAlphaUC,nAlphaLC,nNumber,nSymbol];
		var arrCharsIds = ["nLength","nAlphaUC","nAlphaLC","nNumber","nSymbol"];
		var arrCharsLen = arrChars.length;
		for (var c=0; c < arrCharsLen; c++) {
			//var oImg = document.getElementById('div_' + arrCharsIds[c]);
			//var oBonus = document.getElementById(arrCharsIds[c] + 'Bonus');
			//document.getElementById(arrCharsIds[c]).innerHTML = arrChars[c];
			if (arrCharsIds[c] == "nLength") { var minVal = parseInt(nMinPwdLen - 1); } else { var minVal = 0; }
			if (arrChars[c] == parseInt(minVal + 1)) {
			  nReqChar++;
				//oImg.className = "pass";
				//oBonus.parentNode.className = "pass";
			}
			else if (arrChars[c] > parseInt(minVal + 1)) {
			  nReqChar++; 
				//oImg.className = "exceed"; 
				//oBonus.parentNode.className = "exceed"; 
			}
			else { 
			  //oImg.className = "fail"; 
				//oBonus.parentNode.className = "fail"; 
			}
		}
		nRequirements = nReqChar;
		if (pwd.length >= nMinPwdLen) { var nMinReqChars = 3; } else { var nMinReqChars = 4; }
		if (nRequirements > nMinReqChars) {  // One or more required characters exist
			nScore = parseInt(nScore + (nRequirements * 2)); 
			sRequirements = "+ " + parseInt(nRequirements * 2);
		}
		//document.getElementById("nRequirementsBonus").innerHTML = sRequirements;

		/* Determine if additional bonuses need to be applied and set image indicators accordingly */
		var arrChars = [nMidChar,nRequirements];
		var arrCharsIds = ["nMidChar","nRequirements"];
		var arrCharsLen = arrChars.length;
		for (var c=0; c < arrCharsLen; c++) {
			//var oImg = document.getElementById('div_' + arrCharsIds[c]);
			//var oBonus = document.getElementById(arrCharsIds[c] + 'Bonus');
			//document.getElementById(arrCharsIds[c]).innerHTML = arrChars[c];
			if (arrCharsIds[c] == "nRequirements") { var minVal = nMinReqChars; } else { var minVal = 0; }
			//if (arrChars[c] == parseInt(minVal + 1)) { 
			//  oImg.className = "pass"; 
			//	oBonus.parentNode.className = "pass"; 
			//} else if (arrChars[c] > parseInt(minVal + 1)) { 
			//  oImg.className = "exceed"; 
			//	oBonus.parentNode.className = "exceed"; 
			//} else { 
			//  oImg.className = "fail"; 
			//	oBonus.parentNode.className = "fail"; 
			//}
		}

		/* Determine if suggested requirements have been met and set image indicators accordingly */
		var arrChars = [nAlphasOnly,nNumbersOnly,nRepChar,nConsecAlphaUC,nConsecAlphaLC,nConsecNumber,nSeqAlpha,nSeqNumber];
		var arrCharsIds = ["nAlphasOnly","nNumbersOnly","nRepChar","nConsecAlphaUC","nConsecAlphaLC","nConsecNumber","nSeqAlpha","nSeqNumber"];
		var arrCharsLen = arrChars.length;
		//for (var c=0; c < arrCharsLen; c++) {
			//var oImg = document.getElementById('div_' + arrCharsIds[c]);
			//var oBonus = document.getElementById(arrCharsIds[c] + 'Bonus');
			//document.getElementById(arrCharsIds[c]).innerHTML = arrChars[c];
			//if (arrChars[c] > 0) { oImg.className = "warn"; oBonus.parentNode.className = "warn"; }
			//else { oImg.className = "pass"; oBonus.parentNode.className = "pass"; }
		//}
		
		/* Determine complexity based on overall score */
		if (nScore > 100) { nScore = 100; } else if (nScore < 0) { nScore = 0; }
		if (nScore >= 0 && nScore < 20) { sComplexity = "Very Weak"; }
		else if (nScore >= 20 && nScore < 40) { sComplexity = "Weak"; }
		else if (nScore >= 40 && nScore < 60) { sComplexity = "Good"; }
		else if (nScore >= 60 && nScore < 80) { sComplexity = "Strong"; }
		else if (nScore >= 80 && nScore <= 100) { sComplexity = "Very Strong"; }
		
		/* Display updated score criteria to client */
		//oScorebar.style.backgroundPosition = "-" + parseInt(nScore * 4) + "px";
		//oScore.innerHTML = nScore + "%";
		//oComplexity.innerHTML = sComplexity;
	}
	else {
		/* Display default score criteria to client */
		//initPwdChk();
		//oScore.innerHTML = nScore + "%";
		//oComplexity.innerHTML = sComplexity;
	}
	if (pwd && pwd.length >= nMinPwdLen && nScore >= 40)
	  return true;
	else
	  return false; 
	
}