var _columnList = null;
var m_SelectedCol;		
var m_nLeft;		
var m_nStart;
var wProgress = null;

////////////////////////////////////////////////
/////  loadColumns()
////////////////////////////////////////////////
function loadColumns() {   
    _columnList = new ColumnList();
    
    var colName = _columnList.Items(0);         
    var trHeaderRow = document.getElementById("trHeaderRow");
    var trDataHeaderRow = document.getElementById("trDataHeaderRow");
        
    // remove any existing columns
    if(trHeaderRow.cells.length > 6) {
        // Remove additional cells 
        for(var i = trHeaderRow.cells.length - 1; i > 5; i--) {
            trHeaderRow.cells[i].removeNode(true);
            trDataHeaderRow.cells[i].removeNode(true);
        }        
            
        // Reset sizing on fixed leading cells 
        for(var i = 0; i < 5; i++) {
            trHeaderRow.cells[i].style.width = "16px";
            trDataHeaderRow.cells[i].style.width = "16px";
        }        
    }
        
    // dynamically add remaining columns
    for(var i = 1; i < _columnList.Length(); i++) {
        var col = _columnList.Items(i);
        if(col.Visible == "1") {
            addColumnHeader(trHeaderRow, col, "omsTreeHeader$"); 
            addColumnHeader(trDataHeaderRow, col, "omsTree$");
        }
    }
    
    // update visible name column width (unpadded)
    var trName = document.getElementById("omsTreeHeader$tdNameCol");
    trName.style.width = colName.Width.toString() + "px";
   
    // Set HR Size
    var hr = document.getElementById("divRule");
    hr.style.width = "100%";
    
    // Handle Invisible Header Row
    
    // update invisible name column width
    trName = document.getElementById("omsTree$tdNameCol");
    trName.style.width = colName.Width.toString() + "px";
        
    // cache column data
    _columns = _columnList.Serialize();
    
    var s = getCookie("SortColumn");
    if(s != null && !isNaN(s)) _sortColumn = parseInt(s, 0);
    
    s = getCookie("SortDirection");
    if(s != null && !isNaN(s)) _sortDirection = parseInt(s, 0);
    
    refreshSortGlyph();
}

function addColumnHeader(trHeaderRow, colNew, Prefix) {
    //<td  id="tdDescCol" class="column_header_cell" width="500px" style="height: 20px">Description</td>
    
    var td = trHeaderRow.insertCell();
    
    td.id = Prefix + "td" + colNew.BaseName + "Col";
    td.setAttribute("columnType", colNew.ColumnID);
    td.className = "column_header_cell";
    td.style.width = colNew.Width.toString() + "px";
    td.style.height = "20px";
    td.innerHTML = "<span id=\"sortGlyph$" + colNew.BaseName + "\" style=\"font-family:Webdings;font-size:10pt;display:none\">5&nbsp;</span>" + colNew.DisplayName;
    td.onmousedown = new Function("evt", "onColumnSizeStart(this);");
    td.onmouseup = new Function("evt", "onColumnSizeEnd();");
}

////////////////////////////////////////////////
/////  userIsReadOnly()
////////////////////////////////////////////////
function userIsReadOnly() {
    // Read the usrFlags hidden input
    var input = document.getElementById("rw");
    if(!input) return false;

    return (parseInt(input.value) < 1);
} 

////////////////////////////////////////////////
/////  deleteMulti(shred)
////////////////////////////////////////////////
function deleteMulti(shred) {
    hideMenu("mnuMultiSelectContext");
    
    var bRet = false;
    
    if(shred)
        bRet = confirm("Do you wish to shred the selected items?");
    else
        bRet = confirm("Do you wish to delete the selected items?");
        
    if(!bRet) return; // User Canceled
    
    // Perform Action
    idList = getSelectedIDs();
    deleteStorageItems(idList, shred);    
}

////////////////////////////////////////////////
/////  createObject(tr)
////////////////////////////////////////////////
function createObject(sourceMenu) {    
    hideMenu(sourceMenu);
    
    var tr = getSelectedItem();
    if(!tr) return;
    
    var nType = getRowType(tr);
    
    if(nType == OT_FOLDER) 
        createDocument(tr);        
    else
        createStorage(tr);
        
}

