// ************************************
// A variety of validation routines
//
//  All routines return true or false
//
// checkDate -- checks if valid date
// checkDigit -- checks if character provided is a single digit
// checkNotEmpty  -- checks if empty
// checkEmail -- check if valid email
// checkNumber -- check if number
// checkNumberLessThan -- check if number is less than a provided number
// checkNumberGreaterThan -- check if number is greater than a provided number
// checkPhone -- checks if a 10 digit phone number
// checkCreditCardNumber -- checks if valid card number using Luhn's formula
// checkCreditCardType -- checks if the credit card type is valid based on the credit card number
//                         Master Card, Visa, American Express
// ************************************

// <ui:validator type="checkEquals" value="javascript:document.getElementById('netPay')" key="BANK_IN_DATE_BLANK"/>

/*
    Checks if the string is a valid date formatted as...
    mm dd yyyy, mm/dd/yyyy, mm.dd.yyyy, mm-dd-yyyy

    http://codylindley.com/blogstuff/js/validation/
*/



function checkDate(str){	
	var re = /^\d{2}\/\d{2}\/\d{4}$/
	if (!re.test(str)) return false;
	var d=str.split("/")[0]
	var m=str.split("/")[1]
	var y=str.split("/")[2]
	var dayobj = new Date(y, m-1, d)
	if ((dayobj.getMonth()+1!=m)||(dayobj.getDate()!=d)||(dayobj.getFullYear()!=y)) return false;
	return true;
}

function checkIPAddress(IPvalue){
	var errorString = "";
	var ipPattern = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
	var ipArray = IPvalue.match(ipPattern);
	if (IPvalue == "0.0.0.0") return false;
	if (IPvalue == "255.255.255.255") return false;
	if (ipArray == null) {
		return false;
	} else {
		for (ipArrayElement = 1; ipArrayElement <= 4; ipArrayElement++) {
			thisSegment = ipArray[ipArrayElement];
			if (thisSegment > 255) return false;				
		}
	}
	return true;
}

function checkDomainName(domainName){
	var arr = new Array(
			'.com','.net','.org','.biz','.coop','.info','.museum','.name','.pro','.edu','.gov','.int','.mil','.ac','.ad','.ae','.af','.ag',
			'.ai','.al','.am','.an','.ao','.aq','.ar','.as','.at','.au','.aw','.az','.ba','.bb','.bd','.be','.bf','.bg','.bh','.bi','.bj','.bm',
			'.bn','.bo','.br','.bs','.bt','.bv','.bw','.by','.bz','.ca','.cc','.cd','.cf','.cg','.ch','.ci','.ck','.cl','.cm','.cn','.co','.cr',
			'.cu','.cv','.cx','.cy','.cz','.de','.dj','.dk','.dm','.do','.dz','.ec','.ee','.eg','.eh','.er','.es','.et','.fi','.fj','.fk','.fm',
			'.fo','.fr','.ga','.gd','.ge','.gf','.gg','.gh','.gi','.gl','.gm','.gn','.gp','.gq','.gr','.gs','.gt','.gu','.gv','.gy','.hk','.hm',
			'.hn','.hr','.ht','.hu','.id','.ie','.il','.im','.in','.io','.iq','.ir','.is','.it','.je','.jm','.jo','.jp','.ke','.kg','.kh','.ki',
			'.km','.kn','.kp','.kr','.kw','.ky','.kz','.la','.lb','.lc','.li','.lk','.lr','.ls','.lt','.lu','.lv','.ly','.ma','.mc','.md','.mg',
			'.mh','.mk','.ml','.mm','.mn','.mo','.mp','.mq','.mr','.ms','.mt','.mu','.mv','.mw','.mx','.my','.mz','.na','.nc','.ne','.nf','.ng',
			'.ni','.nl','.no','.np','.nr','.nu','.nz','.om','.pa','.pe','.pf','.pg','.ph','.pk','.pl','.pm','.pn','.pr','.ps','.pt','.pw','.py',
			'.qa','.re','.ro','.rw','.ru','.sa','.sb','.sc','.sd','.se','.sg','.sh','.si','.sj','.sk','.sl','.sm','.sn','.so','.sr','.st','.sv',
			'.sy','.sz','.tc','.td','.tf','.tg','.th','.tj','.tk','.tm','.tn','.to','.tp','.tr','.tt','.tv','.tw','.tz','.ua','.ug','.uk','.um',
			'.us','.uy','.uz','.va','.vc','.ve','.vg','.vi','.vn','.vu','.ws','.wf','.ye','.yt','.yu','.za','.zm','.zw');
	var mai = domainName;
	var val = true;
	var dot = mai.lastIndexOf(".");
	var dname = mai.substring(0,dot);
	var ext = mai.substring(dot,mai.length);
		
	if(dot>2 && dot<57) {
		for(var i=0; i<arr.length; i++) {
			if(ext == arr[i]) {
				val = true;
				break;
			} else {
				val = false;
			}
		}
		if(val == false) return false;
		for(var j=0; j<dname.length; j++) {
			var dh = dname.charAt(j);
			var hh = dh.charCodeAt(0);
			if((hh > 47 && hh<59) || (hh > 64 && hh<91) || (hh > 96 && hh<123) || hh==45 || hh==46) {
				if((j==0 || j==dname.length-1) && hh == 45) return false;
			} else {
				return false;
			}
		}
	} else {
		return false;
	}	
	return true;
}

