var undefined = "";
var not_found = -1;
var not_selected = -1;    // indicates that the user did not selected a field option.

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();

//number_formats.thousand_separators = 1;
//number_formats.no_thousand_separators = 2;
//number_formats.default_format = number_formats.no_thousand_separators;



// This function defines the elements of the data type for Canadian provinces.

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;

}   //   end Language



var English = new Language("English", "Anglais", ",", ".");
var French = new Language("French", "Français", " ", ",");
var Default_Language = English;



// This function defines the elements of the data type for Canadian provinces.

function Province (English_name, French_name, code) {

	this.English_name = English_name;
	this.French_name = French_name;
	this.name = English_name;
	this.code = code;

	// this.IsDriverLicense = IsDriverLicense;
	
}   //   end function Province



//

var provinces = new Array(11);
Alberta = provinces["AB"] = new Province("Alberta", "Alberta", "Alb");
British_Columbia = provinces["BC"] = new Province("British Columbia", "Colombie-Britannique", "BC");
Manitoba = provinces["MB"] = new Province("Manitoba", "Manitoba", "Man");
New_Brunswick = provinces["NB"] = new Province("New Brunswick", "Nouveau-Brunswick", "NB");
Newfoundland = provinces["NF"] = new Province("Newfoundland", "Terre-Neuve", "Nfld");
Northwest_Territories = provinces["NT"] = new Province("Northwest Territories", "Territoires du Nord-Ouest", "Nwt");
Nova_Scotia = provinces["NS"] = new Province("Nova Scotia", "Nouvelle-Écosse", "NS");
Nunavut = provinces["NTU"] = new Province("Nunavut", "Nunavut", "Nu");
Ontario = provinces["ON"] = new Province("Ontario", "Ontario", "Ont");
Prince_Edward_Island = provinces["PE"] = new Province("Prince Edward Island", "Île-du-Prince-Édouard", "PEI");
Quebec = provinces["PQ"] = new Province("Quebec", "Québec", "Que");
Saskatchewan = provinces["SK"] = new Province("Saskatchewan", "Saskatchewan", "Sask");
Yukon = provinces["YT"] = new Province("Yukon", "Yukon", "Yuk");



//

function IsAlbDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsAlbDriverLicenseNumber



//

function IsBCDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsBCDriverLicenseNumber



//

function IsManDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsManDriverLicenseNumber



//

function IsNBDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsNBDriverLicenseNumber



//

function IsNfldDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsNfldDriverLicenseNumber



//

function IsNuDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsNBDriverLicenseNumber



//

function IsNwtDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsNwtDriverLicenseNumber



//

function IsNSDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsNSDriverLicenseNumber



//

function IsOntDriverLicenseNumber (driver_license_number, first_letter_of_last_name) {

	return true;
	
}   //   end function IsOntDriverLicenseNumber



//

function IsPEIDriverLicenseNumber (driver_license_number, first_letter_of_last_name) {

	return true;
	
}   //   end function IsPEIDriverLicenseNumber



//

function IsQueDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsQueDriverLicenseNumber



function IsSaskDriverLicenseNumber (driver_license_number, first_letter_of_last_name) {

	return true;
	
}   //   end function IsSaskDriverLicenseNumber



//

function IsYukDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsYukDriverLicenseNumber



// This function validates a dealership code.

function IsDealershipCode (dealership_code) {

	// A valid dealership code consists of 4 numeric digits.
	var valid_dealership_code = new RegExp("^[0-9]{4}$");
	
	dealership_code = dealership_code.toString();
	return valid_dealership_code.test(dealership_code);

}   //   end function IsDealershipCode



// This function validates a Web site address.

function IsWebsiteAddress (Website_address) {

	// A valid Web site address consists ???
	var valid_Website_address = new RegExp("^(http(s){0,1}:\/\/){0,1}((" + word_characters + "{1,})[.]{0,1})[/]{0,1}(" + non_spaces + "){0,}$");

	// return valid_Website_address.test(Website_address);
	return true;

}   //   end function IsWebsiteAddress



// This function validates a user name.

function IsLoginID (login_ID, min_login_ID_length, max_login_ID_length) {

	//
	if (!min_login_ID_length) {
		min_login_ID_length = 4;
	}   //   end if
	
	//
	if (!max_login_ID_length) {
		max_login_ID_length = 25;
	}   //   end if

	// A valid login ID must consists of 1 to 25 letters and/or numbers.
	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);

}   //   end function IsUserName



// This function determines if a user password is valid.

