// JScript File

var _airports = new Array();
var _routes = new Array();	

// Register the namespace
//Type.registerNamespace('Portal.Bookings');

Portal.Bookings = {};

_days = new Array(31,0,31,30,31,30,31,31,30,31,30,31);

// Constructor function
Portal.Bookings.Widget = function()
{
	// Initialize the base
	Portal.Bookings.Widget.initializeBase(this);
			
	this._SITALink = SITALink;	
	
    this._months = months;	    
        
	this.initialize();
}

Portal.Bookings.Widget.prototype = {

    // Initialize	
    initialize: function() {
        // initialize the departer/arrival controls
        new Portal.Bookings.Manager($get("_origin"), $get("_destination"), null, null);

        // build the control
        this._build();
    },
    doSubmit: function() {
        if ($get("_origin").selectedIndex == 0 || $get("_destination").selectedIndex == 0) {
            this._showError();
            return;
        }

        // processes all entered values 
        var tripType = "OneWay";
        if ($get("_tripTypeOn").checked)
            tripType = "Return";

        // formates the date 
        var depDate = $get("_depmonthyear").value.split(" - ");
        depDate[depDate.length] = $get("_depday").value;

        var depDateISO = depDate.join("-");

        this.params = "_channelLocale=" + bookingsLangCode + "&requestor=AirSimpleReqsPage&_origin=" + $get("_origin").value + "&_destination=" + $get("_destination").value + "&_tripType=" + tripType + "&_depdateiso=" + depDateISO + "&_adults=" + $get("_adults").value + "&_children=" + $get("_children").value + "&_infants=" + $get("_infants").value + "";

        if (tripType == "Return") {
            var retDate = $get("_retmonthyear").value.split(" - ");
            retDate[retDate.length] = $get("_retday").value;

            var retDateISO = retDate.join("-");
            this.params += "&_retdateiso=" + retDateISO + "";
        }

        window.open("/SITA/", "Info");
    },
    _showError: function() {
        $get("booking_error").style.display = "block";        
        $get("item_2").style.height = "350px";
    },
    _hideError: function() {
        $get("booking_error").style.display = "none";
    },
    _build: function() {
        this._buildComboDepArrDate();
        $get("loading_bookings").style.display = "none";
        $get("bookings").style.display = "inline";
        document.getElementById("_depcalendarImg").src = "http://www.carpatair.com/Content/EN/WIDGETS/BOOKINGS/" + "calendar/calbtn.gif";
        document.getElementById("_retcalendarImg").src = "http://www.carpatair.com/Content/EN/WIDGETS/BOOKINGS/" + "calendar/calbtn.gif";
        document.getElementById("gToday:normal:agenda.js").src = "http://www.carpatair.com/Content/EN/WIDGETS/BOOKINGS/" + "calendar/ipopeng.htm";

    },
    _buildComboDepArrDate: function() {
        var objDepDate = $get("_depmonthyear");
        var objArrDate = $get("_retmonthyear");
        var objDepDay = $get("_depday");
        var objArrDay = $get("_retday");

        var date = new Date();
        date.setDate(date.getDate() + 1);
        // builds the calendar

        objDepDate.options.length = 0;
        objArrDate.options.length = 0;
        var currMonth = date.getMonth();
        var currYear = date.getFullYear();
        currMonth++;

        for (var i = currMonth; i <= 12; i++) {
            var val;
            if (i <= 9)
                val = currYear + " - 0" + i;
            else
                val = currYear + " - " + i;

            objDepDate.options[objDepDate.length] = new Option(this._months[i - 1] + " " + currYear, val);
            objArrDate.options[objArrDate.length] = new Option(this._months[i - 1] + " " + currYear, val);
        }

        year = currYear + 1;
        for (var i = 1; i < 12 - (12 - currMonth); i++) {
            var val;
            if (i <= 9)
                val = year + " - 0" + i;
            else
                val = year + " - " + i;

            objDepDate.options[objDepDate.length] = new Option(this._months[i - 1] + " " + year, val);
            objArrDate.options[objArrDate.length] = new Option(this._months[i - 1] + " " + year, val);
        }

        var days = this._getDaysInMonth(currMonth, currYear);
        objDepDay.options.length = 0;
        objArrDay.options.length = 0;
        for (var i = 1; i <= days; i++) {
            objDepDay.options[objDepDay.length] = new Option(i, i);
            objArrDay.options[objArrDay.length] = new Option(i, i);
        }

        objDepDay.selectedIndex = date.getDate() - 1;
        objArrDay.selectedIndex = date.getDate() - 1;

        // set the evenet handlers for calendar		
        $addHandler(objDepDay, 'change', Function.createDelegate(this, this._onDepDayChange));
        $addHandler(objDepDate, 'change', Function.createDelegate(this, this._onDepDateChange));
        $addHandler(objArrDate, 'change', Function.createDelegate(this, this._onArrDateChange));
    },
    _getDaysInMonth: function(month, year) {
        if (month == 2) {
            if (year % 4 == 0)
                return 29;
            else
                return 28;
        }
        else
            return _days[month - 1];
    },
    _onDepDayChange: function(e) {
        Portal.Bookings._generateRetDate();
    },
    _onDepDateChange: function(e) {
        var targ;
        if (!e)
            var e = window.event;
        if (e.target) targ = e.target;
        else if (e.srcElement) targ = e.srcElement;
        if (targ.nodeType == 3) // defeat Safari bug
            targ = targ.parentNode;
        this._changeMonth(targ, $get("_depday"));

        Portal.Bookings._generateRetDate();
    },
    _onArrDateChange: function(e) {
        var targ;
        if (!e)
            var e = window.event;
        if (e.target) targ = e.target;
        else if (e.srcElement) targ = e.srcElement;
        if (targ.nodeType == 3) // defeat Safari bug
            targ = targ.parentNode;

        this._changeMonth(targ, $get("_retday"));
    },
    _changeMonth: function(objDate, objDay) {
        var currDepDay = objDay.value;
        var arr = objDate.value.split(" - ");
        var selectedMonth = parseFloat(arr[1]);
        var selectedYear = parseFloat(arr[0]);


        var objBrowser = new Portal.Bookings.BrowserDetect();
        objBrowser.init();

        if (selectedMonth > 0 && selectedYear) {
            var days = this._getDaysInMonth(selectedMonth, selectedYear);
            if (objBrowser.browser == "Explorer") {
                objDay.options.length = 0;
                for (var i = 1; i <= days; i++)
                    objDay.options[objDay.length] = new Option(i, i);
                if (currDepDay - 1 < objDay.options.length)
                    objDay.selectedIndex = currDepDay - 1;
                else
                    objDay.selectedIndex = objDay.options.length - 1;
            }
            else {
                var objNew = document.createElement("select");
                objNew.setAttribute("id", objDay.id);
                objNew.setAttribute("name", objDay.name);

                for (var i = 1; i <= days; i++) {
                    objNew.options[objNew.length] = new Option(i, i);
                }
                if (currDepDay - 1 < objNew.options.length)
                    objNew.selectedIndex = currDepDay - 1;
                else
                    objNew.selectedIndex = objNew.options.length - 1;

                var objParent = objDay.parentNode;
                objParent.replaceChild(objNew, objDay);
                objNew.className = "bookings_select";
            }
        }
    }
}

