/**
* Declaration variables
*/
var selectedTab = "";
var screenHeight = window.screen.availHeight;
var screenWidth = window.screen.availWidth;
var colorDepth = window.screen.colorDepth;
var timeNow = new Date();
var referrer = escape(document.referrer);
var windows, mac, linux;
var ie, op, moz, misc, browsercode, browsername, browserversion, operatingsys;
var dom, ienew, ie4, ie5, ie6, moz_rv, moz_rv_sub, ie5mac, ie5xwin, opnu, op4, op5, op6, op7, saf, konq;
var appName, appVersion, userAgent;
var appname = navigator.appName;
var appVersion = navigator.appVersion;
var userAgent = navigator.userAgent.toLowerCase();
var title = document.title;
var checktoggle = 1;
var DOMBROWSER = "default";

windows = (appVersion.indexOf('Win') != -1);
mac = (appVersion.indexOf('Mac') != -1);
linux = (appVersion.indexOf('Linux') != -1);

/**
* DOM Compatible?
*/
if (!document.layers)
{
        dom = (document.getElementById ) ? document.getElementById : false;
} else {
        dom = false;
}

if (document.getElementById)
{
        DOMBROWSER = "default";
} else if (document.layers) {
        DOMBROWSER = "NS4";
} else if (document.all) {
        DOMBROWSER = "IE4";
}

misc=(appVersion.substring(0,1) < 4);
op=(userAgent.indexOf('opera') != -1);
moz=(userAgent.indexOf('gecko') != -1);
ie=(document.all && !op);
saf=((userAgent.indexOf('safari') != -1) || (navigator.vendor == "Apple Computer, Inc."));
konq=(userAgent.indexOf('konqueror') != -1);

if (op) {
        op_pos = userAgent.indexOf('opera');
        opnu = userAgent.substr((op_pos+6),4);
        op5 = (opnu.substring(0,1) == 5);
        op6 = (opnu.substring(0,1) == 6);
        op7 = (opnu.substring(0,1) == 7);
} else if (moz){
        rv_pos = userAgent.indexOf('rv');
        moz_rv = userAgent.substr((rv_pos+3),3);
        moz_rv_sub = userAgent.substr((rv_pos+7),1);
        if (moz_rv_sub == ' ' || isNaN(moz_rv_sub)) {
                moz_rv_sub='';
        }
        moz_rv = moz_rv + moz_rv_sub;
} else if (ie){
        ie_pos = userAgent.indexOf('msie');
        ienu = userAgent.substr((ie_pos+5),3);
        ie4 = (!dom);
        ie5 = (ienu.substring(0,1) == 5);
        ie6 = (ienu.substring(0,1) == 6);
}

if (konq) {
        browsercode = "KO";
        browserversion = appVersion;
        browsername = "Knoqueror";
} else if (saf) {
        browsercode = "SF";
        browserversion = appVersion;
        browsername = "Safari";
} else if (op) {
        browsercode = "OP";
        if (op5) {
                browserversion = "5";
        } else if (op6) {
                browserversion = "6";
        } else if (op7) {
                browserversion = "7";
        } else {
                browserversion = appVersion;
        }
        browsername = "Opera";
} else if (moz) {
        browsercode = "MO";
        browserversion = appVersion;
        browsername = "Mozilla";
} else if (ie) {
        browsercode = "IE";
        if (ie4) {
                browserversion = "4";
        } else if (ie5) {
                browserversion = "5";
        } else if (ie6) {
                browserversion = "6";
        } else {
                browserversion = appVersion;
        }
        browsername = "Internet Explorer";
}

if (windows) {
        operatingsys = "Windows";
} else if (linux) {
        operatingsys = "Linux";
} else if (mac) {
        operatingsys = "Mac";
} else {
        operatingsys = "Unkown";
}

function browserObject(objid)
{
        if (DOMBROWSER == "default")
        {
                return document.getElementById(objid);
        } else if (DOMBROWSER == "NS4") {
                return document.layers[objid];
        } else if (DOMBROWSER == "IE4") {
                return document.all[objid];
        }
}

// ======= KEYBOARD SHORTCUTS =======
if (window.Event)
{
        document.captureEvents(Event.KEYDOWN);
}
document.onkeydown = keyHandler;

var isTicketList = false;
var isTicketPage = false;

function keyHandler(e)
{
        var isShift = isCtrl = false;

        var eventSrc = null;

        if (window.Event)
        {
                if (e.altKey == true) {
                        return true;
                }

                if (e.shiftKey == true)
                {
                        isShift = true;
                } else if (e.ctrlKey == true) {
                        isCtrl = true;
                }

                keyPress = e.which;

                try {
                        if (e.srcElement) {
                                eventSrc = e.srcElement;
                        } else if (e.target) {
                                eventSrc = e.target;
                        }
                } catch (e) {

                }
        } else {
/*                if ((event.modifiers & event.ALT_MASK)) {
                        return false;
                }

                if (event.modifiers & event.SHIFT_MASK)
                {
                        isShift = true;
                } else if (event.modifiers & event.CTRL_MASK) {
                        isCtrl = true;
                }*/

                if (window.event.altKey == true)
                {
                        return true;
                } else if (window.event.shiftKey == true) {
                        isShift = true;
                } else if (window.event.ctrlKey == true) {
                        isCtrl = true;
                }

                keyPress = window.event.keyCode;

                try {
                        if (window.event.srcElement) {
                                eventSrc = window.event.srcElement;
                        } else if (window.event.target) {
                                eventSrc = window.event.target;
                        }
                } catch (e) {

                }
        }

        keyPressChar = String.fromCharCode(keyPress);

        if (isCtrl && isTicketPage && keyPressChar == "Z")
        {
                if (selectedTab == "ttpostreply")
                {
                        document.replyform.submit();
                } else if (selectedTab == "ttforward") {
                        document.forwardform.submit();
                } else if (selectedTab == "ttrelease") {
                        document.releaseform.submit();
                } else if (selectedTab == "ttbilling") {
                        document.billingform.submit();
                } else if (selectedTab == "ttaddnotes") {
                        document.noteform.submit();
                }

                return true;
        }

        // Loop through DOM Nodes
        for (var eHandler = eventSrc; eHandler != null; eHandler = eHandler.parentNode) {
                if (eHandler.nodeName == "TEXTAREA" || eHandler.nodeName == "SELECT" || eHandler.nodeName == "INPUT" || eHandler.nodeName == "BUTTON") {
                        return true;
                }
        }

/*        if (isShift == true && keyPress != "16")
        {
                alert(keyPressChar);
        }*/

        // Ticket List + Shift + ] = Previous Department
        if (isTicketList == true && isShift == true && keyPress == 221)
        {


        // Ticket List + Shift + [ = Next Department
        } else if (isTicketList == true && isShift == true && keyPress == 219) {


        // Ticket List + Shift + | = View All
        } else if (isTicketList == true && isShift == true && keyPress == 220) {


        // Search Keywords
        } else if (isShift == true && keyPressChar == "S" && (isTicketList == true || isTicketPage == true)) {
                CustomPopup('ticketsearch', e, 'linkticketsearch', 'ticketsearch');
                setTimeout('document.tiqform.query.focus();', 400);
        // Search Ticket ID
        } else if (isShift == true && keyPressChar == "T" && (isTicketList == true || isTicketPage == true)) {
                CustomPopup('ticketsearch', e, 'linkticketsearch', 'ticketsearch');
                setTimeout('document.tidform.ticketid.focus();', 400);
        } else if (isShift == true && keyPressChar == "P" && isTicketPage == true) {
                switchGridTab('ttpostreply', 'tickets');
                setTimeout('document.replyform.replycontents.focus();', 400);
        } else if (isShift == true && keyPressChar == "G" && isTicketPage == true) {
                switchGridTab('ttgeneral', 'tickets')
        } else if (isShift == true && keyPressChar == "F" && isTicketPage == true) {
                switchGridTab('ttforward', 'tickets');
                fetchData('forward', ticketPageTicketID);
        } else if (isShift == true && keyPressChar == "B" && isTicketPage == true) {
                switchGridTab('ttbilling', 'tickets');
                fetchData('billing', ticketPageTicketID);
        } else if (isShift == true && keyPressChar == "N" && isTicketPage == true) {
                switchGridTab('ttaddnotes', 'tickets');
                fetchData('addnotes', ticketPageTicketID);
        } else if (isShift == true && keyPressChar == "R" && isTicketPage == true) {
                switchGridTab('ttrelease', 'tickets');
                fetchData('release', ticketPageTicketID);
        } else if (isShift == true && keyPressChar == "H" && isTicketPage == true) {
                switchGridTab('tthistory', 'tickets');
                fetchData('history', ticketPageTicketEmail);
        // Shift + ->
        } else if (isShift == true && keyPress == 39 && isTicketPage == true) {
                window.location.href = swiftpath+ "staff/index.php?_m=tickets&_a=ticketactions&action=jump&t=next&ticketid="+ticketPageTicketID;
        // Shift + -<
        } else if (isShift == true && keyPress == 37 && isTicketPage == true) {
                window.location.href = swiftpath+ "staff/index.php?_m=tickets&_a=ticketactions&action=jump&t=previous&ticketid="+ticketPageTicketID;
        }



//        alert(keyPress);
}

