/**
 * vmq-main.js
 * Basic interface scripts for the VMQ
 * 
 * @author johnbell
 * @version 0.1
 */

/**
 * @global object VMQ
 */
VMQ = new Object();
VMQ.windowManager = {
	windows: new Array(),
	minimized: new Array(),
	currentZ: 1000,
	currentLoc: 30
};
VMQ.toolbox = false;

/**
 * VMQ.openWindow
 * Opens a new window
 * 
 * @param {string} windowClass Class of window to open
 * @param {array} contentCall Array containing [ajaxHandlerName, ajaxVarsArray]
 */
VMQ.openWindow = function(windowClass, contentCall){
	if(!$(windowClass)) VMQ.sendError('Invalid window open call:  windowClass='+windowClass);
	//If the toolbox hasn't been initialized yet, do so
	if(!VMQ.toolbox){
		//Read the templates from the DOM
		VMQ.toolbox = new Array();
		var tools = $('toolbox').childElements();
		tools.each(function(ele){if(ele.id) VMQ.toolbox[ele.id] = ele;});
	};
	//Clone the necessary toolbox templates
	var newWindow = VMQ.toolbox[windowClass].cloneNode(true);
	var titleBar = VMQ.toolbox.VMQChrome.cloneNode(true);
	newWindow.appendChild(titleBar);
	var contentArea = VMQ.toolbox.contentScrollbox.cloneNode(true);
	VMQ.windowManager.windows.push(newWindow);
	newWindow.id = 'window' + VMQ.windowManager.currentZ++;
	document.body.appendChild(newWindow);
	contentArea.setStyle({height: newWindow.getHeight() - 26 + 'px'});
	newWindow.appendChild(contentArea);
	newWindow.show();
	newWindow.style.zIndex = VMQ.windowManager.currentZ++;
	newWindow.style.top = VMQ.windowManager.currentLoc % 120 + 'px';
	newWindow.style.left = (VMQ.windowManager.currentLoc % 120) + 230 + 'px';
	VMQ.windowManager.currentLoc = VMQ.windowManager.currentLoc + 30;
	newWindow.startWaiting('waiting');
	newWindow.contentArea = $(contentArea).down('div');
	newWindow.titleBar = $(titleBar).down('.float');
	window.setTimeout(newWindow.stopWaiting.bind(newWindow), 500);
	Event.observe(newWindow, 'mousedown', function(e){Event.element(e).up('div.window').style.zIndex = VMQ.windowManager.currentZ++;Event.element(e).up('div.window').select('.droppable').each(function(drop){Droppables.pushToTop(drop)});});
	Event.observe(titleBar, 'mousedown', function(e){Event.element(e).up('div.window').style.zIndex = VMQ.windowManager.currentZ++;Event.element(e).up('div.window').select('.droppable').each(function(drop){Droppables.pushToTop(drop)});});	
	new Draggable(newWindow.id, {handle: titleBar,
								 starteffect: function(ele){ele.style.zIndex = VMQ.windowManager.currentZ++;}, 
								 endeffect: function(ele){ele.style.zIndex = VMQ.windowManager.currentZ++;}});
								 
	//Insert content
	contentCall.parameters.windowName = newWindow.id;
	newWindow.contentCall = contentCall;
//	VMQ.sendConsole(contentCall.parameters);
	new Ajax.Updater(newWindow.contentArea, 'ajaxHandlers/'+contentCall.url, {parameters: contentCall.parameters, evalScripts: true});
};
/**
 * VMQ.closeWindowButton
 * When the close button is pushed, closes a window and deletes it from the windowManager
 * 
 * @param {event} e The click event on the window's close button
 * @returns {bool} false
 */
VMQ.closeWindowButton = function(e){
	Event.stop(e);
	VMQ.closeWindow(Event.element(e).parentNode.parentNode);
	ProtoHistoryObj.saveVMQ();
	return false;
};

/**
 * Closes a window and deletes it from the windowManager
 * @param {DOMNode} windowNode The window to be closed
 */
