var helpLoaded = false;


function disableActionButtons() {
	var objActionButtons = document.getElementsByTagName("img");
	for(var objActionButtonsIterator = 0; objActionButtonsIterator < objActionButtons.length; objActionButtonsIterator++) {
		if (objActionButtons[objActionButtonsIterator].getAttribute("group") == "actionbutton" && objActionButtons[objActionButtonsIterator].getAttribute("state") != "clicked") {
			objActionButtons[objActionButtonsIterator].className='actionbutton_disabled';
			objActionButtons[objActionButtonsIterator].onmouseover = null;
			objActionButtons[objActionButtonsIterator].onmouseout = null;
			objActionButtons[objActionButtonsIterator].onclick = null;
		}
	}
}

function actionButtonMouseOver(objActionButton) {
	objActionButton.className = 'actionbutton_over';
}

function actionButtonMouseOut(objActionButton) {
	objActionButton.className = 'actionbutton_ready';
}

function actionButtonClick(objActionButton) {
	objActionButton.onmouseover = null;
	objActionButton.onmouseout = null;
	objActionButton.onclick = null;
	objActionButton.setAttribute("state", "clicked");
	objActionButton.className = 'actionbutton_clicked';
}


function toggleClassDisplay(bShow, sClass) {

	// Loop through the children
	var objTableRows = document.getElementsByTagName("tr");
	for(var objTableRowsIterator = 0; objTableRowsIterator < objTableRows.length; objTableRowsIterator++) {
		var thisRowCharacterClass = objTableRows[objTableRowsIterator].getAttribute("charClass");
		if (thisRowCharacterClass == sClass || (sClass == 'All' && thisRowCharacterClass)) {
			if (bShow) {
				objTableRows[objTableRowsIterator].style.display = '';
			} else {
				objTableRows[objTableRowsIterator].style.display = 'none';
			}
		}
	}
	
	// If we're togging all then set the specific checkboxes
	if (sClass == 'All') {
		var objInputElements = document.getElementsByTagName("input");
		for(var objInputElementsIterator = 0; objInputElementsIterator < objInputElements.length; objInputElementsIterator++) {
			if (objInputElements[objInputElementsIterator].getAttribute("group") == "classfilter") {
				objInputElements[objInputElementsIterator].checked = bShow;
			}
		}
	}
	
	// Make sure the relevant rows still alternate background highlighting
	var iCharacterRow = 0;
	for(var objTableRowsIterator = 0; objTableRowsIterator < objTableRows.length; objTableRowsIterator++) {
		if (objTableRows[objTableRowsIterator].getAttribute("charClass") && objTableRows[objTableRowsIterator].style.display != 'none') {
			if (iCharacterRow % 2 == 0) {
				objTableRows[objTableRowsIterator].className = 'd1';
			} else {
				objTableRows[objTableRowsIterator].className = 'd0';
			}
			iCharacterRow++;
		}
	}
}


function actionSelectedObjects(formObject, formTarget, confirmationMessage) {

	// Make sure at least one object has been selected
	if (numberOfCheckboxesSelectedExcluding(formObject, 'selectalltoggle') == 0) {
		alert("Nothing selected");
	} else {
		if (confirmationMessage == "" || confirm(confirmationMessage)) {
			formObject.action = formTarget;
			formObject.submit();
		}
	}
}


function actionNoSelectedObjects(formObject, formTarget, confirmationMessage) {

	// Make sure no objects have been selected
	if (numberOfCheckboxesSelectedExcluding(formObject, 'selectalltoggle') > 0) {
		alert("Please do not select anything for this command");
	} else {
		if (confirmationMessage == "" || confirm(confirmationMessage)) {
			formObject.action = formTarget;
			formObject.submit();
		}
	}
}


function tabActivate(tabToActivate, tabsToDeactivate) {
	
	// Loop through the tabs to deactivate
	for (var tabI = 0; tabI < tabsToDeactivate.length; tabI++) {
		document.getElementById("tab_" + tabsToDeactivate[tabI]).style.display = 'none';
	}
	
	// Activate the chosen tab
	document.getElementById("tab_" + tabToActivate).style.display = 'block';
	
	return false;	
}

function sortBy(sortCriteria) {
	location.href = "?" + injectPairToQueryString("sort", sortCriteria);
	return false;
}


function orderBy(orderCriteria) {
	location.href = "?" + injectPairToQueryString("orderby", orderCriteria);
	return false;
}


function changeDKPPool(newPoolId) {
	location.href = "?" + injectPairToQueryString("dkppool", newPoolId);
}


function changeLootDKPTable(newLootTableId) {
	location.href = "?" + injectPairToQueryString("loottableid", newLootTableId);
}


function changeBossKillDKPTable(newBossKillTableId) {
	location.href = "?" + injectPairToQueryString("bosskilltableid", newBossKillTableId);
}


function changeGuildsToReport(newReportKey) {
	location.href = "?" + injectPairToQueryString("guildstoreport", newReportKey);
}


function injectPairToQueryString(qKey, qValue) {
	
	// Split any existing key value pairs out of the query string
	var queryString = window.location.search.substring(1);
	var queryPairs = queryString.split("&");
	
	// Now rebuild the query string (excluding the one we're adding if it already exists)
	var newQueryString = "";
	for(var qIterator = 0; qIterator < queryPairs.length; qIterator++) {
		// Split out the pair
		var queryPair = queryPairs[qIterator].split("=");
		// If the key is not the one we're adding then pass it through
		if (queryPair[0] != "" && queryPair[0] != qKey) {
			newQueryString += queryPairs[qIterator] + "&";
		}
	}
	
	// Now add the injected pair
	newQueryString += qKey + "=" + qValue;
	
	return newQueryString;
}


function performSelectedAction(actionSelectObject) {
	var selectedAction = actionSelectObject[actionSelectObject.selectedIndex].value;
	
	if (selectedAction != "") {

		// Split out any confirmation message
		var actionData = selectedAction.split(">~~");
		
		if (actionData[0].indexOf("javascript:") > -1) {
			jScriptCall = actionData[0].substring(11, actionData[0].length);
			eval(jScriptCall);
			actionSelectObject.selectedIndex = 0;
		} else {
		
			if (actionData.length > 1) {
				if (confirm(actionData[1])) {
					actionSelectObject.disabled = "true";
					disableElementsTypeCalled("select", "actionselector");
					location.href = actionData[0];
				} else {
					actionSelectObject.selectedIndex = 0;
				}
			} else {
				actionSelectObject.disabled = "true";
				disableElementsTypeCalled("select", "actionselector");
				location.href = actionData[0];
			}
		}
	}
}


