/*
 * includer.js
 * $Revision: 1.16 $
 *
 * dependencies: jQuery
 *
 * (c) 1992-2009 Cisco Systems, Inc. All rights reserved.
 * Terms and Conditions: http://cisco.com/en/US/swassets/sw293/sitewide_important_notices.html
 */

if (typeof(cdc) == "undefined") cdc = new Object();
if (typeof(cdc.includer) == "undefined"){
	cdc.includer = {};
	if (typeof(cdc.includer.alreadyInPage) == 'undefined'){
		cdc.includer.alreadyInPage = [];
	}
	cdc.includer.widgets = {
		'module-sbt':{
			js: [
				'http://cisco.com/cdc_content_elements/visualsciences/visualsciences.js',
				'http://cisco.com/web/fw/j/sbt.js'
			],
			css: ['http://cisco.com/web/fw/c/sbt.css']
		},
                'widget-popular':{
			js: [
				'/web/fw/w/widget-popular.js',
				'http://cmsg-ws.cisco.com/js/discovery.js'
			]
		},
		'cdc-widget-accordion' : {
			js: [
				'http://www.cisco.com/cdc_content_elements/visualsciences/visualsciences.js',
				'/web/fw/lib/jquery.hoverIntent.minified.js',
				'/web/fw/w/accordion/widget-accordion.js'
			]
		},
		'cdc-widget-lightbox' : {
			js: [
			  '/web/fw/lib/jqmodal.js',
			  '/web/fw/lib/jquery.bgiframe.min.js',
			  'http://www.cisco.com/cdc_content_elements/flash/swfobject/swfobject.js',
			  '/web/fw/w/lightbox/lightbox.js'
			],
			css: [
			   '/web/fw/w/lightbox/lightbox.css'
			]
		},

		// Note: Component Library code is now in /web/fw/w/cl/cl.js
		'_default':{
			js: [
				//'/web/fw/w/cl/cl.min.js'
				'/web/fw/w/cl/cl.js'
			]
		}
	};

	cdc.includer.search = function(widgets){
		for (id in widgets){
			if (id == '_default' || document.getElementById(id)){
				if (widgets[id]['css'] && widgets[id]['css'].length){
					cdc.includer.loadCss(widgets[id]['css']);
				}
				if (widgets[id]['js'] && widgets[id]['js'].length){
					cdc.includer.loadJs(widgets[id]['js'],
						{callback:widgets[id]['callback']}
					);
				}
				else if (widgets[id]['callback']){
					(widgets[id]['callback'])();
				}
			}
		}
	};

	cdc.includer.uniquifyIncludes = function(includes,type) {
		var dedup = {};
		var deduped = [];
		var nodeName, attrName;
                if (type == 'js') {
			nodeName = 'script';
			attrName = 'src';
		}
		else if (type == 'css') {
			nodeName = 'link';
			attrName = 'href';
		}

		for (var i=0;i<includes.length;i++){
			dedup[includes[i]]=1;
		}
		if (typeof(cdc.includer.alreadyInPage) != 'undefined'){
			for (var i=0;i<cdc.includer.alreadyInPage.length;i++){
				dedup[cdc.includer.alreadyInPage[i]]=0;
			}
		}
		jQuery(nodeName).each(function(){
			if (this[attrName]){
				var uncachedUrl = this[attrName].replace(/http:\/\/[^\/]*/,'');
				uncachedUrl = uncachedUrl.replace(/[\&\?]cacheReset=[0-9\-]*/,'');
				dedup[uncachedUrl]=0;
			}
		});
		for (var i=0;i<includes.length;i++){
			if (dedup[includes[i]]){
				deduped.push(includes[i]);
			}
		}
		return deduped;
	};

	cdc.includer.loadCss = function(includes,extraArgs){
		if (typeof includes == "string") {
			includes = [ includes ];
		}
		if (!extraArgs){
			extraArgs = {};
		}

		includes = cdc.includer.uniquifyIncludes(includes,'css');
		for (var i=0;i<includes.length;i++){
			//NEED TO check for css in dom
			//include css if not there already
			var css = document.createElement('link');
			css.setAttribute('rel', 'stylesheet');
			css.setAttribute('type', 'text/css');
			css.setAttribute('href', includes[i]);
                        if (extraArgs.ids && extraArgs.ids[i]) {
				css.setAttribute('id', extraArgs.ids[i]);
                        }
			document.getElementsByTagName('head')[0].appendChild(css);
		}

	};

	cdc.includer.loadJs = function(includes,extraArgs){
		cdc.debug.log('includer: loadjs');
		cdc.debug.log('includer: includes is a '+typeof includes);
		if (typeof includes == "string") {
			includes = [ includes ];
		}
		else {
			cdc.debug.log('includer: it is '+includes.length+' long.');
			cdc.debug.log('includer: first element: '+includes[0]);
		}

		if (!extraArgs){
			extraArgs = {};
		}

		if (!extraArgs.hasBeenCleaned){
			includes = cdc.includer.uniquifyIncludes(includes,'js');
			extraArgs.hasBeenCleaned=1;
			if (includes.length==0){
				if (extraArgs.callback){
					cdc.debug.log('includer: there are no js files and there is a callback, doing it.');
					extraArgs.callback();
				}
				return;
			}
		}

		var currentFile = includes.shift();

		var scriptNode = document.createElement('script');
		document.getElementsByTagName("head")[0].appendChild(scriptNode);
		scriptNode.language='javascript';
		if (extraArgs.ids && extraArgs.ids.length) {
			scriptNode.id = extraArgs.ids.shift();
		}

		if (includes.length){
			cdc.debug.log('includer: there are more includes after this one so build in recursion using an event handler on the script node');
			if(document.attachEvent){//IE
				scriptNode.onreadystatechange = function(){
					if (this.readyState == "loaded") {
						cdc.includer.loadJs(includes,extraArgs);
					}
				}
			}
			else{
				scriptNode.onload = function(){cdc.includer.loadJs(includes,extraArgs);};
			}
		}
		else if (extraArgs.callback){
			cdc.debug.log('includer: there are no more includes after this one but there is a callback so put it on the script node as a handler');
			if(document.attachEvent){//IE
				scriptNode.onreadystatechange = function(){
					if (this.readyState == "loaded") {
						extraArgs.callback();
					}
				}
			}
			else{
				scriptNode.onload = function(){extraArgs.callback();};
			}
		}
		var src = currentFile;
		if (jQuery.browser.msie && !src.match(/noCacheBust/) && !extraArgs.noCacheBust){
                      src = cdc.includer.cacheBust(currentFile);
		}
		cdc.debug.log('includer: setting src on script node to '+src);
		scriptNode.src=src;
	};

	jQuery( function(){cdc.includer.search(cdc.includer.widgets)} );
}

