/*
<WebFramework>
	<FilePath>/Config/Asset/Scripts/AssetConfig.js</FilePath>
	<Description>This script file handles the configuration of Assets for the WebFramework.</Description>
	<Version Major="5.2" Minor="0" Revision="8" Date="1/3/2007">
		<Revision Date="8/17/2004" Name="Sean Pardue" Major="5" Minor="0" Revision="0">Creation</Revision>
		<Revision Date="9/20/2004" Name="Sean Pardue" Major="5" Minor="0" Revision="1">
			Changed right click functionality to not select and run an item, but to just highlight the item with dashed border.
		</Revision>
		<Revision Date="10/4/2004" Name="Sean Pardue" Major="5" Minor="0" Revision="2">
			Fixed problem with adding a child node to a parent that was not expanded
		</Revision>
		<Revision Date="10/14/2004" Name="Sean Pardue" Major="5" Minor="0" Revision="3">
			Added Asset Code field to the Asset tree
		</Revision>
		<Revision Date="1/11/2005" Major="5.0" Minor="0" Revision="3">Initial Release</Revision>
		<Revision Date="2/4/2005" Major="5.0" Minor="1" Revision="3" Name="Version Utility">
			Fixed Asset Configuration for setting image path
			Fixed resizing on Help dialog
			Fixed links in Reporting Services documentation
		</Revision>
		<Revision Date="2/11/2005" Major="5.0" Minor="1" Revision="4" Name="Sean Pardue">
			Fixed problem with Deleting Assets not deleting from the dictionary 
			and then phantom Assets would appear until refreshing page.
		</Revision>
		<Revision Date="2/14/2005" Major="5.0" Minor="2" Revision="4" Name="Version Utility">
			Fixed problem with deleting Assets
		</Revision>
		<Revision Date="5/24/2005" Major="5.0" Minor="3" Revision="4" Name="Version Utility">Major and Minor revisions automatically set by utility.</Revision>
		<Revision Date="8/4/2005" Major="5.1" Minor="0" Revision="4" Name="Version Utility">Major and Minor revisions automatically set by utility.</Revision>
		<Revision Date="8/8/2005" Major="5.1" Minor="0" Revision="7" Name="Sean Pardue">
			Fixed Problem with Expanding All Assets that resulted from the introduction of Asset On Demand loading. Added mbExpanding=false to showMenu function.
			Fixed problem with Cutting and Pasting to the same Asset or a descedent of the cut Asset.
		</Revision>
		<Revision Date="1/4/2006" Major="5.1" Minor="0" Revision="8" Name="Sean Pardue">
			Added Audit Logging
		</Revision>
		<Revision Date="1/3/2007" Major="5.2" Minor="0" Revision="8" Name="Version Utility">Major and Minor revisions automatically set by utility.</Revision>
	</Version>
</WebFramework>
*/
var moPopup = window.createPopup();
var moItem=null;
var mbCopying=false;
var mbCutting=false;					
var mbExecuting=false;

//Callback Function from GetAsset.asp
function UpdateTree(ID){
	if (ID == null || parseInt(ID) == -1) return;
	
	if (dicAssets.Exists(ID.toString())){
		var oItem = dicAssets(ID.toString());		
		var oUL = document.all('UL' + oItem.Parent);
		if (oUL == null){ //Parent LI did not have any children
			var oLI = document.all('LI' + oItem.Parent);
			if (oLI != null){
				oLI.className = 'clsHasKids';
				
				oUL=document.createElement('UL');
				oUL.id = 'UL' + oItem.Parent.toString();
				oUL.style.display='list-item';
				oLI.style.listStyleImage='url(' + msOpen + ')';		
				oLI.appendChild(oUL);
			}
		}
		if (oUL != null && oUL.children.length == 0){
			AddNextTreeElement(oUL);
		}				
		AddTreeElement(oItem);		
	}
}

