/*
Copyright 2007 GroundWork Open Source, Inc. ("GroundWork")
All rights reserved. This program is free software; you can redistribute it and/or modify it under 
the terms of the GNU General Public License version 2 as published by the Free Software Foundation.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; 
if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
Boston, MA 02110-1301, USA.  
*/

// Dojo Libraries
dojo.require("dojo.io.*");
dojo.require("dojo.widget.*");
dojo.require("dojo.html.*");

/*
dojo.hostenv.setModulePrefix("guava", "../");
dojo.require("guava.core.*");

var guava = {
	processor : new guava.core.MessageProcessor,
	
	init : function () {
		this.processor.addContext("framework");
		this.processor.addContextListener("framework", this);
	},
	processMessage: function (message) {
		alert("woot");
	}
};

guava.init();
*/

var debugWindow = null;

var start_time;
var end_time;
var process_time;

var __guava_progression;	// This flag dictates if we're in the middle of processing.

var pollSettings = {
	enabled: 0,
	timer: 0
}

var sessionSettings = {
	cookies: 1,
	id: 0,
	name: ''
}

var debugSettings = {
	enabled: 0
}


var jsEval = '';

function byId(id){
	return document.getElementById(id);
}

function parseJavascriptElements(node) {
	jsNodes = node.getElementsByTagName("script");

	for(counter = 0; counter < jsNodes.length; counter++) {
		js = jsNodes.item(counter).innerHTML;
		eval(js);
	}
}

function poll() {
	if(pollSettings.enabled == 1) {
		pollguava();
		setTimeout("poll()", (pollSettings.timer * 1000));
	}
}

function restartRefresh() {
	setTimeout("refresh()", 1000);
}

function restartCloneRefresh(cloneid) {
	if(refreshSettings.enabled == 1) {
		sendComponentReq(cloneid);
		setTimeout("restartCloneRefresh('" + cloneid + "')", (refreshSettings.timer * 1000));
	}
}

function startHeartbeat() {
	heartbeat();
	setTimeout("startHeartbeat()", 300000);
}

var outboundMessageQueue = new Array();

function toggleDivDisplay(divelement) {
	element = document.getElementById(divelement);
	if(!(typeof(element) == "undefined")) {
		if(element.style.display == 'none') {
			element.style.display = 'inline';
		}
		else {
			element.style.display = 'none';
		}
	}
	
}

function mainHash(target) {
	parent.main.location.hash = target;
}

function processInputs() {
		elements = document.getElementsByTagName("input");
		selectElements = document.getElementsByTagName("select");
		numOfElements = elements.length;
		for(counter = 0; counter < numOfElements; counter++) {
			if(elements.item(counter).getAttribute('type') != "button")
				addMessage('framework', 'object', [{name: 'identifier', type: 'string', value: elements.item(counter).getAttribute('id')}, {name: 'setvalue', type: 'cdata', value:  escape(elements.item(counter).value)}]);
		}
		numOfElements = selectElements.length;
		for(counter = 0; counter < numOfElements; counter++) {
			if(selectElements.item(counter).getAttribute('type') != "button")
				addMessage('framework', 'object', [{name: 'identifier', type: 'string', value: selectElements.item(counter).getAttribute('id')}, {name: 'setvalue', type: 'cdata', value:  escape(selectElements.item(counter).value)}]);
		}

}

var Form = {
	process: function (formElement) {
		//processInputs();
		addMessage('framework', 'object', [{name: 'identifier', type: 'string', value: formElement.getAttribute('id')}, {name: 'method', type: 'string', value:  'Invoke'}]);
		sendMessageQueue();
		
	},
	
	toggleCheckbox: function (checkboxElement) {
		if(checkboxElement.checked) {
			checkboxElement.value = '1';
		}
		else {
			checkboxElement.value = '0';
		}
	}
}



function addMessage(context, type, messagePacket) {
	// Refuse to add the message if there is progression being made
	if(!__guava_progression) {
		tempMessageObject = new Object();
		tempMessageObject.context = context;
		tempMessageObject.type = type;
		tempMessageObject.packet = messagePacket;
		outboundMessageQueue[outboundMessageQueue.length] = tempMessageObject;
	}
	else {
		debug("Failed to add message.  Previous process in progress...");
	}
}

