/**
 * General Javascript Functions
 *
 * Developed by 1000camels
 *
 */
 
/**
 * disable submit from an return key on a form field
 */
/*document.onkeypress = function(evt) {
	evt = evt || window.event;
	
	var keyCode = evt.keyCode || evt.which || 0;
  if(keyCode == '13') {
		//Event.stop(evt);
  	//return false;
  }
  
  return true;
}*/


/**
 * Hidden Function Keys
 *
 *	 Cmd(mac)/Ctrl(pc) + Option/Alt + B = switch to browse mode
 *	 Cmd(mac)/Ctrl(pc) + Option/Alt + E = switch to edit mode
 *	 Cmd(mac)/Ctrl(pc) + Option/Alt + L = show/hide login window
 *	 Cmd(mac)/Ctrl(pc) + Option/Alt + O = show/hide objectSpace
 *
 */
 
document.onkeydown = function (evt) {
	evt = evt || window.event;
	var keyCode = evt.keyCode || evt.which || 0;
		//try { evt.keyCode = 0;} catch(e) {}
		var keyString = String.fromCharCode(keyCode);
 
  //console.log('keyCode: '+keyCode+' - keyString: '+keyString);
  //alert('keyCode: '+keyCode+' - keyString: '+keyString);
	
	//if(keyCode && (evt.altKey && evt.ctrlKey)) { //(keyCode == '18')) { // alt=18, ctrl=17, meta/cmd=224
	/*if(keyString == '27') {  // ESC
  	if($('editMode')) {
			//console.log('meta key pressed');
			//openCBMessage();
			//showAllContainers();
			enableControlBoxes();
  	}
	}*/
		
	if (keyCode && (evt.altKey && evt.ctrlKey) || evt.metaKey) {
		//try { evt.keyCode = 0;} catch(e) {}
		//var keyString = String.fromCharCode(keyCode);
		//console.log(keyCode);
		
		if(keyString == 'B') {
			changeMode('browse');
		}
		if(keyString == 'E') {
			changeMode('edit');
		}
		else if(keyString == 'L') {
			showLoginWindow();
		}
		else if(keyString == 'O') {
			if($('objectSpace')) showHideObjectSpace();
		}
		else if(keyString == 'D') {
			showSystemMessages();
		}
		else if(keyString == 'I') {
			showHide('pageInfo');
		}
		/*else if(keyCode == '37') {  // left arrow
			if($('previousButton'))  window.location = $('previousButton').href;
		}
		else if(keyCode == '39') {  // right arrow
			if($('nextButton')) window.location = $('nextButton').href;
		}
		else if(keyCode == '38') {  // up arrow
			console.log('go to parent');
			if($('upButton')) window.location = $('upButton').href;
		}
		else if(keyCode == '40') {  // down arrow
			console.log('go to first child');
			if($('downButton')) window.location = $('downButton').href;
		}*/
		return true;
	}
	
	// Navigation: previous/next, up/down
	if(keyCode == '37') {  // left arrow
		if($('previousButton'))  window.location = $('previousButton').href;
	}
	else if(keyCode == '39') {  // right arrow
		if($('nextButton')) window.location = $('nextButton').href;
	}
	else if(keyCode == '38') {  // up arrow
		console.log('go to parent');
		if($('upButton')) window.location = $('upButton').href;
	}
	else if(keyCode == '40') {  // down arrow
		console.log('go to first child');
		if($('downButton')) window.location = $('downButton').href;
	}
	
	return true;
}


/*document.onkeyup = function (evt) {
	evt = evt || window.event;
	var keyCode = evt.keyCode || evt.which || 0;
		var keyString = String.fromCharCode(keyCode);
	
	if(keyCode && (keyCode == '18')) { // alt=18, ctrl=17, meta/cmd=224
		if($('editMode')) {
			//console.log('meta key released');
			ModalWindow = false;
			closeCBMessage();
			hideOtherContainerOutlines(0);
		}
	}
 
	return true;
}*/


document.onmousedown = function (evt) {
	evt = evt || window.event;
	
	if($('editMode') && controlBoxes) { //!ModalWindow && (evt.altKey) && Event.isLeftClick(evt)) {
  	Event.stop(evt);
  	if(Event.element(evt).hasClassName('koContainer')) {
  		var thisKO = Event.element(evt);
  	} else {
			var koContainer = Event.element(evt).up('.koContainer');
			if(koContainer) {
  			var thisKO = koContainer;
			}
  	}
  	
  	// have been found a KO, or are we going to assume the activeKO
  	if(thisKO) {
  		var koId = getId(thisKO.getAttribute('id'), '^ko(\\d+)');
  	} else {
			var koId = $('activeKO').firstChild.nodeValue;
  	}
  	
		if(koId) {
			console.log('clicking on '+koId);
			showProgressOverlay();
			openControlBox(koId);
			ModalWindow = true;
		}
  	
		return true;
	}

	return true;
}
var ModalWindow = false;
var controlBoxes = false;
 