function goFilterPage(url) {
	
	if (document.forms["datafilter"]) {
		document.forms["datafilter"].action = url;
		document.forms["datafilter"].submit();
	} else {
		location.href = url;
	}
	
}


function positionObjectScreenCenter(objectToPosition, yOffset) {
	
	objh = parseFloat(objectToPosition.style.height)/2;
	objw = parseFloat(objectToPosition.style.width)/2;
	
	var documentScrollOffsetX = document.documentElement.scrollLeft | document.body.scrollLeft;
	var documentScrollOffsetY = document.documentElement.scrollTop | document.body.scrollTop;
	
	objectToPosition.style.top =  Math.floor(Math.round((document.documentElement.clientHeight/2)+documentScrollOffsetY)-objh)+ yOffset + 'px';
	objectToPosition.style.left = Math.floor(Math.round((document.documentElement.clientWidth/2)+documentScrollOffsetX)-objw)+'px';
}


function putInCenter(divIdToCenter) { 
	var d = document; 
	var rootElm = (d.documentElement && d.compatMode == 'CSS1Compat') ? d.documentElement : d.body; 
	var vpw = self.innerWidth ? self.innerWidth : rootElm.clientWidth; // viewport width 
	var vph = self.innerHeight ? self.innerHeight : rootElm.clientHeight; // viewport height 
	var mydiv = d.getElementById(divIdToCenter); 
	
	// Get the scrolled position
	var scrollPos = getScrollingPosition();
	
	// Get the size of the object being positioned
	var objectSize = getObjectSize(mydiv);

	// Position the object	
	mydiv.style.position = 'absolute'; 
	mydiv.style.left = ((vpw - objectSize[0]) / 2) + 'px';
	mydiv.style.top = (scrollPos[1] + (vph - objectSize[1])/2 ) + 'px'; 
}


function getObjectSize(objectToSize) {
	var size = [0, 0];
	
	size[0] = parseFloat(getStyle(objectToSize, "width"));
	size[1] = parseFloat(getStyle(objectToSize, "height"));
	
	return size;
}


function getScrollingPosition() 
{ 
 var position = [0, 0]; 

 if (typeof window.pageYOffset != 'undefined') 
 { 
   position = [ 
       window.pageXOffset, 
       window.pageYOffset 
   ]; 
 } 

 else if (typeof document.documentElement.scrollTop 
     != 'undefined' && document.documentElement.scrollTop > 0) 
 { 
   position = [ 
       document.documentElement.scrollLeft, 
       document.documentElement.scrollTop 
   ]; 
 } 

 else if (typeof document.body.scrollTop != 'undefined') 
 { 
   position = [ 
       document.body.scrollLeft, 
       document.body.scrollTop 
   ]; 
 } 

 return position; 
}


function getStyle(oElm, strCssRule){
	var strValue = "";
	if(document.defaultView && document.defaultView.getComputedStyle){
		strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
	}
	else if(oElm.currentStyle){
		strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
			return p1.toUpperCase();
		});
		strValue = oElm.currentStyle[strCssRule];
	}
	return strValue;
}


function toggleFilterDisplay() {
	var el = document.getElementById("datafilters");
	if (! el.style.display || el.style.display == "none" || el.style.display == "") {
		if (browserIsIE()) {
			el.style.display = "block";
		} else {
			el.style.display = "table-row";
		}
	} else {
		el.style.display = "none";
	}
}

function hideAllSelectObjects() {
	objElems = document.all;
  for(i=0;i<objElems.length;i++){
  	if (objElems[i].type == 'select-one') {
    	objElems[i].style.visibility = 'hidden';
    }
  }
}


function showAllSelectObjects() {
	objElems = document.all;
  for(i=0;i<objElems.length;i++){
  	if (objElems[i].type == 'select-one') {
    	objElems[i].style.visibility = 'visible';
    }
  }
}


function browserIsIE() {
	var browser=navigator.appName;
	if (browser=="Microsoft Internet Explorer"){
		return true;
	} else {
		return false;
	}
}


function browserIsIE6() {
	if (browserIsIE() && vIE() == 6) {
		return true;
	} else {
		return false;
	}
}

function vIE(){
	return (navigator.appName=='Microsoft Internet Explorer')?parseFloat((new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})")).exec(navigator.userAgent)[1]):-1;
}



function browserIsOpera() {
	var browser=navigator.appName;
	if (browser=="Opera"){
		return true;
	} else {
		return false;
	}
}


function DisplaySpecificFieldTip(tipObjectName) {
	
	var tipObject = document.getElementById(tipObjectName);
	tipObject.style.visibility = "visible";
}


function HideSpecificFieldTip(tipObjectName) {
	
	var tipObject = document.getElementById(tipObjectName);
	tipObject.style.visibility = "hidden";
}


function DisplayFieldTip(inputObject) {
	
	// Get the tip object (it must always be the next object in the DOM)
	var tipObject = GetTipObjectFromInputObject(inputObject);
	tipObject.style.visibility = "visible";
}


function HideFieldTip(inputObject) {
	
	// Get the tip object (it must always be the next object in the DOM)
	var tipObject = GetTipObjectFromInputObject(inputObject);
	tipObject.style.visibility = "hidden";
}


function GetTipObjectFromInputObject(inputObject) {
	
	// Get the tip object (it must always be the name of the input object suffixed by "_tip")
	var tipObject = document.getElementById(inputObject.name + "_tip");
	return tipObject;
}


function updateOffspecDkpCost(offspecCheckboxElement, dkpCostElement, onSpecItemCost, offSpecItemCost) {
	
	var newDkpCost = onSpecItemCost;
	
	if (offspecCheckboxElement.checked == true) {
		newDkpCost = offSpecItemCost;
	}
	
	dkpCostElement.value = newDkpCost;
}



function toggleHelpWindow(pageUrl) {
	
	if (document.getElementById("helpwindow").style.display == "inline") {
		document.getElementById("helpwindow").style.display = "none";
	} else {

		if (helpLoaded == false) {
			getHelpData(pageUrl);
			helpLoaded = true;
		}

		document.getElementById("helpwindow").style.display = "inline";		
	}
}


