// Copyright © 2005-2006 Water Street Web Solutions, LLC.  All rights reserved. --
// ----------------------------------------------------------------------------------
// Water Street Web Solutions (WSWS) software and code [both binary and source 
// (if released)] (Software) is intellectual property owned by WSWS and is copyright 
// of WSWS in all countries in the world, and ownership remains with WSWS.
//
// You (Licensee) may use the WSWS Software and install it only in accordance with 
// use and licensing agreements you have signed with WSWS.  Licenses are distributed 
// only by WSWS. Please send an email to info@waterstreetusa.com for more information.
//
// If you do not have a valid signed license agreement, you may not use, copy or
// distribute the Software for any purpose.
//
// This copyright notice may not be removed or altered or it will constitute a
// violation of any license agreements.
// ----------------------------------------------------------------------------------

window.offscreenBuffering = true;
var FullTree;
var busy = false;
var FileBusy = false;
var FolderBusy = false;
var ajax;
var curfileurl = "";
var gurtTree;
var CanRename;
var CanDelete;
var curindex;

function OnCreateFolder()
{
	var gitem = GetGTreeItem(curindex);
	var branch = GetFolderInfo(curindex);
	var foldername = "New Folder";
	var folderpath = GetFolderPath(curindex) + foldername;

	//Attempt to create the new folder on the server
	ajax =  GetRequestObject();
	//url = document.URL + "?" + qs;
	url = document.URL;
	qs = "FMCmd=createfolder&folder=" + UrlEncode(folderpath) + "\\";
	ExecuteHttpPost(ajax, url, qs)	
	success = ajax.responseText;
	ReleaseRequestObject(ajax);
	if(success == "True")
	{
			
		//Add to internal tree
		var subfolders = branch[1];
		var bindex = subfolders.length;
		subfolders[bindex] = new Array();
		var newfolder = subfolders[bindex]
		var folderct = GetFolderCt(subfolders);
		var findex;
		
		if(curindex == '-1')
			findex = (folderct-1) + '';
		else
			findex = curindex + ',' + (folderct-1);
		
		newfolder[0] = foldername;
		newfolder[1] = new Array();
		for(var i=2;i<branch.length;i++) //Copy permissions from parent into the new folder
		{
			newfolder[i] = branch[i];
		}
		
		//Add to gurt tree
		gAddItem(gitem, [foldername, "javascript:OnFolderClick('" + findex + "')"]);
		SelectGTreeItem(findex);
		
		//Switch into rename mode;
		OnRenameFolder();
	}
	else
	{
		var msg = "Unable to create a new folder. ";
		if(success != "False")
			msg += success; 
		alert(msg);
	}
	
}

function OnToggleAllFiles(value)
{
	var filetablebody = document.getElementById('FileTableBody');
	if(!filetablebody)
		{alert("Couldn't find the file table body, please click the refresh button.");return;}
		
	var objs = filetablebody.getElementsByTagName('input');
	var msg = "";
	for(var i=0;i<objs.length;i++)
	{	
		var obj = objs[i];
		if(obj.id.substring(0, 2) == "ck")
		{
			obj.checked = value;
		}
	}
}
function OnDeleteClick()
{
	indices = GetCheckedFiles()
	if(indices)
	{
		if(indices.length == 1)
		{
			fileinfo = GetFileInfo(indices[0]);
			if(!confirm("Are you sure you wish to delete the file '" + fileinfo[0] + "'?"))
				return;
		}
		else
		{
			if(!confirm("Are you sure you wish to delete these " + indices.length + " files?"))
				return;
		}
		
		var msg = "";
		ajax =  GetRequestObject();		
		for(var i=0;i<indices.length;i++)
		{
			index = indices[i];
			fileinfo = GetFileInfo(index);
			//attempt to delete from server
			url = document.URL;
			qs = "FMCmd=delete&file=" + UrlEncode(fileinfo[4]);
			ExecuteHttpPost(ajax, url, qs)
			success = ajax.responseText;
			ReleaseRequestObject(ajax);
			if(success == "True")
			{
				//Remove element from internal tree
				fileinfo[0] = "";
				
				//Remove element from file table display					
				var row = document.getElementById('row' + index)
				if(!row)
					{alert("Couldn't find the file row: " + index + ", please click the refresh button.");return;}
				
				row.parentElement.deleteRow(row.rowIndex-1);
				
				ClearDisplayInfo();
			}
			else
			{
				msg += "Could not delete: " + fileinfo[0] + "\n" + success;
			}
			
		}
		AlternateFileRows();
		if(msg != "")
			alert(msg);
	}
}