/* *****************************************************************************************/





function openCBMessage() {
  var cbMessage = document.getElementById('cbMessage');
  if(cbMessage) {
  	cbMessage.style.visibility = 'visible';
  } else {
 		var cbMessage = document.createElement('div');
  	 cbMessage.setAttribute('id','cbMessage');
 		 $$('BODY')[0].appendChild(cbMessage);
 		var cbMessageContainer = document.createElement('div');
 		 cbMessage.appendChild(cbMessageContainer);
 		var cbMessageSpan = document.createElement('span');
 		 cbMessageContainer.appendChild(cbMessageSpan);
 		var cbMessageText = document.createTextNode('Click anywhere to open a control panel for that object');
 		 cbMessageSpan.appendChild(cbMessageText);
 		 
 		Event.observe(cbMessage,'mouseover',closeCBMessage);
  }
} 
 
function closeCBMessage() {
  var cbMessage = $('cbMessage');
  if(cbMessage) {
  	cbMessage.style.visibility = 'hidden';
	}
}


function showAllContainers() {
	var allKOs = $$('.koContainer');
	for(var i=0;i<allKOs.length;i++) {
		var id = allKOs[i].getAttribute('id')
		if(matches = id.match(/^ko(\d+)/)) {
			var thisId = matches[1];
  		createContainerOutline(thisId);
		}
	}
}

/*function hideAllContainers() {
	var allKOs = $$('.koContainer');
	for(var i=0;i<allKOs.length;i++) {
		var id = allKOs[i].getAttribute('id')
		if(matches = id.match(/^ko(\d+)/)) {
			var thisId = matches[1];
  		createContainerOutline(thisId);
		}
	}
}*/


/**
 * opens new window and manages focusing
 *
 * http://www.codestore.net/store.nsf/unid/DOMM-4PYJ3S?OpenDocument
 *
 * @access public
 * @return TBD
 */
function windowOpener(url, windowName, args) {
	/* ******************************
	the newWindows array stores an object reference for
	each separate window that is called, based upon
	the url attribute that is supplied as an argument
	*******************************/
	
	//if(window[windowName]) alert('found the new window');
	
	if ( typeof( newWindows[windowName] ) != "object" ){
		newWindows[windowName] = window.open(url,windowName,args);
	} else {
		if (!newWindows[windowName].closed && newWindows[windowName].location) {
			if(newWindows[windowName].location.href != url) {
				newWindows[windowName].location.href = url;
			}
		} else {
			newWindows[windowName] = window.open(url,windowName,args);
		}
	}
	if(!newWindows[windowName].opener) newWindows[windowName].opener = self;
	
	if(window.focus) newWindows[windowName].focus();
	
	// save newWindows to php session
	
	return newWindows[windowName];
}
var newWindows = new Array();


/**
 * Wrapper for overlib - not being used right now
 *
 * @access public
 * @return TBD              
 */
function showMessage(koId) 
{
	//overlib(msg, STICKY);
	var helpWindow = 'help'+koId;
	
	var over = document.getElementById("overDiv");
	
	
	if (olNs4) {
		var lyr = o3_frame.document[helpWindow].document
		lyr.write(txt)
		lyr.close()
	} else if (typeof over.innerHTML != 'undefined') {
		if (olIe5 && isMac) over.innerHTML = '';
		over.innerHTML = txt;
	} else {
		range = o3_frame.document.createRange();
		range.setStartAfter(over);
		domfrag = range.createContextualFragment(txt);
		
		while (over.hasChildNodes()) {
			over.removeChild(over.lastChild);
		}
		
		over.appendChild(domfrag);
	}
	
	return;
}

/**
 * Opens a window with the system messages of the last execution cycle
 *
 * @access public
 * @return TBD            
 */
function showSystemMessages() {
	var baseURL = getBaseURL();
	windowOpener(baseURL+'lib/Core/C1Object/scripts/getSystemMessages.php', 'systemMessages', "width=640,height=480,top=20,left=20,toolbar=no,location=no,directories=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes");
}


/**
 * Opens a window for the help
 *
 * @access public
 * @return TBD            
 */
function showHelp(url) 
{
	if(!helpWindow || helpWindow && helpWindow.closed) {
		helpWindow = window.open(url, "HelpViewer", "width=640,height=480,top=20,left=20,toolbar=no,location=no,directories=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes");
	} else {
		//helpWindow.location.reload();
		helpWindow.focus();
	}
}
// defines variable outside of function to make it global
var helpWindow = null;


/**
 * toggles the bort's information drawer
 *
 * @access public
 * @return TBD
 */
function showHide(id,cleanUrlBase)
{
	var obj = document.getElementById(id);
	
	if(!obj) { return false; }
	if(obj.style.display == 'none'){
		obj.style.display = '';
	}
	else{
		obj.style.display = 'none';
		
		// redraw content to avoid bug - turned off because it's too flashy - dwc
		redrawParentElement('content');
	}
}


