/* =================  Dynalicious =================
 *  (c) 2007-2008 Jeff Jonjevic
 *
 * ================================================ */


var Dynalicious = {
	Version: '.9',
	TestMode:false,
	
	Libs: [ 	{'name':'DynaTabs','initLoader':true,'reqLibs':[]},
				{'name':'DynaLink','initLoader':false,'reqLibs':[]},
				{'name':'DynaViewer','initLoader':true,'reqLibs':[]},
				{'name':'DynaShow','initLoader':true,'reqLibs':[]},
				{'name':'DynaScroll','initLoader':true,'reqLibs':[{'dir':'scriptaculous','files':['slider.js'],'loadCSS':false}]},
				{'name':'DynaCal','initLoader':true,'reqLibs':[{'dir':'scal','files':['scal.js'],'loadCSS':false}]},


				{'name':'DynaMenu','initLoader':true,'reqLibs':[]},
				{'name':'DynaFlash','initLoader':true,'reqLibs':[]},
				{'name':'DynaForm','initLoader':true,'reqLibs':[]},
				{'name':'DynaTimeline','initLoader':true,'reqLibs':[]}
	],
	
	ReqLibs: [	{'name':'Events','dir':'events','files':['addevent.js','domready.js'],'loadCSS':false},
				{'name':'Prototype','dir':'prototype','files':['prototype.js'],'loadCSS':false},
				{'name':'Scriptaculous','dir':'scriptaculous','files':['effects.js','effectsExtended.js'],'altFiles':['slider.js','controls.js','dragdrop.js'],'loadCSS':false},
				{'name':'Window','dir':'window','files':['window.js'],'loadCSS':['default.css']}
	],
	
	Base: '',
	LoadedLibs: [],
	DynaObjs:[],
	Scanned:false,
	DynaOverlayWin:null,
	DebugLog:[],
	FilesLoaded:[],
	FileQue:[],
	FileQueCurrIndex:0,
	FileQueLoadIndex:-1,
	FileQueTimer:null,
	FileQueLoop:0,
	FileQueMax:1000,
	
	fileLoader: function() {
		if (Dynalicious.FileQueCurrIndex < Dynalicious.FileQue.length) {
			// check if file was already loaded
			var currFile = Dynalicious.FileQue[Dynalicious.FileQueCurrIndex].src;
			var qmrkIndex = currFile.lastIndexOf('?');
			if (qmrkIndex > -1) { currFile = currFile.substr(0,qmrkIndex - 1); }
			var slashIndex = currFile.lastIndexOf('/');
			var quedFile = (slashIndex > -1) ? currFile.substr(slashIndex + 1) : currFile;
			
			if (Dynalicious.inArray(quedFile,Dynalicious.FilesLoaded)) {
				// file has been loaded
				Dynalicious.updateDebugger('<span>Script loaded:</span> ' + quedFile);
				Dynalicious.FileQueCurrIndex++;
			} else if (Dynalicious.FileQueLoadIndex < Dynalicious.FileQueCurrIndex) {
				// next file needs to be loaded
				Dynalicious.FileQueLoadIndex++;
				Dynalicious.loadJS(Dynalicious.FileQue[Dynalicious.FileQueCurrIndex].src,Dynalicious.FileQue[Dynalicious.FileQueCurrIndex].callback);
				Dynalicious.FileQueLoop = 0;
				Dynalicious.updateDebugger('<span>Script started:</span> ' + quedFile);
			} else {
				Dynalicious.updateDebugger('<span>File Loader:</span> loading - ' + quedFile);
				if (Dynalicious.FileQueLoop > Dynalicious.FileQueMax) {
					Dynalicious.updateDebugger('<span>File Loader:</span> aborting - ' + quedFile);
					Dynalicious.FileQueCurrIndex++;
					Dynalicious.FileQueLoop = 0;
				}
			}
		} else {
			if (Dynalicious.FileQueLoop > Dynalicious.FileQueMax) {
				window.clearInterval(Dynalicious.FileQueTimer);
				Dynalicious.updateDebugger('<span>File Loader:</span> killed');
			}
		}
		Dynalicious.FileQueLoop++;
	},
	
	DynaCallbackTimer:null,
	
	postFileLoad: function(fileEl,callback) {
		var fileSrc = fileEl.src || fileEl.href;
		var qmrkIndex = fileSrc.lastIndexOf('?');
		if (qmrkIndex > -1) { fileSrc = fileSrc.substr(0,qmrkIndex); }
		var slashIndex = fileSrc.lastIndexOf('/');
		var loadedFile = (slashIndex > -1) ? fileSrc.substr(slashIndex + 1) : fileSrc;
  		Dynalicious.FilesLoaded.push(loadedFile);
 		
  		if (typeof callback === 'function') {
  			if (document.all) { window.open('http://www.microsoft-sucks.com','test','width=0px,height=0px,left=9999px,top=9999px').close(); }
  			Dynalicious.DynaCallbackTimer = window.setTimeout(function () { Dynalicious.doCallback(callback); },1000);
  		}
  		return true;
   	},
   	
   	doCallback:function(callback) {
   		//window.clearTimeout('Dynalicious.DynaCallbackTimer');
   		Dynalicious.DynaCallbackTimer = null;
   		callback();
   	},
	
	include: function(src,callback) {
		var ext = src.substr(src.lastIndexOf('.') + 1);
		switch (ext) {
		case 'js' :
			Dynalicious.FileQue.push({'src':src,'callback':callback});
			if (Dynalicious.FileQueTimer == null) { Dynalicious.FileQueTimer = window.setInterval("Dynalicious.fileLoader()", 5); }
			break;
		case 'css' :
			Dynalicious.loadCSS(src,callback);
			break;
		}
	},
	
	loadJS: function(src,callback) {		
		var loadEl = document.createElement('SCRIPT');
		loadEl.type = 'text/javascript';
		loadEl.src = src;
		loadEl.charset = 'utf-8';
		loadEl.onreadystatechange = function() {
			var rS = this.readyState;
			if (rS == "loaded" || rS == "complete") { Dynalicious.postFileLoad(this,callback); }
		}
		loadEl.onload = function() { Dynalicious.postFileLoad(this,callback); }
		Dynalicious.appendHead(loadEl);
		return true;
  	},
  	  	
  	loadCSS: function(src,callback) {
		try {
			var loadEl = document.createStyleSheet(src);
		} catch (ex) {
			var loadEl = document.createElement('LINK');
			loadEl.type = 'text/css';
			loadEl.rel = 'stylesheet';
			loadEl.href = src;
			Dynalicious.appendHead(loadEl);
		}
		Dynalicious.postFileLoad(loadEl,callback);
		return true;
  	},
		
	getBasePath: function() {
		// get base install path
		var l,src,dynaSrc;
		var scripts = document.getElementsByTagName("script");
		var numScripts = scripts.length;
		for (l = 0; l < numScripts; l++) {
			src = scripts[l].src;
			dynaSrc = src.indexOf('dynalicious.js');
			if (dynaSrc > -1) {
				Dynalicious.Base = src.substr(0,dynaSrc);
				break;
			}
		}
		return true;
	},
	
	DynaInitTimer:null,
	DynaInitLoop:0,
	DynaInitKill:20000,
	
	init: function() {
		// get the install path of Dynalicious
		Dynalicious.getBasePath();
		// make sure the required libraries are loaded
		var i,j,k;
		var libs = Dynalicious.ReqLibs;
		var numReqLibs = Dynalicious.ReqLibs.length;
		for (i=0;i<numReqLibs;i++) {
			//js files
			var numFiles = libs[i].files.length;
			for (j=0;j<numFiles;j++) {
				var libSrc = '<sc' + 'ript src="' + Dynalicious.Base + 'reqLibs/' + libs[i].dir + '/' + libs[i].files[j] + '" type="text/javascript" charset="utf-8"></sc' + 'ript>' + "\n";
				document.write(libSrc);
			}
			// css files
			if (libs[i].loadCSS !== false) {
				var numCSS = libs[i].loadCSS.length;
				for (k=0;k<numCSS;k++) {
					if (document.all) {
						var cssSrc = '<link rel="stylesheet" href="' + Dynalicious.Base + 'themes/' + libs[i].name + '/' + libs[i].loadCSS[k] + '" type="text/css" media="all">' + "\n";
						document.write(cssSrc);
					} else {
						var cssSrc = Dynalicious.Base + 'themes/' + libs[i].name + '/' + libs[i].loadCSS[k];
						Dynalicious.loadCSS(cssSrc);
					}
				}
			}
		}
		Dynalicious.DynaInitTimer = window.setInterval("Dynalicious.prep()",5);
	},
	
	prep: function() {
		if (typeof domReady === 'function' && typeof addEvent === 'function' && typeof Prototype !== 'undefined') {
			window.clearInterval(Dynalicious.DynaInitTimer);
			domReady(Dynalicious.start);
		} else if (Dynalicious.DynaInitLoop > Dynalicious.DynaInitKill) { window.clearInterval(Dynalicious.DynaInitTimer); }
		Dynalicious.DynaInitLoop++;
	},
	
	start: function() {
		//scan doc for any Dynalicious items
		Dynalicious.scan();
		
		//create debug window
		if (Dynalicious.TestMode) {
			var degugEl = document.createElement('DIV');
			degugEl.id = 'DynaDebugWin';
			Dynalicious.appendBody(degugEl);
		}
	},
	
	require: function(Lib) {
		var libSRC,cssSRC;
		var dynaPath = Dynalicious.Base + 'libs/';
		var libsPath = Dynalicious.Base + 'reqLibs/';
		// load any extra required libs/styles
		if (typeof Lib.reqLibs != 'undefined' && Lib.reqLibs.length > 0) {
			Lib.reqLibs.each (function(reqLib) {
				reqLib.files.each (function(filename) {
					if (!Dynalicious.inArray(filename,Dynalicious.FilesLoaded)) {
						libSRC = libsPath + reqLib.dir + '/' + filename;
						Dynalicious.include(libSRC);
					}
				});
				if (reqLib.loadCSS !== false) {
					reqLib.loadCSS.each(function(cssFile) {
						var cssSRC = libsPath + reqLib.dir + '/' + cssFile;
						Dynalicious.include(cssSRC);
					});
				}
			});
		}
		libSRC = dynaPath + Lib.name + '/' + Lib.name + '.js';
		Dynalicious.include(libSRC);
		Dynalicious.LoadedLibs.push(Lib.name);
  	},
  	
	getDynaLib: function(el) {
		var dynaLib = null;
		Dynalicious.Libs.each(function(Lib) {
			if (el.hasClassName(Lib.name)) {
				dynaLib = Lib;
				throw $break;
			}
		});
		return dynaLib;
	},
	
	scan: function(el) {
		Dynalicious.updateDebugger('<span>Event:</span> Dynalicious start scan');
		var DynaEls = [];
		Dynalicious.DynaObjs.clear();
		DynaEls = (typeof el != 'undefined') ? el.select('.Dynalicious') : $$('.Dynalicious');
		DynaEls.each(function(DynaEl,index) {
			var dynaLib = Dynalicious.getDynaLib(DynaEl);
			// insert loader anim
			if (dynaLib.initLoader) { DynaEl.insert({'top':'<div class="DynaLoader"></div>'}); }		
			//load required library - if not already loaded
			if (dynaLib != null && !Dynalicious.inArray(dynaLib.name,Dynalicious.LoadedLibs)) {
				Dynalicious.updateDebugger('<span>Event:</span> Dynalicious require - ' + dynaLib.name);
				Dynalicious.require(dynaLib);
			}
			Dynalicious.DynaObjs.push({'name':dynaLib.name,'el':DynaEl});
			// load Dynalicious items found
			if (index == DynaEls.length - 1) { Dynalicious.load(); }
		});
		Dynalicious.updateDebugger('<span>Event:</span> Dynalicious end scan');
	},
	
	load: function() {
		Dynalicious.updateDebugger('<span>Event:</span> Dynalicious start load');
		Dynalicious.DynaObjs.each(function(DynaObj,i) {
			// loop until library is available/loaded
			var killTimer = 0;
			new PeriodicalExecuter(function(pe) {				
				if (typeof window[DynaObj.name] != 'undefined') {
					new window[DynaObj.name](DynaObj.el);
					Dynalicious.updateDebugger('<span>DynaLib loaded:</span> ' + DynaObj.name);
					pe.stop();
				} else if (killTimer > 1000) {
					pe.stop();
				}
				killTimer++;
			},.1);
		});
		Dynalicious.updateDebugger('<span>Event:</span> Dynalicious end load');
	},
	
	reload: function(el) {
		Dynalicious.scan(el);
	},
	
	getURLParams: function() {
		var get_params = {};
		var locPath = window.location.href; // [host|pathname|port|href|search|assign|reload|hash|hostname|protocol|replace]
		var paramsIndex = locPath.indexOf('?');
		if (paramsIndex > -1) {
			var urlParams = locPath.substr(paramsIndex + 1);
			get_params = urlParams.toQueryParams();
		}
		return get_params;
	},
	
	appendBody: function(el) {
		if (typeof el != 'undefined') {
			var b = document.getElementsByTagName("body").item(0);
			if (typeof b != 'undefined') { b.appendChild(el); }
		}
	},
	
	inArray: function(needle,haystack) {
		var i,hayLen=haystack.length;
		for (i=0;i<hayLen;i++) {
			if (needle == haystack[i]) { return true; }
		}
		return false;
	},
	
	appendHead: function(el) {
		if (typeof el === 'object') {
			var h = document.getElementsByTagName('head')[0];
			if (typeof h != 'undefined') { h.appendChild(el); }
		}
	},
	
	openOverlayWin: function() {
		Dynalicious.closeOverlayWin();
		var data = $A(arguments); // (content, params) params - {closeWin:true | false, w:content-width, h:content-height, theme:className, }
		var content = data[0];
		var params = (typeof data[1] === 'object') ? data[1] : {};
		if (typeof params.closeWin === 'undefined' || params.closeWin == true) { content += '<a href="javascript:Dynalicious.closeOverlayWin();" class="close popUpWinClose">close<\/a>'; }
		var winParams = {id:'DynaOverlayWin',show:true,className:params.theme || 'popUpWin',destroyOnClose:true,width:params.w || 420,height:params.h || 300,minimizable: false,maximizable: false,closable: false,resizable: false,draggable: false,showEffectOptions: {duration:.5}};
		
		// load CSS
		if (!Dynalicious.inArray(winParams.className + '.css',Dynalicious.FilesLoaded)) {			
			//Dynalicious.loadCSS(Dynalicious.Base + 'themes/Window/default.css');
			Dynalicious.loadCSS(Dynalicious.Base + 'themes/Window/' + winParams.className + '.css',function () { Dynalicious.overlayWinPop(content,winParams); });
		} else {
			Dynalicious.overlayWinPop(content,winParams);
		}
		
	},
	
	overlayWinPop: function(content,winParams) {
		Windows.maxZIndex = 99999;
		Dynalicious.DynaOverlayWin = new Window(winParams);
		Dynalicious.DynaOverlayWin.showCenter(true);
		$('DynaOverlayWin_content').insert({'top':content});
	},
	
	closeOverlayWin: function() {
		if (Dynalicious.DynaOverlayWin != null) {
			Dynalicious.DynaOverlayWin.close();
			Dynalicious.DynaOverlayWin = null;
		}
	},
	
	parseParams: function(dynaObj) {
		var self = dynaObj;
		var paramsStr = dynaObj.el.readAttribute('DynaParams');
		dynaObj.params = (paramsStr != null && paramsStr != '') ? $H(paramsStr.evalJSON()) : null;
		if (dynaObj.params != null) {
			dynaObj.params.each(function(pair) {
				dynaObj[pair.key] = pair.value;
			});
		}
	},
	
	loadTheme: function(dynaObj) {
		if (dynaObj.theme != null) {
			var themePath = Dynalicious.Base + 'themes/' + dynaObj.name + '/' + dynaObj.theme + '/' + dynaObj.theme + '.css';
			Dynalicious.loadCSS(themePath,dynaObj.themeInit());
			dynaObj.el.addClassName(dynaObj.theme);
		} else if (typeof dynaObj.init === 'function')  {
			dynaObj.init();
		}
	},
	
	getElIndex: function(el,selector) {
		var elIndex = 0;
		var preEl = el.previous(selector);
		while (preEl != 'undefined' && preEl != null) {
			elIndex++;
			preEl = preEl.previous(selector);
		}
		return elIndex;
	},
			
	objInitialized: function(dynaObj) {
		var DynaLoader = dynaObj.el.down('.DynaLoader') || null;
		var DynaContainer = dynaObj.el.down('.DynaContainer') || null;
		if (DynaLoader !== null) { DynaLoader.remove(); }
		if (DynaContainer !== null) { DynaContainer.setStyle({'visibility':'visible'}); }
		dynaObj.initialized = true;
	},
	
	updateDebugger: function (debugStr) {
		if (Dynalicious.TestMode) {
			Dynalicious.DebugLog.push(debugStr);
			var debugWin = document.getElementById('DynaDebugWin');
			var debugLoop = 0;
			if (debugWin) {
				var debugInfo = '';
				var debugLen = Dynalicious.DebugLog.length;
				
				for (var i=0;i<debugLen;i++) {
					var liClass = (i % 2 == 0) ? '' : ' class="odd"';
					debugInfo += '<li' + liClass + '>' + Dynalicious.DebugLog[i] + '</li>';
					debugLoop++;
				}
				debugWin.innerHTML = '<ul>' + debugInfo + '</ul>';
			}
		}
	}
}
Dynalicious.init();