function OnDeleteFolder()
{
	var index = curindex;
	var folderpath = GetFolderPath(index);
	var foldername = GetFolderName(index);
	
	
	//Confirm
	if(!confirm("Are you sure you wish to delete the folder: \"" + foldername + "\"?"))
		return;
				
	//attempt to delete from server
	//url = document.URL + "?FMCmd=deletefolder&folder=" + UrlEncode(folderpath);
	ajax =  GetRequestObject();
	url = document.URL;
	qs = "FMCmd=deletefolder&folder=" + UrlEncode(folderpath);
	ExecuteHttpPost(ajax, url, qs)
	success = ajax.responseText;
	ReleaseRequestObject(ajax);
	if(success == "True")
	{
		var item = GetGTreeItem(index);
		gRemoveItem(item);
		SelectGTreeItem('-1');
		ClearDisplayInfo();
	}
	else
	{
		var msg = "Unable to delete folder. ";
		if(success != "False")
			msg += success; 
		alert(msg);
	}
}


function OnRenameClick()
{
	indices = GetCheckedFiles()
	if(indices)
	{			
		var btnDelete = document.getElementById(clientprefix + "btnDelete");
		var btnRename = document.getElementById(clientprefix + "btnRename");
		var btnUpdate = document.getElementById(clientprefix + "btnUpdate");
		var btnCancel = document.getElementById(clientprefix + "btnCancel");
		
		FileBusy = true;
		
		//preserve old values;
		if(btnDelete.style.display != "none")
			CanDelete = true;
		if(btnRename.style.display != "none")
			CanRename = true;
		
		btnDelete.style.display = "none";
		btnRename.style.display = "none";
		btnUpdate.style.display = "";
		btnCancel.style.display = "";
		
		for(var i=0;i<indices.length;i++)
		{
			index = indices[i];
			var displayfile = document.getElementById("FileName" + index);
			var editfile = document.getElementById("FileNameEdit" + index);
			displayfile.style.display = "none";
			editfile.style.display = "";		
		}
	}
}

function OnCancelClick()
{
	indices = GetCheckedFiles(true) //Get the indexes and turn the check boxes off
	if(indices)
	{					
		for(var i=0;i<indices.length;i++)
		{
			index = indices[i];
			var displayfile = document.getElementById("FileName" + index);
			var editfile = document.getElementById("FileNameEdit" + index);
			
			var fileinfo = GetFileInfo(index);
			
			editfile.value = fileinfo[0]; //change the text box back to what it was originally
			//Swap views back into place
			displayfile.style.display = "";
			editfile.style.display = "none";		
		}
	}
	
	var btnDelete = document.getElementById(clientprefix + "btnDelete");
	var btnRename = document.getElementById(clientprefix + "btnRename");
	var btnUpdate = document.getElementById(clientprefix + "btnUpdate");
	var btnCancel = document.getElementById(clientprefix + "btnCancel");
	
	if(CanDelete)
		btnDelete.style.display = "";
	if(CanRename)
		btnRename.style.display = "";
		
	btnUpdate.style.display = "none";
	btnCancel.style.display = "none";
	FileBusy = false;
}