function displayObject(objid)
{
        result = browserObject(objid);
        if (!result)
        {
                alert("Invalid Display Object: "+objid+"\nPlease make sure that all correct display objects are on the page");
                return;
        }

        result.style.display = "";
}

function hideObject(objid)
{
        result = browserObject(objid);
        if (!result)
        {
                alert("Invalid Display Object: "+objid+"\nPlease make sure that all correct display objects are on the page");
                return;
        }

        result.style.display = "none";
}

function displayTicketEdit() {
        displayObject('ticketedit');
        displayObject('ticketsubmit');
        hideObject('tickettext');
}

function hideTicketEdit() {
        hideObject('ticketedit');
        hideObject('ticketsubmit');
        displayObject('tickettext');
}

function switchDisplay(objid)
{
        result = browserObject(objid);
        if (!result)
        {
                alert("Invalid Display Object: "+objid+"\nPlease make sure that all correct display objects are on the page");
                return;
        }

        if (result.style.display == "none")
        {
                result.style.display = "";
        } else {
                result.style.display = "none";
        }
}

function blurObject(objid) {
        var objM = browserObject(objid);
        if (objM)
        {
                objM.blur();
        }
}

function displayGridTabData(gridname, dodisplay) {
        if (dodisplay)
        {
                displayObject("gridtableopt"+gridname);
        } else {
                switchDisplay("gridtableopt"+gridname);
        }
        hideTab("massaction");
        hideTab("search");
        hideTab("settings");
}

function displayTab(objid) {
        if (objid != "addresscards" && objid != "detailedcards")
        {
                result = browserObject("tab_"+objid);
                if (!result)
                {
        //                alert("Invalid Display Object: "+objid+"\nPlease make sure that all correct display objects are on the page");
                        return;
                }

                result.style.display = "";
        }

        resultlink = browserObject(objid);
        if (!resultlink)
        {
                return;
        }
        resultlink.className = "currenttab";
}

function hideTab(objid) {
        if (objid != "addresscards" && objid != "detailedcards")
        {
                var result = browserObject("tab_"+objid);
                if (!result)
                {
        //                alert("Invalid Display Object: "+objid+"\nPlease make sure that all correct display objects are on the page");
                        return;
                }

                result.style.display = "none";
        }
        resultlink = browserObject(objid);
        if (!resultlink)
        {
                return;
        }
        resultlink.className = "";
}

function iif(cond, success, failure) {
        return cond ? success : failure;
}

function switchGridTab(object, tabgroup) {
        if (tabgroup == "gridoptions")
        {
                var gridtabs = new Array("search", "massaction", "settings");
                hideTabObj(object, gridtabs);
        } else if (tabgroup == "tickets") {
                selectedTab = object;
                var tickettabs = new Array("ttgeneral", "ttpostreply", "ttforward", "ttaddnotes", "ttbilling", "tthistory", "ttlog", "ttedit", "ttrelease", "ttlschats");
                hideTabObj(object, tickettabs);
        } else if (tabgroup == "teamwork") {
                selectedTab = object;
                var twtabs = new Array("twday", "twworkweek", "twweek", "twmonth");
                hideTabObj(object, twtabs);
        } else if (tabgroup == "contacts") {
                selectedTab = object;
                var cltabs = new Array("addresscards", "detailedcards");
                hideTabObj(object, cltabs);
        } else if (tabgroup == "contactform") {
                selectedTab = object;
                var cftabs = new Array("clgeneral", "clbusiness", "clpersonal", "clmisc", "cltickets", "clchats", "clcustom");
                hideTabObj(object, cftabs);
        } else if (tabgroup == "eventform") {
                selectedTab = object;
                var cftabs = new Array("efgeneral", "efmisc", "efcustom");
                hideTabObj(object, cftabs);
        } else if (tabgroup == "taskform") {
                selectedTab = object;
                var cftabs = new Array("tfgeneral", "tfmisc", "tfcustom");
                hideTabObj(object, cftabs);
        } else if (tabgroup == "userform") {
                selectedTab = object;
                var cftabs = new Array("suedit", "sutickets", "suchats", "suticketreports");
                hideTabObj(object, cftabs);
        }
}

function hideTabObj(showtab, tablist) {
        displayTab(showtab);
        for (i=0;i<tablist.length;i++)
        {
                if (tablist[i] != showtab)
                {
                        hideTab(tablist[i]);
                }
        }
}


function hideTabOn(objid, displaytype) {
        result = browserObject(objid);
        if (!result)
        {
                alert("Invalid Display Object: "+objid+"\nPlease make sure that all correct display objects are on the page");
                return;
        }

        if (result.style.display == "none")
        {
                // hidden
                hideTab("search");
                hideTab("massaction");
                hideTab("settings");
        } else {
                if (displaytype == "search")
                {
                        displayTab("search");
                } else if (displaytype == "settings") {
                        displayTab("settings");
                } else {
                        displayTab("massaction");
                }
        }
}

function toggleAll(formname) {
        var currForm = formname;
        var isChecked = checktoggle;
        var itercount = 1;
        var trassignid;

        if (checktoggle == 1) {
                checktoggle = 0;
        } else {
                checktoggle = 1;
        }

        for (var elementIdx=0; elementIdx<currForm.elements.length; elementIdx++) {
                if (!currForm.elements)
                {
                        break;
                }

                if (currForm.elements[elementIdx].type == 'checkbox') {
                        currForm.elements[elementIdx].checked = isChecked;
                } else if (currForm.elements[elementIdx].type == 'hidden') {
                        hidval = currForm.elements[elementIdx].name;

                        if (hidval.substr(0, 13) == 'itemhighlight')
                        {
                                trassignid = hidval.substr(13, hidval.length);
                                currForm.elements[elementIdx].value = isChecked;
                                highlightTR("trid"+trassignid, isChecked, itercount);
                                itercount++;
                        }
                }
        }
}

function highlightTR(element, isChecked, ditercount){

        var mgobj = browserObject(element);
        if (!mgobj)
        {
                return;
        }

        var altdecide = ditercount%2;

        if (isChecked == 1)
        {
                mgobj.className="rowselect";
        } else {
                if (altdecide == 0)
                {
                        mgobj.className="row1";
        } else {
                        mgobj.className="row2";
                }
        }
}

function showHighlight(name)
{
        if (name.className != "rowselect")
        {
                name.style.backgroundColor = "";
                name.className = 'rowhighlight';
        }
}

function clearHighlight(name, classname, bgcolor)
{
        if (name.className != "rowselect")
        {
                name.style.backgroundColor = bgcolor;
                name.className = classname;
        }
}

function doConfirm(question,url) {
        var x = confirm(question);
        if (x) {
                window.location.href = url;
        }
}

function submitGridForm(dosubmit)
{
        if (dosubmit)
        {
                document.ticketlistform.submit();
        }
        return true;
}

function doFormConfirm(confirmmessage, object) {
        if (object.value == "")
        {
                return false;
        }

        var x = confirm(confirmmessage);
        if (x) {
                object.form.submit();
                return true;
        }

        return false;
}

function selectjump(object){
        object.form.submit();
        return true;
}

