/*
********************************************************
T&G Insurance - Step 1 Functionality & Form Validation 
Created on: 08/02/2007
Development by: Socialfabric Ltd
********************************************************
*/

function applyOnSubmitToForms()
{
    var elementsFormStep = document.getElementById("frmStep");
    
	if (elementsFormStep!=null){  
        elementsFormStep.onsubmit = function ()
	    {	    
		    if (!validateForm(elementsFormStep)){return false;}			
        }
    }
     
    // note only applied if form is available on page
    elementsFormLogin = document.getElementById("frmLogin");		
    if (elementsFormLogin !=null){
  	    elementsFormLogin.onsubmit = function ()
	    {	    
		    if (!validateLogin(elementsFormLogin)){return false;}			
        }  
    }
}	

function applyOnFocusToForms()
{
    var elementOptions = document.getElementById("grp_type");
    var elementsInput = elementOptions.getElementsByTagName("input");
    
    if (elementOptions!=null){
        for (var intCounter = 0; intCounter < elementsInput.length; intCounter++)
        {
            elementsInput[intCounter].onclick = function () {applyFormatOnForm(); }
        }
    }
    
                        
    var elementJDate = document.getElementById("jdate");
    if (elementJDate!=null){       
        elementJDate.onfocus = function JDate_onFocus() {
            
            var fieldset = Tools.getLastChild(this.parentNode.parentNode.parentNode.parentNode, function (node) {
                                        return (Tools.isElement(node) &&
                                        ((node.nodeName == 'FIELDSET') || (node.nodeName == 'fieldset')));
                                        });
            var label =	Tools.getLastChild(this.parentNode, function (node) {
                                return (Tools.isElement(node) &&
                                ((node.nodeName == 'LABEL') || (node.nodeName == 'label')));
                                });
                    
            if (label !=null) { label.style.fontWeight = "bold"; } 
            if (fieldset !=null) { fieldset.className = "fieldsetHighlight"; }
            
            if (elementJDate.value == 'dd/mm/yyyy'){
                elementJDate.value='';
               }
            }
    }
    
    var elementRDate = document.getElementById("rdate");
    if (elementRDate!=null){       
        elementRDate.onfocus = function RDate_onFocus() {
        
            var fieldset = Tools.getLastChild(this.parentNode.parentNode.parentNode.parentNode, function (node) {
                                        return (Tools.isElement(node) &&
                                        ((node.nodeName == 'FIELDSET') || (node.nodeName == 'fieldset')));
                                        });
            var label =	Tools.getLastChild(this.parentNode, function (node) {
                                return (Tools.isElement(node) &&
                                ((node.nodeName == 'LABEL') || (node.nodeName == 'label')));
                                });
                    
            if (label !=null) { label.style.fontWeight = "bold"; } 
            if (fieldset !=null) { fieldset.className = "fieldsetHighlight"; }
            
            if (elementRDate.value == 'dd/mm/yyyy'){
                elementRDate.value='';                 
               }
            }
    }
    
    var elementCDate = document.getElementById("cdate");
    if (elementCDate!=null){       
        elementCDate.onfocus = function CDate_onFocus() {
        
            var fieldset = Tools.getLastChild(this.parentNode.parentNode.parentNode.parentNode, function (node) {
                                        return (Tools.isElement(node) &&
                                        ((node.nodeName == 'FIELDSET') || (node.nodeName == 'fieldset')));
                                        });
            var label =	Tools.getLastChild(this.parentNode, function (node) {
                                return (Tools.isElement(node) &&
                                ((node.nodeName == 'LABEL') || (node.nodeName == 'label')));
                                });
                    
            if (label !=null) { label.style.fontWeight = "bold"; } 
            if (fieldset !=null) { fieldset.className = "fieldsetHighlight"; }
            
            if (elementCDate.value == 'dd/mm/yyyy'){
                elementCDate.value='';
               }
            }
    }
    
    // note only applied if form is available on page
    var elementsFormLogin = document.getElementById("frmLogin");		
    if (elementsFormLogin !=null){
        var elementsUser = document.getElementById("liuser");
        var elementsPassword = document.getElementById("lipassword");
        	
  	    elementsUser.onfocus = function ()
	    {	    
		    elementsUser.value = '';		
        } 
        
        elementsPassword.onfocus = function ()
	    {	    
		    elementsPassword.value = '';		
        }
    }
     
}