function OnUpdateClick()
{
	indices = GetCheckedFiles(true) //Get the indexes and turn the check boxes off
	if(indices)
	{				
		var msg = "";
		ajax =  GetRequestObject();
		for(var i=0;i<indices.length;i++)
		{
			index = indices[i];
			var displayfile = document.getElementById("FileName" + index);
			var editfile = document.getElementById("FileNameEdit" + index);
			
			var fileinfo = GetFileInfo(index);
			
			//Change actual file on server
			//url = document.URL + "?FMCmd=rename&file=" + fileinfo[5] + "&newname=" + editfile.value;
			fi = ReplaceString(fileinfo[4], "'", "||sq||");
			nn = ReplaceString(editfile.value, "'", "||sq||");
			//url = document.URL + "?FMCmd=rename&file=" + UrlEncode(fi) + "&newname=" + UrlEncode(nn);
			//url = document.URL + "?FMCmd=rename&file=" + UrlEncode(fileinfo[4]) + "&newname=" + UrlEncode(editfile.value);			
			url = document.URL;
			qs = "FMCmd=rename&file=" + UrlEncode(fi) + "&newname=" + UrlEncode(nn);
			ExecuteHttpPost(ajax, url, qs)			
			success = ajax.responseText;
			ReleaseRequestObject(ajax);
			if(success == "True")
			{
				//Change local variables
				oldname = fileinfo[0];
				var re = new RegExp(fileinfo[0], "g");
				var newname = editfile.value;
				displayfile.innerHTML = displayfile.innerHTML.replace(re, newname);
				fileinfo[0] = editfile.value;
				fileinfo[4] = fileinfo[4].replace(re, newname);
				fileinfo[5] = fileinfo[5].replace(re, newname);
				// update the encode url for download
				fi = UrlEncode(oldname);
				fi = ReplaceString(fi, "%20", "+");
				fi = ReplaceString(fi, "'", "||sq||");
				//alert(fi);
				var reUrl = new RegExp(RegExEscape(fi), "gi");
				var newnameEncoded = UrlEncode(newname);
				newnameEncoded = ReplaceString(newnameEncoded, "'", "||sq||");
				displayfile.innerHTML = displayfile.innerHTML.replace(reUrl, newnameEncoded);

			}
			else
			{
				msg += "Could not rename the file: " + fileinfo[0] + "\n" + success + "\n";
				//Change the edit box back
				editfile.value = fileinfo[0];
			}
			//Swap views back into place
			displayfile.style.display = "";
			editfile.style.display = "none";		
		}
		if(msg != "")
		{
			alert(msg);
		}
	}
	
	var btnDelete = document.getElementById(clientprefix + "btnDelete");
	var btnRename = document.getElementById(clientprefix + "btnRename");
	var btnUpdate = document.getElementById(clientprefix + "btnUpdate");
	var btnCancel = document.getElementById(clientprefix + "btnCancel");
	
	if(CanDelete)
		btnDelete.style.display = "";
	if(CanRename)
		btnRename.style.display = "";
		
	btnUpdate.style.display = "none";
	btnCancel.style.display = "none";
	FileBusy = false;
}
function OnRenameFolder()
{
	var FolderNameDisplay = document.getElementById('FolderName');
	var FolderNameEdit = document.getElementById('spnFolderNameEdit');
	var RenameFolder = document.getElementById(clientprefix + 'lnkRenameFolder');
	var UpdateFolderName = document.getElementById(clientprefix + 'lnkUpdateFolderName');
	var txtFolderNameEdit = document.getElementById(clientprefix + 'txtFolderNameEdit');
	if(FolderNameDisplay && FolderNameEdit && RenameFolder && UpdateFolderName && txtFolderNameEdit)
	{
		FolderBusy = true;
		//swap display and edit view
		FolderNameDisplay.style.display = "none";
		FolderNameEdit.style.display = "";
		RenameFolder.style.display = "none";
		UpdateFolderName.style.display = "";		
		txtFolderNameEdit.focus();
	}
	else
	{
		alert("Problem finding rename folder elements, please click the refresh button.");
	}
}

function OnUpdateFolderName(supressAlert, justCancel)
{
	var FolderNameDisplay = document.getElementById('FolderName');
	var FolderNameEdit = document.getElementById('spnFolderNameEdit');
	var txtFolderNameEdit = document.getElementById(clientprefix + 'txtFolderNameEdit');
	var RenameFolder = document.getElementById(clientprefix + 'lnkRenameFolder');
	var UpdateFolderName = document.getElementById(clientprefix + 'lnkUpdateFolderName');
	if(FolderNameDisplay && FolderNameEdit && RenameFolder && UpdateFolderName && txtFolderNameEdit)
	{
		var folderpath = GetFolderPath(curindex);
		var foldername = GetFolderName(curindex);
		var newname = txtFolderNameEdit.value;

		success = false;
		// if this is not a cancel request, hit the server to change the folder name
		if (justCancel != null && !justCancel)
		{
			ajax =  GetRequestObject();
			//Attempt to rename the file on the sever
			//url = document.URL + "?FMCmd=renamefolder&folder=" + UrlEncode(folderpath) + "&newname=" + UrlEncode(newname);		
			url = document.URL;
			qs = "FMCmd=renamefolder&folder=" + UrlEncode(folderpath) + "&newname=" + UrlEncode(newname);
			ExecuteHttpPost(ajax, url, qs)
			success = ajax.responseText;
			ReleaseRequestObject(ajax);
		}
		if(success == "True")
		{
			
			FolderNameDisplay.innerHTML = txtFolderNameEdit.value;
			
			//Update internal tree
			SetFolderName(curindex, newname);
			var newpath = GetFolderPath(curindex)
			//Update child files information
			var items = GetFolderInfo(curindex);
			RenameFilesByTree(items, folderpath, newpath);
			
			//Update Gurt Tree
			var item = GetGTreeItem(curindex);
			item.sSrc = newname;
			
			//Refresh the tree view(perhaps a bit crude, but no refresh function in the object)
			gHideItem(item, false);
			gHideItem(item, true);
			gSelectItem(item);
			
			//Update the hidden current directory field
			var curdirectory = document.getElementById('hdnCurrentDirectory');
			if(curdirectory)
				curdirectory.value = newpath;
		}
		else
		{
			//change edit box's value back to what it was
			txtFolderNameEdit.value = FolderNameDisplay.innerHTML;
			var msg = "Unable to change folder name. ";
			if(success != "False")
				msg += success;
			if (!supressAlert)
				alert(msg);
		}

		//swap display and edit view
		FolderNameDisplay.style.display = ""; // basic text folder name
		FolderNameEdit.style.display = "none"; // a span containing folder edit stuff
		RenameFolder.style.display = ""; // link to rename folder name
		UpdateFolderName.style.display = "None"; // link to update folder name
		ClearDisplayInfo();
	}
	else
	{
		alert("Problem finding rename folder elements, please click the refresh button.");
	}
	FolderBusy = false;
}