/**
 * 
 */
function showHideByLink(id,donotredraw)
{	
	var obj = document.getElementById(id);
	
	if(!obj) { return false; }
	if(obj.style.display == 'none'){
		obj.style.display = '';
			}
	else{
		obj.style.display = 'none';
				
		// redraw content to avoid bug - turned off because it's too flashy - dwc
		if(!donotredraw) redrawParentElement('content');
	}	
}


/**
 * Opens up a new window with the session manager in it
 *
 * @access public
 * @return TBD              
 */
function manageSessions(basePath) {
	if(!sessionWin || sessionWin && sessionWin.closed) {
		sessionWin = window.open(basePath + "lib/CLN/interfaces/SessionVars.php", "SessionManager", "width=640,height=480,top=20,right=20,toolbar=no,location=no,directories=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes");
	} else {
		sessionWin.location.reload();
		sessionWin.focus();
	}	
}
var sessionWin = null;		// needs to be defined globally for manageSessions to work


/**
 * prepares the input button to use js updateVersioNumber()
 */
function prepareUpdateVersionNumber() {
	if($('updateVersionNumber')) Event.observe('updateVersionNumber', 'click', updateVersioNumber);
}


/**
 *
 */
function updateVersioNumber() {
	var koMetadataVersion = document.getElementById('koMetadataVersion');
	var versionNumberDisplay = document.getElementById('versionNumberDisplay');
	
	if(koMetadataVersion.value) {
		var newVersionNumber = Math.ceil(koMetadataVersion.value+1).toPrecision(2);
	} else {
		var newVersionNumber = 0.1;
	}
	koMetadataVersion.value = newVersionNumber+'NEW';
	versionNumberDisplay.firstChild.nodeValue = newVersionNumber;
	this.parentNode.removeChild(this);
}


/**
 * changes the view for the photogallery - deprecated - use changeDisplayStyle()
 */
function changeView(view) {
	if($('imageDisplay')) {
		if(view == 'list') {
			$('imageDisplay').addClassName('imageList');
			$('imageDisplay').removeClassName('imageThumbs');
			setSessionVariable('imageDisplayType','imageList');
		} else {
			$('imageDisplay').addClassName('imageThumbs');
			$('imageDisplay').removeClassName('imageList');
			setSessionVariable('imageDisplayType','imageThumbs');
		}
	}
}


/**
 * tries to determine whether to show thumbnails or a list
 */
function prepareSetDisplay() {
	//console.log('prepareSetDisplay');
	
	var images = $$('ul.setDisplay img');
	if(images.length > 0) {
		//loadjscssfile(getBaseURL()+'lib/Core/C1Object/styles/Thumbnails.css','css');
		for(var i=0;i<images.length;i++) {
			if(src = images[i].getAttribute('src')) {
				var hasImageSrc = true;
				break;
			}
		}
		if(hasImageSrc) {
			changeDisplayStyle('thumbnailDisplay');
		} else {
			changeDisplayStyle('listDisplay');
		}
	}
}


/**
 * changes the view for the photogallery
 */
function changeDisplayStyle(style) {
  //console.log('changing to '+style);
			
	var setDisplays = $$('ul.setDisplay');
	var setDisplay = setDisplays[0];
	if(setDisplay) {
		if($('listDisplayLink')) $('listDisplayLink').removeClassName('activeDisplayStyle');
		if($('columnDisplayLink')) $('columnDisplayLink').removeClassName('activeDisplayStyle');
		if($('thumbnailDisplayLink')) $('thumbnailDisplayLink').removeClassName('activeDisplayStyle');
		
		if(style == 'listDisplay') {
			setDisplay.addClassName( 'listDisplay');
			if($('listDisplayLink')) $('listDisplayLink').addClassName('activeDisplayStyle');
			setDisplay.removeClassName( 'columnDisplay');
			setDisplay.removeClassName( 'thumbnailDisplay');
			//setSessionVariable('SetDisplayStyle','listDisplay');
		}
		else if(style == 'columnDisplay') {
			setDisplay.addClassName( 'columnDisplay');
			if($('columnDisplayLink')) $('columnDisplayLink').addClassName('activeDisplayStyle');
			setDisplay.removeClassName( 'listDisplay');
			setDisplay.removeClassName( 'thumbnailDisplay');
			//setSessionVariable('SetDisplayStyle','columnDisplay');
		}
		else if(style == 'thumbnailDisplay') {
			setDisplay.addClassName( 'thumbnailDisplay');
			if($('thumbnailDisplayLink')) $('thumbnailDisplayLink').addClassName('activeDisplayStyle');
			setDisplay.removeClassName( 'listDisplay');
			setDisplay.removeClassName( 'columnDisplay');
			//setSessionVariable('SetDisplayStyle','thumbnailDisplay');\
		} else {
			// default to list
			setDisplay.addClassName( 'listDisplay');
			if($('listDisplayLink')) $('listDisplayLink').addClassName('activeDisplayStyle');
			setDisplay.removeClassName( 'columnDisplay');
			setDisplay.removeClassName( 'thumbnailDisplay');
			//setSessionVariable('SetDisplayStyle','listDisplay');
		}
	}
}