function doUriAction(uri) {
	location.replace(uri);
	return false;
}


function populateInstanceDropDown(selectObject, hashSource, noOfDefinedSpots) {
	
	// Empty it first
	for(x = selectObject.length; x >= 0; x--)
	{
		selectObject[x] = null;
	}
	
	// Now populate it
	for (var hashKey in hashSource)
	{
		if (hashKey != "ln" && hashKey != "length" && hashSource[hashKey] >= noOfDefinedSpots) {
			selectObject[selectObject.length] = new Option(hashKey, hashKey);
		}
	}
	
	// If there are none then report and disable
	if (selectObject.length == 0) {
		selectObject[selectObject.length] = new Option("None available, check your scope", "");
		selectObject.disabled = true;
	}

	return selectObject;
}


function findTruePosition(startObject) {
	
	var xpos = 0;
	var ypos = 0;
	
	xpos = xpos + startObject.offsetLeft;
	ypos = ypos + startObject.offsetTop;

	
	while (startObject.offsetParent) {
		startObject = startObject.offsetParent;
		xpos = xpos + startObject.offsetLeft;
		ypos = ypos + startObject.offsetTop;
	}
	
	return [xpos, ypos];
}


function copyTemplate(templateId, parentObject) {
	
	var coors = findTruePosition(parentObject);
	document.forms["copytemplate"].raidtemplateid.value = templateId;
	showPopUpForm("copytemplate", coors[1], coors[0]);
	
	return false;	
}


function bindSelectedToDungeon(parentObject) {
	
	var coors = findTruePosition(parentObject);
	showPopUpForm("binddungeon", coors[1], coors[0]);
	
	return false;	
}


function bindSelectedToBoss(parentObject) {
	
	var coors = findTruePosition(parentObject);
	showPopUpForm("bindboss", coors[1], coors[0]);
	
	return false;	
}


function showPopUpForm(formName, topPos, leftPos) {
	document.getElementById("popup-" + formName).style.top = (topPos + 5) + 'px';
	document.getElementById("popup-" + formName).style.left = (leftPos - 10) + 'px';
	document.getElementById("popup-" + formName).style.visibility = "visible";
}


function hidePopUpForm(formName) {

	document.getElementById("popup-" + formName).style.visibility = "hidden";
}


function renderPopUpForm(formName, fieldName, formTarget, submitLabel, hiddenHtml) {

	document.write ("<div id='popup-" + formName + "' class='popupform'><form name='" + formName + "' method='post' action='" + formTarget + "'>" + hiddenHtml + "<div><input type='text' name='" + fieldName + "' /></div><div align='right'><input type='button' value='Cancel' onclick='hidePopUpForm(\"" + formName + "\");' /><input type='submit' value='" + submitLabel + "' /></div></form></div>");

}


function renderAjaxPopUpForm(formName, fieldName, formTarget, submitLabel, hiddenHtml, iconObjectId) {

	document.write ("<div id='popup-" + formName + "' class='popupajaxform'><form name='" + formName + "' method='post' action='' onsubmit='javascript:return validateMiniFormData(\"" + fieldName + "\", \"" + formTarget + "\", this, document.getElementById(\"" + iconObjectId + "\"));'>" + hiddenHtml + "<div><textarea name='" + fieldName + "' id='" + fieldName + "'></textarea></div><div align='right'><input type='button' value='Cancel' onclick='hidePopUpForm(\"" + formName + "\");' /><input type='submit' value='" + submitLabel + "' /></div></form></div>");

}

function validateMiniFormData(fieldName, formTargetURL, formObject, iconObject) {
	
	var fieldToValidate;
	for(var formI=0; formI < formObject.elements.length; formI++) {
		if (formObject.elements[formI].name == fieldName) {
			fieldToValidate = formObject.elements[formI];
		}
	}
	
	if (! noValue(fieldToValidate)) {
		sendMiniFormData(formTargetURL, formObject, iconObject);
		hidePopUpForm(formObject.name);
	}

	return false;
}


function Left(str, n)
{
	if (n <= 0) {
		return "";
	} else if (n > String(str).length) {
		return str;
	} else {
		return String(str).substring(0,n);
	}
}


function sendMiniFeedback(userEvent) {

	var coors = findPos(userEvent);
	// Move it left by the width so it doesn't go off the screen
	coors[0] = coors[0] - 300;
	showPopUpForm("sendfeedback", coors[1], coors[0]);
	
	return false;	
}


function sendMiniBugReport(userEvent) {

	var coors = findPos(userEvent);
	// Move it left by the width so it doesn't go off the screen
	coors[0] = coors[0] - 300;
	showPopUpForm("sendbugreport", coors[1], coors[0]);
	
	return false;	
}


function showTooltip(tooltipId, userEvent) {
	
	var coors = findPos(userEvent);
	document.getElementById(tooltipId).innerHTML = document.getElementById(tooltipId).innerHTML;
	document.getElementById(tooltipId).style.top = coors[1] + 'px';
	document.getElementById(tooltipId).style.left = coors[0] + 10 + 'px';
	document.getElementById(tooltipId).style.visibility = 'visible';
	document.getElementById(tooltipId).style.display = 'block';
}


function hideTooltip(tooltipId) {
	document.getElementById(tooltipId).style.visibility = 'hidden';
	document.getElementById(tooltipId).style.display = 'none';
}


// Editing functions
function editPresetBonus(presetBonusId, reason, source, amount, trigger, dkpPoolId, active) {
	setInputFormModeLabel();
	document.forms["presetDKPBonusData"].inputmode.value = "edit";
	document.forms["presetDKPBonusData"].presetbonusid.value = presetBonusId;
	document.forms["presetDKPBonusData"].active.checked = active;
	document.forms["presetDKPBonusData"].reason.value = reason;
	setSelectedDropDown(document.forms["presetDKPBonusData"].source, source);
	document.forms["presetDKPBonusData"].amount.value = amount;
	setSelectedDropDown(document.forms["presetDKPBonusData"].trigger, trigger);
	setSelectedDropDown(document.forms["presetDKPBonusData"].dkppool, dkpPoolId);

	setInputFormSubmitButtonLabel(document.forms["presetDKPBonusData"], "Apply");
	
	location.href = "#datainputform";
}