VMQ.closeWindow = function(windowNode){
	$(windowNode).select('.droppable').each(function(i){Droppables.remove(i);});
	VMQ.windowManager.windows.splice(VMQ.windowManager.windows.indexOf(windowNode), 1);
	$(windowNode).remove();
	return false;
};

/**
 * Hides a window and create a new minimize button in the taskbar
 * 
 * @param {event} e The click event on the window's minimize button
 * @returns {bool} false
 */
VMQ.minWindow = function(e){
	Event.stop(e);
	var minButton = Event.element(e);
	var windowNode = $(minButton.parentNode.parentNode);
	var newMin = VMQ.toolbox.minimized.cloneNode(true);
	newMin.windowNode = windowNode;
	newMin.innerHTML = windowNode.titleBar.innerHTML;
	newMin.addClassName('color-'+windowNode.titleBar.parentNode.contentType);
	VMQ.windowManager.minimized.push(newMin);
	windowNode.setStyle({display: 'none'});
	$('taskbar').appendChild(newMin);
	return false;
};
/**
 * Destroys a minimized window's button
 * @param {DOMNode} minimizedNode
 */
VMQ.destroyMin = function(minimizedNode){
	VMQ.windowManager.minimized.splice(VMQ.windowManager.minimized.indexOf(minimizedNode), 1);
	minimizedNode.remove();
};
/**
 * Unhides a window and destroys its minimized button in the taskbar
 * 
 * @param {event} e The click event coming from the minimized button
 * @returns {bool} false
 */
VMQ.restoreWindow = function(e){
	Event.stop(e);
	var minimized = Event.element(e);
	minimized.windowNode.setStyle({display: 'block', zIndex: VMQ.windowManager.currentZ++});
	VMQ.destroyMin(minimized);
	return false;
};

/**
 * Submits a login attempt and updates the button panel as appropriate
 * 
 * @param {event} e The click event to trigger submission.  Target element should be in the login form
 * @return {bool} false
 */
VMQ.submitLogin = function(e){
	Event.stop(e);
	$('loginWindow').startWaiting();
	var formElement = Event.element(e).up('form');
	new Ajax.Updater($('buttonBar'), 'ajaxHandlers/do-login.php', {
		parameters: formElement.serialize(true),
		evalScripts: true,
		onComplete: function(){formElement.reset(); $('loginWindow').stopWaiting();}
	});
	return false;
};

/**
 * Uses Protohistory to read the current hash and restore the state
 */
VMQ.restoreState = function(){
	var hash = ProtoHistoryObj.getHash();
	if(!hash) return false;
	var hashArray = hash.split('&');
	hashArray.each(function(i){
		
		var hashType = i.slice(0,1);
		var hashValue = i.slice(2);
		switch(hashType){
			case 'a':
				//artwork
				//template:   a:2:{s:2:"id";s:2:"16";s:4:"type";s:7:"artwork";}
				var dataString = 'a:2:{s:2:"id";s:'+hashValue.length+':"'+hashValue+'";s:4:"type";s:7:"artwork";}';
				VMQ.openWindow('window600x620', {url: "view-artwork.php", parameters: {dataString: dataString}});
			break;
			case 's':
				//stakeholder
				//template:   a:2:{s:2:"id";s:2:"16";s:4:"type";s:11:"stakeholder";}
				var dataString = 'a:2:{s:2:"id";s:'+hashValue.length+':"'+hashValue+'";s:4:"type";s:11:"stakeholder";}';
				VMQ.openWindow('window400x390', {url: "view-stakeholder.php", parameters: {dataString: dataString}});
			break;			
		};
	});
};

/**
 * Submits a password change attempt and updates the button panel as appropriate
 * 
 * @param {event} e The click event to trigger submission.  Target element should be in the login form
 * @return {bool} false
 */
VMQ.submitPasswordChange = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window');
	var handler = formElement.getElements().find(function (ele){if(ele.name == 'handler') return true; else return false;});
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;
	windowElement.startWaiting();
	new Ajax.Updater($('buttonBar'), 'ajaxHandlers/'+handler.value, {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: function(){windowElement.stopWaiting();}
	});
	return false;
};