/**
 *
 */
function searchIsLoaded() {
	$('allContentSearch').style.display = 'block';
	$('allContentSearch').addClassName('multiSelectionContainer');
	discoverMultiSelectionContainers();
	hideProgressOverlay();
}


/**
 *
 */
function hideContentSelector() {
	$('allContentSearch').style.display = 'none';
}


/**
 * add a slide container around content
 */
function addSlideContainer(imageContent) {
	var photoSlideContainer = document.createElement('div');
	 photoSlideContainer.setAttribute('class','photoSlideContainer');
	var photoSlide = document.createElement('div');
	 photoSlide.setAttribute('class','photoSlide');
	 photoSlideContainer.appendChild(photoSlide);
	var emptySpan = document.createElement('span');
	 photoSlide.appendChild(emptySpan);
	 photoSlide.appendChild(imageContent);
	
	return photoSlideContainer;
}


/**
 * add a slide container around content
 */
function removeSlideContainer() {

}


/**
 * sets the title for the page
 */
function setPageTitle(title) {
	var pageTitle = document.getElementById('pageTitle');
	var pageTitleValue = pageTitle.firstChild.nodeValue;
	var titleParts = pageTitleValue.split(' - ');
	pageTitle.firstChild.nodeValue = titleParts[0]+title;
}


/**
 * 
 */
function setupMessageWindows() {
	if($('userMessages')) {
		Event.observe('userMessages', 'click', function(e) {
				if(window.event) {
					var srcElement = window.event.srcElement;
				} else {
					var srcElement = e.currentTarget;
				}
				srcElement.style.visibility = 'hidden';
			}
		);
	}
	if($('errorMessages')) {
		Event.observe('errorMessages', 'click', function(e) {
				if(window.event) {
					var srcElement = window.event.srcElement;
				} else {
					 var srcElement = e.currentTarget;
				}
				srcElement.style.visibility = 'hidden';
			}
		);
	}
}


/**
 *
 */
function setupNextLinks() {
	var nextLinks = $$('.nextLink');
	if(nextLinks.length > 0) {
		for(i=0;i<nextLinks.length;i++) {
			nextLinks[i].style.cursor = 'pointer';
			Event.observe(nextLinks[i], 'click',function(e) {
					//instantMessage('advancing to next content');
					if($('nextButton')) window.location = $('nextButton').href;
				}
			);
		}
	}
}


/**
 * prepares slidingDrawers (markup that can be toggled)
 *	- requires two nodes with classes, slidingDrawer and slidingDrawerController and the controller
 *  must have the same id as the drawer with the word 'Controller' appended to it (ie. someDrawerController)
 */
function setupDrawers() {
	// this is done in css now, to make it immediate
	var allDrawers = $$('.slidingDrawer');
	if(allDrawers.length > 0) {
		for (i=0; i < allDrawers.length ; i++) {
			// hide drawers
			if(!allDrawers[i].hasClassName('openDrawer')) {
				var styles = 'display:none';
				var oldStyles = allDrawers[i].getAttribute('style');
				if(oldStyles) {
					styles = styles+';'+oldStyles;
				}
				allDrawers[i].setAttribute('style',styles);
			}
			
			// create close button
			if(allDrawers[i].getStyle('position') == 'absolute') {
				var closeButton = document.createElement('span');
				 allDrawers[i].appendChild(closeButton);
				 closeButton.setAttribute('class','closeButton');
				 closeButton.style.position = 'absolute';
				var closeButtonText = document.createTextNode('close');
				 closeButton.appendChild(closeButtonText);
				 
						var dimensions = allDrawers[i].getDimensions();
						closeButton.style.top = allDrawers[i].offsetTop+dimensions.height-20+'px';
						closeButton.style.left = allDrawers[i].offsetLeft+dimensions.width-30+'px';
				 
				Event.observe(closeButton,'click',function(e) {
						var slidingDrawer = Event.element(e).parentNode;
						var thisId = slidingDrawer.getAttribute('id');
						Effect.toggle(thisId,'APPEAR');
						slidingDrawer.style.visibility = 'visible';
						if(allDrawers[i].hasClassName('openDrawer')) slidingDrawer.removeClassName('openDrawer');
					}
				);
			}
		}
	}
	var allDrawerControllers = $$('.slidingDrawerController');
	if(allDrawerControllers.length > 0) {
		for (i=0; i < allDrawerControllers.length; i++) {
			Event.observe(allDrawerControllers[i],'click', function() {
					var thisId = this.getAttribute('id');
					if(matches = thisId.match(/^(\w+)Controller/)) {
						var thisDrawerId = matches[1];
						
						Effect.toggle(thisDrawerId,'APPEAR');
						return false;
					}
				}
			);
		}
	}
}