function htmlize(str){
        str = str.replace(/\&/g,"&amp;");
        str = str.replace(/\</g,"&lt;");
        str = str.replace(/\>/g,"&gt;");
        str = str.replace(/\"/g,"&quot;");
        str = str.replace(/\n/g,"<br/>\n");
        return str;
}

function preloadImages() {
    if (document.images) {
        var imgFiles = arguments;
        if (document.preloadArray == null) {
            document.preloadArray = new Array();
        }
        var i = document.preloadArray.length;
        with (document) {
            for (var j = 0; j < imgFiles.length; j++) {
                if (imgFiles[j].charAt(0) != "#") {
                    document.preloadArray[i] = new Image();
                    document.preloadArray[i++].src = imgFiles[j];
                }
            }
        }
    }
}

/**
* MENU TAB RELATED FUNCTIONS
*/
function switchTabClass(tabname, classname) {
        var t_tab = browserObject(tabname);
        if (t_tab)
        {
                t_tab.className = classname;
        }
}

function resetTabDefault() {
        var tabClass = "menusectiondefault";
        if (swiftiswinapp == "1")
        {
                tabClass = "menusectionwinapp";
        }
        for (i = 1; i <= 10; i++)
        {
                switchTabClass("tb_menusection"+i, tabClass);
        }
}

function switchTab(tabitem, classid) {
        var t_ml = browserObject("tb_menuline");
        var t_mlnk = browserObject("tb_menulinks");
        var t_md = browserObject("linksdiv");

        t_md.innerHTML = menulinks[tabitem];
        t_ml.className = "menuline"+classid;
        t_mlnk.className = "menulinks"+classid;
        t_md.className = "menulinks"+classid;

        resetTabDefault();
        switchTabClass("tb_menusection"+tabitem, "menusection"+classid);
}

function LoadBarMenu(obj, tdobj){
        if(document.getElementById){
        var el = document.getElementById(obj);
        var ar = document.getElementById("parent").getElementsByTagName("span");
                if(el.style.display != "block"){
                        for (var i=0; i<ar.length; i++){
                                if (ar[i].className=="BarOptions" || ar[i].className=="BarOptionsDisplay")
                                ar[i].style.display = "none";
                        }
                        el.style.display = "block";
                }else{
                        el.style.display = "none";
                }
        }

        if (tdobj)
        {
                tdobj.style.background='#FFFFFF';
        }
}

function navigateWindow(navlocation) {
        window.location.href = navlocation;
}

function doRand()
{
        var num;
        now=new Date();
        num=(now.getSeconds());
        num=num+1;
        return num;
}

function popupInfoWindow(url) {
        screen_width = screen.width;
        screen_height = screen.height;
        widthm = (screen_width-400)/2;
        heightm = (screen_height-500)/2;
        window.open(url,"infowindow"+doRand(), "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width=400,height=500,left="+widthm+",top="+heightm);
}

function popupSmallWindow(url) {
        screen_width = screen.width;
        screen_height = screen.height;
        widthm = (screen_width-400)/2;
        heightm = (screen_height-300)/2;
        window.open(url,"infowindow"+doRand(), "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width=400,height=300,left="+widthm+",top="+heightm);
}

function changeImage(imgid, newpath)
{
        imgObj = browserObject(imgid);
        if (imgObj)
        {
                imgObj.src = newpath;
        }
}

function popupDataWindow(url) {
        screen_width = screen.width;
        screen_height = screen.height;
        widthm = (screen_width-700)/2;
        heightm = (screen_height-600)/2;
        window.open(url,"datawindow"+doRand(), "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width=700,height=600,left="+widthm+",top="+heightm);
}

function changeColorTable(inputname, value) {
        tableid = browserObject("color"+inputname);

        tableid.style.backgroundColor = value;
        return true;
}

function enableField(field) {
        if (document.all || document.getElementById) {
                field.disabled = false;
        }
}

function disableField(field) {
        if (document.all || document.getElementById) {
                if (!field)
                {
                        return;
                }
                field.disabled = true;
        }
}

function initEditor() {
        htmlAreaLoaded = true;

        editor = new HTMLArea("contents");
        var config = editor.config;
        config.pageStyle = 'body { font-family: Verdana, Sans-Serif; font-size: 12px; } ';
        config.statusBar = false;
        config.toolbar = [
                [ "fontname", "space",
                  "fontsize", "space",
                  "formatblock", "space",
                  "bold", "italic", "underline", "strikethrough", "separator",
                  "subscript", "superscript", "separator",
                  "copy", "cut", "paste", "space", "undo", "redo", "space"],

                [ "justifyleft", "justifycenter", "justifyright", "justifyfull", "separator",
                  "lefttoright", "righttoleft", "separator",
                  "orderedlist", "unorderedlist", "outdent", "indent", "separator",
                  "forecolor", "hilitecolor", "separator",
                  "inserthorizontalrule", "createlink", "insertimage", "inserttable", "htmlmode"]
        ];
        if (loadTablePlugin == true)
        {
                editor.registerPlugin("TableOperations");
        }
        editor.registerPlugin("ContextMenu");
        editor.generate();
        return false;
}

function clearAllMenus(doignore) {
        return;

        if (!window.CMenuList)
        {
                return;
        }
        for (var i = 0;i<window.CMenuList.length;i++)
        {
                var itemKey = window.CMenuList[i];
                if ((window.CMenuClick == false || doignore == true) && window.CMenus[itemKey].isover == false)
                {
                        window.CMenus[itemKey].cancelQueued();
                        window.CMenus[itemKey]._setVisibility(false);
//                        window.CMenus[itemKey].showLevel(null, 0);
                }
        }
}

function listMoveItem(from, to)
{
        var f;
        var SI;

        from = document.forms["viewform"][from];
        to = document.forms["viewform"][to];

        if (from.options.length > 0)
        {
                for (i=0;i<from.length;i++)
                {
                        if (from.options[i].selected)
                        {
                                SI = from.selectedIndex;
                                f = from.options[SI].index;
                                to.options[to.length] = new Option(from.options[SI].text,from.options[SI].value);
                                from.options[f] = null;
                                i--;
                        }
                }
        }
}

function listMoveUpList(listField) {
        listField = document.forms["viewform"][listField];

        if ( listField.length == -1)
        {
//                alert("There are no values which can be moved!");
        } else {
                var selected = listField.selectedIndex;
                if (selected == -1)
                {
//                        alert("You must select an entry to be moved!");
                } else {
                        if (listField.length == 0 )
                        {
//                                alert("There is only one entry!\nThe one entry will remain in place.");
                        } else {
                                if ( selected == 0 ) {
//                                        alert("The first entry in the list cannot be moved up.");
                                } else {
                                        var moveText1 = listField[selected-1].text;
                                        var moveText2 = listField[selected].text;
                                        var moveValue1 = listField[selected-1].value;
                                        var moveValue2 = listField[selected].value;
                                        listField[selected].text = moveText1;
                                        listField[selected].value = moveValue1;
                                        listField[selected-1].text = moveText2;
                                        listField[selected-1].value = moveValue2;
                                        listField.selectedIndex = selected-1;
                                }
                        }
                }
        }
}

function listMoveDownList(listField) {
        listField = document.forms["viewform"][listField];

        if (listField.length == -1) {
//                alert("There are no values which can be moved!");
        } else {
                var selected = listField.selectedIndex;
                if (selected == -1) {
//                        alert("You must select an entry to be moved!");
                } else {
                        if ( listField.length == 0 ) {
//                                alert("There is only one entry!\nThe one entry will remain in place.");
                        } else {
                                if ( selected == listField.length-1 ) {
//                                        alert("The last entry in the list cannot be moved down.");
                                } else {
                                        var moveText1 = listField[selected+1].text;
                                        var moveText2 = listField[selected].text;
                                        var moveValue1 = listField[selected+1].value;
                                        var moveValue2 = listField[selected].value;
                                        listField[selected].text = moveText1;
                                        listField[selected].value = moveValue1;
                                        listField[selected+1].text = moveText2;
                                        listField[selected+1].value = moveValue2;
                                        listField.selectedIndex = selected+1;
                                }
                        }
                }
        }
}

function processViewForm() {
        leftField = document.forms["viewform"]["leftfields[]"];
        mainField = document.forms["viewform"]["fields[]"];

        if (leftField.options.length > 0)
        {
                for (i=0;i<leftField.length;i++)
                {
                        leftField.options[i].selected = true;
                }
        }
        if (mainField.options.length > 0)
        {
                for (i=0;i<mainField.length;i++)
                {
                        mainField.options[i].selected = true;
                }
        }

        return true
}

function refreshPage() {
//        window.location.reload(true);
        window.location.href = swiftpath+"staff/index.php?_m=tickets&_a=manage";
}

function absX(o) {
        if (o == document.body) return 0;
        var x = o.offsetLeft;
        if (o.offsetParent && o.offsetParent != o)
                x += absX(o.offsetParent);
        return x;
}

function absX2(o, dotype) {
        if (o == document.body) return 0;

        var x = o.offsetLeft;
        if (dotype == 1)
        {
                x += o.offsetWidth;
        }

        if (o.offsetParent && o.offsetParent != o)
                x += absX2(o.offsetParent, 0);
        return x;
}

function absY(o) {
        if (o == document.body) return 0;
        var y = o.offsetTop;
        if (o.offsetParent && o.offsetParent != o)
                y += absY(o.offsetParent);
        return y;
}

function absY2(o, dotype) {
        if (o == document.body) return 0;
        var y = o.offsetTop;
        if (dotype == 1)
        {
                y += o.offsetHeight;
        }
        if (o.offsetParent && o.offsetParent != o)
                y += absY2(o.offsetParent, 0);
        return y;
}

function CustomOver(text, id, id2) {
        var o1 = browserObject(id); var o2 = browserObject(id2);
        if (!o1 || !o2)
        {
                return;
        }

//        return overlib(text, RELX, absX(o1), RELY, absY2(o2, 1), WIDTH, 300, FGCLASS, "stickyfg", BGCLASS, "stickybg", TEXTFONTCLASS, "stickyfont", CAPTIONFONTCLASS, "stickyfont", CLOSEFONTCLASS, "stickyfont");
        return overlib(text, FOLLOWMOUSE, WIDTH, 300, FGCLASS, "stickyfg", BGCLASS, "stickybg", TEXTFONTCLASS, "stickyfont", CAPTIONFONTCLASS, "stickyfont", CLOSEFONTCLASS, "stickyfont");
}

function CustomPopup(menu, e, id, datam) {
        var o1 = browserObject(id), o2 = browserObject('popupRef');
        if (!o1 || !o2)
                return;

        CMenuPopUpXY(menu, absX(o1), absY(o2));
}

function CustomPopupRef(menu, e, id, datam, refobject, refvar) {
        if (!refvar)
        {
                return false;
        }

        var o1 = browserObject(id), o2 = browserObject(refobject);
        if (!o1 || !o2)
                return;

        if (menu == "tviewmenu")
        {
                if (browsercode == "IE")
                {
                        var minval = 1;
                } else {
                        var minval = 3;
                }
                var yCord = absY2(o2, 1)-minval;
        } else if (menu == "kbcachemenu" || menu == "prcachemenu" || menu == "dlcachemenu" || menu == "fwquotemenu") {
                var yCord = absY2(o2, 1);
        } else {
                var yCord = absY(o2);
        }
        CMenuPopUpXY(menu, absX2(o1), yCord);
}

function CustomPopupRefRight(menu, id, refobject) {
        var o1 = browserObject(id), o2 = browserObject(refobject);
        if (!o1 || !o2)
                return;

        if (menu == "tviewmenu")
        {
                var yCord = absY(o2)-1;
        } else {
                var yCord = absY(o2);
        }
        CMenuPopUpXY(menu, absX2(o1, 1), yCord);
}

function mEventRef(m, node_index, e, refvar) {
        if (!refvar)
        {
                return false
        }
}

function hideMenu(menu) {
//        window.CMenus[menu].hide();
}

function storeCaret (textEl) {
        if (textEl.createTextRange)
                textEl.caretPos = document.selection.createRange().duplicate();
}

function insertAtCaret (textEl, text) {
        if (textEl.createTextRange && textEl.caretPos) {
                var caretPos = textEl.caretPos;
                caretPos.text =
                caretPos.text.charAt(caretPos.text.length - 1) == ' ' ?
                text + '' : text;
        } else {
                textEl.value = textEl.value+ "" + text;
        }
}

var popupCalendar = null;

function showCalendar(id, format, showsTime, showsOtherMonths) {
        var el = document.getElementById(id);
        if (popupCalendar != null) {
                popupCalendar.hide();
        } else {
                var cal = new Calendar(1, null, calSelected, calCloseHandler);
                if (typeof showsTime == "string") {
                        cal.showsTime = true;
                        cal.time24 = (showsTime == "24");
                }
                if (showsOtherMonths) {
                        cal.showsOtherMonths = true;
                }
                popupCalendar = cal;
                cal.setRange(1900, 2070);
                cal.create();
        }
        popupCalendar.setDateFormat(format);
        popupCalendar.parseDate(el.value);
        popupCalendar.sel = el;

        popupCalendar.showAtElement(el, "Br");

        return false;
}

function calSelected(cal, date) {
        cal.sel.value = date;
        if (cal.dateClicked && (cal.sel.id == "opt_due"))
        cal.callCloseHandler();
}

function calCloseHandler(cal) {
        cal.hide();
        popupCalendar = null;
}

// =========== XML HTTP REQUEST STUFF ==============
var xmlhttp;
var xmlaction = "";

function loadXMLHTTPRequest(url) {
        if (window.XMLHttpRequest) {
                xmlhttp = new XMLHttpRequest();
                xmlhttp.onreadystatechange = processStatusChange;
                xmlhttp.open("GET", url, true);
                xmlhttp.send(null);
        } else if (window.ActiveXObject) {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                if (xmlhttp) {
                        xmlhttp.onreadystatechange = processStatusChange;
                        xmlhttp.open("GET", url, true);
                        xmlhttp.send();
                }
        }
}

var oldKeyword = "";
function processStatusChange() {
        if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                        formname = getActiveFormName();
                        if (xmlaction == "tp" && formname == "replyform")
                        {
                                switchGridTab('ttpostreply', 'tickets');
                                document.replyform.replycontents.focus();
                        }

                        if (xmlaction == "kb" || xmlaction == "pr" || xmlaction == "tp" || xmlaction == "forwardquote" || xmlaction == "forwardquoteall")
                        {
                                insertAtCaret(document.forms[formname].replycontents, xmlhttp.responseText);
                        } else if (xmlaction == "history" || xmlaction == "forward" || xmlaction == "addnotes" || xmlaction == "edit" || xmlaction == "billing" || xmlaction == "release" || xmlaction == "lschats") {
                                ticketDataObj = browserObject("tab_tt"+xmlaction);
                                if (ticketDataObj)
                                {
                                        ticketDataObj.innerHTML = xmlhttp.responseText;
                                }

                                if (xmlaction == "addnotes")
                                {
                                        setTimeout('document.noteform.notecontents.focus();', 100);
                                } else if (xmlaction == "forward") {
                                        setTimeout('document.forwardform.opt_to.focus();', 100);
                                } else if (xmlaction == "release") {
                                        setTimeout('document.releaseform.tt_staffid.focus();', 100);
                                } else if (xmlaction == "billing") {
                                        setTimeout('document.billingform.tworked.focus();', 100);
                                }
                        } else if (xmlaction == "auditlog") {
                                logObj = browserObject("tab_ttlog");
                                if (logObj)
                                {
                                        logObj.innerHTML = xmlhttp.responseText;
                                }
                        } else if (xmlaction == "userlookup") {
//                                alert(xmlhttp.responseText);
                                eval(xmlhttp.responseText);
                        } else if (xmlaction == "twday" || xmlaction == "twworkweek" || xmlaction == "twweek" || xmlaction == "twmonth") {
                                tabObj = browserObject("tab_"+xmlaction);
                                if (tabObj)
                                {
                                        tabObj.innerHTML = xmlhttp.responseText;
                                }
                        } else if (xmlaction == "addresscards" || xmlaction == "detailedcards") {
                                tabObj = browserObject("contactscontainer");
                                if (tabObj)
                                {
                                        tabObj.innerHTML = xmlhttp.responseText;
                                        recalcContactHeight();
                                        document.realtimesearch.searchquery.focus();
                                }
                        } else if (xmlaction == "cltickets" || xmlaction == "clchats" || xmlaction == "sutickets" || xmlaction == "suchats" || xmlaction == "suticketreports") {
                                tabObj = browserObject("tab_"+xmlaction);
                                if (tabObj)
                                {
                                        tabObj.innerHTML = xmlhttp.responseText;
                                }
                        }
                } else {
                        alert("There was a problem retrieving the XML data from Server:\n" +xmlhttp.statusText);
                }
        }
}