////////////////////////////////////////////////
/////  updateObject(tr)
////////////////////////////////////////////////
function updateObject(sourceMenu) {
    hideMenu(sourceMenu);
    
    var tr = getSelectedItem();
    if(!tr) return;
        
    var nType = getRowType(tr);

    if(nType == OT_DOCUMENT) 
        updateDocument(tr);        
    else {        
        updateStorage(tr);        
    }
}

////////////////////////////////////////////////
/////  createDocument(sourceMenu)
////////////////////////////////////////////////
function createDocument() {
    // Get Selected Parent Folder 
    var trFld = getSelectedItem();
    if(!trFld) return;    
    
    // Get ID
    var nID = getObjectID(trFld);
    
    // Run DocumentX
    runDocumentX(nID, 8, "F");
}

///////////////////////////////////////////////
/////  scanDocument(sourceMenu)
////////////////////////////////////////////////
function scanDocument() {
    // Get Selected Parent Folder 
    var trFld = getSelectedItem();
    if(!trFld) return;
    
    // Get ID
    var nID = getObjectID(trFld);
    
    // Run DocumentX
    runDocumentX(nID, 13, "F");
}

////////////////////////////////////////////////
/////  updateDocument(sourceMenu)
////////////////////////////////////////////////
function updateDocument(tr) {
    var action = 0;
    var id = getObjectID(tr);
    
    if(!objectHasPermission(tr, PERM_MODIFY)) {
        // Read Only
        action = 10;
    }
    else {
        // Read Write
        action = 9;
    }   
	
	runDocumentX(id, action, "");
}

////////////////////////////////////////////////
/////  deleteSingle(tr, shred)
////////////////////////////////////////////////
function deleteSingle(sourceMenu, shred) {
    hideMenu(sourceMenu);
    
    var tr = getSelectedItem();
    var nType = getRowType(tr);
    
    switch(nType) {
        case OT_CABINET:
            deleteCabinet(tr, shred);
            break;
            
        case OT_DRAWER:
            deleteDrawer(tr, shred);
            break;
            
        case OT_FOLDER:
            deleteFolder(tr, shred);
            break;  
            
        case OT_DOCUMENT:
            deleteDocument(tr, shred);
            break;        
    }
}

////////////////////////////////////////////////
/////  sendMail(tr)
////////////////////////////////////////////////
function sendMail(sourceMenu) {
    if(sourceMenu.length > 0)
        hideMenu(sourceMenu);
    
    // Get Selected Document 
    var tr = getSelectedItem();
    if(!tr) return;
    
    //if(isDisabled(tr)) return;
    
    // Get Major Object Specs
    var nID = getObjectID(tr);
    var nType = getRowType(tr);
    var sTypeDesc = getTypeDesc(nType);
    
    // Run DocumentX
    runDocumentX(nID, 6, sTypeDesc);
}

////////////////////////////////////////////////
/////  viewDocument(trDocument, thumbnails)
////////////////////////////////////////////////
function viewDocument(sourceMenu, thumbnails) {
    if(sourceMenu.length > 0)
        hideMenu(sourceMenu);
    
    // Get Selected Document 
    var trDoc = getSelectedItem();
    if(!trDoc) return;
    
    // Determine Document Type
    var sDocType = trDoc.getAttribute("docType");
    
    if(sDocType == "C" && _defaultNative != "true")
        viewImageDocument(trDoc, thumbnails);
    else
        viewNativeDocument("", trDoc);
}

////////////////////////////////////////////////
/////  viewImageDocument(trDocument, thumbnails)
////////////////////////////////////////////////
function viewImageDocument(trDoc, thumbnails) {    
    // Set View Window Options
    var sOptions = "scrollbars=yes,resizable=yes,status=yes,toolbar=no,menubar=no,location=no";
    
    // Is this version controlled?
    var nStatus = parseInt(trDoc.getAttribute("status"), 0);
    
    // Set URL Params
    sParams = "&ID=" + getObjectID(trDoc).toString();
    if(thumbnails)
        sParams = sParams + "&TV=1";
   
    if(checkBit(nStatus, STATUS_VERSION_CONTROLLED)) {
        // Open Select Version Window
        window.open("SelectVersion.aspx?" + sParams, "", sOptions);
    }
    else {
        // Open Image View Window
        window.open("asp/Viewer.asp?tk=" + getSessionID() + sParams, "" , sOptions);
    }        
}

