// strError must be predefined prior of calling this function
function validateData(strValidateStr,objValue) 
{
	if (objValue.disabled) {
		return true;
	}
	var epos = strValidateStr.search("=");
	var command  = "";
	var cmdvalue = "";
	if(epos >= 0) {
		command = strValidateStr.substring(0,epos);
		cmdvalue = strValidateStr.substr(epos+1);
	} else {
		command = strValidateStr; 
	}
	switch(command) {
		case "req":
		case "required":
			{
				if(eval(objValue.value.length) == 0) {
//					if(!strError || strError.length ==0) {
						strError += "\n"+ objValue.name + " : Required Field";
						fieldError += "\nRequired Field";
//					}//if 
//					if (!suppressError) alert(strError);
					return false;
				}//if
			break;
			}//case required
		case "maxlength":
		case "maxlen":
			{
				if(eval(objValue.value.length) > eval(cmdvalue)) {
					strError += "\n"+ objValue.name + " : "+cmdvalue+" characters maximum ";
//					if (!suppressError) alert(strError + "\n[Current length = " + objValue.value.length + " ]");
					strError += "\n[Current length = " + objValue.value.length + " ]";
					fieldError += "\n"+ cmdvalue+" characters maximum";
					return false;
				}//if
			break;
			}//case maxlen
		case "minlength":
		case "minlen":
			{
				if(eval(objValue.value.length) <  eval(cmdvalue)) {
					strError += "\n"+ objValue.name + " : " + cmdvalue + " characters minimum  ";
//					if (!suppressError) alert(strError + "\n[Current length = " + objValue.value.length + " ]");
					strError += "\n[Current length = " + objValue.value.length + " ]";
					fieldError += "\n"+cmdvalue + " characters minimum";
					return false;
				}//if
				break;
			}//case minlen
		case "alnum":
		case "alphanumeric":
			{
				var charpos = objValue.value.search("[^A-Za-z0-9]");
				if(objValue.value.length > 0 &&  charpos >= 0) {
					strError += "\n"+ objValue.name+": Only alpha-numeric characters allowed ";
//					if (!suppressError) alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
					strError += "\n [Error character position " + eval(charpos+1)+"]";
					fieldError += "\nOnly alpha-numeric characters allowed";
					return false;
				}//if
				break;
			}//case alphanumeric
		case "num":
		case "numeric":
			{
				var charpos = objValue.value.search("[^0-9]");
				if(objValue.value.length > 0 &&  charpos >= 0) {
					strError += "\n"+ objValue.name+": Only digits allowed ";
//					if (!suppressError) alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
					strError += "\n [Error character position " + eval(charpos+1)+"]";
					fieldError += "\nOnly digits allowed";
					return false;
				}//if
				break;
			}//case numeric
		case "alphabetic":
		case "alpha":
			{
				var charpos = objValue.value.search("[^A-Za-z]");
				if(objValue.value.length > 0 &&  charpos >= 0) {
					strError += "\n"+ objValue.name+": Only alphabetic characters allowed ";
//					if (!suppressError) alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
					strError += "\n [Error character position " + eval(charpos+1)+"]";
					fieldError += "\nOnly alphabetic characters allowed";
					return false;
				}//if
				break;
			}// case alpha
		case "alnumhyphen":
			{
				var charpos = objValue.value.search("[^A-Za-z0-9\-_]");
				if(objValue.value.length > 0 &&  charpos >= 0) {
					strError += "\n"+ objValue.name+": characters allowed are A-Z,a-z,0-9,- and _";
//					if (!suppressError) alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
					strError += "\n [Error character position " + eval(charpos+1)+"]";
					fieldError += "\nCharacters allowed are A-Z,a-z,0-9,- and _";
					return false;
				}//if
				break;
			}// case alnumhyphen
		case "email":
			{
				if(!validateEmailv2(objValue.value)) {
					strError += "\n"+ objValue.name+": Enter a valid Email address ";
//					if (!suppressError) alert(strError);
					fieldError += "\nEnter a valid Email address";
					return false;
				}//if
				break;
			}//case email
		case "lt":
		case "lessthan":
			{
				if(isNaN(objValue.value)) {
//					if (!suppressError) alert(objValue.name+": Should be a number ");
					strError += "\n"+ objValue.name+": Should be a number ";
					fieldError += "\nShould be a number";
					return false;
				}//if
				if(eval(objValue.value) >=  eval(cmdvalue)) {
					strError += objValue.name + " : value should be less than "+ cmdvalue;
//					if (!suppressError) alert(strError);
					fieldError += "\nValue should be less than "+ cmdvalue;
					return false;
				}//if
				break;
			}//case lessthan
		case "gt":
		case "greaterthan":
			{
				if(isNaN(objValue.value)) {
//					if (!suppressError) alert(objValue.name+": Should be a number ");
					strError += "\n"+ objValue.name+": Should be a number ";
					fieldError += "\nShould be a number";
					return false;
				}//if
				if(eval(objValue.value) <=  eval(cmdvalue)) {
					strError += "\n"+ objValue.name + " : value should be greater than "+ cmdvalue;
//					if (!suppressError) alert(strError);
					fieldError += "\nValue should be greater than "+ cmdvalue;
					return false;
				}//if
				break;
			}//case greaterthan
		case "regexp":
			{
				if(objValue.value.length > 0) {
					if(!objValue.value.match(cmdvalue)) {
						strError += "\n"+ objValue.name+": Invalid characters found ";
//						if (!suppressError) alert(strError);
						fieldError += "\nInvalid characters found";
						return false;
					}//if
				}
				break;
			}//case regexp
		case "dontselect":
			{
				if(objValue.selectedIndex == null) {
					alert("BUG: dontselect command for non-select Item");
					return false;
				}
				if(objValue.selectedIndex == eval(cmdvalue)) {
					strError += "\n"+ objValue.name+": Please Select one option ";
//					if (!suppressError) alert(strError);
					fieldError += "\nPlease Select one option";
					return false;
				}
				break;
			}//case dontselect
		case "postcode":
			{
				if(eval(objValue.value.length) == 0) {
					return true;	
				}
				var pc = checkPostCode(objValue.value);
				if(!pc) {
					strError += "\n"+ objValue.name+": Enter a valid Post Code ";
//					if (!suppressError) alert(strError);
					fieldError += "\nEnter a valid Post Code";
					return false;
				}//if
				objValue.value = pc;
				break;
			}//case postcode
	}//switch
return true;
}