function IsPassword (password, min_password_length, max_password_length) {

	if (!min_password_length) {
		min_password_length = 8;
	}   //   end if
	
	if (!max_password_length) {
		max_password_length = 16;
	}   //   end if

	// A valid password must consists of 8 to 16 letters and/or numbers.
	var valid_password = new RegExp("^[A-Za-z0-9]{" + min_password_length + "," + max_password_length + "}$");

	return valid_password.test(password);
	
}   //   end function IsPassword



// This function validates a quotation ID.

function IsQuotationID (quotation_ID) {
	// A valid quotation ID ranges from 1 to 1,000,000,000.
	var valid_quotation_ID = new RegExp("^[1-9][0-9]{0,9}$");

	quotation_ID = quotation_ID.toString();	
	return valid_quotation_ID.test(quotation_ID);
	
}   //   end function IsQuotationID



// This functions validates a human name.

function IsName(name) {

	// A valid human name begins with a letter and consists of letters, hyphens, apostrophes and/or periods.
	var valid_name = new RegExp("^[A-Za-z][A-Za-z\-'\. ]{0,}$");

	return valid_name.test(name);
	
}   //   end function IsName



// This function validates middle initial(s).

function IsMiddleInitial (middle_initial) {

	// Valid middle initials consists of 1 to 2 letters.
	var valid_middle_initial = new RegExp("^([A-Za-z]){1,2}$");

	return valid_middle_initial.test(middle_initial);	
	
}   //   end function IsMiddleInitial



// This function validates an employee's ID.

function IsEmployeeID (EmployeeID) {

	return true;

}   //   end function IsEmployeeID



// This function validates a human age.

function IsAge (age) {

	// A valid human age ranges from 1 to 999.
	var valid_age = new RegExp("^[1-9][0-9]{1,2}$");

	age = age.toString();
	return valid_age.test(age);
	
}   //   end function IsAge



// This function validates a gender.

function IsGender (gender) {

	// A valid gender is one of the following: M, Male, F, Female (regardless of each letter's case).
	var valid_gender = new RegExp("^([MmFf])||(([Ff][Ee]){0,1}([Mm][Aa][Ll][Ee]))$");

	return valid_gender.test(gender);
	
}   // end function IsGender



// This function validates a Canadian postal code.

function IsPostalCode (postal_code) {

	// A valid postal code consists of an alternating series of 6 letters and numbers beginning with a letter.
	// The postal code may include a space after the 3rd character (i.e. 2nd letter).
	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);
	
}   //   end function IsPostalCode



// This function validates a Web site address.

function IsWebsiteAddress (Website_address) {

	// A valid Web site address consists ???
	var valid_Website_address = new RegExp("^(http(s){0,1}[:][/][/]){0,1}((" + word_characters + "{1,})[.]{1,})[/]{0,1}(" + non_spaces + "){0,}$");

	// return valid_Website_address.test(Website_address);
	return true;

}   //   end function IsWebsiteAddress



// This function validates a quotation ID.

function IsQuotationID (quotation_ID) {
	// A valid quotation ID ranges from 1 to 1,000,000,000.
	var valid_quotation_ID = new RegExp("^[1-9][0-9]{0,9}$");

	quotation_ID = quotation_ID.toString();	
	return valid_quotation_ID.test(quotation_ID);
	
}   //   end function IsQuotationID



// This functions validates a human name.

function IsName(name) {

	// A valid human name begins with a letter and consists of letters, hyphens, apostrophes and/or periods.
	var valid_name = new RegExp("^[A-Za-z][A-Za-z\-'\. ]{0,}$");

	return valid_name.test(name);
	
}   //   end function IsName



// This function validates middle initial(s).

function IsMiddleInitial (middle_initial) {

	// Valid middle initials consists of 1 to 2 letters.
	var valid_middle_initial = new RegExp("^([A-Za-z]){1,2}$");

	return valid_middle_initial.test(middle_initial);	
	
}   //   end function IsMiddleInitial



// This function validates a human age.

function IsAge (age) {

	// A valid human age ranges from 1 to 999.
	var valid_age = new RegExp("^[1-9][0-9]{1,2}$");

	age = age.toString();
	return valid_age.test(age);
	
}   //   end function IsAge



// This function validates a gender.

function IsGender (gender) {

	// A valid gender is one of the following: M, Male, F, Female (regardless of each letter's case).
	var valid_gender = new RegExp("^([MmFf])||(([Ff][Ee]){0,1}([Mm][Aa][Ll][Ee]))$");

	return valid_gender.test(gender);
	
}   // end function IsGender



// This function validates a Canadian postal code.

