// $Id: momondo.js,v 1.31 2010/07/21 15:59:11 nfo Exp $

var FastInitiate = 
{
    onload: function()
    {
        if (FastInitiate.done) { return; }
        FastInitiate.done = true;
        var list = FastInitiate.f;
        var len = list.length;
        list.sort(FastInitiate.compare);
        for (var x = 0; x < len; x++)
        {
            list[x].m();
        }
    },
    compare: function(x, y)
    {
        var res = x.prio - y.prio;
        if (res == 0)
            res = x.seq - y.seq;
        return res;
    },
    addOnLoad: function()
    {
        var a = arguments;
        var p = 0;
        for (var x = 0, al = a.length; x < al; x++)
        {
            var arg = a[x];
            if (typeof arg === 'function')
            {
                if (FastInitiate.done)
                {
                    arg();
                }
                else
                {
                    var l = FastInitiate.f.length;
                    FastInitiate.f[l] = { prio: p, seq: l, m: arg };
                }
            }
            else if (typeof arg === 'number')
            {
                p = arg;
            }
        }
    },
    listen: function()
    {
        if (/WebKit|khtml/i.test(navigator.userAgent))
        {
            FastInitiate.timer = setInterval(function()
            {
                if (/loaded|complete/.test(document.readyState))
                {
                    clearInterval(FastInitiate.timer);
                    delete FastInitiate.timer;
                    FastInitiate.onload();
                }
            }, 10);
        }
        else if (document.addEventListener)
        {
            document.addEventListener('DOMContentLoaded', FastInitiate.onload, false);
        }
        else if (!FastInitiate.iew32)
        {
            if (window.addEventListener)
            {
                window.addEventListener('load', FastInitiate.onload, false);
            }
            else if (window.attachEvent)
            {
                return window.attachEvent('onload', FastInitiate.onload);
            }
        }
    },
    f: [], done: false, timer: null, iew32: false
};
/*@cc_on@*/
/*@if (@_win32)
FastInitiate.iew32 = true;
document.write('<script id="__whitelabel_ie_onload" defer src="' + ((location.protocol == 'https:') ? '//0' : 'javascript:void(0)') + '"><\/script>');
var wl_ie_onload = document.getElementById('__whitelabel_ie_onload');
if (wl_ie_onload)
    wl_ie_onload.onreadystatechange = function() { if (this.readyState == 'complete') { FastInitiate.onload(); } };
/*@end@*/
FastInitiate.listen();

var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
var isIE = !!window.attachEvent && !isOpera;
var isChrome = !isIE && (window.navigator.userAgent.match(/Chrome/) != null)
var isSafari = !isIE && !isChrome && (window.navigator.userAgent.match(/Safari/) != null)