////////////////////////////////////////////////
/////  viewNativeDocument(trDocument)
////////////////////////////////////////////////
function viewNativeDocument(sourceMenu, trDoc) {
    // Hide menu, if called from context menu
    if(sourceMenu.length > 0) hideMenu(sourceMenu);

    if(!trDoc) 
        trDoc = getSelectedItem();
        
    // Fetch the Doc ID
    var nID = getObjectID(trDoc);
        
    // Is this version controlled?
    var nStatus = parseInt(trDoc.getAttribute("status"), 0);
    
    if(checkBit(nStatus, STATUS_VERSION_CONTROLLED)) {
        // Yes... open the version selector
        window.open("SelectVersion.aspx?ID=" + id.toString() & "&Action=OpenAsMime");
    }
    else {
        // No... launch DocumentX
        runDocumentX(nID, 4, "");
    }
}

////////////////////////////////////////////////
/////  runDocumentX(id, action, installed)
////////////////////////////////////////////////
function runDocumentX(id, action, typeDesc) {
    try {
        var sUrl = ""
        
        if(testDocX())
        {
            if(action == 8 || action == 13) {
                // The id refers to a Folder ID
                sUrl = "asp/DocumentX.asp?tk=" + getSessionID() + "&ID=" + id.toString() + "&ActionID=" + action.toString();
            }
            else {
                // The id refers to a Document ID
                sUrl = "asp/DocumentX.asp?tk=" + getSessionID() + "&DocID=" + id.toString() + "&ActionID=" + action.toString();
            }
            
            if(typeDesc.length > 0) {
                // Include type description in URL
                sUrl = sUrl + "&Type=" + typeDesc;
            }
        }
        else
        {
            // No documentX
            sUrl = "asp/DownloadDoc.asp?tk=" + getSessionID() + "&ID=" + id.toString();
        }  
            
        // Launch the Window
        openWindow(sUrl, 400, 300, true);        
    }
    catch(e) {
        // Just Trap It        
    }
}

////////////////////////////////////////////////
/////  downloadDocument(trDocument)
////////////////////////////////////////////////
function downloadDocument(sourceMenu) {
    // Hide menu, if called from context menu
    if(sourceMenu.length > 0) hideMenu(sourceMenu);

   var trDoc = getSelectedItem();
   if(!trDoc) return;
        
    // Fetch the Doc ID
    var nID = getObjectID(trDoc);
        
    // Is this version controlled?
    var nStatus = parseInt(trDoc.getAttribute("status"), 0);
    
    if(checkBit(nStatus, STATUS_VERSION_CONTROLLED)) {
        // Yes... open the version selector
        window.open("SelectVersion.aspx?ID=" + id.toString() & "&Action=OpenAsMime");
    }
    else {
        // No... launch DocumentX
        runDocumentX(nID, 3, "");
    }
}

////////////////////////////////////////////////
/////  Public: RefreshAddObject(typeChar, objectID) 
////////////////////////////////////////////////
function RefreshAddObject(typeChar, objectID) {
    getStorageItem("[" + typeChar + objectID.toString() + "]", true);
}

////////////////////////////////////////////////
/////  Public: RefreshAddObjects(typeChar, idList) 
////////////////////////////////////////////////
function RefreshFolder(folderID) {
    var tr = document.getElementById("F" + folderID);
    
    if(!tr.getAttribute("isExpanded") != "true") {
        tr.setAttribute("isExpanded", "true");
    }
    
    Refresh();    
}

////////////////////////////////////////////////
/////  Public: RefreshObject(typeChar, objectID) 
////////////////////////////////////////////////
function RefreshObject(typeChar, objectID) {
    getStorageItem("[" + typeChar + objectID.toString() + "]", false);
}

////////////////////////////////////////////////
/////  Public: RefreshTreeList() 
////////////////////////////////////////////////
function ResetTree() {
    // remove all tree list table rows, except header
    for(var i = omsTree.rows.length -1; i > 0; i--) {
        omsTree.rows[i].removeNode(true);
    }
    
    showProgress();
    getChildItems("", "");
}

