function ltrimChar(text, _char) {
	if (text == null) return text;
	var resultText = new String(text);
	var i = 0;
	while (i < resultText.length && resultText.charAt(i) == _char) i++;
	return resultText.substring(Math.min(i, resultText.length));
}

function ltrim(text) {
	return ltrimChar(text, ' ');
}

function rtrimChar(text, _char) {
	if (text == null) return text;
	var resultText = new String(text);
	var i = resultText.length - 1;
	while (i >= 0 && resultText.charAt(i) == _char) i--;
	return resultText.substring(0, i + 1);
}

function rtrim(text) {
	return rtrimChar(text, ' ');
}

function trimChar(text, _char) {
	return rtrimChar(ltrimChar(text, _char), _char);
}

function trim(text) {
	return trimChar(text, ' ');
}

function replace(text, oldPart, newPart) {
	if (text == null) return text;
	var j = 0;
	var i = 0;
	var resultText = new String("");
	while ((i = text.indexOf(oldPart, j)) >= 0) {
		resultText += text.substring(j, i);
		resultText += newPart;
		j = i + oldPart.length;
	}
	resultText += text.substring(j);
	return resultText;
}
function isChar(text) {
	var charCode = text.charCodeAt(0);
	return charCode > -1 && charCode < 128;
}

function isAlpha(text) {
	var charCode = text.charCodeAt(0);
	return (charCode > 64 && charCode < 91) || (charCode > 96 && charCode < 123);
}

function isDigit(text) {
	var charCode = text.charCodeAt(0);
	return charCode > 47 && charCode < 58;
}

function isCtrlChar(text) {
	var charCode = text.charCodeAt(0);
	return (charCode > -1 && charCode < 32) || charCode == 127;
}

function isSpecialChar(text) {
	var specialCharSet = "()<>@,;:\\\".[]";
	return specialCharSet.indexOf(text.charAt(0)) >= 0;
}

function isSpace(text) {
	var charCode = text.charCodeAt(0);
	return charCode == 32;
}

function isAtom(text) {
	return isChar(text) && !isSpecialChar(text) && !isSpace(text) && !isCtrlChar(text);
}

function isInteger(value) {
	if (value == null) return false;
	value = trim(value);
	for (var i = 0; i < value.length; i++) {
		var _char = value.charAt(i);
		if (i == 0 && _char == '-') continue;
		if (!isDigit(_char)) return false;
	}
	var intValue = parseInt(value);
	return ! isNaN(intValue);
}

function isFloat(value) {
	if (value == null) return false;
	value = trim(value);
	var dotAlreadyExists = false;
	for (var i = 0; i < value.length; i++) {
		var _char = value.charAt(i);
		if (i == 0 && _char == '-') continue;
		if (_char == '.' && !dotAlreadyExists) {
			dotAlreadyExists = true;
			continue;
		}
		if (!isDigit(_char)) return false;
	}
	var floatValue = parseFloat(value);
	return ! isNaN(floatValue);
}

function isLeapYear(year) {
	return (year % 4) == 0;
}

var _aMonthLength = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var _aLeapMonthLength = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

function isCorrectDate(year, month, day) {
	year = ltrimChar(year, '0');
	if (!isInteger(year) || parseInt(year) < 0) return false;
	month = ltrimChar(month, '0');
	if (!isInteger(month) || parseInt(month) < 1 || parseInt(month) > 12) return false;
	day = ltrimChar(day, '0');
	if (!isInteger(day) || parseInt(day) < 1 || parseInt(day) > (isLeapYear(parseInt(year)) ? _aLeapMonthLength : _aMonthLength)[parseInt(month) - 1]) return false;
	return true;
}

function checkDate(date, optional) {
	if ((date == null || trim(date).length < 1) && optional) return true;
	var _date = date + "/M/Y/D";
	var delimiter = new RegExp("[\/\.]", "g"); // need to add more delimeters
	var dateParts = _date.split(delimiter, 3);
	return isCorrectDate(String(dateParts[2]), String(dateParts[0]), String(dateParts[1]));	
}