Portal.Bookings.Manager = function(objDep, objArr, selectedDep, selectedArr, msgInfo)
{
    // Initialize the base
	Portal.Bookings.Manager.initializeBase(this);

    this.objDep = objDep;
    this.objArr = objArr;        
    this.selectedDep = selectedDep;
    this.selectedArr = selectedArr;                   
    this.msgInfo = msgInfo;
        
    if(typeof(window['formSent']) != 'undefined' && formSent)
    {
        this.selectedDep = null;
        this.selectedArr = null;   
    }
    
    this.initialize();
}

Portal.Bookings.Manager.prototype = {
    initialize: function() {
        if (_routes.length == 0)
            this._loadData();

        this.objDep.options.length = 0;

        if (this.msgInfo != null)
            this.objDep.options[this.objDep.length] = new Option(this.msgInfo, 0);
        else
            this.objDep.options[this.objDep.length] = new Option(bookingsSelectDestination, 0);
        for (var i = 0; i < _routes.length; i++) {
            this.objDep.options[this.objDep.length] = new Option(_routes[i]._departure._name, _routes[i]._departure._code);
            if (this.selectedDep != null && this.selectedDep == _routes[i]._departure._code)
                this.objDep.options[this.objDep.length - 1].selected = true;
        }

        if (this.selectedDep != null)
            this._showArrivals(this.selectedDep);
        else
            this._showArrivals(0);

        // add event handler for this departure combo
        $addHandler(this.objDep, 'change', Function.createDelegate(this, this._onDepChange));
        $addHandler(this.objArr, 'change', Function.createDelegate(this, this._onArrChange));
    },
    _loadData: function() {
        bookingsAirports = unescape(bookingsAirports).replace(/\+/g, " ");
        bookingsRoutes = unescape(bookingsRoutes).replace(/\+/g, " ");

        // loads airports from xml string
        if (window.ActiveXObject) {
            var xml_airports = new ActiveXObject("Microsoft.XMLDOM");
            xml_airports.async = "false";
            xml_airports.loadXML(bookingsAirports);
        }
        else {
            var parser = new DOMParser();
            var xml_airports = parser.parseFromString(bookingsAirports, "text/xml");
        }

        var root = xml_airports.getElementsByTagName('airports').item(0);

        for (var iNode = 0; iNode < root.childNodes.length; iNode++) {
            var node = root.childNodes.item(iNode);
            if (node.nodeName == 'airport') {
                var name = "";
                var code = "";

                if (node.attributes.getNamedItem('code'))
                    code = node.attributes.getNamedItem('code').value;

                if (node.attributes.getNamedItem('name'))
                    name = node.attributes.getNamedItem('name').value;

                _airports[_airports.length] = new Portal.Bookings.Airport(code, name);
            }
        }

        if (_airports.length == 0) {
            alert("An error occured while loading the bookings module. \n No airports defined");
            return;
        }

        // loads the routes from xml
        if (window.ActiveXObject) {
            var xml_airports = new ActiveXObject("Microsoft.XMLDOM");
            xml_airports.async = "false";
            xml_airports.loadXML(bookingsRoutes);
        }
        else {
            var parser = new DOMParser();
            var xml_airports = parser.parseFromString(bookingsRoutes, "text/xml");
        }

        var root = xml_airports.getElementsByTagName('routes').item(0);
        for (var iNode = 0; iNode < root.childNodes.length; iNode++) {
            var node = root.childNodes.item(iNode);
            if (node.nodeName == "route") {
                if (node.attributes.getNamedItem("departure_code")) {
                    var departureCode = node.attributes.getNamedItem("departure_code").value;
                    var departure = this._getAirport(departureCode);
                    if (departure != null) {
                        var route = new Portal.Bookings.Route(departure);
                        for (var iNodeArr = 0; iNodeArr < node.childNodes.length; iNodeArr++) {
                            var nodeArr = node.childNodes[iNodeArr];
                            if (nodeArr.nodeName == "arrival") {
                                if (nodeArr.attributes.getNamedItem("code")) {
                                    var arrCode = nodeArr.attributes.getNamedItem("code").value;
                                    var arr = this._getAirport(arrCode);
                                    if (arr != null)
                                        route.addArrival(arr);
                                }
                            }
                        }
                        this._addRoute(route);
                    }
                }
            }
        }

        _routes.sort(function(o1, o2) { return (o1._departure._name < o2._departure._name) ? (-1) : ((o1._departure._name > o2._departure._name) ? (1) : (0)) });
    },
    _addRoute: function(route) {
        _routes[_routes.length] = route;
    },
    _getAirport: function(airportCode) {
        // gets an airport based on its code
        for (var i = 0; i < _airports.length; i++) {
            if (_airports[i]._code == airportCode)
                return _airports[i];
        }

        return null;
    },
    _getRoute: function(departureCode) {

        for (var i = 0; i < _routes.length; i++) {
            if (_routes[i]._departure._code == departureCode) {
                return _routes[i];
            }
        }

        return null;
    },
    _onArrChange : function(e) {
        widgetBookings._hideError();        
    },
    _onDepChange: function(e) {
        widgetBookings._hideError();        
        var targ;
        if (!e)
            var e = window.event;
        if (e.target) targ = e.target;
        else if (e.srcElement) targ = e.srcElement;
        if (targ.nodeType == 3) // defeat Safari bug
            targ = targ.parentNode;
        //alert(targ.value);
        this._showArrivals(targ.value);
    },
    _showArrivals: function(departureCode) {
        this.objArr.options.length = 0;
        if (this.msgInfo != null)
            this.objArr.options[this.objArr.length] = new Option(this.msgInfo, 0);
        else
            this.objArr.options[this.objArr.length] = new Option(bookingsSelectDestination, 0);
        if (departureCode != 0) {
            var selectedRoute = this._getRoute(departureCode);
            selectedRoute._arrivals.sort(function(o1, o2) { return (o1._name < o2._name) ? (-1) : ((o1._name > o2._name) ? (1) : (0)) });
            if (selectedRoute != null) {
                for (var i = 0; i < selectedRoute._arrivals.length; i++) {
                    this.objArr.options[this.objArr.length] = new Option(selectedRoute._arrivals[i]._name, selectedRoute._arrivals[i]._code);
                    if (this.selectedArr != null && this.selectedArr == selectedRoute._arrivals[i]._code) {
                        this.objArr.options[this.objArr.length - 1].selected = true;
                        this.selectedArr = null;
                    }
                }
            }
        }

    }
}

