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, package;
	for (i=0; i<args.length; i=i+1) {
		package = args[i].split('.');
		root = window;
		
		for (j=0; j<package.length; j=j+1) {
	        root[package[j]] = root[package[j]] || {};
	        root = root[package[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;
	}
}

/*
 * 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){
			elementIdPrefixes = elementIds;
			linkLabel =  labels;
			linkHref =  hrefs;
			linkRfrr =  rfrrs;
			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<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(elementIdPrefixes[0] + tabIndex,'xp-bx-tabs-selected');
		YAHOO.util.Dom.setStyle(elementIdPrefixes[1] + tabIndex,'display','block');

		if (linkLabel[tabIndex] != '') {
			YAHOO.util.Dom.setStyle(elementIdPrefixes[2] + tabIndex,'display','block');
			YAHOO.util.Dom.setAttribute(elementIdPrefixes[2] + tabIndex, 'href', linkHref[tabIndex]);
			YAHOO.util.Dom.setAttribute(elementIdPrefixes[2] + tabIndex, 'rfrr', linkRfrr[tabIndex]);
			YAHOO.util.Dom.get(elementIdPrefixes[3] + tabIndex).innerHTML = linkLabel[tabIndex];
		}else{
			YAHOO.util.Dom.setStyle(elementIdPrefixes[2] + tabIndex,'display','none');
		}
	}

/**
 *
 * Truncates text to specific number of characters within an element
 * and adds "Read more" link at end of truncated text.
 * @param strElement - Id of element where text should be extracted from
 * @param limit - Number of characters where the function should truncate.
 * @author William Pickens
 *
**/
function truncate_text(strElement, limit) {
	var bits, i,textStart,textStartn,textEnd;
	var str = document.getElementById(strElement).innerHTML;
	
	if ("string" !== typeof str) {
		return '';
	}
	
	bits = str.split('');
	if (bits.length > limit) {
		for (i = bits.length - 1; i > -1; --i) {
			if (i > limit) {
				bits.length = i;
			}
			else if (' ' === bits[i]) {
				bits.length = i;
				textStartn = i;
				break;
			}
		}
		// textStart = bits.push('...');
		
	textStart = bits.join('');
	
	var htmlelements = textStart.match(/<\w[^>]*>/g);
	if (htmlelements) {
		textStart = textStart.replace(/<\w[^>]*>/,'');
	}
	bits = str.split('');
	textEnd = bits.slice(textStartn);
	textEnd = textEnd.join('');
	
	str = textStart + " ... <span id='text_more' class='seo_text_more'>" + textEnd + "</span> <div class='xp-b-clearfix'>&nbsp;</div><a id='read_more' class='read-more closed' href='javascript:showHide(\""+strElement+"\");'>Read More <em>&nbsp;</em></a> ";
	
	return document.getElementById(strElement).innerHTML = str;
	} else {
		return '';
	}
};

function showHide(strElement) {
	if (document.getElementById('text_more')) {
		if (document.getElementById('text_more').style.display != 'inline') {
			document.getElementById('text_more').style.display = 'inline';
			document.getElementById(strElement).innerHTML = document.getElementById(strElement).innerHTML.replace('...','');
			document.getElementById('read_more').innerHTML = 'Hide text <em>&nbsp;</em>';
			document.getElementById('read_more').className = "read-more open";
		}
		else {
			document.getElementById('text_more').style.display = 'none';
			var elipse = document.createTextNode('...');
			var text = document.getElementById('text_more');
			document.getElementById(strElement).insertBefore(elipse,text);
			document.getElementById('read_more').innerHTML = 'Read More <em>&nbsp;</em>';
			document.getElementById('read_more').className = "read-more closed";
		}
	}
}

