﻿//common functions for field validation


/***** alert error messgae *****/

msgName = 'title';

function errMsg(msg){
	alert(msg);
}

function errMsgFocus(msg, param){
	alert(msg);
	getFocus(param);
}

function errMsgFocus2(msg, param){
	alert(msg);
	param.focus();
}

function formatMessage(msg, arr) {
	for (var i=0; i<arr.length; i++) {
		while(msg.indexOf('{'+i+'}')!=-1) {
			msg = msg.replace('{'+i+'}', arr[i]);
		}
	}
	return msg;
}

function formatName(t) {
	var o = document.getElementById(t);
	var wStr = (o.name) ? o.name : o.id;
	var displayName = o.getAttribute(msgName);
	//alert(displayName);
	wStr = (displayName) ? displayName : wStr;
	wStr = wStr.replace(/_/g,' ');
	//wStr = displayName;
	return wStr;
}

function getFocus(param){
	document.getElementById(param).focus();
}


/***** trim spaces at head and tail of input *****/
function trim(param){return param.replace(/^\s*/,'').replace(/\s*$/,'');}

/***** check blank or not *****/
function isBlank(param) {return (trim(document.getElementById(param).value).length==0);}

function isBlank2(param) {return (trim(param.value).length==0);}

function chkBlank(param){
	if(isBlank(param)) {
		return false;
	}
	return true;
}

function chkBlank2(param){
	if(isBlank2(param)) {
		return false;
	}
	return true;
}


/***** check leap year *****/
function chkLeapYear(x)
{
	if(x/400 == parseInt(x/400))
		return(true);
	else if(x/100 == parseInt(x/100))
		return(false);
	else if(x/4 == parseInt(x/4))
		return(true);
	else
		return(false);
}


/***** date comparison *****/

var DATE_FORMAT = 'yyyy-MM-dd';
var DATE_DELIMITER = '-';

function chkDate(fmobj, compare, specDate) {
	
	//var dispName = formatName(fmobj);
	//if (fv['bok'] && isBlank(fmobj)) return true;

	//var date1 = formatDateObj(fmobj.value);
	//var date1 = formatDateObj(trim(document.getElementById(fmobj).value));
	var date1 = fmobj;
	if (typeof date1 == 'undefined') return false; //addError(fmobj,formatMessage(ERR_DATE,[dispName]));

	compare = parseInt(compare, 10);
	if (compare >= 0 && compare <= 4) {
		//var dispName2;
		var date2;
		if(specDate == 'today'){
			date2 = new Date();
	    }else if (document.getElementById(specDate) != null) {
			//dispName2 = formatName(document.getElementById(specDate));
			date2 = formatDateObj(trim(document.getElementById(specDate).value));
		} else {
			//dispName2 = formatDateStr(date2);
			date2 = formatDateObj(specDate);
		}

		if (typeof date2 == 'undefined') return false; // error would be raise from the other object
		

		var timeDiff =  date1.getTime() - date2.getTime();
		switch (compare) {
			case 0 : // equal to
				if (timeDiff != 0) return false //addError(fmobj,formatMessage(ERR_DATE_0,[dispName,dispName2]));
				break;
			case 1 : // before
				if (timeDiff + 86400000 > 0) return false //addError(fmobj,formatMessage(ERR_DATE_1,[dispName,dispName2]));
				break;
			case 2 : // on or before
				if (timeDiff > 0) return false //addError(fmobj,formatMessage(ERR_DATE_2,[dispName,dispName2]));
				break;
			case 3 : // after
				if (timeDiff + 86400000 < 0) return false //addError(fmobj,formatMessage(ERR_DATE_3,[dispName,dispName2]));
				break;
			case 4 : // on or after
				if (timeDiff < 0) return false //addError(fmobj,formatMessage(ERR_DATE_4,[dispName,dispName2]));
				break;
		}
	}
	return true;

}