/**
 * Closes all windows and delete's the user's cookie
 * 
 * @param {event} e The logout button's click event
 * @return {bool} false
 */
VMQ.logout = function(e){
	Event.stop(e);
	new Ajax.Request('ajaxHandlers/do-logout.php');
	$('loginWindow').show();
	$('taskbar').hide();
	$('desktop').hide();
	$('title-bar').hide();
	$('buttonBar').innerHTML = '';
	$A($R(0,VMQ.windowManager.windows.length - 1)).reverse().each(function (i){VMQ.closeWindow(VMQ.windowManager.windows[i]);});
	$A($R(0,VMQ.windowManager.minimized.length - 1)).reverse().each(function(i){VMQ.destroyMin(VMQ.windowManager.minimized[i]);});
	return false;
};

/**
 * Reads the written name from the user's cookie after they're logged in
 * 
 * @return {string} The user's written name, or false on failure
 */
VMQ.readName = function(){
	var nameString = 'vmq[written]=';
	var cookieArray = document.cookie.split(';');
	for(var i=0;i < cookieArray.length;i++) {
		var cookie = cookieArray[i];
		while (cookie.charAt(0)==' ') cookie = cookie.substring(1,cookie.length);
		if (cookie.indexOf(nameString) == 0){
				
			return cookie.substring(nameString.length,cookie.length).replace(/\+/, ' ');	
		}
	}
	return false;
}

/**
 * Process the file upload form
 * 
 * @param {Object} e Event that triggered the upload
 */
VMQ.processBinaryForm = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	formElement.submit();
	return false;
};

/**
 * Creates a new image cropper for the upload icon form
 * 
 * @param {string} windowName Name of the window to create the cropper in
 */
VMQ.cropperInit = function(windowName){

	new Cropper.ImgWithPreview(
		windowName.id+'_tmpimg',
		{
			minWidth: 40,
			minHeight: 40,
			ratioDim: {x: 40, y:40},
			onEndCrop: VMQ.endCrop,
			previewWrap: windowName.id+'_preview'
		});
};

/**
 * When cropping an icon, updates the coordinates in the hidden form fields
 * 
 * @param {Object} coords x1,y1,x2,y2 array generated by Cropper
 * @param {Object} dimensions height,width array generated by Cropper
 * @param {Object} id id of the icon cropper window to update
 */
VMQ.endCrop = function(coords, dimensions, id){
	var windowName = id.split('_')[0];
	if(!$(windowName)) return false;
	var cropForm = $(windowName).down('form');
	cropForm.x1.value = coords.x1;
	cropForm.x2.value = coords.x2;	
	cropForm.y1.value = coords.y1;	
	cropForm.y2.value = coords.y2;
	cropForm.height.value = dimensions.height;
	cropForm.width.value = dimensions.width;
	return false;
};

/**
 * Does a metaserver lookup and returns a list of search results
 * @param str type Type of lookup to do
 * @param {Object} e Event object that triggered the lookup
 * @return HTML result that comes back from the ajaxHandler
 */
VMQ.metaserverLookup = function(type, e){
	Event.stop(e);
	var searchString = Event.element(e).value;
	if(searchString == '') return false;
	var lookupWindow = Event.element(e).up('div.window');
	lookupWindow.startWaiting('waiting');
	var selectArea = lookupWindow.down('div.metaserver');
	var currWindow = lookupWindow.id;
	new Ajax.Updater(selectArea, 'ajaxHandlers/metaserver-lookup.php', {parameters: {currWindow: currWindow, type: type, search: searchString}, evalScripts: true});
};

/**
 * Sets a metaserver ID in a form as a result after a search.
 * @param {Object} e Event object that triggered the result setting
 */
VMQ.setMetaserverResult = function(e){
	Event.stop(e);
	var srcDiv = $(Event.element(e));
	var formWindow = srcDiv.up('div.window');
	var metaIDField = formWindow.down('input.metaID');
	metaIDField.value = srcDiv.readAttribute('metaserverID');
	if(metaIDField.value != '') formWindow.down('#meta-target').value = srcDiv.readAttribute('metaserverValue');
	formWindow.down('div.metaserver').innerHTML = '&nbsp;';
};