function checkInternationalPhone(strPhone) {
	var bracket = 3;
	if ((strPhone==null)||(strPhone=="")) return true;
	var tokens = tokenize(strPhone, ".", " ", true);
	if (tokens.length != 2) return false;
	if (tokens[0] != '+060') return false;
	if (!checkNumber(tokens[1])) return false;
	alert ('Correct Number');
	return true;
}

function checkTime(str) {
	var hasMeridian = false;
	// var re = /^\d{1,2}[:]\d{2}([:]\d{2})?( [aApP][mM]?)?$/;
	var re = /^\d{1,2}[:]\d{2}[ ][aApP][mM]$/;
	if (!re.test(str)) { return false; }
	if (str.toLowerCase().indexOf("p") != -1) { hasMeridian = true; }
	if (str.toLowerCase().indexOf("a") != -1) { hasMeridian = true; }	
	var values = str.split(":");
	if ( (parseFloat(values[0]) < 0) || (parseFloat(values[0]) > 23) ) { return false; }
	if (hasMeridian) {
		if ( (parseFloat(values[0]) < 1) || (parseFloat(values[0]) > 12) ) { return false; }
	}
	if ( (parseFloat(values[1]) < 0) || (parseFloat(values[1]) > 59) ) { return false; }
	if (values.length > 2) {
		if ( (parseFloat(values[2]) < 0) || (parseFloat(values[2]) > 59) ) { return false; }
	}
	return true;
}
   
/*
 Check if character supplied is a digit
*/
function checkDigit(c) {
    if (c.length != 1) return false;
    var strAllowed = "1234567890";
    return (strAllowed.indexOf (c) != -1);
}

/*
 Check for empty string, return true if empty, false otherwise
*/
function checkNotEmpty(strng) {
    return (strng != "");
}