function windowPlaceEmail(email, formname, formfield)
{
        if (!window.opener)
        {
                alert("Couldnt find window opener. Unable to append email");
                return;
        }

        var fieldValue = window.opener.document.forms[formname].elements[formfield].value;

        var appendValue = "";
        if (fieldValue == "")
        {
                appendValue = email;
        } else {
                appendValue = fieldValue+","+email;
        }

        window.opener.document.forms[formname].elements[formfield].value = appendValue;
        window.close();
}

function fetchData(datatype, dataid) {
        if (datatype == "kb")
        {
                xmlaction = "kb";
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=knowledgebase&_a=ajax&randno="+doRand()+"&kbarticleid="+dataid+"&sessionid="+swiftsessionid);
        } else if (datatype == "pr") {
                xmlaction = "pr";
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=tickets&_a=ajax&randno="+doRand()+"&predefinedreplyid="+dataid+"&sessionid="+swiftsessionid);
        } else if (datatype == "tp" || datatype == "tpf") {
                xmlaction = datatype;
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=tickets&_a=ajax&randno="+doRand()+"&ticketpostid="+dataid+"&sessionid="+swiftsessionid);
        } else if (datatype == "history") {
                xmlaction = "history";
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=tickets&_a=ajax&action=history&randno="+doRand()+"&email="+dataid+"&sessionid="+swiftsessionid);
        } else if (datatype == "auditlog" || datatype == "forward" || datatype == "release" || datatype == "addnotes" || datatype == "forwardquote" || datatype == "forwardquoteall") {
                xmlaction = datatype;
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=tickets&_a=ajax&action="+datatype+"&randno="+doRand()+"&ticketid="+dataid+"&sessionid="+swiftsessionid);
        } else if (datatype == "edit") {
                xmlaction = "edit";
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=tickets&_a=ajax&action=edit&randno="+doRand()+"&ticketid="+dataid+"&sessionid="+swiftsessionid);
        } else if (datatype == "billing") {
                xmlaction = "billing";
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=tickets&_a=ajax&action=billing&randno="+doRand()+"&ticketid="+dataid+"&sessionid="+swiftsessionid);
        } else if (datatype == "twday" || datatype == "twworkweek" || datatype == "twweek" || datatype == "twmonth") {
                xmlaction = datatype;
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=teamwork&_a=ajax&action="+datatype+"&customtype="+dataid+"&randno="+doRand()+"&sessionid="+swiftsessionid);
        } else if (datatype == "addresscards" || datatype == "detailedcards") {
                xmlaction = datatype;
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=teamwork&_a=ajax&action="+datatype+"&randno="+doRand()+"&sessionid="+swiftsessionid+"&searchquery="+dataid);
        } else if (datatype == "cltickets" || datatype == "sutickets") {
                xmlaction = datatype;
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=tickets&_a=ajax&action=history&randno="+doRand()+dataid+"&sessionid="+swiftsessionid);
        } else if (datatype == "suticketreports") {
                xmlaction = datatype;
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=tickets&_a=ajax&action=ticketreports&randno="+doRand()+"&userid="+dataid+"&sessionid="+swiftsessionid);
        } else if (datatype == "clchats" || datatype == "suchats" || datatype == "lschats") {
                xmlaction = datatype;
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=livesupport&_a=ajax&action=history&randno="+doRand()+dataid+"&sessionid="+swiftsessionid);
        }
}