/* TODO: documentation... */
VMQ.updateRequired = function(windowName){
/*	var required = ele.readAttribute('vmqComponentRequires').split(',');
	if(!required) return false;
	var currWindow = $(windowName);
	required.each(function(j){
		if(j != ''){
			var componentTarget = currWindow.vmqClasses[j];
			if(!componentTarget.present){
				componentTarget.required = true;
				componentTarget.domObj.setStyle({backgroundColor: 'red'});
			};
		};
	});
*/	
	var currWindow = $(windowName);
	currWindow.vmqClasses.each(function(i){
		i.present = false;
		i.required = false;
		i.domObj.setStyle({backgroundColor: 'transparent'});
	});
	currWindow.down('#components').select('.dropped').each(function(i){
		var required = i.readAttribute('vmqComponentRequires').split(',');
		required.each(function(j){
			if(j != ''){
				var componentTarget = currWindow.vmqClasses[j];
				if(!componentTarget.present){
					componentTarget.required = true;
					componentTarget.domObj.setStyle({backgroundColor: 'red'});
				};
			};
		});		
		
		var vmqClass = i.readAttribute('vmqComponentClass');
		
		if(!currWindow.vmqClasses[vmqClass].present){
			currWindow.vmqClasses[vmqClass].present = true;
			currWindow.vmqClasses[vmqClass].domObj.setStyle({backgroundColor: 'green'});
		};
	});
	
	
	
	
};

VMQ.editMode = function(e){
	Event.stop(e);
	var windowElement = Event.element(e).up('div.window');
	var windowType = windowElement.vmqType;
	var windowData = windowElement.vmqData;
	var properties = windowElement.down('.properties');
	if(windowElement.editing == true) return false;
	windowElement.editing = true;
	switch (windowType){
		case 'component':
			var notesContainer = windowElement.down('#notes_container');
			var notes = notesContainer.down().innerHTML;
			var notesField = document.createElement('textarea');
			notesField.name = 'notes';
			notesField.value = notes;
			notesField.className = 'input-textarea';
			notesContainer.update(notesField);
			notesField.setStyle({height: '100px'});
			
			var examplesContainer = windowElement.down('#examples_container');
			var examples = examplesContainer.innerHTML;
			var examplesField = document.createElement('input');
			examplesField.type = 'text';
			examplesField.className = 'input-text';
			examplesField.name = 'examples';
			examplesField.value = examples;
			examplesContainer.update(examplesField);
		
			var closeButton = "<div class='clickable float' id='img-button-close' onclick='VMQ.removeDivParent(event);'></div>";
			Droppables.add(properties, {
				onDrop: function(ele){if(ele.readAttribute('vmqtype') != 'question' && ele.readAttribute('vmqtype') != 'package') return false; var cloned=ele.cloneNode(true); cloned.setStyle({zindex: 0, opacity: 1}); cloned.removeClassName('draggable'); cloned.addClassName('dropped'); properties.appendChild(cloned); new Insertion.Top(cloned, closeButton);}
			});
			new Insertion.Top(properties, "<li><div class='float' id='img-target-question'></div><div class='float' id='img-target-package'></div>&nbsp;<br clear='both' /></li>");
			new Insertion.Bottom(windowElement.down('form'), "<div id='img-button-arrow' class='clickable floatRight' onclick='VMQ.processEditComponent(event); VMQ.endEdit(\""+windowElement.id+"\");'></div>");
		break;
		case 'question':
		/*	windowElement.down("#controlBlock").hide();
			var questionContainer = windowElement.down('#questionContainer');
			var questionText = questionContainer.innerHTML;
			var questionField = document.createElement('textarea');
			questionField.name = 'question';
			questionField.value = questionText;
			questionField.className = 'input-textarea';
			questionContainer.update(questionField);
			questionField.setStyle({height: '100px', width: '360px'});
			
			new Insertion.Bottom(windowElement.down('form'), "<div id='img-button-arrow' class='clickable floatRight' onclick='VMQ.processForm(event); VMQ.endEdit(\""+windowElement.id+"\");'></div>");				
		*/
		break;
		case 'stakeholder':
			windowElement.down("#controlBlock").hide();
			var notesContainer = windowElement.down('#notesContainer');
			var notes = notesContainer.down('#notes').innerHTML;
			var notesField = document.createElement('textarea');
			notesField.name = 'notes';
			notesField.value = notes;
			notesField.className = 'input-textarea';
			notesContainer.update(notesField);
			notesField.setStyle({height: '100px', width: '360px'});		
			
			new Insertion.Bottom(windowElement.down('form'), "<div id='img-button-arrow' class='clickable floatRight' onclick='VMQ.processForm(event); VMQ.endEdit(\""+windowElement.id+"\");'></div>");
		break;
	}
};