function updateDays(){

    var elementNumdays = document.getElementById("numdays");
    var elementJDate = document.getElementById("jdate");
    var elementRDate = document.getElementById("rdate");
    var minutes = 1000*60;
    var hours = minutes*60;
    var days = hours*24;
    
    // check the dates are valid
    if (elementJDate !=null && elementRDate !=null){
        if (!(validateDate(elementJDate)) && !(validateDate(elementRDate))){
            
            var aArrayRDate = elementRDate.value.split("/");
            var aArrayJDate = elementJDate.value.split("/");
            var sDepartDate = new Date(aArrayJDate[2],(aArrayJDate[1]-1),aArrayJDate[0]);
            var sReturnDate = new Date(aArrayRDate[2],(aArrayRDate[1]-1),aArrayRDate[0]);
            
            // only apply so the days are positive numbers
            if (sReturnDate >= sDepartDate){
                var dif = ((sReturnDate - sDepartDate)/days) + 1;
                elementNumdays.value = Math.round(dif);
            }
            else
            {
                elementNumdays.value = ''; //null
            }     
        }
    }
}


function updateReturn(){
    var elementReturn = document.getElementById("return");
    var elementCDate = document.getElementById("cdate");
    
    if (elementReturn!=null && elementCDate!=null){
        if (!(validateDate(elementCDate))){
        
            var aArrayDate = elementCDate.value.split("/");
            var sDepartDate = new Date(parseInt(aArrayDate[2]),(aArrayDate[1]-1),aArrayDate[0]);
            //var sReturnDate = new Date(sDepartDate.getTime() + 365*24*60*60*1000);
			// Better for leap years
			var sReturnDate = new Date((parseInt(aArrayDate[2]) + 1),(aArrayDate[1]-1),aArrayDate[0]);
			sReturnDate.setDate(sReturnDate.getDate() - 1);

                        
            var iToDay = sReturnDate.getDate();
		    var iToMonth = sReturnDate.getMonth() + 1;
		    var iToYear = sReturnDate.getYear();

            // format date dd/mm/yyyy
		    if(iToDay < 10){var iToDay = "0" + iToDay;}
		    if(iToMonth <= 9){iToMonth = "0" + iToMonth;}
		    iToYear = y2k(iToYear);

            // set return date
	        var sToDate = iToDay + '/' + iToMonth + '/' + iToYear;
            elementReturn.innerHTML = '<span>End <strong>' + sToDate + '</strong></span>';
            }
    }
}
 
function applyOnChangeToForms()
{
    var elementNumdays = document.getElementById("numdays");
    var elementJDate = document.getElementById("jdate");
    var elementRDate = document.getElementById("rdate");
    var elementCDate = document.getElementById("cdate");
    
    if (elementCDate!=null){
        elementCDate.onchange = function () {updateReturn(); return checkDateValid(elementCDate);}
    }
            
    if (elementJDate!=null){
        elementJDate.onchange = function () {updateDays(); return checkDateValid(elementJDate);}
    }
    
    if (elementRDate!=null){
        elementRDate.onchange = function () {updateDays(); return checkDateValid(elementRDate);}
    }
    
    if (elementNumdays!=null){
        elementNumdays.onchange = function () {
             if (checkDaysValid(elementNumdays)){
                recalcDate();
             }
         }
    }
}

    
function applyFormatOnForm(){
    
    // travelling options
    var elementOptions = document.getElementById("travelling_options");
    var elementsLI = elementOptions.getElementsByTagName("li");
    
    // group options
    var elementGroupType = document.getElementById("grp_type");
    var grouptype = elementGroupType.getElementsByTagName("input");
    
    if (elementGroupType!=null){
        for (counter = 0; counter < grouptype.length; counter++)
        {
            for (var intCounter = 0; intCounter < elementsLI.length; intCounter++)
            {
                if (grouptype[counter].checked){ 
				    // JC changed from 'family' - 09-10-07 allow for 'group'
                    if (grouptype[counter].value == '3' || grouptype[counter].value == '4'){
	                    if (elementsLI[intCounter].className == "child")
	                    {
		                    elementsLI[intCounter].style.display = "block"; // show items
	                    }	        
	                }
	                else 
	                    {
	                        if (elementsLI[intCounter].className == "child"){
	                            elementsLI[intCounter].style.display = "none"; // hide items
	                            var elementInput = elementsLI[intCounter].getElementsByTagName("input")[0];
	                            if (elementInput!=null){
	                                elementInput.value=''; //reset value if hidden
	                                }
	                        }
	                    }
	             }
	        }
	    }
	}
}