function OnFolderClick(index)
{
	//if(FileBusy) OnUpdateClick();
	if(FileBusy) OnCancelClick(); // if the operation is interrupted don't update
	if(FolderBusy) OnUpdateFolderName(true, true); // just cancel, no alert
	//index is a string containing the index path to the folder under question
	//if index = 0,1 then we want the contents of the second folder of the first folder in the tree(zero base)
	var curdirectory = document.getElementById('hdnCurrentDirectory');
	var curdirectoryindex = document.getElementById('hdnCurrentDirectoryIndex');
	var filetablebody = document.getElementById('FileTableBody');
	var candownload = false;
	if(!filetablebody)	{alert("Couldn't find the file table body, please click the refresh button.");return;}
	if(!curdirectory)	{alert("Couldn't find the current directory field, please click the refresh button.");return;}
	if(!curdirectoryindex)	{alert("Couldn't find the current directory index field, please click the refresh button.");return;}
	
	curdirectory.value = GetFolderPath(index);
	curdirectoryindex.value = index;
	curindex = index;
	
	ClearDisplayInfo();
	
	//Check permissions
	var di = GetFolderInfo(index);
	if(di)
	{
		var btnDelete = document.getElementById(clientprefix + 'btnDelete');
		var btnRename = document.getElementById(clientprefix + 'btnRename');
		var btnRenameFolder = document.getElementById(clientprefix + 'lnkRenameFolder');
		var btnDeleteFolder = document.getElementById(clientprefix + 'btnDeleteFolder');
		var btnCreateFolder = document.getElementById(clientprefix + 'btnCreateFolder');
		var pnlFileUpload = document.getElementById('pnlFileUpload');
		if(btnDelete && btnRename && pnlFileUpload && btnDeleteFolder && btnRenameFolder && btnCreateFolder)
		{
			//Delete File Permission
			if(di[2] == 'True')
				btnDelete.style.display = '';
			else
				btnDelete.style.display = 'none';
			
			//Edit File Permission
			if(di[3] == 'True')
				btnRename.style.display = '';
			else
				btnRename.style.display = 'none';
			
			//Create File Permission
			if(di[4] == 'True')
				pnlFileUpload.style.display = '';
			else
				pnlFileUpload.style.display = 'none';	
			
			//Download File Permission
			if(di[5] == 'True')
				candownload = true;
			else
				candownload = false;
				
			//Create Folder Permission
			if(di[6] == 'True')
				btnCreateFolder.style.display = "";
			else
				btnCreateFolder.style.display = "none";
			
			//Delete Folder Permission
			if(di[7] == 'True' && index != '-1') //Regardless of permissions, you cant delete the root node.
				btnDeleteFolder.style.display = "";
			else
				btnDeleteFolder.style.display = "none";
				
			//Edit Folder Permission
			if(di[8] == 'True' && index != '-1') //Regardless of permissions, you cant rename the root node.
				btnRenameFolder.style.display = "";
			else
				btnRenameFolder.style.display = "none";
		}
		else
			alert('Error finding some elements, please click the refresh button.');
			
	}
	
	//Clear out existing filetable rows.
	while(filetablebody.rows.length)
		filetablebody.deleteRow(filetablebody.rows.length-1);
					

	//Insert new rows
	var oRow;
	var oCell;
	var a;
	var files = GetFolderContents(index);
	var filename;

	var folderinfo = GetFolderInfo(index);
	var FolderNameDisplay = document.getElementById('FolderName');
	var FolderNameEdit = document.getElementById(clientprefix + 'txtFolderNameEdit');
	if(FolderNameDisplay && FolderNameEdit)
	{
			FolderNameDisplay.innerHTML = folderinfo[0];
			FolderNameEdit.value = folderinfo[0];
	}
	
	// if files are not viewable
	if (di[9] == 'False' && topPermission == 'false')
	{
		var lblNoFiles = document.getElementById('lblNoFiles');
		if (lblNoFiles) 
		{
			lblNoFiles.style.display = "";
			lblNoFiles.innerHTML = '[files are hidden]';
		}
	}
	
	// if files are viewable
	else if(files.length > 0)
	{
		var lblNoFiles = document.getElementById('lblNoFiles');
		if(lblNoFiles) lblNoFiles.style.display = "none";
		for(i=0;i<files.length;i++)
		{
			if(files[i][0] != "")
			{
				fileindex = index + "," + i;
				oRow = filetablebody.insertRow(filetablebody.rows.length);
				oRow.id = "row" + fileindex;
				//Filesize
				oCell = oRow.insertCell(0);
				oCell.innerHTML = files[i][2];
				a = document.createAttribute("nowrap");
				a.value="true";
				oCell.attributes.setNamedItem(a);
				
				
				//Filename
				//This is a two part thing
				//First we need to, per normal, display the file name
				//But we also need a edit box to facilitate renaming, this will initially be hidden
				var iconpath = fmpath + "Images/icons/";
				var filename = files[i][0];
				var ext = filename.substr(filename.length - 3); //TODO: use regular expression to match the extension better
				ext = ext.toLowerCase();
				switch (ext)
				{
					case "exe":
						iconpath += "Exe.gif";
						break;
					case "zip":
						iconpath += "Zip.gif";
						break;
					case "log":
					case "dat":
					case "data":
					case "txt":
						iconpath += "Text.gif";
						break;
					case "pdf":
						iconpath += "Acrobat.gif";
						break;
					case "csv":
					case "xls":
						iconpath += "Excel.gif";
						break;
					case "rtf":
					case "doc":
						iconpath += "Word.gif";
						break;
					case "mdb":
						iconpath += "AccessDB.gif";
						break;
					case "ppt":
						iconpath += "PowerPoint.gif";
						break;
					case "pps":
						iconpath += "PowerPoint.gif";
						break;
					case "gif": //Fall through casing(theres something you cant do in C#)
					case "png":
					case "psd":
					case "mix":
					case "bmp":
					case "jpg":
					case "tif":
						iconpath += "Image.gif";
						break;
					case "htm":
					case "xhtml":
					case "shtml":
					case "html":
						iconpath += "Html.gif";
						break;
					default:
						iconpath += "Unknown.gif";
						break;
				}
				
				if(candownload)
					filename = "<span id=\"FileName" + fileindex + "\"><img width=16 height=16 src='" + iconpath + "'>&nbsp;&nbsp;<a class='" + linkclass + "' onmouseover='DisplayFileInfo(" + '"' + fileindex + '"' + ")' href='" + files[i][6] + "'>" + files[i][0] + "</a></span>";
				else
					filename = "<span id=\"FileName" + fileindex + "\" onmouseover='DisplayFileInfo(" + '"' + fileindex + '"' + ")'><img width=16 height=16 src='" + iconpath + "'>&nbsp;&nbsp;" + files[i][0] + "</span>";
								
				fileedit = "<input class='" + textboxclass + "' style='width:100%;display:none' id=\"FileNameEdit" + fileindex + "\" value=\"" + files[i][0] + "\"" + " onKeyDown=\"javascript:javascript:if ((event.which ? event.which : event.keyCode) == 13) return false; else return true;\"" +  ">";
				
				oCell = oRow.insertCell(0);
				oCell.innerHTML = filename + fileedit;
				a = document.createAttribute("nowrap");
				a.value="true";
				oCell.attributes.setNamedItem(a);
				
				//Check box
				oCell = oRow.insertCell(0);
				oCell.innerHTML = "<input class='" + checkboxclass + "' type='checkbox' id='ck" + fileindex +  "'>";
			}
		}
		AlternateFileRows();
	}
	// if files are viewable, but there are none.
	else
	{
		var lblNoFiles = document.getElementById('lblNoFiles');
		if(lblNoFiles)
			lblNoFiles.style.display = "";
		else
			alert("Couldn't find an expected element, please click the refresh button.");
	}
	
}