function keywordCheck(formname, formfield)
{
        newKeyword = document.userlookupform.searchquery.value;
        if (oldKeyword != newKeyword)
        {
                oldKeyword = newKeyword;
/*                searchdivObj = browserObject("searchdiv");
                if (searchdivObj)
                {
                        searchdivObj.innerHTML = newKeyword;
                }*/
                // Fetch the keyword
                xmlaction = "userlookup";
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=core&_a=userlookup&action=search&randno="+doRand()+"&query="+escape(newKeyword)+"&formname="+escape(formname)+"&formfield="+escape(formfield)+"&sessionid="+swiftsessionid);
        }
        setTimeout("keywordCheck('"+formname+"', '"+formfield+"');", 1000);
}

function keywordCheckContacts()
{
        newKeyword = document.realtimesearch.searchquery.value;
        if (oldKeyword != newKeyword)
        {
                oldKeyword = newKeyword;
                // Fetch the keyword
                xmlaction = selectedTab;
                loadXMLHTTPRequest(swiftpath+"staff/index.php?_m=teamwork&_a=ajax&action="+selectedTab+"&randno="+doRand()+"&searchquery="+escape(newKeyword)+"&sessionid="+swiftsessionid);
        }
        setTimeout("keywordCheckContacts();", 1000);
}

function autoInsertKB(kbarticleid) {
        formname = getActiveFormName();

        if (!document.forms[formname])
        {
                window.location.href = swiftpath+"staff/index.php?_m=knowledgebase&_a=editquestion&kbarticleid="+kbarticleid;
        } else {
                fetchData("kb", kbarticleid);
        }
}

function autoInsertPR(predefinedreplyid) {
        fetchData("pr", predefinedreplyid);

        return true;
}

function autoInsertTP(ticketpostid, fetchtype) {
        fetchData("tp", ticketpostid);
}

function autoInsertDL(downloaditemid, link, title) {
        formname = getActiveFormName();
        if (formname == "forwardform" || formname == "newticketform")
        {
                fprefix = "f";
        } else {
                fprefix = "";
        }

        if (!document.forms[formname])
        {
                window.location.href = swiftpath+"staff/index.php?_m=downloads&_a=editfile&downloaditemid="+downloaditemid;
        } else if (link != "") {
                // Simply append the link to the contents
                insertAtCaret(document.forms[formname].replycontents, link);
        } else {
                // Add the download to select box
                displayObject(fprefix+"downloads1");
                displayObject(fprefix+"downloads2");
                to = document.forms[formname]["opt_downloads[]"];
                to.options[to.length] = new Option(title,downloaditemid);
        }
}

function removeDLItem() {
        formname = getActiveFormName();
        to = document.forms[formname]["opt_downloads[]"];

        if (to.options.length > 0)
        {
                for (i=0;i<to.length;i++)
                {
                        if (to.options[i].selected)
                        {
                                to.options[i] = null;
                        }
                }
        }
}

function getActiveFormName()
{
        var formname = "";
        if (selectedTab == "ttforward")
        {
                formname = "forwardform"
        } else if (selectedTab == "newticket") {
                formname = "newticketform";
        } else {
                formname = "replyform";
        }

        return formname;
}

function clearDLItems() {
        formname = getActiveFormName();
        if (formname == "forwardform" || formname == "newticketform")
        {
                fprefix = "f";
        } else {
                fprefix = "";
        }

        to = document.forms[formname]["opt_downloads[]"];

        if (to.options.length > 0)
        {
                for (i=0;i<to.length;i++)
                {
                        to.options[i] = null;
                }
        }
        hideObject(fprefix+"downloads1");
        hideObject(fprefix+"downloads2");
}

function processReplyForm() {
        formname = getActiveFormName();
        selField = document.forms[formname]["opt_downloads[]"];

        if (selField.options.length > 0)
        {
                for (i=0;i<selField.length;i++)
                {
                        selField.options[i].selected = true;
                }
        }

        return true
}

function openSpellChecker() {
        formname = getActiveFormName();
        var text1 = document.forms[formname].replycontents;
        var speller = new spellChecker(text1);
        speller.openChecker();
}

/**
* ###############################################
* BEGIN COOLMENUPRO CODE, MERGED INTO ONE FILE.
* ###############################################
*/

var kbmenuloaded = false;
var prmenuloaded = false;
var dlmenuloaded = false;
var htmlAreaLoaded = false;
var VSTYLE = {"border":1, "borders":[1,0,1,1], "shadow":1, "color":{"border":"#6393DF", "shadow":"#DBD8D1", "bgON":"#FFFFFF","bgOVER":"#F7FAFF"}, "css":{"ON":"clsCMOn", "OVER":"clsCMOver"}};
var VSTYLEBORDER = {"border":1, "borders":[1,1,1,1], "shadow":1, "color":{"border":"#6393DF", "shadow":"#DBD8D1", "bgON":"#FFFFFF","bgOVER":"#F7FAFF"}, "css":{"ON":"clsCMOn", "OVER":"clsCMOver"}};
var VSTYLESEL = {"border":1, "borders":[1,0,1,1], "shadow":1, "color":{"border":"#6393DF", "shadow":"#DBD8D1", "bgON":"#FFF6E2","bgOVER":"#F7FAFF"}, "css":{"ON":"clsCMOn", "OVER":"clsCMOver"}};
var VSTYLESELBORDER = {"border":1, "borders":[1,1,1,1], "shadow":1, "color":{"border":"#6393DF", "shadow":"#DBD8D1", "bgON":"#FFF6E2","bgOVER":"#F7FAFF"}, "css":{"ON":"clsCMOn", "OVER":"clsCMOver"}};
var SUBPOPUPTOP = {"border":1, "borders":[1,1,1,1], "shadow":1, "color":{"border":"#6393DF", "shadow":"#DBD8D1", "bgON":"#FFFFFF","bgOVER":"#F7FAFF"}, "css":{"ON":"clsCMOn", "OVER":"clsCMOver"}};
var SUBPOPUP = {"border":1, "borders":[1,0,1,1], "shadow":1, "color":{"border":"#6393DF", "shadow":"#DBD8D1", "bgON":"#FFFFFF","bgOVER":"#F7FAFF"}, "css":{"ON":"clsCMOn", "OVER":"clsCMOver"}};
var STYLEPOPUP = {"border":1, "borders":[1,1,1,1], "shadow":1, "color":{"border":"#6393DF", "bgON":"#FFFFFF","bgOVER":"#F7FAFF",shadow:'#DBD8D1'}, "css":{"ON":"popupOn", "OVER":"popupOver"}};