function IsPostalCode (postal_code) {

	// A valid postal code consists of an alternating series of 6 letters and numbers beginning with a letter.
	// The postal code may include a space after the 3rd character (i.e. 2nd letter).
	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);
	
}   //   end function IsPostalCode



// This function validates a telephone area code.

function IsAreaCode (area_code) {

	// A valid area code consists of 3 numeric digits beginning with a digit from 1 to 9.
	// The area code may also include surrounding left and right brackets.
	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);
		}
	
}   //   end function IsAreaCode



// This function validates a telephone number.

function IsPhoneNumber (phone_number) {

	// A valid phone number consists of 7 numeric digits beginning with a digit from 1 to 9.
	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);


	
	
}   //   end function IsPhoneNumber

function IsPhoneNumber2 (phone_number) {

	// A valid phone number consists of 7 numeric digits beginning with a digit from 1 to 9.
	var valid_phone_number = new RegExp("^[1-9][0-9]{2}[\-]{0,1}[0-9]{7}$");

	return valid_phone_number.test(phone_number);
	
}   //   end function IsPhoneNumber



// This function validates an e-mail address.

function IsEmailAddress (email_address) {
	
	var period_pattern = "([A-Za-z0-9][A-Za-z0-9_\-]{0,})";
	var before_at_sign_pattern = "(" + period_pattern + "([.]" + period_pattern + "){0,})"; 
	var after_at_sign_pattern = "(" + period_pattern + "([.]" + period_pattern + "){1,})";
	var valid_email_address = new RegExp("^" + before_at_sign_pattern + "@" + after_at_sign_pattern + "$");

	return valid_email_address.test(email_address);
	
}   //   end function IsEmailAddress



// This function validates Ontario driver license numbers.

function IsDriverLicenseNumber (driver_license_number) {

	return true;
	
}   //   end function IsDriverLicenseNumber



//

// This function validates Ontario driver license numbers.

function IsOntarioDriverLicenseNumber (driver_license_number, first_letter_of_last_name) {

	var valid_driver_license_first_letter = "";
	var valid_driver_license_number = "";

	if (!first_letter_of_last_name) {
		driver_license_first_letter = "[A-Za-z]";
		
	} else {
		driver_license_first_letter = "[" + first_letter_of_last_name.toUpperCase() + first_letter_of_last_name.toLowerCase() + "]";
	}   //   end if
	
	valid_driver_license_number = new RegExp("^" + driver_license_first_letter + "[0-9]{14}$");	
	
	return valid_driver_license_number.test(driver_license_number);
	
}   //   end function IsDriverLicenseNumber



// This function validates Ontario driver license numbers.

function ValidOntarioDriverLicense (driver_license_number, first_letter_of_last_name) {

	var valid_driver_license_first_letter = "";
	var valid_driver_license_number = "";

	if (!first_letter_of_last_name) {
		driver_license_first_letter = "[A-Za-z]";
		
	} else {
		driver_license_first_letter = "[" + first_letter_of_last_name.toUpperCase() + first_letter_of_last_name.toLowerCase() + "]";
	}   //   end if
	
	valid_driver_license_number = new RegExp("^" + driver_license_first_letter + "[0-9]{14}$");	
	
	return valid_driver_license_number.test(driver_license_number);
	
}   //   end function ValidOntarioDriverLicense



// This function validates a calendar year.

function IsYear (year) {

	// A valid year consists of 4 numeric digits beginning with a digit from 1 to 9.
	var valid_year = new RegExp("^[1-9][0-9]{3}$");

	year = year.toString();
	return valid_year.test(year);
	
}   //   end function IsYear



// This function validates a positive number.

function IsPositiveInteger (positive_integer, language) {
	
	//
	if (language == null) {
		language = English;
	}
	
	// A valid positive integer is any whole number greater than 0.
	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);

}   //   end function IsPositiveInteger



// This function validates a negative number.

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);

}   //   end function IsNegativeInteger



//

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);
	
}   //   end function IsWholeNumber



// This function validates a whole number.

function ValidWholeNumber (whole_number) {

	// 
	if (language == null) {
		language = English;
	}  //  end if

	whole_number = whole_number.toString();

	// A valid whole number is any number greater than 0.
	return ((whole_number == 0) || (IsPostiveInteger(whole_number)));
		
}   //   end function IsWholeNumber



// This function validates an integer.

function IsInteger (integer, language) {

	// 
	if (language == null) {
		language = English;
	}  //  end if

	integer = integer.toString();
	// alert("integer = " + integer);
	return (IsWholeNumber(integer, language) || IsNegativeInteger(integer, language));

}   //   end function IsInteger



// This function validates a decimal number.