function formatDateObj(val) {
	if (typeof val == 'undefined' || val.length == 0) return;

	var dpos = DATE_FORMAT.indexOf('d');
	var dlen = DATE_FORMAT.lastIndexOf('d') - dpos + 1;
	var mpos = DATE_FORMAT.indexOf('M');
	var mlen = DATE_FORMAT.lastIndexOf('M') - mpos + 1;
	var ypos = DATE_FORMAT.indexOf('y');
	var ylen = DATE_FORMAT.lastIndexOf('y') - ypos + 1;
	
	var d = parseInt(val.substring(dpos, dpos + dlen), 10);
	var m = parseInt(val.substring(mpos, mpos + mlen), 10) - 1;
	var y = parseInt(val.substring(ypos, ypos + ylen), 10);

	var dd= new Date(y, m, d);
	if (d == dd.getDate() && m == dd.getMonth() && y == dd.getFullYear()) return dd;
}


/***** check date format *****/

function chkTheDate(fmobj) {
	
	var date1 = formatDateObj(trim(document.getElementById(fmobj).value));
	if (typeof date1 == 'undefined' || !isDateDelimiter(trim(document.getElementById(fmobj).value))) {
		return false; 
	}

	return true;

}

function isDateDelimiter(val){
	
	var delimiter1 = val.indexOf(DATE_DELIMITER);
	var delimiter2 = val.lastIndexOf(DATE_DELIMITER);
	
	if(delimiter1 <=0 || delimiter2 <= 0 || delimiter1 == delimiter2){
		return false;
	}
	
	return true;
	
}


/***** email *****/
function chkEmail(param) {
	var regexp = /^[\w][\w-_.]*[\w]@[\w][\w-_.]*[\w].+[\w]+[\w]$/;
	if (typeof document.getElementById(param).value == 'undefined') return false;
	if (!regexp.test(trim(document.getElementById(param).value))) return false; //addError(fmobj,formatMessage(ERR_EMAIL,[dispName]));
	return true;
}

/***** equal to *****/
function chkEqualTo(param, other) {
	var val = trim(document.getElementById(other).value);
	if (trim(document.getElementById(param).value) != val) return false; //addError(fmobj,formatMessage(ERR_EQUAL,[dispName,dispName2]));
	return true;
}

/***** integer *****/
function isNumeric(val) {
	var regex = /^[0-9]+$/;
	return regex.test(val);
}

function isInteger(val) {
	if (val.length>=2 && val.substr(0,1)=='0') return false;

	if (val.indexOf('+')==0) val = val.substr(1, val.length);
	else if (val.indexOf('-')==0) val = val.substr(1, val.length);

	var temp = val.split(',');
	for (var i=0; i<temp.length; i++) {
		if ((!isNumeric(temp[i]))
		 || (i==0 && temp.length>1 && temp[i].length>3)
		 || (i!=0 && temp[i].length!=3))
		return false;
	}
	return true;
}

function chkInteger(param, lb, ub) {
	//var dispName = formatName(fmobj);
	//if (fv['bok'] && isBlank(fmobj)) return true;

	if (!isInteger(trim(document.getElementById(param).value))) return false; //addError(fmobj,formatMessage(ERR_INT,[dispName]))

	lb = parseInt(lb, 10);
	ub = parseInt(ub, 10);
	
	if (!isNaN(lb) || !isNaN(ub)) {
		var msg;
		if (isNaN(ub)) {
			ub  = 15;
			//msg = formatMessage(ERR_INT_MIN,[dispName,lb]);
			msg = "error empty minimum: " + lb;
		} else if (isNaN(lb)) {
			lb  = 1;
			//msg = formatMessage(ERR_INT_MAX,[dispName,ub]);
			msg = "error higher than maximum: " + ub;
		} else if (lb == ub) {
			//msg = formatMessage(ERR_INT_EQU,[dispName,lb]);
			msg = "error minimum equal to maximum: " + lb + " " + ub;
		} else {
			//msg = formatMessage(ERR_INT_RNG,[dispName,lb,ub]);
			msg = "error out of range: " + lb + " " + ub;
		}

		var val = document.getElementById(param).value.replace('+','').replace('-','').replace(',','');
		if (val.length<lb || val.length>ub){
			//errMsg(msg);
			return false; //addError(fmobj,msg);
		}
	}
	return true;
}


/***** check integer with minimum value *****/

