// ===== <TabbedDialogue> =====
function TabBarGroup(psId){
	var lsId=psId;
	var laTabBars=new Array();
	
	this.AddTabBar=_AddTabBar;
	this.SelectTabBar=_SelectTabBar;
	var loThisTabCollection=this;
	
	function _AddTabBar(psId, paTabIds){
		var loTabBar=new TabBar(psId, paTabIds, loThisTabCollection);
		laTabBars[laTabBars.length]=loTabBar;
	}
	
	function _SelectTabBar(psId){
		for(var a=0; a<laTabBars.length; a++){
			if(laTabBars[a].Id == psId){
				var loTabBar=laTabBars[a];
				var loTabBarTable=document.getElementById(loTabBar.Id);
				loTabBarTable.className="FrontRow";
				
				var loTabBarGroupDiv=document.getElementById(lsId);
				loTabBarGroupDiv.appendChild(loTabBarGroupDiv.removeChild(loTabBarTable));
			}
			else{
				document.getElementById(laTabBars[a].Id).className="BackRows";
			}
		}
	}
	
	/*
	this.HideTab=_HideTab;
	this.ShowTab=_ShowTab;
	function _HideTab(id){
		_UpdateDisplay(id, "none");
	}
	
	function _ShowTab(id){
		_UpdateDisplay(id, "");
	}
	
	function _UpdateDisplay(id, v){
		document.getElementById(id + "_Cell").style.display = v;
	}
	*/
}

function TabBar(psId, paTabs, poParent){
	var lsId=psId;
	var laTabs=paTabs;
	var loParent=poParent;
	var loThisTabBar=this;
	
	this.Id=lsId;
	this.SelectTab=_SelectTab;
	for(var a=0; a<laTabs.length; a++){
		var tab = document.getElementById(laTabs[a]); 
		if(typeof ncBwHlpr == "object"){
			ncBwHlpr.AttachEvent(tab, "click", this.SelectTab);
		}else{
			tab.attachEvent("onclick", this.SelectTab);
		}
	}
	function _SelectTab(e){
		var src = e ? e.target ? e.target : e.srcElement : event.srcElement;
		
		// safari returns text object if text clicked - climb up to parent if required
		if(!src.tagName){src = src.parentNode}
		var srcId = src.id;
		for(var a=0; a<laTabs.length; a++){
			var lsClass=(laTabs[a] == srcId ? "TextSelected" : "Text");
			document.getElementById(laTabs[a]).className=lsClass;	
		}
		if(loParent != null){
			loParent.SelectTabBar(lsId);
		}
	}
}
// ===== </TabbedDialogue> =====