function toggleProgression(hide) {
	
	if(!hide && guava.core.NodeManager.getMaster.__guavaProgression && !guava.core.NodeManager.getMaster.__guavaError) {
		widget = dojo.widget.getWidgetById('__waitDialog');
		if(widget)
			widget.show();
		
		/*
		// Uh oh, we need to display the element
		progress = document.getElementById("__guava_progress");
		if(!(progress == undefined)) {
			progress.style.display = "inline";
		}
		*/
	}
	else {
		widget = dojo.widget.getWidgetById('__waitDialog');
		if(widget)
			widget.hide();
	}
}

function sendMessageQueue() {
		// Refuse to add the message if there is progression being made
		if(guava.core.NodeManager.getMaster.__guavaProgression)
			return;
		guava.core.NodeManager.getMaster.__guavaProgression = true;
		setTimeout('toggleProgression()', 1000);
		
		start_time = new Date();

		// HACK TO UPDATE INPUT FIELDS!
		/*
		tempOutboundMessageQueue = new Array();
		for(counter = 0; counter < outboundMessageQueue.length; counter++) {
			tempOutboundMessageQueue[counter] = outboundMessageQueue[counter];
		}
		*/
		tempOutboundMessageQueue = outboundMessageQueue;
		outboundMessageQueue = new Array();
		processInputs();
		outboundMessageQueue = outboundMessageQueue.concat(tempOutboundMessageQueue);
		// END HACK
		
		if (!(debugWindow == null)) {
			if(!debugWindow.closed) {
			debugLine = debugWindow.document.getElementById('start_time');
			if(debugLine) {
				debugLine.innerHTML = start_time.toLocaleTimeString();
			}
			}
		}
		
		 if (document.implementation.createDocument){ 
		   // Mozilla, create a new DOMParser 
			domDocument = document.implementation.createDocument(null, "request", null);
		 } 
		 else if (window.ActiveXObject){ 
		   // Internet Explorer, create a new XML document using ActiveX 
		   // and use loadXML as a DOM parser. 
		   domDocument = new ActiveXObject("Microsoft.XMLDOM"); 
		   tempRootElement = domDocument.createElement("request");
		   domDocument.appendChild(tempRootElement);
		 }
		 
		// Check for firstChild (Safari bug)
		if(domDocument.firstChild == null) {
			$tempRootElement = domDocument.createElement("request");
			domDocument.appendChild($tempRootElement);
		}
		
		domRoot = domDocument.firstChild;
		
		if(outboundMessageQueue.length) {
			
			while(message = outboundMessageQueue.shift()) {
			
				contextNode = null;
				contextNodes = domDocument.getElementsByTagName('context');
				numOfNodes = contextNodes.length;
				for(counter = 0; counter < numOfNodes; counter++) {
					tempNode = contextNodes.item(counter);
					if(tempNode.getAttribute('name') == message.context) {
						contextNode = tempNode;
						break;
					}
				}
				
				if(contextNode == null) {
					contextNode = domRoot.appendChild(domDocument.createElement('context'));
					contextNode.setAttribute('name', message.context);
				}
				
				// We have our context node.  Let's now create our message
				messageNode = contextNode.appendChild(domDocument.createElement('message'));
				messageNode.setAttribute('type', message.type);
				
				numOfPackets = message.packet.length;
				
				for(packetCounter = 0; packetCounter < numOfPackets; packetCounter++) {
					packetElement = messageNode.appendChild(domDocument.createElement('variable'));
					packetElement.setAttribute('name', message.packet[packetCounter].name);
					switch(message.packet[packetCounter].type) {
						case 'cdata':
							packetElement.setAttribute('type', 'cdata');
							packetElement.appendChild(domDocument.createCDATASection(message.packet[packetCounter].value));
							break;
						case 'string':
							packetElement.setAttribute('type', 'string');
							packetElement.appendChild(domDocument.createTextNode(message.packet[packetCounter].value));
							break;
						case 'number':
							packetElement.setAttribute('type', 'number');
							packetElement.appendChild(domDocument.createTextNode(message.packet[packetCounter].value));
							break;
						case 'boolean':
							packetElement.setAttribute('type', 'boolean');
							packetElement.appendChild(domDocument.createTextNode(message.packet[packetCounter].value));
							break;
						default:
							packetElement.setAttribute('type', 'unknown');
							packetElement.appendChild(domDocument.createTextNode(message.packet[packetCounter].value));
							break;
					}
				}		
			}		
		}
		// Browser specific functionality right here
		if(window.ActiveXObject) {	// We're in ie
			outboundString = domDocument.xml;
		}
		else {
			outboundString = new XMLSerializer().serializeToString(domRoot);
			
		}
		debugOutbound(outboundString);
		// woot
		
		dojo.io.bind({ url: prepareURL('/monitor/rpc.php'), load: guava.core.NodeManager.handleRPCResponse, method: "POST", postContent: "request=" + outboundString});
		
	}