function RenameFilesByTree(tree, oldpath, newpath)
{
	for(var i=0;i < tree[1].length;i++)
	{
		if(tree[1][i][1] == 'File')
		{
			var reSwap = new RegExp(RegExEscape("\\"), "g");
			var voldpath = oldpath.replace(reSwap, "/");
			var vnewpath = newpath.replace(reSwap, "/");
			var reBack = new RegExp(RegExEscape(oldpath), "g");
			var reForward = new RegExp(RegExEscape(voldpath), "g");
						
			var file = tree[1][i];
			file[4] = file[4].replace(reForward, vnewpath); //Absolute URL  "/"
			file[5] = file[5].replace(reBack, newpath); //Physical File Path "\"
			
			// Download file link - requires some work because it's URL encoded
			voldpath = UrlEncode(voldpath);
			vnewpath = UrlEncode(vnewpath);
			voldpath = ReplaceString(voldpath, "%20", "+"); // don't encode the + sign
			vnewpath = ReplaceString(vnewpath, "%20", "+"); // don't encode the + sign
			voldpath = ReplaceString(voldpath, "'", "||sq||") // manage specially encoded single quotes
			vnewpath = ReplaceString(vnewpath, "'", "||sq||") // manage specially encoded single quotes
			file[6] = ReplaceString(file[6],voldpath,vnewpath);

			// update the file links
			indices = GetAllFiles();
			if (indices)
			{
				for(var i=0;i<indices.length;i++)
				{
					index = indices[i];
					var displayfile = document.getElementById("FileName" + index);
					if (displayfile == null)
					{
						//alert("file is null for index = FileName" + index);
						continue;
					}
					//alert(voldpath);
					//alert(vnewpath);
					//alert(displayfile.innerHTML);
					displayfile.innerHTML = ReplaceString(displayfile.innerHTML,voldpath,vnewpath);
					//alert(displayfile.innerHTML);
				}
			}
		}
		else
		{
			RenameFilesByTree(tree[1][i], oldpath, newpath);
		}
	}
}