function InsertTreeElement(ParentID, oElem, bAppend){
	var oParent = document.all('LI' + ParentID);		
	oParent.className = 'clsHasKids';	
	oUL = document.all('UL' + ParentID.toString());						
	if (oUL == null){
		oUL=document.createElement('UL');
		oUL.id = 'UL' + oParent.id.toString();		
		oParent.appendChild(oUL);
	}
	oParent = oUL;
	if (bAppend){
		oParent.appendChild(oElem);
	}else{
		if (oParent.children.length > 0){
			oParent.children[0].insertAdjacentElement('beforeBegin', oElem);
		}else{
			oParent.appendChild(oElem);
		}
	}
}

function doEditSelect(eSrc){
	undoEditSelect();	
	top.fraTopic.undoEditSelect();
	top.fraTopic.fraAction.undoEditSelect();
	
	miEditSelected = eSrc.id;
	eSrc.style.border = '1px dashed #999999';
}

function undoEditSelect(){
	if (miEditSelected != null){
		var oTmp = document.all(miEditSelected);
		if (oTmp != null) oTmp.style.border='';
		miEditSelected=null;
	}
}

//Context Menu Functions
function returnFalse(){
	return false;
}
function showMenu(){		
	var iHeight = 0;
	var oOld = moPopup.document.all('divMenu');
	mbExpanding=false;
	
	if (oOld != null){
		oOld.removeNode(true);
	}
	if (!event.ctrlKey){
		event.returnValue=false;
			
		if (mbExecuting) return;
				
		var oPopBody = moPopup.document.body;
		moPopup.document.createStyleSheet('../CSS/PopupMenu.css');
											
		var oDiv = moPopup.document.createElement('DIV');
		oDiv.id='divMenu';
		oDiv.attachEvent('onclick', menuClick);
		oDiv.attachEvent('onmouseover', doMenuOver);
		oDiv.attachEvent('onmouseout', doMenuOut);
				
		var oExpand = moPopup.document.createElement('DIV');
		oExpand.innerText='Expand All Assets';
		oDiv.appendChild(oExpand);
		
		var oCollapse = moPopup.document.createElement('DIV');
		oCollapse.innerText='Collapse All Assets';
		oDiv.appendChild(oCollapse);
		
		if (top.mbSiteConfig == true){
			var eSrc = event.srcElement;
			if (eSrc.tagName == 'SPAN'){
				doEditSelect(eSrc);
				//eSrc.click(); //Select Asset in tree				
				
				var oHR = moPopup.document.createElement('HR');
				oDiv.appendChild(oHR);
				
				var oAdd = moPopup.document.createElement('DIV');
				oAdd.innerText='Add...';
				oDiv.appendChild(oAdd);
				
				var oEdit = moPopup.document.createElement('DIV');
				oEdit.innerText='Edit...';
				oDiv.appendChild(oEdit);
				
				if (eSrc.id > 1){ //Can't delete root node
					var oDelete = moPopup.document.createElement('DIV');				
					oDelete.innerText='Delete';
					oDiv.appendChild(oDelete);
				}
				
				var oHR = moPopup.document.createElement('HR');
				oDiv.appendChild(oHR);
				
				var oCopy = moPopup.document.createElement('DIV');
				oCopy.innerText='Copy';				
				oDiv.appendChild(oCopy);
				
				if (eSrc.id > 1){ //Can't cut root node
					var oCut = moPopup.document.createElement('DIV');
					oCut.innerText='Cut';
					oDiv.appendChild(oCut);
				}
				
				if (mbCopying || mbCutting){
					if (dicAssets.Exists(eSrc.id)){
						var oDest = dicAssets(eSrc.id);
						if (mbCopying || (mbCutting && oDest.Path != moItem.Path && oDest.Path.indexOf(moItem.Path + '\\') < 0)){								
							var oHR = moPopup.document.createElement('HR');
							oDiv.appendChild(oHR);
							
							var oPasteChildT = moPopup.document.createElement('DIV');				
							oPasteChildT.innerText='Paste as Child at Top';
							oDiv.appendChild(oPasteChildT);
								
							var oPasteChildB = moPopup.document.createElement('DIV');				
							oPasteChildB.innerText='Paste as Child at Bottom';
							oDiv.appendChild(oPasteChildB);
							
							if (eSrc.id > 1){
								var oPasteB = moPopup.document.createElement('DIV');				
								oPasteB.innerText='Paste Before';
								oDiv.appendChild(oPasteB);
								
								var oPasteA = moPopup.document.createElement('DIV');				
								oPasteA.innerText='Paste After';
								oDiv.appendChild(oPasteA);
							}
						}
					}
				}								
			}
		}
		
		if (oDiv.children.length > 0){
			iHeight = (18 * oDiv.children.length) - ((oDiv.children.length-1) * 2);
			oPopBody.style.backgroundColor='white';
			oPopBody.id='bdyMenu';				
			oPopBody.appendChild(oDiv);
			oPopBody.attachEvent('onselectstart', returnFalse);
			moPopup.show(event.x + 10, event.y, 160, iHeight, document.body);
		}
		
		return false;
	}
}