function viewSelect(viewname) {
	addMessage('framework', 'viewselect', [{name: 'viewname', type: 'string', value: viewname}]);
	sendMessageQueue();
}

function prepareURL(url) {
	var newurl = url;
	if(sessionSettings.cookies == 0) {
		// We are using url session id's, need to translate
		if(newurl.indexOf("?") == -1) {
			newurl += "?";
		}
		else {
			newurl += "&";
		}
		newurl += sessionSettings.name + "=" + sessionSettings.id;
	}
	return newurl;
}

// Show the debug window or reshow it if it hasn't already
function showDebug() {
	if(debugWindow == null || debugWindow.closed) {
		debugWindow = window.open(prepareURL("debug.php"),
	                  "jsdebug",
	                  "width=400,height=600,scrollbars=no,"
	                  +"status=no,toolbar=no,menubar=no,resizable=0");
	}
}

// If the debug window exists, then write to it's line debug portion
function debug(text) {
	currentDate = new Date();
	if(debugSettings.enabled) {
	  	if(!(debugWindow == null)) {
		if(!debugWindow.closed) {
	  	debugLine = debugWindow.document.getElementById('linedebug');
	  	if(debugLine) {
	  		debugLine.insertBefore(debugWindow.document.createElement('br'), debugLine.firstChild);
	  		debugLine.insertBefore(debugWindow.document.createTextNode("[" + currentDate.toLocaleTimeString() + "] " + text + "\n"), debugLine.firstChild);
	  	}
		}
	  }
	}
}

function debugInbound(xmlresponse) {
	currentDate = new Date();
	if(debugSettings.enabled) {
	  	if(!(debugWindow == null)) {
		if(!debugWindow.closed) {
	  	buffer = debugWindow.document.getElementById('inboundxml');
	  	if(buffer) {
	  		oldChild = buffer.firstChild;
	  		buffer.replaceChild(debugWindow.document.createTextNode(xmlresponse), oldChild);
	  	}
		}
	  }
	}
}

function debugOutbound(xmlrequest) {
	currentDate = new Date();
	if(debugSettings.enabled) {
		if (!(debugWindow == null)) {
		if(!debugWindow.closed) {
	  	buffer = debugWindow.document.getElementById('outboundxml');
	  	if(buffer) {
	  		oldChild = buffer.firstChild;
	  		buffer.replaceChild(debugWindow.document.createTextNode(xmlrequest), oldChild);
	  	}
		}
	  }
	}
}



function heartbeat() {
	debug("Heartbeat");
	dojo.io.bind({ url: prepareURL('/monitor/rpc.php'), content: "heartbeat=1"});
}



function sendComponentReq(componentID) {
		debug("Starting Component Refresh Request for: " + componentID);
		requestXMLhttp.open('GET', prepareURL('/monitor/rpc.php?action=component&__componentID='+componentID), true);
		requestXMLhttp.onreadystatechange = handleRPCResponse;
		requestXMLhttp.send(null);
}

function sendCloneReq(componentID) {
	debug("Processing Clone Request for: " + componentID);
	requestXMLhttp.open('POST', prepareURL('/monitor/rpc.php?action=clone&__componentID='+componentID), true);
	requestXMLhttp.onreadystatechange = handleCloneResponse;
	requestXMLhttp.send(null);
}

