/*
<WebFramework>
	<FilePath>/Scripts/Asset.js</FilePath>
	<Description>This Script file is used to create and navigate the Asset tree.</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="9/30/2004" Name="Sean Pardue" Major="5" Minor="0" Revision="2">
			Changed the way the Asset Tree is drawn. It will only load to the initial depth and then will add other elements as the tree is expanded.
			Also, added function externalClick() to accomodate other pages needing to select and Asset.
		</Revision>
		<Revision Date="10/5/2004" Name="Sean Pardue" Major="5" Minor="0" Revision="3">
			Added HasChildren property to Asset class to help speed up drawing of tree
		</Revision>
		<Revision Date="10/14/2004" Name="Sean Pardue" Major="5" Minor="0" Revision="4">
			Added Asset Code field to the Asset tree
		</Revision>
		<Revision Date="12/29/2004" Name="Sean Pardue" Major="5" Minor="0" Revision="5">
			Fixed deleting of images from asset item in AddTreeElement().
			Added spacer.gif to Asset item in AddTreeElement() to keep spacing consistant.
		</Revision>
		<Revision Date="1/11/2005" Major="5.0" Minor="0" Revision="5">Initial Release</Revision>
		<Revision Date="2/4/2005" Major="5.0" Minor="1" Revision="5" 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/14/2005" Major="5.0" Minor="2" Revision="5" Name="Version Utility">
			Fixed problem with deleting Assets
		</Revision>
		<Revision Date="5/24/2005" Major="5.0" Minor="3" Revision="5" Name="Version Utility">Major and Minor revisions automatically set by utility.</Revision>
		<Revision Date="6/28/2005" Major="5.0" Minor="3" Revision="6" Name="Sean Pardue">
			Added On Demand Load from Database.
		</Revision>
		<Revision Date="8/4/2005" Major="5.1" Minor="0" Revision="6" 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. Put code into OnDemandLoadCallBack to Call ExpandCollapse function
		</Revision>
		<Revision Date="3/14/2006" Major="5.1" Minor="0" Revision="8" Name="David Buckingham">
			Made externalClick() work.  Now requires the Asset path to be passed.
		</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 dicAssets = new ActiveXObject("Scripting.Dictionary");
var msOpen = "../images/system/minus.gif";
var msClosed = "../images/system/plus.gif";
var miSelected = null;
var miEditSelected = null;
var miCurrent = null;
var mbExpanding=false;
var mbExternalClickDoDemandLoad = false;
var miExternalClickID = null;

function Asset(){
	var ID;
	var Parent;
	var Path;
	var Verbose;
	var Name;
	var Description;
	var Depth;
	var Image;
	var SortOrder;
	var Code;
	var HasChildren;
	var Other;
	var State;		
}

function NewItem(ID, Parent, Path, Verbose, Name, Description, Depth, Image, SortOrder, Code, HasChildren, Other){
	var oAsset=new Asset();
		
	oAsset.ID=ID.toString();
	oAsset.Parent=Parent;
	oAsset.Path=Path;
	oAsset.Verbose=Verbose;
	oAsset.Name=Name;
	oAsset.Description=Description;
	oAsset.Depth=Depth;
	oAsset.Image=Image;
	oAsset.SortOrder=SortOrder;
	oAsset.Code=Code;
	oAsset.HasChildren=HasChildren;
	oAsset.State='Update';
	oAsset.Other=Other; //Any user defined fields
	
	return oAsset;
}

function AddToDic(ID, Parent, Path, Verbose, Name, Description, Depth, Image, SortOrder, Code, HasChildren, Other){		
	var oAsset=NewItem(ID, Parent, Path, Verbose, Name, Description, Depth, Image, SortOrder, Code, HasChildren, Other);
	
	if (dicAssets.Exists(ID.toString())){
		dicAssets(ID.toString()) = oAsset;
	}else{					
		dicAssets.Add(oAsset.ID,oAsset);		
	}
}

function DrawTree(){
	var oItems=(new VBArray(dicAssets.Items())).toArray();		
		
	for (var i=0;i<oItems.length;i++){
		AddTreeElement(oItems[i], true, true);
	}	
}

function AddTreeElement(oItem, bUseStartup, bSkipOrderCheck){
	var oSpanItem = document.all(oItem.ID.toString());
	if (bUseStartup == null) bUseStartup = false;	
	if (bSkipOrderCheck == null) bSkipOrderCheck = false;
	
	if (bUseStartup){		
		if (oItem.Depth > miStartupLevel) return;
	}
	
	if (oSpanItem != null){ //Update the item if it Exists
		oSpanItem.innerText = oItem.Name;
		oSpanItem.title = oItem.Description;
		
		var oImage = document.all('IMG' + oItem.ID);		
		if (oImage == null){
			oImage=document.createElement("IMG");
			oImage.align='absmiddle';
			oImage.id = 'IMG' + oItem.ID;
			oSpanItem.insertAdjacentElement('beforeBegin', oImage);				
		}
		
		if (oItem.Image != ''){						
			oImage.src=top.msAbsPath + oItem.Image;
			oImage.style.width='16px';
			oImage.style.height='16px';
		}else{						
			oImage.src=top.msAbsPath + '/images/system/spacer.gif';
			oImage.style.width='1px';
			oImage.style.height='16px';		
		}
	}else{
		var oLI=document.createElement('LI');
		var oSpan=document.createElement("SPAN");
		var oUL=null;	
		var oImage=null;
		
		oImage=document.createElement("IMG");
		oImage.align='absmiddle';
		oImage.id = 'IMG' + oItem.ID;
		
		if (oItem.Image != ''){
			oImage.src=top.msAbsPath + oItem.Image;
			oImage.style.width='16px';
			oImage.style.height='16px';
		}else{
			oImage.src=top.msAbsPath + '/images/system/spacer.gif';
			oImage.style.width='1px';
			oImage.style.height='16px';
		}
		
		if (oItem.Parent > -1){
			var oParent=document.all('UL' + oItem.Parent.toString());
		}else{
			var oParent=document.all('ulAsset');		
		}
		
		oLI.id = 'LI' + oItem.ID.toString();
		oSpan.id = oItem.ID.toString();					
			
		oSpan.innerText=oItem.Name;	
		oSpan.title=oItem.Description;
	
		if (oImage != null){
			oLI.appendChild(oImage);
		}
		oLI.appendChild(oSpan);
		
		if (oItem.HasChildren > 0){
			oLI.className = 'clsHasKids';
			
			oUL=document.createElement('UL');
			oUL.id = 'UL' + oItem.ID.toString();			
			oLI.appendChild(oUL);
			
			if (bUseStartup){
				if (oItem.Depth >= miStartupLevel - 1){
					oUL.style.display='none';			
					oLI.style.listStyleImage='url(' + msClosed + ')';
				}else{
					oUL.style.display='list-item';
					oLI.style.listStyleImage='url(' + msOpen + ')';
				}
			}else{
				oUL.style.display='none';
				oLI.style.listStyleImage='url(' + msClosed + ')';
			}
		}else{
			oLI.style.listStyleImage = 'url(../images/system/spacer.gif)';	
		}
		
		if (oParent != null){			
			var oInsertElem=null;
			var iInsertOrder=-1;
			
			if (!bSkipOrderCheck){
				for (var i=0;i<oParent.children.tags('LI').length;i++){
					var sKey = oParent.children.tags('LI')[i].id.toString().replace('LI','');
					
					if (dicAssets.Exists(sKey)){
						var oFind = dicAssets(sKey);
						if (oItem.SortOrder < oFind.SortOrder){
							if (iInsertOrder == -1 || (oFind.SortOrder < iInsertOrder)){
								iInsertOrder = oFind.SortOrder;
								oInsertElem = oParent.children.tags('LI')[i];
							}
						}
					}
				}
			}
			
			if (oInsertElem != null){
				oInsertElem.insertAdjacentElement('beforeBegin', oLI);
			}else{
				oParent.insertAdjacentElement('beforeEnd',oLI);
			}
		}
	}
}

function GetChildElem(eSrc, sTagName) {    
  for (var i = 0; i < eSrc.children.length; i++) {
    if (sTagName == eSrc.children[i].tagName) return eSrc.children[i];
  }
    
  return false;
}

function GetParentElem(eSrc,sTagName) {
	if (eSrc != null){
		while (eSrc.parentElement != null) {
			eSrc=eSrc.parentElement;
			if (eSrc.tagName == sTagName) {
				return eSrc;
			}
		}
	}
}

function ItemClick(oItem) {	
	event.cancelBubble = true;
	OnGetFocus();
	top.fraTopic.msAsset = oItem.ID.toString();
	top.fraTopic.RefreshTopic(oItem);	
}

function clickFolder() {
	event.cancelBubble=true;
	var eSrc = event.srcElement;
	var eChild;
  
	if (eSrc.tagName == 'SPAN') {
		if (dicAssets.Exists(eSrc.id.toString()) ){
			var oItem = dicAssets(eSrc.id.toString());
			
			ItemClick(oItem);
		}
	}else if ( (eChild = GetChildElem(eSrc, 'UL')) ) {
		if (eSrc.offsetLeft > event.x && (eSrc.offsetTop + 10) >= event.y) {
			if (eChild.style.display == "none"){
				eChild.style.display = 'list-item';
				eSrc.style.listStyleImage = 'url(' + msOpen + ')';
			}else{
				eChild.style.display = 'none';
				eSrc.style.listStyleImage = 'url(' + msClosed + ')';
			}
							
			AddNextTreeElement(eChild);					
		}
	}
}

function OnDemandLoadCallBack(iID){
	var aItems=(new VBArray(dicAssets.Items())).toArray();				
	for (var i=0;i<aItems.length;i++){
		if (aItems[i].Parent == iID){ //Is this a child element						
			AddTreeElement(aItems[i], false, true); //Add This Child element
		}
	}	
	
	if (mbExpanding){
		ExpandCollapse(true);		
	}
	
	// Handle External Click Callbacks
	if (mbExternalClickDoDemandLoad){
	    var oElem = null;
	    oElem = document.all(miExternalClickID.toString());

	    if (oElem != null){
		    oElem.click();
	    }
	    
	    mbExternalClickDoDemandLoad = false;
	}
}

function doDemandLoad(iID){
	frmAssetConfig.AssetID.value = iID;
	frmAssetConfig.action = 'AssetOnDemand.asp';	
	frmAssetConfig.submit();
}

function AddNextTreeElement(eChild){
	if (eChild.children.length == 0){
		var iID = parseInt(eChild.id.replace('UL', ''));		
		doDemandLoad(iID);		
	}
}

function ExpandCollapse(bExpand) {	
	var cElems = document.all.tags('LI');
	var eChild;
			
	for (var i = 0; i< cElems.length; i++){
		if ( (eChild = GetChildElem(cElems[i], 'UL')) ) {						
			if(bExpand) {	
				
				if(cElems[i].style.listStyleImage != "url(" + msOpen + ")") {
					cElems[i].style.listStyleImage = "url(" + msOpen + ")";				
				}
				eChild.style.display = "list-item";
				
				mbExpanding = true;
				AddNextTreeElement(eChild);				
			}else{								
				eChild.style.display = "none";
				if( cElems[i].style.listStyleImage != "url(" + msClosed + ")" ) {
					cElems[i].style.listStyleImage = "url(" + msClosed + ")";				
				}
			}
		}
	}	
}

function ExpandCurrent(iID){
	if (dicAssets.Exists(iID.toString())){
		var oItem = dicAssets(iID.toString());
		
		var oUL = document.all('UL' + oItem.Parent);
		var oLI = document.all('LI' + oItem.Parent);
		
		if (oUL != null && oLI != null){
			if (oUL.style.display == "none"){ 
				oUL.style.display = "list-item";	
				if (oLI.style.listStyleImage != "url(" + msOpen + ")")
					oLI.style.listStyleImage="url(" + msOpen + ")";
			}
			if (oItem.Parent != null && oItem.Parent > -1)
				ExpandCurrent(oItem.Parent);	
		}
	}	
}

function OnGetFocus() {
	var eSrc = window.event.srcElement;	
	//var sItem = miSelected.toString(); //divAsset.getAttribute("SELECTEDITEM");
	
	if (miSelected != null){
		var oItem=document.all(miSelected.toString());
		if (oItem.className != "clsCurrent") oItem.className="clsLoseFocus";		
	}
	
	if (eSrc.className!="clsCurrent") eSrc.className="clsGetFocus";
	miSelected = eSrc.id; //divAsset.setAttribute("SELECTEDITEM", eSrc.id);		
		
	if (ulAsset.style.display != "none") {
		ExpandCurrent(eSrc.id);		
		eSrc.scrollIntoView(false);
		eSrc.blur();
	}
	
	undoEditSelect();
}

function externalClick(iID, sPath){
    if (dicAssets.Exists(iID.toString())){
		var oElem = document.all(iID.toString());
		if (oElem != null){
			oElem.click();
		}
	}
	else{
	    var aItems=(new VBArray(dicAssets.Items())).toArray();				

	    for (var i=0;i<aItems.length;i++){
		    if (sPath.indexOf(aItems[i].Path)> -1){
			    var eChild = document.all('UL' + aItems[i].ID);
			    AddNextTreeElement(eChild);
			    
			    miExternalClickID = iID;
			    mbExternalClickDoDemandLoad = true;
		    }
	    }
	}
}