function validateEmailv2(email)
{
// a very simple email validation checking. 
// you can add more complex email checking if it helps 
	if(email.length <= 0) {
		return true;
	}
	var splitted = email.match("^(.+)@(.+)$");
	if(splitted == null) return false;
	if(splitted[1] != null ) {
		var regexp_user=/^\"?[\w-_\.]*\"?$/;
		if(splitted[1].match(regexp_user) == null) return false;
	}
	if(splitted[2] != null) {
		var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
		if(splitted[2].match(regexp_domain) == null) {
			var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
			if(splitted[2].match(regexp_ip) == null) return false;
		}// if
		return true;
	}
	return false;
}

function checkPostCode (toCheck) {

  // Permitted letters depend upon their position in the postcode.
  var alpha1 = "[abcdefghijklmnoprstuwyz]";                       // Character 1
  var alpha2 = "[abcdefghklmnopqrstuvwxy]";                       // Character 2
  var alpha3 = "[abcdefghjkstuw]";                                // Character 3
  var alpha4 = "[abehmnprvwxy]";                                  // Character 4
  var alpha5 = "[abdefghjlnpqrstuwxyz]";                          // Character 5
  

  // Array holds the regular expressions for the valid postcodes
  var pcexp = new Array ();

  // Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
  
  // Expression for postcodes: ANA NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

  // Expression for postcodes: AANA  NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1}" + alpha4 +"{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
  
  // Exception for the special postcode GIR 0AA
  pcexp.push (/^(GIR)(\s*)(0AA)$/i);
  
  // Standard BFPO numbers
  pcexp.push (/^(bfpo)(\s*)([0-9]{1,4})$/i);
  
  // c/o BFPO numbers
  pcexp.push (/^(bfpo)(\s*)(c\/o\s*[0-9]{1,3})$/i);

  // Load up the string to check
  var postCode = toCheck;

  // Assume we're not going to find a valid postcode
  var valid = false;
  
  // Check the string against the types of post codes
  for ( var i=0; i<pcexp.length; i++) {
    if (pcexp[i].test(postCode)) {
    
      // The post code is valid - split the post code into component parts
      pcexp[i].exec(postCode);
      
      // Copy it back into the original string, converting it to uppercase and
      // inserting a space between the inward and outward codes
      postCode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();
      
      // If it is a BFPO c/o type postcode, tidy up the "c/o" part
      postCode = postCode.replace (/C\/O\s*/,"c/o ");
      
      // Load new postcode back into the form element
      valid = true;
      
      // Remember that we have found that the code is valid and break from loop
      break;
    }
  }
  
  // Return with either the reformatted valid postcode or the original invalid 
  // postcode
  if (valid) {return postCode;} else return false;
}

