// -----------------------------------------------------------------------------
// Generic Form Validation
//
// Copyright (C) 2004 Leonard Louwe Kooijmans (Blue Skies)
// Distributed under the terms of the GNU Library General Public License
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// Initializing script  - setting global variables
// -----------------------------------------------------------------------------
var checkObjects		= new Array(); 	// Array containing the objects to validate.
var errors				= ""; 			// Variable holding the error message.
var returnVal			= false; 		// General return value. The validated form will only be submitted if true.
//var returnVal2			= false; 		// General return value. The validated form will only be submitted if true.
var language			= new Array(); 	// Language independent error messages!
var selectecLanguage	= "dutch";	// Choose between "english", "danish", "dutch", "french", "spanish", "russian", "portuguese"
language.english		= new Array();
language.dutch			= new Array();
language.french			= new Array();
language.swedish		= new Array();


// Error messages in english:
	language.english.header		= "The following error(s) occured:"
	language.english.start		= "->";
	language.english.field		= " Field ";
	language.english.require	= " is required";
	language.english.min		= " and must consist of at least ";
	language.english.max		= " and must not contain more than ";
	language.english.minmax		= " and no more than ";
	language.english.chars		= " characters";
	language.english.num		= " and must contain a number";
	language.english.email		= " must contain a valid e-mail address";
	language.english.html_nl	= " is not loaded completely. Refresh page.";	
	language.english.html_wv	= " is in HTML code mode. Switch to WYSIWYG view.";		
	language.english.html_word	= " contains Microsoft Word markup code. This not allowed on this site.";			
	language.english.html_img	= " contains a link to a file located on your pc.";				
	
// Error messages in Dutch: Thanks to Benjo de Lange <webmaster@bennie-webdesign.com> for translation
	language.dutch.header		= "De volgende fout(en) zitten in het formulier:"
	language.dutch.start		= "->";
	language.dutch.field		= " Veld ";
	language.dutch.require		= " is verplicht ";
	language.dutch.min			= " en moet bestaan uit minstens ";
	language.dutch.max			= " en mag bestaan uit niet meer dan ";
	language.dutch.minmax		= " en niet meer dan ";
	language.dutch.chars		= " karakters";
	language.dutch.num			= " en moet een nummer zijn";
	language.dutch.email		= " moet een geldig e-mail adres zijn.";
	language.dutch.html_nl		= " is niet volledig ingeladen. Vernieuw de pagina.";	
	language.dutch.html_wv		= " staat in de HTML code modus. Veranderer in WYSIWYG modus.";			
	language.dutch.html_word	= " bevat Microsoft Word opmaak codes. Dit is niet toegestaan.";			
	language.dutch.html_img		= " bevat een link naar een bestand op uw eigen pc.";				

// Error messages in French: Thanks to Christophe Lance <christophe@jcp-marketing-event.ch> for translation
	language.french.header		= "L'erreur suivante s'est produite: "
	language.french.start		= "->";
	language.french.field		= " Le champs ";
	language.french.require		= " est obligatoire";
	language.french.min			= " et doit contenir au moins ";
	language.french.max			= " et ne doit pas contenir plus de ";
	language.french.minmax		= " et pas plus de ";
	language.french.chars		= " caract\350res";
	language.french.num			= " et doit contenir un nombre ";
	language.french.email		= " doit contenir une adresse e-mail valide";

// Error messages in Swedish: Thanks to Roger Edvardsson <roger.edvardsson@noed.com>
	language.swedish.header		= "Fljande fel uppstod:";
	language.swedish.start		= "->";
	language.swedish.field		= " Fltet ";
	language.swedish.require	= " mste fyllas i";
	language.swedish.min		= " och skall best av minst ";
	language.swedish.max		= " och skall inte best av fler n ";
	language.swedish.minmax		= " och inte fler n ";
	language.swedish.chars		= " tecken";
	language.swedish.num		= " och mste innehlla ett nummer";
	language.swedish.email		= " mste innehlla en korrekt epost adress";

