function editFieldsOpen(panelId, tabFormId, tabIndex)
{
	initFields();
	var dlgXpos = YAHOO.util.Dom.getViewportWidth() / 2 - 317;	// 635 is the width of the dialog
	if (dlgXpos < 10)
	{
		dlgXpos = 10;
	}
	var dlgYpos = YAHOO.util.Dom.getViewportHeight() / 2 - 280;	// 560 is also a good guess for the height of the dlg
	if (dlgYpos < 10)
	{
		dlgYpos = 10;
	}
	if (YAHOO.modalform == null)
	{
		YAHOO.modalform = new YAHOO.widget.Panel(panelId,{
			width: "635px",
			fixedcenter: false,
			close: false, 
			draggable: false, 
			modal: true, 
			underlay:'none',
			visible: true, 
			constraintoviewport:true,
			effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.25}
		});
		YAHOO.modalform.render();
		YAHOO.formTabs = new YAHOO.widget.TabView(tabFormId,{orientation:'left'});
		YAHOO.util.Dom.setStyle(panelId, 'display', 'block');
	}
	YAHOO.modalform.cfg.setProperty('x', dlgXpos);
	YAHOO.modalform.cfg.setProperty('y', dlgYpos);
	YAHOO.formTabs.set('activeIndex', tabIndex);
	YAHOO.modalform.show();

	var neddm = document.getElementById("neweditDataDialog_mask");
	if (neddm != null) 
		neddm.style.display = "block";
}
function initFields()
{
	var childToken;

	sendGetFieldRequest("");
	for (var parentToken in childTokens) 
	{
		if (selValues[parentToken].value != null && selValues[parentToken].value.length > 0)
		{
			childToken = "";
			for (var i = 0; i <= childTokens[parentToken].length-1; i++) 
			{
				childToken = childTokens[parentToken][i];
				if (selValues[childToken].value != null && selValues[childToken].value.length > 0)
				{
					writeData(childToken);
				}
				if (selValues[childToken].bid != null && selValues[childToken].bid.length > 0)
				{
					sendGetFieldRequest(selValues[parentToken].bid+"|"+selValues[childToken].bid, childToken);
				}
			}
			if (!dataWritten(parentToken))
			{
				// save value in textbox
				writeData(parentToken);
				
				if (selValues[parentToken].bid != null && selValues[parentToken].bid.length > 0)
				{
					sendGetFieldRequest(selValues[parentToken].bid, parentToken);
				}
			}
		}
	}
}
var dataWritten = function(token)
{
	var currentTextBox = document.getElementById(token+"FieldBox");
	if (currentTextBox.value != null && currentTextBox.value.length > 0)
	{
		return true;
	}
	return false;
};
function writeData(token)
{
	var currentTextBox = document.getElementById(token+"FieldBox");
	var parentDiv, multiValues;
	var tokenCount = 0;

	if (selValues[token].value != "undefined")
	{
		currentTextBox.value = selValues[token].value;
	}

	// store mutiple values (if exist)
	// get the count of current entries for this token
	if (selValues[token].multiValue != null && selValues[token].multiValue.length > 0)
	{
		tokenCount = selValues[token].multiValue.length;
		parentDiv = document.getElementById("multi"+token+"Container");
		parentDiv.innerHTML = "";
		for (var i=0; i<selValues[token].multiValue.length; i++)
		{
			createMultiElement(token, i, selValues[token].multiValue[i], parentDiv);
		}
	}
}
function createMultiElement(token, tokenCount, divValue, parentDiv)
{
	var div, anchor;
	var id = token+"div"+tokenCount;
	while (document.getElementById(id) != null)
	{
		id += "a";
	}
	div = document.createElement("div");
	div.id = id;
	div.innerHTML = divValue;
	anchor = document.createElement("a");
	anchor.href = "javascript:removeFieldClick('"+div.id+"');";
	anchor.className = "link-rm";
	anchor.innerHTML = removeFieldText;
	div.appendChild(anchor);
	parentDiv.appendChild(div);
}
function editFieldsClose()
{
	YAHOO.modalform.hide();
}
var responseSuccessGFR = function (o) {
	// turn off loading animation/enable controls
	var returndataset = eval("(" + o.responseText + ")");
	var curDataset, oTextBox;
	if (typeof returndataset.error == "undefined") {
		for (var i = 0; i <= returndataset["fields"].length - 1; i++) {
			curDataset = returndataset["fields"][i];
			datasets[curDataset.token] = curDataset.dataset;
			oTextBox = document.getElementById(curDataset.token + "FieldBox");
			oTextBox.disabled = false;
			YAHOO.util.Dom.removeClass("set-" + curDataset.token, "disabled");
			SetupAutoCompleteControl(oTextBox, "ac" + curDataset.token + "Container", eval("get" + curDataset.token + "Fields"));
		}
	}
	else if (returndataset.error == "nochildren") {
		if (returndataset.token) {
			clearChildValues(returndataset.token, false);
		}
	}
};
var responseFailureGFR = function(o) {
};
var callbackGFR =
{
	success: responseSuccessGFR,
	failure: responseFailureGFR
};
function sendGetFieldRequest(bid, token) {
	var requestString = "AJAX/ViewFieldsHandler.ashx?action=get&lcid=" + v_lcid + "&bid=" + bid + "&token=" + token;
	YAHOO.util.Connect.asyncRequest("GET", requestString, callbackGFR);
}
function sendSaveFieldRequest(userId, treeId, personId, viewId) 
{
	var formObject = document.getElementById('valForm');
	YAHOO.util.Connect.setForm(formObject);
	var sUrl = "AJAX/ViewFieldsHandler.ashx?action=set&lcid="+v_lcid+"&uid="+userId+"&tid="+treeId+"&pid="+personId+"&vid="+viewId;
	var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, setFieldsCallback);

}
var setFieldsSuccess = function (o) {
	// refresh the page
	//Need to check if the msg=nf exists so we don't keep adding it to the url
	if (window.location.href.toString().indexOf('msg=nf') == -1) {
		window.location = window.location.href + "&msg=nf";
		window.location.reload(true);
		return;
	}

	window.location = window.location.href;
	window.location.reload(true);
};

