/////////// VALIDATION /////////////////////
function returner(str,warning) {
	if(warning!="") {
		alert(unescape(warning));
		if(str.type) {
			str.focus();
		} else {
			str[0].focus();
		}
	}
	return false;
}

///////////////////////////////////////////
// validation of required field *
///////////////////////////////////////////
function validateRequired(fieldobj,type,warning) {
	switch(type) {
		case "textarea":
		case "text":
			if(fieldobj.value.length != 0) { return true; }
		break;
		case "select":
			for (i=1; i < fieldobj.length; i++) {
				if(fieldobj.options[i].selected) { return true; }
			}
		break;
		case "single_enum":
			if(fieldobj.checked) { return true; }
		break;
		case "multi_enum":
			for (i=0; i < fieldobj.length; i++) {
				if(fieldobj[i].checked) { return true; }
			}
		break;
	}
	return returner(fieldobj,warning);
}

///////////////////////////////////////////
// validation of string length (min/max) *
///////////////////////////////////////////
function validateLength(fieldobj,min,max,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }
	
	if(str.length >= min && str.length <= max) { return true; }
	return returner(fieldobj,warning);
}

///////////////////////////////////////////
// validation of range (min/max) *
///////////////////////////////////////////
function validateRange(fieldobj,min,max,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }

	if(validateNumber(fieldobj,'')) {
		if(validateNumberRange(fieldobj,min,max,'')){ return true; }
	}
	return returner(fieldobj,warning);
}

///////////////////////////////////////////
// validation of number range (min/max) *
///////////////////////////////////////////
function validateNumberRange(fieldobj,min,max,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }
	
	if(str >= min && str <= max) { return true; }
	return returner(fieldobj,warning);
}

///////////////////////////////////////////
// validation of email address *
///////////////////////////////////////////
function validateEmail(fieldobj,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }

	var re_mail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z])+$/;
	if(re_mail.test(str)) { return true; }
	return returner(fieldobj,warning);
}

///////////////////////////////////////////
// validation of file extension *
///////////////////////////////////////////
function validateFileType(fieldobj,validExtensions,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }

	fileextension = str.toLowerCase().split(".");
	fileextension = fileextension[fileextension.length-1];
	validExtensions = validExtensions.toLowerCase();
	extension = validExtensions.split(",");
	for (i=0;i<extension.length;i++) {
		if(fileextension==extension[i] || fileextension=="") { return true; }
	}
	return returner(fieldobj,warning);
}

///////////////////////////////////////////
// validation of date *
///////////////////////////////////////////
function validateDate(fieldobj,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }

	isplit = str.indexOf('/');

	if(isplit == -1 || isplit == str.length) { return returner(fieldobj,warning); }

	sMonth = str.substring(0,isplit);

	if(sMonth.length == 0) { return returner(fieldobj,warning); }

	isplit = str.indexOf('/',isplit + 1);

	if(isplit == -1 || (isplit + 1 ) == str.length) { return returner(fieldobj,warning); }

	sDay = str.substring((sMonth.length + 1), isplit);

	if(sDay.length == 0) { return returner(fieldobj,warning); }

	sYear = str.substring(isplit + 1);

	var dayInput = document.createElement("input");
	dayInput.value=sDay;
	var monthInput = document.createElement("input");
	monthInput.value=sMonth;
	var yearInput = document.createElement("input");
	yearInput.value=sYear;
	
	if(!validateLength(dayInput,1,2,'')) { return returner(fieldobj,warning); }
	else if(!validateLength(monthInput,1,2,'')) { return returner(fieldobj,warning); }
	else if(!validateLength(yearInput,1,4,'')) { return returner(fieldobj,warning); }
	else if(!validateInteger(monthInput,'')) { return returner(fieldobj,warning); }
	else if(!validateRange(monthInput,1,12,'')) { return returner(fieldobj,warning); }
	else if(!validateInteger(yearInput,'')) { return returner(fieldobj,warning); }
	else if(!validateRange(yearInput,0,9999,'')) { return returner(fieldobj,warning); }
	else if(!validateInteger(dayInput,'')) { return returner(fieldobj,warning); }
	else if(!validateDay(dayInput,sMonth,sYear,'')) { return returner(fieldobj,warning); }
	else { return true; }
}