// -----------------------------------------------------------------------------
// define - Call this function in the beginning of the page. I.e. onLoad.
//
// n = name of the input field (Required)
// type= string, num, email (Required)
// min = the value must have at least [min] characters (Optional)
// max = the value must have maximum [max] characters (Optional)
// d = (Optional)
// -----------------------------------------------------------------------------
function define(n,type,HTMLname,min,max,d){
	var p;
	var i;
	var x;
	if(!d) d=document;
	if((p=n.indexOf("?"))>0&&parent.frames.length){
    	d=parent.frames[n.substring(p+1)].document;
    	n=n.substring(0,p);
    }
	if(!(x=d[n])&&d.all) x=d.all[n];
	
  	for (i=0;!x&&i<d.forms.length;i++){
  		x=d.forms[i][n];
  	}
	for(i=0;!x&&d.layers&&i<d.layers.length;i++){
		x=define(n,type,HTMLname,min,max,d.layers[i].document);
		return x;		
	}
	
	// Create Object. The name will be "V_something" where something is the "n" parameter above.
	eval("V_"+n+" = new formResult(x,type,HTMLname,min,max);");
	checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

// -----------------------------------------------------------------------------
// formResult - Used internally to create the objects
// -----------------------------------------------------------------------------
function formResult(form,type,HTMLname,min,max){
	this.form = form;
	this.type = type;
	this.HTMLname = HTMLname;
	this.min  = min;
	this.max  = max;
}

// -----------------------------------------------------------------------------
// validate - Call this function onSubmit and return the "returnVal". (onSubmit="validate();return returnVal;")
// -----------------------------------------------------------------------------
function validate(){
	returnVal = true;
	if(checkObjects.length>0){
		errorObject = "";
	
		for(i=0;i<checkObjects.length;i++){
			validateObject 			= new Object();
			validateObject.form 	= checkObjects[i].form;
			validateObject.HTMLname = checkObjects[i].HTMLname;
			validateObject.val 		= trim(checkObjects[i].form.value);
			//alert(checkObjects[i].form.value;
			validateObject.len 		= checkObjects[i].form.value.length;
			validateObject.len 		= validateObject.val.length;
			validateObject.min 		= checkObjects[i].min;
			validateObject.max 		= checkObjects[i].max;
			validateObject.type 	= checkObjects[i].type;
			
			//Debug alert line
			//alert("validateObject: "+validateObject+"\nvalidateObject.val: "+validateObject.val+"\nvalidateObject.len: "+validateObject.len+"\nvalidateObject.min,validateObject.max: "+validateObject.min+","+validateObject.max+"\nvalidateObject.type: "+validateObject.type);
			
			// Checking input. If "min" and/or "max" is defined the input has to be within the specific range
			if(validateObject.type == "num" || validateObject.type == "string"){
				if((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].num+"\n";
				} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].minmax+validateObject.max+language[selectecLanguage].chars+"\n";
				} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].chars+"\n";
				} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].max+validateObject.max+language[selectecLanguage].chars+"\n";
				} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";
				}
			} else if(validateObject.type == "email"){
				// Checking existense of "@" and ".". The length of the input must be at least 5 characters. The "." must neither be preceding the "@" nor follow it.
				if (!emailCheck(validateObject.val)){
					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].email+"\n";
				}
			} else if(validateObject.type == "html"){
				if (validateObject.val == "undefined"){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].html_nl+"\n";
				} else if (validateObject.val.indexOf('ccp_tag') > 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].html_wv+"\n";
				} else if (validateObject.val.indexOf('MsoNormal') > 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].html_word+"\n";
				} else if (validateObject.val.indexOf('<o:p') > 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].html_word+"\n";
				} else if (validateObject.val.indexOf('file:///') > 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].html_img+"\n";
				} else if (validateObject.val.indexOf('Times New Roman') > 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].html_word+"\n";
				}				
			}
		}
	}
	// Used to set the state of the returnVal. If errors -> show error messages in chosen language
	if(errors){
		alert(language[selectecLanguage].header.concat("\n"+errors));
		errors = "";
		returnVal = false;
	} else {
		returnVal = true;
	}
}

function trim(strText) { 
    // this will get rid of leading spaces 
	strText = ' ' + strText
    while (strText.substring(0,1) == ' ') 
        strText = strText.substring(1, strText.length);

    // this will get rid of trailing spaces 
    while (strText.substring(strText.length-1,strText.length) == ' ')
        strText = strText.substring(0, strText.length-1);

   return strText;
} 

function emailCheck (emailStr) {
	var emailPat=/^(.+)@(.+)$/
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
	var validChars="\[^\\s" + specialChars + "\]"
	var quotedUser="(\"[^\"]*\")"
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	var atom=validChars + '+'
	var word="(" + atom + "|" + quotedUser + ")"
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
	
	var matchArray=emailStr.match(emailPat)
	if (matchArray==null) {
		return false
	}
	var user=matchArray[1]
	var domain=matchArray[2]
	
	// See if "user" is valid 
	if (user.match(userPat)==null) {
		// user is not valid
		return false
	}
	
	var IPArray=domain.match(ipDomainPat)
	if (IPArray!=null) {
		// this is an IP address
		  for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				return false
			}
		}
		return true
	}
	
	// Domain is symbolic name
	var domainArray=domain.match(domainPat)
	if (domainArray==null) {
		return false
	}
	var atomPat=new RegExp(atom,"g")
	var domArr=domain.match(atomPat)
	var len=domArr.length
	if (domArr[domArr.length-1].length<2 || 
		domArr[domArr.length-1].length>4) {
	   return false
	}
	if (len<2) {
	   return false
	}
	return true;
}

function IsDate(dateStr) {
	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
	var matchArray = dateStr.match(datePat); // is the format ok?
	var datestatus=true;
	datemsg="";

	if (matchArray == null || matchArray[1]==null) {
		datemsg="----- Please enter date as mm/dd/yyyy " + "\n";
		return false;
	}
	else{
		if(matchArray[3]=null || matchArray[5]==null){
			datemsg="----- Please enter date as mm/dd/yyyy " + "\n";
			return false;
		}
	}

	day 	= matchArray[1];
	month 	= matchArray[3]; 
	year 	= matchArray[5];

	if (month < 1 || month > 12) { // check month range
		datemsg=datemsg + "----- Month must be between 1 and 12." + "\n";
		datestatus=false;
	}
	if (day < 1 || day > 31) {
		datemsg=datemsg + "----- Day must be between 1 and 31." + "\n";
		datestatus=false;
	}
	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
		datemsg=datemsg + "----- Month " + month + " doesn`t have 31 days!" + "\n";
		datestatus=false;
	}
	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day > 29 || (day==29 && !isleap)) {
			datemsg=datemsg + "----- February " + year + " doesn`t have " + day + " days!" + "\n";
			datestatus=false;
		}
	}
	return datestatus; 
}