AdminController = {
	public_url: '',
	admin_url: '',
	request_uri: '',
	is_admin: false,
	window_dimensions: {},
	loadStyle: function(src){
		if(document.createStyleSheet)
			document.createStyleSheet(src);
		else{
			styles = "@import url('" + src + "');";
			sheet = document.createElement('link');
			sheet.rel = 'stylesheet';
			sheet.href = 'data:text/css,'+escape(styles);
			document.getElementsByTagName("head")[0].appendChild(sheet);
		}
	},
	require: function(src){
		document.write('<script type="text/javascript" src="' + src + '"></script>');
	},
	load: function(){
		if((typeof Prototype=='undefined') || 
			(typeof Element == 'undefined') || 
			(typeof Element.Methods=='undefined') ||
			parseFloat(Prototype.Version.split(".")[0] + "." +
			Prototype.Version.split(".")[1]) < 1.5
		)
			throw("AdminController.js requires the Prototype JavaScript framework >= 1.5.0");
		
		$A(document.getElementsByTagName("script")).findAll(function(s){
			return (s.src && s.src.match(/website_admin\.js(\?.*)?$/))
		}).each(function(s){
			AdminController.public_url = s.src.match(/\?public_url=([^\&]+)/)[1];
			AdminController.admin_url = s.src.match(/\&admin_url=([^\&]+)/)[1];
			AdminController.request_uri = s.src.match(/\&request_uri=([^\&]+)/)[1];
		});		

		AdminController.is_admin = (Cookie.get('LivePipe.is_admin') == '1');
		
		BackdoorLogin.load(AdminController.admin_url + 'login',AdminController.admin_url + 'logout?redirect=' + AdminController.public_url,AdminController.is_admin);		

		if(AdminController.is_admin){
			AdminController.loadStyle(AdminController.admin_url + 'styles/admin_toolbar.css');
			Event.observe(window,'load',function(){
				Toolbar.load(AdminController.public_url);
			});			
		}		
	},
	openFinderWindow: function(type){
		window.openCentered(AdminController.admin_url + 'finder/' + type,'finder_' + type,{
			height: AdminController.window_dimensions[type].finder.height,
			width: AdminController.window_dimensions[type].finder.width
		});
	},
	openEditorWindow: function(type,id){
		window.openCentered(AdminController.admin_url + 'editor/' + type + '/' + id,'editor_' + type + '_' + id,{
			height: AdminController.window_dimensions[type].editor.height,
			width: AdminController.window_dimensions[type].editor.width
		});
	},
	openBlockEditorWindow: function(type,id){
		window.openCentered(AdminController.admin_url + 'block/' + type + '/' + id,'block_editor_' + type + '_' + id,{
			height: AdminController.window_dimensions['blocks'][type].height,
			width: AdminController.window_dimensions['blocks'][type].width
		});
	},
	openImageEditorWindow: function(id,size,width,height){
		window.openCentered(AdminController.admin_url + 'image_editor/?refresh=true&id=' + id + '&target=' + size + '&source=' + size,'image_' + id,{
			height: height,
			width: width
		});
	}
};