function menuClick(){
	var eSrc=moPopup.document.parentWindow.window.event.srcElement;
	var iAsset = miEditSelected; //top.fraAsset.divAsset.getAttribute('SELECTEDITEM');
	mbExecuting=true;
	switch(eSrc.innerText){
		case 'Add...' :
			doAdd(iAsset);
			break;
		case 'Edit...' :
			doEdit(iAsset);
			break;
		case 'Delete' :
			doDelete(iAsset);
			break;
		case 'Expand All Assets' :
			ExpandCollapse(true);			
			mbExecuting=false;
			break;
		case 'Collapse All Assets' :
			ExpandCollapse(false);
			mbExecuting=false;		
			break;
		case 'Copy' :						
			if (moItem != null){
				var oElem = document.all(moItem.ID.toString());
				if (oElem != null && oElem.style.fontStyle=='italic'){
					oElem.style.fontStyle='';
				}
			}			
			if (dicAssets.Exists(iAsset.toString())){
				moItem = dicAssets(iAsset.toString());			
				mbCutting=false;
				mbCopying=true;
				mbExecuting=false;	
			}
			break;
		case 'Cut' :
			if (moItem != null){
				var oElem = document.all(moItem.ID.toString());
				if (oElem != null && oElem.style.fontStyle=='italic'){
					oElem.style.fontStyle='';					
				}
			}
			if (dicAssets.Exists(iAsset.toString())){
				moItem = dicAssets(iAsset.toString());
				eSrc.style.fontStyle='italic';
				mbCopying=false;		
				mbCutting=true;
				mbExecuting=false;
			}			
			break;
		case 'Paste as Child at Top' :
			//Fall Through
		case 'Paste as Child at Bottom' :
			//Fall Through
		case 'Paste Before' :
			//Fall Through
		case 'Paste After' :
			doPaste(iAsset, eSrc.innerText);
			break;
		default: //Set Executing to false if none of the items were hit
			mbExecuting=false;
			break;
	}
	undoEditSelect();
	moPopup.hide();	
}

function doMenuOver(){
	var eSrc = moPopup.document.parentWindow.window.event.srcElement;
	eSrc.className = 'over';				
}
			
function doMenuOut(){
	var eSrc = moPopup.document.parentWindow.window.event.srcElement;
	eSrc.className = '';
}

function doWait(bWait){
	if (bWait == null) bWait = false;
	
	if (bWait){
		ulAsset.style.backgroundColor = 'lightgrey';
		ulAsset.style.cursor='wait';
	}else{
		ulAsset.style.backgroundColor = '';
		ulAsset.style.cursor='';
	}
}

function CallBack(ReturnValue){
	frmAssetConfig.AssetID.value = ReturnValue;
	frmAssetConfig.txtCallBack.value='false';
	frmAssetConfig.txtHasReturnValue.value='false';
	frmAssetConfig.action='../Config/Asset/GetAsset.asp';
	frmAssetConfig.submit();
	mbExecuting=false;	
}
			
