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

var Dynalicious = {
	Version: '.8',
	
	Globals: {	'htmlDir':'/apcevents',
				'dynaDir':'/libs/dynalicious/',
				'libsDir':'/libs/',
				'flashDir':'/flash/',
				'ajaxDir':'/ajax/'
	},
		
	Libs: [ 	{'name':'DynaMenu','loadCSS':true,'initLoader':true,'reqLibs':[]},
				{'name':'DynaViewer','loadCSS':true,'initLoader':true,'reqLibs':[]},
				{'name':'DynaFlash','loadCSS':true,'initLoader':true,'reqLibs':[]},
				{'name':'DynaTabs','loadCSS':true,'initLoader':true,'reqLibs':[]},
				{'name':'DynaShow','loadCSS':true,'initLoader':true,'reqLibs':[]},
				{'name':'DynaForm','loadCSS':true,'initLoader':true,'reqLibs':[]},
				{'name':'DynaLink','loadCSS':true,'initLoader':false,'reqLibs':[]},
				{'name':'DynaCal','loadCSS':true,'initLoader':true,'reqLibs':[{'name':'scal','loadCSS':true}]},
				{'name':'DynaTimeline','loadCSS':true,'initLoader':true,'reqLibs':[]}
	],
	
	ReqLibs: [	{'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':['themes/default.css','themes_xtra/popUpWin.css']}
	],
	
	TotalReqLibs:0,
	LoadedLibs: [],
	DynaObjs:[],
	Scanned:false,
	
	DynaOverlayWin:null,
	
	TestMode:false,
	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];
			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]);
				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++;
	},
	
	postFileLoad: function(fileEl) {
		var fileSrc = fileEl.src;
		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);
   	},	
	
	includeLib: function(libSrc) {
		Dynalicious.FileQue.push(libSrc);
		if (Dynalicious.FileQueTimer == null) { Dynalicious.FileQueTimer = window.setInterval("Dynalicious.fileLoader()", 5); }
	},
	
	loadJS: function(filePath) {
		var loadEl = document.createElement('SCRIPT');
		loadEl.type = 'text/javascript';
		loadEl.src = filePath;
		loadEl.charset = 'utf-8';
		loadEl.onreadystatechange = function() {
			var rS = this.readyState;
			if (rS === "loaded" || rS === "complete") { Dynalicious.postFileLoad(this); }
		}
		loadEl.onload = function() { Dynalicious.postFileLoad(this); }
		Dynalicious.appendHead(loadEl);
		return false;
  	},
  	  	
  	loadCSS: function(filePath) {
		try {
			var loadEl = document.createElement('LINK');
			loadEl.type = 'text/css';
			loadEl.rel = 'stylesheet';
			loadEl.href = filePath;
			Dynalicious.appendHead(loadEl);
		} catch (ex) {
			var loadEl = document.createStyleSheet(filePath);
		}
  	},
	
	DynaInitTimer:null,
	
	setUp: function() {
		var i,j,k;
		var libs = Dynalicious.ReqLibs;
		var numReqLibs = libs.length;
		for (i=0;i<numReqLibs;i++) {
			//js files
			var numFiles = libs[i].files.length;
			Dynalicious.TotalReqLibs += numFiles;
			for (j=0;j<numFiles;j++) {
				var libSrc = Dynalicious.Globals.htmlDir + Dynalicious.Globals.libsDir + libs[i].dir + '/' + libs[i].files[j];
				Dynalicious.includeLib(libSrc);
			}
			// css files
			if (libs[i].loadCSS !== false) {
				var numCSS = libs[i].loadCSS.length;
				for (k=0;k<numCSS;k++) {
					var cssSrc = Dynalicious.Globals.htmlDir + Dynalicious.Globals.libsDir + libs[i].dir + '/' + libs[i].loadCSS[k];
					Dynalicious.loadCSS(cssSrc);
				}
			}
		}
		Dynalicious.DynaInitTimer = window.setInterval("Dynalicious.init()",5);
	},
	
	
	init: function() {
		if (Dynalicious.FileQueCurrIndex >= Dynalicious.TotalReqLibs && typeof Prototype != 'undefined') {
			window.clearInterval(Dynalicious.DynaInitTimer);
			//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.Globals.htmlDir + Dynalicious.Globals.dynaDir;
		var libsPath = Dynalicious.Globals.htmlDir + Dynalicious.Globals.libsDir;
		libSRC = dynaPath + Lib.name + '/' + Lib.name + '.js';
		Dynalicious.includeLib(libSRC);
		Dynalicious.LoadedLibs.push(Lib.name);
		// load any extra required libs/styles
		if (typeof Lib.reqLibs != 'undefined' && Lib.reqLibs.length > 0) {
			Lib.reqLibs.each (function(reqLib) {
				if (!Dynalicious.inArray(reqLib.name,Dynalicious.LoadedLibs)) {
					libSRC = libsPath + reqLib.name + '/' + reqLib.name + '.js';
					Dynalicious.includeLib(libSRC);
					Dynalicious.LoadedLibs.push(reqLib.name);
					if (reqLib.loadCSS) {
						cssSRC = libsPath + reqLib.name + '/' + reqLib.name + '.css';
						Dynalicious.loadCSS(cssSRC);
					}
				}
			});
		}
  	},
  	
	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);
			//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') {
					//init
					Dynalicious.objInit(DynaObj);
					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();
		Windows.maxZIndex = 99999;
		var data = $A(arguments); // (content, params)
		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>'; }
		
		Dynalicious.DynaOverlayWin = new Window({id:params.id || 'DynaOverlayWin',show:true,className:params.className || 'popUpWin',destroyOnClose:true,width:params.w || 420,height:params.h || 300,minimizable: false,maximizable: false,closable: false,resizable: false,draggable: false,showEffectOptions: {duration:.5}});
		Dynalicious.DynaOverlayWin.showCenter(true);
		
		return $('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 (Dynalicious.getDynaLib(dynaObj.el).loadCSS && dynaObj.theme != null) {
			var themePath = Dynalicious.Globals.htmlDir + Dynalicious.Globals.dynaDir + dynaObj.name + '/themes/' + dynaObj.theme + '/' + dynaObj.theme + '.css';
			Dynalicious.loadCSS(themePath);
			dynaObj.el.addClassName(dynaObj.theme);
		}
	},
	
	getElIndex: function(el,selector) {
		var elIndex = 0;
		var preEl = el.previous(selector);
		while (preEl != 'undefined' && preEl != null) {
			elIndex++;
			preEl = preEl.previous(selector);
		}
		return elIndex;
	},
	
	needsLoader: function(dynaName) {
		var initLoader = false;
		Dynalicious.Libs.each(function(lib) { if (lib.name == dynaName && lib.initLoader) { initLoader = true; } });
		return initLoader;
	},
	
	objInit: function(dynaObj) {
		if (Dynalicious.needsLoader(dynaObj.name) || dynaObj.initLoader === true) {
			var DynaLoader = dynaObj.el.down('.DynaLoader') || null;
			if (DynaLoader === null) {
				dynaObj.el.insert({'top':'<div class="DynaLoader"></div>'});
			}
		}
	},
	
	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>';
			}
		}
	}
}




