/*
	ValidateDates.JS
	validates the flights search
*/
    var HOURS = 1000*60*60;
    function ValidateDates(frmSearch)
    {
	    var startPrefix = getStartPrefix(frmSearch);
        var endPrefix = getEndPrefix(frmSearch);   	           
         
        // get the start date field and work out if its 3 days or later
        var elmItem1 = frmSearch.startDateD;
        var elmItem2 = frmSearch.startDateMY;
        
        if (elmItem1 == null || elmItem1 == "") 
        	elmItem1 = document.getElementById(startPrefix+'CalD');
        if (elmItem2 == null || elmItem2 == "") 
            elmItem2 = document.getElementById(startPrefix+'CalMY');

        var startD8 = getValidDateObj(elmItem1.value,elmItem2.value);

        if(!isValidDate(startD8,startPrefix)){
            elmItem1.focus();
                return false;
        }

        var isReturn;
        if (frmSearch.returnValue != null) { // For the main search form
            isReturn = frmSearch.returnValue.value == 'true';
        } else if (frmSearch.returnFlight != null) { // For the affiliate iframe
            isReturn = frmSearch.returnFlight[0];
        } else {
            isReturn = true;
        }
        if (isReturn) {
            
            elmItem1 = frmSearch.endDateD;
            elmItem2 = frmSearch.endDateMY;
            
            if (elmItem1 == null || elmItem1 == "") 
            	elmItem1 = frmSearch.endCalD
            if (elmItem2 == null || elmItem2 == "") 
                elmItem2 = frmSearch.endCalMY
    
            if(elmItem1 != null){
                var endD8 = getValidDateObj(elmItem1.value,elmItem2.value);
    
                if(!isValidDate(endD8,endPrefix)){
                    elmItem1.focus();
                            return false;
                }
    
                if(startD8.getTime()+(HOURS*24)>endD8.getTime()){
                        alert("Please select a return date which is after the Departure Date.");
                        elmItem1.focus();
                            return false;       
                }
            }
        }
        
        return true ;
    }
    function validateEqualDates(frmSearch)
    {
	    var startPrefix = getStartPrefix(frmSearch);
    	if(frmSearch.returnValue != undefined && frmSearch.returnValue != null){
			if(frmSearch.returnValue.value != 'true'){
				return true;
			}
		}
        var elmItem1;
        var elmItem2;

        // get the start date field and work out if its 3 days or later
        elmItem1 = frmSearch.startDateD;
        elmItem2 = frmSearch.startDateMY;

        var startD8 = getValidDateObj(elmItem1.value,elmItem2.value);

        if(!isValidDate(startD8,startPrefix)){
            elmItem1.focus();
                return false;
        }
           
            elmItem1 = frmSearch.endDateD;
            elmItem2 = frmSearch.endDateMY;
    
            if(elmItem1 != null){
                var endD8 = getValidDateObj(elmItem1.value,elmItem2.value);
    
                if(startD8.getTime()==endD8.getTime()){
                       
                            return confirm("You're going out and back on the same day, is this intentional?")     
                }
            }             
        return true ;
    }

    function isValidDate(d8,prefix){
        var minimumDateMillis = eval(prefix+"MinDateMillis");
        
        if(minimumDateMillis==null){
            //alert("null");
            var nowD8 = new Date();
            minimumDateMillis = nowD8.getTime()+(HOURS*72);//default to 3 days ahead
        }
        
        if(minimumDateMillis > d8.getTime() + (23*HOURS)){
            var valDate=new Date(minimumDateMillis);
            alert("Please select "+prefix+" date after "+getDateStringFromDate(valDate));
            return false;
        }
        
        var maximumDateMillis = eval(prefix+"MaxDateMillis");
        
        if(maximumDateMillis==null){
            //alert("null");
            var nowD8 = new Date();
            maximumDateMillis = nowD8.getTime()+(HOURS*24*365);//default to a year
        }
        
        if(maximumDateMillis < d8.getTime()){
            var valDate=new Date(maximumDateMillis);
            alert("Please select "+prefix+" date before "+getDateStringFromDate(valDate));
            return false;
        }       
        return true;
    }
    
    function getDateStringFromDate(d){
        return d.getDate() + ' ' + months[d.getMonth()] + ' ' + d.getFullYear();
    }   
    
	function getValidDateObj(D,MY){
        var fy=MY.substring(MY.indexOf("-")+1);
        var mSelect=0;
        var monthName=MY.substring(0,MY.indexOf("-"));
        for(var i=0;i<months.length;i++){
            var srch=months[i].substring(0,3);
            if(srch.toLowerCase()==monthName.toLowerCase()){
                mSelect=i;
                break;
            }
    	}
        if(D.length<2){D="0"+D};
        if(mSelect<10){mSelect="0"+mSelect;}
        var mm = mSelect;
        var dd = D;
        var yy = fy; //.substring(2,4);
        var dateStr=yy+", "+mm+", "+dd;
        var newD8;
        try{
            newD8 = new Date(yy,mm,dd);
        }
        catch(e){
            alert("Invalid date object '"+dateStr+"' please select a real date.");
        }
        return newD8;
}	
	function getStartPrefix(frmSearch){
		var formId = frmSearch.id;
		var startPrefix;
		if(formId == 'hotelSearch' ){
			startPrefix = 'accomstart';
		}else if(formId == 'transferSearch'){
			startPrefix = 'transferstart';
		}else if(formId == 'flightSearch'){	
			startPrefix = 'flightstart';
		}else if(formId == 'eurostarSearch'){	
			startPrefix = 'eurostarstart';
		}else if(formId == 'cruiseFlightSearch'){	
			startPrefix = 'cruiseflightstart';
		}else if(formId == 'accomLocationSearch'){	
			startPrefix = 'accomArr';
		}else if(formId == 'flightsLocationSearch'){	
			startPrefix = 'flightsDep';
		}else{
			startPrefix = 'start';
		}
		return startPrefix;
	}

	function getEndPrefix(frmSearch){
		var formId = frmSearch.id;
		var endPrefix;
		if(formId == 'hotelSearch' ){
			endPrefix = 'accomend';
		}else if(formId == 'transferSearch'){
			endPrefix = 'transferend';
		}else if(formId == 'flightSearch'){	
			endPrefix = 'flightend';
		}else if(formId == 'eurostarSearch'){	
			endPrefix = 'eurostarend';
		}else if(formId == 'cruiseFlightSearch'){	
			endPrefix = 'cruiseflightend';
		}else if(formId == 'accomLocationSearch'){	
			endPrefix = 'accomRet';
		}else if(formId == 'flightsLocationSearch'){	
			endPrefix = 'flightsRet';
		}else{
			endPrefix = 'end';
		}
		return endPrefix;	
	}

	function ValidateAccommodationDates(frmSearch, basketAccommodationDates)
    {
	    if(basketAccommodationDates != null){
		    var startPrefix = getStartPrefix(frmSearch);
	        var endPrefix = getEndPrefix(frmSearch);   	           
	         	       
        	dateD = document.getElementById(startPrefix+'CalD');
        	dateMY = document.getElementById(startPrefix+'CalMY');	    	        	
	        var searchedStartDate = getValidDateObj(dateD.value, dateMY.value);	        
	        var searchedEndDate; 
	        
	        if(frmSearch.duration != null){
	        	searchedEndDate = new Date(searchedStartDate.getTime() + (frmSearch.duration.value * 1000 * 60 * 60 * 24));
	        }else{
	        	dateD = document.getElementById(endPrefix+'CalD');
	        	dateMY = document.getElementById(endPrefix+'CalMY');
	        	searchedEndDate = getValidDateObj(dateD.value, dateMY.value);
	        }
	        var validated = true;
	        //check it doesn't fall within the date range of an accommodation in the basket
	        for(var i=0; i < basketAccommodationDates.length; i++){
	            var basketStartDate = basketAccommodationDates[i][0];
	            var basketEndDate = basketAccommodationDates[i][1];
	                                   
	            if((searchedStartDate.getTime() >= basketStartDate.getTime()) && (searchedStartDate.getTime() < basketEndDate.getTime())){
	            	validated = false;
	            }
	            
	            if((searchedEndDate.getTime() > basketStartDate.getTime()) && (searchedEndDate.getTime() < basketEndDate.getTime())){
	            	validated = false;
	            }
	            
	            if(!validated){
	            	alert("Your search dates conflict with a hotel in your Basket.");
	            	return false;
	            }
			}	
	    }                             	
    	return true;
    }
	
	function getBasketAccommodationDates(dateString) {		
		var dateStringArray = dateString.split(",");

		var dateArray = new Array(dateStringArray.length);
		for(var j=0; j < dateStringArray.length; j++){
			var dateComponentArray = dateStringArray[j].split("/");
			dateArray[j] = new Date(dateComponentArray[2], (parseInt(dateComponentArray[1], 10)-1)+'', dateComponentArray[0]);
		}

		if(dateArray.length < 2){
			return null;
		}
		
		var arraySize = dateArray.length / 2;
		var multiArray = new Array(arraySize);
		var iterator = 0;
		for(var i=0; i < arraySize; i++){
			multiArray [i] = new Array(2);
			multiArray [i][0] = dateArray [iterator];
			multiArray [i][1] = dateArray [iterator+1];
			iterator +=2;
		}
		return multiArray;
	}
	