function formatOther(inArray){
	var ret = "";
	
	if (inArray[2] == 7 || inArray[2] == 8 || inArray[2] == 72 || inArray[2] == 129 || 
		inArray[2] == 130 || inArray[2] == 133 || inArray[2] == 134 || inArray[2] == 135 || 
		(inArray[2] >= 200 && inArray[2] <= 203)){
		ret="'" + inArray[1].replace(/'/g, "''") + "'";
	}else{
		ret=inArray[1];
	}
	
	if ((inArray[1] == null || inArray[1] == '') && ((inArray[3] & 32) > 0)){
		ret="null";
	}
		
	return ret;
}

function doPaste(iAsset, sType){
	if (mbCutting){
		doPasteCut(iAsset, sType);
	}else if(mbCopying){
		doPasteCopy(iAsset, sType);
	}
}

function doPasteCopy(iAsset, sType){
	if (dicAssets.Exists(iAsset.toString())){
		var aItems=(new VBArray(dicAssets.Items())).toArray();
		var iOrder = -1;

		var oItem = dicAssets(iAsset.toString()); //Destination Item
		var SQL="";
		switch(sType){
			case 'Paste as Child at Top' :				
				SQL += "exec p_fwCopyAsset " + moItem.ID + "," + oItem.ID + ",0,1"; //Insert at top
				break;	
			case 'Paste as Child at Bottom' :
				for (var i=0;i<aItems.length;i++){
					if (parseInt(aItems[i].Parent) == parseInt(oItem.ID) && aItems[i].SortOrder > iOrder){
						iOrder = aItems[i].SortOrder;				
					}
				}			
				iOrder++; //Append Asset
				
				SQL += "exec p_fwCopyAsset " + moItem.ID + "," + oItem.ID + "," + iOrder + ",0"; //Insert at bottom
				break;		
			case 'Paste Before' :
				SQL += "exec p_fwCopyAsset " + moItem.ID + "," + oItem.Parent + "," + oItem.SortOrder + ",1";
				break;		
			case 'Paste After' :
				SQL += "exec p_fwCopyAsset " + moItem.ID + "," + oItem.Parent + "," + oItem.SortOrder + ",0";
				break;
		}
	
		mbCutting=false;
		mbCopying=false;
		
		doWait(true);
		
		frmAssetConfig.GetChildren.value='true';
		frmAssetConfig.txtCallBack.value='true';
		frmAssetConfig.txtHasReturnValue.value='true';
		frmAssetConfig.sql.value = SQL;
		frmAssetConfig.txtAuditDescription.value = 'Copied Asset ID [' + moItem.ID + '-' + moItem.Name  + ']';
		frmAssetConfig.action='ExecuteSQL.asp';
		frmAssetConfig.submit();
	}
}

function doPasteCut(iAsset, sType){	
	if (dicAssets.Exists(iAsset.toString())){
		var oItem = dicAssets(iAsset.toString()); //Destination Item
	
		var oParent = document.all('LI' + oItem.ID.toString()); //Destination Parent/Sibling
		var oElem = document.all('LI' + moItem.ID.toString());  //Source Element
		var oNewElem = oElem.cloneNode(true); //Make a copy of the element
	
		var SQL = 'set nocount on;';
	
		switch(sType){
			case 'Paste as Child at Top' :				
				SQL += "Update Asset Set SortOrder = SortOrder + 1" +
					" Where AssetParent = " + oItem.ID + ";";

				SQL += "Update Asset Set SortOrder=0, AssetParent = " + oItem.ID + 
					" Where ID = " + moItem.ID + ";";
				
				InsertTreeElement(oItem.ID, oNewElem, false); //bAppend = false
				break;
			case 'Paste as Child at Bottom' :								
				SQL += "Update Asset Set SortOrder=(Select Max(SortOrder) + 1 From Asset Where AssetParent = " + oItem.ID + ")," +
					" AssetParent = " + oItem.ID + 
					" Where ID = " + moItem.ID + ";";
				
				InsertTreeElement(oItem.ID, oNewElem, true); //bAppend = true
				break;
			case 'Paste Before' :				
				SQL += "Update Asset Set SortOrder = SortOrder + 1" +
					" Where SortOrder >= " + oItem.SortOrder + " And AssetParent = " + oItem.Parent + ";";
				
				SQL += "Update Asset Set SortOrder=" + oItem.SortOrder + ", AssetParent = " + oItem.Parent + 
					" Where ID = " + moItem.ID + ";";
				
				oParent.insertAdjacentElement('beforeBegin', oNewElem);
				break;
			case 'Paste After' :				
				SQL += "Update Asset Set SortOrder = SortOrder + 1" +
					" Where SortOrder > " + oItem.SortOrder + " And AssetParent = " + oItem.Parent + ";";		
				
				SQL += "Update Asset Set SortOrder=" + (oItem.SortOrder+1) + ", AssetParent = " + oItem.Parent + 
					" Where ID = " + moItem.ID + ";";
				
				oParent.insertAdjacentElement('afterEnd', oNewElem);
				break;
		}
		SQL += "Update Asset Set AssetParent=AssetParent;";
		
		SQL += "Select " + moItem.ID + " as CutIdentity;";		
		
		if (oElem != null){
			oElem.removeNode(true);
		}	
	
		mbCutting=false;
		mbCopying=false;
		
		frmAssetConfig.GetChildren.value='true';
		frmAssetConfig.txtCallBack.value='true';
		frmAssetConfig.txtHasReturnValue.value='true';
		frmAssetConfig.sql.value = SQL;
		frmAssetConfig.txtAuditDescription.value = 'Moved Asset ID [' + moItem.ID + '-' + moItem.Name + ']';
		frmAssetConfig.action='ExecuteSQL.asp';
		frmAssetConfig.submit();
	}
}

function doAdd(iAsset){	
	if (dicAssets.Exists(iAsset.toString())){
		var args=new Array();
		var oItem = dicAssets(iAsset.toString());
		var iParent = oItem.ID; //Use current Asset for Parent of new Asset
		var aOther = oItem.Other;
		var iOrder = -1;
		
		for (var i=0;i<aOther.length;i++){
			aOther[i][1]='';			
		}
		
		args[0]='Add Child Asset to ' + oItem.Name;
		args[1] = new Array('', '', '', '', aOther); //Array(Name,Description,Image,Other);
		args[2] = top.msAbsPath; //Used for image file dialog
		var ret=window.showModalDialog('../Config/Asset/Dialog.asp',args,'dialogWidth:220px;dialogHeight:50px;help:no;status:no;resizable:no;');
			
		if (ret != null){			
			var OtherNames='';
			var OtherValues='';
			
			for (var i=0; i<ret[4].length; i++){
				OtherNames += ', ' + ret[4][i][0];
				OtherValues += ", " + formatOther(ret[4][i]);
			}
			var aItems=(new VBArray(dicAssets.Items())).toArray();
			for (var i=0;i<aItems.length;i++){
				if (parseInt(aItems[i].Parent) == parseInt(iParent) && aItems[i].SortOrder > iOrder){
					iOrder = aItems[i].SortOrder;				
				}
			}
			
			iOrder++; //Append Asset
			
			var SQL = "Set nocount on;Insert Asset (AssetParent, Name, Description, SortOrder, Image, Code" + OtherNames + ") Values (" + 
				iParent + ",'" + ret[0].replace(/'/g, "''") + 
				"','" + ret[1].replace(/'/g, "''") + "'," + 
				iOrder + ",'" + ret[2] + "','" + ret[3].replace(/'/g, "''") + "'" + OtherValues + ");";
				
			SQL += "Select Scope_Identity() as NewIdentity;";
			
			frmAssetConfig.GetChildren.value='false';
			frmAssetConfig.txtCallBack.value='true';
			frmAssetConfig.txtHasReturnValue.value='true';
			frmAssetConfig.sql.value = SQL;
			frmAssetConfig.txtAuditDescription.value = 'Added Asset [' + ret[0] + ']';
			frmAssetConfig.action='ExecuteSQL.asp';		
			frmAssetConfig.submit();															
		}else{
			mbExecuting = false;
		}
	}
}

function doEdit(iAsset){
	if (dicAssets.Exists(iAsset.toString())){
		var args=new Array();
		var oItem = dicAssets(iAsset.toString());
		var iParent = oItem.Parent;
		var aOther = oItem.Other;
		var iOrder = -1;				
		
		args[0]='Edit ' + oItem.Name;
		args[1] = new Array(oItem.Name, oItem.Description, oItem.Image, oItem.Code, aOther); //Array(Name,Description,Image,Other);			
		args[2] = top.msAbsPath; //Used for image file dialog
		var ret=window.showModalDialog('../Config/Asset/Dialog.asp',args,'dialogWidth:220px;dialogHeight:50px;help:no;status:no;resizable:no;');
			
		if (ret != null){
			var Others='';
			
			for (var i=0; i<ret[4].length; i++){
				Others += "," + ret[4][i][0] + "=" + formatOther(ret[4][i]);					
			}
			
			var SQL = "Set nocount on;Update Asset Set AssetParent = " + iParent + 
					",Name = '" + ret[0].replace(/'/g, "''") + 
					"',Description = '" + ret[1].replace(/'/g, "''") + 
					"',SortOrder = " + oItem.SortOrder + 
					",Image = '" + ret[2] + 
					"',Code = '" + ret[3].replace(/'/g, "''") + "'" + Others + 
				" Where ID = " + oItem.ID + ";";
				
			SQL += "Select " + oItem.ID + " as EditIdentity;";

			frmAssetConfig.GetChildren.value='false';
			frmAssetConfig.txtCallBack.value='true';
			frmAssetConfig.txtHasReturnValue.value='true';
			frmAssetConfig.sql.value = SQL;
			frmAssetConfig.txtAuditDescription.value = 'Changed Asset ID [' + oItem.ID + ' From ' + oItem.Name + ' To ' + ret[0] + ']';
			frmAssetConfig.action='ExecuteSQL.asp';		
			frmAssetConfig.submit();												
		}else{
			mbExecuting = false;
		}
	}
}

function doDelete(iAsset){
	if (dicAssets.Exists(iAsset.toString())){		
		var oItem = dicAssets(iAsset.toString());						
				
		var ret=window.confirm('Are you sure you want to delete Asset [' + oItem.Name + 
			'] and ALL of its children? THIS CANNOT BE UNDONE!');			
		if (ret){																	
			
			var SQL = "Set nocount on;Delete From Asset Where ID =" + oItem.ID 
				+ " or a_Path like '" + oItem.Path.replace(/\//g,'\\') + "\\%'";
			
			SQL += "Update Asset Set SortOrder = SortOrder - 1 Where AssetParent = " + 
				oItem.Parent + " And SortOrder > " + oItem.SortOrder + ";";
			SQL += "Select " + oItem.Parent + " as DeleteIdentity;";
			
			//Get List Item (LI) from Asset tree, delte it and all of its children
			var oElem = document.all('LI' + oItem.ID.toString());			
			var oParent = oElem.parentElement;
			if (oElem != null){			
				oElem.removeNode(true);
				//Handle when Parent no longer has any children after node is deleted
				if (oParent.children.length == 0){
					oElem = oParent;
					oParent = document.all('LI' + oItem.Parent.toString());
					oElem.removeNode(true);
					oParent.className = '';
					oParent.style.listStyleImage='none';					
				}
				/*if (divAsset.getAttribute("SELECTEDITEM") == divAsset.getAttribute("CURRENTITEM")){
					divAsset.setAttribute("CURRENTITEM", "");
				}*/
				//Remove self and children from dictionary object
				var sPath = oItem.Path;
				var aItems=(new VBArray(dicAssets.Items())).toArray();
				dicAssets.Remove(oItem.ID.toString());
								
				for (var i=0; i<aItems.length; i++){
					if (aItems[i].Path.indexOf(sPath + '\\') > 0){
						dicAssets.Remove(aItems[i].ID.toString());
					}
				}
				
				if (miSelected == miCurrent){
					miCurrent = miSelected;
				}
				miSelected = null; //divAsset.setAttribute("SELECTEDITEM", "");				
				
				frmAssetConfig.GetChildren.value='true';
				frmAssetConfig.txtCallBack.value='true';
				frmAssetConfig.txtHasReturnValue.value='true';
				frmAssetConfig.sql.value = SQL;
				frmAssetConfig.txtAuditDescription.value = 'Deleted Asset ID [' + oItem.ID + '-' + oItem.Name + ']';
				frmAssetConfig.action='ExecuteSQL.asp';		
				frmAssetConfig.submit();
			}															
		}else{
			mbExecuting=false;
		}
	}
}