function chkIntegerMinVal(param, minVal, lb, ub) {
	//var dispName = formatName(fmobj);
	//if (fv['bok'] && isBlank(fmobj)) return true;
	
	if (!isInteger(trim(document.getElementById(param).value))) return false; //addError(fmobj,formatMessage(ERR_INT,[dispName]))

	lb = parseInt(lb, 10);
	ub = parseInt(ub, 10);
	
	if (!isNaN(lb) || !isNaN(ub)) {
		var msg;
		if (isNaN(ub)) {
			ub  = 15;
			//msg = formatMessage(ERR_INT_MIN,[dispName,lb]);
			msg = "error empty minimum: " + lb;
		} else if (isNaN(lb)) {
			lb  = 1;
			//msg = formatMessage(ERR_INT_MAX,[dispName,ub]);
			msg = "error higher than maximum: " + ub;
		} else if (lb == ub) {
			//msg = formatMessage(ERR_INT_EQU,[dispName,lb]);
			msg = "error minimum equal to maximum: " + lb + " " + ub;
		} else {
			//msg = formatMessage(ERR_INT_RNG,[dispName,lb,ub]);
			msg = "error out of range: " + lb + " " + ub;
		}

		var val = document.getElementById(param).value.replace('+','').replace('-','').replace(',','');
		if (val.length<lb || val.length>ub ){
			//errMsg(msg);
			return false; //addError(fmobj,msg);
		}
	}
	
	if((document.getElementById(param).value.replace('+','').replace(',','')) < minVal){
		return false;
	}
	
	return true;
}

function chkIntegerMinVal2(param, minVal, lb, ub) {
	//var dispName = formatName(fmobj);
	//if (fv['bok'] && isBlank(fmobj)) return true;
	
	if (!isInteger(trim(param.value))) return false; //addError(fmobj,formatMessage(ERR_INT,[dispName]))

	lb = parseInt(lb, 10);
	ub = parseInt(ub, 10);
	
	if (!isNaN(lb) || !isNaN(ub)) {
		var msg;
		if (isNaN(ub)) {
			ub  = 15;
			//msg = formatMessage(ERR_INT_MIN,[dispName,lb]);
			msg = "error empty minimum: " + lb;
		} else if (isNaN(lb)) {
			lb  = 1;
			//msg = formatMessage(ERR_INT_MAX,[dispName,ub]);
			msg = "error higher than maximum: " + ub;
		} else if (lb == ub) {
			//msg = formatMessage(ERR_INT_EQU,[dispName,lb]);
			msg = "error minimum equal to maximum: " + lb + " " + ub;
		} else {
			//msg = formatMessage(ERR_INT_RNG,[dispName,lb,ub]);
			msg = "error out of range: " + lb + " " + ub;
		}

		var val = param.value.replace('+','').replace('-','').replace(',','');
		if (val.length<lb || val.length>ub ){
			//errMsg(msg);
			return false; //addError(fmobj,msg);
		}
	}
	
	if((param.value.replace('+','').replace(',','')) < minVal){
		return false;
	}
	
	return true;
}

/***** check decimal number with format (optional) *****/

function chkDecimalF(param, lmin, lmax, rmin, rmax, bFmt) {
	//var dispName = formatName(fmobj);
	//if (fv['bok'] && isBlank(fmobj)) return true;

	lmin = parseInt(lmin,10); 
		if (isNaN(lmin) || lmin<1)  
			lmin = 1;
	lmax = parseInt(lmax,10); 
		if (isNaN(lmax) || lmax>15) 
			lmax = 15;
	rmin = parseInt(rmin,10); 
		if (isNaN(rmin) || rmin<1)  
			rmin = 0;
	rmax = parseInt(rmax,10); 
		if (isNaN(rmax) || rmax>7)  
			rmax = 7;

	var fval = document.getElementById(param).value;
	if (bFmt && fval.trim().length>0) {
		if (fval.substr(0, 1)=='.') 
		   	fval = '0' + fval;
		else if (fval.substr(0, 2)=='+.') 
			fval = '0' + fval.substr(1, fval.length);
		else if (fval.substr(0, 2)=='-.') 
			fval = '-0' + fval.substr(1, fval.length);
		else if (fval.indexOf('.')==-1) 
			fval = fval + '.';

		var len = rmin - fval.substr(fval.indexOf('.') + 1, fval.length).length;
		for (var i=1; i<=len; i++) 
			fval = fval + '0';

		if (fval.indexOf(',')!=-1) {
			while (fval.indexOf(',')!=-1) 
				fval = fval.replace(',','');
			var pos = fval.indexOf('.');
			while (pos > 3) {
				pos = pos - 3;
				fval = fval.substr(0,pos) + ',' + fval.substr(pos,fval.length-pos);
			}
		}

		if (fval.substr(fval.length - 1, 1) == '.') 
			fval = fval.substr(0, fval.length - 1);
	}

	var temp = fval + '.';
	var part1 = temp.substr(0,temp.indexOf('.'));
	var part2 = temp.substr(temp.indexOf('.')+1,temp.length-temp.indexOf('.')-2);
	if (!isInteger(part1) || !isNumeric(part2)) 
		return false;

	var val = fval.replace('+','').replace('-','');
	while (val.indexOf(',')!=-1) 
		val = val.replace(',','');
	var regex = new RegExp('^[0-9]{'+lmin+','+lmax+'}(\\.[0-9]{'+rmin+','+rmax+'})?$');
	if (!regex.test(val)) 
		return false;

	if (bFmt) 
		document.getElementById(param).value = fval;
		
	return true;
}