// ===== <DialogueListBox> =====
function DialogueListBox(psBaseId, pCols, pEditCellIndex, pCellWidths){
	var lb = this;
	lb.BaseId = psBaseId
	lb.Name = "go" + lb.BaseId; 
	lb.Cols = pCols;
	lb._Disabled = false;
	lb.SelectedIndex = -1;
	lb.EditCellIndex = pEditCellIndex ? pEditCellIndex : -1;
	lb.SequenceFieldIndex = -1;
	lb._FieldInfo = [];
	lb._Data = [];
	
	// 2006-04-06: cell widths, used to decide hidden / not as some browsers render 0 width under or normally
	lb._CellWidths = pCellWidths;
	lb.UpdateButtons();
	if(document.getElementById(lb.BaseId + "_UpButton")){
		document.getElementById(lb.BaseId + "_UpButton").onclick = new Function(lb.Name + ".MoveUp(); return false;");
		document.getElementById(lb.BaseId + "_DownButton").onclick = new Function(lb.Name + ".MoveDown(); return false;");
	}
	var laClicks=["Add", "Edit", "Remove"];
	for(var a=0; a<laClicks.length; a++){
		var btn = document.getElementById(lb.BaseId + "_" + laClicks[a]);
		if(btn){
			btn.onclick = new Function(lb.Name + "." + laClicks[a] + "Click()");
		}
	}
	this.SetEditHandler=_SetEditHandler;
	this.SetAddHandler=_SetAddHandler;
	this.SetRemoveHandler=_SetRemoveHandler;
	this.SetSelectHandler = _SetSelectHandler;
	this.ShowAddButton = _ShowAddButton;
	function _SetEditHandler(po){
		lb.EditHandler=po;
	}
	function _SetAddHandler(po){
		lb.AddHandler=po;
	}
	function _SetRemoveHandler(po){
		lb.RemoveHandler=po;
	}
	function _SetSelectHandler(po){
		lb.SelectHandler=po;
	}
	function _ShowAddButton(pShow){
		document.getElementById(lb.BaseId + "_Add").style.display = pShow ? "" : "none";
	}
}
DialogueListBox.prototype.AddElement = function(paData, pbSelect, pbDisableSelect, pDisableRow, pCustomClass){
	var lb = this;
	
	// copy array - otherwise we get a ref and client code may update content
	var dataCopy = new Array(paData.length);
	for(var i = 0; i < paData.length; i++){
		dataCopy[i] = paData[i];
	}
	lb._Data[lb._Data.length] = dataCopy;
	
	var tbl = document.getElementById(lb.BaseId);
	var row = tbl.insertRow(-1);
	for(var i = 0; i < paData.length && i < lb.Cols; i++){
		if(!lb._CellWidths || lb._CellWidths[i] != 0){
			var cell = row.insertCell(-1);
			if(typeof paData[i] == "object"){
				cell.appendChild(paData[i]);
			}else{
				cell.innerHTML = paData[i];
			}	
			cell.className = pCustomClass ? pCustomClass : "DialogueListBoxItem";
			if(!pbDisableSelect){
				cell.onclick = new Function(lb.Name + ".SelectElementClick(arguments[0])");
				if(pbSelect){lb.SelectElement(lb.GetOptionsLength()-1);}
			}else{
				if(pDisableRow){
					cell.setAttribute("disabled", "disabled");
				}
			}
		}
	}
	lb.UpdateSequenceField();	
};
DialogueListBox.prototype.DisableRow = function(index, disable){
	document.getElementById(this.BaseId).rows(index).disabled = disable;
};
DialogueListBox.prototype.GetAllElementsData = function(){
	return this._Data;
};
DialogueListBox.prototype.GetSelectedElementData = function(){
	var lb = this;
	if(lb.SelectedIndex > -1){
		return lb._Data[lb.SelectedIndex];
	}
};
DialogueListBox.prototype.UpdateSelectedElementData = function(pData){
	this.UpdateElement(this.SelectedIndex, pData);
};
DialogueListBox.prototype.UpdateElement = function(pIndex, pDataArr){
	var lb = this;
	
	for(var i = 0; i < pDataArr.length; i++){
		lb._Data[pIndex][i] = pDataArr[i];
	}
	
	var row = document.getElementById(lb.BaseId).rows.item(pIndex);
	var cellIndex = 0;
	for(var i = 0; i < pDataArr.length && i < lb.Cols; i++){
		if(!lb._CellWidths || lb._CellWidths[i] != 0){
			row.cells(cellIndex++).innerHTML = pDataArr[i];
		}
	}
	lb.UpdateSequenceField();
};
DialogueListBox.prototype.GetOptionsLength = function(){
	return this._Data.length;
};
DialogueListBox.prototype.SelectElementClick = function(e){
	var lb = this;
	if(!lb._Disabled){
		var el = e ? e.target : event.srcElement;
		if(!el.tagName){
			// text element - move up to parent
			el = el.parentNode;
		}
		while(el.tagName.toLowerCase() != "tr"){
			el = el.parentNode;
		}
		lb.SelectElement(el.rowIndex);
	}	
};
DialogueListBox.prototype.SelectElement = function(pIndex){
	var lb = this;
	lb.SelectedIndex = pIndex;
	var rows = document.getElementById(lb.BaseId).rows;
	for(var i = 0; i < rows.length; i++){
		var row = rows.item(i);
		var sColor = (lb.SelectedIndex == i ? "#fff" : "#000");
		var className = (lb.SelectedIndex == i ? "DialogueListBoxItemSelected" : "DialogueListBoxItem");
		for(j = 0; j < row.cells.length; j++){
			row.cells.item(j).className = className;
			row.cells.item(j).style.color = sColor;
		}
	}
	lb.UpdateButtons();
	if(lb.SelectHandler!=null){
		lb.SelectHandler(lb, lb.GetSelectedElementData());
	}
};
DialogueListBox.prototype.RemoveClick = function(){
	var lb = this;
	var lbRemove=true;
	if(lb.RemoveHandler != null){
		lbRemove = lb.RemoveHandler(lb, lb.GetSelectedElementData());
	}
	if(lbRemove){
		lb._Data.splice(lb.SelectedIndex, 1);
		document.getElementById(lb.BaseId).deleteRow(lb.SelectedIndex);
		if(lb.SelectedIndex < lb.GetOptionsLength()){
			lb.SelectElement(lb.SelectedIndex);
		}
		else{
			lb.SelectedIndex=-1;
		}
		lb.UpdateButtons();
		lb.UpdateSequenceField();
	}	
};
DialogueListBox.prototype.RemoveAll = function(){
	var lb = this;
	var loListBox=document.getElementById(lb.BaseId);
	for(var a=loListBox.rows.length-1; a>-1; a--){
		loListBox.deleteRow(a);
	}
	lb.SelectElement(-1);
	lb.UpdateSequenceField();
	lb._Data = [];
};
DialogueListBox.prototype.AddClick = function(){
	var lb = this;
	if(lb.AddHandler != null){
		var laData=lb.AddHandler(lb);
		if(laData!=null){
			lb.AddElement(laData, true);
			//lb.SelectElement(document.getElementById(lb.BaseId).rows.length - 1);
		}
	}
};
DialogueListBox.prototype.EditClick = function(){
	var lb = this;
	if(lb.EditHandler!=null){
		var laData = lb.EditHandler(lb, lb.GetSelectedElementData());
		if(laData!=null){
			lb.UpdateSelectedElementData(laData);
		}
	}
};
DialogueListBox.prototype.UpdateButtons = function(){
	var lb = this;
	var lbSelected=(lb.SelectedIndex > -1);
	var liOptionsLength = lb.GetOptionsLength();
	if(document.getElementById(lb.BaseId + "_Add")){	
		var edit = false;
		if(!lb._Disabled && lbSelected){
			if(lb.EditCellIndex != -1){
				edit = lb.GetSelectedElementData()[lb.EditCellIndex] == "1";
			}else{
				edit = true;
			}
		}
		document.getElementById(lb.BaseId + "_Add").disabled = lb._Disabled;
		document.getElementById(lb.BaseId + "_Edit").disabled = !edit;
		document.getElementById(lb.BaseId + "_Remove").disabled = !edit;
	}
		
	if(document.getElementById(lb.BaseId + "_UpButton")){
		lb._DisableBtn(lb.BaseId + "_UpButton", lb.SelectedIndex < 1 || lb._Disabled);
		lb._DisableBtn(lb.BaseId + "_DownButton", !lbSelected || lb._Disabled || lb.SelectedIndex == (liOptionsLength-1));
	}	
};