var setFieldsFailure = function(o)
{
	//	debugger;
	window.location.reload(true);
};

var setFieldsCallback =
{
	success:setFieldsSuccess,
	failure:setFieldsFailure
};

var getallegianceFields = function(sQuery) 
{
	return getFields("allegiance", sQuery);
};
var getbranchFields = function(sQuery) 
{
	return getFields("branch", sQuery);
};
var getstatusFields = function(sQuery) 
{
	return getFields("status", sQuery);
};
var getspecialtyFields = function(sQuery) 
{
	return getFields("specialty", sQuery);
};
var getawardsFields = function(sQuery) 
{
	return getFields("awards", sQuery);
};
var getunitFields = function(sQuery) 
{
	return getFields("unit", sQuery);
};
var getrankFields = function(sQuery) 
{
	return getFields("rank", sQuery);
};
var getbadgesFields = function(sQuery) 
{
	return getFields("badges", sQuery);
};
var getwarFields = function(sQuery) 
{
	return getFields("war", sQuery);
};
var getbattlesFields = function(sQuery) 
{
	return getFields("battles", sQuery);
};
// DataSource for autocomplete
var getFields = function(token, sQuery) 
{
	aResults = [];
	if (sQuery && sQuery.length > 0 && sQuery != "*") 
	{
		var charKey = sQuery.substring(0, 1).toLowerCase();
		var oResponse = datasets[token][charKey];
		if (oResponse) 
		{
			for (var i = oResponse.length - 1; i >= 0; i--) 
			{
				var sKey = oResponse[i].value;
				var sKeyIndex = encodeURI(sKey.toLowerCase()).indexOf(sQuery.toLowerCase());
				if (sKeyIndex === 0) 
				{
					aResults.unshift([sKey, oResponse[i].bid, token]);
				}
			}
			return aResults;
		}
	} 
	else 
	{
		for (var letter in datasets[token]) 
		{
			var oEmptyResponse = datasets[token][letter];
			for (var x = 0; x <= oEmptyResponse.length - 1; x++) 
			{
				aResults.push([oEmptyResponse[x].value, oEmptyResponse[x].bid, token]);
			}
		}
		return aResults;
	}
};
//define your itemSelect handler function:
var itemSelectHandler = function(sEvent, oSelf) 
{
	// send new request
	var oTextBox = oSelf[0]._elTextbox;
	var selBid = oSelf[2][1];
	var token = oSelf[2][2];
	var cToken;

	// only set the value if it has changed
	if (fieldHasChanged(token, oTextBox.value))
	{
		storeData(token, oTextBox.value, selBid);
		clearChildValues(token);

		if (childTokens[token])
		{
			// get values for new child fields
			sendGetFieldRequest(selBid, token);
		}
	}
};
// define the unmatched select handler
// oSelf = autocomplete instance
// sType = event fired
var unmatchedItemSelectHandler = function(sType, oSelf)
{
	var oTextBox;
	var token;
	if (sType == "")
	{
		// manual fight
		oTextBox = oSelf;
	}
	else
	{
		// event was fired
		oTextBox = oSelf[0]._elTextbox;
	}
	token = oTextBox.id.slice(0,oTextBox.id.indexOf("FieldBox"));
	// only set the value if it has changed
	if (fieldHasChanged(token, oTextBox.value))
	{
		storeData(token, oTextBox.value, "undefined");

		// clear all child values
		if (oTextBox.value!=null && oTextBox.value.length>0)
		{
			// enable children
			clearChildValues(token, false);
		}
		else
		{
			// disable children
			clearChildValues(token, true);
		}
	}
};
var fieldHasChanged = function(token, newValue)
{
	var oldValue = selValues[token].value;
	if (oldValue != newValue)
	{
		if ((oldValue == null || oldValue == "" || oldValue == "undefined") && (newValue == null || newValue == "" || newValue == "undefined"))
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	return false;
};
function clearChildValues(token, disabledFlag)
{
	var oTextBox;
	if (disabledFlag)
	{
		disabledFlag = true;
	}
	else
	{
		disabledFlag = false;
	}
	if (childTokens[token])
	{
		for (var i = childTokens[token].length - 1; i >= 0; i--) 
		{
			document.getElementById(childTokens[token][i]+"FieldBox").disabled = disabledFlag;
			if (disabledFlag)
			{
				YAHOO.util.Dom.addClass("set-"+childTokens[token][i], "disabled");
			}
			else
			{
				YAHOO.util.Dom.removeClass("set-"+childTokens[token][i], "disabled");
			}
			clearChildValues(childTokens[token][i], true);
			clearValues(childTokens[token][i]);
		}
	}
}
function clearValues(token)
{
	// clear textbox
	document.getElementById(token+"FieldBox").value = "";
	// clear multivalues
	var parentDiv = document.getElementById("multi"+token+"Container");
	if (parentDiv != null)
	{
		var numNodes = parentDiv.childNodes.length;
		for (var i=numNodes-1; i >= 0; i--)
		{
			removeField(parentDiv.childNodes[i].id);
		}
	}
	selValues[token].multiValue = [];
	selValues[token].multiBid = [];
	// clear data
	storeData(token, "undefined", "undefined");
	datasets[token] = {};
}

// used to store data in selValues object
function storeData(token, selValue, bid, addMultiples)
{
	var index = 0;
	if (addMultiples)
	{
		// now copy value from single value to multi value
		if (selValues[token].value != null && selValues[token].value != "undefined")
		{
			if (arrayIndexOf(selValues[token].multiValue, selValues[token].value) == -1)
			{
				if (selValues[token].multiValue != null && selValues[token].multiValue.length > 0)
				{
					index = selValues[token].multiValue.length;
				}
				// new to multiValue
				selValues[token].multiValue[index] = selValues[token].value;
				selValues[token].multiBid[index] = selValues[token].bid;
			}
		}
	}
	selValues[token].value = selValue;
	selValues[token].bid = bid;
}

//define your itemSelect handler function:
var onFocus = function(oEvent, oSelf)
{
	// Preload content in the container
	if (oSelf[0]._elTextbox.value.length == 0)
	{
		oSelf[0].sendQuery("*");
		oSelf[0].textboxFocusEvent.unsubscribe();
	}
};
var onCollapse = function(oEvent, oSelf)
{
	oSelf[0].textboxFocusEvent.subscribe(onFocus);
};
var acKeyPress = function(oEvent, oSelf)
{
	var textbox = oSelf[0]._elTextbox;
	var token = textbox.id.slice(0,textbox.id.indexOf("FieldBox"));
	if (textbox.value!=null && textbox.value.length>0)
	{
		// enable children
		clearChildValues(token, false);
	}
	else
	{
		// disable children
		clearChildValues(token, true);
	}
};

function SetupAutoCompleteControl(oTextbox, oContainer, dsFunc)
{
	var myDataSource = new YAHOO.widget.DS_JSFunction(dsFunc);
	myDataSource.maxCacheEntries = 0;
	this.myAutoComp = new YAHOO.widget.AutoComplete(oTextbox, oContainer, myDataSource);
	this.myAutoComp.itemSelectEvent.subscribe(itemSelectHandler);
	this.myAutoComp.unmatchedItemSelectEvent.subscribe(unmatchedItemSelectHandler);
	this.myAutoComp.maxResultsDisplayed = 100;
	this.myAutoComp.textboxFocusEvent.subscribe(onFocus);
	this.myAutoComp.containerCollapseEvent.subscribe(onCollapse);
	this.myAutoComp.queryDelay = 0;
	this.myAutoComp.animHoriz = false; 
	this.myAutoComp.animVert = false;
	this.myAutoComp.startClass = "autoSuggestStart";
	this.myAutoComp.typeClass = "autoSuggestType";
	this.myAutoComp.newClass = "autoSuggestNew";
	this.myAutoComp.typeAhead = false;
	this.myAutoComp.minQueryLength = 0;
	this.myAutoComp.allowBrowserAutocomplete = false;
	this.myAutoComp.textboxKeyEvent.subscribe(acKeyPress);
	this.myAutoComp.formatResult = function(oResultItem, sQuery) {
		var sMarkup = oResultItem[0];
		return (sMarkup);
	};
}

function storeSubmitFields(hiddenInputId)
{
	var count;
	var sValues = "";
	var curTextBox;
	for (var token in selValues) 
	{
		count = 1;
		if (token != null && token.length > 0)
		{
			// make sure the user hasn't edited the textbox
			curTextBox = document.getElementById(token+"FieldBox");
			var selValue = selValues[token].value;
			if (selValue == "undefined")
			{
				selValue = "";
			}
			if (!(selValue == curTextBox.value) || curTextBox.value == "")
			{
				// multivalue exists
				if (arrayIndexOf(selValues[token].multiValue, curTextBox.value) == -1)
				{
					// texbox has changed
					unmatchedItemSelectHandler("", curTextBox);
				}
			}
			
			// format token|value|nid|bid[|bid][|bid]
			// if there is a multi item, output those first
			if (selValues[token].multiValue[0] != null && selValues[token].multiValue.length > 0)
			{
				for (var i=0; i<selValues[token].multiValue.length; i++)
				{
					sValues += token+"|"+selValues[token].multiValue[i]+"|"+token+count+"|"+selValues[token].multiBid[i]+";";
					count++;
				}
			}
			sValues += token+"|"+selValues[token].value+"|"+token+count+"|"+selValues[token].bid+";";
			count++;
		}
	}
	document.getElementById(hiddenInputId).value = sValues;
}

function storeSubmitVitals(hiddenInputId)
{
	var sValues = (document.getElementById("m_genderMale").checked) ? "ge:M;" : "ge:F;";
	sValues += "fn:"+document.getElementById("field_name_given").value+";";
	sValues += "ln:" + document.getElementById("field_name_last").value + ";";
	sValues += "sx:" + document.getElementById("field_suffix").value + ";";
	sValues += "nk:" + document.getElementById("field_name_nick").value + ";";
	sValues += "bd:"+document.getElementById("field_birth_date").value+";";
	sValues += "bp:"+document.getElementById("field_birth_place").value+";";
	sValues += "dd:"+document.getElementById("field_death_date").value+";";
	sValues += "dp:"+document.getElementById("field_death_place").value+";";
	document.getElementById(hiddenInputId).value = sValues;
}

function addField(token)
{
	var tokenCount = 0, index = 0;
	var currentTextBox = document.getElementById(token+"FieldBox");
	var parentDiv, div;
	// first check to see if we have a value in the current checkbox
	if (currentTextBox.value != null && currentTextBox.value.length >0)
	{
		// get the count of current entries for this token
		if (selValues[token].multiValue != null && selValues[token].multiValue.length > 0)
		{
			tokenCount = selValues[token].multiValue.length;
		}
		parentDiv = document.getElementById("multi"+token+"Container");
		createMultiElement(token, tokenCount, currentTextBox.value, parentDiv);
		// now copy value from single value to multi value
		if (selValues[token].value != null && selValues[token].value != "undefined")
		{
			if (arrayIndexOf(selValues[token].multiValue, selValues[token].value) == -1)
			{
				if (selValues[token].multiValue[0] != null && selValues[token].multiValue.length > 0)
				{
					index = selValues[token].multiValue.length;
				}
				// new to multiValue
				selValues[token].multiValue[index] = selValues[token].value;
				selValues[token].multiBid[index] = selValues[token].bid;
			}
			storeData(token, "undefined", "undefined");
		}
		// now copy value from textbox
		if (arrayIndexOf(selValues[token].multiValue, currentTextBox.value) == -1)
		{
			index = 0;
			if (selValues[token].multiValue[0] != null && selValues[token].multiValue.length > 0)
			{
				index = selValues[token].multiValue.length;
			}
			// new to multiValue
			selValues[token].multiValue[index] = currentTextBox.value;
			selValues[token].multiBid[index] = "undefined";
		}
		currentTextBox.value = "";
	}
}
function removeField(divId)
{
	var token = divId.substring(0, divId.indexOf("div"));
	var parentDiv = document.getElementById("multi"+token+"Container");
	var childDiv = document.getElementById(divId);
	var index = arrayIndexOf(selValues[token].multiValue, childDiv.firstChild.nodeValue);
	selValues[token].multiValue = arrayRemoveItemByIndex(selValues[token].multiValue, index);
	selValues[token].multiBid = arrayRemoveItemByIndex(selValues[token].multiBid, index);
	parentDiv.removeChild(childDiv);
}
var arrayRemoveItem = function (array, value)
{
	var index = arrayIndexOf(array, value);
	return arrayRemoveItemByIndex(array, index);
};
var arrayRemoveItemByIndex = function (array, index)
{
	if (index > -1)
	{
		array.splice(index, 1);
	}
	return array;
};
var arrayIndexOf = function (array, value)
{
	if (array != null && array.length > 0)
	{
		for (var i = 0; i <= array.length-1; i++)
		{
			if (array[i] == value)
			{
				return i;
			}
		}
	}
	return -1;
};


