﻿if (typeof expediaNS == "undefined" || !expediaNS){
    var expediaNS = {};
}

expediaNS.namespace = function() {
    var a=arguments, o=null, i, j, d;
    for (i=0; i<a.length; i=i+1) {
        d=a[i].split(".");
        o=expediaNS;

        // YAHOO is implied, so it is ignored if it is included
        for (j=(d[0] == "expediaNS") ? 1 : 0; j<d.length; j=j+1) {
            o[d[j]]=o[d[j]] || {};
            o=o[d[j]];
        }
    }

    return o;
};

expediaNS.namespace("expediaNS.cx.util");

/*
Function that cancels default action ie page scroll
For browser compatibility please call using:
    return expediaNS.cx.util.cancelBubble(e?e:window.event);
*/
expediaNS.cx.util.cancelBubble = function(e) {
    if(e.preventDefault) {
        e.preventDefault();
    } else {
        e.cancelBubble = true;
    }
    return false;
}

/*
This method deal wit hthe collapsable container (hidden content, links to open and close the module.
Params:
- openLink: Open link HTML element
- closeLink: Close link HTML element
- content: Content module HTML element
*/
expediaNS.cx.util.toggleContainer = function(openLink, closeLink, content){
	var obj = {};
	
	var showLink = openLink;
	var hideLink = closeLink;
	var content = content;

	var subscribeEvents = function(){
		YAHOO.util.Event.addListener(showLink, "click", showLinksCallback);
		YAHOO.util.Event.addListener(hideLink, "click", hideLinksCallback);
	}
	
	var showLinksCallback = function(e){
		YAHOO.util.Dom.setStyle([hideLink,content], 'display','block');
		YAHOO.util.Dom.setStyle(showLink, 'display','none');
		return expediaNS.cx.util.cancelBubble(e?e:window.event);
	}
	
	var hideLinksCallback = function(e){
		YAHOO.util.Dom.setStyle([hideLink,content], 'display','none');
		YAHOO.util.Dom.setStyle(showLink, 'display','block');
		return expediaNS.cx.util.cancelBubble(e?e:window.event);
	}
	
	var init = function(){
		subscribeEvents();
	}
	init();
	
	return obj;
}

/*
This method deal with the collapsable container (hidden content, links to open and close the module.
Params:
- toggleSwitch: Switch HTML element
- openStateElements: Array of HTML element to display when toggled
- closeStateElements: Array of HTML element to hide when toggled
*/
expediaNS.cx.util.toggleElements = function(toggleSwitch, openStateElements, closeStateElements){
	var obj = {};
	
	var switchEl = toggleSwitch;
	var open = false;
	var showEl = new Array();
	showEl = openStateElements;
	var hideEl = new Array();
	hideEl = closeStateElements;	
	
	var subscribeEvents = function(){
		YAHOO.util.Event.addListener(switchEl, "click", toggleCallback);
	}
	
	var toggleCallback = function(e){
		if(open){
			YAHOO.util.Dom.setStyle(showEl, 'display','none');
			YAHOO.util.Dom.setStyle(hideEl, 'display','block');
			open = false;
		}
		else{
			YAHOO.util.Dom.setStyle(showEl, 'display','block');
			YAHOO.util.Dom.setStyle(hideEl, 'display','none');
			open = true;
		}
	}
	
	var init = function(){
		subscribeEvents();
	}
	init();
	return obj;
}

expediaNS.cx.util.preloadImage = function(width, height, url){
	var image = new Image(width, height);
	image.src = url;
	return image;
}

/**
* string util class
*/
expediaNS.cx.util.string = {
    strToNum : function(str) {
        var intRes = 0;
        if (!isNaN(str)) {
            intRes = parseInt(str, 10);
        }
        return intRes;
    }
}