Portal.Bookings.Airport = function(code, name)
{
	this._code = code;
	this._name = name;
}

Portal.Bookings.Route = function(departure)
{
	this._departure = departure;
	this._arrivals = new Array();
}

Portal.Bookings.Route.prototype = {
	addArrival : function(arrival)
			{
				this._arrivals[this._arrivals.length] = arrival;
			}
}

Portal.Bookings._generateRetDate = function()
{	
		// change date for return if the dep date >= ret date								
		var depDay = $get("_depday");
		var depMonth = $get("_depmonthyear");
		
		var retDay = $get("_retday");
		var retMonth = $get("_retmonthyear");

		var arr = depMonth.value.split(" - ");		
		var date = new Date();
		date.setDate(depDay.value);
		date.setMonth(arr[1] - 1);
		date.setFullYear(arr[0]);
		
		var arr2 = retMonth.value.split("-");
		var dateRet = new Date();
		dateRet.setDate(retDay.value);
		dateRet.setMonth(arr2[1] - 1);
		dateRet.setFullYear(arr2[0]);
		
		if (Portal.Bookings.CompareDates(date, dateRet) >= 0) {
			date.setDate(date.getDate() + 1);
			Portal.Bookings.rebuildDate(date, retDay, retMonth);
		}		
}

Portal.Bookings.rebuildDate = function(date, objDay, objMonthYear)
{    
    var currMonth = date.getMonth() + 1;
    var currYear = date.getFullYear();
    
    var strMonthYear = date.getFullYear();
    if(currMonth <= 9)
        strMonthYear += " - 0" + currMonth;
    else
        strMonthYear += " - " + currMonth;                
        
    // set the month
    var sw = false;
    for(var i=0;i<objMonthYear.options.length;i++)        
    {
        if(objMonthYear.options[i].value == strMonthYear)
        {
            objMonthYear.options[i].selected = true;
            sw = true;
            break;
        }
    }
        
    if(!sw)        
    {
         var monthName = "";
         for(var i=0;i<objMonthYear.options.length;i++)
         {                
            if(objMonthYear.options[i].value.split(" - ")[1] == currMonth)
            {
                monthName = objMonthYear.options[i].text.split(" ")[0];
                break;
            }
         }                                   
         
         objMonthYear.options[objMonthYear.length] = new Option(monthName + " " + currYear, strMonthYear);
         objMonthYear.options[objMonthYear.length - 1].selected = true;
    }    
        
    // set the day
    var _days = new Array(31,0,31,30,31,30,31,31,30,31,30,31);
    var nrDays = _days[currMonth -  1];            
            
    if(currMonth == 2)
    {
        if(currYear % 4 == 0)
            nrDays = 29;
        else
            nrDays = 28;
    }         
    
    if(objDay.options.length != nrDays)
    {
        var nr = nrDays - objDay.options.length;
        if(nr < 0)
        {
            for(var i=objDay.childNodes.length -1; i>=nrDays;i--)
                    objDay.removeChild(objDay.childNodes[i]);
        }
        else
        {
            var lastDay = objDay.options[objDay.options.length - 1].value;           
            for(var i=0;i<nr;i++)
            {
                lastDay++;
                objDay.options[objDay.options.length] = new Option(lastDay,lastDay);
            }
                
        }        
    }     
        
    objDay.value = parseFloat(date.getDate());	
}