var BackdoorLogin = {
	box : false,
	loginUrl : false,
	logoutUrl : false,
	load : function(loginUrl,logoutUrl,loggedIn){
		BackdoorLogin.loggedIn = loggedIn;
		BackdoorLogin.loginUrl = loginUrl;
		BackdoorLogin.logoutUrl = logoutUrl;
		if(typeof(surpress_backdoor_login) == "undefined")
			Event.observe(window.document,"keyup",BackdoorLogin.handleEscape);
	},
	getTop : function(){
		return window.getCenteredY(178,false,2.5);
	},
	getLeft : function(){
		return window.getCenteredX(277);
	},
	popping: false,
	handleEscape : function(e){
		if(!e)
			e = event;
		if(e.keyCode == 27 && BackdoorLogin.popping){
			BackdoorLogin.popping = false;
			Element.remove($("backdoor_login"));
		}else if(e.keyCode == 27 && e.shiftKey && !BackdoorLogin.loggedIn){
			BackdoorLogin.popping = true;
			BackdoorLogin.doPopup();
		}else if(e.keyCode == 27 && e.shiftKey)
			BackdoorLogin.doLogout();
	},
	handleResize : function(e){
		if($("backdoor_login")){
			$("backdoor_login").style['top'] = BackdoorLogin.getTop() + 'px';
			$("backdoor_login").style['left'] = BackdoorLogin.getLeft() + 'px';
		}
	},
	doPopup: function(){
		if(navigator.userAgent.match(/MSIE/))
			alert('WARNING: LivePipe is not fully compatible with Internet Explorer at this time. Please use Firefox on the PC or Safari on the Mac for the best results.');
		
		AdminController.loadStyle(AdminController.admin_url + 'styles/backdoor_login.css');

		Event.observe(window,'load',BackdoorLogin.doPopup);
		Event.observe(window,'resize',BackdoorLogin.handleResize);
		if(!$("backdoor_login"))
			new Insertion.Top(document.getElementsByTagName("body")[0],'<div id="backdoor_login"></div>');
		new Ajax.Updater('backdoor_login',BackdoorLogin.loginUrl,{evalScripts:true,onComplete: function(request){
			$("backdoor_login").style['display'] = 'block';
			$("backdoor_login").style['position'] = 'absolute';
			$("backdoor_login").style['top'] = BackdoorLogin.getTop() + 'px';
			$("backdoor_login").style['left'] = BackdoorLogin.getLeft() + 'px';
			$("User_name").focus();
		}});
	},
	doLogout: function(){
		if(confirm('Are you sure you want to logout?')){
			Cookie.unset('LivePipe.is_admin');
			new Ajax.Request(BackdoorLogin.logoutUrl,{onComplete:function(){
				window.location.reload();
			}});
			this.loggedIn = false;
		}
	},
	doSuccessfulLogin: function(){
		//the is_admin cookie is for convience only, the security is done server side
		Cookie.set('LivePipe.is_admin','1');
		BackdoorLogin.loggedIn = true;
		window.location.reload();
	}
};