////////////////////////////////////////////////
/////   showProgress()
////////////////////////////////////////////////
function showProgress(showOverlay) {
    try {        
        var w = window.parent.Header;
        if(!w) return;
        
        w.ShowProgressBar(); 
       
        if(showOverlay)
        {            
            var div = document.getElementById("divOverlay");
            div.style.top = document.body.scrollTop;
            div.style.display = "";            
        }
    }
    catch(e) {
        // Ignore
    }
}
	
////////////////////////////////////////////////
/////   hideProgress()
////////////////////////////////////////////////
function hideProgress() {
    try {
        var w = window.parent.Header;
        if(!w) return;
        
        w.HideProgressBar();
        
        document.getElementById("divOverlay").style.display = "none";
    }
    catch(e) {
        // Ignore
    }
}

////////////////////////////////////////////////
/////  showColumnMenu()
////////////////////////////////////////////////
function showColumnMenu() {
    var div = document.getElementById("mnuColumnContext");
    if(!div) return;
    
    // set column id to menu item as attribute
    div.setAttribute("columnID", window.event.srcElement.id);

    showMenu("mnuColumnContext");
    
    // Prevent the system context menu from appearing
    return false;   
}

////////////////////////////////////////////////
/////  showTreeSettings()
////////////////////////////////////////////////
function showTreeSettings() {
    hideMenu("mnuColumnContext");
        
    var sOptions= "scrollbars=yes,resizable=yes,status=yes,toolbar=no,menubar=no,location=no";
    
    // Launch the Window
    openWindow("UserOptions.aspx", 650, 400, false, sOptions); 
}

///////////////////////////////////////////////////////////////////////////////////
/////  OnColumnSizeStart
///////////////////////////////////////////////////////////////////////////////////
function onColumnSizeStart(col)	 {	
	m_SelectedCol = col;		
	m_nLeft = col.clientLeft;		
	m_nStart = window.event.clientX;
}

///////////////////////////////////////////////////////////////////////////////////
/////  OnColumnSizeEnd
///////////////////////////////////////////////////////////////////////////////////
function onColumnSizeEnd() {
	var nDiff;
	var sColData;
	var newColSize;
	var newTableSize;
	
	// Get Ending Position
	m_nEnd = window.event.clientX;	
	
	// Make sure a column has been selected 
	if(!m_SelectedCol) return;
	
	// Determine start to end difference 
	nDiff = Number(m_nEnd) - Number(m_nStart);				
	if(nDiff == 0) return;
	
	// Reference The Players
	var trHeaderTable = document.getElementById("omsTreeHeader");
	var trDataTable = document.getElementById("omsTree");
	
	// Resize Selected Column
	newColSize = getColWidth(m_SelectedCol) + nDiff;

    m_SelectedCol.style.width = newColSize + "px";
    
	// Save New Column Data		
	var cols = new ColumnList();
	cols.SetNewColWidth(m_SelectedCol.getAttribute("columnType"), m_SelectedCol.style.width);
	cols.Save();
	
	// ... and synchronize
	_columns = cols.Serialize();	
    document.getElementById("ColumnInfo").value = _columns;
	
	// Resize Corresponding Column in Data Header 
	var sColID = m_SelectedCol.id.replace("omsTreeHeader", "omsTree");
	var td = document.getElementById(sColID);
	if(td) td.style.width = m_SelectedCol.style.width;
	
	// Clear Column Selection
	m_SelectedCol = null;	
	
	if(sColID.indexOf("tdNameCol") > -1)
	{
	    // Refresh
	    Refresh();
	}    
	else   
	{
	    // Dynamically Resize    				
	    sizeChildTables(sColID, newColSize, nDiff);
	}
}