function handleWorkload(response, handleNumber) {
	// First get contexts
	jsEval = '';	// Empty the eval;
	try {
		contexts = response.getElementsByTagName("context");
	}
	catch(e) {
		//alert("There was a fatal error inside Guava.  Guava cannot continue.  Will attempt to logout and restart your session.");
		//location.href="logout.php";
		return;
	}
	//contexts = response.getElementsByTagName("context");
	numOfContexts = contexts.length;
	for(counter = 0; counter < numOfContexts; counter++) {
		switch(contexts[counter].getAttribute('name')) {
			case 'framework':
				// We're in a framework context, let's get our messages
				messages = contexts[counter].childNodes;
				numOfMessages = messages.length;
				
				for(messageCounter = 0; messageCounter < numOfMessages; messageCounter++) {
					switch(messages[messageCounter].getAttribute('type')) {
						case 'refresh':
							// We're modifying refresh behaviour
							// Let's get our variables
							variables = messages[messageCounter].childNodes;
							numOfVariables = variables.length;
							for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
								switch(variables[variableCounter].getAttribute('name')) {
									case 'enabled':
										refreshSettings.enabled = variables[variableCounter].firstChild.nodeValue;
										break;
									case 'timer':
										refreshSettings.timer = variables[variableCounter].firstChild.nodeValue;
										break;
								}
							}
							if(refreshSettings.enabled) {
								restartRefresh();	// Let's start our refresh
							}
							break;
						case 'javascript':
							// We want to run custom javascript code
							variables = messages[messageCounter].childNodes;
							numOfVariables = variables.length;
							for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
								switch(variables[variableCounter].getAttribute('name')) {
									case 'javascript':
										jsEval += variables[variableCounter].firstChild.nodeValue;
										break;
								}
							}							
							break;
						case 'reload':
							location.reload();
							break;
							
						case 'object':
							// We're modifying an object
							// Let's get our variables
							// We're modifying refresh behaviour
							// Let's get our variables
							variables = messages[messageCounter].childNodes;
							numOfVariables = variables.length;
							for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
								switch(variables[variableCounter].getAttribute('name')) {
									case 'identifier':
										targetElement = document.getElementById(variables[variableCounter].firstChild.nodeValue);
										break;
									case 'value':
										if(!(targetElement == null)) {
											if(variables[variableCounter].firstChild == null) {
												newValue = '';
											}
											else {
												newValue = variables[variableCounter].firstChild.nodeValue;
											}
											targetElement.value = newValue;
											targetElement.setAttribute('value', newValue);
										}
										break;
									case 'src':
										if(!(typeof(targetElement) == 'undefined') && !(targetElement == null)) {
											if(typeof(variables[variableCounter].firstChild) == 'undefined') {
												newValue = '';
											}
											else {
												newValue = variables[variableCounter].firstChild.nodeValue;
											}
											targetElement.value = newValue;
											targetElement.setAttribute('src', newValue);
										}
										break;										
									case 'checked':
										// This is only valid for checkboxes
										if(!(targetElement == null)) {
											if(variables[variableCounter].firstChild == null || variables[variableCounter].firstChild.nodeValue == '0') {
												targetElement.checked = 0;
											}
											else {
												targetElement.checked = 1;						
											}
										}
										break;
										
									case 'innerHTML':
										if(!(typeof(targetElement) == 'undefined')) {
											targetElement.innerHTML = variables[variableCounter].firstChild.nodeValue;
											var parser = new dojo.xml.Parse();
											var frag  = parser.parseElement(targetElement, null, true);
											dojo.widget.getParser().createComponents(frag);
											
										}
										break;
									case 'append':
										if(!(targetElement == null)) {
											targetElement.innerHTML = targetElement.innerHTML + variables[variableCounter].firstChild.nodeValue;
											//var parser = new dojo.xml.Parse();
											//var frag  = parser.parseElement(targetElement, null, true);
											//dojo.widget.getParser().createComponents(frag);
										}
										break;
									case 'prepend':
										if(!((targetElement) == null)) {
											targetElement.innerHTML = variables[variableCounter].firstChild.nodeValue + targetElement.innerHTML;
											var parser = new dojo.xml.Parse();
											var frag  = parser.parseElement(targetElement, null, true);
											dojo.widget.getParser().createComponents(frag);
										}
										break;
									case 'parent':
										parentElement = document.getElementById(variables[variableCounter].firstChild.nodeValue);
										break;
									case 'remove':
										if(!(typeof(targetElement) == 'undefined') && !(typeof(parentElement) == 'undefined') && !(parentElement == null)) {
												
												parentElement.removeChild(targetElement);
										}
										break;
								}
							}
							break;
						case 'target':
							// We're modifying an object
							// Let's get our variables
							// We're modifying refresh behaviour
							// Let's get our variables
							variables = messages[messageCounter].childNodes;
							numOfVariables = variables.length;
							for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
								switch(variables[variableCounter].getAttribute('name')) {
									case 'identifier':
										targetElement = document.getElementById(variables[variableCounter].firstChild.nodeValue);
										break;
									case 'value':
										variables[variableCounter].normalize();	// We want to do this to combine text elements together to avoid 4096 char truncation
										if(!(targetElement == null)) {
											if(variables[variableCounter].firstChild == null) {
												newValue = '';
											}
											else {
												newValue = variables[variableCounter].firstChild.nodeValue;
											}
											targetElement.innerHTML = newValue;		
											var parser = new dojo.xml.Parse();
											var frag  = parser.parseElement(targetElement, null, true);
											dojo.widget.getParser().createComponents(frag);
											parseJavascriptElements(targetElement);								
										}
										break;
								}
							}
							break;
						case 'popup':
							if(handleNumber == 0) {
								popupWidth = '';
								popupHeight = '';
								popupIdentifier = '';
								variables = messages[messageCounter].childNodes;
								numOfVariables = variables.length;
								for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
									switch(variables[variableCounter].getAttribute('name')) {
										case 'width':
											popupWidth = variables[variableCounter].firstChild.nodeValue;
											break;
										case 'height':
											popupHeight = variables[variableCounter].firstChild.nodeValue;
											break;
										case 'identifier':
											popupIdentifier = variables[variableCounter].firstChild.nodeValue;
											break;
									}
								}
								window.open(prepareURL('/monitor/objectview.php?identifier=' + popupIdentifier),'','width=' + popupWidth + ',height=' + popupHeight + ',toolbar=no,resizable=yes,location=no,scrollbars=no,menubar=no');								
							}
							break;
						case 'viewport':
							variables = messages[messageCounter].childNodes;
							numOfVariables = variables.length;
							variableCounter = 0;
							while((!(typeof(variableCounter) == 'undefined')) && variableCounter < numOfVariables) {
								switch(variables[variableCounter].getAttribute('name')) {
									case 'sidenav':
										if(variables[variableCounter].firstChild.nodeValue == '1') {
											sideNavEnabled = 1;
										}
										else {
											sideNavEnabled = 0;
										}
										break;
									case 'viewport':
										viewport = variables[variableCounter].firstChild.nodeValue;
										break;
									case 'reload':
										if(variables[variableCounter].firstChild.nodeValue == '1') {
											// Check for sideNavEnabled
											if(!(typeof(sideNavEnabled) == 'undefined') && sideNavEnabled == 1) {
												viewReload(1);
											}
											else if(typeof(sideNavEnabled) != 'undefined') {
												viewReload(0);
											}
											//parent.view.location.reload();
											
											//return true;
										}
										break;
								}
								variableCounter++;
							}									
							break;
						case 'header':
							variables = messages[messageCounter].childNodes;
							numOfVariables = variables.length;
							for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
								switch(variables[variableCounter].getAttribute('name')) {
									case 'header_banner':
										element = document.getElementById('header_banner');
										if(!(typeof(element) == 'undefined')) {
											element.innerHTML = variables[variableCounter].firstChild.nodeValue;
											var parser = new dojo.xml.Parse();
											var frag  = parser.parseElement(element, null, true);
											dojo.widget.getParser().createComponents(frag);
										}
										break;
								}
							}									
							break;
						case 'sidenav':
								variables = messages[messageCounter].childNodes;
								numOfVariables = variables.length;
								element = undefined;
								for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
									switch(variables[variableCounter].getAttribute('name')) {
										case 'id':
											sidenavid = variables[variableCounter].firstChild.nodeValue;
											element = document.getElementById(variables[variableCounter].firstChild.nodeValue);
											break;
										case 'content':
											if(!(element == null)) {
												element.innerHTML = variables[variableCounter].firstChild.nodeValue;
												var parser = new dojo.xml.Parse();
												var frag  = parser.parseElement(element, null, true);
												dojo.widget.getParser().createComponents(frag);
											}
											break;
										case 'image':
												element = document.getElementById(sidenavid + ".image");
												if(!(typeof(element) == 'undefined') && !(element == null)) {
													element.setAttribute("src", variables[variableCounter].firstChild.nodeValue);
												}
											break;
									}
								}									
							break;
						case 'main':
							variables = messages[messageCounter].childNodes;
							numOfVariables = variables.length;
							for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
								switch(variables[variableCounter].getAttribute('name')) {
									case 'content':
											if(!(variables[variableCounter].firstChild == null) && !(typeof(variables[variableCounter].firstChild) == 'undefined')) {
												mainElement = document.getElementById("__main");
												if(mainElement != null) {
													mainElement.innerHTML = variables[variableCounter].firstChild.nodeValue;
														var parser = new dojo.xml.Parse();
														var frag  = parser.parseElement(mainElement, null, true);
														dojo.widget.getParser().createComponents(frag);
													parseJavascriptElements(mainElement);
												}
											}
										break;
								}
							}
							break;
						case 'menu':
							variables = messages[messageCounter].childNodes;
							numOfVariables = variables.length;
							for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
								switch(variables[variableCounter].getAttribute('name')) {
									case 'content':
											if(variables[variableCounter].firstChild == null) {
												document.getElementById("__menu").innerHTML = '';
											}
											else {
												document.getElementById("__menu").innerHTML = variables[variableCounter].firstChild.nodeValue;
											}
											var parser = new dojo.xml.Parse();
											var frag  = parser.parseElement(document.getElementById("__menu"), null, true);
											dojo.widget.getParser().createComponents(frag);
										break;
								}
							}
							break;
						case 'console':
							variables = messages[messageCounter].childNodes;
							numOfVariables = variables.length;
							for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
								switch(variables[variableCounter].getAttribute('name')) {
									case 'message':
											debug(variables[variableCounter].firstChild.nodeValue)
										break;
								}
							}
							break;
						case 'dialog':
							if(handleNumber == 0) {
								variables = messages[messageCounter].childNodes;
								numOfVariables = variables.length;
								for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
									switch(variables[variableCounter].getAttribute('name')) {
										case 'content':
												dialogContents = variables[variableCounter].firstChild.nodeValue;
											break;
										case 'name':
												elementName = variables[variableCounter].firstChild.nodeValue;
											break;
										case 'action':
											if(variables[variableCounter].firstChild.nodeValue == "show") {
												// We need to show the dialog
												// Let's append it to the body element
												
												
												elements = document.getElementsByTagName("body");
												bodyElement = elements[0];
												// We now have body Element
												newSpan = document.createElement("div");
												newSpan.setAttribute("id", "__temp" + elementName);
	
												bodyElement.appendChild(newSpan);
												newSpan.innerHTML = dialogContents;
																													
												var parser = new dojo.xml.Parse();
												var frag  = parser.parseElement(newSpan, null, true);
												dojo.widget.getParser().createComponents(frag);
												
												// Look for javascript!  Ugly hack!
												nodelist = dojo.widget.byId(elementName).domNode.getElementsByTagName("script");
												numOfScriptlets = nodelist.length;
												for(counter = 0; counter < numOfScriptlets; counter++) {
													eval(unescape(nodelist[counter].innerHTML));
												}
												
												
												
												// Now show the dialog!
												dojo.widget.byId(elementName).show();
												
												
											}
											if(variables[variableCounter].firstChild.nodeValue == "hide") {
												if(widget = dojo.widget.byId(elementName) != undefined) {
													dojo.widget.byId(elementName).hide();
													dojo.widget.byId(elementName).destroy();
													element = document.getElementById("__temp" + elementName);
													element.parentNode.removeChild(element);
												}											
											}
											break;
									}
								}
							}
								break;	
                                                case 'tabcontainer':
                                                    // We're working with tabs
                                                    variables = messages[messageCounter].childNodes;
                                                    numOfVariables = variables.length;
                                                    parameters = new Object();
                                                    for(variableCounter = 0; variableCounter < numOfVariables; variableCounter++) {
                                                            // Create new object
                                                            variables[variableCounter].normalize();	// We want to do this to combine text elements together to avoid 4096 char truncation
                                                            parameters[variables[variableCounter].getAttribute('name')] = variables[variableCounter].firstChild.nodeValue;								
                                                    }
                                                    targetContainer = document.getElementById(parameters["identifier"]);
                                                    if(!(targetContainer == null)) {
                                                            if(parameters["action"] == "addtab") {
                                                                // we want to add a tab
                                                                content = parameters["content"];
                                                                newid = parameters["newid"];
                                                                label = parameters["label"];
                                                                newtab = dojo.widget.createWidget("ContentPane", {id: newid, label: label});
                                                                newtab.setContent(content);
                                                                container = dojo.widget.manager.getWidgetById(parameters["identifier"]);
                                                                container.addChild(newtab);
                                                                container.selectTab(newtab);
                                                            }
                                                            else if(parameters["action"] == "select") {
                                                                // We want to select a tab
                                                                container = dojo.widget.manager.getWidgetById(parameters["identifier"]);
                                                                container.selectTab(dojo.widget.manager.getWidgetById(parameters["target"]));
                                                            }
                                                    }
                                                    break;

		
					}
				}
				break;
		}
	}
	end_time = new Date();	
	if (!(debugWindow == null) && !debugWindow.closed) {
		debugLine = debugWindow.document.getElementById('end_time');
		if(debugLine) {
			debugLine.innerHTML = end_time.toLocaleTimeString();
		}
	}
	
	if(start_time != undefined) {
		process_time = (end_time.getTime() - start_time.getTime());
		
		if (!(debugWindow == null) && !debugWindow.closed) {
			debugLine = debugWindow.document.getElementById('process_time');
			if(debugLine) {
				debugLine.innerHTML = process_time + " ms";
			}
		}
	}
	
	// Evaluate jsEval!
	if(jsEval != "") {
		try {
			eval(jsEval);
		}
		catch(e) {
			// do nothing
		}
	}
}