/**
* date util class
*/
expediaNS.cx.util.date = {    
    
    newDate : function (strDate, fmt) {
        arrDt = this.strDateToArray(strDate);
        d = this.getDay(arrDt, fmt);
        m = this.getMonth(arrDt, fmt);
        y = this.getYear(arrDt, fmt);
        return this.createDate(d, m, y);
    },
    
    strDateToArray : function(strDt) {
        return strDt.split(new RegExp("[- /.]"));
    },
    
    getDay : function(arrDt, fmt) {
        var DateFormats = expediaNS.cx.util.DateFormat;
        switch (fmt) {
            case DateFormats.US:
                return expediaNS.cx.util.string.strToNum(arrDt[1]);
            case DateFormats.SE:
                return expediaNS.cx.util.string.strToNum(arrDt[2]);
            default:
                return expediaNS.cx.util.string.strToNum(arrDt[0]);            
        }
    },
    
    getMonth : function(arrDt, fmt) {
        var result = null;
        switch (fmt) {
            case expediaNS.cx.util.DateFormat.US:
                result = expediaNS.cx.util.string.strToNum(arrDt[0]);
                break;
            default:
                result = expediaNS.cx.util.string.strToNum(arrDt[1]);
                break;
        }
        result = result -1;
        return result;
    },
    
    getYear : function(arrDt, fmt) {
        
        if (arrDt.length > 2) {
            var tmpYear = "";
            switch (fmt) {
                case expediaNS.cx.util.DateFormat.SE:
                    tmpYear = expediaNS.cx.util.string.strToNum(arrDt[0]);
                    break;
                default:
                    tmpYear = expediaNS.cx.util.string.strToNum(arrDt[2]);
                    break;
            }            
            if (tmpYear.length == 2) {
                return expediaNS.cx.util.string.strToNum("20" + tmpYear );
            }
            else {
                return expediaNS.cx.util.string.strToNum(tmpYear );
            }
        }
        else {
            return new Date().getFullYear();
        }
    },
    
    createDate : function (days, months, years) {
        var dt = new Date(years,months,days);
        return dt;
    }
}

/**
Date format enum
*/
expediaNS.cx.util.DateFormat = {
    US: 0,
    EU: 1,
    SE: 2
}

/**
* HTML util class
*/
expediaNS.cx.util.html = {
    /**
    * Gets the element html type
    */
    type : function(element){
        switch (element.type)
        {
            case 'text':
                return 'input';
            case 'select-one':
            case 'select-multiple':
                return 'select';
            default:
                return 'input';
        }
    },    
    /**
    * Gets the input text field value, called if the Velement is an input text
    * @return {string}
    */
    inputTextValue : function(element){
        if (element) {
            return element.value;
        }
        else {
            return "";
        }
    },    
    /**
    * Gets the select field value, called if the Velement is an select 
    * @private
    */  
    dropDownValue : function(element){
        if (element) {
            var index = element.selectedIndex;
            return element.options[index].value;
        }
    },
    /**
    * Gets the value of the element
    */
    value : function(element)
    {
        var type = this.type(element);
        switch(type)
        {
            case 'input':
                return this.inputTextValue(element);
            case 'select':
                return this.dropDownValue(element);
            default:
                return 'input';
        }
    }
}


/**
* Array util class
*/
expediaNS.cx.util.array = {
    exists : function(array, value) {    
        for (var i = 0, loopCnt = array.length; i < loopCnt; i++) {
            if (array[i] === value) {
                return true;
            }
        }
        return false;
    },
    remove : function(array, id) {
      return array.splice(id, 1);
    }
}

expediaNS.cx.util.omniture = {
    trackRfrrOnClick : function(rfrr) {
        s_linkTrackVars='prop16,eVar28';
        s_linkTrackEvents='None';
        s_linkType='o';
        s_linkName='RFRR_ID';
        s_prop16=rfrr; // RFRR ID is populated here
        s_eVar28=s_prop16;
        s_lnk=s_co(this);
        s_gs(s_account);
    }
}
    
