YAHOO.namespace("cx.exp.util");


/*
 * Global utility function that returns the namespace specified and creates it if it doesn't exist
 * @method namespace
 * @static
 * @param  {String*} arguments 1-n namespaces to create 
 * @return {Object}  A reference to the last namespace object created
 */
function expNamespace(){
	var args = arguments, root = null, pkg;
	for (i=0; i<args.length; i=i+1) {
		pkg = args[i].split('.');
		root = window;
		
		for (j=0; j<pkg.length; j=j+1) {
	        root[pkg[j]] = root[pkg[j]] || {};
	        root = root[pkg[j]];
	    }
    }
    return root;
};

/*
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
*/
YAHOO.cx.exp.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');
	}
	
	var hideLinksCallback = function(e){
		YAHOO.util.Dom.setStyle([hideLink,content], 'display','none');
		YAHOO.util.Dom.setStyle(showLink, 'display','block');
	}
	
	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
*/
YAHOO.cx.exp.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;
};

YAHOO.cx.exp.util.preloadImage = function(width, height, url){
	var image = new Image(width, height);
	image.src = url;
	return image;
};

/**
 * Loads AJAX APIs by manipulating the DOM to include <script> tag
 * @param url the javascript URL to load
 * @param opts specifies all optional configuration options for the API you are loading as a JavaScript object literal
 */
YAHOO.cx.exp.util.loadScript = function (src, opts){
	try {
		if (!opts) opts = {};
		var callback = opts.callback || null;	
		
		// create the script element for the google API
		var script = document.createElement("script");
		script.type = "text/javascript";
		
		if(callback) {
			// execute the callback as soon as the DOM is in a usable state.
			script.onload = script.onreadystatechange = function(e) {
				if(e && e.type=="load" || /complete|loaded/.test(script.readyState)) {
					script.onreadystatechange = script.onload = null;
					callback();
				}
			};
		}
		script.src = src;
		document.getElementsByTagName("head")[0].appendChild(script);		
		
	} catch (e) {
		throw "unable to load script " + url + " with options " + opts;
	}
};

/**
 * Dropdown autowidth fix for ie (not ie6 though) - on mouse over will expand dropdown width to longest element. Firefox does this already for you.
 * Call this method to setup the mouseover/out events with your select box. Will toggle the width to auto and back to original width
 * Events only subscribed to if IE.
 * Call in onDomReady.
 *  
 * @param selectBoxID the id of the select box to listen for mouse events
 */
YAHOO.cx.exp.util.setupAutoWidthDropdownIEFix = function (selectBoxID){
	try {
		if (YAHOO.env.ua.ie <= 6) {
			//not IE. Also IE <= 6 not supported, do nothing
			return;			
		}
				
		var selectBox = YAHOO.util.Dom.get(selectBoxID);
		if (!selectBox){
			return;
		}
		
		var tempCssClickClass = "xp-ie-widthFix-dropDownClicked";
		var originalWidth = YAHOO.util.Dom.getStyle(selectBox, 'width'); 
		
		var addAutoWidthFn = function(){			
			YAHOO.util.Dom.setStyle(selectBox, 'width', 'auto');
			YAHOO.util.Dom.removeClass(selectBox, tempCssClickClass);
		}
		
		var toggleClickClassFn = function(){
			if (YAHOO.util.Dom.hasClass(selectBox, tempCssClickClass)){
				YAHOO.util.Dom.removeClass(selectBox, tempCssClickClass); 
			}else{
				YAHOO.util.Dom.addClass(selectBox, tempCssClickClass); 
			}
		}
		
		var backToNormalWidthFn = function(){
			if (!YAHOO.util.Dom.hasClass(selectBox, tempCssClickClass)){
				YAHOO.util.Dom.setStyle(selectBox, 'width', originalWidth);				
			}
		}
		
		var blurBackToNormalWidthFn = function(){
			YAHOO.util.Dom.removeClass(selectBox, tempCssClickClass); 
			YAHOO.util.Dom.setStyle(selectBox, 'width', originalWidth);
		}
		
		
		YAHOO.util.Event.on(selectBox, "focus",addAutoWidthFn);
		YAHOO.util.Event.on(selectBox, "mouseover",addAutoWidthFn);

		YAHOO.util.Event.on(selectBox, "click",toggleClickClassFn);
		
		YAHOO.util.Event.on(selectBox, "mouseout",backToNormalWidthFn);
		YAHOO.util.Event.on(selectBox, "blur",blurBackToNormalWidthFn);
		
	} catch (e) {
		//
	}
};