function editDkpPool(poolId, poolName) {
	setInputFormModeLabel();
	document.forms["dkpPoolData"].inputmode.value = "edit";
	document.forms["dkpPoolData"].poolid.value = poolId;
	document.forms["dkpPoolData"].poolname.value = poolName;

	setInputFormSubmitButtonLabel(document.forms["dkpPoolData"], "Apply");
	DisableEnableForm(document.forms["dkpPoolData"], false);
	
	location.href = "#datainputform";
}


function editSubscriptionRun(eventId, runId, startDate, startTime, finishDate, finishTime, instanceId, meetingLocation, raidTemplateId, description, openGuilds)
{
	setInputFormModeLabel();
	document.forms["subscriptionRunData"].inputmode.value = "edit";
	document.forms["subscriptionRunData"].eventid.value = eventId;
	document.forms["subscriptionRunData"].runid.value = runId;
	document.forms["subscriptionRunData"].startdate.value = startDate;
	document.forms["subscriptionRunData"].finishdate.value = finishDate;
	document.forms["subscriptionRunData"].starttime.value = startTime;
	document.forms["subscriptionRunData"].finishtime.value = finishTime;
	document.forms["subscriptionRunData"].meetinglocation.value = meetingLocation;
	document.forms["subscriptionRunData"].description.value = description;
	setSelectedMultiSelect(document.forms["subscriptionRunData"].opentoguilds, openGuilds);
	setSelectedDropDown(document.forms["subscriptionRunData"].instance, instanceId);
	filterRaidTemplates(document.forms["subscriptionRunData"].raidid, document.forms["subscriptionRunData"].instance);
	setSelectedDropDown(document.forms["subscriptionRunData"].raidid, raidTemplateId);
	

	setInputFormSubmitButtonLabel(document.forms["subscriptionRunData"], "Apply");
}


function editRequirement(requirementId, requirementName)
{
	setInputFormModeLabel();
	document.forms["instanceRequirementsData"].inputmode.value = "edit";
	document.forms["instanceRequirementsData"].requirementid.value = requirementId;
	document.forms["instanceRequirementsData"].name.value = requirementName;
	
	setInputFormSubmitButtonLabel(document.forms["instanceRequirementsData"], "Apply");
}


function editCompletedRun(completedRunId, teamId, runName, instanceId, poolId, rrtOnly) {
	
	// Make sure the scope is set correctly
	if (! isOptionAvailable(document.forms["completedRunData"].instance, instanceId)) {
		alert("You don't have that instance in your scope, correct your scope on the Account > Configure > Preferences page.");
		return false;
	}

	setInputFormModeLabel();
	document.forms["completedRunData"].action = "/raiding/reports/updatecompletedrun.asp";
	applyOrAddWithLogAction = "/raiding/completeagain.asp";
	document.forms["completedRunData"].inputmode.value = "edit";
	document.forms["completedRunData"].runid.value = completedRunId;
	document.forms["completedRunData"].team.value = teamId;
	document.forms["completedRunData"].name.value = runName;
	setSelectedDropDown(document.forms["completedRunData"].instance, instanceId);
	setSelectedDropDown(document.forms["completedRunData"].dkppool, poolId);
	//document.forms["completedRunData"].dkppool.disabled = true;
	document.forms["completedRunData"].regularraidteamonly.checked = rrtOnly;

	document.forms["completedRunData"].editbutton.style.visibility = 'visible';
	document.forms["completedRunData"].realtimebutton.style.display = 'none';
	setInputFormButtonLabel("addfromlogbutton", "Edit Data with String or Log")
	setInputFormSubmitButtonLabel(document.forms["completedRunData"], "Apply");
	
	location.href = "#datainputform";
}


function editInstance(instanceId, instanceName, difficulty, maxPlayers, resetFrequency, resetDay, resetTime, baselineDate, icon, progressionOrder, officialInstanceId, officialInstanceKey, sScope)
{
	setInputFormModeLabel();
	document.forms["instanceData"].inputmode.value = "edit";
	document.forms["instanceData"].instanceid.value = instanceId;
	document.forms["instanceData"].name.value = instanceName;
	document.forms["instanceData"].difficulty.value = difficulty;
	setSelectedDropDown(document.forms["instanceData"].maxplayers, maxPlayers);
	setSelectedDropDown(document.forms["instanceData"].resetfrequency, resetFrequency);
	setSelectedDropDown(document.forms["instanceData"].resetday, resetDay);
	setSelectedDropDown(document.forms["instanceData"].resettime, resetTime);
	document.forms["instanceData"].baselinedate.value = baselineDate;
	document.forms["instanceData"].icon.value = icon;
	document.forms["instanceData"].progressionorder.value = progressionOrder;
	document.forms["instanceData"].officialid.value = officialInstanceId;
	document.forms["instanceData"].officialinstancekey.value = officialInstanceKey;
	document.forms["instanceData"].scope.value = sScope;

	setInputFormSubmitButtonLabel(document.forms["instanceData"], "Apply");
}


function editBuildTemplate(buildTemplateId, buildTemplateName, buildTemplateClass, treeOnePoints, treeTwoPoints, treeThreePoints, buildTemplateTalents)
{
	setInputFormModeLabel();
	document.forms["buildTemplateData"].inputmode.value = "edit";
	document.forms["buildTemplateData"].buildtemplateid.value = buildTemplateId;
	document.forms["buildTemplateData"].name.value = buildTemplateName;
	setSelectedDropDown(document.forms["buildTemplateData"].characterclass, buildTemplateClass);
	document.forms["buildTemplateData"].treepointsone.value = treeOnePoints;
	document.forms["buildTemplateData"].treepointstwo.value = treeTwoPoints;
	document.forms["buildTemplateData"].treepointsthree.value = treeThreePoints;

	setInputFormSubmitButtonLabel(document.forms["buildTemplateData"], "Apply");
	
	updateTreePointsLabels(document.buildTemplateData.characterclass[document.buildTemplateData.characterclass.selectedIndex].value);
	updateTalentList(document.buildTemplateData.talents, document.buildTemplateData.talent, document.buildTemplateData.characterclass[document.buildTemplateData.characterclass.selectedIndex].value);
	setSelectedMultiSelect(document.forms["buildTemplateData"].talents, buildTemplateTalents);
	
	location.href = "#datainputform";
}


