/**
 * Common builder functions such as the widget chooser,
 * general purpose refresh-widget function.
 */

/** Widget Focus Control **/
function builder_common__widgetClicked(evnt) {
	try {
		var currentElems = $$('.focusWidget');
		for(var i = currentElems.length-1; i >= 0; i--) {
			currentElems[i].className = currentElems[i].className.replace('focusWidget', '');
		}

		this.className += " focusWidget";
	}
	catch(e) {
		alert(e);
	}
	evnt.stop();
}

function builder_common__onClick(evnt) {
	//alert("builder_common__onClick");
	/** Unfocus all elements if this goes off **/
	try {
		var currentElems = $$('.focusWidget');
		for(var i = currentElems.length-1; i >= 0; i--) {
			currentElems[i].className = currentElems[i].className.replace('focusWidget', '');
		}
	}
	catch(e) {
		alert(e);
	}
}

var builder_common__onClickAdded = false;
while(!builder_common__onClickAdded) {
	try {
		builder_common__onClickAdded = true;
		document.observe('click', builder_common__onClick);

	}
	catch(e) {console.log(e);}
}

function builder_common__hasFocus(widget) {
	if(typeof(widget) == 'number' || typeof(widget) == 'string')
		return ($('widget'+widget).className.indexOf('focusWidget') != -1);
	else {
		return (widget.className.indexOf('focusWidget') != -1);
	}
}
/** End Widget Focus Control **/

/** Add Widget **/
function builder_common__addWidget(templateZone) {
	builder_common__chooseWidgetCallback = function(widgClass) { builder_common__AddWidgetChosen(templateZone, widgClass); };
	builder_common__showWidgetChooser();
}

function builder_common__AddWidgetChosen(templateZone, widgetClass) {
	new Ajax.Request('/admin/builder_ajax/add_widget.htm', {
		method:"post",
		parameters:{pageVersionID:builder_common__pageID, templateZone:templateZone, widgetClass:widgetClass},
		onSuccess:builder_common__AddWidgetChosenCB
	});
	builder_common__closeOverlayAndMask();
}

function builder_common__AddWidgetChosenCB(transport) {
	try {
		var xml = transport.responseXML;
		var widgetID = xml.getElementsByTagName("widget_id")[0].firstChild.data;
		var templateZone = xml.getElementsByTagName("template_zone")[0].firstChild.data;
		var widgetClass = xml.getElementsByTagName("widget_class")[0].firstChild.data;
		$(templateZone).innerHTML += xml.getElementsByTagName("xhtml")[0].firstChild.data;
		builder_common__createTemplateZoneSortable($(templateZone));
		eval(widgetClass+"__onAdd($('widget"+widgetID+"'), false);"); //This might throw because the function isn't declared.
	}
	catch(e) {
		//alert(e);
	}
}
/** End Add Widget **/

/** Widget Chooser **/
function builder_common__showWidgetChooser() {
	//builder_common__showOverlay();
	/*
	new Ajax.Request('/admin/builder_ajax/ajah_widget_picker.htm', {
		method:"get",
		onSuccess:builder_common__showWidgetChooserCB
	});*/
	Lightview.show(
		{
			href:'/admin/builder_ajax/ajah_widget_picker.htm',
			rel:'ajax',
			options:{
				topclose: true, autosize: true,
				ajax: {
					method:"get"
				}
			}
		}
	);
}

function builder_common__showWidgetChooserCB(transport) {
	var overlayContainer = document.getElementById("overlayContent");
	if(overlayContainer == null) return;
	overlayContainer.innerHTML += transport.responseText;
}

var builder_common__chooseWidgetCallback = null;
function builder_common__chooseWidget(widgetClass) {
	if(builder_common__chooseWidgetCallback != null) {
		builder_common__chooseWidgetCallback(widgetClass);
		builder_common__chooseWidgetCallback = null;
	}
}
/** End Widget Chooser **/

/** Overlay **/
/*
function builder_common__showOverlayMask() {
	var existingMasks =  $$("#overlayMask");
	for(var  i = existingMasks.length-1; i >= 0; i--) {
		existingMasks[i].parentNode.removeChild(existingMasks[i]);
	}
	var overlayMask = new Element("div", {"class":"overlayMask", id:"overlayMask"});
	overlayMask.update('&nbsp;');
	document.body.insertBefore(overlayMask, document.body.firstChild);
}
*/
function builder_common__showOverlay() {
	var existingOverlays = $$("#overlayContent");
	for(var  i = existingOverlays.length-1; i >= 0; i--) {
		existingOverlays[i].parentNode.removeChild(existingOverlays[i]);
	}
	/*
	var overlayContainer = new Element("div", {"class":"overlayContainer", id:"overlayContainer"});
	document.body.insertBefore(overlayContainer, document.body.firstChild);
	var overlayContent = new Element("div", {"class":"overlayContent", id:"overlayContent"});
	overlayContainer.appendChild(overlayContent);
	var closeImg = new Element("img", {src:"/images/icons/cross_sm.png", width:"12", height:"12", alt:"close", title:"close chooser", "class":"overlayCloseImage"});
	overlayContent.appendChild(closeImg);
	closeImg.observe('click', builder_common__closeOverlayAndMask);
	closeImg.observe('click', function() {alert("lol");});

	var scrollOffsets =  document.viewport.getScrollOffsets();
	overlayContent.style.top = scrollOffsets.top+"px";

	return overlayContent;
	*/
	var contentElement = new Element("div", {"id":"overlayContent"})
	contentElement.style.display = "none";
	document.body.appendChild(contentElement);
	Lightview.show({href:'overlayContent', rel:'inline', options:{topclose: true, autosize: true}}); //, title:" :: ::"

	return contentElement;
}