// Title: COOLjsMenu
// URL: http://javascript.cooldev.com/scripts/coolmenu/
// Version: 2.4.3
// Last Modify: 9 May 2005
// Author: Alex Kunin <alx@cooldev.com>
// Notes: Registration needed to use this script on your web site.
// Copyright (c) 2001-2005 by CoolDev.Com
// Copyright (c) 2001-2005 by Sergey Nosenko

// Options: PROFESSIONAL, COMPRESSED, COMPATIBLE


if (!themepath)
{
        var themepath = "";
}

var BLANK_IMAGE=themepath+"space.gif";

// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003, Richard Heyes, Harald Radi                        |
// | All rights reserved.                                                  |
// |                                                                       |
// | Redistribution and use in source and binary forms, with or without    |
// | modification, are permitted provided that the following conditions    |
// | are met:                                                              |
// |                                                                       |
// | o Redistributions of source code must retain the above copyright      |
// |   notice, this list of conditions and the following disclaimer.       |
// | o Redistributions in binary form must reproduce the above copyright   |
// |   notice, this list of conditions and the following disclaimer in the |
// |   documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote      |
// |   products derived from this software without specific prior written  |
// |   permission.                                                         |
// |                                                                       |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
// |                                                                       |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@phpguru.org>                           |
// |         Harald Radi <harald.radi@nme.at>                              |
// +-----------------------------------------------------------------------+
//
// $Id: main.js,v 1.34 2005/09/07 23:11:33 vshoor Exp $

/**
* ###############################################
* REMOVED HARD CODED IMAGE WIDTHS [VARUN]
* ###############################################
*/


/**
* Function to create copies of objects which are
* normally passed around by references (Arrays for example)
*/
function arrayCopy(input)
{
        var output = new Array(input.length);

        for (i in input) {
                if (typeof(input[i]) == 'array') {
                        output[i] = arrayCopy(input[i]);
                } else {
                        output[i] = input[i];
                }
        }

        return output;
}

/**
* TreeMenu class
*/
        function TreeMenu(iconpath, myname, linkTarget, defaultClass, usePersistence, noTopLevelImages)
        {
                // Properties
                this.iconpath         = iconpath;
                this.myname           = myname;
                this.linkTarget       = linkTarget;
                this.defaultClass     = defaultClass;
                this.usePersistence   = usePersistence;
                this.noTopLevelImages = noTopLevelImages;
                this.n                = new Array();
                this.output           = '';

                this.nodeRefs       = new Array();
                this.branches       = new Array();
                this.branchStatus   = new Array();
                this.layerRelations = new Array();
                this.childParents   = new Array();
                this.cookieStatuses = new Array();

                this.preloadImages();
        }

/**
* Adds a node to the tree
*/
        TreeMenu.prototype.addItem = function (newNode)
        {
                newIndex = this.n.length;
                this.n[newIndex] = newNode;

                return this.n[newIndex];
        }

/**
* Preload images hack for Mozilla
*/
        TreeMenu.prototype.preloadImages = function ()
        {
                var plustop    = new Image; plustop.src    = this.iconpath + '/plustop.gif';
                var plusbottom = new Image; plusbottom.src = this.iconpath + '/plusbottom.gif';
                var plus       = new Image; plus.src       = this.iconpath + '/plus.gif';

                var minustop    = new Image; minustop.src    = this.iconpath + '/minustop.gif';
                var minusbottom = new Image; minusbottom.src = this.iconpath + '/minusbottom.gif';
                var minus       = new Image; minus.src       = this.iconpath + '/minus.gif';

                var branchtop    = new Image; branchtop.src    = this.iconpath + '/branchtop.gif';
                var branchbottom = new Image; branchbottom.src = this.iconpath + '/branchbottom.gif';
                var branch       = new Image; branch.src       = this.iconpath + '/branch.gif';

                var linebottom = new Image; linebottom.src = this.iconpath + '/linebottom.gif';
                var line       = new Image; line.src       = this.iconpath + '/line.gif';
        }

/**
* Main function that draws the menu and assigns it
* to the layer (or document.write()s it)
*/
        TreeMenu.prototype.drawMenu = function ()// OPTIONAL ARGS: nodes = [], level = [], prepend = '', expanded = false, visbility = 'inline', parentLayerID = null
        {
                /**
            * Necessary variables
            */
                var output        = '';
                var modifier      = '';
                var layerID       = '';
                var parentLayerID = '';

                /**
            * Parse any optional arguments
            */
                var nodes         = arguments[0] ? arguments[0] : this.n
                var level         = arguments[1] ? arguments[1] : [];
                var prepend       = arguments[2] ? arguments[2] : '';
                var expanded      = arguments[3] ? arguments[3] : false;
                var visibility    = arguments[4] ? arguments[4] : 'inline';
                var parentLayerID = arguments[5] ? arguments[5] : null;

                var currentlevel  = level.length;

                for (var i=0; i<nodes.length; i++) {

                        level[currentlevel] = i+1;
                        layerID = this.myname + '_' + 'node_' + this.implode('_', level);

                        /**
            * Store this object in the nodeRefs array
            */
                        this.nodeRefs[layerID] = nodes[i];

                        /**
                * Store the child/parent relationship
                */
                        this.childParents[layerID] = parentLayerID;

                        /**
                * Gif modifier
                */
                        if (i == 0 && parentLayerID == null) {
                                modifier = nodes.length > 1 ? "top" : 'single';
                        } else if(i == (nodes.length-1)) {
                                modifier = "bottom";
                        } else {
                                modifier = "";
                        }

                        /**
                * Single root branch is always expanded
                */
                        if (!this.doesMenu() || (parentLayerID == null && (nodes.length == 1 || this.noTopLevelImages))) {
                                expanded = true;

                        } else if (nodes[i].expanded) {
                                expanded = true;

                        } else {
                                expanded = false;
                        }

                        /**
                * Make sure visibility is correct based on parent status
                */
                        visibility =  this.checkParentVisibility(layerID) ? visibility : 'none';

                        /**
                * Setup branch status and build an indexed array
                        * of branch layer ids
                */
                        if (nodes[i].n.length > 0) {
                                this.branchStatus[layerID] = expanded;
                                this.branches[this.branches.length] = layerID;
                        }

                        /**
                * Setup toggle relationship
                */
                        if (!this.layerRelations[parentLayerID]) {
                                this.layerRelations[parentLayerID] = new Array();
                        }
                        this.layerRelations[parentLayerID][this.layerRelations[parentLayerID].length] = layerID;

                        /**
                * Branch images
                */
                        var gifname  = nodes[i].n.length && this.doesMenu() && nodes[i].isDynamic ? (expanded ? 'minus' : 'plus') : 'branch';
                        var iconName = expanded && nodes[i].expandedIcon ? nodes[i].expandedIcon : nodes[i].icon;
                        var iconimg  = nodes[i].icon ? this.stringFormat('<img src="{0}/{1}" align="top" id="icon_{2}">', this.iconpath, iconName, layerID) : '';

                        /**
                        * Add event handlers
                        */
                        var eventHandlers = "";
                        for (j in nodes[i].events) {
                                eventHandlers += this.stringFormat('{0}="{1}" ', j, nodes[i].events[j]);
                        }

                        /**
                * Build the html to write to the document
                        * IMPORTANT:
                        * document.write()ing the string: '<div style="display:...' will screw up nn4.x
                */
                        var layerTag  = this.doesMenu() ? this.stringFormat('<div id="{0}" style="display: {1}" class="{2}">', layerID, visibility, (nodes[i].cssClass ? nodes[i].cssClass : this.defaultClass)) : this.stringFormat('<div class="{0}">', nodes[i].cssClass ? nodes[i].cssClass : this.defaultClass);
                        var onMDown   = this.doesMenu() && nodes[i].n.length  && nodes[i].isDynamic ? this.stringFormat('onmousedown="{0}.toggleBranch(\'{1}\', true)" style="cursor: pointer; cursor: hand"', this.myname, layerID) : '';
                        var imgTag    = this.stringFormat('<img src="{0}/{1}{2}.gif" align="top" border="0" name="img_{3}" {4}>', this.iconpath, gifname, modifier, layerID, onMDown);
                        var linkTarget= nodes[i].linkTarget ? nodes[i].linkTarget : this.linkTarget;
                        var linkStart = nodes[i].link ? this.stringFormat('<a href="{0}" target="{1}">', nodes[i].link, linkTarget) : '';

                        var linkEnd   = nodes[i].link ? '</a>' : '';

                        this.output += this.stringFormat('{0}<nobr>{1}{2}{3}{4}<span {5}>{6}</span>{7}</nobr><br></div>',
                                          layerTag,
                                                          prepend,
                                          parentLayerID == null && (nodes.length == 1 || this.noTopLevelImages) ? '' : imgTag,
                                                          iconimg,
                                                          linkStart,
                                                          eventHandlers,
                                                          nodes[i].title,
                                                          linkEnd);

                        /**
                * Traverse sub nodes ?
                */
                        if (nodes[i].n.length) {
                                /**
                    * Determine what to prepend. If there is only one root
                                * node then the prepend to pass to children is nothing.
                                * Otherwise it depends on where we are in the tree.
                    */
                                if (parentLayerID == null && (nodes.length == 1 || this.noTopLevelImages)) {
                                        var newPrepend = '';

                                } else if (i < (nodes.length - 1)) {
                                        var newPrepend = prepend + this.stringFormat('<img src="{0}/line.gif" align="top">', this.iconpath);

                                } else {
                                        var newPrepend = prepend + this.stringFormat('<img src="{0}/linebottom.gif" align="top">', this.iconpath);
                                }

                                this.drawMenu(nodes[i].n,
                                              arrayCopy(level),
                                              newPrepend,
                                              nodes[i].expanded,
                                              expanded ? 'inline' : 'none',
                                              layerID);
                        }
                }
        }