/**
 * Compare two dates
 * @method
 * @param {Date} dataStart
 * @param {Date} dataStop
 * @return 0 if equal, -1 if dataStart < dataStop, 1 if dataStart > dataStop
 */
Portal.Bookings.CompareDates = function(dataStart, dataStop)
{
        dataStart.setHours(0);
        dataStart.setMinutes(0);
        dataStart.setSeconds(0);
        dataStart.setMilliseconds(0);
        
        dataStop.setHours(0);
        dataStop.setMinutes(0);
        dataStop.setSeconds(0);
        dataStop.setMilliseconds(0);
        
        
        if (dataStart - dataStop == 0) 
            return 0;
        if (dataStart - dataStop < 0) 
            return -1;
        if (dataStart - dataStop > 0) 
            return 1;
}

Portal.Bookings.hideReturnDate = function()
{
	$get("returnDateLbl").style.display = "none";
	$get("_retday").style.display = "none";
	$get("_retmonthyear").style.display = "none";		
	$get("_retcalendar").style.display = "none";		
}

Portal.Bookings.showReturnDate = function()
{
    var valDepDay = parseFloat($get("_depday").value);
    var arrDepMonthYear = $get("_depmonthyear").value.split(" - ");
    var valDepYear = parseFloat(arrDepMonthYear[0]);
    var valDepMonth = parseFloat(arrDepMonthYear[1]);
    
    var objReturnDate = new Date();        
    objReturnDate.setFullYear(valDepYear, valDepMonth - 1, valDepDay);    
    objReturnDate.setDate(objReturnDate.getDate() + 1);    
        
    var objDay =  $get("_retday");
    var objMonthYear = $get("_retmonthyear");
    
    Portal.Bookings.rebuildDate(objReturnDate, objDay, objMonthYear);

	$get("returnDateLbl").style.display = "inline";
	$get("_retday").style.display = "inline";
	$get("_retmonthyear").style.display = "inline";	
	$get("_retcalendar").style.display = "inline";			
}


