/*
     JavaScript object to validate the forms.
     All of the client side form validation logic is put into this object.     
*/

BRAINS.validation = function () {

	/*
	 * Private variables.
	 */ 
	var localized;
	var defaultEmptyOK = true;
	var formHasChanged = false;
	var line = "______________________________________________<br /><br />";
	
	var isEmpty = function (s) { return ((s == null) || (s.length == 0))};
	var isLetterOrDigit = function (c) { return (isLetter(c) || isDigit(c))};
	var isDigit = function (c)   { return ((c >= "0") && (c <= "9"))};
	var isLetter = function (c)  { return (((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")))};
	var isSpace = function (c)   { return (c == " ")};
		
	/*
	 * Private methods.
	 */ 
	var isAlphabetic = function (s)
	{
	  var i;
	  if (isEmpty(s))
	     if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
	     else return (isAlphabetic.arguments[1] == true);
	
	  for (i = 0; i < s.length; i++)
	  {
	    var c = s.charAt(i);
	    if (!isLetter(c)) return false;
	  }
	  return true;
	}
	
	var isAlphanumeric = function (s)
	{
	  var i;
	  if (isEmpty(s))
	     if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
	  else return (isAlphanumeric.arguments[1] == true);
	
	  for (i = 0; i < s.length; i++)
	  {
	    var c = s.charAt(i);
	    if (! (isLetter(c) || isDigit(c)))
	    return false;
	  }
	  return true;
	}
	
	var isAlphanumericSpace = function (s)
	{
	  var i;
	  if (isEmpty(s))
	     if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
	     else return (isAlphanumeric.arguments[1] == true);
	
	  for (i = 0; i < s.length; i++)
	  { 
	    var c = s.charAt(i);
	    if (! (isLetter(c) || isDigit(c) || isSpace(c)))
	    return false;
	  }
	  return true;
	}
	
	var isInteger = function (s)
	{
	  var i;
	  if (isEmpty(s))
	     if (isInteger.arguments.length == 1) return defaultEmptyOK;
	     else return (isInteger.arguments[1] == true);
	
	  for (i = 0; i < s.length; i++)
	  {
	    var c = s.charAt(i);
	    if (!isDigit(c)) return false;
	  }
	  return true;
	}
	
	var integerCount = function (s)
	{
	  var i; var n = 0;
	  for (i = 0; i < s.length; i++)
	  {
	    var c = s.charAt(i);
	    if (isDigit(c)) n++;
	  }
	  return n;
	}
	
	var isBlank = function (s)
	{
	    for(var i = 0; i < s.length; i++) {
	        var c = s.charAt(i);
	        if (!isSpace(c) && (c != '\n') && (c != '\t') && (c != '\r')) return false;
	    }
	    return true;
	}
	
	var leftTrim = function (str)       
	{
	  var s = new String(str);
	  if (isBlank(s.charAt(0))) {
	    var j = 0, i = s.length;    
	    while (j < i && isBlank(s.charAt(j))) j++;    
	    s = s.substring(j, i);
	  }
	  return s;
	}
	
	var rightTrim = function (str)
	{        
	  var s = new String(str);
	  if (isBlank(s.charAt(s.length - 1))) {
	    var i = s.length - 1;
	    while (i >= 0 && isBlank(s.charAt(i))) i--;
	    s = s.substring(0, i + 1);
	  }
	  return s;
	}
	
	var trim = function (str)
	{
	  return rightTrim(leftTrim(str));
	}
	
	// Email address must be of form a@b.c -- in other words:
	// * there must be at least one character before the @
	// * there must be at least one character before and after the .
	// * the characters @ and . are both required
	var isEmail = function (s)
	{   
	  var i = 1;
	  var sLength = s.length;
	  while ((i < sLength) && (s.charAt(i) != "@")) i++;  
	  if ((i >= sLength) || (s.charAt(i) != "@")) 
	    return false;
	  else i += 2;
	  while ((i < sLength) && (s.charAt(i) != ".")) i++;  
	  if ((i >= sLength - 1) || (s.charAt(i) != ".")) 
	    return false;
	  else 
	    return true;
	}
	
	// This function performs form verification. 
	var verify = function (f)
	{
	    var MIN_PASSWORD_LEN = 5;
	    
	    var emptyFields = "";
	    var errors = "";        
	    var isFirstInvalidField = true;
	    var hasCorrectAnswer = false;   
	    
	    var msg = line;
	    msg += localized.info;
	    msg += line; 
	
	    // Loop through the elements of the form, looking for all 
	    // text and textarea elements that have a "required" property defined. 
	    // Then, check for fields that are empty and make a list of them.  		
	    for(var i = 0; i < f.length; i++) 
	    {
	        var e = f.elements[i];
	        
	        if (((e.type == "text") || (e.type == "textarea") || 
	          (e.type == "password") || (e.type.indexOf("select") == 0)) && e.required) 
	        {
	            e.value = trim(e.value);				
	            
	            // Check for text based fields.
	            if(e.type.indexOf("select") != 0)
	            {
	              // Check if the field is empty.
	              if (isEmpty(e.value) || isBlank(e.value)) {
	                  emptyFields += "<br />" + "<span style=\"MARGIN-LEFT: 20px\">" + e.message + "</span>";
	                  if(isFirstInvalidField) {
	                    f.elements[i].focus();
	                    isFirstInvalidField = false;  
	                  }                
	                  continue;
	              }
	              
	              // Check if the field should have a minimum length.
	              if (e.min != null) {
	                  if(e.length < e.min) {
	                    errors += localized.minimumPrefix + e.message + " " + minimum + " " + e.min + minimumSuffix;
	                    if(isFirstInvalidField) {
	                      f.elements[i].focus();
	                      isFirstInvalidField = false;  
	                  	} 
	                 }                 
	              }
	            }
	            
	            // Check for unselected selection lists.      
	            if(e.type.indexOf("select") == 0) {
	              var v = trim(e.value);        
	              if(isEmpty(v)) {
	                errors += localized.selectedPrefix + " " + e.message + " " + localized.selectedSuffix;
	                if(isFirstInvalidField) {
	                    f.elements[i].focus();
	                    isFirstInvalidField = false;  
	                } 
	              } 
	            }
	
	            // Check for unselected radio buttons.      
	            if(e.type.indexOf("radio") == 0 || e.type.indexOf("checkbox") == 0) {         
	              for (var i = 0; i < e.length; i++) {
	                  if (e[i].checked) {
	                  hasCorrectAnswer = true;
	                  break;          
	                }
	              }
	              if (!hasAtLeastOneCorrectAnswer) {
	                errors += localized.radioPrefix + " " + e.message + " " + localized.radioSuffix;
	                if(isFirstInvalidField) {
	                    f.elements[i].focus();
	                    isFirstInvalidField = false;  
	                } 
	              }        
	            }
	            
	            // Check for fields that are supposed to be numeric.
	            if (e.numeric) { 
				  if((e.min != null) || (e.max != null)) {               
	                var v = parseFloat(e.value);
	                if (isNaN(v) ||
					((e.min != null) && (v < e.min)) ||
					((e.max != null) && (v > e.max))) {
						errors += localized.numericPrefix + " " + e.message + " " + localized.numeric;
						if (e.min != null) 
							if (e.min == 0) 
								errors += " " + localized.numericzero;
							else 
								errors += " " + localized.numericgreater + " " + e.min;
						if (e.max != null && e.min != null) 
							errors += " " + localized.numericless + " " + e.max;
						else 
							if (e.max != null) 
								errors += " " + localized.numericlessthan + " " + e.max;
						errors += ".\n";
						if (isFirstInvalidField) {
							f.elements[i].focus();
							isFirstInvalidField = false;
						}
					 }  
	              }
	            }
	            
	            // Check for fields that are supposed to be E-mail addresses.
	            if(e.emailaddress) {
	              var v = trim(e.value);              
	              if(!isEmail(v)) {
	                errors += localized.fieldPrefix + " " + e.message + " " + localized.fieldSuffix;
	                if(isFirstInvalidField) {
	                    f.elements[i].focus();
	                    isFirstInvalidField = false;
	                  } 
	               }               
	            }
	
	            // Check for fields that are supposed to be passwords.
	            if(e.passcode) {
	              var v = trim(e.value);        
	              if(!isAlphanumeric(v) || v.length < MIN_PASSWORD_LEN) { 
	                if(!isAlphanumeric(v)) 
	                  errors += localized.fieldPrefix + " " + e.message + " " + localized.fieldSuffix;
	                else if(v.length < MIN_PASSWORD_LEN)  
	                  errors += localized.fieldPrefix + " " + e.message + " " + localized.minimum + " " + MIN_PASSWORD_LEN + " " + localized.minimumSuffix;
	
	                if(isFirstInvalidField) {
	                    f.elements[i].focus();
	                    isFirstInvalidField = false;  
	                } 
	             }  
	          }                         
	       }
	    }
	
	    // Now, if there were any errors, display the messages, and
	    // return false to prevent the form from being submitted. 
	    // Otherwise return true.
	    if (!emptyFields && !errors) return true;
	    
	    if (emptyFields) {
	        msg += localized.emptyPrefix + " " + emptyFields + " " + localized.emptySuffix;        
	    } 
	    msg += errors;
	       
	    alert("<span class='validation-message'>" + msg + "</span>");
	    
	    return false;
	}
	
	var copy = function (f)
	{
	    var msg = line;
	    msg += localized.info;
	    msg += line;
	  
	    var newGivenId = f.newassessid.value;
	  
	    if (isEmpty(newGivenId) || isBlank(newGivenId)) {   
	      alert(msg + localized.idinvalid);
	      return false;
	    } 
	  
	    return true;
	}
	
	var contact = function (f)
	{
	  f.fullName.required = true;
	  f.fullName.message = localized.fullName;
	  f.subject.required = true;
	  f.subject.message = localized.subject; 
	  f.description.required = true;
	  f.description.message = localized.description; 
	  
	  return verify(f); 
	}	
	
	var assessment = function (f)
	{
	  f.assessment.required = true;
	  f.assessment.message = localized.assessName;
	  f.givenid.required = true;
	  f.givenid.message = localized.assessId;
	  
	  //alert(f.assessment.required);
	  //alert(f.assessment.required);
	  
	  return verify(f); 
	}
	
	var deleteChoose = function (f) 
	{
	  var option = f.delAction.value;
	  
	  var msg = line;
	  msg += localized.info;
	  msg += line;
	  
	  if (isEmpty(option)) {
	    alert(msg + localized.noanswers);
	    return false;
	  }
	  
	  return true;
	}
	
	var settings = function (f)
	{
	  var QUESTION = 2;
	  
	  f.passing.required = true;
	  f.passing.message = localized.passing;
	  f.passing.min = 1;
	  f.passing.max = 100;
	  
	  if(f.timed.value == QUESTION) { 
	  	f.seconds.required = true;
		f.seconds.message = localized.seconds;
		f.seconds.min = 1;
		f.seconds.max = 300;
	  }
	  else {
	  	f.seconds.required = false;
	  }	
	  
	  if(!verify(f)) {
	    return false;
	  }
	  else {
	    var msg = line;
	    msg += localized.info;
	    msg += line;
	    
	    // Check the passing field is an integer.  
	    var pass = trim(f.passing.value); 
	    if (pass !== null && !isEmpty(pass)) {    
	      // If there is a value check that it is an integer number.     
	      if (!isInteger(pass) || pass <= 0) {        
	        errors = msg + localized.integerPrefix + f.passing.message + localized.integerSuffix;
	        alert(errors); 
	        return false;
	      }
	    }
	    
	    if(f.timed.value == QUESTION) {
	      // Check the seconds field is an integer.  
	      var secs = trim(f.seconds.value); 
	      if (secs !== null && !isEmpty(secs)) {    
	        // If there is a value check that it is an integer number.     
	        if (!isInteger(secs) || secs <= 0) {        
	          errors = msg + localized.integerPrefix + f.seconds.message + localized.integerSuffix;
	          alert(errors); 
	          return false;
	        }
	      }    
	    }
	        
	    return true;
	  }   
	}
	
	var filterCreate = function (f)
	{
	  var msg = line;
	  msg += localized.info;
	  msg += line;
	  
	  if (!f.filter[0].checked && !f.filter[1].checked){
	    alert(msg + localized.select);
	    return false;
	  }
	  
	  return true;  
	}
	
	var filterChoose = function (f)
	{
	  f.customfields.required = true;
	  f.customfields.message = localized.customfield;
	  
	  return verify(f); 
	}
	
	var filter = function (f)
	{
	  var msg = line;
	  msg += localized.info;
	  msg += line;
	
	  if(f.excluded.options.length == 0) {
	    msg += localized.filterempty;
	    alert(msg);
	    return false;
	  }
	  else if(f.included.options.length == 0) {
	    msg += localized.filtervalues;
	    alert(msg);
	    return false;
	  }
	    
	  for(var i = 0; i < f.included.options.length; i++) {
	    f.included.options[i].selected = true;
	  }
	  
	  for(var i = 0; i < f.excluded.options.length; i++) {
	    f.excluded.options[i].selected = true;
	  }
	        
	  return (filterName(f));  
	}
	
	var filterName = function (f)
	{
	  f.filtername.required = true;
	  f.filtername.message = localized.filtername;
	  
	  return verify(f); 
	}
	
	// This function is called buy account.jsp, register.jsp.
	var account = function (f)
	{ 	  
	  var isFullAccount;
	  var validateTerms;	  
	  
	  if(f.isFullAccount.value == "true") 
	  	isFullAccount = true;
	  else
	  	isFullAccount = false;
		
	  if(f.validateTerms.value == "true") 
	  	validateTerms = true;
	  else
	  	validateTerms = false;	
	  
	  f.email.required = true;
	  f.email.message = localized.email;
	  f.email.emailaddress = true;
	  f.email2.required = true;
	  f.email2.emailaddress = true;
	  f.email2.message = localized.emailaddress;
	  
	  if(isFullAccount) {
	    f.person.required = true;
	    f.person.message = localized.contact;
	    f.telephone.required = true;  
	    f.telephone.message = localized.telephone;
	    f.addressline1.required = true;
	    f.addressline1.message = localized.address;
	    f.location.required = true;
	    f.location.message = localized.location;  
	  }
	  
	  f.pass.required = true;
	  f.pass.message = localized.pass;
	  f.pass.passcode = true;
	  f.pass2.required = true;
	  f.pass2.message = localized.password;
	  f.pass2.passcode = true;
	  
	  if(isFullAccount) { 
	    f.postcode.required = true;
	    f.postcode.message = localized.postcode;
	  }
	  
	  f.country.required = true;
	  f.country.message = localized.country;
	  f.timezone.required = true;
	  f.timezone.message = localized.timezone;      
	  
	  var verification =  verify(f);
	  	  
	  var msg = line;
	  msg += localized.info;
	  msg += line;	  
	    
	  if (verification === false) {
	    return false;
	  } 
	  else {
	    if (f.email.value != f.email2.value){   
	      alert(msg + localized.emailaddresses);
	      f.email.focus();
	      return false;
	    }
	    
	    if (f.pass.value != f.pass2.value){   
	      alert(msg + localized.passwords);
	      f.pass.focus();
	      return false;
	    }
	  }
	  
	  if(validateTerms)
	  {
	    msg = line;
	    msg += localized.infomation;
	    msg += line;
	
	    if(!f.terms.checked)
	    {
	      alert(msg + localized.terms);
	      return false;
	    }
	  }
	  
	  return true;
	}
	
	var groupName = function (f)
	{
	  f.groupname.required = true;
	  f.groupname.message = localized.groupname;
	  
	  return verify(f); 
	}
	
	var group = function (f)
	{
	  var msg = line;
	  msg += localized.info;
	  msg += line;
	  
	  f.groupname.required = true;
	  f.groupname.message = localized.groupname; 
	  f.grouptype.required = true;  
	  f.grouptype.message = localized.grouptype;
	  f.questionorder.required = true;  
	  f.questionorder.message = localized.questionorder;
	  f.questionstoask.message = localized.questionstoask;
	  f.points.message = localized.points;
	    
	  if(!verify(f)) {
	    return false;
	  }
	  else { 
	    // If questions to ask is set check for points. 
	    var qta = f.questionstoask.selectedIndex;
	    var resultsExist = f.resultsexist;
	    if (!resultsExist) {
	      if(qta > 0) {
	         // If there is a value here check that it is an integer number.     
	         if (!isInteger(qta) || qta < 1) {   
	           errors = msg + localized.integerPrefix + f.points.message + localized.integerSuffix;
	           alert(errors); 
	           return false;
	         }          
	       }
	     }  
	  	 return true;
	   } 
	}
	
	var personal = function (f)
	{   
	  f.person.required = true;
	  f.person.message = localized.contact
	  f.telephone.required = true;  
	  f.telephone.message = localized.telephone;  
	  f.addressline1.required = true;
	  f.addressline1.message = localized.address;
	  f.location.required = true;
	  f.location.message = localized.location;  
	  f.postcode.required = true;
	  f.postcode.message = localized.postcode;  
	  f.payment.required = true;
	  f.payment.message = localized.payment;       
	  
	  var verification =  verify(f);
	  
	  var msg = line;
	  msg += localized.info;
	  msg += line;
	    
	  if (verification == false){
	    return false;
	  }   
	  
	  return true;
	}
	
	var notify = function (f)
	{
	  f.emailid.required = true;
	  f.emailid.emailaddress = true;
	  f.emailid.message = localized.email;
	  
	  return verify(f); 
	}
	
	var customField = function (f)
	{
	  f.question.required = true;
	  f.question.message = localized.question;
	  f.answer1.required = true;
	  f.answer1.message = localized.optionone;
	  f.answer2.required = true;
	  f.answer2.message = localized.optiontwo;
	  
	  return verify(f); 
	}
	
	var forgot = function (f)
	{
	  f.email.required = true;
	  f.email.message = localized.email;
	  f.email.emailaddress = true;
	  f.email2.required = true;
	  f.email2.message = localized.emailaddress;
	  f.email2.emailaddress = true;
	  
	  var verification =  verify(f);
	  
	  var msg = line;
	  msg += localized.info;
	  msg += line;  
	  
	  if (verification == false){
	    return false;
	  } 
	  else {  
	    if (f.email.value != f.email2.value) {
	      alert(msg + localized.emailaddresses);
	      return false;
	    }
	  }
	  
	  return true;
	} 
	
	var question = function (f)
	{
	  var isExamSection = f.examSection;
	  var isSurveySection = f.surveySection;
	  var isTestSection = f.testSection;
	  var isTextSection = f.textSection;
	  
	  if (isExamSection) {
	    f.points.required = true;
	    f.points.message = localized.points;
	    f.points.min = 1;
	  }
	  
	  f.question.required = true;
	  f.question.message = localized.question;
	  
	  if (!isTextSection) {
	  	// this is for multiple choice questions
		f.questiontype.required = true;
	  	f.questiontype.message = localized.questiontype;
	  	f.answer1.required = true;
	  	f.answer1.message = localized.optionone;
	  	f.answer2.required = true;
	  	f.answer2.message = localized.optiontwo;
	  }	
	  
	  if (isExamSection) {
		return (verify(f) && validateCorrectOption(f));
	  }
	  else if(isTestSection) {
	  	f.point1.required = true;
		f.point1.message = localized.pointone;
		f.point2.required = true;
		f.point2.message = localized.pointtwo;
		
		return (verify(f) && validatePoints(f));
	  }
	  else {
	  	return (verify(f));
	  }
	}
	
	var validateCorrectOption = function (f) 
	{
		var msg = line;
		msg += localized.info;
		msg += line;
		
		var checkbox = f.correct;		
		var hasAtLeastOneCorrectAnswer = false;
		var message = "";
		
	    for (var i = 0; i < checkbox.length; i++) {
	       if (checkbox[i].checked){
		  		if (answerIsValid(i)) {
			       	hasAtLeastOneCorrectAnswer = true;
		        } 
		        else if (!checkbox[i].disabled) {
			    	message += " " + localized.optionPrefix + " " + (i + 1) + " " + localized.optionSuffux;
			    }
		   }
		}
				
		if (!isEmpty(message)) {
			alert (msg + message);
			return false;
		}
		
		if (hasAtLeastOneCorrectAnswer) {
			return true;
		} 
		else {
			alert (msg + localized.onecorrect);
			return false;
		}
	}	
	
	// Insure that the points are correctly set.	
	var validatePoints = function(f) 
	{
		var msg = line;
		msg += localized.info;
		msg += line;
		
		var message = "";
						
		for (var i = 1; i < 8; i++) {	       
		   var optionPoints = f.elements['point' + i];
		   if(!optionPoints.disabled) {
		     if(!isEmpty(optionPoints.value)) {
			    if(!isInteger(trim(optionPoints.value))) {
			   		if (isEmpty(message)) {
						message += localized.allNumbers;
					}									
			    }
			 }
		  }	 
		}
		
		// Ensure that the correct question options points are set.
		for (var i = 1; i < 8; i++) {	       
		   var optionPoints = f.elements['point' + i];
		   var answer = f.elements['answer' + i];		   
		   if(!isEmpty(optionPoints.value) && isEmpty(answer.value)) {
			   	message += localized.points + " " + i + " " + localized.pointsSuffix;
		   }	 
		}
		
		if (!isEmpty(message)) {
			alert (msg + message);
			return false;
		}
		
		return true;
	}
	
	// Check if answer is valid.
	var answerIsValid = function (i)
	{
		answer = document.getElementById ('answer' + (i+1));
		if (answer) {
			if (isEmpty(answer.value) || isBlank(answer.value)) {
				return false;
			}
		}
		return true;
	}
	
	var pass = function (f)
	{ 
	  f.passing.required = true;
	  f.passing.message = localized.passing;
	  f.passing.min = 1;
	  f.passing.max = 100;
	  
	  return verify(f); 
	}
	
	var correctOption = function (f) 
	{
	  var msg = line;
	  msg += localized.info;
	  msg += line;
	  
	  var checkbox = f.correct;	  
	  var hasAtLeastOneCorrectAnswer = false;
	  var message = "";
	  
	  for (var i = 0; i < checkbox.length; i++) {
	     if (checkbox[i].checked){
	        if (answerIsValid(i)) {
	            hasAtLeastOneCorrectAnswer = true;
	      } 
	      else if (!checkbox[i].disabled){
	          message += localized.optionPrefix + (i + 1) + localized.optionSuffux;
	        }
	     }
	  }
	  
	  if (!isEmpty(message)) {
	    alert (msg + message);
	    return false;
	  }
	  
	  if (hasAtLeastOneCorrectAnswer) {
	    return true;
	  } 
	  else {
	    alert (msg + localized.onecorrect);
	    return false;
	  }
	}	
	
	// Check if the question answer is valid.
	var answerIsValid = function (i)
	{
	  answer = document.getElementById ('answer' + (i + 1));
	  if (answer) {
	    if (isEmpty(answer.value) || isBlank(answer.value)) {
	      return false;
	    }
	  }
	  return true;
	}
	
	// This function is used to validate the date.
	// It insures that the date provided by the dropdown lists have a valid interval between them.
	// It insures that the start date is before the finish date.
	var checkDates = function (f)
	{ 
	  var dayB = f.startDateDay.options[f.startDateDay.selectedIndex].value;
	  var monthB = f.startDateMonth.options[f.startDateMonth.selectedIndex].value;
	  var yearB = f.startDateYear.options[f.startDateYear.selectedIndex].value;
	  	
	  var dayE = f.endDateDay.options[f.endDateDay.selectedIndex].value;
	  var monthE = f.endDateMonth.options[f.endDateMonth.selectedIndex].value;
	  var yearE = f.endDateYear.options[f.endDateYear.selectedIndex].value;
		
	  // Check the time interval between the dates provided.
	  return checkInterval(dayB,monthB,yearB, dayE, monthE, yearE);
	}
	
	// This function is used by the checkDates JavaScript function.
	var checkInterval = function (dayB,monthB,yearB, dayE, monthE, yearE) 
	{
	  var msg = line;
	  msg += localized.info;
	  msg += line;
	  
	  var dateBegin = new Date();
	  dateBegin.setDate(dayB);
	  dateBegin.setMonth(monthB); //January == 0
	  dateBegin.setFullYear(yearB);
	 
	  var dateEnd = new Date();
	  dateEnd.setDate(dayE);
	  dateEnd.setMonth(monthE); //January == 0
	  dateEnd.setFullYear(yearE); 
	  	  
	  if (dateEnd < dateBegin) {
	    alert(msg + localized.timedate);
	    return false;
	  }
	  
	  return true;
	}
	
	var submitHandler = function(e)
	{		
		var toReturn;
		var elTarget = YAHOO.util.Event.getTarget(e);
								
		if(elTarget.id == 'account'){			
			toReturn = account(elTarget); 	
		}
		else if (elTarget.id == 'register'){			
			toReturn = account(elTarget); 
		}
		else if (elTarget.id == 'assessmentcopy'){			
			toReturn = copy(elTarget); 
		}
		else if (elTarget.id == 'assessmentcreate'){
			toReturn = assessment(elTarget); 
		}
		else if (elTarget.id == 'deleteresults'){
			toReturn = deleteChoose(elTarget); 
		}
		else if (elTarget.id == 'assessmentsettings'){
			toReturn = settings(elTarget); 
		}
		else if (elTarget.id == 'filtercreate'){
			toReturn = filterCreate(elTarget); 
		}
	 	else if(elTarget.id == 'filterchoose'){
			toReturn = filterChoose(elTarget); 	
		}
		else if(elTarget.id == 'filtername'){
			toReturn = filterName(elTarget); 	
		}
		else if(elTarget.id == 'filter'){
			toReturn = filter(elTarget); 	
		}
		else if(elTarget.id == 'groupname'){
			toReturn = groupName(elTarget); 	
		}
		else if(elTarget.id == 'questiongroup'){
			toReturn = group(elTarget); 	
		}
	    else if(elTarget.id == 'personal'){
			toReturn = personal(elTarget); 	
		}
		else if(elTarget.id == 'notify'){
			toReturn = notify(elTarget); 	
		}
		else if(elTarget.id == 'question'){
			toReturn = question(elTarget); 	
		}
		else if(elTarget.id == 'customfieldvalue'){
			toReturn = customField(elTarget); 	
		}
	    else if(elTarget.id == 'forgot'){
			toReturn = forgot(elTarget); 	
		}
		else if(elTarget.id == 'passgrade'){
			toReturn = pass(elTarget); 	
		}
		else if(elTarget.id == 'download' || elTarget.id == 'delete'){			
			toReturn = checkDates(elTarget); 	
		}
		else if(elTarget.id == 'contact') {			
			toReturn = contact(elTarget);
		} 
		
		var body = document.getElementsByTagName('body')[0];	
		YAHOO.util.Event.removeListener(body, "unload", unloadHandler); 
				
		if(toReturn == false)
			YAHOO.util.Event.stopEvent(e);
		
		return toReturn;
	}
	
	var changeHandler = function(e)
	{
	  if (formHasChanged == false) {		
		var body = document.getElementsByTagName('body')[0];
		YAHOO.util.Event.addListener(body, "unload", unloadHandler, this);
	  }
	  formHasChanged = true;
	}
	
	var unloadHandler = function(e) 
	{
	  if (formHasChanged) {
	  	if(false) {
			if (!confirm(localized.navigate)) {				
				YAHOO.util.Event.stopEvent(e);
				return false;
			}
		}	
		return true;
	  }
	}		
		
	return  { 
		/*
		 * IMPORTANT: The last method here should not have a trailing comma.
		 * This will cause all of the JavaScript on the page to break with Microsoft I.E.		
		 * 
		 * Public methods.
		 */ 
		cancel: function () {
			var body = document.getElementsByTagName('body')[0];	
		    YAHOO.util.Event.removeListener(body, "unload", unloadHandler); 
		},
		
		init: function () { 
			// Add the event listeners.	       
			var formElements = document.getElementsByTagName('form');
		    for (var i = 0; i < formElements.length; i++) {
		      var form = formElements[i];
		      YAHOO.util.Event.addListener(form, "submit", submitHandler, this, true);
			  YAHOO.util.Event.addListener(form, "change", changeHandler, this, true);
		    }
			
			// Ajax DWR call to get the localized validation messages.
			JSMessages.getJavaScriptMessages(function(data) {			  
			  localized = data;
		  	});
		}	
   	};
}(); // force the anonymous function to execute and return