/**
* Writes the output generated by drawMenu() to the page
*/
        TreeMenu.prototype.writeOutput = function (customdiv)
        {
                if (customdiv != "")
                {
                        customDivObj = browserObject(customdiv);
                        if (customDivObj)
                        {
                                customDivObj.innerHTML = this.output;
                        }
                } else {
                        document.write(this.output);
                }
        }

/**
* Expand all Nodes
*/
        TreeMenu.prototype.expandAllNodes = function ()
        {
                var nodes = this.n;
                var level = new Array();

                var currentlevel  = level.length;
                var parentLayerID = null;
                var visibility = 'inline';

                for (var i=0; i<nodes.length; i++) {
                        level[currentlevel] = i+1;
                        layerID = this.myname + '_' + 'node_' + this.implode('_', level);

                        if (this.layerRelations[layerID]) {
                                this.toggleBranch(layerID, true);
                        }
                }

                return true;
        }


/**
* Toggles a branches visible status. Called from resetBranches()
* and also when a +/- graphic is clicked.
*/
        TreeMenu.prototype.toggleBranch = function (layerID, updateStatus) // OPTIONAL ARGS: fireEvents = true
        {
                var currentDisplay = this.getLayer(layerID).style.display;
                var newDisplay     = (this.branchStatus[layerID] && currentDisplay == 'inline') ? 'none' : 'inline';
                var fireEvents     = arguments[2] != null ? arguments[2] : true;

                for (var i=0; i<this.layerRelations[layerID].length; i++) {

                        if (this.branchStatus[this.layerRelations[layerID][i]]) {
                                this.toggleBranch(this.layerRelations[layerID][i], false);
                        }

                        this.getLayer(this.layerRelations[layerID][i]).style.display = newDisplay;
                }

                if (updateStatus) {
                        this.branchStatus[layerID] = !this.branchStatus[layerID];

                        /**
                * Persistence
                */
                        if (this.doesPersistence() && !arguments[2] && this.usePersistence) {
                                this.setExpandedStatusForCookie(layerID, this.branchStatus[layerID]);
                        }

                        /**
                        * Fire custom events
                        */
                        if (fireEvents) {
                                nodeObject = this.nodeRefs[layerID];

                                if (nodeObject.ontoggle != null) {
                                        eval(nodeObject.ontoggle);
                                }

                                if (newDisplay == 'none' && nodeObject.oncollapse != null) {
                                        eval(nodeObject.oncollapse);
                                } else if (newDisplay == 'inline' && nodeObject.onexpand != null){
                                        eval(nodeObject.onexpand);
                                }
                        }

                        // Swap image
                        this.swapImage(layerID);
                }

                // Swap icon
                this.swapIcon(layerID);
        }

/**
* Swaps the plus/minus branch images
*/
        TreeMenu.prototype.swapImage = function (layerID)
        {
                var imgSrc = document.images['img_' + layerID].src;

                var re = /^(.*)(plus|minus)(bottom|top|single)?.gif$/
                if (matches = imgSrc.match(re)) {

                        document.images['img_' + layerID].src = this.stringFormat('{0}{1}{2}{3}',
                                                                        matches[1],
                                                                                                                        matches[2] == 'plus' ? 'minus' : 'plus',
                                                                                                                        matches[3] ? matches[3] : '',
                                                                                                                        '.gif');
                }
        }

/**
* Swaps the icon for the expanded icon if one
* has been supplied.
*/
        TreeMenu.prototype.swapIcon = function (layerID)
        {
                if (document.images['icon_' + layerID]) {
                        var imgSrc = document.images['icon_' + layerID].src;

                        if (this.nodeRefs[layerID].icon && this.nodeRefs[layerID].expandedIcon) {
                                var newSrc = (imgSrc.indexOf(this.nodeRefs[layerID].expandedIcon) == -1 ? this.nodeRefs[layerID].expandedIcon : this.nodeRefs[layerID].icon);

                                document.images['icon_' + layerID].src = this.iconpath + '/' + newSrc;
                        }
                }
        }

/**
* Can the browser handle the dynamic menu?
*/
        TreeMenu.prototype.doesMenu = function ()
        {
                return (is_ie4up || is_nav6up || is_gecko || is_opera7);
        }

/**
* Can the browser handle save the branch status
*/
        TreeMenu.prototype.doesPersistence = function ()
        {
                return (is_ie4up || is_gecko || is_nav6up || is_opera7);
        }

/**
* Returns the appropriate layer accessor
*/
        TreeMenu.prototype.getLayer = function (layerID)
        {
                if (is_ie4) {
                        return document.all(layerID);

                } else if (document.getElementById(layerID)) {
                        return document.getElementById(layerID);

                } else if (document.all(layerID)) {
                        return document.all(layerID);
                }
        }

/**
* Save the status of the layer
*/
        TreeMenu.prototype.setExpandedStatusForCookie = function (layerID, expanded)
        {
                this.cookieStatuses[layerID] = expanded;
                this.saveCookie();
        }

/**
* Load the status of the layer
*/
        TreeMenu.prototype.getExpandedStatusFromCookie = function (layerID)
        {
                if (this.cookieStatuses[layerID]) {
                        return this.cookieStatuses[layerID];
                }

                return false;
        }

/**
* Saves the cookie that holds which branches are expanded.
* Only saves the details of the branches which are expanded.
*/
        TreeMenu.prototype.saveCookie = function ()
        {
                var cookieString = new Array();

                for (var i in this.cookieStatuses) {
                        if (this.cookieStatuses[i] == true) {
                                cookieString[cookieString.length] = i;
                        }
                }

                // ======= PERMANENT COOKIE PATCH [VARUN] =======
                var expire = new Date();
                expire.setTime(expire.getTime() + 365*24*60*60*1000);

                document.cookie = 'TreeMenuBranchStatus=' + cookieString.join(':')+"; expires="+expire.toUTCString();
        }