function handleCloneResponse() {
    if(requestXMLhttp.readyState == 4){
		    if(requestXMLhttp.status == 200) {
			debug("Successfully received Component Clone Response XML.");
			var response = requestXMLhttp.responseXML;
			debugInbound(requestXMLhttp.responseText);
			clones = response.getElementsByTagName("clone");
			numOfClones = clones.length;
			for(counter = 0; counter < numOfClones; counter++) {
				cloneID = clones[counter].getAttribute("id");
				window.open(prepareURL('clone.php?__componentID=' + cloneID),'','width=800,height=320,toolbar=yes,resizable=yes,location=no,scrollbars=yes,menubar=no');				
				
				
			}
		    }
    }
}

dojo.require("dojo.dnd.*");

GuavaDropTarget = function(node, types) {
	if (arguments.length == 0) { return; }
		dojo.dnd.HtmlDropTarget.call(this, node, types);
}
dojo.inherits(GuavaDropTarget, dojo.dnd.HtmlDropTarget);
dojo.lang.extend(GuavaDropTarget, {
	onDrop: function(e) {
		coords = dojo.html.getAbsolutePosition(this.domNode);	
		x = e.pageX - coords.left;
		y = e.pageY - coords.top;
        addMessage('framework', 'dnd', [{name: 'source', type: 'string', value: e.dragSource.domNode.getAttribute('id')}, {name: 'target', type: 'string', value: this.domNode.getAttribute('id')}, {name: 'x', type: 'string', value: y}, {name: 'y', type: 'string', value: x}]); sendMessageQueue();
                    
		return false;
	},
            createDropIndicator : function() {
	this.dropIndicator = document.createElement("div");
	with (this.dropIndicator.style) {
                    display = "none";
		position = "absolute";
		zIndex = 999;
		borderTopWidth = "1px";
		borderTopColor = "black";
		borderTopStyle = "solid";
		width = "2px";
		left = "2px";
	}
            }
});