function AlternateFileRows()
{
	//Changed the background color on every other row in the file list for legibility
	var filetablebody = document.getElementById('FileTableBody');
	if(!filetablebody)
		{alert("Couldn't find the file table body, please click the refresh button.");return;}
		
	var rows = filetablebody.rows;
	for(var i=0; i<rows.length;i++)
	{
		var row = rows[i];
		if(i % 2 == 0)
			row.className = "FileListEven";
		else
			row.className = "FileListOdd";
	}
}

function mdArray(iRows,iCols) 
{ 
	var i; 
	var j; 
	var a = new Array(iRows); 
	for (i=0; i < iRows; i++) 
	{ 
		a[i] = new Array(iCols); 
		for (j=0; j < iCols; j++) 
		{ 
			a[i][j] = ""; 
		} 
	} 
	return(a); 
}

function GetFolderN(tree, folderindex)
{
	if (tree == null)
		return "";
		
	var n = -1;
	for(var i=0; i<tree.length;i++)
	{
		if(tree[i][1] != "File")
		{
			n++;
			if(n == folderindex)
			{
				return tree[i][1];
			}
		}
	}
}

function GetFileInfo(index)
{
	//index is a string containing the index path to the folder under question
	//if index = 0,1,0 then we want the first file of the second folder of the first folder in the tree(zero base)
	
	//FileInfo is provided in the following format
	//item[0] = <filename>
	//item[1] = "File"
	//item[2] = <file size>
	//item[3] = <modified date>
	//item[4] = <file url>
	var indices = index.split(",");
	var items = FullTree;
	
	if(indices[0] != -1)
	{				
		for(var i=0;i<indices.length-1;i++)
		{
			var x = indices[i];
			items = GetFolderN(items, x);
		}
	}
	
	var n=-1;
	x = indices[indices.length-1];
	for(i=0;i<items.length;i++)
	{
		if(items[i][1] == 'File')
		{
			n++;
			if(n == x)
			{
				return items[i];
			}
		}
	}
}

function RemoveFile(index)
{
	//index is a string containing the index path to the folder under question
	//if index = 0,1,0 then we want the first file of the second folder of the first folder in the tree(zero base)
	//This will remove the element at the given index position from the FullTree(This function does not do any disk operations to remove the file permantly)
	var indices = index.split(",");
	var items = FullTree;
	
	if(indices[0] != -1)
	{				
		for(var i=0;i<indices.length-1;i++)
		{
			var x = indices[i];
			items = GetFolderN(items, x);
		}
	}
	
	var n=-1;
	x = indices[indices.length-1];
	for(i=0;i<items.length;i++)
	{
		if(items[i][1] == 'File')
		{
			n++;
			if(n == x)
			{
				items.splice(i, 1);
			}
		}
	}
}