function builder_common__closeOverlayAndMask() {
	Lightview.hide();
}
/** End Overlay **/

/** Refresh widget **/
function builder_common__refreshWidget(widgetID) {

}

function builder_common__refreshWidgetCB(transport) {

}
/** End Refresh widget **/

/** Delete widget **/
function builder_common__deleteWidgetHandler(evnt) {
	if(confirm("Do you really want to delete this widget?")) {
		builder_common__deleteWidget(this.id.match(/^widget([0-9]+)$/)[1]);
	}
}

function builder_common__deleteWidget(widgetID) {
	new Ajax.Request('/admin/builder_ajax/delete_widget.htm', {
		method:"post",
		parameters:{widgetInstanceID:widgetID},
		onSuccess:builder_common__deleteWidgetCB
	});
}

function builder_common__deleteWidgetCB(transport) {
	var xml = transport.responseXML;
	var status = xml.getElementsByTagName("status")[0].firstChild.data;
	if(status != "ok") {
		var message = xml.getElementsByTagName("status")[0].getAttribute("message");
		alert(message);
	}
	else {
		var widgetID = xml.getElementsByTagName("widget_id")[0].firstChild.data;
		$('widget'+widgetID).parentNode.removeChild($('widget'+widgetID));
	}
}
/** End Delete widget **/

/** Style **/
function builder_common__updateWidgetStyle(widgetID, elementIdentifier, cssProperty, cssValue, callbackFunc) {
	new Ajax.Request('/admin/builder_ajax/update_widget_style', {
		method:"post",
		parameters:{widgetInstanceID:widgetID, elementIdentifier:elementIdentifier, cssProperty:cssProperty, cssValue:cssValue},
		onSuccess:function(transport) {builder_common__updateWidgetStyleCB(transport, callbackFunc)}
	});
}

function builder_common__updateWidgetStyleCB(transport, cbFunc) {
	if(cbFunc != null) {
		var xml = transport.responseXML;
		var status = xml.getElementsByTagName("status")[0].firstChild.data;
		var message = null;
		if(status != "ok") message = xml.getElementsByTagName("status")[0].getAttribute("message");
		var widgetID = xml.getElementsByTagName("widget_id")[0].firstChild.data;
		var elementID = xml.getElementsByTagName("element_identifier")[0].firstChild.data;
		var prop = xml.getElementsByTagName("css_property")[0].firstChild.data;
		var value = xml.getElementsByTagName("css_value")[0].firstChild.data;
		cbFunc(widgetID, elementID, prop, value, status, message);
	}
}
/** End Style **/