function IsDecimal (decimal, decimal_place, language) {

	// 
	if (language == null) {
		language = English;
	}  //  end if

	decimal = decimal.toString();

	if (decimal_place == "*") {
		decimal_place = undefined;

	} else if ((decimal_place != null) && (decimal_place != undefined) && (!IsWholeNumber(decimal_place, language))) {
		alert("The decimal place is optional, but, if entered, must a valid whole number greater or equal to 0.");
		return false;
	}   //   end if

	var valid_decimal = new RegExp("^(" + signs + "[0]{0,1}([" + language.decimal + "]([0-9]{1," + decimal_place + "})))$");
	// alert("valid_decimal.source = " + valid_decimal.source);
	
	return valid_decimal.test(decimal);

}   //   end function IsDecimal



// This function validates a real number.

function IsRealNumber (real_number, decimal_place, language) {

	// 
	if (language == null) {
		language = English;
	}

	real_number = real_number.toString();
	// decimal_place = decimal_place.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;	
	}   //   end if
	
	// integer = real_number;

	if ((sign == "+") || (sign == "-")) {
		real_number = real_number.substring(1, real_number.length);
	}   //   end if

	decimal_index = real_number.indexOf(language.decimal, decimal_index);

	// Splits the real number into an integer and a decimal portion, if it contains a decimal.
	if (decimal_index != not_found) {
		integer = real_number.substring(0, decimal_index);
		decimal = real_number.substring(decimal_index, real_number.length);
	}   //   end if

	// Validates the integer portion of the real number.
	if ((integer) && (!IsInteger(integer, language))) {
		return false;
	}   //   end if
	
	// Validates the decimal portion of the real number.
	if ((decimal) && (!IsDecimal(decimal, decimal_place, language))) {
		return false;
	}   //   end if



	return true;

}   //   end function IsRealNumber



// This function validates a dollar amount.

function IsDollarAmount (dollar_amount, slanguage) {
	
	// 
	if (slanguage == null || slanguage=="English" || slanguage==English) {
		language = English;
	}
	else
		language = French;


	// The decimal place to which all dollar amount are rounded off.
	var cent_decimal_place = 2;

	// A dollar amount is any real number that includes exactly 2 numeric digits after the decimal.
	dollar_amount = dollar_amount.toString();

	return IsRealNumber(dollar_amount, cent_decimal_place, language);

}   //   end function IsDollarAmount



// This function returns all the checkboxes that the user selected.

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;
			}   //   end if
		
		}   //   end for
		
		return result;
	}   //   end if
	
}   //   end function SelectedCheckboxes



// This function returns the radio button that the user selected.

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;
			}   //   end if
		
		}   //   end for
		
		return not_selected;
	}   //   end if
	
}   //   end function CheckedRadioButton



// This function validates a vehicle's make.

function IsMake (make) {
	var valid_make = new RegExp("^[A-Za-z0-9\-\_' ]{1,}$");

	return valid_make.test(make);
	
}   //   end function IsMake



// This function validates a vehicle's model.

function IsModel (model) {
	var valid_model = new RegExp("^[A-Za-z0-9\-\_' ]{1,}$");

	return valid_model.test(model);
	
}   //   end function IsModel



// This function validates a manufacture year of vehicle's model.

function IsModelYear (model_year, max_model_year) {
	var min_model_year = "1900";
	var integer_year = parseInt(model_year);

	if (max_model_year == undefined) {
		max_model_year = new Date().getYear() + 2;
	}   //   end if

	return (IsYear(model_year) && (integer_year >= min_model_year) && (integer_year <= max_model_year));
	
}   //   end function IsModel



// This function validates a vehicle's stock ID.

function IsStockID (stock_ID) {
	var valid_stock_ID = new RegExp("^[A-Za-z0-9]{50}$");

	return valid_stock_ID.test(stock_ID);
	
}   //   end function IsStockID



// This function validates a vehicle's trim level.

function IsTrimLevel (trim_level) {
	var valid_trim_level = new RegExp("^[A-Za-z0-9][A-Za-z0-9\- ]{0,4}$");

	if (valid_trim_level.test(trim_level)) {	
		return true;
	
	} else {
		return false;
	}   //   end if
	
}   //   end function IsTrimLevel



// This function validates a vehicle's VIN.

function IsVIN (VIN) {
	var valid_VIN = new RegExp("^[A-NP-Za-np-z0-9]{17}$");

	return valid_VIN.test(VIN);
	
}   //   end function IsVIN



// This function validates a vehicle's plate number.

