function fixEvent(event) {
	if (!event) event = window.event

	if (event.target) {
		if (event.target.nodeType == 3) event.target = event.target.parentNode
	} else if (event.srcElement) {
		event.target = event.srcElement
	}
	return event
}



function addInfoTooltips() {
	var nodes = document.getElementsByTagName('a');
	for(var i = 0;i < nodes.length;i++)	{
		var node = nodes[i];
		if (node.className.indexOf("showInfo")>=0) {
			addEvent(node.firstChild,"mouseover",showInfoStart);
			addEvent(node.firstChild,"mouseout",showInfoEnd);
		};
		
	}
}


function showInfoEnd(event) {
	event = fixEvent(event);
	var div = event.target.parentNode.getElementsByTagName('div')[0];
	div.style['display'] = 'none';
	return true;
}

function getOffset(node) {
	var left = node.offsetLeft;
	var top = node.offsetTop;
	var parent = node.offsetParent;
	while (parent) {
		left += parent.offsetLeft;
		top += parent.offsetTop;
		parent = parent.offsetParent;
	};
	return {x: left, y: top};
}

function showInfoStart(event) {
	event = fixEvent(event);
	
	// get orderDescription div and the event offset
	var div = event.target.parentNode.getElementsByTagName('div')[0];
	var pos = getOffset(event.target);
	var offset = 10;
	
	// now first set the div on display block, else div.offsetWidth will return 0 instead of the div width
	div.style['display'] = 'block';
	var width = div.offsetWidth;
	
	div.style['left'] = (pos.x-width-offset)+"px";
	div.style['top'] = pos.y+offset+"px";
	div.style['position'] = 'absolute';

	return true;
}


function followLink(event) {
	event = fixEvent(event);
	var node = event.target;
	while (node) {
		 if  (node.tagName=='a') {
		 	document.location.href = node.href;
		 	break;
		 };
		 node = node.parentNode;	
	}
}


function getLevel(classNames) {
	var levelPos = classNames.indexOf("level");
	if (levelPos!=-1)	
		return classNames.charAt(levelPos+5) - '0';
	else
		return -1;
}

function doEnableDisable(tmpNode,myLevel,enable) {

	while (tmpNode) {
		if (tmpNode.nodeType==1) {
					
			var tmpLevel = getLevel(tmpNode.className);

			if (tmpLevel<0)
					tmpNode = tmpNode.nextSibling;	
			else
			if (tmpLevel > myLevel) {
				if (!enable) {
					var openPos = tmpNode.className.indexOf(" disabled");
					if (openPos < 0) {
						tmpNode.className = tmpNode.className+" disabled";
					}
					tmpNode = tmpNode.nextSibling;	
				} else {

					if (tmpLevel == (myLevel+1)) {
						tmpNode.className = tmpNode.className.replace(/ disabled/,"");
						var openPos = tmpNode.className.indexOf(" open");
						if (openPos>=0) {
							tmpNode = doEnableDisable(tmpNode.nextSibling,tmpLevel,enable);
						} else { 
							tmpNode = tmpNode.nextSibling;	
						}
					}
					else
						tmpNode = tmpNode.nextSibling;				
				};
			}
			else
			if (tmpLevel<=myLevel) {
				break;
			} else {
				tmpNode = tmpNode.nextSibling;
			}
		}
		else
			tmpNode = tmpNode.nextSibling;
	};
	return tmpNode;
}


function doOpenClose(id) {

	var node = document.getElementById(id);
	var rowNode = node.parentNode.parentNode;
	var isClosed = node.src.indexOf("hier_rootclose.gif")>0;
	if (isClosed) {
		node.src = "images/hier_rootopen.gif";
		rowNode.className = rowNode.className+" open";
	} else {
		node.src = "images/hier_rootclose.gif";
		rowNode.className = rowNode.className.replace(/ open/,"");
	}
	
	doEnableDisable(rowNode.nextSibling,getLevel(rowNode.className),isClosed);
}


function doSelectAll()
{
	
	var node = document.getElementById("headerField");
	var formNode = node.form;
	var nodes = formNode.getElementsByTagName("input");
	for(var i =0;i < nodes.length;i++) {
		if ((nodes[i].getAttribute("type") == "checkbox") && (nodes[i].disabled == false)) {
			nodes[i].checked = node.checked;
		};
	};
}

function updateCheckoutOverviewDeleteButton()
{
	var node = document.getElementById("headerField");
	var formNode = node.form;
	var nodes = formNode.getElementsByTagName("input");
	var disableButton = true;
	for(var i =0;i < nodes.length;i++) {
		if ((nodes[i].getAttribute("type") == "checkbox") && (nodes[i].disabled == false) && (nodes[i].id != 'headerField')) {
			if (nodes[i].checked) {
				disableButton = false;
			}
		};
	};
	if (disableButton) {
		$('#deleteButton').attr('disabled', 'disabled');
	} else {
		$('#deleteButton').attr('disabled', '');
	}
}