/** Context menus **/
var builder_common__contextMenuMouseStatus = new Object();
var builder_common__contextMenuHandlers = new Object();
function builder_common__createContextMenu(widgetID, cssClass, evnt) {
	if($(widgetID+"ContextMenu") !== null) {
		builder_common__overlayHide.bind($(widgetID+"ContextMenu"))();
	}
	var contextMenu = new Element("div", {id:widgetID+"ContextMenu", "class":"widgetContextMenu"});
	contextMenu.style.top = (document.viewport.getScrollOffsets().top+ 50)+"px";
	contextMenu.style.left = /*(evnt.pointerX()-10)*/50+"px";
	//var topLeftCorner  = new Element("img", {id:"widgetContextMenuTopLeft",	 width:"23", height:"22", border:"0", src:"/images/topLeft.png"});
	//var topRightCorner = new Element("img", {id:"widgetContextMenuTopRight", width:"23", height:"22", border:"0", src:"/images/topRight.png"});
	//var btmLeftCorner  = new Element("img", {id:"widgetContextMenuBtmLeft",  width:"23", height:"22", border:"0", src:"/images/btmLeft.png"});
	//var btmRightCorner = new Element("img", {id:"widgetContextMenuBtmRight", width:"23", height:"22", border:"0", src:"/images/btmRight.png"});

	var table = new Element("table", {cellpadding:0, cellspacing:0});
	contextMenu.appendChild(table)
	var tbody = new Element("tbody");
	table.appendChild(tbody);
	var topRow = new Element("tr");
	tbody.appendChild(topRow);
	var middleRow = new Element("tr");
	tbody.appendChild(middleRow);
	var bottomRow = new Element("tr");
	tbody.appendChild(bottomRow);

	var topLeftCell = new Element("td", {"class":"widgetContextMenuBorderCell widgetContextMenuSizeCell"});
	topRow.appendChild(topLeftCell);
	//topLeftCell.appendChild(topLeftCorner);
	topLeftCell.style.background = "url('/images/topLeft.png') no-repeat top left";
	var topMiddleCell = new Element("td", {"class":"widgetContextMenuBorderCell widgetContextMenuSideCell"});
	topRow.appendChild(topMiddleCell);
	var topRightCell = new Element("td", {"class":"widgetContextMenuBorderCell widgetContextMenuSizeCell"});
	topRow.appendChild(topRightCell);
	//topRightCell.appendChild(topRightCorner);
	topRightCell.style.background = "url('/images/topRight.png') no-repeat top right";

	var middleLeftCell = new Element("td", {"class":"widgetContextMenuBorderCell widgetContextMenuSideCell"});
	middleRow.appendChild(middleLeftCell);
	var middleMiddleCell = new Element("td");
	middleRow.appendChild(middleMiddleCell);
	var middleRightCell = new Element("td", {"class":"widgetContextMenuBorderCell widgetContextMenuSideCell"});
	middleRow.appendChild(middleRightCell);

	var bottomLeftCell = new Element("td", {"class":"widgetContextMenuBorderCell widgetContextMenuSizeCell"});
	bottomRow.appendChild(bottomLeftCell);
	//bottomLeftCell.appendChild(btmLeftCorner);
	bottomLeftCell.style.background = "url('/images/btmLeft.png') no-repeat bottom left";
	var bottomMiddleCell = new Element("td", {"class":"widgetContextMenuBorderCell widgetContextMenuSideCell"});
	bottomRow.appendChild(bottomMiddleCell);
	var bottomRightCell = new Element("td", {"class":"widgetContextMenuBorderCell widgetContextMenuSizeCell"});
	bottomRow.appendChild(bottomRightCell);
	//bottomRightCell.appendChild(btmRightCorner);
	bottomRightCell.style.background = "url('/images/btmRight.png') no-repeat bottom right";

	var content = new Element("div", {"class":"widgetContextMenuContent", id:widgetID+"ContextMenuContent"});
	content.update("Loading...");
	middleMiddleCell.appendChild(content);

	document.body.insertBefore(contextMenu, document.body.firstChild);
	builder_common__contextMenuMouseStatus[contextMenu.id] = new Object();
	builder_common__contextMenuMouseStatus[contextMenu.id].down = false;
	var hiderCheckFunc = builder_common__overlayHideCheck.bind(contextMenu);
	if(typeof(builder_common__contextMenuHandlers[widgetID]) == 'undefined')
		builder_common__contextMenuHandlers[widgetID] = new Array();
	builder_common__contextMenuHandlers[widgetID].push({func:hiderCheckFunc, element:document.body, eventType:"mousemove"});
	Event.observe(document.body, 'mousemove', hiderCheckFunc);
	Event.observe(contextMenu, 'mousedown', builder_common__overlayMouseDown);
	Event.observe(contextMenu, 'mouseup',	builder_common__overlayMouseUp);
	//Overlays now stay open until explicitly closed.
	//builder_common__activateMouseOutGrace(widgetID);
	return content;
}

function builder_common__overlayHideCheck(evnt) {
	//console.log("builder_common__overlayHideCheck");
	try {
		if(typeof(builder_common__contextMenuMouseStatus[this.id]) != 'undefined'
			&& builder_common__contextMenuMouseStatus[this.id].down == true) {
			var deltaX = evnt.pointerX() - builder_common__contextMenuMouseStatus[this.id].x;
			var deltaY = evnt.pointerY() - builder_common__contextMenuMouseStatus[this.id].y;
			this.style.top = (parseFloat(this.style.top) + deltaY)+"px";
			this.style.left = (parseFloat(this.style.left) + deltaX)+"px";
			builder_common__contextMenuMouseStatus[this.id].x = evnt.pointerX();
			builder_common__contextMenuMouseStatus[this.id].y = evnt.pointerY();

		}
		else {
			//Overlays now stay open until explicitly closed.
			/*
			var containerOf = false;
			var targetElem = evnt.findElement();
			while(targetElem != null && !containerOf) {
				if(targetElem == this) containerOf = true;
				targetElem = targetElem.parentNode;
			}

			if (!containerOf) {
				try { //This can sometimes get called asynchronously
					builder_common__overlayHide.bind(this)(evnt);
				}
				catch(e) { }			
			}
			*/
		}
		evnt.stop(); //Some performance gains to be made by cancelling?
	}
	catch(e) {
		alert(e);
	}
}

function builder_common__overlayHide(evnt) {
	this.parentNode.removeChild(this);
	var widgetID = this.id.match(/^([a-z]+[0-9]+)[a-z]*$/i)[1];
	//alert(widgetID);
	try {
		//Event.stopObserving(document.body, 'mousemove', builder_common__contextMenuHiderCheckFuncs[this.id]);
		var handlerRef = null;
		while((handlerRef = builder_common__contextMenuHandlers[widgetID].pop()) != null) {
			try {
				handlerRef.element.stopObserving(handlerRef.eventType, handlerRef.func);
			}
			catch(e) { alert("67890\n"+e);  }
		}
	}
	catch(e) { alert("12345\n"+e);  }
}

