// ************************************
// 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
//checkStartsWithAlphabetic
//checkLength 

// ************************************

// <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 checkStartsWithAlphabetic(str)
{
	
	str=str.replace(/^\s+|\s+$/g, ''); 
	if(str!='' && str.length>0){
	var test=/^[A-Za-z]/.test(str);
	if (test) { 
		return true;
	}
	else{
		
		return false;
	}
	}
	else
	{
	
	return true;
	}
}


function checkFileExtension(fileName,correctExtensions)
{
	
	
	actualFileExtension=fileName.substr(fileName.lastIndexOf('.') + 1);
	
	if(fileName!='' && fileName.length>0){
	fileExtensions = correctExtensions.split(",");
	
	for ( var i = 0; i < fileExtensions.length; i++) {
	if(actualFileExtension==fileExtensions[i])
	{
	return true;
	}
	}
	return false;
	}
	else
	{
	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;
	
	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) {
	//num=num.trim();
	num=num.replace(/^\s+|\s+$/g, ''); 
	if(num!='' && num.length>0)
	{
	var anum=/(^\d+$)|(^\d+\.\d+$)/
	if (anum.test(num)){
		return true;
	}
	else{
		return false;
	}
	}
	else
	{
	return true;
	}
}

function checkStartsWithAlphabetic(str)
{
	str=str.replace(/^\s+|\s+$/g, ''); 
	if(str!='' && str.length>0){
	var test=/^[A-Za-z]/.test(str);
	if (test) { 
		return true;
	}
	else{
		
		return false;
	}
	}
	else
	{
	
	return true;
	}
}

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 checkLength(value,length)
{
	value=value.replace(/^\s+|\s+$/g, '');
	if(value!='' && value.length>0)
	{
	if(value.length<length)
	{
		return false;
	}
	else
	{
	return true;
	}
	}
	else
	{
	return true;
	}
	
}

function checkEquals(num, compareNum) {
	if(num=='' || num.length==0)
		return true;
	num=num.replace(/^\s+|\s+$/g, '');
	compareNum=compareNum.replace(/^\s+|\s+$/g, '');
	if (num==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 = "";
	var errorMessageFieldId="";
	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 == "checkLength") {
								var maxValue = document
										.getElementById(myform.id).elements["val#"
										+ inputFields[i].name
										+ "#MaxLength"
										+ checkFunc].value;
								myfunc = checkFunc
										+ "('"
										+ inputFields[i].value
												.replace(/'/g, "") + "', '"
										+ maxValue + "')";
							}
							if (checkFunc == "checkFileExtension") {
								var correctFileExtensions = document
										.getElementById(myform.id).elements["val#"
										+ inputFields[i].name
										+ "#FileExtensions"
										+ checkFunc].value;
								myfunc = checkFunc
										+ "('"
										+ inputFields[i].value
												.replace(/'/g, "") + "', '"
										+ correctFileExtensions + "')";
							}
							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;
								
								errorMessageFieldId=errorMessageFieldId+"&"+inputFields[i].id;
							}
						}
					} 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(/'/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;
								errorMessageFieldId=errorMessageFieldId+"&"+inputFields[i].id;
							}
						}
					} 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;
								errorMessageFieldId=errorMessageFieldId+"&"+inputFields[i].id;
							} else {
								var myfunc = checkFunc
										+ "('"
										+ inputFields[i].options[inputFields[i].selectedIndex].value
										+ "')";
								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;
									errorMessageFieldId=errorMessageFieldId+"&"+inputFields[i].id;
								}
							}
						}
					} else {
						done = true;
					}
					if (startIdx >= endIdx - 5)
						done = true;
				} while (!done)
			}
		}
	}
	
	
	if (!valid) {
		displayError(myform, message,errorMessageFieldId);
		window.scrollTo(0,0);
		return false;
	}
	// if (document.getElementById(myform.id).formSingleClick.value == '1')
	// return false;
	else {
		/*
		 * alert('come'); if(document.getElementById('mysubmit')!=null) {
		 * alert('come'); document.getElementById('mysubmit').value='Saving';
		 * document.getElementById('mysubmit').disabled=true; myform.submit(); }
		 */
		return true;
	}

}

function displayError(myform, message,errorMessageFieldId) {
	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);
			var tokensForElementId=tokenize(errorMessageFieldId, "&", " ", true);
			for ( var i = 0; i < tokens.length; i++) {
				// To avoid same error message
				var sameMessage=true;
				for(var j=0;j<i;j++)
				{
					
					if(tokens[i]==tokens[j]){
					sameMessage=false;
					break;
					}
				}
				if(sameMessage)
				{
				msgSpan.innerHTML += "<a href=\"#\" class=\"portlet-msg-error\" onclick=\"document.getElementById('"+tokensForElementId[i]+"').focus();\">"+tokens[i]+"</a>";
				var newline = document.createElement('br');
				msgSpan.appendChild(newline);
				}
			}
			msgDiv.appendChild(msgSpan);
			form.insertBefore(msgDiv, form.childNodes[0]);
		}
	}
	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);
		var tokensForElementId=tokenize(errorMessageFieldId, "&", " ", true);
		for ( var i = 0; i < tokens.length; i++) {
			var sameMessage=true;
			for(var j=0;j<i;j++)
			{
				
				if(tokens[i]==tokens[j]){
				sameMessage=false;
				break;
				}
			}
			if(sameMessage)
			{
			msgSpan.innerHTML += "<a href=\"#\" class=\"portlet-msg-error\" onclick=\"document.getElementById('"+tokensForElementId[i]+"').focus();\">"+tokens[i]+"</a>";
			//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;
}