/**
 * Remove the editing flag from the passed window
 * @param {string} windowId The ID of the window that is currently in edit mode
 * @return false;
 */
VMQ.endEdit = function(windowId){
	$(windowId).editing = false;
	return false;
};

VMQ.openViewWindow = function(e){
	Event.stop(e);
	var triggerEle = Event.element(e);
	if(triggerEle.readAttribute('vmqType')==null) triggerEle = triggerEle.up('li');
	var windowType = triggerEle.readAttribute('vmqType');
	var windowData = triggerEle.readAttribute('vmqData');
	switch(windowType){
		case 'stakeholder':	var windowClass = 'window400x390';		break;
		case 'question':	var windowClass = 'window400x620';		break;
		case 'package':		var windowClass = 'window400x620';		break;
		case 'component':	var windowClass = 'window600x620';		break;
		case 'artwork':		var windowClass = 'window600x620';		break;
		case 'interview':   var windowClass = 'window600x620';		break;
		case 'new-interview': var windowClass = 'window600x620';	break;
		default: var windowClass = 'window600x620';	
	}
	//VMQ.sendConsole(windowType);
	VMQ.openWindow(windowClass, {url: "view-"+windowType+".php", parameters: {dataString: windowData}});
};

VMQ.deleteComponent = function(e){
	Event.stop(e);
	var windowElement = Event.element(e).up('div.window');
	var handler = 'ajaxHandlers/do-delete-component.php';
	var parameters = new Array();
	parameters.dataString = windowElement.vmqData;
	parameters.windowID = windowElement.id
	windowElement.startWaiting();
	new Ajax.Updater($('status'), handler, {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: function(){windowElement.stopWaiting();}
	});
	return false;	
};

VMQ.processForm = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window');
	var handler = formElement.getElements().find(function (ele){if(ele.name == 'handler') return true; else return false;});
	var receipt = formElement.getElements().find(function(ele){if(ele.name == 'metaReceipt') return true; else return false;});
	if(receipt){
		if(receipt.value==''){
			VMQ.sendStatus('Could not add: no search receipt value found');
			return false;
		};
	};
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;
	windowElement.startWaiting();
	new Ajax.Updater($('status'), 'ajaxHandlers/'+handler.value, {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: function(){windowElement.stopWaiting();}
	});
	return false;
};

VMQ.processSearch = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window') || formElement.up('div.desktopSearch');
	var resultElement = windowElement.down('div.searchResults');
	var handler = formElement.getElements().find(function (ele){if(ele.name=='handler') return true; else return false;});
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;	
	windowElement.startWaiting();
	
	//garbage collection
	resultElement.select('.draggable').each(function(i){i.dragObj.destroy();});

	new Ajax.Updater(resultElement, 'ajaxHandlers/'+handler.value, {
		parameters: parameters,
		evalScripts: true,
		onComplete: function(){windowElement.stopWaiting();}
	});
	return false;
};

VMQ.processSearchAll = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	formElement.search.value = ' ';
	VMQ.processSearch(e);
	return false;
};