/**
 *
 */
function setupFormSections() {
	var formSections = $$('form fieldset.formSection');
	
	for(var i=0;i<formSections.length;i++) {
		var formSectionId = formSections[i].getAttribute('id');
		var trigger = $$('#'+formSectionId+' legend')[0];
		var container = $$('#'+formSectionId+' div.formSectionContainer')[0];
		 trigger.containerId = formSectionId+'Container';
		
		if(formSections[i].hasClassName('collapsed')) {
			Effect.toggle(trigger.containerId,'APPEAR');
		}
		
		// collapse all
		//formSections[i].toggleClassName('collapsed');
		//Effect.toggle(trigger.containerId,'APPEAR');
		
		Event.observe(trigger,'click',function(e) {
				Event.element(e).parentNode.toggleClassName('collapsed');
				Effect.toggle(this.containerId,'APPEAR');
			}
		);
		
	}
}


/**
 *
 */
function setupVersionSelector() {
	var allVersionSelectors = $$('.versionSelector');
	if(allVersionSelectors.length > 0) {
		for (i=0;i<allVersionSelectors.length;i++) {
			Event.observe(allVersionSelectors[i],'change',function(e) {
					var thisSelect = Event.element(e);
					var selectedVersion = thisSelect.options[thisSelect.selectedIndex].value;
					if(window.location.search == '') {
						window.location.search = '?setVersion='+selectedVersion;
					} else {
						window.location.search = window.location.search+'&setVersion='+selectedVersion;
					}
				}
			);
		}
	}
}



/* ***************************************************************************/
// AutoCompleter

/**
 *
 */
function setupAutoCompleter() {
	//if(FALSE && !document['prepareAutoCompleter']) {
		//jQuery.noConflict();
		//jQuery.getScript(getBaseURL()+'lib/Core/C1Object/scripts/AutoCompleter.js',setupAutoCompleter);
		loadjscssfile(getBaseURL()+'lib/Core/C1Object/scripts/AutoCompleter.js','js');
		loadjscssfile(getBaseURL()+'lib/Core/C1Object/styles/AutoCompleter.css','css');
	//} else {
	//	prepareAutoCompleter();
	//}
}


/* ***************************************************************************/
// In Place Editors

/**
 * find and setup inPlace editors
 *
 * requires classname 'inPaceEditor' and another object holding the url with the classname equal to object's id + 'EditorURL'
 */
function setupInPlaceEditors(root) {
	if(root == undefined) var root = document
	var inPlaceEditors = $$('.inPlaceEditor');

	for (i=0; i < inPlaceEditors.length ; i++) {
		var editorName = inPlaceEditors[i].getAttribute('id');
 		if(editorName) {
 			var editorURLs = $$('.'+editorName+'EditorURL');
 			if(editorURLs[0]) {
 				var thisURL = editorURLs[0].firstChild.nodeValue;
				var options = { size: "10", callback: inPlaceEditorCallback, ajaxOptions: { method: 'get' }, okText: "save" };
				
				if(newInPlaceEditors[editorName] == undefined) {
					newInPlaceEditors[editorName] = new Ajax.InPlaceEditor(editorName, getBaseURL()+thisURL, options);
 				} else {
 					newInPlaceEditors[editorName].initialize(editorName, getBaseURL()+thisURL, options);
 				}
 			}
 		}
 	}
}
var newInPlaceEditors = new Array();


/**
 *
 */
function inPlaceEditorCallback(form, value) {
	var matches = form.getAttribute('id').match(/^(\w+)-/);
	var editorName = matches[1];
	var data = 'editorName='+editorName;
	var additionalParams = $$('.'+editorName+'Params');
	if(additionalParams[0]) {
		data += '&'+additionalParams[0].firstChild.nodeValue;
	}
	return data+'&value=' + escape(value);
}





/**
 * finds all kos and creates controllers for each of them
 */
function setupControllers() {
	if($('controlBoxButton')) {
		loadjscssfile(getBaseURL()+'lib/Core/C1Object/scripts/ControlBoxes.js','js');
		Event.observe($('controlBoxButton'), 'click', function(e) {
				var koId = $('activeKO').firstChild.nodeValue;
				openControlBox(koId);
				showControlBox(koId);
			}
		);
	}
	if($('controlBar')) {
		loadjscssfile(getBaseURL()+'lib/Core/C1Object/scripts/ControlBoxes.js','js');
		loadjscssfile(getBaseURL()+'lib/Core/C1Object/scripts/Controllers.js','js');
		Event.observe($('controlBar'), 'click', function(e) {
				enableControlBoxes();
			}
		);
	}
}