function DisplayFileInfo(index)
{
	if(busy) return;
	busy = true;
	
	//turn on copy to clipboard option if on a windows machine
	if(navigator.userAgent.toLowerCase().indexOf('win') > 0)
	{
		var copycell = document.getElementById('CopyURLCell');
		if(copycell)
			copycell.style.display = "";
	}
	
	fileinfo = GetFileInfo(index);
	var dname = document.getElementById('DetailName');
	if(!dname) { alert("Couldn't find DetailName object, please click the refresh button."); busy=false;return }
	dname.innerHTML = fileinfo[0];
	
	if (!hideurldetail)
	{
		var durl = document.getElementById('DetailURL');
		if(!durl) { alert("Couldn't find DetailUrl object, please click the refresh button.");busy=false;return }
		var desc = fileinfo[4];
		var desclen = 30;
		if(desc.length > desclen)
		{
			desc = "..." + desc.substring(desc.length - desclen);
		}
		durl.innerHTML = "<a class='" + linkclass + "' href='" + fileinfo[4] + "'>" + desc + "</a>";
		curfileurl = fileinfo[4];
	}
	
	var dmod = document.getElementById('DetailModDate');
	if(!dmod) { alert("Couldn't find DetailModDate object, please click the refresh button.");busy=false;return }
	dmod.innerHTML = fileinfo[3];
	busy = false;
}

function ClearDisplayInfo()
{
	if(busy) return; //in case of an error there may be an alert box popup.  Though this box is modal, we will still contiue to recieve events if the mouse moves. which can make for a slew of error boxes.
	busy = true;
	
	var copycell = document.getElementById('CopyURLCell');
	if(copycell)
		copycell.style.display = "none"
	
	var dname = document.getElementById('DetailName');
	if(!dname) { alert("Couldn't find DetailName object, please click the refresh button."); busy=false;return }
	dname.innerHTML = "";
	
	if (!hideurldetail)
	{
		var durl = document.getElementById('DetailURL');
		if(!durl) { alert("Couldn't find DetailUrl object, please click the refresh button.");busy=false;return }
		durl.innerHTML = "";
	}
		
	var dmod = document.getElementById('DetailModDate');
	if(!dmod) { alert("Couldn't find DetailModDate object, please click the refresh button.");busy=false;return }
	dmod.innerHTML = "";
	busy = false;
}

function GetCheckedFiles(toggle)
{
	//returns an array of string indices that represent the selected files
	var filetable = document.getElementById('FileTable');
	var filetablebody = document.getElementById('FileTableBody');
	if(!filetable)
		{alert("Couldn't find the file table, please click the refresh button.");return;}
	if(!filetablebody)
		{alert("Couldn't find the file table body, please click the refresh button.");return;}
	
	var indices = [];
	var objs = filetablebody.getElementsByTagName("input");
	for(var i=0;i<objs.length;i++)
	{
		if(objs[i].checked)
		{
			var index = objs[i].id.substring(2, objs[i].id.length);
			indices[indices.length] = index;
			if(toggle) objs[i].checked = false; //Turn the check boxes off
		}
	}
	if(indices.length > 0)
		return indices;
	else
		return null;
}

function GetAllFiles()
{
	//returns an array of string indices that represent the selected files
	var filetable = document.getElementById('FileTable');
	var filetablebody = document.getElementById('FileTableBody');
	if(!filetable)
		{alert("Couldn't find the file table, please click the refresh button.");return;}
	if(!filetablebody)
		{alert("Couldn't find the file table body, please click the refresh button.");return;}
	
	var indices = [];
	var objs = filetablebody.getElementsByTagName("input");
	for(var i=0;i<objs.length;i++)
	{
//		if(objs[i].checked)
//		{
			var index = objs[i].id.substring(2, objs[i].id.length);
			indices[indices.length] = index;
//			if(toggle) objs[i].checked = false; //Turn the check boxes off
//		}
	}
	if(indices.length > 0)
		return indices;
	else
		return null;
}

function GetFolderInfo(index)
{	
	if(index != -1)
	{
		var items;
		var branch = FullTree;
		var indices = index.split(",");
		var n = -1;
		for(var i=0;i<indices.length;i++)
		{
			var x = indices[i];
			items = GetFolderInfoN(branch, x);
			branch = items[1];
		}
		return items;
	}
	else
	{
		RootInfo[1] = FullTree;
		return RootInfo;
	}
}

function GetFolderInfoN(tree, folderindex)
{
	var n = -1;
	for(var i=0; i<tree.length;i++)
	{
		if(tree[i][1] != "File")
		{
			n++;
			if(n == folderindex)
			{
				return tree[i];
			}
		}
	}
}

