﻿function Index() {
    var WCObj = {};    
    
    var rootURL = "";
    var headID = 0;
    var rsc;
    var mbrType = "Guest";//membership Type
    var maxTags = 52;
    var subIndexIdx = 0;
    
    //************** 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;
        var psMaxTags = returnObjById("psMaxTags"); //max tags per page
        if (psMaxTags) maxTags = Number(psMaxTags.innerHTML);
        var t = getURLparam("si");
        if (t.length > 0) subIndexIdx = Number(t);
    }

    //****************************************************************
    //****   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  
    WCObj.removeLink = function(u,optBan) {
        
        if (confirm("Are you sure you want to remove this link?")) {            
            var codeRequest = "admin/tools/JSON/RemoveLink.aspx?w=Index.displayRemovedLink&u=" + u + "&ban=" + optBan;
            AddJSONScriptTag(codeRequest);              
        } else {
            alert("OK, nothing will happen");
        }
    }; 
    WCObj.displayRemovedLink = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.RemovedLink;
        
        if (r && r.length > 0) {
            //reload page
            document.location.reload();
        } else {
            alert("Remove failed!");
        }
    };
    //****   Remove a link  
    //****************************************************************
    //****************************************************************
    //****   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
    //****************************************************************
    
    //****************************************************************
    //****   Requeue a URL for thumbshotting
    WCObj.reQueue = function(u) {
        
        if (confirm("Are you sure you want to re-queue this thumbshot?")) {            
            var codeRequest = "admin/tools/JSON/ReQueueThumbshot.aspx?w=Index.displayReQueue&u=" + u;
            AddJSONScriptTag(codeRequest);              
        } else {
            alert("OK");
        }
    }; 
    WCObj.displayReQueue = function(jsonData) {
        var t = eval(jsonData);  
        var r = t.Thumb;
        
        if (r && r.length > 0) {
            var rqMsg = document.getElementById("imgQ_" + r[0]);
            
            if (rqMsg) {
                rqMsg.innerHTML = r[1];
            }            
        } else {
            alert("re-queue failed!");
        }
    };
    //****   Requeue a URL for thumbshotting
    //****************************************************************
 
 
    //****************************************************************
    //****   Add a new tag plural
    WCObj.makeTagPlural = function(t) {
        var listItem = returnObjById("tag_" + escape(t));
        var txtPlural = document.createElement("INPUT");
        txtPlural.id = "txtPlural_" + escape(t);
        txtPlural.type = "text";
        txtPlural.value = depluralify(t);        
        
        var butNewPlural = document.createElement("INPUT");
        butNewPlural.type = "button";
        butNewPlural.value = "Plural";
        butNewPlural.tag = t;
        butNewPlural.onclick = function(){Index.makeTagPluralConfirm(this.tag);};
        
        listItem.innerHTML = "";
        listItem.appendChild(txtPlural);
        listItem.appendChild(butNewPlural);
        
    };  
    function depluralify(s) {
        if (s.substr(s.length-3,3) === "ies") {
            s = s.substr(0,s.length-3) + "y";
        } else if (s.substr(s.length-1,1) === "s") {
            s = s.substr(0,s.length-1);
        }
        return s;
    }
    WCObj.makeTagPluralConfirm = function(t) {
        
        var txtTagForPlural = returnObjById("txtPlural_" + escape(t));
        var tagForPlural = txtTagForPlural.value.replace(/^\s+|\s+$/g, '');        
        
        if (tagForPlural.length > 0) {
            var codeRequest = "admin/tools/JSON/AddPlural.aspx?w=Index.displayNewPlural&t=" + escape(tagForPlural) + "&p=" + escape(t);
            AddJSONScriptTag(codeRequest);
        }
    }; 
    WCObj.displayNewPlural = 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("Pluralize failed!");
        }
    };
    //****   Add a new tag plural
    //****************************************************************
    //****************************************************************
    //****   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 divRightCol = document.getElementById("divRightCol");
        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 pageTitle = document.getElementById("pageTitle");
            
            var linkListInfoInner = document.getElementById("linkListInfoInner");
            if (!linkListInfoInner) {            
                linkListInfoInner = document.createElement("DIV");
                linkListInfoInner.id = "linkListInfoInner";
                linkListInfoInner.className = "boxInner";
                pageTitle.appendChild(linkListInfoInner);
                // Number of listings
                var linkCount = document.createElement("SPAN");
                linkCount.id = "linkCount";
                linkCount.innerHTML = links.length + " listings found"; 
                
                //linkList.parentNode.insertBefore(linkListInfoOuter,linkList); 
                linkListInfoInner.appendChild(linkCount);          
                
                //advanced control holder
                var linkControls = document.createElement("SPAN");
                linkControls.id = "linkControls";
                linkControls.style.display = "none";
                linkListInfoInner.appendChild(linkControls);
                
                //advanced control holder show/hide link
                var linkControlsBut = document.createElement("A");
                linkControlsBut.id = "linkControlsBut";
                linkControlsBut.innerHTML = "Display Options";
                linkControlsBut.onclick = function(){Index.ShowHideControls();return false;}; 
                linkListInfoInner.appendChild(linkControlsBut);
                
                //sort controls
                var linkSort = document.createElement("SPAN");
                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.id = "linkShow";
                linkShow.innerHTML += "Show: ";
                linkShow.innerHTML += "<input type='checkbox' id='chkIcons' onclick='Index.layoutLinks()'>Icons";
                linkShow.innerHTML += "<input type='checkbox' id='chkThumbs' onclick='Index.layoutLinks()' CHECKED>Thumbnails";
                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";
               
                linkControls.appendChild(linkSort);
                linkControls.appendChild(linkShow);
            }  
            
            var chkIcons = document.getElementById("chkIcons");
            var chkThumbs = document.getElementById("chkThumbs");
            var chkTitles = document.getElementById("chkTitles");
            var chkDetails = document.getElementById("chkDetails");
            var chkTags = document.getElementById("chkTags");
            
            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.linkUG = getElementsByTagNameAndClass(links[j],"DIV","linkUG")[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});
            }
            for (var j=0;j<links.length;j++) {
            
                objLink = arrLinks[j];
                
                var item = document.createElement("DIV");
                item.style.padding = "5px 0";
                item.style.height = "100%";
                item.style.overflow = "auto";
                
                if (chkIcons.checked) {
                    var img = document.createElement("IMG");
                    img.className = "iconImg";
                    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");                
                if (chkIcons.checked) listing.style.marginLeft = "20px";
                if (objLink.linkUG === "True") {
                    listing.className = "divListingUG";
                    listing.title = "Owner generated content";
                }
                
                if (chkThumbs.checked) {
                    var thumb = document.createElement("IMG");
                    thumb.src = "thumb.aspx?u=" + objLink.linkUrl + "&s=t";
                    thumb.onmouseover = function(){Index.ExpImg(this);};
                    thumb.className = "smallThumb";                              
                    listing.appendChild(thumb);
                }
                
                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)
                    
                    var siteLink = document.createElement("A");
                    siteLink.href = "site.aspx?u=" + objLink.linkUrl;
                    siteLink.innerHTML = "more >>";
                    siteLink.className = "aListingMore"; 
                    linkTitleDiv.appendChild(siteLink)
                    
                    listing.appendChild(linkTitleDiv);
                    
                    var linkStats = document.createElement("SPAN");
                    if (mbrType !== "Administrator") {
                        linkStats.className = "sLinkStatsHidden";
                    } else {
                        linkStats.className = "sLinkStats";
                    }
                    linkStats.innerHTML = "[links: " + objLink.linkLinks + " / size: " + objLink.linkSize + "]";
                    linkTitleDiv.appendChild(linkStats);
                }
                
                if (chkDetails.checked) {
                    var linkBody = document.createElement("DIV");
                    linkBody.className = "divLinkDetails";
                    linkBody.innerHTML = objLink.linkDetails;
                    listing.appendChild(linkBody);
                }
                
                if (chkTags.checked) {
                    var linkTagsList = document.createElement("DIV");
                    linkTagsList.className = "divListingTags";
                    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.className = "aListingTag";
                            tagLink.href = "tag.aspx?t=" + escape(linkTagArray[k].innerHTML);
                            tagLink.innerHTML = linkTagArray[k].innerHTML;
                            linkTagsList.appendChild(tagLink);
                        }
                    }
                    listing.appendChild(linkTagsList);
                }
                
                var linkVisUrl = document.createElement("DIV");
                linkVisUrl.className = "divListingUrl";
                linkVisUrl.innerHTML = objLink.linkUrl;
                listing.appendChild(linkVisUrl);
                
                if (mbrType === "Administrator") {
                    var imgQ = document.createElement("A");
                    imgQ.innerHTML = "[<u>re-queue thumbshot</u>]";
                    imgQ.id = "imgQ_" + objLink.linkUrl;
                    imgQ.url = objLink.linkUrl;
                    imgQ.onclick = function(){Index.reQueue(this.url);};
                    imgQ.style.cssText = "padding:0 0 0 5px;cursor:pointer;";
                    listing.appendChild(imgQ);   
                    
                    var remL = document.createElement("A");
                    remL.innerHTML = "[<u>remove link</u>]";
                    remL.id = "remL_" + objLink.linkUrl;
                    remL.url = objLink.linkUrl;
                    remL.onclick = function(){Index.removeLink(this.url,'false');};
                    remL.style.cssText = "padding:0 0 0 5px;cursor:pointer;";
                    listing.appendChild(remL);     
                    
                    var banL = document.createElement("A");
                    banL.innerHTML = "[<u>banish link</u>]";
                    banL.id = "banL_" + objLink.linkUrl;
                    banL.url = objLink.linkUrl;
                    banL.onclick = function(){Index.removeLink(this.url,'true');};
                    banL.style.cssText = "padding:0 0 0 5px;cursor:pointer;";
                    listing.appendChild(banL);   
                                 
                }
                item.appendChild(listing);
                list.appendChild(item);
                
            }
            linkList.parentNode.insertBefore(list,linkList);
                
            
        } else {
            linkList.innerHTML = "";
        }
        
        linkListUL = document.getElementById("linkListUL");
        linkListUL.insertBefore(divRightCol,linkListUL.firstChild);
                
        Index.layoutVisitedTags();
    };
    WCObj.ExpImg = function(el) {
        var body=document.getElementsByTagName("BODY")[0];
        var divFrame=document.createElement("DIV"); 
        body.appendChild(divFrame);
        var pos = findPos(el);
        //divFrame.style.cursor="pointer";
        divFrame.onmouseout=function(){ if (divFrame.parentNode) divFrame.parentNode.removeChild(divFrame); };
        divFrame.style.width=3*el.width+"px";
        divFrame.style.height=3*el.height+"px";
        divFrame.style.position="absolute";
        divFrame.style.left=(pos[0]-el.width)+"px";
        divFrame.style.top=(pos[1]-el.height)+"px";
        divFrame.style.zIndex="999";
        
        var thm=document.createElement("IMG");        
        thm.src=el.src;
        thm.style.width=divFrame.style.width;
        thm.style.height=divFrame.style.height;
//        thm.style.border="solid 2px gray";
        thm.className="largeThumb";
        divFrame.appendChild(thm);     
        
        var bus=document.createElement("IMG");        
        bus.src="img/icon_busy.gif";
        bus.style.position="absolute";
        bus.style.left=(1.5*el.width)+"px";
        bus.style.top=(1.5*el.height)+"px"; 
        divFrame.appendChild(bus);
        
        var exp=document.createElement("IMG");  
//        exp.style.position="absolute";
//        exp.style.left="0px";
//        exp.style.top="0px";
        exp.style.width=divFrame.style.width;
        exp.style.height=divFrame.style.height;
//        exp.style.border="solid 2px gray";
        exp.src=el.src.replace("s=t","s=o");
        exp.className="largeThumb";
        divFrame.appendChild(exp);
    };
    WCObj.layoutTags = function() {
        var tagListUL = document.getElementById("tagListUL");
        if (tagListUL) {
            tagListUL.parentNode.removeChild(tagListUL);
        }
        
        var listingTags = document.getElementById("listingTags");
        var tagList = document.getElementById("tagList");
        var tags = getElementsByTagNameAndClass(tagList,"DIV","tagListMember");
        
        if (tags && tags.length > 0) {
            var listingRelatedTags = document.createElement("DIV");
            listingRelatedTags.className = "boxOuter";
            listingTags.appendChild(listingRelatedTags);
            listingRelatedTags.id = "listingRelatedTags"; 
        
            var listTitle = document.createElement("DIV");
            listTitle.className = "boxHeader";
            listTitle.innerHTML = "See also:";
            listingRelatedTags.appendChild(listTitle);
            var list = document.createElement("DIV");
            list.id = "tagListUL";
            list.className = "boxInner";
            for (var j=0;j<tags.length;j++) {
                var tagDetails = getElementsByTagNameAndClass(tags[j],"DIV","tagDetails")[0].innerHTML; 
                var item = document.createElement("SPAN");
                item.className = "aListingTag";
                var tagLink = document.createElement("A");
                tagLink.href = "tag.aspx?t=" + escape(tagDetails);
                tagLink.innerHTML = tagDetails;
                
                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);
            listingRelatedTags.appendChild(list);
        } else {
            tagList.innerHTML = "";
        }
    };
    function CreateSubIndex(txt,n,currIdx) {
        var subIndex = document.createElement("A");
        subIndex.innerHTML = txt;
        subIndex.className = "subIndexLinks";
        //subIndex.style.whiteSpace = "nowrap";
        if (currIdx != n) {
            subIndex.siI = n;
            subIndex.href = addUrlParam("si",n);
            subIndex.onclick = function(){Index.layoutIndex(subIndex.siI);};
        }
        return subIndex;
    }
    function CreateFwrdBackLink(idx,nxtIdx) {
        var link = document.createElement("A");
        if (idx > nxtIdx) {
            link.innerHTML = "<<";
        } else {            
            link.innerHTML = ">>";
        }
        link.style.padding = "0 5px";
        link.nxtIdx = nxtIdx;
        link.href = addUrlParam("si",nxtIdx);
        link.onclick = function(){Index.layoutIndex(link.nxtIdx);};
//        link.style.cursor = "pointer";
//        link.style.color = "blue";
        return link;
    }
    
    
    WCObj.layoutIndex = function(optSubIdx) {
        var tblColumnedTagList = document.getElementById("tblColumnedTagList");
        if (tblColumnedTagList) {
            tblColumnedTagList.parentNode.removeChild(tblColumnedTagList);
        }
        var tagList = document.getElementById("tagList");
        var tags = getElementsByTagNameAndClass(tagList,"DIV","tagListMember");
        
        if (tags && tags.length > 0) {
        
            var pageInfo = "";
            var pageBack;
            var pageFwrd;
            if (tags.length > maxTags) {
                if (!optSubIdx) {
                    optSubIdx = subIndexIdx;
                }
                var index = 0;
                var numBuckets = Math.ceil(tags.length/maxTags);
                var indexName = [];
                var subIndex = document.getElementById("subIndex");
                
                subIndex.innerHTML = "";
                for (var k=0; k<numBuckets;k++) {
                    var startIndexName = getElementsByTagNameAndClass(tags[k*maxTags],"DIV","tagDetails")[0].innerHTML;
                    var endIndexTemp = tags.length - 1;
                    if ((k*maxTags + maxTags - 1) < endIndexTemp) endIndexTemp = (k*maxTags + maxTags - 1);
                    var endIndexName = getElementsByTagNameAndClass(tags[endIndexTemp],"DIV","tagDetails")[0].innerHTML;
                    subIndex.appendChild(CreateSubIndex(startIndexName + " - " + endIndexName,k,optSubIdx));
                    
                    if (k === optSubIdx) {
                        if (k>0) {
                            pageBack = CreateFwrdBackLink(k, k-1);
                        }
                        pageInfo = "viewing page " + (k + 1) + " of " + numBuckets + " (<b>" + startIndexName + "</b> - <b>" + endIndexName + "</b>)";
                        if (k<numBuckets-1) {
                            pageFwrd = CreateFwrdBackLink(k, k+1);
                        }
                        
                    }
                }
                var endIndexTemp2 = tags.length;
                if ((optSubIdx*maxTags + maxTags - 1) < endIndexTemp2) endIndexTemp2 = (optSubIdx*maxTags + maxTags);
                tags = tags.slice(optSubIdx*maxTags,endIndexTemp2); 
            }
            
            var table = document.createElement("TABLE");               
            table.id = "tblColumnedTagList";
            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.className="tblColumnedTagListCell";
            td2.className="tblColumnedTagListCell";
            td3.className="tblColumnedTagListCell";
            td4.className="tblColumnedTagListCell";
            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.className = "tagLink";
                    tagLink.style.fontSize = 100 + Math.ceil(5*Math.sqrt(1+(100*(tagCount - minCount)/(maxCount - minCount)))) + "%";
                    item.appendChild(tagLink);
                    
                    var tagCounter = document.createElement("SPAN");
                    tagCounter.innerHTML = "(" + tagCount + ")";
                    tagCounter.className = "tagListCount";
                    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);
                        
                        if (tagDetails.substr(tagDetails.length-1,1) === "s") {
                            var tagPlural = document.createElement("A");
                            tagPlural.innerHTML = "[<u>P</u>]";
                            tagPlural.title = "Enter the tag that this tag is the plural of";
                            tagPlural.tagDetails = tagDetails;
                            tagPlural.onclick = function(){Index.makeTagPlural(this.tagDetails);};
                            tagPlural.style.padding = "0 0 0 5px";
                            tagPlural.style.color = "red";
                            tagPlural.style.cursor = "pointer";
                            item.appendChild(tagPlural);
                        }
                    }
                    
                    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);
            if (pageInfo.length > 0){
                var divPgInfoHolder = document.getElementById("divPgInfoHolder");
                if (divPgInfoHolder) {
                    divPgInfoHolder.innerHTML = "";
                } else {                    
                    divPgInfoHolder = document.createElement("DIV");
                    divPgInfoHolder.id = "divPgInfoHolder";
//                    divPgInfoHolder.style.margin = "10px auto 0 auto";
//                    divPgInfoHolder.style.color = "green";
//                    divPgInfoHolder.style.textAlign = "center";
                }
                
                var divPgInfo = document.createElement("SPAN");
                divPgInfo.innerHTML = pageInfo;
                
                if (pageBack) {divPgInfoHolder.appendChild(pageBack); }
                divPgInfoHolder.appendChild(divPgInfo);
                if (pageFwrd) {divPgInfoHolder.appendChild(pageFwrd); }
                tagList.parentNode.insertBefore(divPgInfoHolder,tagList);
            }
            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);
        }
    }; 
    
    WCObj.keypress = function(e) {
        var keycode;
        if (window.event) {
            keycode = window.event.keyCode;
        }
        else if (e) {
            keycode = e.which;
        }
        if (keycode === 13) {
            Index.gotoTag();
        }
    };
    WCObj.gotoTag = function() {
        var tagBox = returnObjById("myInput");
        var loc = "tag.aspx?&t=" + tagBox.value;
        window.location.href = loc;    
    };
    WCObj.layoutVisitedTags = function() {
//        var visitedTagList = document.getElementById("visitedTagList");
//        if (visitedTagList) {
//            visitedTagList.parentNode.removeChild(visitedTagList);
//        }
        var visitedTagList = document.getElementById("visitedTagList");
        //visitedTagList.innerHTML = "";
        var vTags = getElementsByTagNameAndClass(visitedTagList,"DIV","visitedTagsMember");
        
        if (vTags && vTags.length > 0) {
            var divRightCol = document.getElementById("divRightCol");
            var vTagsBox = document.getElementById("vTagsBox");
            if (!vTagsBox) {
                vTagsBox = document.createElement("DIV");
                vTagsBox.className = "boxOuter";
                vTagsBox.id = "vTagsBox";
            }
            vTagsBox.innerHTML = ""
            
            var tagLinkDivTit = document.createElement("DIV");
            tagLinkDivTit.innerHTML = "Recently Visited Tags";
            tagLinkDivTit.className = "boxHeader";
            vTagsBox.appendChild(tagLinkDivTit);
            
            for (var j=0;j<vTags.length;j++) {
                var tagLinkDiv = document.createElement("DIV");
                tagLinkDiv.className = "boxInner";
                //tagLinkDiv.style.cssText = "background-color:Ivory;margin:2px 0;padding:2px 2px;";
                var tagLink = document.createElement("A");
                tagLink.href = "tag.aspx?t=" + escape(vTags[j].innerHTML);
                tagLink.innerHTML = vTags[j].innerHTML;
                tagLinkDiv.appendChild(tagLink);
                vTagsBox.appendChild(tagLinkDiv);
            }
            divRightCol.insertBefore(vTagsBox,divRightCol.firstChild);
            
        }
    };
    
    //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 addUrlParam(name,value) {
        var url = document.location.href;
        var urlArr;
        var qs = "";
        var qsNew = "";
        var hash = "";
        
        if (url.indexOf("#") >= 0) {  
            urlArr = url.split("#");
            url = urlArr[0];
            hash = "#" + urlArr[1];
        }
        
        if (url.indexOf("?") >= 0) {
            urlArr = url.split("?");
            url = urlArr[0];
            qs = urlArr[1];
        }
        
        if (qs.length > 0) {
            var qsArr = qs.split("&");
            var qsp = false;
            for (var i=0;i<qsArr.length;i++) {
                if (qsArr[i].split("=")[0] === name) {
                    qsNew += name + "=" + value;
                    qsp = true;
                } else {
                    qsNew += qsArr[i];
                }
                if(i<qsArr.length - 1) qsNew += "&";
            }
            if(!qsp) qsNew += "&" + name + "=" + value;
            return url + "?" + qsNew + hash;
        } else {
            return url + "?" + name + "=" + value + hash;
        }
    }

    return WCObj;
    
}
Index = new Index()