// JScript File

// BEGIN - needed for calendar ------------------------------
// set the launch date and max days of allowed booking after launch or current date
var maxDays = 350;  // SET THE AMOUNT OF DAYS FROM TODAY TO HAVE ENABLE FOR BOOKINGS HERE
var launchDay = 25; // SET THE LAUNCH DAY
var launchMonth = 1; // SET THE LAUNCH MONTH
var launchYear = 2007; // SET THE LAUNCH YEAR

// needs to be kept same as few other sizes and offsets - do a search for the size ex 183 atm
var iframeOffset = 145;

// date vars to set today and valid booking ranges
var CalStart = new Date();
var CalEnd = new Date();

var today = new Date();
var launchDate = new Date();
var finishDate = new Date();

var dateArray = new Array();

var translatedMonth = new Array();
	
switch(lang)
{
	case 'en':
		translatedMonth = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
		break;
	case 'se':
		translatedMonth = ['Jan', 'Feb', 'Mars', 'Apr', 'Maj', 'Juni', 'Juli', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
		break;
	default:
		// lang=fi
		translatedMonth = ['Tammi', 'Helmi', 'Maalis', 'Huhti', 'Toukokuu', 'Kesa', 'Heina', 'Elo', 'Syys', 'Loka', 'Marras', 'Joulu'];
}

// sets today and launchdate
today.setDate(today.getDate() - 1);
launchDate.setDate(launchDay - 1);
launchDate.setMonth(launchMonth - 1);
launchDate.setFullYear(launchYear);

// adds or subtracts days to/from an date object even if days are outside range [-128;127] which causes errors on MAC 
function addDays(date, days)
{
    // if out of range (use [-100;100] instead of [-128;127], easier to handle math)
    if(days > 100 || days < -100)
    {
        var times = Math.floor(Math.abs(days) / 100);
        var res = Math.abs(days) % 100;
        for(counter = 0; counter < times; counter++)
        {
            if(days > 0)
                date.setDate(date.getDate() + 100);
            else
                date.setDate(date.getDate() - 100);
        }
        if(days > 0)
            date.setDate(date.getDate() + res);
        else
            date.setDate(date.getDate() - res);
    }
    else
    {
        date.setDate(date.getDate() + days);
    }
    return date;
}

// has launchdate been reached?
if (today < launchDate)
{
    //start at launchdate
    CalStart.setDate(launchDate.getDate());
    CalStart.setMonth(launchDate.getMonth());
    CalStart.setFullYear(launchDate.getFullYear());
    //end at launch + maxDays
    finishDate = launchDate;
    // Safari setDate() Bug
    // ====================
    // Safari's Date.setDate() function appears to be limited
    // to a single byte number, making the range of date changes
    // between -128 and 127.
    finishDate = addDays(finishDate, maxDays);
    CalEnd = finishDate;
}
else
{
    //start at today
    CalStart = new Date();
    CalStart.setDate(CalStart.getDate() - 1);
    //end in today + maxDays
    finishDate = new Date();
    finishDate.setDate(finishDate.getDate() + maxDays - 1);
    CalEnd = finishDate;
}

//CalEnd.setDate(2);
//CalEnd.setMonth(1);
//CalEnd.setFullYear(2009);

// if departure date has not been set and return date has been set, set departure date to be same as return date
function checkDepart()
{
    if (document.forms['formsilverjet'].elements['departuredate'].value=="Enter date" && document.forms['formsilverjet'].elements['returndate'].value != "Enter date")
    {
        document.forms['formsilverjet'].elements['departuredate'].value=document.forms['formsilverjet'].elements['returndate'].value;
    }
}

// sets the 1st day of the week. 0 = Sunday; 1 = Monday ... ...6 = Saturday
function GetDayofWeekStart()
{
    return 1; // start of week on monday
}

function GetDateFormat() 
{
    return "ddmmmyyyy"; //only format fully implemented currently - do not change
}

function GetDateSeperator()
{
    return " "; // see GetDateFormat - do not change
}

// along with GetDateFormat() this converts to the wanted date format for Videcom
// months are from Jan = 1 to Dec = 12 [1,12]
function convertMonth(theMonth)
{   
    //return theMonth;
    switch (theMonth)
    {
        case 1:							return translatedMonth[0];
        case 2:							return translatedMonth[1];
        case 3:							return translatedMonth[2];
        case 4:							return translatedMonth[3];
        case 5:							return translatedMonth[4];
        case 6:							return translatedMonth[5];
        case 7:							return translatedMonth[6];
        case 8:							return translatedMonth[7];
        case 9:							return translatedMonth[8];
        case 10:						return translatedMonth[9];
        case 11:						return translatedMonth[10];
        case 12:						return translatedMonth[11];
        case translatedMonth[0]:		return "1";
        case translatedMonth[1]:		return "2";
        case translatedMonth[2]:		return "3";
        case translatedMonth[3]:		return "4";
        case translatedMonth[4]:		return "5";
        case translatedMonth[5]:		return "6";
        case translatedMonth[6]:		return "7";
        case translatedMonth[7]:		return "8";
        case translatedMonth[8]:		return "9";
        case translatedMonth[9]:		return "10";
        case translatedMonth[10]:		return "11";
        case translatedMonth[11]:		return "12";
        default:						return;
    }
}

// gets element by id
function getElement(iD)
{
    return document.getElementById(iD);
}

// gets object by its id
function getObject(objID)
{
	if (document.getElementById)
	    return document.getElementById(objID);
}

function getFormattedDate(theDate)
{
    var dateStr;
    var dateSeperator = GetDateSeperator();
	var dateFormat = GetDateFormat();
	
    if(dateFormat == "ddmmmyyyy")
    {
        dateStr = theDate.getDate() + dateSeperator + convertMonth(theDate.getMonth()+1) + dateSeperator + theDate.getFullYear();
    }
    else
    {
        alert("date format error; only ddmmmyyyy is implemented currently");
    }
    
    return dateStr;
}

// sets the calendar date according to the getdateformat function
function CalDateSet(calInput,day,month,year,giveFocus)
{
	var dateSeperator = GetDateSeperator();
	var dateFormat = GetDateFormat();
	
	if (dateArray[calInput.id] == null) 
	{
	    dateArray[calInput.id] = new Date();
	}
	dateArray[calInput.id].setFullYear(year,month-1,day);

    calInput.value = getFormattedDate(dateArray[calInput.id]);
    
	if(!giveFocus)
	    CalSetFocus(calInput);
}

// some more global vars for Calendar events, ranges ect
var nextFocus;
var focusCalendar = false;
var calWaitId = 0;
var calendarShown = false; 
var calFrameObj = null;
var calFrameObjW = null;
var curDateMin, curDateMax;
var current_cP, current_eD, current_eDP;

// checks if it is a leap year
function IsLeapYear(theYear)
{
    if(0 == theYear % 4 && ((theYear % 100 != 0) || (theYear % 400 == 0)))
        return true;
    else
        return false;
}

// gets the amount of days in a month
function GetMonthCount(theYear, theMonth)
{
    var monthDays = new Array(12);
    var result = 0;

    // set the amount of days per month
    monthDays[0] = 31;
    monthDays[1] = 28;
    monthDays[2] = 31;
    monthDays[3] = 30;
    monthDays[4] = 31;
    monthDays[5] = 30;
    monthDays[6] = 31;
    monthDays[7] = 31;
    monthDays[8] = 30;
    monthDays[9] = 31;
    monthDays[10] = 30;
    monthDays[11] = 31;

    var result = monthDays[theMonth];
    if((theMonth == 1) && IsLeapYear(theYear))
    {
        result++;
    }
    return result;
}

// cancel the calendar
function CancelCalendar()
{
    // reset timeout on a window set by setTimeout
    clearTimeout(calWaitId);
    // get the iframe calframe
    if(!calFrameObj)
        calFrameObj = getObject('CalFrame');
    //set style as hidden
    calFrameObj.style.visibility = "hidden";
    //set flag as false as style was changed to hidden
    calendarShown = false;
}

// wait for input or time out
function WaitForCalendar()
{ 
    if(calFrameObjW) {}
    else
        calFrameObjW = frames['CalFrame'];
    if(calFrameObjW == null || calFrameObjW.calendarLoadFlag == null || calFrameObjW.calendarLoadFlag == false)
    {
        // set timer for function to wait before running
	    calWaitId = setTimeout("WaitForCalendar()", 200);
	}
    else
    {
        if(calFrameObj) {}
        else
            calFrameObj = getObject('CalFrame');
        // set hidden
	    calFrameObj.style.visibility = "hidden";
	    setTimeout("DoCalendar()",1);
	}
}

// calls the frame and positions it
function DoCalendar()
{
    PositionCalendar(current_cP);
    // test if object is set
    if(!calFrameObjW)
        // set obj
        calFrameObjW = frames['CalFrame'];
    // call DoCalendar() from the iframe - situated in FloatingCalendar.js
    var showMonths = 1; // gup('show-months');
    calFrameObjW.DoCalendar(current_eD,current_eDP,curDateMax,curDateMin,showMonths);
}

// shows the calendar and then waits for input
function ShowCalendar(el,eDP,dateMax,dateMin)
{
    // reset timeout on a window set by setTimeout
    clearTimeout(calWaitId);
    // if already focused then set focus to false
    if(focusCalendar)
    {
        focusCalendar=false;
        return;
    }
    // already showing
	if(calendarShown && el == current_eD)
	{
	    return;
	}
	calendarShown = true;
    // set current global vars
    current_eDP = eDP;
    curDateMin = dateMin;
    curDateMax = dateMax;
    current_cP = current_eD = el;
    // wait for user
    WaitForCalendar();
}

// made this function so that we can have a setimeout tied to it after setfocus
function EndCalFocus()
{
    focusCalendar = false;
}

function PositionCalendar(calEle)
{
	// set these for global absolute positioning of Calendar
	var elementLeft = 0;
	var elementTop = 0;
	
	elementLeft += 0;
	elementTop += -(iframeOffset+22); // so that it can be easily adjusted
	
    if(calFrameObj) {}
    else
        calFrameObj=getObject('CalFrame');
	for(var element = calEle; element && element.tagName != 'BODY'; element = element.offsetParent)
	{
	    elementTop += element.offsetTop;
	    elementLeft += element.offsetLeft;
	    
	}
	
	var calFrameHeight = parseInt(calFrameObj.style.height);
	var elementHeight = calEle.offsetHeight;
	var scrollTopValue = 0;
	
	// gets the scroll top if set
	if(document.body.scrollTop) 
	    scrollTopValue = document.body.scrollTop;
	if(document.documentElement.scrollTop)
	    scrollTopValue = document.documentElement.scrollTop;
	if(window.pageYOffset) 
	    scrollTopValue = window.pageYOffset;
	    
	var windowHeight = 0;
	
	// gets the window height if set
	if(document.body.clientHeight) 
	    windowHeight = document.body.clientHeight;
	if(window.innerHeight) 
	    windowHeight = window.innerHeight;
	if(document.documentElement.clientHeight) 
	    windowHeight = document.documentElement.clientHeight;
	
	// adjust accordingly
	if(elementTop - calFrameHeight >= scrollTopValue && elementTop + elementHeight + calFrameHeight > windowHeight + scrollTopValue)
	    elementTop -= calFrameHeight;
	else 
	    elementTop += elementHeight;
	    
	// set the position now
	calFrameObj.style.top = elementTop + 'px';
	calFrameObj.style.left = elementLeft + 'px';
}

//sets calendarShown flag, used by floatingcalendar.js functions
function SetCalShown(isCalShown)
{
    calendarShown = isCalShown;
}

// set calendar focus
function CalSetFocus(element)
{
    if(element)
    {
        element.focus();
        focusCalendar = true;
        // wait
        setTimeout("EndCalFocus()", 200);
     }
}

function DefYear(d, m)
{
    var dateObj = new Date();
    var yearCentury = (dateObj.getYear() < 1000) ? 1900 + dateObj.getYear() : dateObj.getYear();
    
    if(m < dateObj.getMonth() || (m == dateObj.getMonth() && d < dateObj.getDate()))
        yearCentury++;
    return yearCentury;
}

// converts the input date string into a propper date type for manipulations by calendar
function GetInputDate(dateString)
{
    var dateSeperator = GetDateSeperator();
    var m,d,y;
    var dateFormat = GetDateFormat();
    
	if(!dateString.length)
	    return null;
	
	var tempRgt = dateString.split(dateSeperator,3);
	var rgt = dateString.split(dateSeperator,3);
	
	tempRgt[1] = Number(convertMonth(tempRgt[1]));
	
	dateString = dateString.replace(/\s+/g,"");
	
	rgt[1] = tempRgt[1];
	rgt[2] = tempRgt[2];
	
	for(var i = 0; i < rgt.length; i++) rgt[i] = parseInt(rgt[i],10);
	if(!rgt[1])
	{
	    return null;
	}
	
	if(dateFormat == "yymmdd") //not implemented
	{
	    if(!rgt[2])
	        return null;
	    m = rgt[1];
	    d = rgt[2];
	    y = rgt[0];
	}
	else
	{
	    if(dateFormat == "mmddyy") //not implemented
	    {
	        m = rgt[0];
	        d = rgt[1];
	    }
	    else
	    {
	        m = tempRgt[1];
	        d = rgt[0];
	    }//dateFormat=="ddmmmyyyy"
	    if(rgt[2])
	        y = rgt[2];
	    else
	        y = DefYear(d, m - 1);
	}
	m -= 1;
	if(y < 100)
	    y += 2000;
	if(y < 1601 || y > 4500 || m < 0 || m > 11 || d < 1 || d > GetMonthCount(y, m))
	    return null;
	return new Date(y, m, d);
}

//update element value
function UpdDt(elem)
{
    //get the return and depart elements     
    switch(elem.id)
    {
        case "returndate":
            var ret = getElement('returndate');
            var dep = getElement('departuredate');
            break;
        case "departuredate":
            var ret = getElement('returndate');
            var dep = getElement('departuredate');
            break;
        case "returndateconnection":
            var ret = getElement('returndateconnection');
            var dep = getElement('departuredateconnection');
            break;
        case "departuredateconnection":
            var ret = getElement('returndateconnection');
            var dep = getElement('departuredateconnection');
            break;
        case "GroupBookings_creturndate":
            var ret = getElement('GroupBookings_creturndate');
            var dep = getElement('GroupBookings_cdeparturedate');
            break;
        case "GroupBookings_cdeparturedate":
            var ret = getElement('GroupBookings_creturndate');
            var dep = getElement('GroupBookings_cdeparturedate');
            break;
        default:
            var dep = null;
            var ret = null;
            break;
    }

    // set return value
    if(null != dep && null != ret && null != GetInputDate(dep.value) && (null == GetInputDate(ret.value) || GetInputDate(dep.value) > GetInputDate(ret.value)))
    {
        if (dateArray[ret.id] == null)
        {
	        dateArray[ret.id] = new Date();
	    }
	    dateArray[ret.id].setTime(dateArray[dep.id].getTime());
	    dateArray[ret.id].setDate(dateArray[ret.id].getDate() + 3);
	    if (dateArray[ret.id] > CalEnd)
	    {
	        dateArray[ret.id].setTime(CalEnd.getTime());
	    }
	    ret.value = getFormattedDate(dateArray[ret.id]);
    }
}

// set currency to $ or £
function changefarecurrency(sNewCurrency)
{
    document.getElementById('farecurrency').innerHTML = sNewCurrency;
}

 // pop the calendar calframe
function popCalendar(el)
{
    // does it exist?
	if (getElement('CalFrame') == null)
	{
	    return;
	}
	
	// set id
	var id = el.id;
	
	// if depart start depart cal
	if (id == 'departuredate')
	{
		el.select();
		ShowCalendar(el, getElement('departuredate'), CalEnd, CalStart);
	}
	// if return start return cal
	else if (id == 'returndate')
	{
	    el.select();
	    //is departuredate set?
	    if(el.value == "Enter date" || el.value == "")
	    {
	        //nopes not set
	        ShowCalendar(el,getElement('returndate'),CalEnd,CalStart);
	    }
	    else
	    {
	        //yes it is set so:
	        //what is the date value of departuredate?
            var imaDate = GetInputDate(document.getElementById('departuredate').value);
            // replace CalStart with imaDate
	        ShowCalendar(el,getElement('returndate'),CalEnd,imaDate);
	    }
	} 
	
	else if (id == 'departuredateconnection') 
	{
	    el.select();
	    ShowCalendar(el, getElement('departuredatesearch'), CalEnd, CalStart);
	} 
	
	else if (id == 'returndateconnection') 
	{
	    el.select();
	    //is departuredate set?
	    if(el.value == "Enter date" || el.value == "")
	    {
	        //nopes not set
	        ShowCalendar(el,getElement('returndateconnection'),CalEnd,CalStart);
	    }
	    else
	    {
	        //yes it is set so:
	        //what is the date value of departuredate?
            var imaDate = GetInputDate(document.getElementById('departuredateconnection').value);
            // replace CalStart with imaDate
	        ShowCalendar(el,getElement('returndateconnection'),CalEnd,imaDate);
	    }
	}
	
	else if (id == 'GroupBookings_cdeparturedate') 
	{
	    el.select();
	    ShowCalendar(el, getElement('GroupBookings_cdeparturedate'), CalEnd, CalStart);
	} 
	
	else if (id == 'GroupBookings_creturndate') 
	{
	    el.select();
	    //is departuredate set?
	    if(el.value == "Enter date" || el.value == "")
	    {
	        //nopes not set
	        ShowCalendar(el,getElement('GroupBookings_creturndate'),CalEnd,CalStart);
	    }
	    else
	    {
	        //yes it is set so:
	        //what is the date value of departuredate?
            var imaDate = GetInputDate(document.getElementById('GroupBookings_cdeparturedate').value);
            // replace CalStart with imaDate
	        ShowCalendar(el,getElement('GroupBookings_creturndate'),CalEnd,imaDate);
	    }
	}
}

// enables or disables return date input according to one way or return flights
function ShowReturnRequirements(sReturn)
{
    if (sReturn=='true')
    {
        document['formsilverjet'].returndate.disabled=false;
    } 
    else 
    {
        document['formsilverjet'].returndate.disabled = true;
    }
}

// validation and handling of return and or one way flights
function setselection(sSetType)
{
    var bContinue = true;
    var bReturnTrip = false;
    var flightFrom = document.forms['formsilverjet'].elements['flightfrom'].options[document.forms['formsilverjet'].elements['flightfrom'].selectedIndex].value;
    var flightTo = document.forms['formsilverjet'].elements['flightto'].options[document.forms['formsilverjet'].elements['flightto'].selectedIndex].value;
    var numadults = document.forms['formsilverjet'].elements['numberofadults'].options[document.forms['formsilverjet'].elements['numberofadults'].selectedIndex].value;
    if (typeof(numadults) == "string")
        numadults = parseInt(numadults);
    var numchildren = document.forms['formsilverjet'].elements['numberofchildren'].options[document.forms['formsilverjet'].elements['numberofchildren'].selectedIndex].value;
    if (typeof(numchildren) == "string")
        numchildren = parseInt(numchildren);
	
    
    if (flightFrom=="from")
    {
        bContinue = false;
        window.alert('You must select where you are flying from');
    }
    if (flightTo=="to")
    {
        bContinue = false;
        window.alert('You must select where you are flying to');
    }
    if (flightFrom==flightTo)
    {
        bContinue = false;
        window.alert('Flight from and flight to cannot be the same');
    }
    if (document.forms['formsilverjet'].elements['departuredate'].value=="Enter date")
    {
        bContinue = false;
        window.alert('You must supply a valid departure date');
    }

    var iLoop;
    var rtrip = "";
    for (iLoop=0; iLoop < document.forms['formsilverjet'].elements['returntrip'].length; iLoop++)
    {
        if (document.forms['formsilverjet'].elements['returntrip'][iLoop].checked)
        {
            rtrip += "&" + document.forms['formsilverjet'].elements['returntrip'][iLoop].name + "=" + escape(document.forms['formsilverjet'].elements['returntrip'][iLoop].value);
            if (document.forms['formsilverjet'].elements['returntrip'][iLoop].value == 'on') 
            {
                bReturnTrip = true;
            }
        }
    }
    if ((bReturnTrip == true) && (document.forms['formsilverjet'].elements['returndate'].value=="Enter date"))
    {
        bContinue = false;
        window.alert('You must supply a valid return date');
    }
    if ((numadults + numchildren) > 9 )
    {
        bContinue = false;
        window.alert("The maximum number of passengers per booking is nine. " +
			"If there are more than nine in your party, " +
			"please complete the 'Group booking' form.");
    }
    if (bContinue == true)
    {
        document.forms['formsilverjet'].elements['faretype'].value=sSetType;
        var searchType = "&searchtype=" + getCheckedValue(document.forms['formsilverjet'].elements['searchtype']);
        var trip = "&trip=" + flightFrom + flightTo;
        var srcpage = "SourcePage=" + escape(document.forms['formsilverjet'].elements['SourcePage'].value);
        var numadults = "&numberofadults=" + numadults;
        var numchildren = "&numberofchildren=" + numchildren;
        var depdate = "&departuredate=" + escape(document.forms['formsilverjet'].elements['departuredate'].value);
        var retdate = "&returndate=" + escape(document.forms['formsilverjet'].elements['returndate'].value);
        var promo = "&evoucher=" + escape(document.forms['formsilverjet'].elements['promoCode'].value);
        var submitURL = srcpage + "&faretype=" + sSetType + trip + rtrip + numadults + numchildren + depdate + retdate + "&loc=" + locn + promo + "&campaign=" + campaign + searchType;
        window.location = rURL + "?" + submitURL;
    }
}

function initFromToDropDowns()
{
    var flightToDD = document.forms['formsilverjet'].elements['flightto'];
    var flightFromDD = document.forms['formsilverjet'].elements['flightfrom'];
    if (flightToDD.value == "null") {
        var flightFrom = "from";
        switch (locn.toUpperCase()) 
        {
            case "UK" : flightFrom = "LTN"; break;
            case "US" : flightFrom = "EWR"; break;
            case "AE" : flightFrom = "DXB"; break;
        }
        for (var i = 0; i < flightFromDD.options.length; i++)
        {
            if (flightFromDD.options[i].value == flightFrom)
            {
                flightFromDD.selectedIndex = i;
                break;
            }
        }
    }
    loadFlightToDropDown();
}

function loadFlightToDropDown()
{
    var locValue = new Array("LTN","EWR","DXB");
    var locName = new Array("London","New York","Dubai");
    var flightFrom = document.forms['formsilverjet'].elements['flightfrom'].options[document.forms['formsilverjet'].elements['flightfrom'].selectedIndex].value;
    switch (flightFrom)
    {
        case "LTN": changefarecurrency("GBP"); break;
        case "EWR": changefarecurrency("USD"); break;
        case "DXB": changefarecurrency("AED"); break;
    }
    var flightToDD = document.forms['formsilverjet'].elements['flightto'];
    var flightToValue = flightToDD.value;
    flightToDD.options.length = 0;
    flightToDD[0]=new Option("Please select", "to", true);
    var index = 1;
    for (var i = 0; i < locValue.length; i++)
    {
        if (locValue[i] != flightFrom) {
            flightToDD[index++]=new Option(locName[i], locValue[i], false);
            if (flightToValue == locValue[i])
                flightToDD.selectedIndex = index - 1;
        }
    }
}

//addOnloadEvent(initFromToDropDowns);
//window.onpageshow = function (evt) {
//    if (evt.persisted) initFromToDropDowns();
//}