/***** check decimal number with minimum value and format (optional) *****/

function chkDecimalFMinVal(param, minVal, lmin, lmax, rmin, rmax, bFmt) {
	//var dispName = formatName(fmobj);
	//if (fv['bok'] && isBlank(fmobj)) return true;

	lmin = parseInt(lmin,10); 
		if (isNaN(lmin) || lmin<1)  
			lmin = 1;
	lmax = parseInt(lmax,10); 
		if (isNaN(lmax) || lmax>15) 
			lmax = 15;
	rmin = parseInt(rmin,10); 
		if (isNaN(rmin) || rmin<1)  
			rmin = 0;
	rmax = parseInt(rmax,10); 
		if (isNaN(rmax) || rmax>7)  
			rmax = 7;

	var fval = document.getElementById(param).value;
	if (bFmt && fval.trim().length>0) {
		if (fval.substr(0, 1)=='.') 
		   	fval = '0' + fval;
		else if (fval.substr(0, 2)=='+.') 
			fval = '0' + fval.substr(1, fval.length);
		else if (fval.substr(0, 2)=='-.') 
			fval = '-0' + fval.substr(1, fval.length);
		else if (fval.indexOf('.')==-1) 
			fval = fval + '.';

		var len = rmin - fval.substr(fval.indexOf('.') + 1, fval.length).length;
		for (var i=1; i<=len; i++) 
			fval = fval + '0';

		if (fval.indexOf(',')!=-1) {
			while (fval.indexOf(',')!=-1) 
				fval = fval.replace(',','');
			var pos = fval.indexOf('.');
			while (pos > 3) {
				pos = pos - 3;
				fval = fval.substr(0,pos) + ',' + fval.substr(pos,fval.length-pos);
			}
		}

		if (fval.substr(fval.length - 1, 1) == '.') 
			fval = fval.substr(0, fval.length - 1);
	}

	var temp = fval + '.';
	var part1 = temp.substr(0,temp.indexOf('.'));
	var part2 = temp.substr(temp.indexOf('.')+1,temp.length-temp.indexOf('.')-2);
	if (!isInteger(part1) || !isNumeric(part2)) 
		return false;

	var val = fval.replace('+','').replace('-','');
	while (val.indexOf(',')!=-1) 
		val = val.replace(',','');
	var regex = new RegExp('^[0-9]{'+lmin+','+lmax+'}(\\.[0-9]{'+rmin+','+rmax+'})?$');
	if (!regex.test(val)) 
		return false;

	if (bFmt) 
		document.getElementById(param).value = fval;
		
	if((document.getElementById(param).value.replace('+','').replace(',','')) < minVal){
		return false;
	}
		
	return true;
}