function builder_common__overlayMouseDown(evnt) {
	//if(evnt.findElement() != this) return;
	try {
		//alert(evnt.findElement().tagName.toLowerCase());
		if(evnt.findElement().tagName.toLowerCase() == "input"
			|| evnt.findElement().tagName.toLowerCase() == "select") return;

		//console.log("mousedown "+this.id);
		if(typeof(builder_common__contextMenuMouseStatus[this.id]) == 'undefined')
			builder_common__contextMenuMouseStatus[this.id] = new Object();
		builder_common__contextMenuMouseStatus[this.id].down = true;
		builder_common__contextMenuMouseStatus[this.id].x = evnt.pointerX();
		builder_common__contextMenuMouseStatus[this.id].y = evnt.pointerY();
		evnt.stop();
	}
	catch(e) {
		alert(e);
	}
}

function builder_common__overlayMouseUp(evnt) {
	//if(evnt.findElement() != this) return;
	try {
		//console.log("mouseup "+this.id);
		if(typeof(builder_common__contextMenuMouseStatus[this.id]) == 'undefined')
			builder_common__contextMenuMouseStatus[this.id] = new Object();
		builder_common__contextMenuMouseStatus[this.id].down = false;
		builder_common__contextMenuMouseStatus[this.id].x = evnt.pointerX();
		builder_common__contextMenuMouseStatus[this.id].y = evnt.pointerY();
	}
	catch(e) {
		alert(e);
	}
}

function builder_common__activateMouseOutGrace(widgetID) {
	//Overlays now stay open until explicitly closed.
	/*
	var handlerRef = null;
	while((handlerRef = builder_common__contextMenuHandlers[widgetID].pop()) != null) {
		if(handlerRef.eventType == 'mousemove' && handlerRef.element == document.body) {
			try {
				handlerRef.element.stopObserving(handlerRef.eventType, handlerRef.func);
			}
			catch(e) { alert("67890\n"+e);  }
		}
	}
	Event.observe($(widgetID+'ContextMenu'), 'mouseover', builder_common__reactivateHideCheck);
	*/
}

function builder_common__reactivateHideCheck() {
	//Overlays now stay open until explicitly closed.
	/*
	var widgetID = this.id.match(/^([a-z]+[0-9]+)[^0-9]*$/i)[1];
	//var contextMenu = $('widget');
	var hiderCheckFunc = builder_common__overlayHideCheck.bind(this);
	if(typeof(builder_common__contextMenuHandlers[widgetID]) == 'undefined')
		builder_common__contextMenuHandlers[widgetID] = new Array();
	builder_common__contextMenuHandlers[widgetID].push({func:hiderCheckFunc, element:document.body, eventType:"mousemove"});
	Event.observe(document.body, 'mousemove', hiderCheckFunc);
	Event.stopObserving(this, 'mouseover', builder_common__reactivateHideCheck);
	*/
}
/** End Context menus **/

/** Widget sorting **/
function builder_common__orderTemplateZone(zoneContainer) {
	var paramString = Sortable.serialize(zoneContainer);
	paramString += "&templateZone="+zoneContainer.id;
	new Ajax.Request('/admin/builder_ajax/sort_widgets', {
		method:"post",
		parameters:paramString
	});
}

function builder_common__createTemplateZoneSortable(templateZone) {
	//alert("creating sortable for "+templateZone.id);
	Sortable.create(templateZone, {
		tag:'div', only:"Widget", overlap:'vertical', constraint:'vertical',
		format:/^widget([0-9]+)[^0-9]*$/, handle:'WidgetDragHandle',
		onUpdate:builder_common__orderTemplateZone
	});
}
/** End Widget sorting **/

/** Menus & pages tools **/
//This array is a repositry for any element that wishes to act
//as a sortale between page draggables.
//Typically PageTools, MenuLevels
//Its objects are of prototype {id, sortableOptions:{<sorable_options>}}
var builder_common__pageLinkSortables = new Array();
Element.observe(document, "dom:loaded", builder_common__cretePaeLinkSortables);
/**
 * Abandoned the old one-dimentional containment
 * array as this was causing issues with nested menus.
 * Really this should have been a tree, mimicking the menus.
 * Seeing as we've abandoned the PageTools idea, and thus the
 * primary motive for this array, i've just commented it all
 * out for now.
 */
function builder_common__cretePaeLinkSortables(evnt) {
	/*var containmentArry = new Array();
	for(var i = 0; i < builder_common__pageLinkSortables.length; i++) {
		containmentArry.push(builder_common__pageLinkSortables[i].id);
	}*/

	for(var i = 0; i < builder_common__pageLinkSortables.length; i++) {
		//builder_common__pageLinkSortables[i].sortableOptions.containment = containmentArry;
		Sortable.create(builder_common__pageLinkSortables[i].id, builder_common__pageLinkSortables[i].sortableOptions);
	}
}

function builder_common__menuDragUpdate(menu) {
	var menuID = menu.id.match(/^menu([0-9]+)$/i)[1];
	var paramStr = "menuID="+menuID;
	var menuLevels = $$('div#menu'+menuID+' div.parentMenu'+menuID);
	for(var i = 0; i < menuLevels.length; i++) {
		console.log(menuLevels[i].id);
		paramStr += "&menuLevels["+menuLevels[i].id.match(/^menuLevel([0-9]+)$/)[1]+"]="+(i+1);
	}
	console.log(paramStr);

	new Ajax.Request('/admin/builder_ajax/set_menu_item_order.htm', {
		method:"post",
		parameters:paramStr
	});
}

