var VALIDATE = new Object();

VALIDATE.start = function (formName) {
	if (!formName) return false;
	VALIDATE.form = formName;
	VALIDATE.submitGranted = false;
	VALIDATE.saveValues();
	VALIDATE.msg = "Do you wish to continue without saving the changes you have just made?";
	window.onbeforeunload = VALIDATE.beforeUnload;
}

VALIDATE.saveValues = function() {
	 var ftags = VALIDATE.form.getElementsByTagName('input');
	 for(var j=0; j<ftags.length; j++) {
	    if (ftags[j].type=="text" || ftags[j].type=="radio" || ftags[j].type=="password" || ftags[j].type=="hidden" || ftags[j].type=="file")
	       ftags[j].old_value = ftags[j].value;
	    else if (ftags[j].type=="checkbox")
	       ftags[j].old_value = ftags[j].checked;
		
		if (ftags[j].type == 'submit') {
			ftags[j].oldonclick = ftags[j].onclick;
			ftags[j].onclick = function() { 
				VALIDATE.submitGranted = true;
				if (typeof(this.oldonclick) == 'function') this.oldonclick();
			}
		} 
	 }
	 
	 ftags = VALIDATE.form.getElementsByTagName('select');
	 for(var j=0; j<ftags.length; j++){
	    ftags[j].old_value = ftags[j].selectedIndex;
	 }
	
	 ftags = VALIDATE.form.getElementsByTagName('textarea');
	 for(var j=0; j<ftags.length; j++){
	    ftags[j].old_value = ftags[j].value;
	 }
}

VALIDATE.checkValues = function() {
   var ftags = VALIDATE.form.getElementsByTagName('input');
   for(var j=0; j<ftags.length; j++) {
      if (ftags[j].type=="text" || ftags[j].type=="radio" || ftags[j].type=="password" || ftags[j].type=="hidden" || ftags[j].type=="file"){
         if (ftags[j].old_value != ftags[j].value) return true;
      }
      else if (ftags[j].type=="checkbox" && ftags[j].old_value != ftags[j].checked){
            return true;
      }
   }

   ftags = VALIDATE.form.getElementsByTagName('select');
   for(var j=0; j<ftags.length; j++){
      if (ftags[j].old_value != ftags[j].selectedIndex) return true;
   }

   ftags = VALIDATE.form.getElementsByTagName('textarea');
   for(var j=0; j<ftags.length; j++) {
      if (ftags[j].old_value != ftags[j].value) return true;
   }
   
   return false;
}

VALIDATE.beforeUnload = function() {
	if (VALIDATE.submitGranted) return;

	var changedVals = VALIDATE.checkValues();
	if (changedVals) {
	    return VALIDATE.msg;
	}
}

VALIDATE.redirect = function(url, forceRedirect){
	if (VALIDATE.submitGranted || !VALIDATE.form){
		location.href = url;
		return;
	}
	if (forceRedirect){
		VALIDATE.submitGranted = true;
		location.href = url;
		setTimeout("VALIDATE.submitGranted = false;", 100);
		return;
	}
	
	var changedVals = VALIDATE.checkValues();
	if (!changedVals || (changedVals && confirm(VALIDATE.msg))) {
	    VALIDATE.submitGranted = true;
	    location.href = url;
	}
	return false;
}

VALIDATE.patterns = [];
VALIDATE.patterns["notspace"] = /\S+/m;
VALIDATE.patterns["sqldate"] = /^\d{4}\-\d{2}\-\d{2}$/m;

VALIDATE.validateFields = function (form, fields) {
	if (!form || !fields) return;
	form.fields = fields;
	form.onsubmit = function() {
		for(var i=0; i<this.fields.length; i++){
		    var Obj = this[this.fields[i].field];
		    if (Obj && VALIDATE.patterns[this.fields[i].pattern] && !Obj.value.match(VALIDATE.patterns[this.fields[i].pattern])) {
		        alert(this.fields[i].message);
		        Obj.focus();
		    	return false;
		    }
		}
	    return true;
	}
}