var Toolbar = {
	pipeline_url: false,
	escapeObserver: function(e){
		if(!e)
			e = event;
		if(e.keyCode == 27){
			Element.hide('command_response');
			Event.stopObserving(window,'keyup',Toolbar.escapeObserver);
			Event.stopObserving(window,'resize',Toolbar.handleResize);
		}
	},
	load: function(pipeline_url){
		body = document.getElementsByTagName("body")[0];
		
		//fix with prototype's Element.getStyle , Element.setStyle
		body.style.marginTop = (body.offsetTop + 25) + "px";
		
		this.pipeline_url = pipeline_url;
		
		body.innerHTML += '<div id="toolbar_outer_tmp"><div id="toolbar_tmp"><p>Loading Menus...</p></div></div>';
		
		//each page served by WebsiteController can also just return the menu for each page
		new Ajax.Request(AdminController.admin_url + '?__toolbar__=' + encodeURIComponent(AdminController.request_uri),{
			//window.location.href.replace(/\#.*$/,'') + (window.location.href.match(/\?/) ? '&' : '?') + '__toolbar__=1',{
			onComplete: function(request){
				Element.remove('toolbar_tmp');
				if(request.responseText == null)
					return;

					Element.update('toolbar_outer_tmp',request.responseText);
				
					Behaviour.apply();
					try{
						if(fixed_bind)
							fixed_bind($('Toolbar'));
					}catch(e){}
				
					InlineEditor.load();
			}
		});		
		
		Behaviour.register({
			'#Toolbar' : function(element){
				Element.makeUnselectable(element,'hand');
				
				//the value we want instead of body.offsetTop
				//is the total top padding and margin on the body element
				body = document.getElementsByTagName("body")[0];
				//body.style.marginTop = body.offsetTop + Element.getHeight($('Toolbar')) + "px";
				//alert(body.offsetTop + ':' + Position.cumulativeOffset(body));
			},
			'#Toolbar ul' : function(element){
				//Pipeline.setOpacity(element,95);
			},
			'#Toolbar ul li a.MenuHead' : function(element){
				element.onclick = function(){return false;};
			},
			'#Toolbar li' : function(element){
				element.onmouseover = function(){
					if(navigator.userAgent.match(/MSIE/))
						this.className += " hover";
				}
				element.onmouseout = function(){
					if(navigator.userAgent.match(/MSIE/))
						this.className = this.className.replace(/ ?hover/,"");
				}
			},
			'#ToolbarConsole' : function(element){
				element.style["color"] = "#777";
				element.onfocus = function(){
					if(this.value == "Enter Command (type ? for help)")
						this.value = "";
					element.style["color"] = "#000";
				}

				element.onblur = function(){
					if(this.value == "")
						this.value = "Enter Command (type ? for help)";
					element.style["color"] = "#777";
				}

				element.onkeydown = function(event){
					if(!event)
						event = window.event;
					if(event.keyCode == 13)
						Toolbar.executeCommand(element.value);
				}
			},
			'#ToolbarViewModeRadio': function(element){
				Event.observe(element,'click',function(){
					InlineEditor.setMode((this.checked ? 'view' : 'edit'));
				});
			},
			'#ToolbarEditModeRadio': function(element){
				Event.observe(element,'click',function(){
					InlineEditor.setMode((this.checked ? 'edit' : 'view'));
				});
			}
		});
	},
	getTable: function(){
		return '<table class="top" width="100%" cellspacing="0" cellpadding="0"><tr><td class="left">LivePipe Command Console</td><td class="right">hit escape to close</td></tr></table>';
	},
	executeCommand : function(cmd){
		if(!$("command_response")){
			d = document.createElement("div");
			d.id = "command_response";
			d.appendChild(document.createElement("div"));
			document.getElementsByTagName("body")[0].appendChild(d);
			d.firstChild.innerHTML = '';
		}
		Element.setStyle($("command_response"),{
			width: 600,
			height: 400,
			overflow: "auto",
			padding: '5px',
			left: Toolbar.getLeft() + 'px',
			top: Toolbar.getTop() + 'px',
			position: "absolute",
			display: 'block'
		});
		Element.setOpacity($("command_response"),0.9);	
		$("command_response").firstChild.innerHTML = Toolbar.getTable() + "<p>Processing your request...</p>";
		new Ajax.Request(Toolbar.pipeline_url + 'admin/cmd',{
			parameters: $H({'cmd':cmd}).toQueryString(),
			onComplete: function(request){
				Element.update($("command_response").firstChild,Toolbar.getTable() + request.responseText);
				Event.observe(window.document,'keyup',Toolbar.escapeObserver);
				Event.observe(window,'resize',Toolbar.handleResize);
			}
		});
	},
	getTop: function(){
		return window.getCenteredY(400,45,2.5);
	},
	getLeft: function(){
		return window.getCenteredX(600);
	},
	handleResize: function(e){
		if($("command_response")){
			Element.setStyle($('command_response'),{
				top: Toolbar.getTop() + 'px',
				left: Toolbar.getLeft() + 'px'
			});
		}
		
	}
};

