EDDIE.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
*/
EDDIE.cx.exp.util.toggleContainer = function(openLink, closeLink, content){
	var obj = {};
	
	var showLink = openLink;
	var hideLink = closeLink;
	var content = content;

	var subscribeEvents = function(){
		EDDIE.util.Event.addListener(showLink, "click", showLinksCallback);
		EDDIE.util.Event.addListener(hideLink, "click", hideLinksCallback);
	}
	
	var showLinksCallback = function(e){
		EDDIE.util.Dom.setStyle([hideLink,content], 'display','block');
		EDDIE.util.Dom.setStyle(showLink, 'display','none');
	}
	
	var hideLinksCallback = function(e){
		EDDIE.util.Dom.setStyle([hideLink,content], 'display','none');
		EDDIE.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
*/
EDDIE.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(){
		EDDIE.util.Event.addListener(switchEl, "click", toggleCallback);
	}
	
	var toggleCallback = function(e){
		if(open){
			EDDIE.util.Dom.setStyle(showEl, 'display','none');
			EDDIE.util.Dom.setStyle(hideEl, 'display','block');
			open = false;
		}
		else{
			EDDIE.util.Dom.setStyle(showEl, 'display','block');
			EDDIE.util.Dom.setStyle(hideEl, 'display','none');
			open = true;
		}
	}
	
	var init = function(){
		subscribeEvents();
	}
	init();
	return obj;
}

EDDIE.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
 */
EDDIE.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;
	}
}