/* ***************************************************************************/


function setupFullScreenTextarea() {
	var fullScreenEditors = $$('.fullscreenEnabled');
	
	for(var i=0;i<fullScreenEditors.length;i++) {
		var fullScreenButton = document.createElement('img');
		fullScreenButton.setAttribute('class','fullScreenButton');
		fullScreenButton.setAttribute('src',getBaseURL()+'lib/Core/C1Object/images/fullScreen.gif');
		fullScreenEditors[i].parentNode.appendChild(fullScreenButton);
		fullScreenButton.fullScreenEditor = fullScreenEditors[i];
		
		Event.observe(fullScreenButton, 'click', function(e) {
				var fullScreenEditor = Event.element(e).fullScreenEditor;
				if(fullScreenEditor.hasClassName('fullScreen')) {
					fullScreenEditor.removeClassName('fullScreen');
				} else {
					fullScreenEditor.addClassName('fullScreen');
				}
			}
		);
	}
}


/**
 * checks and unchecks all checkboxes within container
 */
function checkUncheckAll(checkboxContainer, check) {
	var checkboxContainer = document.getElementById(checkboxContainer);
	var allInputs = checkboxContainer.getElementsByTagName('input');
	for(var i=0;i<allInputs.length;i++) {
		if(allInputs[i].getAttribute('type') == 'checkbox') {
			if(check) {
				allInputs[i].setAttribute('checked',1);
			} else {
				allInputs[i].removeAttribute('checked');
			}
		}
	}
}


/**
 * 
 */
function showMessages() {
	if(messageWindow) messageWindow.style.visibility = 'visible';
}


/**
 * 
 */
function showLoginWindow() {
	//showProgressOverlay();
	showHideByLink('loginExpand');
	var loginButtons = $$('.loginButton');
	if(loginButtons.length > 0) {	
		for(var i=0;i<loginButtons.length;i++) {
				var loginText = loginButtons[i].childNodes[0].nodeValue;
				if(loginText) {
					if(loginText == 'Login') {
						loginButtons[i].childNodes[0].nodeValue = 'Hide Login';
					} else {
						loginButtons[i].childNodes[0].nodeValue = 'Login';
					}
				}
		}
	}
}


/**
 * switches between edit and browse mode
 */
function changeMode(newMode) {
	var myString = top.location.search;
	
	// We get rid of the leading "?"
	myString = myString.substring(1);
	
	// We separate each name and value pairs
	var myArray = myString.split("&");
	
	// We are going through the array one element at a time
	for (i=0; i < myArray.length ; i++) {
	
		// We split the name and value pair
		var mySubArray = myArray[i].split("=");
	
		if(mySubArray[0] == 'editMode') {
			mySubArray[1] = newMode;
			var editMode = true;
		}
		myArray[i] = mySubArray.join("=");
	}
	
	if(!editMode) {
		if(myArray[0] == '') { var myArray = new Array(); }
		myArray.push('editMode='+newMode);
	}
	
	var myString = myArray.join("&");
	var newSearch = '?'+myString;
	
	if(newSearch != top.location.search) {
		top.location.search = newSearch;
	}
}





/**
 * sets a registered session variable
 */
function setSessionVariable(name,value) {
	var baseurl = getBaseURL();
	var data = 'name='+name+'&value='+value;
	var setSessionURL = baseurl+'lib/Core/C1Object/scripts/setSessionVariables.php';
	
	var myAjax = new Ajax.Request(
    setSessionURL,
    { 
    	method: 'get',
    	parameters: data, 
    	onSuccess: function() {
				//alert(name+','+value);
    	},
    }
	);
}

/**
 * loads header items from Ajax calls
 * 	- borrowed from ajaxtabs until a rewrite
 */
function loadHeaders(revattribute) {
	if (revattribute!=null && revattribute!="") { //if "rev" attribute is defined (load external .js or .css files)
		//var objectlist=revattribute.split(/\s*,\s*/) //split the files and store as array
		var objectlist = document.getElementById(revattribute).getElementsByTagName('link');
		alert(objectlist.length);
		for (var i=0; i<objectlist.length; i++) {
			var file=objectlist[i].getAttribute('href');
			var fileref=""
			alert(file)
			if (loadedobjects.indexOf(file)==-1) { //Check to see if this object has not already been added to page before proceeding
				if (file.indexOf(".js")!=-1) { //If object is a js file
					fileref=document.createElement('script')
					fileref.setAttribute("type","text/javascript");
					fileref.setAttribute("src", file);
				}
				else if (file.indexOf(".css")!=-1) { //If object is a css file
					fileref=document.createElement("link")
					fileref.setAttribute("rel", "stylesheet");
					fileref.setAttribute("type", "text/css");
					fileref.setAttribute("href", file);
				}
			}
			if (fileref!=""){
				document.getElementsByTagName("head").item(0).appendChild(fileref)
				loadedobjects+=file+" " //Remember this object as being already added to page
			}
		}
	}
}