function builder_common__menuLevelDragUpdate(menuLevel) {

	try {
		var menuLevelID = menuLevel.id.match(/^menuLevel([0-9]+)[a-z]*$/i)[1];
	}catch(e){alert(menuLevel.id);}
	//First off, we need to check for pages being added,
	//these will have an id in format pagesToolResult<pageID>
	var items = menuLevel.select("li");
	var order = 0;
	var massUpdateStr = "";
	for(var i = 0; i < items.length; i++) {
		if(items[i].parentNode != menuLevel) continue; //Only concerned with direct decendants
		order++;
		if(items[i].id.match(/^pagesToolResult([0-9]+)$/) != null) {
			var pageID = items[i].id.match(/^pagesToolResult([0-9]+)$/)[1];
			new Ajax.Request('/admin/builder_ajax/save_menu_link.htm', {
				method:"post",
				parameters:{menuLevelID:menuLevelID, targetPageID:pageID, order:order, pageVersionID:builder_common__pageID},
				onSuccess:builder_common__addMenuLinkFromDragCB
			});
		}
		else if(items[i].id.match(/^menuLink([0-9]+)$/) != null) { //Pre-existing link
			var menuLinkID = items[i].id.match(/^menuLink([0-9]+)$/)[1];
			if(massUpdateStr.length > 0) massUpdateStr += "&";
			massUpdateStr += "menuLinks["+menuLinkID+"]=" + order;
		}
		else {    //Sub-menu container
			var menuSubLevelID = items[i].id.match(/^menuSubLevel([0-9]+)$/)[1];
			if(massUpdateStr.length > 0) massUpdateStr += "&";
			massUpdateStr += "menuLevels["+menuSubLevelID+"]=" + order;
		}
	}

	new Ajax.Request('/admin/builder_ajax/set_menu_item_order',{
		method:"post",
		parameters:massUpdateStr
	});
}

function builder_common__addMenuLinkFromDragCB(transport) {
	var xml = transport.responseXML;
	var pageID = xml.getElementsByTagName("page_id")[0].firstChild.data;
	var menuLinkID = xml.getElementsByTagName("menu_link_id")[0].firstChild.data;
	var menuLevelID = xml.getElementsByTagName("menu_level_id")[0].firstChild.data;
	var linkHTML = xml.getElementsByTagName("xhtml")[0].firstChild.data;
	builder_common__insertMenuLink(linkHTML, $('pagesToolResult'+pageID).parentNode, $('pagesToolResult'+pageID));
}

function builder_common__insertMenuLink(html, container, before) {
	var utilityDiv = new Element("div");
	utilityDiv.innerHTML = html;
	if(before != null) {
		container.insertBefore(utilityDiv.firstChild, before);
		container.removeChild(before);
	}
	else {
		container.appendChild(utilityDiv.firstChild);
	}

	var scriptTags = utilityDiv.getElementsByTagName("script");
	for(var i = scriptTags.length-1; i >= 0; i--) {
		try{eval(scriptTags[i].innerHTML);}
		catch(e) {alert(e);}
		scriptTags[i].parentNode.removeChild(scriptTags[i]);
	}

	//Have to re-create the parent menuLevel
	//as a sortable.
	//the relevant options should still be in the builder_common__pageLinkSortables
	//array, just have to find them
	for(var i = 0; i < builder_common__pageLinkSortables.length; i++) {
		//console.log(builder_common__pageLinkSortables[i].id +" = "+container.id);
		if(builder_common__pageLinkSortables[i].id == container.id) {
			Sortable.create(container.id, builder_common__pageLinkSortables[i].sortableOptions);
		}
	}
}

function builder_common__menuRightClick(evnt) {
	evnt = evnt == null ? Event.extend(window.event) : evnt;
	evnt.stop(); //Don't bubble
	var contextMenu = builder_common__createContextMenu(this.id, "", evnt);
	new Ajax.Request('/admin/builder_ajax/menu_context_menu/'+this.id.substr(4)+'.htm', {
		method:"get",
		onSuccess:builder_common__menuRightClickCB
	});
}

function builder_common__menuRightClickCB(transport) {
	try {
		var xml = transport.responseXML;
		var xhtml = xml.getElementsByTagName("xhtml")[0];
		var menuID = xml.getElementsByTagName("menu_id")[0].firstChild.data;
		var contextContainer = $('menu'+menuID+"ContextMenuContent");
		if(contextContainer == null) return;
		contextContainer.innerHTML = xhtml.firstChild.data;
		var addLinkControls = $('menu'+menuID+'AddLevelControls');
		addLinkControls.select("input")[1].observe('click', builder_common__addMenuLevel.bind(addLinkControls));

		var menuContainer = $('menu'+menuID+"ContextMenu");
		contextContainer.select("img")[0].observe("click", builder_common__overlayHide.bind(menuContainer));
	}
	catch(e) {
		console.log(e);
	}
}