function validateForm(currentForm)
{
    var blnvalidate = true;
	var elementsInputs;
	var elementsSelects;
	var elementNumdays = document.getElementById("numdays");
    var elementJDate = document.getElementById("jdate");
    var elementRDate = document.getElementById("rdate");
    var elementDestination = document.getElementById("destination");
    var hiddenEarliestDate = document.getElementById("earliest_start");
    var hiddenLatestDate = document.getElementById("latest_start");
    var hiddenMaxDuration = document.getElementById("maximum_duration");
    errorMsg = '';	
    
	elementsInputs = currentForm.getElementsByTagName("input");
	elementsSelects = currentForm.getElementsByTagName("select");
 
    //destination
    if (elementDestination !=null)
        {
            elementDestination.style.backgroundColor = normal;
   
            if (validateSelectBox(elementDestination, null, null))
            {
	            blnvalidate = errorHandler(elementDestination, "Please select a valid destination.");			    
            }
        }	    
	   
    //input boxes
    for (var intCounter = 0; intCounter < elementsInputs.length; intCounter++)
    {
	    resetFormatOnForms(elementsInputs[intCounter]); // clears form formatting
	    
	    if (elementsInputs[intCounter].className == "reqdatefrom")
	    {
	        if (validateDate(elementsInputs, intCounter, null))
		    {
			    blnvalidate = errorHandler(elementsInputs[intCounter], "Please enter a valid departure date. (dd/mm/yyyy)");			    
		    }
	    }
	    else if (elementsInputs[intCounter].className == "reqdateto")
	    {
	        if (validateDate(elementsInputs, intCounter, null))
		    {
		        blnvalidate = errorHandler(elementsInputs[intCounter], "Please enter a valid return date. (dd/mm/yyyy)");
		    }
	    }
	    else if (elementsInputs[intCounter].className == "reqquestion")
	    {
	        if (validateCheckBox(elementsInputs, intCounter, false))
		    {
		        var label =	Tools.getFirstChild(elementsInputs[intCounter].parentNode, function (node) {
                                        return (Tools.isElement(node) &&
                                        ((node.nodeName == 'LABEL') || (node.nodeName == 'label')));
                                        });
                var q;                                        
                if (label != null)
		        {
			        q = replaceTags(label.innerHTML); 
			    } 
			    else
			    {
			        q = "Please ensure you have answered All additional questions."; 
			    }
			      
			    blnvalidate = errorHandler(elementsInputs[intCounter], q);
		        
		    }
	    }
    }
    
    // select boxes
    for (var intCounter = 0; intCounter < elementsSelects.length; intCounter++)
    {
        
        if (elementsSelects[intCounter].className == "reqquestion")
	    {
	    	resetFormatOnForms(elementsSelects[intCounter]); // clears form formatting
	    	    
	        if (validateSelectBox(elementsSelects, intCounter, false))
		    {
		        var label =	Tools.getFirstChild(elementsSelects[intCounter].parentNode, function (node) {
                                        return (Tools.isElement(node) &&
                                        ((node.nodeName == 'LABEL') || (node.nodeName == 'label')));
                                        });
                var q;                                        
                if (label != null)
		        {
			        q = replaceTags(label.innerHTML); 
			    } 
			    else
			    {
			        q = "Please ensure you have answered All additional questions."; 
			    }
			      
			    blnvalidate = errorHandler(elementsSelects[intCounter], q);
		        
		    }
	    }
    }
    
    // check the date ranges as per scheme
    // notice: hidden values are pulled from database dependant on scheme cover.
    if (elementJDate !=null && elementRDate !=null){
        if (!(validateDate(elementJDate)) && !(validateDate(elementRDate))){
        
            var iDays = hiddenMaxDuration.value - 1;
            var aArrayRDate = elementRDate.value.split("/");
            var aArrayJDate = elementJDate.value.split("/");
            var aArrayEarliestDate = hiddenEarliestDate.value.split("/");
            var aArrayLatestDate = hiddenLatestDate.value.split("/");
			var tempYear;
            
            // create javascript dates from form inputs
			tempYear = parseInt(aArrayJDate[2], 10);
			if (tempYear < 80)
			    tempYear = tempYear + 2000;
            //var sDepartDate = new Date(aArrayJDate[2],(aArrayJDate[1]-1),aArrayJDate[0]);
            var sDepartDate = new Date(tempYear,(aArrayJDate[1]-1),aArrayJDate[0]);
			//alert(sDepartDate);
			tempYear = parseInt(aArrayRDate[2], 10);
			if (tempYear < 80)
			    tempYear = tempYear + 2000;
            //var sReturnDate = new Date(aArrayRDate[2],(aArrayRDate[1]-1),aArrayRDate[0]);
            var sReturnDate = new Date(tempYear,(aArrayRDate[1]-1),aArrayRDate[0]);
			//alert(sReturnDate);
            var sEarliestDate = new Date(aArrayEarliestDate[2],(aArrayEarliestDate[1]-1),aArrayEarliestDate[0]);
            var sLatestDate = new Date(aArrayLatestDate[2],(aArrayLatestDate[1]-1),aArrayLatestDate[0]);
                   
            // check date ranges
            if (sDepartDate > sReturnDate){
                blnvalidate = errorHandler(elementJDate, 'The departure date cannot be after the return date.');            
            }
            
            if (sDepartDate < sEarliestDate){
                blnvalidate = errorHandler(elementJDate, 'The departure date is less than the earliest date allowed.');            
            }
            
            if (sDepartDate > sLatestDate){
                blnvalidate = errorHandler(elementJDate, 'The departure date is greater than the latest date allowed.');            
            }
            
            // max duration check
            //var sCompareDate = new Date(sDepartDate.getTime() + iDays*24*60*60*1000);
			tempYear = parseInt(aArrayRDate[2], 10);
			if (tempYear < 80)
			    tempYear = tempYear + 2000;
            //var sCompareDate = new Date(aArrayJDate[2],(aArrayJDate[1]-1),aArrayJDate[0]);
            var sCompareDate = new Date(tempYear,(aArrayJDate[1]-1),aArrayJDate[0]);
            sCompareDate.setDate(sDepartDate.getDate() + iDays);
            if (sReturnDate > sCompareDate){
                blnvalidate = errorHandler(elementRDate, 'The return date is greater than the maximum (' + hiddenMaxDuration.value + ' days) duration allowed.');            
            }
        }
    }
                
    if (blnvalidate != true){alertmsg(errorMsg);}
	return blnvalidate;	
}

// load and attach events
addLoadEvent(presentForm);	
addLoadEvent(applyOnSubmitToForms);
addLoadEvent(applyOnFocusToForms);
addLoadEvent(applyOnChangeToForms);
addLoadEvent(applyFormatOnForm);
addLoadEvent(initCustomErrors);
addLoadEvent(updateReturn);
addLoadEvent(initCalendars);


          