/**
 * this is just a rough outline of what we can do with clnFormContext - help for the form fields
 * eventually, we'll make them a little more stylized
 */
function setupFormContext() {
	var allFormContext = $$('.clnFormContext');
	//var allFormContext = new Array();
	if(allFormContext.length > 0) {
		for(var i=0;i<allFormContext.length;i++) {
			//Elements.extend(allFormContext[i].parentNode);
			var formContainer = allFormContext[i].parentNode;
			// must extend the element or this fails in IE
			Element.extend(formContainer);
			if(formContainer) { // && formContainer.hasClassName('clnRow')) {
				var labels = formContainer.getElementsByTagName('label');
				if(labels[0]) {
					textBoxDisplay(labels[0], allFormContext[i]);
				}
			}
		}
	}
}

/**
 * shows one object overtop of the trigger object - much like overlib
 *
 */
function textBoxDisplay(triggerObj,displayObj) {
	Event.observe(triggerObj, 'mouseover', function(e) {
			setPosition(Event.element(e));
			displayObj.style.visibility = 'visible';
			displayObj.style.top = (Event.element(e).y+Event.element(e).h)+'px'; //(posy+offset)+'px';
			displayObj.style.left = (Event.element(e).x+Event.element(e).w)+'px'; //(posx+offset)+'px';
		}
	);
	
	Event.observe(triggerObj, 'mouseout', function(e) {
			displayObj.style.visibility = 'hidden';
		}
	);
}


/**
 * remove value from array, wherever it is in the array
 */
function removeElement(thisArray,thisValue) {	
	if(thisArray.length > 0) {
		newArray = new Array();
		for(i=0;i<thisArray.length;i++) {
			if(thisArray[i] != thisValue) {
				newArray.push(thisArray[i]);
			}
		}
		
		return newArray;
	} else {
		return thisArray;
	}
}


/**
 *
 */
function prepareDeleteMarkupElement() {
	var deleteMarkupElements = $$('.deleteMarkupElement');
	for(i=0;i<deleteMarkupElements.length;i++) {
		deleteMarkupElements[i].setAttribute('title','Remove Field');
		Event.observe(deleteMarkupElements[i],'click',deleteMarkupElement);
	}
}


/**
 *
 */