/**
* Reads cookie parses it for status info and
* stores that info in the class member.
*/
        TreeMenu.prototype.loadCookie = function ()
        {
                var cookie = document.cookie.split('; ');

                for (var i=0; i < cookie.length; i++) {
                        var crumb = cookie[i].split('=');
                        if ('TreeMenuBranchStatus' == crumb[0] && crumb[1]) {
                                var expandedBranches = crumb[1].split(':');
                                for (var j=0; j<expandedBranches.length; j++) {
                                        this.cookieStatuses[expandedBranches[j]] = true;
                                }
                        }
                }
        }

/**
* Reset branch status
*/
        TreeMenu.prototype.resetBranches = function ()
        {
                if (!this.doesPersistence()) {
                        return false;
                }

                this.loadCookie();

                for (var i=0; i<this.branches.length; i++) {
                        var status = this.getExpandedStatusFromCookie(this.branches[i]);
                        // Only update if it's supposed to be expanded and it's not already
                        if (status == true && this.branchStatus[this.branches[i]] != true) {
                                if (this.checkParentVisibility(this.branches[i])) {
                                        this.toggleBranch(this.branches[i], true, false);
                                } else {
                                        this.branchStatus[this.branches[i]] = true;
                                        this.swapImage(this.branches[i]);
                                }
                        }
                }
        }

/**
* Checks whether a branch should be open
* or not based on its parents' status
*/
        TreeMenu.prototype.checkParentVisibility = function (layerID)
        {
                if (this.in_array(this.childParents[layerID], this.branches)
                    && this.branchStatus[this.childParents[layerID]]
                        && this.checkParentVisibility(this.childParents[layerID]) ) {

                        return true;

                } else if (this.childParents[layerID] == null) {
                        return true;
                }

                return false;
        }

/**
* New C# style string formatter
*/
        TreeMenu.prototype.stringFormat = function (strInput)
        {
                var idx = 0;

                for (var i=1; i<arguments.length; i++) {
                        while ((idx = strInput.indexOf('{' + (i - 1) + '}', idx)) != -1) {
                                strInput = strInput.substring(0, idx) + arguments[i] + strInput.substr(idx + 3);
                        }
                }

                return strInput;
        }

/**
* Also much adored, the PHP implode() function
*/
        TreeMenu.prototype.implode = function (seperator, input)
        {
                var output = '';

                for (var i=0; i<input.length; i++) {
                        if (i == 0) {
                                output += input[i];
                        } else {
                                output += seperator + input[i];
                        }
                }

                return output;
        }

/**
* Aah, all the old favourites are coming out...
*/
        TreeMenu.prototype.in_array = function (item, arr)
        {
                for (var i=0; i<arr.length; i++) {
                        if (arr[i] == item) {
                                return true;
                        }
                }

                return false;
        }

/**
* TreeNode Class
*/
        function TreeNode(title, icon, link, expanded, isDynamic, cssClass, linkTarget, expandedIcon)
        {
                this.title        = title;
                this.icon         = icon;
                this.expandedIcon = expandedIcon;
                this.link         = link;
                this.expanded     = expanded;
                this.isDynamic    = isDynamic;
                this.cssClass     = cssClass;
                this.linkTarget   = linkTarget;
                this.n            = new Array();
                this.events       = new Array();
                this.handlers     = null;
                this.oncollapse   = null;
                this.onexpand     = null;
                this.ontoggle     = null;
        }

/**
* Adds a node to an already existing node
*/
        TreeNode.prototype.addItem = function (newNode)
        {
                newIndex = this.n.length;
                this.n[newIndex] = newNode;

                return this.n[newIndex];
        }

/**
* Sets an event for this particular node
*/
        TreeNode.prototype.setEvent = function (eventName, eventHandler)
        {
                switch (eventName.toLowerCase()) {
                        case 'onexpand':
                                this.onexpand = eventHandler;
                                break;

                        case 'oncollapse':
                                this.oncollapse = eventHandler;
                                break;

                        case 'ontoggle':
                                this.ontoggle = eventHandler;
                                break;

                        default:
                                this.events[eventName] = eventHandler;
                }
        }

/**
* That's the end of the tree classes. What follows is
* the browser detection code.
*/


//<!--
// Ultimate client-side JavaScript client sniff. Version 3.03
// (C) Netscape Communications 1999-2001.  Permission granted to reuse and distribute.
// Revised 17 May 99 to add is_nav5up and is_ie5up (see below).
// Revised 20 Dec 00 to add is_gecko and change is_nav5up to is_nav6up
//                      also added support for IE5.5 Opera4&5 HotJava3 AOLTV
// Revised 22 Feb 01 to correct Javascript Detection for IE 5.x, Opera 4,
//                      correct Opera 5 detection
//                      add support for winME and win2k
//                      synch with browser-type-oo.js
// Revised 26 Mar 01 to correct Opera detection
// Revised 02 Oct 01 to add IE6 detection

// Everything you always wanted to know about your JavaScript client
// but were afraid to ask. Creates "is_" variables indicating:
// (1) browser vendor:
//     is_nav, is_ie, is_opera, is_hotjava, is_webtv, is_TVNavigator, is_AOLTV
// (2) browser version number:
//     is_major (integer indicating major version number: 2, 3, 4 ...)
//     is_minor (float   indicating full  version number: 2.02, 3.01, 4.04 ...)
// (3) browser vendor AND major version number
//     is_nav2, is_nav3, is_nav4, is_nav4up, is_nav6, is_nav6up, is_gecko, is_ie3,
//     is_ie4, is_ie4up, is_ie5, is_ie5up, is_ie5_5, is_ie5_5up, is_ie6, is_ie6up, is_hotjava3, is_hotjava3up,
//     is_opera2, is_opera3, is_opera4, is_opera5, is_opera5up
// (4) JavaScript version number:
//     is_js (float indicating full JavaScript version number: 1, 1.1, 1.2 ...)
// (5) OS platform and version:
//     is_win, is_win16, is_win32, is_win31, is_win95, is_winnt, is_win98, is_winme, is_win2k
//     is_os2
//     is_mac, is_mac68k, is_macppc
//     is_unix
//     is_sun, is_sun4, is_sun5, is_suni86
//     is_irix, is_irix5, is_irix6
//     is_hpux, is_hpux9, is_hpux10
//     is_aix, is_aix1, is_aix2, is_aix3, is_aix4
//     is_linux, is_sco, is_unixware, is_mpras, is_reliant
//     is_dec, is_sinix, is_freebsd, is_bsd
//     is_vms
//
// See http://www.it97.de/JavaScript/JS_tutorial/bstat/navobj.html and
// http://www.it97.de/JavaScript/JS_tutorial/bstat/Browseraol.html
// for detailed lists of userAgent strings.
//
// Note: you don't want your Nav4 or IE4 code to "turn off" or
// stop working when new versions of browsers are released, so
// in conditional code forks, use is_ie5up ("IE 5.0 or greater")
// is_opera5up ("Opera 5.0 or greater") instead of is_ie5 or is_opera5
// to check version in code which you want to work on future
// versions.

/**
* Severly curtailed all this as only certain elements
* are required by TreeMenu, specifically:
*  o is_ie4up
*  o is_nav6up
*  o is_gecko
*/

    // convert all characters to lowercase to simplify testing
    var agt=navigator.userAgent.toLowerCase();

    // *** BROWSER VERSION ***
    // Note: On IE5, these return 4, so use is_ie5up to detect IE5.
    var is_major = parseInt(navigator.appVersion);
    var is_minor = parseFloat(navigator.appVersion);

    // Note: Opera and WebTV spoof Navigator.  We do strict client detection.
    // If you want to allow spoofing, take out the tests for opera and webtv.
    var is_nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
                && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
                && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
    var is_nav6up = (is_nav && (is_major >= 5));
    var is_gecko = (agt.indexOf('gecko') != -1);


    var is_ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
    var is_ie4    = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
    var is_ie4up  = (is_ie && (is_major >= 4));

        var is_opera  = (agt.indexOf("opera") != -1);
        var is_opera7 = is_opera && (agt.indexOf("opera 7") != -1);

        // Patch from Harald Fielker
    if (agt.indexOf('konqueror') != -1) {
        var is_nav    = false;
        var is_nav6up = false;
        var is_gecko  = false;
        var is_ie     = true;
        var is_ie4    = true;
        var is_ie4up  = true;
    }
//--> end hide JavaScript