function GetFolderContents(index)
{
	//index is a string containing the index path to the folder under question
	//if index = 0,1 then we want the contents of the second folder of the first folder in the tree(zero base)
	var items = FullTree;
	
	if(index != -1)
	{
		var indices = index.split(",");
		var n = -1;
		for(var i=0;i<indices.length;i++)
		{
			var x = indices[i];
			items = GetFolderN(items, x);
		}
	}
	
	var files = [];
	if (items)
	{
		for(i=0;i<items.length;i++)
		{
			
			if(items[i][1] == 'File')
			{
				files[files.length] = items[i];
			}
		}
	}
	return files;
}



function GetFolderPath(index)
{
	//index is a string containing the index path to the folder under question
	//if index = 0,1 then we want the contents of the second folder of the first folder in the tree(zero base)
	
	if(index == -1)
	{
		return "\\";
	}
	
	var indices = index.split(",");
	var items = FullTree;
	var path = "\\";
	
	
	if(index != -1)
	{
		var n = -1;
		for(var i=0;i<indices.length;i++)
		{
			var x = indices[i];
			foldername = GetFolderNameByTree(items, x);
			items = GetFolderN(items, x);
			path += foldername + "\\";
		}
	}
	return path;
}

function GetFolderName(index)
{
	//index is a string containing the index path to the folder under question
	//if index = 0,1 then we want the contents of the second folder of the first folder in the tree(zero base)
	
	if(index == -1)
	{
		return "\\";
	}
	
	var indices = index.split(",");
	var items = FullTree;	
	
	if(index != -1)
	{
		var n = -1;
		for(var i=0;i<indices.length;i++)
		{
			var x = indices[i];
			foldername = GetFolderNameByTree(items, x);
			items = GetFolderN(items, x);
		}
	}
	return foldername;
}

function GetFolderNameByTree(tree, folderindex)
{
	if (tree == null)
		return "";
		
	var n = -1;
	for(var i=0; i<tree.length;i++)
	{
		if(tree[i][1] != "File")
		{
			n++;
			if(n == folderindex)
			{
				return tree[i][0];
			}
		}
	}
}

function SetFolderName(index, newname)
{
	//index is a string containing the index path to the folder under question
	//if index = 0,1 then we want the contents of the second folder of the first folder in the tree(zero base)
	
	var info = GetFolderInfo(index);
	info[0] = newname;
}

function GetFolderTree()
{
	var folders = GetFolders(FullTree);
	//translate into treeview's format
	
	var tree =[];
	var root = [RootInfo[0], "javascript:OnFolderClick('-1')"];
	TranslateNodes(folders, root);
	tree[tree.length] = root;
	return tree;
}
		
function GetFolders(tree)
{
	var foldertree = mdArray(GetFolderCt(tree), 2);
	if (!tree)
		return foldertree;
	var n = -1;
	for(var i=0; i<tree.length;i++)
	{
		if(tree[i][1] != "File")
		{
			var nodes = tree[i][1];
			nodes = GetFolders(nodes);
			
			n++;
			foldertree[n][0] = tree[i][0];
			foldertree[n][1] = nodes;
		}
	}
	return foldertree;
}

function GetFolderCt(tree)
{
	var n = 0;
	if (!tree) 
		return n;
	for(var i=0; i<tree.length;i++)
	{
		if(tree[i][1] != "File")
		{
			n++;
		}
	}
	return n;
}

function TranslateNodes(tree, root, ostringref)
{
	//Converts nodes from our standard jagged array into the funny GurtTree format
	//Appends the nodes from tree to the root reference
	if(!ostringref) ostringref = "";
	stringref = ostringref;
	for(var i=0; i<tree.length;i++)
	{	
		if(stringref) stringref += ",";
		stringref += i;
		
		var item = [tree[i][0], "javascript:OnFolderClick('" + stringref + "')"]; 
		if(tree[i][1] != "") //Test for additional subfolders
		{
			var nodes = tree[i][1];
			var subitem = TranslateNodes(nodes, item, stringref);
		}
		root[root.length] = item;
		stringref = ostringref;
	}
}

function SelectGTreeItem(index)
{
	var indices = index.split(",");
	var curindex = '';
	var item;
	
	for(var i=0;i<indices.length;i++)
	{
		if(curindex != '')
			curindex += ',';
		curindex += indices[i];
		
		item = GetGTreeItem(curindex);
		if(item)
			gOpenItem(item);
	}
	if(item)
		gSelectItem(item);
	
	OnFolderClick(index);
}

function GetGTreeItem(index)
{
	var items = gurtTree.all;
	var match = "javascript:OnFolderClick('" + index + "')";
	for(var i=0; i<items.length;i++)
	{
		var item = items[i];
		if(item.sLnk == match)
			return item;
	}
}
