/*
	FormToolHandler object
*/
// -----------------
FormToolHandler.prototype.disableAllOtherFormElements = FormToolHandlerDisableAllOtherFormElements;
FormToolHandler.prototype.createFormElement = FormToolHandlerCreateFormElement;
FormToolHandler.prototype.validateMandatory = FormToolHandlerValidateMandatory;
FormToolHandler.prototype.validateFormElements = FormToolHandlerValidateFormElements;
FormToolHandler.prototype.showErrorMessage = FormToolHandlerShowErrorMessage;
FormToolHandler.prototype.setFocusAndCSS = FormToolHandlerSetFocusAndCSS;
FormToolHandler.prototype.submitForm = FormToolHandlerSubmitForm;
function FormToolHandler(){
	this.oForm = document.forms[0];
	this.arrElements = this.oForm.elements;
	this.arrElementIDsArray = elementIDsArray;
	this.strYouHaveToFillInSomething = "You have to fill in something in this field";
	this.strYouHaveToEnterDateInThisFormat = "You have to enter a date in this format:yyyy-mm-dd";
	this.strTheMonthNumberCanNotBe = "The month number can not be";
	this.strHigher = "higher";
	this.strLower = "lower";
	this.strThan = "than";
	this.strTheDateNumberCanNotBe = "The date can not be";
	this.strThisMonthOnlyHas = "This month only has";
	this.strDays = "days";
	this.strYouHaveToEnterAValidEmailAddress = "You have to enter a valid e-mail address";
	this.strOnlyNumbersInThisField = "You can only enter numbers in this field";
}
// -----------------
function FormToolHandlerDisableAllOtherFormElements(){
	// Disable all elements
	var arrPageElements = this.arrElements;
	for(var i=0;i<arrPageElements.length;i++){
		arrPageElements[i].disabled = true;
	}
	
	// Activate editable elements in object				
	if(this.arrElementIDsArray){
		var oElm;
		var arrInputElementsInSpirelloElement;
		var arrTextareaElementsInSpirelloElement;
		var arrSelectElementsInSpirelloElement;
		for(var i=0; i<this.arrElementIDsArray.length; i++){
			oElm = getElm(this.arrElementIDsArray[i]);
			if(oElm){
				/* 
					Three different loops b/c getElementsByTagName returns a collection (as opposed to an array), 
					so the Array object's join method isn't possible to use in this case.
				*/	
				arrInputElementsInSpirelloElement = oElm.getElementsByTagName("input");
				for(var j=0; j<arrInputElementsInSpirelloElement.length; j++){
					arrInputElementsInSpirelloElement[j].disabled = false;
				}
				arrTextareaElementsInSpirelloElement = oElm.getElementsByTagName("textarea");
				for(var k=0; k<arrTextareaElementsInSpirelloElement.length; k++){
					arrTextareaElementsInSpirelloElement[k].disabled = false;
				}
				arrSelectElementsInSpirelloElement = oElm.getElementsByTagName("select");
				for(var l=0; l<arrSelectElementsInSpirelloElement.length; l++){
					arrSelectElementsInSpirelloElement[l].disabled = false;
				}
			}
		}
	}
}
// -----------------
function FormToolHandlerCreateFormElement(strNameAndID, strType, strValue){
	var oInput = document.createElement("input");
	oInput.setAttribute("name", strNameAndID);
	oInput.setAttribute("id", strNameAndID);
	oInput.setAttribute("type", strType);
	oInput.value = strValue;
	this.oForm.appendChild(oInput);
}
// -----------------
function FormToolHandlerValidateMandatory(oForm){
   	var bReturn = true;
	var oElm;
	var strErrorMessage = "";
  	for(var i=0; i<this.arrElements.length; i++){
		if(!bReturn) break;
		oElm = this.arrElements[i];
       	if(oElm.getAttribute("mandatory") == "true"){
			if(String(oElm.getAttribute("type")).search(/text|textarea/) != -1){
				if(oElm.value.length == 0){												
					bReturn = false;					
				}
			}
			else if(String(oElm.getAttribute("type")).search(/radio|checkbox/) != -1){
				if(!oElm.checked){												
					bReturn = false;					
				}				
			}
		}
	}
	if(!bReturn){
		this.showErrorMessage(this.strYouHaveToFillInSomething, oElm);
	}
	return bReturn;
}
// -----------------
function FormToolHandlerValidateFormElements(oForm){
	var bReturn = true;
	var oElm;
	var strElmVal;
	var strValidation;
	var bLeapYear;
	var intYear;
	var intMonth;
	var intDate;
	var arrDaysInMonths = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var strErrorMessage = "";
	for(var i=0; i<this.arrElements.length; i++){
		if(!bReturn) break;
		oElm = this.arrElements[i];
		strValidation = (oElm.getAttribute("validationType"))? oElm.getAttribute("validationType") : false;
        if(strValidation){
			if(strValidation == "date"){
				strElmVal = oElm.value;
				if(strElmVal.search(/^\d{8}$/) != -1){
					strElmVal = strElmVal.substr(0, 4) + "-" + strElmVal.substr(4, 2) + "-" + strElmVal.substr(6, 2);
					oElm.value = strElmVal;
				}
				if(strElmVal.search(/^\d{4}-\d{2}-\d{2}$/) == -1){
					strErrorMessage = this.strYouHaveToEnterDateInThisFormat;					
					bReturn = false;					
				}
				else{
					intYear = strElmVal.substr(0, 4);
					intMonth = strElmVal.substr(5, 2);
					intDate = strElmVal.substr(8, 2);							
					bLeapYear = (intYear % 4 != 0)? false : (intYear % 100 != 0 || intYear % 400 == 0)? true : false;
					if(bLeapYear){
						arrDaysInMonths[1] = 29;
					}
					if(intMonth < 1 || intMonth > 12){
						strErrorMessage = this.strTheMonthNumberCanNotBe + " " + ((intMonth > 12)? this.strHigher : this.strLower) + " " + this.strThan + ((intMonth > 12)? 12 : 1);			
						bReturn = false;
					}
					else if(intDate < 1){
						strErrorMessage = this.strTheDateNumberCanNotBe + " " + this.strLower + " " + this.strThan + " 1";
						this.setFocusAndCSS(oElm);
						bReturn = false;
					}
					else if(intDate > arrDaysInMonths[intMonth-1]){
						strErrorMessage = this.strThisMonthOnlyHas + " " + arrDaysInMonths[intMonth-1] + " " + this.strDays;
						bReturn = false;
					}
				}	
			}
			else if(strValidation == "email"){																		
				if(oElm.value.search(/^[\w-]+(\.?[\w-]+)*@([\w-]+\.)+[a-zA-z]{2,4}$/) == -1){
					strErrorMessage = this.strYouHaveToEnterAValidEmailAddress;					
					bReturn = false;
				}
			}
			else if(strValidation == "number"){																		
				if(oElm.value.search(/\D+/) != -1){
					strErrorMessage = this.strOnlyNumbersInThisField;
					bReturn = false;
				}
			}
		}
	}
	if(!bReturn){
		this.showErrorMessage(strErrorMessage, oElm);
	}
	return bReturn;
}
// -----------------
function FormToolHandlerShowErrorMessage(strMessage, oElm){
	alert(strMessage + ".");
	this.setFocusAndCSS(oElm);	
}
// -----------------
function FormToolHandlerSetFocusAndCSS(oField){        	
	var intOffsetWidth = oField.offsetWidth;
	var intOffsetHeight = oField.offsetHeight;						
	oField.style.border = "1px solid red";
	oField.style.width = intOffsetWidth + "px";
	oField.style.height = intOffsetHeight + "px";
	oField.onchange = function (){
		if(this.value.length > 0){
			this.style.border = "1px solid #7F9DB9";
		}                
	}
	oField.focus();
}
// -----------------
function FormToolHandlerSubmitForm(oSubmitButton){
	this.disableAllOtherFormElements();	
	var bValidatedOk = this.validateMandatory();	
	if(bValidatedOk){
		bValidatedOk = this.validateFormElements();
	}	
	if(bValidatedOk){
		this.oForm.setAttribute("action", oSubmitButton.getAttribute("URLToPostTo"));
		var oEmailRecipients = document.getElementById("emailRecipientsHidden");
		var strRecipients = oSubmitButton.getAttribute("eMailRecipients");
		var bHasRecipients = (strRecipients)? true : false;
		var strEmailSubject = oSubmitButton.getAttribute("emailSubject");
		var strEmailSenderName = oSubmitButton.getAttribute("emailSenderName");
		var strIncludeEntireFormInEmail = oSubmitButton.getAttribute("includeEntireFormInEmail");
		var strSaveAnswers = oSubmitButton.getAttribute("saveAnswers");
		if(bHasRecipients){
			this.createFormElement("eMailRecipientsHidden", "hidden", strRecipients);
			this.createFormElement("emailSubjectHidden", "hidden", strEmailSubject);
			this.createFormElement("emailSenderNameHidden", "hidden", strEmailSenderName);
			this.createFormElement("includeEntireFormInEmailHidden", "hidden", strIncludeEntireFormInEmail);
			this.createFormElement("saveAnswersHidden", "hidden", strSaveAnswers);
		}
		this.oForm.submit();
	}			
	//return bValidatedOk;
}
// -----------------