VMQ.processStakeholderRelation = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window');
	var handler = formElement.getElements().find(function(ele){if(ele.name=='handler') return true; else return false;});
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;
	formElement.select('.dropped').each(function(i){
		VMQ.sendConsole('adding '+i.parentNode.readAttribute('id')+' with data '+i.readAttribute('vmqdata'));
		parameters[i.parentNode.readAttribute('id')] = i.readAttribute('vmqdata');
	});
	new Ajax.Updater($('status'), 'ajaxHandlers/do-add-stakeholder-relation.php', {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: windowElement.stopWaiting()
	});
};

VMQ.processAddPackage = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window');
	var handler = formElement.getElements().find(function(ele){if(ele.name=='handler') return true; else return false;});
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;
	parameters['questions[]'] = new Array();
	formElement.select('.dropped').each(function(i){
		VMQ.sendConsole('adding '+i.readAttribute('vmqdata'));
		parameters['questions[]'].push(i.readAttribute('vmqdata'));
	});
	VMQ.sendConsole(parameters['questions[]'].inspect());
	new Ajax.Updater($('status'), 'ajaxHandlers/do-add-package.php', {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: windowElement.stopWaiting()
	});
};

VMQ.processAddComponent = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window');
	var handler = formElement.getElements().find(function(ele){if(ele.name=='handler') return true; else return false;});
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;
	parameters['questions[]'] = new Array();
	formElement.select('.dropped').each(function(i){
		VMQ.sendConsole('adding '+i.readAttribute('vmqdata'));
		parameters['questions[]'].push(i.readAttribute('vmqdata'));
	});
	VMQ.sendConsole(parameters['questions[]'].inspect());
	new Ajax.Updater($('status'), 'ajaxHandlers/do-add-component.php', {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: windowElement.stopWaiting()
	});
};

VMQ.processEditComponent = function(e){
	Event.stop(e);
	var windowElement = Event.element(e).up('div.window');
	var formElement = Event.element(e).up('form');	
	var handler = formElement.getElements().find(function(ele){if(ele.name=='handler') return true; else return false;});	
	var questionList = windowElement.down('.properties');
	var parameters = formElement.serialize(true);
	parameters.windowName = windowElement.id;
	//parameters.dataString = windowElement.down('.component').readAttribute('vmqdata');
	parameters['questions[]'] = new Array();
	questionList.select('.dropped').each(function(i){
		VMQ.sendConsole('adding '+i.readAttribute('vmqdata'));
		parameters['questions[]'].push(i.readAttribute('vmqdata'));
	});
	VMQ.sendConsole(parameters['questions[]'].inspect());
	new Ajax.Updater($('status'), 'ajaxHandlers/do-edit-component.php', {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
//		onComplete: function(){windowElement.stopWaiting(); VMQ.closeWindow(windowElement); VMQ.openWindow('window600x620', {url: "view-component.php", parameters: {dataString: parameters.dataString}});}
		onComplete: function(){windowElement.stopWaiting();}
	});	
};

VMQ.processAddArtwork = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window');	
	
	//validate component types
	var valid = true;
	windowElement.vmqValidClasses.each(function(i){if(windowElement.vmqClasses[i].required && !windowElement.vmqClasses[i].present) valid = false;});
	
	if(!valid){
		VMQ.sendStatus('One or more required component types are missing.  Please add new components and try again.');
		return false;
	}
	
	var handler = formElement.getElements().find(function(ele){if(ele.name=='handler') return true; else return false;});
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;
	parameters['components[]'] = new Array();
	parameters['component_notes[]'] = new Array();
	formElement.select('.dropped').each(function(i){
//		VMQ.sendConsole('adding '+i.readAttribute('vmqdata'));
		if(i.parentNode.readAttribute('id')=='components'){
			parameters['components[]'].push(i.readAttribute('vmqdata'));
			parameters['component_notes[]'].push(i.down('.input-textarea').value);
		}
		if(i.parentNode.readAttribute('id')=='stakeholder') parameters['stakeholder'] = i.readAttribute('vmqdata');
	});
//	VMQ.sendConsole(parameters['components[]'].inspect());
	new Ajax.Updater($('status'), 'ajaxHandlers/do-add-artwork.php', {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: windowElement.stopWaiting()
	});
};

