/* ********************************************
 * Effects
 */
Effects = Class.create();
Effects.prototype = {
	initialize: function() {
		//default constructor
		this._timer = null;
	},
	fade: function(e) {
		//$(e).hide();
		Effect.Fade(e);
	},
	appear: function(e) {
		//$(e).show();
		Effect.Appear(e);
	},
	/*roundTabs: function() {
		var tabs = document.getElementsByClassName("menu_main_tab");
		for (var i = 0; i < tabs.length; i++) {
			var tab = tabs[i];
			Rico.Corner.round(tab, {
				corners:'top',
				compact:true,
				bgColor:'#003366'
			});
		}
	},*/
	round: function(e) {
		var box = $(e);
		var options = {
			corners : "all",
			color : "fromElement",
			bgColor : "fromParent",
			blend : true,
			border : false,
			compact : false
		};
		if ( box != null ) {
			Rico.Corner.round(box, options);
		}
	},
	selectTab: function(id) {
		try {
			var tabs = document.getElementsByClassName("menu_main_item");
			var selTab = $("menu_main_item_" + id);
			var className = "";
			for (var i = 0; i < tabs.length; i++) {
				className = tabs[i].className.replace("menu_main_item_selected", "")
				tabs[i].className = className;
			}
			selTab.className = selTab.className + " menu_main_item_selected";
		} catch(e) {
			// fails when bad id is passed
		}
	},
	selectPhotoNav: function(id) {		
		var tabs = document.getElementsByClassName("photogroup_nav");
		var selTab = $(id);
		var className = "";
		for (var i = 0; i < tabs.length; i++) {
			className = tabs[i].className.replace("photogroup_nav_selected", "")
			tabs[i].className = className;
		}
		selTab.className = selTab.className + " photogroup_nav_selected";		
	},
	doMenu: function(id, container) {
		try {
			var menus = container.getElementsByClassName("menu_main_group");
			var menu = $("menu_main_group_" + id);
			menu.show();
			for (var i = 0; i < menus.length; i++) {
				if ( menus[i] != menu ) {
					menus[i].hide();
				}
			}
		} catch(e) {
			// fails when bad id is passed
		}
	},
	startMenuTimer: function(id) {
		var menu = $("menu_main_group_" + id);
		var temp = function() {
			menu.hide();
			//Effect.Squish(menu);
		}
		this._timer = setTimeout(temp, 750);
	},
	stopMenuTimer: function() {
		clearTimeout(this._timer);
	},
	runEffects: function(pod) {
		var boxes = null;
		if ( pod == null ) {
			boxes = document.getElementsByClassName("round_box");
		} else {
			boxes = pod.getElementsByClassName("round_box");
		}
		for (var i = 0; i < boxes.length; i++) {
			this.round(boxes[i]);
		}
	}
}
var effects = new Effects();

/* ********************************************
 * EventDispatcher
 */
EventDispatcher = Class.create();
EventDispatcher.prototype = {
	initialize: function() {
		//default constructor
		this._switch = "/cms2/controller/switch.cfm?event=";
		
		var myGlobalHandlers = {
			onCreate: function(){
				Ajax.activeRequestCount++;
				//Effect.Fade("page_shield", {duration:0.0, from:0.5, to:0.5});
				//$("page_shield").show();
				$("page_loading").show();
				//effects.appear(this._pageLoadingPod);
			},
			onComplete: function() {
				Ajax.activeRequestCount--;
				if(Ajax.activeRequestCount == 0){
					//effects.fade("page_shield");
					//Effect.Fade("page_shield", {from: 0.5, to: 0.0});
					effects.fade("page_loading");
				}
			}
		};
		Ajax.Responders.register(myGlobalHandlers);		
	},
	dispatch: function(event, params, completeCallBack, failureCallBack) {
		var url = this._switch + event;
		var ajax = new Ajax.Request(
			url,
			{
				method: "post",
				parameters: params,
				onComplete: completeCallBack,
				onFailure: failureCallBack
			});
	}
}
var dispatcher = new EventDispatcher();

/* ********************************************
 * ViewUpdater
 */
ViewUpdater = Class.create();
ViewUpdater.prototype = {
	initialize: function() {
		//default constructor
	},
	updatePage: function(req) {
		var json = null;
		var podToSet = null;
		try {
			json = eval("(" + req.getResponseHeader("x-json") + ")");
			eval(json.CODE);
		} catch(e) {
			alert(e);
			//xwindows.showInWindow("ERROR: " + req.responseText);
			$("page").innerHTML = req.responseText;
		}
		xwindows.setTooltips();
		effects.runEffects(podToSet);
		setter.setEvents();
	},
	updateWindow: function(req) {
		effects.runEffects();
		setter.setEvents();
	},
	showError: function(req) {
		$("page").innerHTML = "Error " + req.status + ": " + req.statusText;
	}
}
var updater = new ViewUpdater();

/* ********************************************
 * Events
 */