function IsPlateNumber (plate_number) {
	var valid_plate_number = new RegExp("^[A-Za-z0-9 ]{3,8}$");

	return valid_plate_number.test(plate_number);
	
}   //   end function IsPlateNumber



// CONVERSION FUNCTIONS

// This function converts the first character to the uppercase and remaining characters to lowercase.

function TitleCase (text) {
	
	if (text.length) {
		return text.substr(0, 1).toUpperCase() + text.substr(1, text.length - 1).toLowerCase();
	
	} else {
		return undefined;
	}   //   end if

}   //   end TitleCase



// This function repeats a character pattern a given number of times.

function RepeatString (string, repeat_total) {
	
	//
	var result = new String(undefined);

	for (var repeat_index = 0; repeat_index < repeat_total; repeat_index++) {
		result += string;
	}   //   end for
	
	return result;
	
}   //   end RepeatString



// This function rounds off a number to a given decimal place.

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;	
	}   //   end if
	
	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;
	}   //   end if
	
	if (language == null) {
		language = English;
	}   //   end if

	//
	with (Math) {	
		power_of_10 = pow(10, decimal_place);
		result = round(ConvertNumber(number, language) * power_of_10) / power_of_10;
	}   //   end with
	
	result = result.toString();
	// This result is in english, convert it to the requested language
	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;
		}   //   end if
		
		result += RepeatString("0", decimal_place - digits_after_decimal.length);
	}   //   end if
	
	return result;
}   //   end RoundOff



// This function strips a real number of its thousands separators and replace the decimal with a period.
// Used to standardize formatting of numbers for easy processing.

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;
	
	}   //   end while

	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);
	}   //   end if

	return real_number;

}   //   end function ConvertNumber



// This function removes spaces at the beginning of a string.

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;
	}   //   end if
	
	return result;

}   //   end function RemoveLeadingSpaces



// This function removes spaces at the end of a string.

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;
	}   //   end if

	return result;

}   //   end function RemoveLeadingSpaces



// This function removes spaces both at the beginning and at the end of a string.

function RemoveOuterSpaces (text) {

	return RemoveTrailingSpaces(RemoveLeadingSpaces(text));

}   //   end RemoveSpaces



//

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;
		}   //   end if
		
	}   //   end for 

	return result;
	
}   //   end RemoveAllSpaces



//

//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;
//			
//	}   //   end switch
//	
//	return number;
//
//} //   end function FormatNumber



// This function rounds off a number to a given decimal place.

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;	
	}   //   end if
	
	//
	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;
	}   //   end if
	
	//
	if (language == null) {
		language = English;
	}   //   end if

	// 
	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;
		}   //   end with
	
		result = result.toString();
		// This result is in english, convert it to the requested language
		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;
			}   //   end if
		
			result += RepeatString("0", decimal_place - digits_after_decimal.length);
		}   //   end if
	

	}   //   end if

	return result;

}   //   end RoundOff2

function IsBankRate (Rate) {

var reNumber  = /^([+-]?)(\d*(\.\d+)?)$/;

if( reNumber.test(Rate) )
		{
			return true;
		}
		else
		{
			return false;
		}


}


function IsPhoneExt (phone_ext) {

	// A valid phone number consists of 5 numeric digits beginning with a digit from 1 to 9.
	var valid_phone_number = new RegExp("^[0-9]{1,5}");

	return valid_phone_number.test(phone_ext);
	
}   //   end function IsPhoneNumber



// alert(ConvertNumber("1 000"));
// alert(FormatNumber("1,000", French));

function replaceSubstring(inputString, fromString, toString) {
   // Goes through the inputString and replaces every occurrence of fromString with toString
   var temp = inputString;
   if (fromString == "") {
      return inputString;
   }
   if (toString.indexOf(fromString) == -1) { // If the string being replaced is not a part of the replacement string (normal situation)
      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 { // String being replaced is part of replacement string (like "+" being replaced with "++") - prevent an infinite loop
      var midStrings = new Array("~", "`", "_", "^", "#");
      var midStringLen = 1;
      var midString = "";
      // Find a string that doesn't exist in the inputString to be used
      // as an "inbetween" string
      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;
            }
         }
      } // Keep on going until we build an "inbetween" string that doesn't exist
      // Now go through and do two replaces - first, replace the "fromString" with the "inbetween" string
      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;
      }
      // Next, replace the "inbetween" string with the "toString"
      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;
      }
   } // Ends the check to see if the string being replaced is part of the replacement string or not
   return temp; // Send the updated string back to the user
} // Ends the "replaceSubstring" function

// trims leading and trailing spaces
function strtrim(arg)
{
    return arg.replace(/^\s+/,'').replace(/\s+$/,'');
}