function deleteMarkupElement(e) {
	var thisElement = Event.element(e).previous();
	var elementId = thisElement.getAttribute('id');
	if(matches = elementId.match(/^(\w+)\[/)) {
		var rootElement = matches[1];
		
		if(!$('delete_'+elementId)) {
			var deleteElement = document.createElement('input');
			deleteElement.setAttribute('type','hidden');
			deleteElement.setAttribute('id','delete_'+elementId);
			deleteElement.setAttribute('name',rootElement+'[#DELETE][]');
			deleteElement.setAttribute('value',elementId);
			
			insertAfter(deleteElement, Event.element(e));
			
			// indicate element is marked for deletion
			var thisLabel = thisElement.up(1).down('label');
			if(thisLabel) {
				thisLabel.style.textDecoration = 'line-through';
			}
		} else {
			$('delete_'+elementId).remove();
			// indicate element is no longer marked for deletion
			var thisLabel = thisElement.up(1).down('label');
			if(thisLabel) {
				thisLabel.style.textDecoration = 'none';
			}
		}
	}
}





/**
 *
 */
function setEditLanguage() {
	var editLang = this.options[this.selectedIndex].value;
	//alert(editLang);
	
	getControlBox('controlBox'+this.koId, this.koId, editLang);
}


/**
 * calls view dynamically and loads it into the window
 */
function getView(viewURL) {
	data = '';
	
	var myAjax = new Ajax.Request(
    viewURL,
    { 
    	method: 'get', 
    	parameters: data, 
    	onComplete: loadView, 
    }
	);
	
	return false;
}


/**
 * loads the view into the page
 */
function loadView(requestObj) {
	//alert(requestObj.responseXML); alert(requestObj.responseText); return;
	
	body = requestObj.responseXML.getElementsByTagName('body');
	
	//create a new XMLSerializer - only in mozilla - for debugging purposes only
	//var objXMLSerializer = new XMLSerializer;
	//var strXML = objXMLSerializer.serializeToString(body[0]);
  //alert(strXML);
  
	divs = body[0].getElementsByTagName('div');
	for(var i=0;i<divs.length;i++) {
		if(matches = divs[i].id.match(/^ko(\d+)/)) {
			if(!divs[i].id) continue;
			var thisId = matches[1];
			alert('working with ko'+thisId);
		}
	}
}





/**
 * displays overlay with progress wheel
 */
function showProgressOverlay(elementToOverlay) {
	if($('TB_load')) return true;

	var baseurl = getBaseURL();
	
	if(elementToOverlay == undefined) {
		var body = $$('body');
		var elementToOverlay = body[0];
		elementToOverlay.x = 0;
		elementToOverlay.y = 0;
		if(window.innerWidth) {
			elementToOverlay.w = window.innerWidth;
			elementToOverlay.h = window.innerHeight;
		} else {
			elementToOverlay.w = document.documentElement.clientWidth;
			elementToOverlay.h = document.documentElement.clientHeight;
		}
	} else {
		setPosition(elementToOverlay);
	}
	
	 //alert(elementToOverlay.x+','+elementToOverlay.y+' - '+elementToOverlay.w+'x'+elementToOverlay.h);
	
	var overlay = document.createElement('div');
		overlay.setAttribute('id','overlay');
		overlay.setAttribute('class','ghosted');
		overlay.style.overlay = 'hidden';
		overlay.style.zIndex = '99';
		overlay.style.left = elementToOverlay.x+'px';
		overlay.style.top = elementToOverlay.y+'px';
		overlay.style.width = elementToOverlay.w+'px';
		overlay.style.height = elementToOverlay.h+'px';
	/*var overlayContent = document.createTextNode('&#160;');
		overlay.appendChild(overlayContent);*/
		
		elementToOverlay.appendChild(overlay);
		//overlay.addClassName('ghosted');
			
		Event.observe(overlay,'click',function() { 
				closeOtherControlBoxes(0);
			}
		);
			
		var TB_load = document.createElement('div');
			TB_load.setAttribute('id','TB_load');
		var TB_loadContent = document.createElement('div');
			TB_loadContent.setAttribute('id','TB_loadContent');
			TB_load.appendChild(TB_loadContent);
			showProgressAnimation(TB_loadContent);
			elementToOverlay.appendChild(TB_load);
}


/**
 *
 */
function showProgressAnimation(progressElement) {
	var baseurl = getBaseURL();
	
	//if(!$('loadingIndicator')) {
		var loadingIndicator = document.createElement('div');
		 loadingIndicator.setAttribute('id','loadingIndicator');
		var circleAnimation = document.createElement('img');
		 circleAnimation.setAttribute('src',baseurl+'lib/Core/C1Object/images/circle_animation.gif');
		 circleAnimation.setAttribute('alt','progress animation');
		 loadingIndicator.appendChild(circleAnimation);
		
		//progressElement.innerHTML = loadingIndicator.cloneNode(true);
		//progressElement.parentNode.appendChild(loadingIndicator);
		
		progressElement.appendChild(loadingIndicator);
	//} else {
	//	$('loadingIndicator').style.display = 'block';
	//}
}


/**
 *
 */
function hideProgressAnimation(progressElement) {
	if($('loadingIndicator')) $('loadingIndicator').remove();
}


/**
 * removes overlay with progress wheel
 */
function hideProgressOverlay() {
	var overlay = $('overlay');
	if(overlay) overlay.parentNode.removeChild(overlay);
	
	var TB_load = $('TB_load');
	if(TB_load) TB_load.parentNode.removeChild(TB_load);
}





/**
 *
 */
function setImageOrientation() {
	var images = $$('img');
	for(var i=0;i<images.length;i++) {
		images[i].addClassName();
	}
}


function setupRecaptcha() {
	if($$('.recaptchaContainer')) {
		var recaptchaContainer = $$('.recaptchaContainer');
		for(var i=0;i<recaptchaContainer.length;i++) {
			var recaptchaContainer = recaptchaContainer[i];
			var recaptchaKey = recaptchaContainer.down('.recaptchaKey').firstChild.nodeValue;
			var recaptchaTheme = recaptchaContainer.down('.recaptchaTheme').firstChild.nodeValue;
			 //console.log(recaptchaKey+' '+recaptchaTheme);
			
			Recaptcha.create(recaptchaKey, recaptchaContainer, {
						theme: recaptchaTheme,
						tabindex: 0,
						callback: Recaptcha.focus_response_field
			});
		}
	}
}


function instantMessage(message) {
	$('instantMessage').innerHTML = message;
	$('instantMessage').style.display = 'block';
}


function loadJQuery() {
	jQuery.noConflict();
}


/* *******************************************************************************************/
// this is where all the functions get setup to fire once the document loads

addLoadEvent(loadJQuery);

//addLoadEvent(setImageOrientation);
addLoadEvent(prepareSetDisplay);
addLoadEvent(setupDrawers);
addLoadEvent(setupFormSections)
addLoadEvent(setupMessageWindows);
addLoadEvent(setupNextLinks);

addLoadEvent(setupFormContext);
addLoadEvent(setupAutoCompleter);
addLoadEvent(setupInPlaceEditors);
addLoadEvent(setupControllers);
addLoadEvent(prepareUpdateVersionNumber);
addLoadEvent(setupVersionSelector);
addLoadEvent(setupFullScreenTextarea);

addLoadEvent(setupRecaptcha);