DialogueListBox.prototype._DisableBtn = function(pId, pDisable){
	var btn = document.getElementById(pId);
	btn.disabled = pDisable;
	var img = document.getElementById(pId + "Image");
	img.style.filter=(pDisable ? "alpha(opacity=25)" : "");
	img.style.opacity = (pDisable ? ".25" : "");
};

DialogueListBox.prototype.MoveUp = function(){
	this.Move(-1);
};	
DialogueListBox.prototype.MoveDown = function(){
	this.Move(+1);
};	
DialogueListBox.prototype.Move = function(piOffset){
	var lb = this;
	var liOptionsLength = lb.GetOptionsLength();
	var loListBox=document.getElementById(lb.BaseId);
	var loTBody=loListBox.getElementsByTagName("tbody").item(0);
		
	var loTemp=loTBody.removeChild(loTBody.childNodes.item(lb.SelectedIndex));
	
	var temp = lb._Data[lb.SelectedIndex];
	lb._Data[lb.SelectedIndex] = lb._Data[lb.SelectedIndex + piOffset];
	lb._Data[lb.SelectedIndex + piOffset] = temp;
	
	lb.SelectedIndex+=piOffset;
	if(lb.SelectedIndex == (liOptionsLength-1)){
		loTBody.appendChild(loTemp);
	}
	else{
		loTBody.insertBefore(loTemp, loTBody.childNodes.item(lb.SelectedIndex));
	}
	lb.UpdateButtons();
	lb.UpdateSequenceField();
};