InlineEditor = {
	mode: 'view',
	current_node: false,
	load: function(){
		mode = Cookie.get('Livepipe.inline_editor_mode') || 'view';
		InlineEditor.setMode(mode);
		
		Element.setOpacity('ToolbarTip',0.75);
		Event.observe('ToolbarTip','mouseover',function(){
			InlineEditor.showAndCenterTooltip(InlineEditor.current_node);
		});
		Event.observe('ToolbarTip','dblclick',function(){
			InlineEditor.doubleClickNode(InlineEditor.current_node);
		});
	},
	setMode: function(mode){
		this.mode = mode;
		if(this.mode == 'view'){
			Cookie.set('Livepipe.inline_editor_mode','view');
			$('ToolbarViewModeRadio').checked = true;
			$('ToolbarEditModeRadio').checked = false;
			Element.makeSelectable(window.document.body);
			InlineEditor.getAllNodes().each(function(node){
				InlineEditor.applyViewStyles(node);
				Event.stopObserving(node,'mouseover',InlineEditor.elementMouseOver);
				Event.stopObserving(node,'mouseout',InlineEditor.elementMouseOut);
				Event.stopObserving(node,'dblclick',InlineEditor.elementDoubleClick);
			});
		}else{
			Cookie.set('Livepipe.inline_editor_mode','edit');
			$('ToolbarViewModeRadio').checked = false;
			$('ToolbarEditModeRadio').checked = true;
			Element.makeUnselectable(window.document.body);
			InlineEditor.getAllNodes().each(function(node){
				node_info = Element.getNodeInfo(node);
				InlineEditor.applyEditStyles(node);
				Event.observe(node,'mouseover',InlineEditor.elementMouseOver);
				Event.observe(node,'mouseout',InlineEditor.elementMouseOut);
				Event.observe(node,'dblclick',InlineEditor.elementDoubleClick);
			});
			
		}
	},
	getAllNodes: function(){
		return document.getElementsByNodeFilter(function(node_info){
			//if(node_info.type == 'Block' && node_info.id == 1)
			//	return false;
			return (node_info.type && node_info.id && !node_info.field);
		});	
	},
	applyEditStyles: function(node){
		Element.setOpacity(node,100);
	},
	applyViewStyles: function(node){
		Element.setOpacity(node,100);
	},
	applyHoverStyles: function(node){
		Element.setOpacity(node,0.75);
	},
	elementMouseOver: function(e){
		if(!e)
			e = window.event;
		node_info = Element.getNodeInfo(this);
		Event.stop(e);
		if(node_info.name == 'Main - Main')
			return;
		
		if(InlineEditor.current_node)
			InlineEditor.applyViewStyles(InlineEditor.current_node);
		InlineEditor.current_node = this;
		
		InlineEditor.showAndCenterTooltip(this);
	},
	elementMouseOut: function(e){
		if(!e)
			e = window.event;
		Event.stop(e);
		
		InlineEditor.hideTooltip(this);
	},
	elementDoubleClick: function(e){
		if(!e)
			e = window.event;
		Event.stop(e);
		//alert($H(node_info).inspect());
		InlineEditor.doubleClickNode(this);
	},
	doubleClickNode: function(node){
		InlineEditor.hideTooltip(node);
		node_info = Element.getNodeInfo(node);
		switch(node_info.type){
			case 'Block':
				AdminController.openBlockEditorWindow(node_info.name.split(' - ')[1],node_info.id);
				break;
			case 'ImageFile':
				d = Element.getDimensions(node);
				bits = node_info.name.split(' - ');
				AdminController.openImageEditorWindow(node_info.id,bits[1],
					Math.max(d.width + 50,700),
					Math.max(d.height + 100,300)
				);
				break;
			default:
				AdminController.openEditorWindow(node_info.type,node_info.id);
				break;
		}
	},
	showAndCenterTooltip: function(node){
		Element.show('ToolbarTip');
		
		node_info = Element.getNodeInfo(node);
		
		if(node_info.name && node_info.name != '' && node_info.type != 'ImageFile')
			title = node_info.name;
		else if(node_info.type == 'ImageFile'){
			bits = node_info.name.split(' - ');
			title = (bits[0] != '' ? bits[0] : node_info.type);
		}else
			title = node_info.type;
		switch(node_info.type){
			case 'ImageFile': subtitle = 'Image File'; break;
			case 'Block': subtitle = 'Block'; break;
			default: subtitle = node_info.type; break;
			
		}
		Element.update('ToolbarTip','<h2>' + title  + '</h2><p>Double Click to Edit ' + subtitle + '</p>');
		
		Position.prepare();
		offset = Position.cumulativeOffset(node);
		
		container_dimensions = Element.getDimensions(node);
		tip_dimensions = Element.getDimensions($('ToolbarTip'));
		
		$('ToolbarTip').style.top = offset[1] + Math.floor((container_dimensions.height / 6) - (tip_dimensions.height / 6));
		$('ToolbarTip').style.left = offset[0] + Math.floor((container_dimensions.width / 2) - (tip_dimensions.width / 2));
		$('ToolbarTip').style.zIndex = '999';
		
		InlineEditor.applyHoverStyles(node);
	},
	hideTooltip: function(node){
		Element.hide('ToolbarTip');
		InlineEditor.applyEditStyles(node);
	}
};

AdminController.load();