function chkDecimalFMinVal2(param, minVal, lmin, lmax, rmin, rmax, bFmt) {
	//var dispName = formatName(fmobj);
	//if (fv['bok'] && isBlank(fmobj)) return true;

	lmin = parseInt(lmin,10); 
		if (isNaN(lmin) || lmin<1)  
			lmin = 1;
	lmax = parseInt(lmax,10); 
		if (isNaN(lmax) || lmax>15) 
			lmax = 15;
	rmin = parseInt(rmin,10); 
		if (isNaN(rmin) || rmin<1)  
			rmin = 0;
	rmax = parseInt(rmax,10); 
		if (isNaN(rmax) || rmax>7)  
			rmax = 7;

	var fval = param.value;
	if (bFmt && fval.trim().length>0) {
		if (fval.substr(0, 1)=='.') 
		   	fval = '0' + fval;
		else if (fval.substr(0, 2)=='+.') 
			fval = '0' + fval.substr(1, fval.length);
		else if (fval.substr(0, 2)=='-.') 
			fval = '-0' + fval.substr(1, fval.length);
		else if (fval.indexOf('.')==-1) 
			fval = fval + '.';

		var len = rmin - fval.substr(fval.indexOf('.') + 1, fval.length).length;
		for (var i=1; i<=len; i++) 
			fval = fval + '0';

		if (fval.indexOf(',')!=-1) {
			while (fval.indexOf(',')!=-1) 
				fval = fval.replace(',','');
			var pos = fval.indexOf('.');
			while (pos > 3) {
				pos = pos - 3;
				fval = fval.substr(0,pos) + ',' + fval.substr(pos,fval.length-pos);
			}
		}

		if (fval.substr(fval.length - 1, 1) == '.') 
			fval = fval.substr(0, fval.length - 1);
	}

	var temp = fval + '.';
	var part1 = temp.substr(0,temp.indexOf('.'));
	var part2 = temp.substr(temp.indexOf('.')+1,temp.length-temp.indexOf('.')-2);
	if (!isInteger(part1) || !isNumeric(part2)) 
		return false;

	var val = fval.replace('+','').replace('-','');
	while (val.indexOf(',')!=-1) 
		val = val.replace(',','');
	var regex = new RegExp('^[0-9]{'+lmin+','+lmax+'}(\\.[0-9]{'+rmin+','+rmax+'})?$');
	if (!regex.test(val)) 
		return false;

	if (bFmt) 
		param.value = fval;
		
	if((param.value.replace('+','').replace(',','')) < minVal){
		return false;
	}
		
	return true;
}


/***** alpha or number ******/


function setArg( arg, def )
{
	return ( typeof arg == 'undefined' || arg == '' || arg == null ) ? def : arg;
}


function alnum( param, minLen, tCase, numbers, spaces, puncs )
{
	//if ( this.typeMismatch( 'text' ) ) return;

	tCase = this.setArg( tCase, "a" );
	
	//alert( [minLen,tCase,numbers,spaces,puncs] );

	numbers = ( numbers == "true" || numbers == "1" );
	spaces = ( spaces == "true" || spaces == "1" );

	//alert( [minLen,tCase,numbers,spaces,puncs] );
		
	var okChars = "",
		arrE	= ['None','Any','No','No','Any'];

	if ( minLen != '*' )
	{
		minLen =  parseInt( minLen, 10 );
		arrE[0] = minLen;
	} else {
		minLen = 0;
	}

	switch( tCase.toUpperCase() )
	{
		case 'U':
			okChars += 'A-Z';
			arrE[1] =  'UPPER';
			break;
		case 'L':
			okChars += 'a-z';
			arrE[1] =  'lower';
			break;
		case 'C':
			okChars += 'A-Z][a-z';
			arrE[1] =  'Intial capital';
			minLen--;
			break;
		default:
			okChars += 'a-zA-Z';
			break;		
	}

	if ( numbers == true )
	{
		okChars += '0-9';
		arrE[2] =  'Yes';
	}
	if ( spaces == true )
	{
		okChars += ' ';
		arrE[3] =  'Yes';
	}
	if ( puncs == "any" )
	{
		arrE[4]  = "Any";
	}
	else if ( puncs == "none" )
	{
		arrE[4] = "None";
	}
	else 
	{
		puncs = puncs.replace( /pipe/g, "|" );
		okChars += puncs;
		arrE[4] =  puncs; //.toPattern().replace( /\\/g, "" );
	}
	var length = ( minLen != "*" )?
		"{" + minLen + ",}":
		"+";
	var regex = ( puncs == "any" ) ?
		new RegExp( "^([" + okChars + "]|[^a-zA-Z0-9\\s])" + length + "$" ):
		new RegExp( "^[" + okChars + "]" + length + "$" );
	
	if ( !(regex.test(document.getElementById(param).value)) )
	{
		//this.throwError( [this.elem.value, this.elem.fName, arrE[0], arrE[1], arrE[2], arrE[3], arrE[4]] );
		//errMsg("error " + document.getElementById(param).name);
		return false;
	}
	
	return true;
}