function builder_common__menuLevelRightClick(evnt) {
	evnt = evnt == null ? Event.extend(window.event) : evnt;
	evnt.stop(); //Don't bubble
	var contextMenu = builder_common__createContextMenu(this.id, "", evnt);
	new Ajax.Request('/admin/builder_ajax/menu_level_context_menu/'+this.id.substr(9)+'.htm', {
		method:"get",
		onSuccess:builder_common__menuLevelContextMenuCB
	});
}


function builder_common__menuLinkRightClick(evnt) {
	evnt = evnt == null ? Event.extend(window.event) : evnt;
	evnt.stop(); //Don't bubble
	var contextMenu = builder_common__createContextMenu(this.id, "", evnt);
	new Ajax.Request('/admin/builder_ajax/menu_link_context_menu/'+this.id.substr(8)+'.htm', {
		method:"get",
		onSuccess:builder_common__menuLevelContextMenuCB
	});
}

function builder_common__menuLevelContextMenuCB(transport) {
	try{
		var xml = transport.responseXML;
		var xhtml = xml.getElementsByTagName("xhtml")[0];
		var menuLinkID = xml.getElementsByTagName("menu_link_id").length > 0 ? xml.getElementsByTagName("menu_link_id")[0].firstChild.data : null;
		var menuLevelID = xml.getElementsByTagName("menu_level_id")[0].firstChild.data;
		var contextContainer = menuLinkID != null ? $('menuLink'+menuLinkID+"ContextMenuContent") :  $('menuLevel'+menuLevelID+"ContextMenuContent");
		if(contextContainer == null) return;
		contextContainer.innerHTML = xhtml.firstChild.data;

		if(menuLinkID !== null && $('menuLink'+menuLinkID+'SaveLinkControls') !== null) {
			$('menuLink'+menuLinkID+'SaveLinkControls').select("input")[3].observe('click', builder_common__saveMenuLink.bind($('menuLink'+menuLinkID+'SaveLinkControls')));
			$('menuLink'+menuLinkID+'SaveLinkControls').select("input")[1].observe('click', builder_common__menuLinkBrowse.bind($('menuLink'+menuLinkID+'SaveLinkControls')));
			//Delete no longer on context menu
			//var imgElems = contextContainer.select("img");
			//imgElems[0].observe('click', builder_common__deleteMenuLink.bind(imgElems[0].parentNode));
		}
		else {
			//Delete no longer on context menu
			//if($('menuLevel'+menuLevelID+'Delete') != null) $('menuLevel'+menuLevelID+'Delete').observe('click', builder_common__deleteMenuLevel);
			$('menuLevel'+menuLevelID+'AddLinkControls').select("input")[3].observe('click', builder_common__addMenuLink.bind($('menuLevel'+menuLevelID+'AddLinkControls')));
			$('menuLevel'+menuLevelID+'AddLinkControls').select("input")[1].observe('click', builder_common__menuLinkBrowse.bind($('menuLevel'+menuLevelID+'AddLinkControls')));
		}

		if($('menuLevel'+menuLevelID+'AddLevelControls') !== null) {
			$('menuLevel'+menuLevelID+'AddLevelControls').select("input")[1].observe('click', builder_common__addMenuLevel.bind($('menuLevel'+menuLevelID+'AddLevelControls')));
		}

		$('menuLevel'+menuLevelID+'NameSave').observe('click', builder_common__saveMenuLevelName);
		
		var menuContainer = menuLinkID != null ? $('menuLink'+menuLinkID+"ContextMenu") :  $('menuLevel'+menuLevelID+"ContextMenu");
		contextContainer.select("img")[0].observe("click", builder_common__overlayHide.bind(menuContainer));
	}
	catch(e) {alert(e);}
}

function builder_common__deleteMenuLink(evnt) {
	var menuLinkID = this.id.match(/^menuLink([0-9]+)[a-z]*$/i)[1];
	if(!confirm("Do you really want to delete this menu link?")) return;
	new Ajax.Request('/admin/builder_ajax/delete_menu_link.htm', {
		method:"post",
		parameters:{menuLinkID:menuLinkID}
	});
	$('menuLink'+menuLinkID).parentNode.removeChild($('menuLink'+menuLinkID));
}

function builder_common__saveMenuLink(evnt) {
	var menuLinkID = this.id.match(/^menuLink([0-9]+)/)[1];
	var url = this.select('input')[0].value;
	var linkName = this.select('input')[2].value;
	new Ajax.Request('/admin/builder_ajax/save_menu_link.htm',{
		method:"post",
		parameters:{menuLinkID:menuLinkID, linkName:linkName, url:url, pageVersionID:builder_common__pageID},
		onSuccess:builder_common__saveMenuLinkCB
	});
}

function builder_common__saveMenuLinkCB(transport) {
	var xml = transport.responseXML;
	var menuLinkID = xml.getElementsByTagName("menu_link_id")[0].firstChild.data;
	var linkNameElem = xml.getElementsByTagName("link_name")[0];
	var urlElem = xml.getElementsByTagName("url")[0];
	var errors = 0;
	if(linkNameElem.getAttribute("error") != null) {
		errors++;
		$('menuLink'+menuLinkID+'SaveLinkControls').select("div")[1].update (linkNameElem.getAttribute("error"));
	}
	if(urlElem.getAttribute("error") != null) {
		errors++;
		$('menuLink'+menuLinkID+'SaveLinkControls').select("div")[0].update (urlElem.getAttribute("error"));
	}
	if(urlElem.firstChild != null) {
		$('menuLink'+menuLinkID+'SaveLinkControls').select("input")[0].vallue = (urlElem.getAttribute("error"));
	}

	if(errors == 0) {
		var html = xml.getElementsByTagName("xhtml")[0].firstChild.data;
		builder_common__insertMenuLink(html, $('menuLink'+menuLinkID).parentNode, $('menuLink'+menuLinkID));
	}
}