if (!String.prototype.parseUrl)
{
	String.prototype.parseUrl = function()
	{
		var matches = this.match(arguments.callee.re);

		if (!matches)
		{
			return null;
		}
		var result = {
			'scheme': matches[1] || '',
			'subscheme': matches[2] || '',
			'user': matches[3] || '',
			'pass': matches[4] || '',
			'host': matches[5],
			'port': matches[6] || '',
			'path': matches[7] || '',
			'query': matches[8] || '',
			'fragment': matches[9] || ''
		};
		return result;
	};

	String.prototype.parseUrl.re = /^(?:([a-z]+):(?:([a-z]*):)?\/\/)?(?:([^:@]*)(?::([^:@]*))?@)?((?:[a-z0-9_-]+\.)+[a-z]{2,}|localhost|(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])))(?::(\d+))?(?:([^:\?\#]+))?(?:\?([^\#]+))?(?:\#([^\s]+))?$/i;
}

var baseUrl = '';
var scripts = document.getElementsByTagName('script');
var len = scripts.length;
var whitelabelRE = /momondo\.js/i;
var momondoQueryParams;
for (var i = 0; i < len; i++)
{
	var src = scripts[i].src;
	if (whitelabelRE.exec(src))
	{
	    var url = src.parseUrl();
	    momondoQueryParams = url ? parseQueryParams(url.query) : [];
		if (url)
			baseUrl = url.scheme + '://' + url.host;
		break;
	}
}

function addScriptToHead(src)
{
	var found = false;
	var scripts = document.getElementsByTagName("script");
	for (var i = 0; i < scripts.length; i++)
	{
		if (scripts[i].src == src)
		{
			found = true;
			break;
		}
	}
	if (!found)
	{
		var script = document.createElement("script");
		script.src = src;
		script.type = "text/javascript";
		document.getElementsByTagName("head")[0].appendChild(script);
	}
}

function waitForCommon()
{
    if (typeof waitUntil == 'function' && typeof MomondoWhitelabel == 'function')
    {
	    FastInitiate.addOnLoad(
            function()
            {
                var MomondoPolicyLink = document.createElement("link");
                MomondoPolicyLink.setAttribute('rel', 'P3Pv1')
                MomondoPolicyLink.setAttribute('href', 'http://www.momondo.com/w3c/p3p.xml');
                document.getElementsByTagName("head")[0].appendChild(MomondoPolicyLink);
            },
            function()
            {
                var type = getQueryParam("TYPE");
                type = type != null && typeof type != 'undefined' ? type : 'flight';
                var scriptFile = 'whitelabel.js';
                switch (type.toLowerCase())
                {
                    case 'hotel':
                        scriptFile = 'hotels.js';
                        break;
                    case 'flight':
                        scriptFile = 'whitelabel.js';
                        break;
                    case 'car':
                        scriptFile = 'whitelabel.js';
                        break;
                    default:
                        scriptFile = 'whitelabel.js';
                        break;
                }
                addScriptToHead(baseUrl + '/Themes/momondo/js/whitelabel/' + scriptFile);
            }
        )
	}
	else
	{
		setTimeout(waitForCommon, 0.1);
	}
}

function waitForPrototype()
{
    if (typeof Prototype != 'undefined' && typeof Hash != 'undefined')
    {
        FastInitiate.addOnLoad(
            function()
            {
                var omitScriptaculous = getQueryParam('OMITSCRIPTACULOUS');
                if (!(typeof omitScriptaculous != 'undefined' && omitScriptaculous.toUpperCase() == 'TRUE'))
                {
                    addScriptToHead('http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.1/effects.js');
                }
            },
            function()
            {
                addScriptToHead(baseUrl + '/Themes/momondo/js/Common.js');
                addScriptToHead(baseUrl + '/Themes/momondo/js/whitelabel/Common.js');
            },
            waitForCommon
        )
    }
    else
    {
        window.setTimeout(waitForPrototype, 0.1);
    }
}

function parseQueryParams(queryParams)
{
	var parms = new Object();
	var params = queryParams.split('&');
	var keyValue;
	for (var i = 0; i < params.length; i++)
	{
		var keyValue = params[i].split('=');
		var key = '' + keyValue[0];
		var value = keyValue.length > 1 ? keyValue[1] : '';
		parms[key.toUpperCase()] = value;
	}
	return parms;
}

function getQueryParam(name)
{
	return momondoQueryParams[name.toUpperCase()];
}

FastInitiate.addOnLoad(
    function()
    {
        var omitPrototype = getQueryParam('OMITPROTOTYPE');
        if (!(typeof omitPrototype != 'undefined' && omitPrototype.toUpperCase() == 'TRUE'))
        {
            addScriptToHead('http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js');
        }
    },
    waitForPrototype
);

var customEventHandlers = {};

function bindCustomEventHandlers()
{
	if (typeof Prototype != 'undefined' && typeof Hash != 'undefined')
	{
		for (eventName in customEventHandlers)
		{
			document.observe(eventName, customEventHandlers[eventName]);
		}
		customEventHandlers = new Object();
	} 
	else
	{
		window.setTimeout(bindCustomEventHandlers, 0.1);
	}
}

function addCustomEventHandler(name, handler) 
{
    if (!customEventHandlers[name])
    {
        customEventHandlers[name] = handler;
    }
    bindCustomEventHandlers();
}

var Momondo =
{
	GetPriceGraphData: function(orig, dest, oneway, departYear, departMonth, returnYear, returnMonth, successCallBack, failureCallBack)
	{
		MomondoWhitelabel.callWebService('Momondo', 'GetPriceGraphData', successCallBack, null, orig, dest, oneway, departYear, departMonth, returnYear, returnMonth);
	},

	SetSearchView: function(view)
	{
		MomondoWhitelabel.callWebService('Momondo', 'SetSearchView', null, null, view);
	},

	SetFlexible: function(show)
	{
		MomondoWhitelabel.callWebService('Momondo', 'SetFlexible', null, null, show);
	}
};

var GeoWS =
{
	CompleteCities: function(text, maxItems, successCallBack, failureCallBack, userContext)
	{
		MomondoWhitelabel.callWebService('GeoWS', 'CompleteCities', successCallBack, userContext, text, maxItems);
	},

	CompleteAirports: function(text, maxItems, successCallBack, failureCallBack, userContext)
	{
		MomondoWhitelabel.callWebService('GeoWS', 'CompleteAirports', successCallBack, userContext, text, maxItems);
	},

	GetAirportInfo: function(code, successCallBack)
	{
		MomondoWhitelabel.callWebService('GeoWS', 'GetAirportInfo', successCallBack, null, code);
	},

	CompleteCitiesFreeText: function(text, maxItems, successCallBack, failureCallBack, userContext)
	{
		MomondoWhitelabel.callWebService('GeoWS', 'CompleteCitiesFreeText', successCallBack, userContext, text, maxItems);
	}
};
GeoWS._staticInstance = GeoWS;

var GeoSelectorWS =
{
    Service:
	{
	    GetData: function(type, code, hasStates, successCallBack)
	    {
	        MomondoWhitelabel.callWebService('GeoSelectorWS.Service', 'GetData', successCallBack, null, type, code, hasStates);
	    },

	    GetGeoStack: function(airport, successCallBack)
	    {
	        MomondoWhitelabel.callWebService('GeoSelectorWS.Service', 'GetGeoStack', successCallBack, null, airport);
	    }
	}
};

var HotelWS =
{
	GetHotelSearchResults: function(sessionId, successCallBack, failureCallBack, userContext)
	{
		MomondoWhitelabel.callWebService('HotelWS', 'GetHotelSearchResults', successCallBack, userContext, sessionId);
	}
};