/*
 * deals.multiTabbed - for handele tab change in multitabbed modules
 */
expNamespace('YAHOO.cx.exp.util.deals.multiTabbed');
	YAHOO.cx.exp.util.deals.multiTabbed.elementIdPrefixes = new Array();
	YAHOO.cx.exp.util.deals.multiTabbed.linkLabel = new Array();
	YAHOO.cx.exp.util.deals.multiTabbed.linkHref = new Array();
	YAHOO.cx.exp.util.deals.multiTabbed.linkRfrr = new Array();
	YAHOO.cx.exp.util.deals.multiTabbed.tabNumber = 0;
	
	/**
	* @param elementIds - array of element IDs prefix [navigation item, table container, link, link text]
	* @param labels - array of text of the "see more" links 
	* @param hrefs - array of HREFs of the "see more" links 
	* @param rfrrs - array of RFRR IDs prefix [navigation item, table container, link, link text]
	* @param tabNum - number of tabs. It has to be same as the previous 3 array's element number
	*
	*/
	YAHOO.cx.exp.util.deals.multiTabbed.init = function(elementIds, labels, hrefs, rfrrs, tabNum){
            YAHOO.cx.exp.util.deals.multiTabbed.elementIdPrefixes = elementIds;
            YAHOO.cx.exp.util.deals.multiTabbed.linkLabel =  labels;
            YAHOO.cx.exp.util.deals.multiTabbed.linkHref =  hrefs;
            YAHOO.cx.exp.util.deals.multiTabbed.linkRfrr =  rfrrs;
            YAHOO.cx.exp.util.deals.multiTabbed.tabNumber = tabNum;
	};
	
	/**
	 * Call init func. before use it. 
	 * @param tabIndex - index of the selected tab (0..) 
	 */
	YAHOO.cx.exp.util.deals.multiTabbed.clickOnTab = function(tabIndex){
		for(var i=0; i<YAHOO.cx.exp.util.deals.multiTabbed.tabNumber; i++){
			YAHOO.util.Dom.removeClass('xp_destinationDeals_navItem_'+i,'xp-bx-tabs-selected');
			YAHOO.util.Dom.setStyle('xp_destinationDeals_tableCnt_'+i,'display','none');
		}
		YAHOO.util.Dom.addClass(YAHOO.cx.exp.util.deals.multiTabbed.elementIdPrefixes[0] + tabIndex,'xp-bx-tabs-selected');
		YAHOO.util.Dom.setStyle(YAHOO.cx.exp.util.deals.multiTabbed.elementIdPrefixes[1] + tabIndex,'display','block');

		if (YAHOO.cx.exp.util.deals.multiTabbed.linkLabel[tabIndex] != '') {
			YAHOO.util.Dom.setStyle(YAHOO.cx.exp.util.deals.multiTabbed.elementIdPrefixes[2] + tabIndex,'display','block');
			YAHOO.util.Dom.setAttribute(YAHOO.cx.exp.util.deals.multiTabbed.elementIdPrefixes[2] + tabIndex, 'href', YAHOO.cx.exp.util.deals.multiTabbed.linkHref[tabIndex]);
			YAHOO.util.Dom.setAttribute(YAHOO.cx.exp.util.deals.multiTabbed.elementIdPrefixes[2] + tabIndex, 'rfrr', YAHOO.cx.exp.util.deals.multiTabbed.linkRfrr[tabIndex]);
			YAHOO.util.Dom.get(YAHOO.cx.exp.util.deals.multiTabbed.elementIdPrefixes[3] + tabIndex).innerHTML = YAHOO.cx.exp.util.deals.multiTabbed.linkLabel[tabIndex];
		}else{
			YAHOO.util.Dom.setStyle(YAHOO.cx.exp.util.deals.multiTabbed.elementIdPrefixes[2] + tabIndex,'display','none');
		}
	};