function toggleChilds(clickedItem)
{
	var cClickedItem = document.getElementById(clickedItem.id);
	var cClickedItemName = cClickedItem.name;
	var cClickedItemListName = cClickedItemName+"Childs";
	var cClickedItemListID = document.getElementById(cClickedItemListName);
	var cClickedItemListValue =cClickedItemListID.value;
	
	aChilds=explodeArray(cClickedItemListValue,";");

	if (cClickedItem.checked == true) {
		var bChecked = true;
		var bDisabled = false;
	} else {
		var bChecked = false;
		var bDisabled = true;
	}
	
	for(var i = 0;i < aChilds.length;i++) {
		cChildID = aChilds[i]+"Field";
		document.getElementById(cChildID).checked=bChecked;
		document.getElementById(cChildID).disabled=bDisabled;
		
		cItemClassName = document.getElementById(cChildID).className;
		if (cItemClassName.indexOf("defaultCursor")>0) {
			
			nCLassItemLen = cItemClassName.length;
			nDefaultCursorStrLen = 13;
			nNewLength = nCLassItemLen - nDefaultCursorStrLen;
			cNewClass = (cItemClassName.substring(0,nNewLength));
			
			document.getElementById(cChildID).className = cNewClass;
		} else {
			
			document.getElementById(cChildID).className = cItemClassName + " defaultCursor";
		}
		
	}

}


function explodeArray(item,delimiter) {
  tempArray=new Array(1);
  var Count=0;
  var tempString=new String(item);

  while (tempString.indexOf(delimiter)>0) {
    tempArray[Count]=tempString.substr(0,tempString.indexOf(delimiter));
    tempString=tempString.substr(tempString.indexOf(delimiter)+1,tempString.length-tempString.indexOf(delimiter)+1); 
    Count=Count+1
  }

  tempArray[Count]=tempString;
  return tempArray;
}

/**
 * Enable or Disable FormFields
 * 
 * @param object cForm
 * @param string cField
 * @param boolean bEnable
 */
function enableDisableFormFields(cForm,cField,bEnable){
	
	// This function retrieves the formfields id's as a semicolon separated string and 
	// split the data into separate strings.
	// This function will enable or disable the specified fields, as specified by bEnable.	
	
	var aFields=cField.split(";");
	if (document.getElementById('formFieldsID')) {
		var cFormFields=document.forms[cForm].elements['formFields'].value;
		var aFormFields=cFormFields.split(";");
		var bFormFields = true;
	}
	
	
	if(bEnable) {
		var bDisabled = false;
	} else {
		var bDisabled = true;
	}
	
	for(var i=0;i<aFields.length;i++) {
		var cFieldId = aFields[i]+"Field";
		
		if ((document.forms[cForm].elements[cFieldId].length) && (document.forms[cForm].elements[cFieldId].type != "select-one") ) {
			
			if (document.forms[cForm].elements[cFieldId].type == "select-multiple") {
				var cFieldNewName = aFields[i] + "[]";
				document.forms[cForm].elements[cFieldNewName].disabled=bDisabled;
			} else {
				// Different element handeling for radio boxes
				for(var j = 0;j < document.forms[cForm].elements[cFieldId].length;j++) {
					document.forms[cForm].elements[cFieldId][j].disabled=bDisabled;
				}
			}
			
		} else {
			document.forms[cForm].elements[cFieldId].disabled=bDisabled;			
		}
	}
	
	if (bFormFields) {
		cNewFormFields = aFormFields.join(';');	
		document.forms[cForm].elements['formFields'].value = cNewFormFields;
	}
}


function addDefaultFunctions()
{
    ajaxFixFormButtons();
    addInfoTooltips();
    addOnClickRestoreDefaultsButtons();
    setInitialFocus();
    //window.onerror = function(){ return true;}
}



function removeEvent(obj, evType, fn) {
 if (obj.removeEventListener){
   obj.removeEventListener(evType, fn, false);
   return true;
 } else if (obj.detachEvent){
   var r = obj.detachEvent("on"+evType, fn);
   return r;
 } else {
   return false;
 }
	
}

function addEvent(obj, evType, fn){
 if (obj.addEventListener){
   obj.addEventListener(evType, fn, false);
   return true;
 } else if (obj.attachEvent){
   var r = obj.attachEvent("on"+evType, fn);
   return r;
 } else {
   return false;
 }
}

addEvent(window, 'load', addDefaultFunctions);

function MoveOptionToSelect(oSourceSelect, oDestinationSelect) {
	//add option to destination select
	nSourceLength = oSourceSelect.length ;
    for (i = 0; i < nSourceLength; i++){
        if (oSourceSelect.options[i].selected == true ) {
            oDestinationSelect.options[oDestinationSelect.length] = new Option(oSourceSelect.options[i].text, oSourceSelect.options[i].value);
        }
    }

    //remove option from source select
    for (i = (nSourceLength -1); i >= 0; i--){
        if (oSourceSelect.options[i].selected == true ) {
            oSourceSelect.options[i] = null;
        }
    }
}