function editRaidTemplate(raidTemplateId, raidTemplateName, onlyMains, noOfDefinedSpots)
{
	
	setInputFormModeLabel();
	document.forms["raidData"].inputmode.value = "edit";
	document.forms["raidData"].raidtemplateid.value = raidTemplateId;
	document.forms["raidData"].name.value = raidTemplateName;
	document.forms["raidData"].onlymains.checked = onlyMains;
	
	setInputFormSubmitButtonLabel(document.forms["raidData"], "Apply");
	
	location.href = "#datainputform";
}


function editEvent(eventId, eventName, regularRaidTeamOnly, isOfficial, openGuilds, subscriptionBased)
{
	setInputFormModeLabel();
	document.forms["eventData"].inputmode.value = "edit";
	document.forms["eventData"].eventid.value = eventId;
	document.forms["eventData"].name.value = eventName;
	document.forms["eventData"].regularraidteamonly.checked = regularRaidTeamOnly;
	document.forms["eventData"].isofficial.checked = isOfficial;
	setSelectedMultiSelect(document.forms["eventData"].opentoguilds, openGuilds);
	document.forms["eventData"].subscriptionbased.checked = subscriptionBased;

	setInputFormSubmitButtonLabel(document.forms["eventData"], "Apply");
	
	location.href = "#datainputform";
}


function editRaidSpot(spotId, description, minimumLevel, classBuilds, required) {
	setInputFormModeLabel();
	document.forms["raidSpotData"].inputmode.value = "edit";
	document.forms["raidSpotData"].spotid.value = spotId;
	document.forms["raidSpotData"].description.value = description;
	setSelectedDropDown(document.forms["raidSpotData"].minimumlevel, minimumLevel);
	
	var classBuildsObject = document.getElementById("classbuilds");
	classBuildsObject.innerHTML = "";
	selectedBuilds = new Array();
	for (var cbIterator = 0; cbIterator < classBuilds.length; cbIterator++) {
		rawTemplateData = classBuilds[cbIterator].split("~:~");
		thisCharacterClass = rawTemplateData[0];
		thisBuildTemplateId = rawTemplateData[1];
		thisBuildTemplateName = rawTemplateData[2];
		addBuildToPool(classBuildsObject, thisBuildTemplateId, createBuildIconHTML(thisBuildTemplateId, thisCharacterClass, thisBuildTemplateName));
		selectedBuilds[thisBuildTemplateId] = true;
	}
	populateAvailableBuildsDropDown(document.getElementById("availableclassbuilds"), document.raidSpotData.characterclass[document.raidSpotData.characterclass.selectedIndex].value);
	
	
	document.forms["raidSpotData"].required.checked = required;
	

	setInputFormSubmitButtonLabel(document.forms["raidSpotData"], "Apply");
	
	location.href = "#datainputform";
}


function editSpotTemplate(spotTemplateId, description, minimumLevel, classBuilds, required)
{
	setInputFormModeLabel();
	document.forms["spotTemplateData"].inputmode.value = "edit";
	document.forms["spotTemplateData"].spottemplateid.value = spotTemplateId;
	document.forms["spotTemplateData"].description.value = description;
	setSelectedDropDown(document.forms["spotTemplateData"].minimumlevel, minimumLevel);
	setSelectedMultiSelect(document.forms["spotTemplateData"].classbuilds, classBuilds);
	document.forms["spotTemplateData"].required.checked = required;
	

	setInputFormSubmitButtonLabel(document.forms["spotTemplateData"], "Apply");
}


function editEventRun(runId, startDate, startTime, finishDate, finishTime, raidTemplateId, description, instanceId, meetingLocation, coreDetailsEditable)
{
	// Make sure the scope is set correctly
	if (! isOptionAvailable(document.forms["eventRunData"].instance, instanceId)) {
		alert("You don't have that instance in your scope, correct your scope on the Account > Configure > Preferences page.");
		return false;
	}
	
	setInputFormModeLabel();
	document.forms["eventRunData"].inputmode.value = "edit";
	document.forms["eventRunData"].runid.value = runId;
	document.forms["eventRunData"].startdate.value = startDate;
	document.forms["eventRunData"].finishdate.value = finishDate;
	document.forms["eventRunData"].starttime.value = startTime;
	document.forms["eventRunData"].finishtime.value = finishTime;
	document.forms["eventRunData"].description.value = description;
	setSelectedDropDown(document.forms["eventRunData"].instance, instanceId);
	filterRaidTemplates(document.forms["eventRunData"].raidid, document.forms["eventRunData"].instance);
	setSelectedDropDown(document.forms["eventRunData"].raidid, raidTemplateId);
	document.forms["eventRunData"].meetinglocation.value = meetingLocation;
	
	// If the core details aren't editable then disable them
	if (! coreDetailsEditable) {
		document.forms["eventRunData"].startdate.readOnly = true;
		document.forms["eventRunData"].startdatebutton.disabled = true;
		document.forms["eventRunData"].finishdate.readOnly = true;
		document.forms["eventRunData"].finishdatebutton.disabled = true;
		document.forms["eventRunData"].starttime.readOnly = true;
		document.forms["eventRunData"].finishtime.readOnly = true;
		document.forms["eventRunData"].raidid.disabled = true;
		document.forms["eventRunData"].instance.disabled = true;
	}
	
	// Disable the repeat when editing
	document.forms["eventRunData"].repeatruncount.disabled = true;

	setInputFormSubmitButtonLabel(document.forms["eventRunData"], "Apply");

	location.href = "#datainputform";
}


function editClassTalent(talentId, characterClass, talentName)
{
	setInputFormModeLabel();
	document.forms["classBuildData"].inputmode.value = "edit";
	document.forms["classBuildData"].talentid.value = talentId;
	setSelectedDropDown(document.forms["classBuildData"].characterclass, characterClass);
	document.forms["classBuildData"].talentname.value = talentName;
	

	setInputFormSubmitButtonLabel(document.forms["classBuildData"], "Apply");
}


function editDkpItem(itemId, itemName, itemValue)
{
	setInputFormModeLabel();
	document.forms["dkpItemValueData"].inputmode.value = "edit";
	document.forms["dkpItemValueData"].itemid.value = itemId;
	document.forms["dkpItemValueData"].itemname.value = itemName;
	document.forms["dkpItemValueData"].itemvalue.value = itemValue;
	

	setInputFormSubmitButtonLabel(document.forms["dkpItemValueData"], "Apply");
	
	location.href = "#datainputform";
}