function builder_common__addMenuLink(evnt) {
	var menuLevelID = this.id.match(/^menuLevel([0-9]+)/)[1];
	var url = this.select('input')[0].value;
	var linkName = this.select('input')[2].value;
	new Ajax.Request('/admin/builder_ajax/save_menu_link.htm',{
		method:"post",
		parameters:{menuLevelID:menuLevelID, linkName:linkName, url:url, pageVersionID:builder_common__pageID},
		onSuccess:builder_common__addMenuLinkCB
	});
}

function builder_common__addMenuLinkCB(transport) {
	try {
		var xml = transport.responseXML;
		var menuLevelID = xml.getElementsByTagName("menu_level_id")[0].firstChild.data;
		var linkNameElem = xml.getElementsByTagName("link_name")[0];
		var urlElem = xml.getElementsByTagName("url")[0];
		var errors = 0;
		if(linkNameElem.getAttribute("error") != null) {
			errors++;
			$('menuLevel'+menuLevelID+'AddLinkControls').select("div")[1].update (linkNameElem.getAttribute("error"));
		}
		if(urlElem.getAttribute("error") != null) {
			errors++;
			$('menuLevel'+menuLevelID+'AddLinkControls').select("div")[0].update (urlElem.getAttribute("error"));
		}
		if(urlElem.firstChild != null) {
			$('menuLevel'+menuLevelID+'AddLinkControls').select("input")[0].vallue = (urlElem.getAttribute("error"));
		}


		if(errors == 0) {
			var html = xml.getElementsByTagName("xhtml")[0].firstChild.data;
			builder_common__insertMenuLink(html, $('menuLevel'+menuLevelID+'Links'));
		}
	}
	catch(e) {alert(e);}
}

function builder_common__menuLinkBrowse(evnt) {
	var hoverID = this.id.match(/^(menu(?:Link|Level)[0-9]+)[a-z]*$/i)[1];
	builder_common__activateMouseOutGrace(hoverID);
	var pb = new PageBrowser();
	pb.chooseCallback = function(pageID) { builder_common__menuLinkBrowseCB(pageID, hoverID); };
	pb.show();
}

function builder_common__menuLinkBrowseCB(pageID, hoverID) {
	new Ajax.Request('/admin/page_browser/get_page_info/'+pageID+'.htm', {
		method:"get",
		onSuccess:function(transport) {builder_common__menuLinkBrowseCB2(transport, hoverID)}
	});
}

function builder_common__menuLinkBrowseCB2(transport, hoverID) {
	var xml = transport.responseXML;
	var url = xml.getElementsByTagName("url")[0].firstChild.data;
	var controlsContainer = hoverID.match(/^menuLink.*/i) != null ? $(hoverID+'SaveLinkControls') : $(hoverID+'AddLinkControls');
	var UrlInput = controlsContainer.select("input")[0];
	UrlInput.value = url;
	builder_common__closeOverlayAndMask();
}

function builder_common__addMenuLevel(evnt) {
	var levelNameInput = this.select("input")[0];
	var levelName = levelNameInput.value;
	/*
	if(levelName.length == 0) {
		alert("Please enter a title for the sub level");
		return;
	}*/

	var params = new Object();
	params.name = levelName;

	if(this.id.match(/^menuLevel([0-9]+)AddLevelControls$/) !=null) {
		var menuLevelID = this.id.match(/^menuLevel([0-9]+)AddLevelControls$/)[1];
		var levelParent = $('menuLevel'+menuLevelID).parentNode;
		while(levelParent.id.match(/^menu([0-9]+)$/) == null) {
			levelParent = levelParent.parentNode;
		}
	
		params.menuID = levelParent.id.match(/^menu([0-9]+)$/)[1];
		params.menuLevelID = menuLevelID;
	}
	else {
		params.menuID = this.id.match(/^menu([0-9]+)AddLevelControls$/)[1];
	}

	new Ajax.Request('/admin/builder_ajax/add_menu_level.htm', {
		method:"post",
		parameters:params,
		onSuccess:builder_common__addMenuLevelCB
	});
}