Events = Class.create();
Events.prototype = {
	initialize: function() {
		
		this.initSite = new Object();
		this.initSite.eventHandler = function(e) {
			//effects.round("page_loading");
			dispatcher.dispatch(
				"initSite",
				"",
				updater.updatePage,
				updater.showError);
		}
		
		// Generic event
		this.doEvent = new Object();
		this.doEvent.eventHandler = function(e) {
			var eventString = Event.element(e).getAttribute("event").split("?");
			var event = eventString[0];
			var params = "";
			if ( eventString.length == 2 ) {
				params = eventString[1];
			}
			dispatcher.dispatch(
				event,
				params,
				updater.updatePage,
				updater.showError);
			return false;
		}
		
		// Generic form submit
		this.doFormSubmit = new Object();
		this.doFormSubmit.eventHandler = function(e) {
			var elem = $(Event.element(e));
			var form = elem.up("form");
			var eventString = elem.getAttribute("event").split("?");
			var event = eventString[0];
			var params = "";
			
			if ( eventString.length == 2 ) {
				params = eventString[1];
			}
			dispatcher.dispatch(
				event,
				form.serialize(),
				updater.updatePage,
				updater.showError);
			return false;
		}
		this.doFormKeyPress = new Object();
		this.doFormKeyPress.eventHandler = function(e) {
			if (e.keyCode == 13) {
				return false;
			} else {
				return true;
			}
		}
		
		this.doMenu = new Object();
		this.doMenu.eventHandler = function(e) {
			var elem = $(Event.element(e));
			var container = elem.up(".menu_container");
			var eventString = elem.getAttribute("event").split("?");
			var id = "";
			if ( eventString.length == 2 ) {
				id = eventString[1];
			}
			effects.doMenu(id, container);
			effects.stopMenuTimer();
			return false;
		}
		
		this.startMenuTimer = new Object();
		this.startMenuTimer.eventHandler = function(e) {			
			var eventString = Event.element(e).getAttribute("event").split("?");
			var id = "";
			if ( eventString.length == 2 ) {
				id = eventString[1];
			}
			effects.startMenuTimer(id);
			return false;
		}
		
		this.showInlineArticle = new Object();
		this.showInlineArticle.eventHandler = function(e) {
			var elem = $(Event.element(e));
			var eventString = elem.getAttribute("event").split("?");
			var body = $("article_body_" + eventString[1]);
			var teaser = $("article_teaser_" + eventString[1]);
			if ( body.visible() ) {
				Effect.SlideUp(body);
				Effect.SlideDown(teaser);
			} else {
				Effect.SlideUp(teaser);
				Effect.SlideDown(body);
			}
			return false;
		}
		
		/* ADMIN */
		
		this.uploadViaIframe = new Object();
		this.uploadViaIframe.eventHandler = function(e) {
			/*var eventString = Event.element(e).getAttribute("event").split("?");
			var params = "";
			if ( eventString.length == 2 ) {
				params = eventString[1];
			}*/
			var frame = document.getElementById("upload_iframe");
			var form = frame.contentWindow.document.getElementById("upload_form");
			form.submit();
			// any updaters need to be called via returned eval code
			return false;
		}
		
		this.doTree = new Object();
		this.doTree.eventHandler = function(e) {
			var eventString = Event.element(e).getAttribute("event").split("?");
			var id = "";
			if ( eventString.length == 2 ) {
				id = eventString[1];
			}
			$(id).toggle();
			return false;
		}
		
		this.showStatusOnOver = new Object();
		this.showStatusOnOver.eventHandler = function(e) {
			window.status = "GO: " + Event.element(e).getAttribute("event");
			// must be return true here
			return true;
		}
		
		this.showStatusOnOut = new Object();
		this.showStatusOnOut.eventHandler = function(e) {
			window.status = "";
			return false;
		}
		
	},
	onIframeLoad: function(elem) {
		var eventString = elem.value.split("?");
		var event = eventString[0];
		var params = "";
		if ( eventString.length == 2 ) {
			params = eventString[1];
		}
		
		// if a window is open, close it
		xwindows.closeWindow();
		
		dispatcher.dispatch(
			event,
			params,
			updater.updatePage,
			updater.showError);
	}
}
var events = new Events();

/* ********************************************
 * Windows
 */