// call after adding all initial items - automatically populates the hidden sequence field
DialogueListBox.prototype.SetAutoSequenceField = function(pSequenceFieldIndex, pSequenceField){
	var lb = this;
	lb.SequenceFieldIndex = pSequenceFieldIndex;
	lb.SequenceField = pSequenceField;
	lb.UpdateSequenceField();
};
DialogueListBox.prototype.UpdateSequenceField = function(){
	var lb = this;
	if(lb.SequenceFieldIndex > -1){
		var data = lb.GetAllElementsData();
		var value = "";
		for(var i = 0; i < data.length; i++){
			if(i > 0){
				value += ",";
			}
			value += data[i][lb.SequenceFieldIndex];
		}
		lb.SequenceField.value = value;
	}
};
DialogueListBox.prototype.SetDisabled = function(pb, pEnabledClass, pDisabledClass){
	var lb = this;
	lb._Disabled = pb;
	var ec = pEnabledClass ? pEnabledClass : "DialogueText";
	var dc = pDisabledClass ? pDisabledClass : "DialogueDisabled";
	document.getElementById(lb.BaseId).className=(pb ? dc : ec);
	lb.UpdateButtons();
};
// ===== </DialogueListBox> =====

// ===== <Inherited bool checkbox> =====
function InheritedBoolUi(psBaseId, pbInheritedValue, pbOverrideValue, poTargetFunction){
	var msBaseId=psBaseId;
	var mbInheritedValue=pbInheritedValue;
	var moTargetFunction=poTargetFunction;
	var mbInitialized=false;
	_Initialize(pbOverrideValue);
	
	function _Initialize(pbOverrideValue){
		var loOverrideTrue=document.getElementById(msBaseId + "_OverrideTrue")
		loOverrideTrue.attachEvent("onclick", _ClickTrue);
		document.getElementById(msBaseId + "_InheritedTrue").attachEvent("onclick", loOverrideTrue.click);
		
		var loOverrideFalse=document.getElementById(msBaseId + "_OverrideFalse")
		loOverrideFalse.attachEvent("onclick", _ClickFalse);
		document.getElementById(msBaseId + "_InheritedFalse").attachEvent("onclick", loOverrideFalse.click);
	
		if(pbOverrideValue != null){
			if(pbOverrideValue){
				loOverrideTrue.click();
			}
			else{
				loOverrideFalse.click();
			}
		}
		else{
			_UpdateValue(null);
		}
		mbInitialized=true;
	}
	
	function _ClickTrue(){
		var lbValue=event.srcElement.checked;
		if(lbValue){
			document.getElementById(msBaseId + "_OverrideFalse").checked=false;
		}
		_UpdateValue(lbValue ? true : null);
	}
	function _ClickFalse(){
		var lbValue=event.srcElement.checked;
		if(lbValue){
			document.getElementById(msBaseId + "_OverrideTrue").checked=false;
		}
		_UpdateValue(event.srcElement.checked ? false : null);
	}
	function _UpdateValue(pbValue){
		if(mbInitialized){
			moTargetFunction(msBaseId, pbValue);
		}	
		_UpdateUi(pbValue);
	}		
	function _UpdateUi(pbValue){
		var lbShowInheritedTrue=false;
		var lbShowInheritedFalse=false;
		if(mbInheritedValue != null){
			if(pbValue == null){
				lbShowInheritedTrue=mbInheritedValue;
				lbShowInheritedFalse=!mbInheritedValue;
			}
			else{
				lbShowInheritedTrue=(mbInheritedValue && !pbValue);
				lbShowInheritedFalse=(!mbInheritedValue && pbValue);
			}
		}	
		_ShowElement("_InheritedTrue", lbShowInheritedTrue);
		_ShowElement("_InheritedFalse", lbShowInheritedFalse);
		_ShowElement("_OverrideTrue", !lbShowInheritedTrue);
		_ShowElement("_OverrideFalse", !lbShowInheritedFalse);
	}
	
	function _ShowElement(psIdSuffix, pbShow){
		document.getElementById(msBaseId + psIdSuffix).style.display=(pbShow ? "inline" : "none");
	}	
}
// ===== <Inherited bool checkbox> =====