///////////////////////////////////////////
// validation of time *
///////////////////////////////////////////
function validateTime(fieldobj,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }
	
	time_array=str.split(':');
	
	if(time_array.length!=3) { return returner(fieldobj,warning); }
	
	sHour = time_array[0];
	sMin = time_array[1];
	sSec = time_array[2];

	var hourInput = document.createElement("input");
	hourInput.value=sHour;
	var minuteInput = document.createElement("input");
	minuteInput.value=sMin;
	var secondInput = document.createElement("input");
	secondInput.value=sSec;

	if(!validateLength(hourInput,1,2,'')) { return returner(fieldobj,warning); }
	else if(!validateInteger(hourInput,'')) { return returner(fieldobj,warning); }
	else if(!validateRange(hourInput,0,23,'')) { return returner(fieldobj,warning); }

	if(!validateLength(minuteInput,1,2,'')) { return returner(fieldobj,warning); }
	else if(!validateInteger(minuteInput,'')) { return returner(fieldobj,warning); }
	else if(!validateRange(minuteInput,0,59,'')) { return returner(fieldobj,warning); }

	if(!validateLength(secondInput,1,2,'')) { return returner(fieldobj,warning); }
	else if(!validateInteger(secondInput,'')) { return returner(fieldobj,warning); }
	else if(!validateRange(secondInput,0,59,'')) { return returner(fieldobj,warning); }

	return true;
}

///////////////////////////////////////////
// validate regex *
///////////////////////////////////////////
function validateRegEx(fieldobj,regex,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }

	if(regex.test(str)) { return true; }
	return returner(fieldobj,warning);
}

///////////////////////////////////////////
// validate integer *
///////////////////////////////////////////
function validateInteger(fieldobj,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }

	var decimal_format = ".";
	var check_char = str.indexOf(decimal_format);

	if(check_char == -1) { return validateNumber(fieldobj,warning); }
	else { return returner(fieldobj,warning); }
}

///////////////////////////////////////////
// validate number *
///////////////////////////////////////////
function validateNumber(fieldobj,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }

	var start_format = " .+-0123456789";
	var number_format = " .0123456789";
	var check_char;
	var decimal = false;
	var trailing_blank = false;
	var digits = false;

	check_char = start_format.indexOf(str.charAt(0));

	if(check_char == 1) {
		decimal = true;
	} else if(check_char < 1) {
		return returner(fieldobj,warning);
	}

	for (var i = 1; i < str.length; i++) {
		check_char = number_format.indexOf(str.charAt(i));
		if(check_char < 0) {
			return returner(fieldobj,warning);
		} else if(check_char == 1) {
			if(decimal) {
				return returner(fieldobj,warning);
			} else {
				decimal = true;
			}
		} else if(check_char == 0) {
			if(decimal || digits) {
				trailing_blank = true;
			}
		} else if(trailing_blank) {
			return returner(fieldobj,warning);
		} else {
			digits = true;
		}
	}	
	return true;
}

///////////////////////////////////////////
// validate phone number *
///////////////////////////////////////////
function validatePhoneNumber(fieldobj,warning) {
	var i;
	var str = '';
	var digits = "0123456789";
	var phoneNumberDelimiters = "()- +";
	var minDigitsInIPhoneNumber = 10;
	for(i = 0; i < fieldobj.value.length; i++) {   
		var c = fieldobj.value.charAt(i);
		if(phoneNumberDelimiters.indexOf(c) == -1) {
			str += c;
		}
	}
	for(i = 0; i < str.length; i++) {
		var c = str.charAt(i);
		if (((c < "0") || (c > "9"))) {
			return returner(fieldobj,warning);
		}
	}
	if(str.length < minDigitsInIPhoneNumber) {
		return returner(fieldobj,warning);
	} else {
		return true;
	}
}


/////////// SUPPORT /////////////////////

///////////////////////////////////////////
// validation of day (SUPPORT - validateDate) *
///////////////////////////////////////////
function validateDay(day,month,year,warning) {
	maxDay = 31;

	if(month == 4 || month == 6 || month == 9 || month == 11) {
		maxDay = 30;
	} else if(month == 2) {
		if(year % 4 > 0) {
			maxDay =28;
		} else if(year % 100 == 0 && year % 400 > 0) {
			maxDay = 28;
		} else {
			maxDay = 29;
		}
	}
	return validateRange(day,1,maxDay,warning);
}

///////////////////////////////////////////
// validation of currency *
///////////////////////////////////////////
function validateCurrency(fieldobj,warning) {
	str=fieldobj.value;
	if(str.length == 0) { return true; }

	var re_curr = /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/;
	if(re_curr.test(str)) { return true; }
	return returner(fieldobj,warning);
}