xWindows = Class.create();
xWindows.prototype = {
	initialize: function() {
		// Dialog window
		this.showDialog = new Object();
		this.showDialog.eventHandler = function(e) {
			var eventString = Event.element(e).getAttribute("event").split("?");
			var params = eventString[1];
			var eventUrl = dispatcher._switch + "showAssetManager";
			//alert(params.split("&"));
			
			/*
			Dialog.confirm(
				{
					url: eventUrl,
					options: {method: 'get'}
				},{
					width:300,
					okLabel: "close",
					windowParameters: {
						className: "alphacube",
						onShow: updater.updateWindow
					},
					ok:function(win) {
						return true;
					},
					cancel:function(win) {
						return true;
					}
				}
			);
			*/
			
			var win = new Window(
				{
					minWidth: 500,
					minHeight: 500,
					className: "alphacube",
					resizable: true,
					title: "Sample window",
					showEffect: Effect.BlindDown,
					hideEffect: Effect.SwitchOff,
					draggable:true,
					onShow: updater.updateWindow
				}
			);
			win.setAjaxContent(eventUrl, {method: 'get'}, true, true);
			
			return false;
		}
		
		// Tool Tip
		/*this.showToolTip = new Object();
		this.showToolTip.eventHandler = function(e) {
			var eventUrl = dispatcher._switch + "showArticleTooltip";
			TooltipManager.init("tooltip", {url: "tooltip_ajax.html", options: {method: 'get'}}, {showEffect: Element.show, hideEffect: Element.hide});
			TooltipManager.addHTML("tooltip", "tooltip_content");
			TooltipManager.addAjax("tooltip", {url: eventUrl, options: {method: 'get'}});
			return false;
		}*/
		
		this.win = null;
		
	},
	showInWindow: function(content) {
		if ( this.win == null ) {
			this.win = new Window(
				"cms_window",
				{
					minWidth: 500,
					minHeight: 500,
					className: "alphacube",
					resizable: true,
					showEffect: Effect.Appear,
					hideEffect: Effect.Fade,
					draggable: true,
					destroyOnClose: false
				}
			);
		}
		
		this.win.getContent().innerHTML = content;
		this.win.showCenter(true);
		
		return false;
	},
	closeWindow: function() {
		//top.Windows.close("cms_window");
		if ( this.win != null ) {
			this.win.close();
		}
	},
	setTooltips: function() {
		//var eventUrl = dispatcher._switch + "showArticleTooltip";
		//TooltipManager.init("tooltip", {options: {shiftX: 1, shiftY: 1, className: 'alphacube'}});
		//TooltipManager.addHTML("tooltip", "tooltip_content");
		//TooltipManager.addAjax("tooltip", {url: eventUrl, options: {method: 'get'}});	
	}
}
var xwindows = new xWindows();

/* ********************************************
 * EventSetter
 * Grabs any href's marked as events and assigns the proper event handler to them.
 */
EventSetter = Class.create();
EventSetter.prototype = {
	initialize: function() {
		//default constructor
	},
	setEvents: function(elems) {
		//var elems = null;
		var eventString = "";
		var event = "";
		
		if ( elems == null ) {
			elems = document.getElementsByClassName("event");
		} else {
			//elems = getElementsByClassName(pod, "event");
			//alert(elems);
		}
		
		for (var i = 0; i < elems.length; i++) {
			try {
				eventString = elems[i].getAttribute("event").split("?");
				event = eventString[0];
			} catch(excpt) {
				alert(excpt);
			}
			//elems[i].onmouseover = events.showStatusOnOver.eventHandler.bindAsEventListener(events.showStatusOnOver);
			//elems[i].onmouseout = events.showStatusOnOut.eventHandler.bindAsEventListener(events.showStatusOnOut);
			
			switch(event) {
			case "doMenu":
				elems[i].onclick = events.doMenu.eventHandler.bindAsEventListener(events.doMenu);
				elems[i].onmouseover = events.doMenu.eventHandler.bindAsEventListener(events.doMenu);
				elems[i].onmouseout = events.startMenuTimer.eventHandler.bindAsEventListener(events.startMenuTimer);
				break;
			case "showInlineArticle":
				elems[i].onclick = events.showInlineArticle.eventHandler.bindAsEventListener(events.showInlineArticle);
				break;
			/* GENERIC FORM SUBMITS */
			case "doLogin":
			case "updateArticle":
			case "reorderArticles":
				elems[i].onclick = events.doFormSubmit.eventHandler.bindAsEventListener(events.doFormSubmit);
				break;
			case "doKeyFormPress":
				elems[i].onkeypress = events.doFormKeyPress.eventHandler.bindAsEventListener(events.doFormKeyPress);
				break;
			/* ADMIN */
			case "uploadArticle":
			case "uploadAssets":
				elems[i].onclick = events.uploadViaIframe.eventHandler.bindAsEventListener(events.uploadViaIframe);
				break;
			case "doTree":
				elems[i].onclick = events.doTree.eventHandler.bindAsEventListener(events.doTree);
				break;
			/* WINDOWS */
			case "showDialog":
				elems[i].onclick = xwindows.showDialog.eventHandler.bindAsEventListener(xwindows.showDialog);
				break;
			default:
				elems[i].onclick = events.doEvent.eventHandler.bindAsEventListener(events.doEvent);
			}
		}
	},
	setFrameEvents: function(frm) {
		// this function gets called via the iframe's onload
		var elems = frm.contentWindow.document;
		var elem = elems.getElementById("upload_btn");
		if ( elem != null ) {
			// if a form is present, set events as normal
			var elems = new Array();
			elems[0] = elem;
			this.setEvents(elems);
		} else {
			// otherwise, form has been submitted and need to update page
			elem = frm.contentWindow.document.getElementById("update_params");
			events.onIframeLoad(elem);			
		}
		//eval("elem.onclick = events." + event + ".eventHandler.bindAsEventListener(events." + event + ");");
	}
}
var setter = new EventSetter();

/* ********************************************
 * Set default event
 */
window.onload = events.initSite.eventHandler.bindAsEventListener(events.initSite);
