// Generic Form Validation
var checkObjects	= new Array();
var errors		= "";
var returnVal		= false;
var language		= new Array();
language["header"]	= "The folowing errors have occured:"
language["start"]	= "- ";
language["field"]	= " ";
language["require"]	= " is required";
language["min"]		= " and must be at least ";
language["min2"]		= " must be at least ";
language["max"]		= " and must not contain more than ";
language["max2"]		= " must not contain more than ";
language["minmax"]	= " and no more than ";
language["chars"]	= " characters";
language["num"]		= " and must contain a number";
language["num2"]		= " must contain a number";
language["email"]	= " must contain a proper email address";
language["date"]	= " must contain a proper date (dd/mm/yyyy)";
// -----------------------------------------------------------------------------
// define - Call this function in the beginning of the page. I.e. onLoad.
// req = Mandatory field (Required)
// 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(req, 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(req, n, type, HTMLname, min, max, d.layers[i].document);
		return x;
	}
	eval("V_"+n+" = new formResult(req, x, type, HTMLname, min, max);");
	checkObjects[eval(checkObjects.length)] = eval("V_"+n);
} // define

function formResult(req, form, type, HTMLname, min, max) {
	//alert(req+"-"+form+"-"+type+"-"+HTMLname);
	this.required = req;
	this.form = form;
	this.type = type;
	this.HTMLname = HTMLname;
	this.min  = min;
	this.max  = max;
}

function validate() {
	if (checkObjects.length > 0) {
		errorObject = "";
		for (i = 0; i < checkObjects.length; i++) {
			validateObject = new Object();
//			alert(checkObjects[i]);
			validateObject.form = checkObjects[i].form;
			validateObject.HTMLname = checkObjects[i].HTMLname;
//			alert(checkObjects[i].HTMLname);
			validateObject.val = checkObjects[i].form.value;
//			alert(checkObjects[i].form.value);
			validateObject.len = checkObjects[i].form.value.length;
			validateObject.min = checkObjects[i].min;
			validateObject.max = checkObjects[i].max;
			validateObject.type = checkObjects[i].type;
			validateObject.required = checkObjects[i].required;
			if (validateObject.required == "true") {
				if (validateObject.type == "num" || validateObject.type == "string") {
					if ((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val)) || (validateObject.type == "num" && parseInt(validateObject.val)<0) ) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + "\n";
					} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
					} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";
					} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
					} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
				   } else if (validateObject.max && !validateObject.min && (validateObject.len <= 0)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
				   }// if
				} else if(validateObject.type == "email") {
					// Checking existense of "@" and ".".
					// Length of must >= 5 and the "." must
					// not directly precede or follow the "@"
					if (!checkEmail(validateObject.val, validateObject.len)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['email'] + "\n";
   				   } //if
				  }//else if
				else if (validateObject.type == "date"){
					if (!checkDate(validateObject.val)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['date'] + "\n";
				}// if
			   } // else if
			} else {
				if (validateObject.type == "num" || validateObject.type == "string") {
					if ((validateObject.type == "num" && validateObject.len < 0) || (validateObject.type == "num" && isNaN(validateObject.val))) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['num2'] + "\n";
					} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['min2'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
					} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['min2'] + validateObject.min + language['chars'] + "\n";
					} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['max2'] + validateObject.max + language['chars'] + "\n";
					} else if (!validateObject.min && !validateObject.max && validateObject.len < 0) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
				   } // if
				} else if ((validateObject.type == "email")&&(validateObject.len > 0)) {
					if (!checkEmail(validateObject.val, validateObject.len)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['email'] + "\n";
   				   	} //if
				  }//else if
   				  else if (validateObject.type == "date" && validateObject.len > 0){
					if (!checkDate(validateObject.val)) {
						errors += language['start'] + language['field'] + validateObject.HTMLname + language['date'] + "\n";
					}// if
				  } // else if
			} // else
	   } // for
	} // if
	if (errors) {
		alert(language["header"].concat("\n" + errors));
		errors = "";
		returnVal = false;
	} else {
		returnVal = true;
   } // else
} // validate