function builder_common__addMenuLevelCB(transport) {
	try {
		var xml = transport.responseXML;
		if(xml.getElementsByTagName("parent_level_id").length > 0 ){
			var parentMenuLevelID = xml.getElementsByTagName('parent_level_id')[0].firstChild.data;
			var menuLevelContainer = $('menuLevel'+parentMenuLevelID+'Links');
		}
		else {
			var menuID = xml.getElementsByTagName("menu_id")[0].firstChild.data;
			var menuLevelContainer = $('menu'+menuID);
		}

		var holderDiv = new Element("div");
		holderDiv.innerHTML = xml.getElementsByTagName("xhtml")[0].firstChild.data;
		var scriptTags = new Array();
		while(holderDiv.firstChild !== null) {
			if(holderDiv.firstChild.nodeName.toLowerCase() =="script") {
				scriptTags.push(holderDiv.firstChild);
				holderDiv.removeChild(holderDiv.firstChild);
			}
			else {
				menuLevelContainer.appendChild(holderDiv.firstChild);
			}
		}

		for(var i = 0; i < scriptTags.length; i++) {
			try {
				eval(scriptTags[i].innerHTML);
			}
			catch(e) {
				console.log(e);
			}
		}

		//Have to re-create the parent menu OR menuLevel
		//as a sortable.
		//the relevant options should still be in the builder_common__pageLinkSortables
		//array, just have to find them
		for(var i = 0; i < builder_common__pageLinkSortables.length; i++) {
			//console.log(builder_common__pageLinkSortables[i].id +" = "+container.id);
			if(builder_common__pageLinkSortables[i].id == menuLevelContainer.id) {
				Sortable.create(menuLevelContainer.id, builder_common__pageLinkSortables[i].sortableOptions);
			}
		}
	}
	catch(e) {
		console.log(e);
	}
}

function builder_common__deleteMenuLevel() {
	if(!confirm("Do you really want to delete this menu?")) {
		return;
	}

	var menuLevelID = this.id.match(/^menuLevel([0-9]+)Delete$/);

	new Ajax.Request('/admin/builder_ajax/delete_menu_level.htm', {
		method:"post",
		parameters:{menuLevelID:menuLevelID},
		onSuccess:builder_common__deleteMenuLevelCB
	});
}

function builder_common__deleteMenuLevelCB(transport) {
	var xml = transport.responseXML;
	var menuLevelID = xml.getElementsByTagName("menu_level_id")[0].firstChild.data;
	if($('menuSubLevel'+menuLevelID) != null) {
		$('menuSubLevel'+menuLevelID).parentNode.removeChild($('menuSubLevel'+menuLevelID));
	}
	else {
		$('menuLevel'+menuLevelID).parentNode.removeChild($('menuLevel'+menuLevelID));
	}
}

var builder_common__menuLevelNameChangedTimeout = 500;
function builder_common__menuLevelNameChanged(evnt) {
	try {
		//alert("c-change");
		var instanceID = this.parentNode.id.substr(9);
		//alert(instanceID);
		if(typeof(builder_common__menuLevelNameChangeTracker) == 'undefined') {
			builder_common__menuLevelNameChangeTracker = new Object();
		}
		var date = new Date();
		builder_common__menuLevelNameChangeTracker[instanceID] = date.getTime();
		setTimeout("builder_common__checkMenuLevelNameSave();", builder_common__menuLevelNameChangedTimeout);
	}
	catch(e) {
		alert(e);
	}
}

function builder_common__checkMenuLevelNameSave() {
	try {
		//alert("check");
		if(typeof(builder_common__menuLevelNameChangeTracker) == 'undefined') {
			//alert("No HeaderWidget__changeTracker object");
			return;
		}
		var date = new Date();
		var currentMillis = date.getTime();
		for (prop in builder_common__menuLevelNameChangeTracker) {
			var changeDelta = (currentMillis - builder_common__menuLevelNameChangeTracker[prop]);
			//console.log("Checking "+prop+" which happened at "+HeaderWidget__changeTracker[prop]+" now is "+currentMillis+" delta="+changeDelta);
			if(changeDelta >=  (builder_common__menuLevelNameChangedTimeout*0.9)) {
				delete(builder_common__menuLevelNameChangeTracker.prop);
				var menuLevel = $('menuLevel'+prop);
				var nameSpan = menuLevel.select("div")[0];
				new Ajax.Request('/admin/builder_ajax/set_menu_level_name.htm', {
					method:"post",
					parameters:{menuLevelID:prop, name:nameSpan.innerHTML}
				});
			}
		}
	}
	catch(e) {
		alert(e);
	}
}

function builder_common__saveMenuLevelName(evnt) {
	var menuLevelID = this.id.match(/menuLevel([0-9]+)NameSave/i)[1];
	var nameInput = $('menuLevel'+menuLevelID+'NameInput');
	new Ajax.Request('/admin/builder_ajax/set_menu_level_name.htm', {
		method:"post",
		parameters:{menuLevelID:menuLevelID, name:nameInput.value},
		onSuccess:builder_common__saveMenuLevelNameCB /*echo '<menu_level_id>'.$menuLevelID.'</menu_level_id>';
		echo '<name>'.htmlspecialchars($name).'</name>';*/
	});
}

function builder_common__saveMenuLevelNameCB(transport) {
	try {
		var xml = transport.responseXML;
		var menuLevelID = xml.getElementsByTagName("menu_level_id")[0].firstChild.data;
		var name =		  xml.getElementsByTagName("name")[0].firstChild != null ? xml.getElementsByTagName("name")[0].firstChild.data : '';
		var titleDiv = $$('div#menuLevel'+menuLevelID+' div.menuLevelTitle')[0];
		titleDiv.update(name);
	}
	catch(e) {
		console.log(e);
	}
}
/** End Menus & pages tools **/