VMQ.processEditArtwork = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window');	
	
	//validate component types
	var valid = true;
	windowElement.vmqValidClasses.each(function(i){if(windowElement.vmqClasses[i].required && !windowElement.vmqClasses[i].present) valid = false;});
	
	if(!valid){
		VMQ.sendStatus('One or more required component types are missing.  Please add new components and try again.');
		return false;
	}
	
	var handler = formElement.getElements().find(function(ele){if(ele.name=='handler') return true; else return false;});
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;
	parameters.dataString = windowElement.vmqData;
	parameters['components[]'] = new Array();
	parameters['component_notes[]'] = new Array();
	parameters['component_ids[]'] = new Array();
	formElement.select('.dropped').each(function(i){
//		VMQ.sendConsole('adding '+i.readAttribute('vmqdata'));
		if(i.parentNode.readAttribute('id')=='components'){
			parameters['components[]'].push(i.readAttribute('vmqdata'));
			parameters['component_notes[]'].push(i.down('.input-textarea').value);
			parameters['component_ids[]'].push(i.down('.hidden').value);
		}
		if(i.parentNode.readAttribute('id')=='stakeholder') parameters['stakeholder'] = i.readAttribute('vmqdata');
		
	});
//	VMQ.sendConsole(parameters['components[]'].inspect());
	new Ajax.Updater($('status'), 'ajaxHandlers/do-edit-artwork.php', {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: windowElement.stopWaiting()
	});
};

VMQ.processInterview = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window');
	var handler = formElement.getElements().find(function(ele){if(ele.name=='handler') return true; else return false;});
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;
	//Get the stakeholders
	parameters['stakeholders[]'] = new Array();
	parameters['stakeholderRoles[]'] = new Array();
	parameters['permissions[]'] = new Array();
	formElement.down('ol.stakeholders').childElements().each(function (i){
		if(i.readAttribute('vmqtype')=='stakeholder'){
			if(i.readAttribute('vmqdata')){
				parameters['stakeholders[]'].push(i.readAttribute('vmqdata'));
				parameters['stakeholderRoles[]'].push(i.down('select.role').getValue());
			};
		};
	});
	formElement.down('ol.permissions').childElements().each(function (i){
		if(i.readAttribute('vmqtype')=='stakeholder'){
			if(i.readAttribute('vmqdata')){
				parameters['permissions[]'].push(i.readAttribute('vmqdata'));
			};
		};
	});	
	//VMQ.sendConsole('stakeholders found: '+parameters['stakeholders[]'].length);
	new Ajax.Updater($('status'), 'ajaxHandlers/do-add-interview.php', {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: function(){windowElement.stopWaiting();}
	});	
};

VMQ.processEditInterview = function(e){
	Event.stop(e);
	var formElement = Event.element(e).up('form');
	var windowElement = formElement.up('div.window');
	var handler = formElement.getElements().find(function(ele){if(ele.name=='handler') return true; else return false;});
	var parameters = formElement.serialize(true);
	parameters.windowID = windowElement.id;
	//Get the stakeholders
	parameters['stakeholders[]'] = new Array();
	parameters['stakeholderRoles[]'] = new Array();
	parameters['permissions[]'] = new Array();
	formElement.down('ol.stakeholders').childElements().each(function (i){
		if(i.readAttribute('vmqtype')=='stakeholder'){
			if(i.readAttribute('vmqdata')){
				parameters['stakeholders[]'].push(i.readAttribute('vmqdata'));
				parameters['stakeholderRoles[]'].push(i.down('select.role').getValue());
			};
		};
	});
	formElement.down('ol.permissions').childElements().each(function (i){
		if(i.readAttribute('vmqtype')=='stakeholder'){
			if(i.readAttribute('vmqdata')){
				parameters['permissions[]'].push(i.readAttribute('vmqdata'));
			};
		};
	});	
	//VMQ.sendConsole('stakeholders found: '+parameters['stakeholders[]'].length);
	new Ajax.Updater($('status'), 'ajaxHandlers/do-edit-interview.php', {
		parameters: parameters,
		evalScripts: true,
		insertion: Insertion.Top,
		onComplete: windowElement.stopWaiting()
	});	
};