function OptionSelectAll(oSourceSelect)
{
	for (i=0; i < oSourceSelect.length; i++) {  
	  oSourceSelect.options[i].selected = true;
	}
	return true;
}


function addOnClickRestoreDefaultsButtons()
{
	for (i = 0; i < document.forms.length; i++) {
		oForm = document.forms[i];
		for (j = 0; j < oForm.elements.length; j++) {
			oElement = oForm.elements[j];			
			if (oElement.type == "submit" && (oElement.id == "RestoreDefaultsButton")) {
				oElement.setAttribute("onclick", "setOnClickRestoreDefaultsButton();"); //FireFox
				oElement.onclick = setOnClickRestoreDefaultsButton; //Internet Explorer
			}
		}
	}
}

/**
 * Sets the focus to the first input field in the content block of the site
 */
function setInitialFocus() {

	$("#content :input:text:visible:first").focus();
	
}

/**
 *This funtion is used to append the color selected in the colorpicker to the webdesign edit page
 *
 * @param string cTargetFormID
 */
function appendColor(cTargetFormID){
	var cColor = $('#fcColorField').val();
	$('#' + cTargetFormID + 'Field').val(cColor);
	$('#' + cTargetFormID + 'ColorSample').css("background-color","#" + cColor);
}

/**
 * Show and/or Hide FormLines
 * 
 * @param object json (cForm, aShowFields, aHideFields)
 */
function toggleFormLines(json){

	// This function retrieves the formfields id's as a semicolon separated string and 
	// split the data into separate strings.
	// This function will enable or disable the specified fields, as specified by bEnable.	
	
	var aShowFields = json.aShowFields;
	var aHideFields = json.aHideFields;
	
	if ($('#' + json.cForm + ' > div > #formFieldsID')) {		
		var cFormFields = $('#' + json.cForm + ' > div > #formFieldsID').val();
		var aFormFields = cFormFields.split(";");
		var bFormFields = true;
	}
	
	if(aShowFields) {
		for(var i=0;i<aShowFields.length;i++) {
			var cFieldLine = aShowFields[i]
			if(cFieldLine.substring(cFieldLine.length - 4) == "Line") {
				var cField = cFieldLine.substring(0, cFieldLine.length - 4);
			} else if(cFieldLine.substring(cFieldLine.length - 5) == "Field") {
				var cField = cFieldLine.substring(cFieldLine.length - 5);
			}		
			var cFieldId = cField + "Field";
			
			$('#' + cFieldId).removeAttr('disabled');
			showFormElement(cFieldLine);
		}
	}
	
	if(aHideFields) {
		for(var i=0;i<aHideFields.length;i++) {
			var cFieldLine = aHideFields[i]
			if(cFieldLine.substring(cFieldLine.length - 4) == "Line") {
				var cField = cFieldLine.substring(0, cFieldLine.length - 4);
			} else if(cFieldLine.substring(cFieldLine.length - 5) == "Field") {
				var cField = cFieldLine.substring(cFieldLine.length - 5);
			}
			var cFieldId = cField + "Field";
			
			$('#' + cFieldId).attr('disabled','disabled');
			$('#' + cFieldLine).hide();	
		}
	}
	
	if (bFormFields) {
		var cNewFormFields = aFormFields.join(';');
		$('#' + json.cForm + ' > div > #formFieldsID').val(cNewFormFields);
	}
}



/**
 * Show and/or Hide Form Elements
 * 
 * @param object json (form, fields, show)
 */
function toggleFormElements(json){
	
	for(var i=0;i<json.fields.length;i++) {
		var element = json.fields[i]
		if(json.show === true){
			showFormElement(element);
		} else {
			$('#' + element).hide();
		}
	}
}

/**
 * Hide all warnings
 */
function clearWarnings(){
	$(".warnings").hide();
}

/**
 * Show Form Element
 */
function showFormElement(elementId){
	if ($.browser.mozilla || $.browser.safari) {
		$('#' + elementId).css({'display': 'table'});
	} else {
		$('#' + elementId).show();
	}
}


/**
 * Sort column headers of overview tables
 * 
 */
function getTable(link,tableName)
{
	var parent = $(link).parents('div.content'); 
	
	var headerId = $(link).parents('td').attr('id'); 
	var headerIdParts = headerId.split('_');
	var orderBy = headerIdParts[0];
	
	var order;
	if($(link).hasClass("ASC")){
		order = "DESC";
	} else if($(link).hasClass("DESC")){
		order = "ASC";
	} else {
		order = "ASC";
	}
	
	$.ajax({
		type: 'GET',
		url: '/functions/ajax/' + tableName,
		cache: false,
		data: 'orderby=' + orderBy + '&order=' + order,
		success: function(html){
			parent.html(html);
		}
	
	});
	
	
}