/**
* create a tooltip that is spawned when mouse over a picto (any html elements)
*/
expediaNS.cx.util.createToolTipBox = function(idToolTip,
                                        textToolTip,
                                        idEltToMouseOver,
                                        containerClassName,
                                        classNameVisible,
                                        classNameHidden,
                                        tooltipHeight,
                                        link) {
    var obj = {};
    
    function getPosition(e) {
        e = e || window.event;
        var cursor = {x:0, y:0};
        if (e.pageX || e.pageY) {
            cursor.x = e.pageX;
            cursor.y = e.pageY;
        } 
        else {
            var de = document.documentElement;
            var b = document.body;
            cursor.x = e.clientX + 
                (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0);
            cursor.y = e.clientY + 
                (de.scrollTop || b.scrollTop) - (de.clientTop || 0);
        }
        return cursor;
    }

    
    var cxPage = YAHOO.util.Dom.get("cxPage");
    
    var hideToolTip = function(e) {
        var toolTip = YAHOO.util.Dom.get(idToolTip);
        toolTip.className = classNameHidden;
    }
    
    var showToolTip = function(e) {
        var toolTip = YAHOO.util.Dom.get(idToolTip);
        toolTip.className = classNameVisible;            
        pos = getPosition(e);
        setPosition(toolTip, pos.x-20, pos.y-tooltipHeight);
    }    
    
    var getCoordonnates = function() {
        var coords = findPos(YAHOO.util.Dom.get(idEltToMouseOver));
        var xPos = coords[0];
        var yPos = coords[1];
        return [xPos, yPos];
    }
    
    var setPosition = function(elementToPosition, x, y) {
        YAHOO.util.Dom.setX(elementToPosition, x);
        YAHOO.util.Dom.setY(elementToPosition, y); 
    }
        
    var prepareToolTip = function() {
        var span = document.createElement("span");
        span.setAttribute("id", idToolTip);
        span.innerHTML  = textToolTip;
        span.className = classNameHidden;
        var p = document.createElement("p");
        p.className = containerClassName;
        p.appendChild(span);
        cxPage.appendChild(p);
    }
    
    
    var preventScroll = function(e) {
        return expediaNS.cx.util.cancelBubble(e?e:window.event);
    }
    
    var redirect = function() {
        window.location.href = link;
    }
    
    var subscribeEvents = function() {
        if (!YAHOO.lang.isUndefined(link)) {
            YAHOO.util.Event.addListener(idEltToMouseOver, 'click', redirect);
        }
        else {
            YAHOO.util.Event.addListener(idEltToMouseOver, 'click', preventScroll);
        }        
        YAHOO.util.Event.addListener(idEltToMouseOver, 'mouseover', showToolTip);
        YAHOO.util.Event.addListener(idEltToMouseOver, 'mouseout', hideToolTip);
        YAHOO.util.Event.addListener(window, 'load', prepareToolTip);
    }
    
    var init = function(){
		subscribeEvents();
	}
	    
	init();
	return obj;
}

// This Class scan the DOM for links (a) that contains a rfrr attribute
// It than assigns a onClick event that will capture the rfrr and send it to Omniture when the click is fired.
expediaNS.cx.util.OmnitureClick = function(){
	if(YAHOO.lang.isUndefined(expediaNS.cx.util.OmnitureClickSingleton)){
	
		var obj = {};
		
		// Private properties
		var omnitureLinks;
		
		// Private method
		var callback = function(e){
			var rfrr = this.getAttribute('rfrr');
			if(YAHOO.lang.isValue(rfrr)){
				if(!YAHOO.lang.isUndefined(s_exp_trackClick)){
					//Using Omniture's track click function
					s_exp_trackClick(this,'a',rfrr)
				}
			}
		}
		
		// Public methods
		obj.registerOmnitureClick = function(){
			omnitureLinks = YAHOO.util.Dom.getElementsByClassName('OmnitureLink', 'a');
	    	YAHOO.util.Event.addListener(omnitureLinks, "click", callback);
		}
		
		// Constructor
		var init = function(){
			YAHOO.util.Event.onDOMReady(obj.registerOmnitureClick);
		}
		init();
		
		expediaNS.cx.util.OmnitureClickSingleton = obj;
	}
	return expediaNS.cx.util.OmnitureClickSingleton;
}();