function sizeChildTables(columnID, newWidth, delta) {    
    // fetch all the THEADs
    var lst = document.getElementsByTagName("table");
    for(var i = 0; i < lst.length; i++) {        
        if(isChildTable(lst[i].id) || lst[i].id == "tblStorageRoom0" || lst[i].id == "tblRoot" || lst[i].id == "omsTree")
        {            
            // resize the appropriate column
            var colName = columnID.replace("omsTree$td", "");  
            colName = colName.replace("Col","").toLowerCase();
            colName = lst[i].rows[0].id + "$" + colName;
    
            if(colName.indexOf("$name") > -1)
            {
                // make appropriate adjustments for object type
                switch(lst[i].id.substr(3, 1))
                {
                    case "S":
                        // These are cabinets 
                        newWidth = parseInt(newWidth, 0) + 48;
                        break;
                    case "C": 
                        // These are drawer children
                        newWidth = parseInt(newWidth, 0) - 16;
                        break;
                    case "D":
                        // folder children
                        newWidth = parseInt(newWidth, 0) - 16;
                        break;
                    case "F":
                        // document children add nothing
                        newWidth = parseInt(newWidth, 0) - 16 ;
                        break;
                    default:
                        // do not adjust
                        break;                        
                }
            }
            
            var trCol = document.getElementById(colName);
            if(trCol)
            {
                trCol.style.width = newWidth;   
                trCol.style.whiteSpace = "nowrap";
                trCol.style.overflow = "hidden";
            }            
        }
    }
}

function parseWidth(widthExpr)
{
    var n = parseInt(widthExpr.replace("px",""), 0);
    return n;
}

function isChildTable(id)
{
    var re = new RegExp("tbl[CDFO][0-9]+");
    var m = re.exec(id);
    if(m)
        return true;
    else
        return false;
}


///////////////////////////////////////////////////////////////////////////////////
/////  getColWidth(tr)
///////////////////////////////////////////////////////////////////////////////////
function getColWidth(tr) {
    var sArg = tr.style.width;    
    sArg = sArg.replace("px", "");
    return parseInt(sArg, 0);
}

///////////////////////////////////////////////////////////////////////////////////
/////  Refresh()
///////////////////////////////////////////////////////////////////////////////////
function Refresh() {
    RefreshSettings();
    
    window.location.reload();
    
//    var tr = document.getElementById("trRoot_children");
//    if(tr) tr.removeNode(true);
//    
//    getChildItems("","");
    
    
}

///////////////////////////////////////////////////////////////////////////////////
/////  RefreshSettings()
///////////////////////////////////////////////////////////////////////////////////
function RefreshSettings() {    
    _evenRowColor = getSetting("EvenRowColor");    
    _defaultNative = getSetting("DefaultNative");    
    _scaleToGray = getSetting("ScaleToGray");
    _maximizeViewer = getSetting("MaximizeViewer");
    _expandedSearchResults = getCookie("ExpandedSearchResults");
    
    var tbl = document.getElementById("OmsTree");    
    if(_evenRowColor == "#add1ab")
        tbl.background = "Images/TableBackground.jpg";
    else   
        tbl.background = "";
        
    refreshSortGlyph();
}

///////////////////////////////////////////////////////////////////////////////////
/////  Sleep(seconds)
///////////////////////////////////////////////////////////////////////////////////
function Sleep(seconds) {
    seconds = seconds * 1000;
    
    var sleeping = true;
    var now = new Date();
    var alarm;
    var startingMSeconds = now.getTime();
    
    while(sleeping){
        alarm = new Date();
        alarmMSeconds = alarm.getTime();
        if(alarmMSeconds - startingMSeconds > seconds) {
             sleeping = false; 
        }
    }
}

///////////////////////////////////////////////////////////////////////////////////
/////  toggleBorders()
///////////////////////////////////////////////////////////////////////////////////
function toggleBorders()
{
    var lst = document.getElementsByTagName("table");
    for(var i = 0; i < lst.length; i++)
    {
        if(isChildTable(lst[i].id) || lst[i].id == "tblStorageRoom0" || lst[i].id == "omsTree")
        {
            if(lst[i].getAttribute("border") == "0")
                lst[i].setAttribute("border", "1");
            else    
                lst[i].setAttribute("border", "0");
        }
    }
}

////////////////////////////////////////
///  testDocX()
////////////////////////////////////////
function testDocX()
{
	try 
	{	
		var ctl = new ActiveXObject("DocumentX.DocMgr");
		if(ctl) return true;
	}
	catch(e)
	{
		return false;
	}
}