function checkEmail(value) {
	// first check does given value is not empty
	if (value == null || trim(value).length < 1) return false;
	// trim value
	value = trim(value);
	// get first index of '@' in value string
	var atCharIndex = value.indexOf('@');
	// if '@' does not exist in value string or first character in the string
	// or last character in the string
	// or value string contains another '@' character
	// then this email address is invalid
	if (atCharIndex < 1 || atCharIndex == (value.length - 1) ||  value.indexOf('@', atCharIndex + 1) >= 0) return false;
	var localAddressPart = value.substring(0, atCharIndex);
	for (var charIndex = 0; charIndex < localAddressPart.length; charIndex++) {
		if (localAddressPart.charAt(charIndex) != ".") {
			if (!isAtom(localAddressPart.substr(charIndex, 1))) return false;
		} else {
			if (charIndex == 0 || charIndex == localAddressPart.length -1) return false;
		}
	}
	var domainPart = value.substring(atCharIndex + 1);
	if (domainPart.indexOf(".") < 0) return false;
	for (var charIndex = 0; charIndex < domainPart.length; charIndex++) {
		if (domainPart.charAt(charIndex) != ".") {
			if (! isAtom(domainPart.substr(charIndex, 1))) return false;
		} else {
			if (charIndex == 0 || charIndex == domainPart.length -1) return false;
		}
	}
	return true;
}

function isIE() {
	return navigator.appVersion.indexOf("MSIE") >= 0;
}

function isNS() {
	return navigator.appName == "Netscape";
}

function getBrowserVersion() {
	if (isNS()) return parseFloat(navigator.appVersion);
	var i = navigator.appVersion.indexOf("MSIE") + 5;
	return parseFloat(navigator.appVersion.substring(i));
}

function checkText(text) {
	if (text == null) return false;
	return trim(text).length > 0;
}

function messageHelper(element, message, returnValue) {
	element.focus();
	if (element.select) element.select();
	alert(message);
	element.focus();
	if (element.select) element.select();
	return returnValue;
}

function getFormElement(form, elementName) {
	return form.elements[elementName];
}

function getFormGroupElement(form, groupName, value) {
	var group = getFormElement(form, groupName);
	if (group == null || !group.length) return group;
	for (var i = 0; i < group.length; i++) {
		if (group[i].value) {
			if (value.toLowerCase() == group[i].value.toLowerCase()) {
				return group[i];
			}
		}
	}
	return null;
}

function getFormElementValue(form, groupName) {
	var resultArray = new Array();
	var group = getFormElement(form, groupName);
	if (group != null) {
		if (group.length) {
			if (group.options) {
				for (var i = 0; i < group.length; i++) {
					if (group.options[i].selected) resultArray[resultArray.length] = group.options[i].value;
				}
			} else {
				for (var i = 0; i < group.length; i++) {
					if (group[i].checked) resultArray[resultArray.length] = group[i].value;
				}
			}
		} else if (group.value) {
			resultArray[0] = group.value;
		}
	}
	return resultArray;
}

function asString(object) {
	var result = "";
	if (object.length) {
		for (var i = 0; i < object.length; i++) {
			result += ("[" + i + "] " + object[i] + "; ");
		}
	} else {
		result = "" + object
	}
	return result;
}

function checkRadioGroup(frm, name) {
	return getFormElementValue(frm, name).length == 1;
}

function checkCheckboxGroup(frm, name) {
	return getFormElementValue(frm, name).length > 0;
}

function checkDateFormElement(frm, name) {
	var objMm = getFormElement(frm, name + "_mm");
	if (objMm == null) return false;
	if (objMm.selectedIndex < 0) return false;
	var objDd = getFormElement(frm, name + "_dd");
	if (objDd == null) return false;
	if (objDd.selectedIndex < 0) return false;
	var objYyyy = getFormElement(frm, name + "_yyyy");
	if (objYyyy == null) return false;
	if (objYyyy.selectedIndex < 0) return false;
	return isCorrectDate(objYyyy.options[objYyyy.selectedIndex].value, objMm.options[objMm.selectedIndex].value, objDd.options[objDd.selectedIndex].value);
}

function checkOptionalDateFormElement(frm, name) {
	var objMm = getFormElement(frm, name + "_mm");
	if (objMm == null) return true;
	var objDd = getFormElement(frm, name + "_dd");
	if (objDd == null) return true;
	var objYyyy = getFormElement(frm, name + "_yyyy");
	if (objYyyy == null) return true;
	if ((objMm.selectedIndex < 1) && (objDd.selectedIndex < 1) && (objYyyy.selectedIndex < 1)) return true; // I assumed that first item is empty item
	return isCorrectDate(objYyyy.options[objYyyy.selectedIndex].value, objMm.options[objMm.selectedIndex].value, objDd.options[objDd.selectedIndex].value);
}