// ================= load domReady function if needed =================

if (typeof domReady != 'function') {
// DOMContentLoaded event handler. Works for browsers that don't support the DOMContentLoaded event.
//
// Modification Log:
// Date 	Initial Description
// 26 May 2008	TKO	Created by Tanny O'Haley

/*global addEvent, escape, unescape */

var domReadyEvent = {
	name: "domReadyEvent",
	events: {},
	domReadyID: 1,
	bDone: false,
	DOMContentLoadedCustom: null,
	add: function(handler) {
		if (!handler.$$domReadyID) {
			handler.$$domReadyID = this.domReadyID++;
			if(this.bDone){
				handler();
			}
			this.events[handler.$$domReadyID] = handler;
		}
	},
	remove: function(handler) {
		if (handler.$$domReadyID) {
			delete this.events[handler.$$domReadyID];
		}
	},
	run: function() {
		if (this.bDone) {
			return;
		}
		this.bDone = true;
		for (var i in this.events) {
			this.events[i]();
		}
	},
	schedule: function() {
		if (this.bDone) {
			return;
		}
		if(/KHTML|WebKit/i.test(navigator.userAgent)) {
			if(/loaded|complete/.test(document.readyState)) {
				this.run();
			} else {
				setTimeout(this.name + ".schedule()", 100);
			}
		} else if(document.getElementById("__ie_onload")) {
			return true;
		}
		if(typeof this.DOMContentLoadedCustom === "function") {
			if(typeof document.getElementsByTagName !== 'undefined' && (document.getElementsByTagName('body')[0] !== null || document.body !== null)) {
				if(this.DOMContentLoadedCustom()) {
					this.run();
				} else {
					setTimeout(this.name + ".schedule()", 250);
				}
			}
		}

		return true;
	},
	init: function() {
		if(document.addEventListener) {
			document.addEventListener("DOMContentLoaded", function() { domReadyEvent.run(); }, false);
		}
		setTimeout("domReadyEvent.schedule()", 100);
		function run() {
			domReadyEvent.run();
		}
		if(typeof addEvent !== "undefined") {
			addEvent(window, "load", run);
		} else if(document.addEventListener) {
			document.addEventListener("load", run, false);
		} else if(typeof window.onload === "function") {
			var oldonload = window.onload;
			window.onload = function() {
				domReadyEvent.run();
				oldonload();
			};
		} else {
			window.onload = run;
		}

		/* for Internet Explorer */
		/*@cc_on
			@if (@_win32 || @_win64)
			document.write("<script id=__ie_onload defer src=\"//:\"><\/script>");
			var script = document.getElementById("__ie_onload");
			script.onreadystatechange = function() {
				if (this.readyState == "complete") {
					domReadyEvent.run(); // call the onload handler
				}
			};
			@end
		@*/
	}
};
var domReady = function(handler) { domReadyEvent.add(handler); };
domReadyEvent.init();
}




// ================= start Dynalicious =================
domReady(Dynalicious.setUp);