function editLootItem(itemId, itemName, officialDungeonId, officialBossId)
{
	setInputFormModeLabel();
	document.forms["lootData"].inputmode.value = "edit";
	document.forms["lootData"].itemid.value = itemId;
	document.forms["lootData"].itemname.value = itemName;
	document.forms["lootData"].dungeonid.value = officialDungeonId;
	document.forms["lootData"].bossid.value = officialBossId;
	

	setInputFormSubmitButtonLabel(document.forms["lootData"], "Apply");
	
	location.href = "#datainputform";
}


function editDkpBoss(bossId, bossName, instanceId, bossValue)
{
	setInputFormModeLabel();
	document.forms["dkpBossValueData"].inputmode.value = "edit";
	
	// Set the correct boss
	populateDropDownWithJustThis(document.forms["dkpBossValueData"].instance, instanceId, instanceId);
	populateDropDownWithJustThis(document.forms["dkpBossValueData"].bossid, bossName, bossId);

	document.forms["dkpBossValueData"].bossvalue.value = bossValue;
	

	setInputFormSubmitButtonLabel(document.forms["dkpBossValueData"], "Apply");
	
	location.href = "#datainputform";
}


function editDkpAdjustment(adjustmentId, characterId, adjustmentValue, adjustmentDate, comments, dkpPoolId)
{
	setInputFormModeLabel();
	document.forms["dkpAdjustmentValueData"].inputmode.value = "edit";
	document.forms["dkpAdjustmentValueData"].adjustmentid.value = adjustmentId;
	setSelectedDropDown(document.forms["dkpAdjustmentValueData"].characterid, characterId);
	setSelectedDropDown(document.forms["dkpAdjustmentValueData"].dkppool, dkpPoolId);
	document.forms["dkpAdjustmentValueData"].adjustmentvalue.value = adjustmentValue;
	document.forms["dkpAdjustmentValueData"].adjustmentdate.value = adjustmentDate;
	document.forms["dkpAdjustmentValueData"].comments.value = comments;
	

	setInputFormSubmitButtonLabel(document.forms["dkpAdjustmentValueData"], "Apply");
	
	location.href = "#datainputform";
}


// General functions
function populateSpotDataFromTemplate(spotTemplateId) {
	var required = false;
	if (spotTemplates[spotTemplateId]["Required"] == "True")
	{
		required = true;
	}
	
	document.forms["raidSpotData"].description.value = spotTemplates[spotTemplateId]["Description"];
	setSelectedDropDown(document.forms["raidSpotData"].minimumlevel, spotTemplates[spotTemplateId]["MinimumLevel"]);
	
	var classBuildsObject = document.getElementById("classbuilds");
	classBuildsObject.innerHTML = "";
	selectedBuilds = new Array();
	for (var hashKey in spotTemplates[spotTemplateId]["Builds"]) {
		if (hashKey != "ln") {
			rawTemplateData = spotTemplates[spotTemplateId]["Builds"][hashKey].split("~:~");
			thisCharacterClass = rawTemplateData[0];
			thisBuildTemplateId = rawTemplateData[1];
			thisBuildTemplateName = rawTemplateData[2];
			addBuildToPool(classBuildsObject, thisBuildTemplateId, createBuildIconHTML(thisBuildTemplateId, thisCharacterClass, thisBuildTemplateName));
			selectedBuilds[thisBuildTemplateId] = true;
		}
	}
	populateAvailableBuildsDropDown(document.getElementById("availableclassbuilds"), document.raidSpotData.characterclass[document.raidSpotData.characterclass.selectedIndex].value);
	document.forms["raidSpotData"].required.checked = required;
}



// Generic supporting functions
function setSelectedMultiSelect(multiSelectObject, hashOfValues)
{
	// Empty the multi select object first
	for(x = multiSelectObject.length; x >= 0; x--)
	{
		multiSelectObject[x] = null;
	}
	
	// Now populate the select with the hash
	populateOptionsFromHash(multiSelectObject, hashOfValues);
}


function getSelectedFromMultiSelectAsStringList(multiSelectObject, seperator)
{
	var selectedString = "";
	
	// Empty the multi select object first
	for(var x = 0; x < multiSelectObject.length; x++) {
		if (multiSelectObject[x].selected) {
			if (selectedString != "") {
				selectedString += seperator;
			}
			selectedString += multiSelectObject[x].value;
		}
	}
	return selectedString;
}


function populateOptionsFromHash(optionListObject, hashSource) {
	
	for (var hashKey in hashSource)
	{
		if (hashKey != "ln" && hashKey != "length") {
			optionListObject[optionListObject.length] = new Option(hashSource[hashKey], hashKey);
		}
	}
	
	return optionListObject;
}


function emptySelectObjectOptions(optionListObjectToEmpty) {
	// Empty the object first
	for(x = optionListObjectToEmpty.length; x >= 0; x--)
	{
		optionListObjectToEmpty[x] = null;
	}
}


function populateDropDownWithJustThis(optionListObject, optionValue, optionLabel) {
	
	// Empty the object first
	for(x = optionListObject.length; x >= 0; x--)
	{
		optionListObject[x] = null;
	}
	
	optionListObject[optionListObject.length] = new Option(optionValue, optionLabel);
	
	return optionListObject;
}


function populateOptionsFromHashNoKey(optionListObject, hashSource) {
	
	for (var hashKey in hashSource)
	{
		if (hashKey != "ln" && hashKey != "length") {
			optionListObject[optionListObject.length] = new Option(hashSource[hashKey], hashSource[hashKey]);
		}
	}
	
	return optionListObject;
}


function addMultiSelectOption(OptionList, optionValue, optionLabel) {
	var nextOption = OptionList.length
	OptionList[nextOption] = new Option(optionLabel, optionValue);
}


function isOptionAvailable(selectObject, valueToSelect)
{
	var bOptionFound = false;

	for(var x = 0; x < selectObject.length; x++) {
		if (selectObject[x].value == valueToSelect)
		{
			bOptionFound = true;
			break;
		}
	}
	
	return bOptionFound;
}


function setSelectedDropDown(selectObject, valueToSelect)
{
	// Set the object to the selected value
	for(var x = 0; x < selectObject.length; x++) {
		if (selectObject[x].value == valueToSelect)
		{
			selectObject.selectedIndex = x;
		}
	}
}