/*
 Email checking-- comes from Apple's example validation code
 http://developer.apple.com/internet/webcontent/examples/validate_source.html
*/
function checkEmail(strng) {
    if (strng == "") {
        return false;
    }
    // test email for an @ followed by characters and a .
    var emailFilter=/^.+@.+\..{2,3}$/;
    if (!(emailFilter.test(strng))) {
        return false;
    }
    else {
        //test email for illegal characters
        var illegalChars= /[\(\)\<\>\,\;\:\\\"\[\]]/
        if (strng.match(illegalChars)) {
            return false;
        }
    }
    return true;
}

/*
 Check if this is a number
 */
function checkNumber(num) {
    return (!(isNaN(parseFloat(num))));
}

function checkNumberGreaterThan(num, compareNum) {
    if (!checkNumber(num)) return false;
    return (num > parseFloat(compareNum));
}

function checkNumberLessThan(num, compareNum) {
    if (!checkNumber(num)) return false;
    return (num < parseFloat(compareNum));
}

function checkEquals(num, compareNum) {
    if (!checkNumber(num)) return false;
    if (parseFloat(num) == parseFloat(compareNum)) return true;
    return false;
}

/*
 phone number - strip out delimiters and check for 10 digits -- also from Apple
*/
function checkPhone(strng) {
    if (strng == "") {
        return false;
    }
    // check that phone number doesn't contain illegal chars
    var stripped = strng.replace(/[\(\)\.\-\ ]/g, ''); //strip out acceptable non-numeric characters
    if (isNaN(parseInt(stripped))) {
        return false;
    }
    // check length of phone number
    if (!(stripped.length == 10)) {
        return false;
    }
    return true;
}

/*
 Check if this credit card number is valid
*/
function checkCreditCardNumber (strNum) {
    var nCheck = 0;
    var bEven = false;

    for (n = strNum.length - 1; n >= 0; n--) {
        var cDigit = strNum.charAt (n);
        if (isDigit (cDigit)) {
            var nDigit = parseInt(cDigit, 10);
            if (bEven) {
                if ((nDigit *= 2) > 9)
                    nDigit -= 9;
            }
            nCheck += nDigit;
            bEven = ! bEven;
        } else if (cDigit != ' ' && cDigit != '.' && cDigit != '-') {
            return false;
        }
    }
    return (nCheck % 10) == 0;
}

/*
 Check if this credit card type is valid
*/
function checkCreditCardType(strNum, type) {
    var nLen = 0;
    for (n = 0; n < strNum.length; n++) {
        if (isDigit (strNum.substring (n,n+1)))
            ++nLen;
    }
    if (type == 'Visa')
        return ((strNum.substring(0,1) == '4') && (nLen == 13 || nLen == 16));
    else if (type == 'Amex')
        return ((strNum.substring(0,2) == '34' || strNum.substring(0,2) == '37') && (nLen == 15));
    else if (type == 'Master Card')
        return ((strNum.substring(0,2) == '51' || strNum.substring(0,2) == '52'
                || strNum.substring(0,2) == '53' || strNum.substring(0,2) == '54'
                || strNum.substring(0,2) == '55') && (nLen == 16));
    else
        return false;
}

function validate( myform ) {
    if (document.getElementById(myform.id).formValidationRequired.value == 'false') return true;
    var inputFields = document.getElementById(myform.id).elements;
    var valid = true;
    var checkFunc = "";
    var message = "";
    for (i = 0; i < inputFields.length; i++) {
    	if (inputFields[i].disabled == false) {
	        if (inputFields[i].tagName == "INPUT") {
		        var checkFuncStr = inputFields[i].className;
		        var startIdx = 0;
		        var endIdx = checkFuncStr.length;
		        var done = false;
		        do {
		            startIdx = checkFuncStr.indexOf('check', startIdx);
		            if (startIdx >= 0) {
		                var lastIdx = checkFuncStr.indexOf('#', startIdx);
		                if (lastIdx > 0) {
		                    checkFunc = checkFuncStr.substring(startIdx, lastIdx);
		                    startIdx = lastIdx;
		                    var myfunc = checkFunc + "('" + inputFields[i].value.replace(/'/g, "") + "')";
		                    if (checkFunc == "checkNumberGreaterThan") {
		                    	var minValue = 
		                    		document.getElementById(myform.id).elements["val#" + inputFields[i].name + "#MinValue" + checkFunc].value;
		                    	myfunc = checkFunc + "('" + inputFields[i].value.replace(/'/g, "") + "', '" + minValue + "')";
		                    }
		                    if (checkFunc == "checkNumberLessThan") {
		                    	var maxValue = 
		                    		document.getElementById(myform.id).elements["val#" + inputFields[i].name + "#MaxValue" + checkFunc].value;
		                    	myfunc = checkFunc + "('" + inputFields[i].value.replace(/'/g, "") + "', '" + maxValue + "')";
		                    }
		                    if (checkFunc == "checkEquals") {
		                    	var equalValue = 
		                    		document.getElementById(myform.id).elements["val#" + inputFields[i].name + "#EqualValue" + checkFunc].value;
		        				var tokens = tokenize(equalValue, ":", " ", true);
		        				if (tokens.length = 2) {
		        					equalValue = document.getElementById(myform.id).elements[tokens[1]].value;
		        				}
		                    	myfunc = checkFunc + "('" + inputFields[i].value.replace(/'/g, "") + "', '" + equalValue + "')";
		                    }
		                    var inputvalid = eval(myfunc);
		                    if (!inputvalid) {
		                        var validateName = "val#" + inputFields[i].name + "#" + checkFunc;
		                    	var hiddenField = document.getElementById(myform.id).elements[validateName];
		                    	valid = false;
		                    	message = message + "&" + hiddenField.value;
		                    }
		                }
		            } else {
		                done = true;
		            }
		            if (startIdx >= endIdx - 5) done = true;
		        } while (!done)
	        }
	        if (inputFields[i].tagName == "TEXTAREA") {
		        var checkFuncStr = inputFields[i].className;
		        var startIdx = 0;
		        var endIdx = checkFuncStr.length;
		        var done = false;
		        var inputvalid = true;
		        do {
		            startIdx = checkFuncStr.indexOf('check', startIdx);   
		            if (startIdx >= 0) {
		                var lastIdx = checkFuncStr.indexOf('#', startIdx);
		                if (lastIdx > 0) {
		                    checkFunc = checkFuncStr.substring(startIdx, lastIdx);
		                    startIdx = lastIdx;
		                    var myfunc = "";
		                    var inputvalid = "";
		                   if(typeof tinyMCE =='function') {
		                    	myfunc = checkFunc + "('" + tinyMCE.get(inputFields[i].id).getContent().replace(/(<([^>]+)>)/ig,"").replace(/'/g, "") + "')";
		                    	inputvalid = eval(myfunc);
		                    }
		                   else {
		                    	myfunc = checkFunc + "('" + inputFields[i].value.replace(/\s/g, "") + "')"; 
		                    	inputvalid = eval(myfunc);
		                    } 
		                    if (!inputvalid) {
		                        var validateName = "val#" + inputFields[i].name + "#" + checkFunc;
		                        var hiddenField = document.getElementById(myform.id).elements[validateName];
		                        valid = false;
		                        message = message + "&" + hiddenField.value;
		                    }	                    
		                }
		            } else {
		                done = true;
		            }
		            if (startIdx >= endIdx - 5) done = true;
		        } while (!done)
	        }
	        if (inputFields[i].tagName == "SELECT") {
		        var checkFuncStr = inputFields[i].className;
		        var startIdx = 0;
		        var endIdx = checkFuncStr.length;
		        var done = false;
		        do {
		            startIdx = checkFuncStr.indexOf('check', startIdx);   
		            if (startIdx >= 0) {
		                var lastIdx = checkFuncStr.indexOf('#', startIdx);
		                if (lastIdx > 0) {
		                    checkFunc = checkFuncStr.substring(startIdx, lastIdx);
		                    startIdx = lastIdx;
		                    if (inputFields[i].selectedIndex == -1) {
		                        var validateName = "val#" + inputFields[i].name + "#" + checkFunc;
		                        var hiddenField = document.getElementById(myform.id).elements[validateName];
		                        valid = false;
		                        message = message + "&" + hiddenField.value;
		                    } else {
			                    var myfunc = checkFunc + "('" + inputFields[i].options[inputFields[i].selectedIndex].text + "')";
			                    var inputvalid = eval(myfunc);	                    
			                    if (!inputvalid) {
			                        var validateName = "val#" + inputFields[i].name + "#" + checkFunc;
			                        var hiddenField = document.getElementById(myform.id).elements[validateName];
			                        valid = false;
			                        message = message + "&" + hiddenField.value;
			                    }
		                    }
		                }
		            } else {
		                done = true;
		            }
		            if (startIdx >= endIdx - 5) done = true;
		        } while (!done)
	        }
    	}
    }
    displayError( myform, message);
    if (!valid) return false;
    if (document.getElementById(myform.id).formSingleClick.value == '1') return false;
    return true;
}

function displayError( myform, message) {	
    var msgDiv = null;
    var form = document.getElementById(myform.id);
    var divs = form.getElementsByTagName("div");
    for (i = 0; i < divs.length; i++) {
        var errorDiv = divs[i].className;
        if (errorDiv == "ui-messagebox-portlet-msg-error") {
            msgDiv = divs[i];
            msgDiv.removeChild(msgDiv.childNodes[0]);
			var msgSpan = document.createElement("span");
			msgSpan.className = "portlet-msg-error";
			var tokens = tokenize(message, "&", " ", true);
			for(var i=0; i<tokens.length; i++) {
				var txt = document.createTextNode(tokens[i]);
				msgSpan.appendChild(txt);
				var newline = document.createElement('br');
				msgSpan.appendChild(newline);
			}			
			msgDiv.appendChild(msgSpan);            
        }
    }
    if (!msgDiv) {
        msgDiv = document.createElement("div");
        msgDiv.className = "ui-messagebox-portlet-msg-error";
        var msgSpan = document.createElement("span");
        msgSpan.className = "portlet-msg-error";
		var tokens = tokenize(message, "&", " ", true);
		for(var i=0; i<tokens.length; i++) {
			var txt = document.createTextNode(tokens[i]);
			msgSpan.appendChild(txt);
			var newline = document.createElement('br');
			msgSpan.appendChild(newline);
		}			
        msgDiv.appendChild(msgSpan);
        form.insertBefore(msgDiv, form.childNodes[0]);
    } 
}

function tokenize(input, separator, trim, ignoreEmptyTokens)
{
	var array = input.split(separator);
	if(trim)
		for(var i=0; i<array.length; i++) {
			while(array[i].slice(0, trim.length) == trim)
				array[i] = array[i].slice(trim.length);
			while(array[i].slice(array[i].length-trim.length) == trim)
				array[i] = array[i].slice(0, array[i].length-trim.length);
		}
	var token = new Array();
	if(ignoreEmptyTokens) {
		for(var i=0; i<array.length; i++)
			if(array[i] != "")
				token.push(array[i]);
	} else {
		token = array;
	}
	return token;
}