// cache buster - puts a cache avoidance param on a url with a random number
// invoke with:
// cdc.includer.cacheBust('http://www.cisco.com');          = YourUrl?cacheReset=rand#
// cdc.includer.cacheBust('http://www.cisco.com','foo');    = YourUrl?foo=rand#
// cdc.includer.cacheBust('http://ng-prod1/image');         = YourUrl&cacheReset=rand#
// cdc.includer.cacheBust('http://cisco.com/edit.pl?a=3');  = YourUrl&cacheReset=rand#
  cdc.includer.cacheBust = function(url,param){
    if (!param) {param = 'cacheReset'};
    var delim = "?";
    // if url is ng-prod1(bam) or has ?, set param delimeter to &
    if (url.match(/(ng-prod1|\?)/)) {delim = "&"};
    var fullParam = delim+param+'=';
    // degug alert(url+fullParam+cdc_rand_num());
    return url+fullParam+cdc.includer.cdcRandNum();
  };

// randum number generator
// input: takes param limit to set random max, default is 1000
// output: 'TimeInSeconds-RandNum'
// invoke with: cdc.includer.randNum(50); or cdc_rand_num();
  cdc.includer.cdcRandNum = function(limit){
    if (!limit) {limit = 1000};
    var sNum = Math.floor(Math.random()*limit)+1;
    var sTime = (new Date).getTime();
    var rNum = sTime+"-"+sNum;
    return rNum;
  };
    