function setSelectedDropDownBasedOnLabel(selectObject, labelToSelect)
{
	// Set the object to the selected value
	for(var x = 0; x < selectObject.length; x++) {
		if (selectObject[x].label == labelToSelect)
		{
			selectObject.selectedIndex = x;
		}
	}
}


function setInputFormModeLabel(newMode)
{
	if (document.getElementById("FormInputMode")) {
		var currentLabel = document.getElementById("FormInputMode").innerHTML;
		currentLabel = currentLabel.replace(/^Add/g, "Edit");
		document.getElementById("FormInputMode").innerHTML = currentLabel;
	}
}


function setInputFormSubmitButtonLabel(dataInputForm, newLabel)
{
	dataInputForm.submitbutton.value = newLabel;
	dataInputForm.submitbutton.disabled = false;
}


function setInputFormButtonLabel(buttonName, newLabel)
{
	document.getElementById(buttonName).value = newLabel;
	document.getElementById(buttonName).disabled = false;
}


function selectOptionValueExistsAlready(selectObject, optionValue)
{
	for(var x = 0; x < selectObject.length; x++) {
		if (selectObject[x].value == optionValue) {
			return true;
		}
	}
	return false;
}


function setMultiSelectOptionsSelected(multiSelectObject)
{
	for(var x = 0; x < multiSelectObject.length; x++) {
		multiSelectObject[x].selected = true;
	}
}


function removeSelectedMultiSelectOptions(multiSelectObject) {
	for(var x = 0; x < multiSelectObject.length; x++) {
		if (multiSelectObject[x].selected == true)
		{
			multiSelectObject[x] = null;
		}
	}
}


function protectedRemoveSelectedMultiSelectOptions(multiSelectObject, protectedIndex) {
	for(var x = 0; x < multiSelectObject.length; x++) {
		if (multiSelectObject[x].selected == true && x != protectedIndex)
		{
			multiSelectObject[x] = null;
		}
	}
}


function convertServerFormatDateToEpochSeconds(serverFormatTimeString) {
	return new Date(serverFormatTimeString).getTime() / 1000;
}


function getClientToServerTimeOffsetInSeconds(serverTimeString) {
	var serverTime = new Date(serverTimeString).getTime();
	var clientTime = new Date().getTime();
	var clientToServerTimeOffset = serverTime - clientTime;
	
	return (clientToServerTimeOffset / 1000);
}


function applyOffsetSecondsToTime(timeToOffset, offsetSeconds) {
	timeToOffset.setTime(timeToOffset.getTime() + (offsetSeconds * 1000))
	return timeToOffset;
}


function setUnambiguousDateTimeFormat(dateToFormat) {
		
	// Convert to our date format		
	return padLeadingZeros(dateToFormat.getDate(), 2) + " " + monthNumberToName(dateToFormat.getMonth()) + " " + dateToFormat.getFullYear() + " " + padLeadingZeros(dateToFormat.getHours(), 2) + ":" + padLeadingZeros(dateToFormat.getMinutes(), 2);
}

function convertUnambiguousFormatDateToJavascriptFormatDateObject(unambiguousFormatDateString) {
	var jscriptFormatDate = monthNumberToName(unambiguousFormatDateString.substr(5, 2) - 1) + " " + unambiguousFormatDateString.substr(8, 2) + ", " + unambiguousFormatDateString.substr(0, 4);
	return new Date(jscriptFormatDate);
}


function setUserFriendlyDateFormat(dateToFormat) {

	// Convert to our date format		
	return padLeadingZeros(dateToFormat.getDate(), 2) + " " + monthNumberToName(dateToFormat.getMonth()) + " " + dateToFormat.getFullYear();
}


function monthNumberToName(monthNumber) {

	var monthNames = new Array();
	monthNames[0] = "January";
	monthNames[1] = "February";
	monthNames[2] = "March";
	monthNames[3] = "April";
	monthNames[4] = "May";
	monthNames[5] = "June";
	monthNames[6] = "July";
	monthNames[7] = "August";
	monthNames[8] = "September";
	monthNames[9] = "October";
	monthNames[10] = "November";
	monthNames[11] = "December";
	
	return monthNames[monthNumber];
}


function padLeadingZeros(numberToPad, lengthOfResult) {
	var numberString = numberToPad.toString();
	
	zerosToAdd = lengthOfResult - numberString.length;
	
	if (zerosToAdd > 0) {
		for(var i = 0; i<zerosToAdd; i++) {
			numberString = "0" + numberString;
		}
	}
	
	return numberString;
}


function DisableEnableForm(xForm,xHow){
  objElems = xForm.elements;
  for(i=0;i<objElems.length;i++){
    objElems[i].disabled = xHow;
  }
}


function disableAllForms() {
	var numberForms = document.forms.length;
	var formIndex;
	for (formIndex=0; formIndex<numberForms; formIndex++)
	{
		for(x=0;x<document.forms[formIndex].length;x++)
		{
			document.forms[formIndex].elements[x].disabled=true;
		}
	}
}


function disableSubmitButton(formBeingSubmitted) {
  disableElement(formBeingSubmitted.submitbutton);
}


function disableElement(elementToDisable) {
	elementToDisable.disabled = true;
}


function disableButtonsBelow(parentObject) {
	var children = parentObject.childNodes;
	
	for(childrenIterator = 0; childrenIterator < children.length; childrenIterator++) {
		if (children[childrenIterator].type == 'button' || children[childrenIterator].type == 'submit') {
			children[childrenIterator].disabled = true;
			children[childrenIterator].className = 'disabled';
		}
	}
}


function disableButtonsBelowButExcluding(parentObject, excludeButtonName) {
	var children = parentObject.childNodes;
	
	for(childrenIterator = 0; childrenIterator < children.length; childrenIterator++) {
		if ((children[childrenIterator].type == 'button' || children[childrenIterator].type == 'submit') && children[childrenIterator].name != excludeButtonName) {
			children[childrenIterator].disabled = true;
			children[childrenIterator].className = 'disabled';
		}
	}
}


function disableElementsTypeCalled(elementType, elementId) {
	var elements = document.getElementsByTagName(elementType);
	
	for(childrenIterator = 0; childrenIterator < elements.length; childrenIterator++) {
		if (elements[childrenIterator].id == elementId) {
			elements[childrenIterator].disabled = true;
			//elements[childrenIterator].className = 'disabled';
		}
	}
}


