﻿function Index() {
    var WCObj = {};    
    
    var rootURL = "";
    var headID = 0;
    var rsc;
    var mbrType = "Guest";//membership Type
    
    //************** Start Callback Functions **************************
    //**
    function AddJSONScriptTag(codeRequest) {

        var fullUrl = rootURL + codeRequest;
        try {
             // Create a new script object
             aObj = new JSONscriptRequest(fullUrl);
             // Build the script tag
             aObj.buildScriptTag();
             // Execute (add) the script tag
             aObj.addScriptTag();               
        }
        catch (err) {
            alert(err);
        }
    }
    function JSONscriptRequest(fullUrl) {
        // REST request path
        this.fullUrl = fullUrl; 
        // Get the DOM location to put the script tag
        this.headLoc = document.getElementsByTagName("head").item(0);
        // Generate a unique script tag id
        this.scriptId = 'fpHead_Id' + headID;
        
        var scriptTag = returnObjById('fpHead_Id' + headID);
        if(scriptTag){
          this.headLoc.removeChild(scriptTag);
        }
        headID++;
    }
    // buildScriptTag method
    JSONscriptRequest.prototype.buildScriptTag = function () {
        // Create the script tag
        this.scriptObj = document.createElement("script");

        // Add script object attributes
        this.scriptObj.setAttribute("type", "text/javascript");
        this.scriptObj.setAttribute("src", this.fullUrl);
        this.scriptObj.setAttribute("id", this.scriptId);
    };
    // removeScriptTag method
    JSONscriptRequest.prototype.removeScriptTag = function () {
        // Destroy the script tag
        this.headLoc.removeChild(this.scriptObj);  
    };
    // addScriptTag method
    JSONscriptRequest.prototype.addScriptTag = function () {
           
        //alert("this.scriptObj");
        // Create the script tag
        this.headLoc.appendChild(this.scriptObj);
    };
    //**
    //************** End Callback Functions **************************
    
    //************** Start Helper Functions **************************
    //**
    function removeChildren(parent) {
      while (parent.firstChild) {
        parent.removeChild(parent.firstChild);
      }
    }
    function createDiv(opt_text, opt_className, opt_id) {
      var el = document.createElement("DIV");
      if (opt_text) {
        el.innerHTML = opt_text;
      }
      if (opt_className) { el.className = opt_className; }
      if (opt_id) { el.id = opt_id; }
      return el;
    }
    
    function cloneObject(obj) {
        if (typeof obj !== 'object' || obj == null) {
            return obj;
        }
        var c = obj instanceof Array ? [] : {};
        for (var i in obj) {
            var prop = obj[i];
            if (typeof prop == 'object') {
               if (prop instanceof Array) {
                   c[i] = [];
                   for (var j = 0; j < prop.length; j++) {
                       if (typeof prop[j] != 'object') {
                           c[i].push(prop[j]);
                       } else {
                           c[i].push(cloneObject(prop[j]));
                       }
                   }
               } else {
                   c[i] = cloneObject(prop);
               }
            } else {
               c[i] = prop;
            }
        }
        return c;
    }
    function ArrayContains(arr,element) 
    {
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] === element) {
                return true;
            }
        }
        return false;
    }    
    //returns a url parameter value when passed the parameter name. Will return "" if the param does not exist.
    function getURLparam(name){
        name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
        var regexS = "[\\?&]"+name+"=([^&#]*)";
        var regex = new RegExp( regexS );
        var results = regex.exec( window.location.href );
        if( results === null ) {
            return "";
        }
        else {
            return unescape(results[1]);
        }
    }
    function cleanedSiteURL(url) {
        var site = url.toLowerCase().replace(/http:\/\//i,"").split("/")[0];
        
        if (site.indexOf("www.") !== 0) {
        
            var siteArray = site.split(".");
            
            if (siteArray.length === 2) {
                siteArray.unshift("www");        
            } else if (siteArray.length === 3 && siteArray[siteArray.length-1].length === 2) {            
                siteArray.unshift("www");  
            }
            
            site = siteArray.join(".");
        }
        return site;
    }
    function findPos(obj) {
	    var curleft = curtop = 0;
	    if (obj.offsetParent) {
		    curleft = obj.offsetLeft
		    curtop = obj.offsetTop
		    while (obj = obj.offsetParent) {
			    curleft += obj.offsetLeft
			    curtop += obj.offsetTop
		    }
	    }
	    return [curleft,curtop];
    }
    function getElementsByTagNameAndClass(el,tn,n) {
        var arr = [];
        var allEl = el.getElementsByTagName(tn);
        if (allEl && allEl.length > 0) {
            for (var i=0;i<allEl.length;i++) {
                if (allEl[i].className === n) {
                    arr.push(allEl[i]);
                }
            }
        
        }
        return arr;
    }
    function returnObjById( id ) {
        var returnVar;
        if (document.getElementById) {
            returnVar = document.getElementById(id); }
        else if (document.all) {
            returnVar = document.all[id]; }
        else if (document.layers) {
            returnVar = document.layers[id]; }
        return returnVar;
    }
    //faviconLoadError
    function faviconLoadError(obj){
        obj.onload=null;
        obj.src='img/pixel.gif';
    }
    function faviconLoad(obj,src){
        obj.onload=null;
        obj.src="http://" + src + "/favicon.ico";
    } 
    //**
    //************** End Helper Functions **************************
    
    WCObj.ReadPageSettings = function() {
        readPageSettings();
    };
    function readPageSettings() {
        var psMbrType = returnObjById("psMbrType"); //membership type
        mbrType = psMbrType.innerHTML;
    }

    //****************************************************************
    //****   Get Listing of Indexes 
    WCObj.GetIndexChoices = function() {
        
        if (mbrType === "Administrator") {
            var codeRequest = "admin/tools/JSON/GetIndexList.aspx?w=Index.displayIndexChoices";
            AddJSONScriptTag(codeRequest);
        }
        
    };
    WCObj.displayIndexChoices = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.Index;
         
        var html = "<select id=\"selIndex\" >";    
    
        for (var i=0; i<r.length; i++) {        
            html += displayOption(r[i].n,r[i].id,r[i].d,r[i].ch);        
        }
        
        html += "</select>"; 
        html += "<input type=\"button\" value=\"Copy Link\" onclick=\"Index.IterateCheckBoxes()\" />";
        html += "<input type=\"button\" value=\"Move Category\" onclick=\"Index.IterateCategoryCheckBoxes()\" />"; 
        html += "<input type=\"button\" value=\"Refresh List\" onclick=\"Index.GetIndexChoices()\" />";
        var indexChooser = returnObjById("indexChooser");
        indexChooser.className = "";
        indexChooser.innerHTML = html;
    };       
    function displayOption(name,id,depth,children) {
        var html = "<option value=\"" + id + "_" + children + "\" ";
        var color;
        var margin;
        
        if (children === 0) {
            color = "green";            
        }
        else {
            color = "blue";
        }        
        html += "style='color:" + color + ";'";  
        html += ">";
            
        html += indent(depth,name,children);
        
        html += "</option>";
        return html;
    }
    function indent(depth, name, children) {
        if (depth > 0) {
            if (children > 0) {
                name = new Array(2 * depth - 1).join("&nbsp;") + "+&nbsp;" + name;
            }
            else {
                name = new Array(2 * depth - 1).join("&nbsp;") + "-&nbsp;" + name;
            }
        }
        return name;
     }
    WCObj.IterateCheckBoxes = function() {
        var selIndex = returnObjById("selIndex");
        var val = selIndex.options[selIndex.selectedIndex].value;
        var kids = val.slice(val.indexOf("_") + 1);
        var fid = val.slice(0,val.indexOf("_"));
        if (kids === "0") {            
            var x=document.getElementsByName("chkUrlSelected");
            if(x.length > 0){
                for (j = 0; j < x.length; j++) {
                    if (x[j].checked === true) {
                        Index.AddToIndex(x[j].selUrl,fid);
                        x[j].checked = false;
                    }              
                }
            }
        }
        else {
            alert("please choose a sub index!");
        }
    };
    WCObj.IterateCategoryCheckBoxes = function() {
        var selIndex = returnObjById("selIndex");
        var val = selIndex.options[selIndex.selectedIndex].value;
        var kids = val.slice(val.indexOf("_") + 1);
        var fid = val.slice(0,val.indexOf("_"));
        
        var x=document.getElementsByName("chkCategorySelected");
        if(x.length > 0){
            for (j = 0; j < x.length; j++) {
                if (x[j].checked === true) {
                    Index.MoveCategory(x[j].indexId,fid);
                    x[j].checked = false;
                }              
            }
        }
    };
    
    //****   Get Listing of Indexes 
    //****************************************************************
    
    //****************************************************************
    //****   Add listing to Index
    WCObj.AddToIndex = function(u,id) {
        var codeRequest = "admin/tools/JSON/IndexLink.aspx?w=Index.displayIndexedLink&u=" + u + "&i=" + id;
        AddJSONScriptTag(codeRequest);    
    }; 
    WCObj.displayIndexedLink = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.Links;
        
        if (r && r.length > 0) {
            document.location.reload();
        } else {
            alert("Nothing was returned after the link was inserted?");
        }
    };
    //****   Add listing to Index 
    //****************************************************************
    
    //****************************************************************
    //****   Add listing to Index
    WCObj.MoveCategory = function(sid,tid) {
        var codeRequest = "admin/tools/JSON/MoveCategory.aspx?w=Index.displayMovedCategory&sid=" + sid + "&tid=" + tid;
        AddJSONScriptTag(codeRequest);    
    }; 
    WCObj.displayMovedCategory = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.Category;
        
        if (r && r.length > 0) {
            var el = returnObjById("index_" + r[0]);
            el.parentNode.removeChild(el);
            Index.layoutCategories();
        } else {
            alert("Nothing was returned after the category was moved?");
        }
    };
    //****   Add listing to Index 
    //****************************************************************
    
    //****************************************************************
    //****   Add an index to the DB 
    WCObj.AddIndex = function() {
    
        var indexAddNewSpan = returnObjById("indexAddNewSpan");
        indexAddNewSpan.innerHTML = "";
        
        var addNewIndex = document.createElement("SPAN");
        addNewIndex.id = "addNewIndex";
        var txtAddNewIndex = document.createElement("INPUT");
        txtAddNewIndex.type = "text";
        txtAddNewIndex.id = "txtIndexAdd";
        txtAddNewIndex.style.cssText = "width:200px;";
        addNewIndex.appendChild(txtAddNewIndex);
        var butAddNewIndex = document.createElement("INPUT");
        butAddNewIndex.type = "button";
        butAddNewIndex.value = "Add";
        butAddNewIndex.onclick= function(){Index.AddIndexConfirm();};
        addNewIndex.appendChild(butAddNewIndex);        
        var indexAddNewClear = document.createElement("A");
        indexAddNewClear.id = "indexAddNewClear";
        indexAddNewClear.href = "#" ;
        indexAddNewClear.innerHTML = "[X]";
        indexAddNewClear.onclick = function(){Index.layoutCategories();return false;};
        indexAddNewClear.style.fontSize = "smaller";
        addNewIndex.appendChild(indexAddNewClear);
        
        indexAddNewSpan.appendChild(addNewIndex);
        
    }; 
    WCObj.AddIndexConfirm = function() {
    
        var txtBox  = returnObjById("txtIndexAdd");
        var txt = txtBox.value.replace(/^\s+|\s+$/g, '') ;
        var parentId = getURLparam("i");
        if (parentId === null || parentId === undefined || parentId === "") { parentId = 0; }
        if (txt.length > 0) {
            var codeRequest = "admin/tools/JSON/AddIndex.aspx?w=Index.displayAddedIndex&pi=" + parentId + "&n=" + escape(txt);
            AddJSONScriptTag(codeRequest);  
        } else {
            alert("No index name entered");
        }
    }
    WCObj.displayAddedIndex = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.Index;
        
        if (r && r.length > 0) {
            var newIndex = r[0];
            var newName = r[1];
            
            newDiv = document.createElement("DIV");
            newDiv.className = "indexListMember";
            newDiv.id= "index_" + newIndex;
            
            newDivId = document.createElement("DIV");
            newDivId.className = "indexId";
            newDivId.innerHTML = newIndex;
            newDivName = document.createElement("DIV");
            newDivName.className = "indexName";
            newDivName.innerHTML = newName;
            
            newDiv.appendChild(newDivId);
            newDiv.appendChild(newDivName);
           
                
            returnObjById("categoriesList").appendChild(newDiv);
            
            
//            var indexAddNewSpan = returnObjById("indexAddNewSpan");
//            indexAddNewSpan.parentNode.removeChild(indexAddNewSpan);
            
            Index.layoutCategories();
        } else {
            alert ("New category not added. Does it already exist?");
        }
    };
    //****   Add an index to the DB 
    //****************************************************************
    
    //****************************************************************
    //****   Delete an index from the DB 
    WCObj.deleteIndex = function(id) {
        
        if (confirm("Are you sure you want to dete this index?")) {            
            var codeRequest = "admin/tools/JSON/DeleteIndex.aspx?w=Index.displayDeletedIndex&i=" + id ;
            AddJSONScriptTag(codeRequest);              
        } else {
            alert("OK, nothing will happen");
        }
    }; 
    WCObj.displayDeletedIndex = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.Index;
        
        if (r && r.length > 0) {
            var indexList = document.getElementById("categoriesList");
            var indexes = getElementsByTagNameAndClass(indexList,"DIV","indexListMember");
            
            if (indexes && indexes.length > 0) {
                for (var j=0;j<indexes.length;j++) {
                   if (indexes[j].id === "index_" + r[0]) {
                    indexes[j].parentNode.removeChild(indexes[j]);                   
                   }
                }
            }            
            Index.layoutCategories();            
        } else {
            alert("Delete failed! Are you sure there are no sub indexes?");
        }
    };
    //****   Delete an index from the DB 
    //****************************************************************
    
    //****************************************************************
    //****   Alter an index name 
    WCObj.alterIndexName = function(id) {
        var listItem = returnObjById("indexItem_" + id);
        var txtNewName = document.createElement("INPUT");
        txtNewName.id = "txtNewName_" + id;
        txtNewName.type = "text";
        txtNewName.value = listItem.name;        
        
        var butNewName = document.createElement("INPUT");
        butNewName.type = "button";
        butNewName.value = "Alter";
        butNewName.indexId = id;
        butNewName.onclick = function(){Index.alterIndexNameConfirm(this.indexId);};
        
        listItem.innerHTML = "";
        listItem.appendChild(txtNewName);
        listItem.appendChild(butNewName);
        
    };  
    WCObj.alterIndexNameConfirm = function(id) {
        var txtNewName = returnObjById("txtNewName_" + id);
        var newName = txtNewName.value.replace(/^\s+|\s+$/g, '');        
        
        if (newName.length > 0) {
            var codeRequest = "admin/tools/JSON/AlterIndex.aspx?w=Index.displayIndexName&i=" + id + "&n=" + escape(newName) ;
            AddJSONScriptTag(codeRequest);           
        
        }
        
    }; 
    WCObj.displayIndexName = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.IndexName;
        
        if (r && r.length > 0) {
            var indexName = r[0];
            var indexId = r[1];
            
            var indexDiv = returnObjById("index_" + indexId);
            indexDiv.innerHTML = "<div class=\"indexId\">" + indexId + "</div><div class=\"indexName\">" + indexName + "</div>";
            
            Index.layoutCategories();            
        } else {
            alert("Alter failed!");
        }
    };
    //****   Alter an index name
    //****************************************************************
    
    
    WCObj.layoutCategories = function() {
        var indexListUL = document.getElementById("indexListUL");
        if (indexListUL) {
            indexListUL.parentNode.removeChild(indexListUL);
        }
        
        var indexList = document.getElementById("categoriesList");
        var indexes = getElementsByTagNameAndClass(indexList,"DIV","indexListMember");
        
        if (indexes && indexes.length > 0) {
            var table = document.createElement("TABLE");
            table.id = "catListTable";
            var tb = document.createElement("TBODY");
            table.appendChild(tb);
            var tr = document.createElement("TR");
            tr.style.verticalAlign="top";
            tb.appendChild(tr);
            var td1 = document.createElement("TD");
            var td2 = document.createElement("TD");
            var td3 = document.createElement("TD");
            td1.style.padding="10px 10px";
            td2.style.padding="10px 10px";
            td3.style.padding="10px 10px";
            tr.appendChild(td1);
            tr.appendChild(td2);
            tr.appendChild(td3);
            var colCount = 0;
            var tdCount = 1;
            
            for (var j=0;j<indexes.length;j++) {
                var indexId = getElementsByTagNameAndClass(indexes[j],"DIV","indexId")[0].innerHTML;
                var indexName = getElementsByTagNameAndClass(indexes[j],"DIV","indexName")[0].innerHTML; 
//                var indexCount = getElementsByTagNameAndClass(indexes[j],"DIV","indexCount")[0].innerHTML;           
                var item = document.createElement("LI");
                item.id = "indexItem_" + indexId;
                item.name = indexName;
                item.style.margin = "5px 10px";
                
//                var indexLink = document.createElement("A");
//                indexLink.className = "CategoryLink";
//                indexLink.href = "?i=" + indexId;
//                indexLink.innerHTML = indexName;
                
                var indexCounter = document.createElement("SPAN");
                indexCounter.className = "CategoryCount";
                indexCounter.innerHTML = "(" + indexCount + ")";
                item.appendChild(indexCounter);
                
                if (mbrType === "Administrator") {
                    var indexLinkAlter = document.createElement("A");
                    indexLinkAlter.href = "#" ;
                    indexLinkAlter.innerHTML = "alter";
                    indexLinkAlter.indexId = indexId;
                    indexLinkAlter.onclick = function(){Index.alterIndexName(this.indexId);};
                    indexLinkAlter.style.padding = "0 0 0 5px";
                    indexLinkAlter.style.fontSize = "smaller";
                    
                    var indexLinkDelete = document.createElement("A");
                    indexLinkDelete.href = "#";
                    indexLinkDelete.innerHTML = "delete";
                    indexLinkDelete.indexId = indexId;
                    indexLinkDelete.onclick = function(){Index.deleteIndex(this.indexId);return false;};
                    indexLinkDelete.style.padding = "0 0 0 5px";
                    indexLinkDelete.style.fontSize = "smaller";
                    
                    var chkBox = document.createElement("INPUT");
                    chkBox.type = "checkBox";
                    chkBox.name = "chkCategorySelected";
                    chkBox.indexId = indexId;
                    
                    item.appendChild(indexLinkAlter);
                    item.appendChild(indexLinkDelete);
                    item.appendChild(chkBox);
                 
                }
                
                if(colCount >= indexes.length/3) {
                    tdCount++;
                    colCount = 1;
                } else {
                    colCount++;
                }
                switch (tdCount) {
                    case 1:
                        td1.appendChild(item);
                        break;
                    case 2:
                        td2.appendChild(item);
                        break;
                    case 3:
                        td3.appendChild(item);
                        break;
                }
            }
            indexList.parentNode.insertBefore(table,indexList);
        } else {
            indexList.innerHTML = "";
        }
        
        if (mbrType === "Administrator") {
            var indexAddNewSpan = document.getElementById("indexAddNewSpan");
            if (indexAddNewSpan) {
                indexAddNewSpan.parentNode.removeChild(indexAddNewSpan);
            }
            indexAddNewSpan = document.createElement("SPAN");
            document.getElementById("indexPath").appendChild(indexAddNewSpan);
            
            indexAddNewSpan.id = "indexAddNewSpan";
            var indexAddNew = document.createElement("A");
            indexAddNew.id = "indexAddNew";
            indexAddNew.href = "#" ;
            indexAddNew.innerHTML = "[Add new sub-category]";
            indexAddNew.onclick = function(){Index.AddIndex();return false;};
            indexAddNew.style.padding = "0 0 0 5px";
            indexAddNew.style.fontSize = "smaller";
            indexAddNewSpan.appendChild(indexAddNew);
      }  
    };
    
    //****************************************************************
    //****   Remove a link from an index 
    WCObj.removeLink = function(u,i) {
        
        if (confirm("Are you sure you want to remove this link?")) {            
            var codeRequest = "admin/tools/JSON/RemoveLinkFromIndex.aspx?w=Index.displayRemovedLink&u=" + u + "&i=" + i ;
            AddJSONScriptTag(codeRequest);              
        } else {
            alert("OK, nothing will happen");
        }
    }; 
    WCObj.displayRemovedLink = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.LinkId;
        
        if (r && r.length > 0) {
            //reload page
            document.location.reload();
//            var linkList = document.getElementById("linkList");
//            var links = getElementsByTagNameAndClass(linkList,"DIV","linkListMember");
//            
//            if (links && links.length > 0) {
//                for (var j=0;j<links.length;j++) {
//                   if (links[j].id === "link_" + r[0]) {
//                    links[j].parentNode.removeChild(links[j]);                   
//                   }
//                }
//            }            
//            Index.layoutLinks();            
        } else {
            alert("Remove failed!");
        }
    };
    //****   Remove a link from an index 
    //****************************************************************
    //****************************************************************
    //****   Remove a tag from the list of terms
    WCObj.removeTag = function(t) {
        
        if (confirm("Are you sure you want to remove this Tag?")) {            
            var codeRequest = "admin/tools/JSON/RemoveTagFromTerms.aspx?w=Index.displayRemovedTag&t=" + t;
            AddJSONScriptTag(codeRequest);              
        } else {
            alert("OK, nothing will happen");
        }
    }; 
    WCObj.displayRemovedTag = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.Tag;
        
        if (r && r.length > 0) {
            var tagList = document.getElementById("tagList");
            var tags = getElementsByTagNameAndClass(tagList,"DIV","tagListMember");
            
            if (tags && tags.length > 0) {
                for (var j=0;j<tags.length;j++) {
                   if (tags[j].id === "tag_" + r[0].replace(/\s/g,"_")) {
                    tags[j].parentNode.removeChild(tags[j]);                   
                   }
                }
            }            
            Index.layoutIndex();            
        } else {
            alert("Remove failed!");
        }
    };
    //****   Remove a tag from the list of terms
    //****************************************************************
    //****************************************************************
    //****   Add a new tag synonym
    WCObj.makeTagSynonym = function(t) {
        var listItem = returnObjById("tag_" + escape(t));
        var txtSynonym = document.createElement("INPUT");
        txtSynonym.id = "txtSynonym_" + escape(t);
        txtSynonym.type = "text";
        txtSynonym.value = t;        
        
        var butNewSynonym = document.createElement("INPUT");
        butNewSynonym.type = "button";
        butNewSynonym.value = "Go";
        butNewSynonym.tag = t;
        butNewSynonym.onclick = function(){Index.makeTagSynonymConfirm(this.tag);};
        
        listItem.innerHTML = "";
        listItem.appendChild(txtSynonym);
        listItem.appendChild(butNewSynonym);
        
    };  
    WCObj.makeTagSynonymConfirm = function(t) {
        
        var txtSynonym = returnObjById("txtSynonym_" + escape(t));
        var synonym = txtSynonym.value.replace(/^\s+|\s+$/g, '');        
        
        if (synonym.length > 0) {
            var codeRequest = "admin/tools/JSON/AddSynonym.aspx?w=Index.displayNewSynonym&t=" + escape(synonym) + "&s=" + escape(t);
            AddJSONScriptTag(codeRequest);
        }
    }; 
    WCObj.displayNewSynonym = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.Tag;
        
        if (r && r.length > 0) {
            var listItem = returnObjById("tag_" + escape(r[1]));
            listItem.innerHTML = r[2];
            
            
        } else {
            alert("Synomize failed!");
        }
    };
    //****   Add a new tag synonym
    //****************************************************************
    
    WCObj.layoutLinks = function() {
        var linkListUL = document.getElementById("linkListUL");
        if (linkListUL) {
            linkListUL.parentNode.removeChild(linkListUL);
        }
        var linkList = document.getElementById("linkList");
        var links = getElementsByTagNameAndClass(linkList,"DIV","linkListMember");
        
        if (links && links.length > 0) {
            //info and list controls
            var linkListInfo = document.getElementById("linkListInfo");
            if (!linkListInfo) {
                linkListInfo = document.createElement("DIV");
                linkListInfo.id = "linkListInfo";
                linkListInfo1 = document.createElement("DIV");
                linkListInfo1.id = "linkListInfo1";
                linkListInfo.appendChild(linkListInfo1);
                linkListInfo1.style.textAlign = "right";
                linkListInfo1.id = "linkListInfo1";
                // Number of listings
                var linkCount = document.createElement("SPAN");
                linkCount.style.textAlign = "right";
                linkCount.innerHTML = links.length + " listings found"; 
                
                linkList.parentNode.insertBefore(linkListInfo,linkList); 
                linkListInfo1.appendChild(linkCount);          
                
                //advanced control holder
                var linkControls = document.createElement("SPAN");
                linkControls.id = "linkControls";
                linkControls.style.display = "none";
                linkListInfo1.appendChild(linkControls);
                
                //advanced control holder show/hide link
                var linkControlsBut = document.createElement("A");
                linkControlsBut.style.margin = "0 0 0 5px";
                linkControlsBut.style.padding = "2px 2px";
                linkControlsBut.style.border = "1px solid Green";
                //linkControlsBut.href = "#";
                linkControlsBut.id = "linkControlsBut";
                linkControlsBut.style.cursor = "pointer";
                linkControlsBut.innerHTML = "Display Options";
                linkControlsBut.onclick = function(){Index.ShowHideControls();return false;}; 
                linkListInfo1.appendChild(linkControlsBut);
                
                //sort controls
                var linkSort = document.createElement("SPAN");
                linkSort.style.margin = "0 0 0 5px";
                linkSort.style.padding = "2px 2px";
                linkSort.style.border = "1px solid Green";
                linkSort.style.textAlign = "right";
                linkSort.id = "linkSort";
                linkSort.innerHTML += "Sort by: ";
                linkSort.innerHTML += "<input type='radio' name='rbSort' id='rbSortAlpha' onclick='Index.layoutLinks()'>Title";
                linkSort.innerHTML += "<input type='radio' name='rbSort' id='rbSortPop' onclick='Index.layoutLinks()' CHECKED>Popularity";
                linkSort.innerHTML += "<input type='radio' name='rbSort' id='rbSortSize' onclick='Index.layoutLinks()'>Size";
                
                //show controls
                var linkShow = document.createElement("SPAN");
                linkShow.style.margin = "0 0 0 5px";
                linkShow.style.padding = "2px 2px";
                linkShow.style.border = "1px solid Green";
                linkShow.style.textAlign = "right";
                linkShow.id = "linkShow";
                linkShow.innerHTML += "Show: ";
                linkShow.innerHTML += "<input type='checkbox' id='chkIcons' onclick='Index.layoutLinks()'>Icons";
                linkShow.innerHTML += "<input type='checkbox' id='chkTitles' onclick='Index.layoutLinks()' CHECKED>Title";
                linkShow.innerHTML += "<input type='checkbox' id='chkDetails' onclick='Index.layoutLinks()' CHECKED>Details";
                linkShow.innerHTML += "<input type='checkbox' id='chkTags' onclick='Index.layoutLinks()' CHECKED>Tags";
//                linkShow.innerHTML += "<input type='checkbox' id='chkCategories' onclick='Index.layoutLinks()' CHECKED>Categories";
                
                linkControls.appendChild(linkSort);
                linkControls.appendChild(linkShow);
            } 
            
            var chkIcons = document.getElementById("chkIcons");
            var chkTitles = document.getElementById("chkTitles");
            var chkDetails = document.getElementById("chkDetails");
            var chkTags = document.getElementById("chkTags");
//            var chkCategories = document.getElementById("chkCategories");
            
            var list = document.createElement("DIV");
            list.id = "linkListUL";
            
            var arrLinks = [];        
            for (var j=0;j<links.length;j++) {
                var objLink = {}; 
                objLink.linkUrl = getElementsByTagNameAndClass(links[j],"DIV","linkUrl")[0].innerHTML;
                objLink.linkTitle = getElementsByTagNameAndClass(links[j],"DIV","linkTitle")[0].innerHTML; 
                objLink.linkDetails = getElementsByTagNameAndClass(links[j],"DIV","linkDetails")[0].innerHTML; 
                objLink.linkLinks = getElementsByTagNameAndClass(links[j],"DIV","linkLinks")[0].innerHTML; 
                objLink.linkSize = getElementsByTagNameAndClass(links[j],"DIV","linkSize")[0].innerHTML;
                objLink.linkTags = getElementsByTagNameAndClass(links[j],"DIV","linkTags")[0];
                objLink.linkIndexes = getElementsByTagNameAndClass(links[j],"DIV","linkIndexes")[0];
                objLink.value = objLink.linkTitle.toLowerCase();
                arrLinks.push(objLink);
            }
            
            
            if (document.getElementById("rbSortAlpha").checked) {
                arrLinks.sort(function(a,b) { 
                        var A = a.value; 
                        var B = b.value; 
                        if (A < B) {return -1}; 
                        if (A > B) {return 1}; 
                        return 0;
                    });
            } else if (document.getElementById("rbSortSize").checked) {
                arrLinks.sort(function(a,b) {return b.linkSize - a.linkSize});
            } else {
                arrLinks.sort(function(a,b) {return b.linkLinks - a.linkLinks});
            }
//            if (chkSortLinks.checked) {
//                arrLinks.sort(function(a,b) {return a.linkLinks - b.linkLinks});
//            } else {
//                arrLinks.sort(function(b,a) {return a.linkLinks - b.linkLinks});
//            }
            for (var j=0;j<links.length;j++) {
            
                objLink = arrLinks[j];
                
                var item = document.createElement("DIV");
                item.style.padding = "5px 0";
                
                if (chkIcons.checked) {
                    var img = document.createElement("IMG");
                    img.style.cssText = "float:left;width:16px;height:16px;padding-right:5px;";
                    img.src = "img/icon_busy.gif";
                    img.srcLink = objLink.linkUrl;
                    img.onload = function(){faviconLoad(this,this.srcLink);};
                    img.onerror =  function(){faviconLoadError(this);};                    
                    item.appendChild(img);
                }
                
                var listing = document.createElement("DIV");
                listing.style.marginLeft = "20px";
                
                if (chkTitles.checked) {
                    var linkTitleDiv = document.createElement("DIV");
                    var linkLink = document.createElement("A");
                    linkLink.href = "http://" + objLink.linkUrl;
                    linkLink.innerHTML = objLink.linkTitle;
                    linkTitleDiv.appendChild(linkLink)                                
                    listing.appendChild(linkTitleDiv);
                    
                    var linkStats = document.createElement("SPAN");
                    if (mbrType !== "Administrator") {
                        linkStats.style.color = "white";
                    } else {
                        linkStats.style.color = "Gray";
                    }
                    linkStats.style.margin = "0 5px";
                    linkStats.innerHTML = "[links: " + objLink.linkLinks + " / size: " + objLink.linkSize + "]";
                    linkTitleDiv.appendChild(linkStats);
                }
                
                if (mbrType === "Administrator") {
                    var chkBox = document.createElement("INPUT");
                    chkBox.type = "checkBox";
                    chkBox.name = "chkUrlSelected";
                    chkBox.selUrl = objLink.linkUrl;
                    linkTitleDiv.appendChild(chkBox);
                }
                
                if (chkDetails.checked) {
                    var linkBody = document.createElement("DIV");
                    linkBody.innerHTML = objLink.linkDetails;
                    listing.appendChild(linkBody);
                }
                
                if (chkTags.checked) {
                    var linkTagsList = document.createElement("DIV");
                    linkTagsList.style.fontFamily = "Arial";
                    linkTagsList.style.fontSize = "75%";
                    var linkTagArray = getElementsByTagNameAndClass(objLink.linkTags,"DIV","linkTag");
                    if (linkTagArray && linkTagArray.length > 0) {
                        linkTagsList.innerHTML = "Tags:";
                        for (var k=0;k<linkTagArray.length;k++) {
                            var tagLink = document.createElement("A");
                            tagLink.href = "tag.aspx?t=" + escape(linkTagArray[k].innerHTML);
                            tagLink.innerHTML = linkTagArray[k].innerHTML;
                            tagLink.style.color = "gray";
                            tagLink.style.margin = "0 5px";
                            //tagLink.style.whiteSpace = "nowrap";
                            linkTagsList.appendChild(tagLink);
                        }
                    }
                    listing.appendChild(linkTagsList);
                }
                
                var linkVisUrl = document.createElement("DIV");
                linkVisUrl.style.color = "green";
                linkVisUrl.innerHTML = objLink.linkUrl;
                listing.appendChild(linkVisUrl);
                
//                if (chkCategories.checked) {
//                    var linkIndexesList = document.createElement("SPAN");
//                    linkIndexesList.style.fontFamily = "Arial";
//                    linkIndexesList.style.fontSize = "75%";
//                    linkIndexesList.style.color = "black";
//                    linkIndexesList.style.margin = "0 10px";
//                    var linkIndexArray = getElementsByTagNameAndClass(objLink.linkIndexes,"DIV","linkIndex");
//                    if (linkIndexArray && linkIndexArray.length > 0) {
//                        for (var k=0;k<linkIndexArray.length;k++) {
//                            if (k===0) { linkIndexesList.innerHTML = " - Appears in categories:"; }
//                            var indexName = getElementsByTagNameAndClass(linkIndexArray[k],"DIV","indexName")[0];
//                            var indexId = getElementsByTagNameAndClass(linkIndexArray[k],"DIV","indexId")[0];
//                            
//                            var indexLink = document.createElement("A");
//                            indexLink.href = "cat.aspx?i=" + indexId.innerHTML;
//                            indexLink.innerHTML = indexName.innerHTML;
//                            //indexLink.style.color = "blue";
//                            indexLink.style.margin = "0 5px";
//                            //indexLink.style.whiteSpace = "nowrap";
//                            
//                            linkIndexesList.appendChild(indexLink);
//                            
//                            
//                            if (mbrType === "Administrator") {
//                                var linkRemoveFromIndex = document.createElement("A");
//                                linkRemoveFromIndex.href = "#";
//                                linkRemoveFromIndex.innerHTML = "[X]";
//                                linkRemoveFromIndex.linkUrl = objLink.linkUrl;
//                                linkRemoveFromIndex.indexId = indexId.innerHTML;
//                                linkRemoveFromIndex.onclick = function(){Index.removeLink(this.linkUrl,this.indexId);};
//                                linkIndexesList.appendChild(linkRemoveFromIndex);
//                            }
//                            
//                        }
//                        linkVisUrl.appendChild(linkIndexesList);
//                    }
//                }
                

                item.appendChild(listing);
                list.appendChild(item);
            }
            linkList.parentNode.insertBefore(list,linkList);
            
        } else {
            linkList.innerHTML = "";
        }
    };
    WCObj.layoutTags = function() {
        var tagListUL = document.getElementById("tagListUL");
        if (tagListUL) {
            tagListUL.parentNode.removeChild(tagListUL);
        }
        
        var linkListInfo = document.getElementById("linkListInfo");
        var linkListInfo2 = document.createElement("DIV");
        linkListInfo.appendChild(linkListInfo2);
        linkListInfo2.id = "linkListInfo2"; 
        var tagList = document.getElementById("tagList");
        var tags = getElementsByTagNameAndClass(tagList,"DIV","tagListMember");
        
        if (tags && tags.length > 0) {
            var list = document.createElement("UL");
            list.id = "tagListUL";
            list.innerHTML = "See also:";
            list.style.cssText = "float:left;display:inline;font-family:arial;font-size:small;background-color:LightYellow;overflow:auto;width:100%;";
            for (var j=0;j<tags.length;j++) {
                var tagDetails = getElementsByTagNameAndClass(tags[j],"DIV","tagDetails")[0].innerHTML; 
                var item = document.createElement("LI");
                item.style.cssText = "float:left;margin:0 1em;display:inline;";
                var tagLink = document.createElement("A");
                tagLink.href = "tag.aspx?t=" + escape(tagDetails);
                tagLink.innerHTML = tagDetails;
                tagLink.style.cssText = "color:gray;";
                
                item.appendChild(tagLink);
                
                if (mbrType === "Administrator") {
                    var tagBan = document.createElement("A");
                    tagBan.innerHTML = "[<u>X</u>]";
                    tagBan.tagDetails = tagDetails;
                    tagBan.onclick = function(){Index.removeTag(this.tagDetails);};
                    tagBan.style.padding = "0 0 0 5px";
                    tagBan.style.cursor = "pointer";
                    item.appendChild(tagBan);                
                }
                
                list.appendChild(item);
            }
            //tagList.parentNode.insertBefore(list,tagList);
            linkListInfo2.appendChild(list);
        } else {
            tagList.innerHTML = "";
        }
    };
    
    WCObj.layoutIndex = function() {
        var tagListUL = document.getElementById("tagListUL");
        if (tagListUL) {
            tagListUL.parentNode.removeChild(tagListUL);
        }
        var tagList = document.getElementById("tagList");
        var tags = getElementsByTagNameAndClass(tagList,"DIV","tagListMember");
        
        if (tags && tags.length > 0) {
            var table = document.createElement("TABLE");               
            table.id = "tagListUL";
            //table.style.width="100%";
            table.style.margin="10px auto";
            var tb = document.createElement("TBODY");
            table.appendChild(tb);
            var tr = document.createElement("TR");
            tr.style.verticalAlign="top";
            tb.appendChild(tr);
            var td1 = document.createElement("TD");
            var td2 = document.createElement("TD");
            var td3 = document.createElement("TD");
            var td4 = document.createElement("TD");
            td1.style.width="25%";
            td2.style.width="25%";
            td3.style.width="25%";
            td4.style.width="25%";
            tr.appendChild(td1);
            tr.appendChild(td2);
            tr.appendChild(td3);
            tr.appendChild(td4);
            //list.innerHTML = "Common tags in this category:";
            //list.style.cssText = "float:left;display:inline;font-family:arial;font-size:smaller;";
            var colCount = 0;
            var tdCount = 1;
            
            var maxCount = document.getElementById("maxCount").innerHTML;
            var minCount = document.getElementById("minCount").innerHTML;
            
            for (var j=0;j<tags.length;j++) {
                var item = document.createElement("DIV");
                if (tags[j].attributes["type"].nodeValue === "CAT") {
                    var categoryDetails = getElementsByTagNameAndClass(tags[j],"DIV","indexListMember")[0];
                    
                    var catLink = document.createElement("A");
                    catLink.href = "cat.aspx?i=" + getElementsByTagNameAndClass(categoryDetails,"DIV","indexId")[0].innerHTML;
                    catLink.innerHTML = getElementsByTagNameAndClass(categoryDetails,"DIV","indexName")[0].innerHTML;
                    catLink.title = "Category: " + getElementsByTagNameAndClass(categoryDetails,"DIV","indexName")[0].innerHTML; 
                    catLink.className = "CategoryLink"; 
                            
                    item.appendChild(catLink);
                } else {
                    var tagDetails = getElementsByTagNameAndClass(tags[j],"DIV","tagDetails")[0].innerHTML;
                    var tagCount = getElementsByTagNameAndClass(tags[j],"DIV","tagCount")[0].innerHTML; 
                    item.id = "tag_" + escape(tagDetails);
                    //item.style.cssText = "float:left;margin:0 1em;display:inline;";
                    var tagLink = document.createElement("A");
                    tagLink.href = "tag.aspx?t=" + escape(tagDetails);
                    tagLink.innerHTML = tagDetails;
                    tagLink.title = "Tag: " + tagDetails;
                    tagLink.style.color = "gray";
                    //tagLink.style.fontSize = 100 + 50*Math.log(1+((tagCount - minCount)/(maxCount - minCount))) + "%";
                    tagLink.style.fontSize = 100 + 5*Math.sqrt(1+(100*(tagCount - minCount)/(maxCount - minCount))) + "%";
                    item.appendChild(tagLink);
                    
                    var tagCounter = document.createElement("SPAN");
                    tagCounter.innerHTML = "(" + tagCount + ")";
                    tagCounter.style.cssText = "color:green;padding:0 2px; font-size:smaller;";
                    item.appendChild(tagCounter);
                    
                    if (mbrType === "Administrator") {
                        var tagBan = document.createElement("A");
                        tagBan.innerHTML = "[<u>X</u>]";
                        tagBan.title = "Banish this tag";
                        tagBan.tagDetails = tagDetails;
                        tagBan.onclick = function(){Index.removeTag(this.tagDetails);};
                        tagBan.style.padding = "0 0 0 5px";
                        tagBan.style.cursor = "pointer";
                        item.appendChild(tagBan);
                        
                        var tagSyn = document.createElement("A");
                        tagSyn.innerHTML = "[<u>S</u>]";
                        tagSyn.title = "Enter the tag that this tag is synonomous with";
                        tagSyn.tagDetails = tagDetails;
                        tagSyn.onclick = function(){Index.makeTagSynonym(this.tagDetails);};
                        tagSyn.style.padding = "0 0 0 5px";
                        tagSyn.style.cursor = "pointer";
                        item.appendChild(tagSyn);
                    }
                    
                    item.appendChild(document.createElement("BR"));
                
                    var categoryDetails = getElementsByTagNameAndClass(tags[j],"DIV","indexListMember")
                    if (categoryDetails && categoryDetails.length > 0) {
                        var see = document.createElement("DIV")
                        see.innerHTML = "see: ";
                        see.className = "see";
                        item.appendChild(see)
                        var ul = document.createElement("DIV");
                        ul.className = "seealso";
                        //ul.style.margin = "-20px 0 5px 0";
                        for (var k=0;k<categoryDetails.length;k++) {
                            
                            var li = document.createElement("LI");
                            var catLink = document.createElement("A");
                            catLink.href = "cat.aspx?i=" + getElementsByTagNameAndClass(categoryDetails[k],"DIV","indexId")[0].innerHTML;
                            catLink.innerHTML = getElementsByTagNameAndClass(categoryDetails[k],"DIV","indexName")[0].innerHTML;
                            catLink.title = "Category: " + getElementsByTagNameAndClass(categoryDetails[k],"DIV","indexName")[0].innerHTML;
                            catLink.style.cssText = "color:green;";
                            li.appendChild(catLink);
                            if (k<categoryDetails.length-1) {
                                var comma = document.createElement("SPAN");
                                comma.innerHTML = ",";
                                li.appendChild(comma);
                            }
                            ul.appendChild(li);
                            //ul.appendChild(document.createElement("BR"))
                        }
                        item.appendChild(ul);
                    }
                }
                if(colCount >= tags.length/4) {
                    tdCount++;
                    colCount = 1;
                } else {
                    colCount++;
                }
                switch (tdCount) {
                    case 1:
                        td1.appendChild(item);
                        break;
                    case 2:
                        td2.appendChild(item);
                        break;
                    case 3:
                        td3.appendChild(item);
                        break;
                    case 4:
                        td4.appendChild(item);
                        break;
                }
            }
            //alert(table.childNodes[0].childNodes[0].childNodes.length);
            tagList.parentNode.insertBefore(table,tagList);
        } else {
            tagList.innerHTML = "No tags or categories found...";
        }
    };
    
    
    WCObj.ShowHideControls = function() {
        var but = document.getElementById("linkControlsBut");
        if (but !== null) {            
            var cont = document.getElementById("linkControls");
            if (cont.style.display != "none") {
                cont.style.display = "none";
                but.innerHTML = "Display Options";
            }
            else
            {
                cont.style.display = "";
                but.innerHTML = "Hide >>";
            }
        }
    };
    
    WCObj.bookmark_us = function (url, title){
        if (window.sidebar) { // firefox
            window.sidebar.addPanel(title, url, "");
        }
        else if(window.opera && window.print){ // opera
            var elem = document.createElement('a');
            elem.setAttribute('href',url);
            elem.setAttribute('title',title);
            elem.setAttribute('rel','sidebar');
            elem.click();
        } 
        else if(document.all) {// ie
            window.external.AddFavorite(url, title);
        }
    }; 
    

    return WCObj;
    
}
Index = new Index();