function checkEmail(email, len) {
// Checking existense of "@" and ".".
// Length of must >= 5 and the "." must
// not directly precede or follow the "@"

	var index = -1;
	var temp = "";
	var count = 0;

	temp = email;
	if ((email.indexOf("@") == -1) || (email.charAt(0) == ".") || (email.charAt(0) == "@") || (len < 6) || (email.indexOf(".") == -1) || (email.charAt(email.indexOf("@")+1) == ".") || (email.charAt(email.indexOf("@")-1) == ".") || (email.lastIndexOf(".") < email.indexOf("@")) || (email.charAt(email.length-1) == ".") || (email.charAt(email.length-1) == "@")) {
		return false;
	} else {
		while ((index = temp.indexOf(".")) >= 0) {
			if ((temp.charAt(index-1) == ".") || (temp.charAt(index+1) == ".")) {
				return false;
			} else {
				temp = temp.substring(index+1);
			}
		}
		for (i=0;i<email.length-1;i++) {
			if (email.charAt(i) == "@") {
				count++;
			}
		}
		if (count > 1) {
			return false;
		}
		return true;
	}
}

function checkDate(fieldValue){

var checkstr = "0123456789";
var Datevalue = "";
var DateTemp = "";
var day;
var month;
var year;
var leap = 0;
var err = 0;
var i;
   err = 0;
   DateValue = fieldValue;

   /* Delete all chars except 0..9 */
   for (i = 0; i < DateValue.length; i++) {
	  if (checkstr.indexOf(DateValue.substr(i,1)) >= 0) {
	     DateTemp = DateTemp + DateValue.substr(i,1);
	  }
   }
   DateValue = DateTemp;
   /* Always change date to 8 digits - string*/
   if (DateValue.length != 8) {
      err = 19;}
   /* year is wrong if year = 0000 */
   year = DateValue.substr(4,4);
   if (year == 0) {
      err = 20;
   }
   /* Validation of month*/
   month = DateValue.substr(2,2);
   if ((month < 1) || (month > 12)) {
      err = 21;
   }
   /* Validation of day*/
   day = DateValue.substr(0,2);
   if (day < 1) {
     err = 22;
   }
   /* Validation leap-year / february / day */
   if ((year % 4 == 0) || (year % 100 == 0) || (year % 400 == 0)) {
      leap = 1;
   }
   if ((month == 2) && (leap == 1) && (day > 29)) {
      err = 23;
   }
   if ((month == 2) && (leap != 1) && (day > 28)) {
      err = 24;
   }
   /* Validation of other months */
   if ((day > 31) && ((month == "01") || (month == "03") || (month == "05") || (month == "07") || (month == "08") || (month == "10") || (month == "12"))) {
      err = 25;
   }
   if ((day > 30) && ((month == "04") || (month == "06") || (month == "09") || (month == "11"))) {
      err = 26;
   }


   /* if no error, */
   if (err == 0) {
      //alert("OK");
	  return true;
   }
   /* Error-message if err != 0 */
   else {
      //alert(err);
      return false;
   }
}
/*end checkDate*/

function initValidate() {
	checkObjects = new Array();
} // initValidate

//VALIDATES MIN-MAX PAIRS OF NUMERIC (NOT REQUIRED) FIELDS
//1. checks if numbers
//2. checks if min<max
function checkMinMax(obj1,obj2,label){
    var message = "";
    //case 1: invalid number in min or max
    if ((obj1.length>0 && isNaN(obj1)) || (obj2.length>0 && isNaN(obj2))){
        return message = "\n"+label+": Please fill in proper numbers for 'from' and 'to' fields.";
    }
    //case 2: valid numbers nut min>max

    if((obj1.length>0 && !isNaN(obj1)) && (obj2.length>0 && !isNaN(obj2))){
        if (obj1-obj2>0){//comparison DOESN'T work !!!!
            message = "\n"+label+": The 'from' field value must be less than of the 'to' field.";
        }
    }
    return message;
}

//VALIDATION FOR SEARCH FORMS
function validateSearchMinMax() {
    var message = "";
    if (checkMinMax(document.propertyForm.priceFrom.value, document.propertyForm.priceTo.value).length > 0,'Price')
        message += checkMinMax(document.propertyForm.priceFrom.value, document.propertyForm.priceTo.value, 'Price');
    if (checkMinMax(document.propertyForm.sizeFrom.value, document.propertyForm.sizeTo.value).length > 0,'Size')
        message += checkMinMax(document.propertyForm.sizeFrom.value, document.propertyForm.sizeTo.value, 'Size');
    return message;
}