function nsNavigateTo(destinationUrl) {
	// Disable all buttons in the next steps block
	disableButtonsBelow(document.getElementById("nextsteps"));
	// Navigate to the url
	location.href = destinationUrl;
}

function fcNavigateTo(destinationUrl) {
	// Disable all buttons in the button row block
	disableButtonsBelow(document.getElementById("buttonrow"));
	// Navigate to the url
	location.href = destinationUrl;
}


function fcGoBack() {
	// Disable all buttons in the button row block
	disableButtonsBelow(document.getElementById("buttonrow"));
	goBack();
}


function goBack() {
	history.go(-1);
}



function disableField(fieldName){
	if (document.getElementById(fieldName)) {
  		document.getElementById(fieldName).disabled = true;
  	}
}


function enableField(fieldName){
	if (document.getElementById(fieldName)) {
  	document.getElementById(fieldName).disabled = false;
  }
}


function showQualifyingBuildsLayer(tableRow, runId, spotId, userEvent, hightlightClassName) {

		var coors = findPos(userEvent);
		
		var layerId = "run_" + runId + "_spot_" + spotId + "_spotbuilddesc";
		tableRow.className = hightlightClassName;
		document.getElementById(layerId).style.top = coors[1] + 'px';
		document.getElementById(layerId).style.left = coors[0] + 150 + 'px';
		document.getElementById(layerId).style.visibility = 'visible';
}


function hideQualifyingBuildsLayer(tableRow, runId, spotId, unhighlightClassName) {

		var layerId = "run_" + runId + "_spot_" + spotId + "_spotbuilddesc";
		tableRow.className = unhighlightClassName;
		document.getElementById(layerId).style.visibility='hidden';
}


function findPos(e)
{
	if ( document.captureEvents ) {
		curleft = e.pageX;
		curtop = e.pageY;
	} else if ( window.event.clientX ) {
		curleft = window.event.clientX+document.documentElement.scrollLeft;
		curtop = window.event.clientY+document.documentElement.scrollTop;
	}
	return [curleft,curtop];
}


function toggleDataDisplay(obj, linkObj, displayText) {
	var el = document.getElementById(obj);
	if ( el.style.display != "none" ) {
		el.style.display = 'none';
		linkObj.innerHTML = 'show ' + displayText;
	}	else {
		el.style.display = '';
		linkObj.innerHTML = 'hide ' + displayText;
	}
}


function toggleDataDisplayWithIcon(obj, iconObject, iconPathWhenShowing, iconPathWhenHidden) {
	var el = document.getElementById(obj);
	if ( el.style.display != "none" ) {
		el.style.display = 'none';
		iconObject.src = iconPathWhenHidden;
	}	else {
		el.style.display = '';
		iconObject.src = iconPathWhenShowing;
	}
}


function toggleElementDisplay(obj, displayType) {
	var el = document.getElementById(obj);
	if ( el.style.display == "none" || el.style.display == "") {
		el.style.display = displayType;
	} else {
		el.style.display = 'none';
	}
}


function showElement(obj, displayType) {
	document.getElementById(obj).style.display = displayType;
}


function hideElement(obj) {
	document.getElementById(obj).style.display = 'none';
}


function disableAllNamedFormButtons(submitButtonName) {
	
	for(var formIterator = 0; formIterator<document.forms.length; formIterator++) {
		if (document.forms[formIterator].elements[submitButtonName]) {
			document.forms[formIterator].elements[submitButtonName].disabled = true;
		}
	}
}


function toggleSelectAll(checkboxObject, formObject) {

	// Loop through the form elements	
	for(var formI=0; formI < formObject.elements.length; formI++) {
		if (formObject.elements[formI].type == "checkbox") {
			if (checkboxObject.checked) {
				formObject.elements[formI].checked = true;
			} else {
				formObject.elements[formI].checked = false;
			}
		}
	}
}


function toggleSpecificSelectAll(checkboxObject, formObject, selectNamePattern) {

	// Loop through the form elements	
	for(var formI=0; formI < formObject.elements.length; formI++) {
		if (formObject.elements[formI].type == "checkbox" && Left(formObject.elements[formI].name, selectNamePattern.length) == selectNamePattern) {
			if (checkboxObject.checked) {
				formObject.elements[formI].checked = true;
			} else {
				formObject.elements[formI].checked = false;
			}
		}
	}
}


function elementExistsInArray(elementToFind, arrayToSearch) {
	if (getElementPositionInArray(elementToFind, arrayToSearch) > -1) {
		return true;
	} else {
		return false;
	}
}


function getElementPositionInArray(elementToFind, arrayToSearch) {
	var positionToReturn = -1;
	for(var arrayIterator = 0; arrayIterator < arrayToSearch.length; arrayIterator++) {
		if (arrayToSearch[arrayIterator] == elementToFind) {
			positionToReturn = arrayIterator;
		}
	}
	return positionToReturn;
}


function removeElementFromArray(elementToRemove, arrayToSearch) {
	var newArrayToReturn = new Array();
	for(var arrayIterator = 0; arrayIterator < arrayToSearch.length; arrayIterator++) {
		if (arrayToSearch[arrayIterator] != elementToRemove) {
			newArrayToReturn.push(arrayToSearch[arrayIterator]);
		}
	}
	return newArrayToReturn;
}


function removeKeyFromHashArray(hashKeyToRemove, arrayToSearch) {
	var newArrayToReturn = new Array();
	
	for (var hashKey in arrayToSearch) {
		if (hashKey != "ln" && hashKey != "length" && hashKeyToRemove != hashKey) {
			newArrayToReturn[hashKey] = arrayToSearch[hashKey];
		}
	}
	return newArrayToReturn;
}


function parentExists() {
	return (window.opener && !window.opener.closed)? true : false;
}


function TextareaCounter(field, countfield, maxlimit) {
	
	if (field.value.length > maxlimit) {
		field.value = field.value.substring(0, maxlimit);
	} else {
		countfield.value = maxlimit - field.value.length;
	}
}


function HTMLEntities(htmlString) {
	var htmlStringToReturn
	
	
	htmlStringToReturn = htmlString.replace("<", "&lt;");
	htmlStringToReturn = htmlStringToReturn.replace(">", "&gt;");
	
	return htmlStringToReturn;
}