Portal.Bookings.BrowserDetect = function()
{
	
}

Portal.Bookings.BrowserDetect.prototype = {
	
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{	// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]
}

function CalendarChange(objDateNewValue,objDayNewValue,controlDateId,controlDayId)
{           
        var arrDateMonthYear = objDateNewValue.split(" - ");
        var year = parseFloat(arrDateMonthYear[0]);                
        var month = parseFloat(arrDateMonthYear[1]);                                    
        
        var date = new Date();
        date.setFullYear(year, month - 1, objDayNewValue);    
        
        Portal.Bookings.rebuildDate(date, $get(controlDayId), $get(controlDateId));
		Portal.Bookings._generateRetDate();
}

function InitBookingMenu() {
    var objMenu = $get('divMenuBooking');
    if (objMenu) {
        $addHandler(objMenu, 'mouseover', OnMenuBookingMouseOver);
        $addHandler(objMenu, 'mouseout', OnMenuBookingMouseOut);
    }
}

function OnMenuBookingMouseOver(e) {
    var targ;
    if (!e)
        var e = window.event;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode;

    if (targ.parentNode.className.indexOf('buttonFlight') == -1 && targ.parentNode.className != "buttonDiv")
        targ.parentNode.parentNode.childNodes[0].className = "buttonFlightUnselected";        
    
}

function OnMenuBookingMouseOut(e) {
    var targ;
    if (!e)
        var e = window.event;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode;

    if (targ.parentNode.className.indexOf('buttonFlight') == -1 && targ.parentNode.className != "buttonDiv")
        targ.parentNode.parentNode.childNodes[0].className = 'buttonFlightSelected';       
}

// Register the class, implementing Behavior
//Portal.Bookings.Widget.registerClass('Portal.Bookings.Widget', Sys.Component);
		
// Tell the infrastructure that the script is done loading
//if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