VMQ.resetFormWindow = function(windowNode){
	if(!$(windowNode)) return false;
	var formElement = $(windowNode).down('form');
	if(typeof formElement == 'undefined'){
		VMQ.sendError('Tried to reset a form, but could not find it!');
	} else {
		formElement.reset();
	};
	return false;
};

VMQ.toggleDivSibling = function(e){
	VMQ.sendConsole('Toggle on: '+Event.element(e).className);
	Event.findElement(e, 'div').next('.toggle').toggle();
	return false;
};

VMQ.toggleDivChildren = function(e){
	Event.stop(e);
	Event.element(e).childElements().each(function(i){i.toggle();});
	return false;
};

VMQ.toggleDivParent = function(e){
	Event.stop(e);
	Event.element(e).up('.contain').toggle(); 
	return false;
};

VMQ.toggleDivCousin = function(e){	
	if(Event.element(e).hasClassName('clickable')) var clickElement = Event.element(e);
	else var clickElement = Event.findElement(e, 'div').up('.clickable');
	clickElement.next('.toggle').toggle();
	if(clickElement.down('.img-arrow-large-off')){
		clickElement.down('.img-arrow-large-off').removeClassName('img-arrow-large-off').addClassName('img-arrow-large-on');
	}
	else if(clickElement.down('.img-arrow-large-on')){
		clickElement.down('.img-arrow-large-on').removeClassName('img-arrow-large-on').addClassName('img-arrow-large-off');
	} if(clickElement.down('.img-arrow-off')){
		clickElement.down('.img-arrow-off').removeClassName('img-arrow-off').addClassName('img-arrow-on');
	}
	else if(clickElement.down('.img-arrow-on')){
		clickElement.down('.img-arrow-on').removeClassName('img-arrow-on').addClassName('img-arrow-off');
	}	
	return false;
};

VMQ.cloneDivParent = function(e){
	Event.stop(e);
	var parentEle = Event.element(e).up('div');
	var newElement = parentEle.cloneNode(true);
	parentEle.up().insertBefore(newElement, parentEle.nextSibling);
};
VMQ.cloneDivGrandparent = function(e){
	Event.stop(e);
	var parentEle = Event.element(e).up().up('div');
	var newElement = parentEle.cloneNode(true);
	parentEle.up().insertBefore(newElement, parentEle.nextSibling);
};
VMQ.removeDivParent = function(e){
	Event.stop(e);
	Event.element(e).up().remove();
};
VMQ.removeDivGrandparent = function(e){
	Event.stop(e);
	Event.element(e).up().up().remove();
};
VMQ.sendStatus = function(statusText){
	new Insertion.Top($('status'), '<div>'+statusText+'</div><br />');
};

VMQ.sendError = function(errorText){
	try{
		console.error(errorText);
		console.trace();
	} catch (e){
		return false;
	};
	return false;
};

VMQ.sendConsole = function(consoleText){
	try{
		console.info(consoleText);
	} catch (e){
		return false;
	};
	return false;
};

VMQ.titleConcat = function(e){
	Event.stop(e);
	var eventForm = Event.element(e).up('form');
	var locationField = eventForm.location.value;
	var yearField = eventForm.year.value;
	eventForm.name.value = VMQ.readName()+', '+locationField+', '+yearField;
}

VMQ.redirectReturn = function(e, targetID){
	if(e.keyCode == Event.KEY_RETURN) VMQ.simulateFormClick(e, targetID);
	return false;
};

VMQ.simulateFormClick = function(e, targetID){
	Event.stop(e);
	var targeted = Event.element(e).up('form').descendants().find(function(i){return i.id==targetID});
	//VMQ.sendConsole(Event.element(e).inspect());
	if(document.createEvent){
		var evt = document.createEvent("MouseEvents");
		evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
		targeted.dispatchEvent(evt);
	} else {targeted.click()};
	return false;
};