var strError = '';
var fieldError = '';
function checkForm(formObj) {
	strError = '';
	var hasError = false;
	for (key in vArr) {
		formObj[key].style.backgroundColor = '';
//		formObj[key].style.border = '';
		var validations = vArr[key].split('#');
		fieldError = '';
		for (var i=1; i<validations.length; i++) {
			valPass = validateData(validations[i],formObj[key]);
			if (!valPass) {
				formObj[key].style.backgroundColor = '#FC7777';
				formObj[key].errtext = fieldError;
				formObj[key].onmousemove = showError;
				formObj[key].onmouseout = hideError;
//				formObj[key].style.border = '1px solid red';
			}
			hasError = hasError || (!valPass);
		}
	}
	suppressError = true;
	if (!suppressError && (strError != '')) {
		var eh = document.getElementById('errorHolder');
		var re = /\n/ig;
		eh.innerHTML = strError.replace(re,'<br>');
		eh.style.display='';
		eh.scrollIntoView(true);
	}
	return !hasError;
}

function colorReq(formName) {
	formObj = document[formName];
	for (key in vArr) {
		if (formObj[key].style != undefined) {
			formObj[key].style.backgroundColor = '';
		}
		var validations = vArr[key].split('#');
		for (var i=1; i<validations.length; i++) {
			if ((validations[i] == 'req') || (validations[i] == 'required')) {
				formObj[key].style.backgroundColor = '#FCF0C2';
			}
		}
	}	
}

function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

function findPos(obj) {
  // Credit for this function: http://www.quirksmode.org/js/findpos.html
  // Visit the URL for a complete tutorial on this function
  var curleft = curtop = parent_offSetLeft = parent_offSetTop = 0;
  if (obj.offsetParent) {
     curleft = obj.offsetLeft
     curtop = obj.offsetTop
     curwidth = obj.offsetWidth;
     while (obj = obj.offsetParent) {
        curleft += obj.offsetLeft
        curtop += obj.offsetTop
        if(obj.id) {
           parent_offSetLeft = obj.offsetLeft;
           parent_offSetTop = obj.offsetTop;
         }
     }
  }
  return [curleft,curtop,curwidth,parent_offSetLeft,parent_offSetTop];
}

function showError(e) {
	var ev;
	var tg;
	if (e == undefined) {
		ev = event;
		tg = event.srcElement;
	} else {
		ev = e;
		tg = e.target;
	}
	var eh = document.getElementById('errorBaloon');
//	var sxy = getScrollXY();
//	var x = ev.clientX+15+sxy[0];
//	var y = ev.clientY+15+sxy[1];
	var sxy = findPos(tg);
	var x = sxy[0]+sxy[2]+5;
	var y = sxy[1];
	eh.style.display = '';
	eh.style.border = '2px solid red';
	eh.style.padding = '4px 4px 4px 4px';
	eh.style.backgroundColor = 'white';
	eh.style.left = x+'px';
	eh.style.top = y+'px';
	var re = /\n/ig;
	var t = this.errtext;
	t = t.replace(re,'<br>');
	re = /^(<br>){1}/ig;
	t = t.replace(re,'');
	eh.innerHTML = t;
}

function hideError(e) {
	var eh = document.getElementById('errorBaloon');
	eh.style.display = 'none';		
}
