var g_smugmugOnStart = null;
var g_supBrowsers    = "    1. Firefox 1.0+ (firefox)\n    2. MS Internet Explorer 6+ (msie)\n    3. Opera 8+ (opera)\n    4. Netscape 8+ (netscape)\n";
var g_limSupBrowsers = "    Safari 1.2+ (safari)\n    Netscape 7 (netscape)\n    Mozilla 1.4+ (mozilla/gecko)\n    MS Internet Explorer 5.5 (msie)\n";

var g_About = "'Streets of Boston' Photo Galleries        \n \n"+
              "Powered by:\n    Galleries by Smugmug, Inc.\n    jsDOMenu by Toh Zhiqiang.\n    Statistics by www.statcounter.com\n    Subscriptions by www.feedburner.com\n \n"+
              "Recommended browsers:\n"+g_supBrowsers+" \n"+
              "Other browsers (limited support):\n"+g_limSupBrowsers+" \n"+
              "Browser ID:\n";
var g_bio = null;
var g_elmCommunities = null;
var g_elmFeatured = null;
var g_elmKeywords = null;
var g_elmGalleries = null;
var g_elmThumbnails = null;


var g_lsheet = null;

//filmStrip values you can override:
rightMoves = -5;
leftMoves = 5;
showImagePreview = false;

function addCSSRule(pSelector, pStyles)
{
    if (!g_lsheet)
        return;
    try {
        var totalrules = g_lsheet.cssRules? g_lsheet.cssRules.length : g_lsheet.rules.length
        if (g_browserID.indexOf("msie")==0)
        {
            g_lsheet.addRule(pSelector, pStyles);
        }
        else
        {
            g_lsheet.insertRule(pSelector+" { "+pStyles+" }", totalrules);
        }
    }
    catch (xcpt) { }
}

var _g_shown = {
    my_logo: true,
    communitiesBox: false,
    keywordsBox: false,
    featuredBox: false,
    galleriesBox: false,
    categoriesBox: false,
    thumbnails: true
};


function gotoGalleries()
{
    if (!_g_shown[g_elmGalleries.id])
    {
        toggleBox('view_g', g_elmGalleries);
    }
}

function makeSureBoxVisibilty(pBox, pMenuIdx)
{
    if (!pBox)
        return;

    var boxMustShow = _getCookie("T_"+pBox.id);
    if (boxMustShow && (boxMustShow != (""+_g_shown[pBox.id])))
        toggleBox(pMenuIdx, pBox);
}

function doOnLoad()
{
    getBrowserId(false);

    if (g_isLoaded)
        return;

    g_isLoaded = true;

    // Code script that needs to be executed when page has loaded.
    try {
        var ssheets = document.styleSheets;
        g_lsheet = ssheets.item(ssheets.length-1);
    }
    catch (xcpt) { }

    var mainDiv = document.getElementById("my_maindiv");

    g_logo           = document.getElementById("my_logo");
    g_bio            = document.getElementById("bioBox");
    g_elmCommunities = document.getElementById("communitiesBox");
    g_elmKeywords    = document.getElementById("keywordsBox");
    g_elmFeatured    = document.getElementById("featuredBox");
    g_elmGalleries   = document.getElementById("galleriesBox");
    if (!g_elmGalleries)
        g_elmGalleries   = document.getElementById("categoriesBox");

    g_elmThumbnails = document.getElementById("smugmug_small") || document.getElementById("smugmug") || document.getElementById("filmstrip")
                        ? document.getElementById("thumbnails")
                        : null;

    // Don't allow logo to be shown (or hidden) in these cases:
    if (g_elmThumbnails || document.getElementById("singleImage") || document.getElementById("critique") || document.getElementById("slideshow"))
        g_logo = null;
    if (document.getElementById("filmstrip"))
        g_elmThumbnails = null;
    else if (window.AlbumID && window.AlbumID == "3095235") // EMail gallery.
    {
        g_elmThumbnails = null;
        useLightbox = false;
    }

    var noMenu = false;
    try {
        initjsDOMenu();
    }
    catch (err) { }

    if (g_reqRotStop)
        toggleCrawl();
    incrRotateCntr();

    window.setTimeout("document.getElementById('ml_4').style.visibility = 'visible'", 1000);

    makeSureBoxVisibilty(g_logo, "view_l");
    makeSureBoxVisibilty(g_elmFeatured, "view_f");
    makeSureBoxVisibilty(g_elmGalleries, "view_g");
    makeSureBoxVisibilty(g_elmThumbnails, "view_th");

    if (document.getElementById("allthumbs") || document.getElementById("traditional") || document.getElementById("journal"))
    {
        replaceLinksFromImg();
    }

    if (window.AlbumID && (window.AlbumID == "868577" || window.AlbumID == "3095235")) // Equipment, EMail gallery.
    {
        removeLinkFromImg();
    }

    if (document.getElementById("singleImage"))
    {
        var albumTitle = document.getElementById("albumTitle");
        var links = albumTitle.getElementsByTagName("A");
        for (var i = 0; i < links.length; i++)
        {
            var link = links[i];
            // link.href = "javascript:history.back(); void(0);";
        }
    }

    if (g_smugmugOnStart)
        g_smugmugOnStart();

    if (g_browserID.indexOf("msie_5")==0)
        makeSureImgBorderOK();

    addReferralCode();

    if (g_errorMsg)
    {
        document.getElementById("messageBox").style.display = "block";
        document.getElementById("messageBox").title = g_errorMsg;
    }

    getPopularList(true);

    showSmugWidgets();
}


function addReferralCode()
{
    var footerDiv = document.getElementById("footer");
    if (footerDiv)
    {
        var links = footerDiv.getElementsByTagName("A");
        if (links && (links.length != 0))
        {
            var smugLink = links.item(0);
            smugLink.href = "http://www.smugmug.com/?referrer=r8ldSd3xm3edE";
            smugLink.title = "Click here now to sign up for Smugmug and enjoy a $5 discount! Then follow the 'Join Now!' button."
        }
    }
}

function makeSureImgBorderOK()
{
    g_lsheet.addRule(".imgBorder", "top: 1px;");
    window.setTimeout("g_lsheet.addRule('.imgBorder', 'top: 0px;');", 10);
}

function removeLinkFromImg()
{
    var links = document.getElementsByTagName("A");
    for (var i = 0; i < links.length; i++)
    {
        var link = links[i];
        var divElm = link.parentNode;
        if (!divElm)
            continue;
        divElm = divElm.parentNode;
        if (!divElm)
            continue;
        if (divElm.className.indexOf("photo")<0)
            continue;
        link.href = "javascript:void(0);";
    }
}

function replaceLinksFromImg() 
{
    var links = document.getElementsByTagName("A");
    for (var i = 0; i < links.length; i++)
    {
        var link = links[i];

        var divElm = link.parentNode;
        if (!divElm)
            continue;
        divElm = divElm.parentNode;
        if (!divElm)
            continue;
        if (divElm.className.indexOf("photo")<0)
            continue;

        var curLink = link.href;
        var sl1     = curLink.lastIndexOf("/");
        var sl2     = curLink.lastIndexOf("/", sl1-1);
        var imgID = curLink.substring(sl2+1, sl1);
        link.href = "javascript:openLB('"+imgID+"','Medium','');";
    }
}

var g_feedURL = "http://feeds.feedburner.com/~e?ffid=";
var g_subscribeIDs = new Object();

g_subscribeIDs["portfolio"] = 
    { feed_id:"493954", feed_name:"Streets of Boston's Portfolio Photos" }; // Portfolio
g_subscribeIDs["994065"] = 
    { feed_id:"493114", feed_name:"StreetsOfBoston Street & Candids" }; // Candids
g_subscribeIDs["234268"] = 
    { feed_id:"493123", feed_name:"StreetsOfBoston People/Portraits" }; // Portrait

function handleCrawlFeed(pNotUsed, pXMLData)
{
    if (g_popularList)
        return;

    if (!pXMLData)
        return;

    var isRSS  = pXMLData.nodeName.toLowerCase() == "rss";
    //var isATOM = pXMLData.nodeName.toLowerCase() == "feed";

    var linkId = pXMLData.getElementsByTagName(isRSS ? "link" : "id")[0].firstChild.data;
    var i, max, row, col;

    var items = pXMLData.getElementsByTagName(isRSS ? "item" : "entry");
    var idxArray = new Array();

    for (i = 0; i < items.length; i++)
    {
        idxArray[i]=i;
    }
    fisherYates(idxArray);

    var ret = new Array();
    var len = /*idxArray.length > 30 ? 30 :*/ idxArray.length;
    for (i = 0; i < len; i++)
    {
        var url = isRSS ? items[idxArray[i]].getElementsByTagName("enclosure")[0].getAttribute("url")
                        : items[idxArray[i]].getElementsByTagName("id")[0].firstChild.data;
        url = url.replace(/-Th.*jpg/, "");
        url = url.replace(/http.*\/photos\//,"");
        ret[ret.length] = url;
    }

    g_popularList = ret;
    window.setTimeout("rotateLogoImgs();", 100);

    mergeLists();
    resetCrawl();
    _setCookie("T_popList", ""+g_popularList);
}

function toggleBox(pViewMenuIdx, pBox)
{
    pBox.style.display = _g_shown[pBox.id] ? "none" : "block";

    var menuItem = getMenuItem("View", pViewMenuIdx);
    var curText = menuItem.getDisplayText();

    curText = curText.replace(/Show/, "");
    curText = curText.replace(/Hide/, "");
    curText = (_g_shown[pBox.id] ? "Show" : "Hide") + curText;
    menuItem.setDisplayText(curText);

    _g_shown[pBox.id] = !_g_shown[pBox.id];
    _setCookie("T_"+pBox.id, ""+_g_shown[pBox.id]);

    if (pViewMenuIdx=='view_th')
    {
        var topPx = _g_shown[pBox.id] ? 252 : 27;
        // addCSSRule("#smugmug #albumNav_top .rightColumn", "top: "+topPx+"px;");
        // addCSSRule("#smugmug_small #albumNav_top .rightColumn", "top: "+topPx+"px;");

        topPx = _g_shown[pBox.id] ? -253 : -28;
        // addCSSRule("#smugmug .cartbuttons", "top: "+topPx+"px;");
        // addCSSRule("#smugmug_small .cartbuttons", "top: "+topPx+"px;");
    }

    menuItem = getMenuItem(null, pViewMenuIdx);
    if (menuItem)
        menuItem.setDisplayText(curText);
}

function incrRotateCntr()
{
    if (!g_logo)
        return;

    _setCookie("R_CNTR", g_rotateStopped ? "-"+g_rotateCntr : "+"+g_rotateCntr);
    g_rotateCntr++;
}

function rotateLogoImgs()
{
    if (!g_logo)
        return false;

    if (!g_rotateStopped) {
        var div4  = document.getElementById("ml_4");
        var width = div4.scrollWidth;
        div4.style.left  = "0px";
        window.setTimeout("rotSmooth(0,20,"+width+");", 100);
    }

    window.setTimeout("rotateLogoImgs()", 9000);
    return true;
}

function rotSmooth(pCntr, pMax, pWidth)
{
    var div4 = document.getElementById("ml_4");

    if (pCntr < pMax)
    {
        div4.style.left = (pWidth - (pWidth*Math.pow(pMax-pCntr,2))/(Math.pow(pMax,2)) )+"px";
        //div4.style.left = ( (pWidth*pCntr)/pMax )+"px";
        window.setTimeout("rotSmooth("+(pCntr+1)+","+pMax+","+pWidth+");", 100);
        return;
    }

    div4.style.left  = "0px";

    doRotate();
    incrRotateCntr();
}

function toggleCrawl()
{
    var menuItem = getMenuItem("View", "view_c");
    var curText = menuItem ? menuItem.getDisplayText() : null;

    if (curText)
    {
        curText = curText.replace(/Stop/, "");
        curText = curText.replace(/Play/, "");
        curText = (g_rotateStopped ? "Stop" : "Play") + curText;
        menuItem.setDisplayText(curText);
    }

    g_rotateStopped = !g_rotateStopped;

    var curCntr = g_rotateCntr-1;
    if (curCntr < 0) curCntr = 0;
    _setCookie("R_CNTR", g_rotateStopped ? ("-"+curCntr) : ("+"+curCntr));
}

function resetCrawl()
{
    g_rotateCntr = 0;
    doRotate();
    incrRotateCntr();
}

/* End Main Script */

/* Begin Menu Script */
var g_menuBar = null;
var popUpMenu = null;

function createjsDOMenu()
{
    var menuBarObj = new jsDOMenuBar("static", "staticMenuBar", false, "jsdomenubardiv" );
    //var menuBarObj = new jsDOMenuBar("absolute", "staticMenuBar", true, "floatMenuBar");
    var menuBarItemObj;

    var mainMenu2;
    var viewCtr;

    mainMenu2 = new jsDOMenu(210);

    mainMenu2.addMenuItem(new menuItem("Home", "", "code:doHideMenus(); window.location='http://www.streetsofboston.com';"));
    mainMenu2.addMenuItem(new menuItem("Portfolio", "", "code:doHideMenus(); window.location='/Portfolio';"));
    mainMenu2.addMenuItem(new menuItem("-"));
    mainMenu2.addMenuItem(new menuItem("How to Buy Prints", "", "code:doHideMenus(); window.location='/gallery/868977';"));
    mainMenu2.addMenuItem(new menuItem("My Guestbook", "", "code:doHideMenus(); window.location='/gallery/869055';"));
    mainMenu2.addMenuItem(new menuItem("My Equipment", "", "code:doHideMenus(); window.location='/gallery/868577';"));
    mainMenu2.addMenuItem(new menuItem("-"));
    mainMenu2.addMenuItem(new menuItem("My Contact Page", "", "code:doHideMenus(); window.location='/gallery/3095235';"));
    mainMenu2.addMenuItem(new menuItem("My Blog", "", "code:doHideMenus(); window.location='http://blog.antonspaans.com';"));
    //mainMenu2.addMenuItem(new menuItem("Contact Information", "", "code:doHideMenus();alert('Under Construction');"));
    menuBarItemObj = new menuBarItem("Go To\u2026", mainMenu2, "Goto", true);
    menuBarObj.addMenuBarItem(menuBarItemObj);

    mainMenu2 = new jsDOMenu(250);
    viewCtr = 0;
    if (g_elmFeatured)
        mainMenu2.addMenuItem(new menuItem("Show Featured Galleries", "view_f", "code:doHideMenus(); toggleBox('view_f', g_elmFeatured);"));
    if (g_bio && g_elmGalleries)
    {
        mainMenu2.addMenuItem(new menuItem("Show Other Galleries", "view_g", "code:doHideMenus(); toggleBox('view_g', g_elmGalleries);"));
    }
    if (g_elmFeatured || (g_bio && g_elmGalleries))
    {
        viewCtr++;
        mainMenu2.addMenuItem(new menuItem("-"));
    }
    if (g_elmThumbnails)
    {
        var thHidden = false;
        if (document.getElementById("thumbnails"))
        {
            var menItem = new menuItem("Hide Thumbnails", "view_th", "code:doHideMenus(); toggleBox('view_th', g_elmThumbnails);");
            mainMenu2.addMenuItem(menItem);

            // popUpMenu = new jsDOMenu(210);
            // popUpMenu.addMenuItem(menItem);
            if (g_logo)
                mainMenu2.addMenuItem(new menuItem("-"));
        }
    }
    if (g_logo)
    {
        mainMenu2.addMenuItem(new menuItem("Hide Logo", "view_l", "code:doHideMenus(); toggleBox('view_l', g_logo);"));
        mainMenu2.addMenuItem(new menuItem("Stop Photo Crawl", "view_c", "code:doHideMenus(); toggleCrawl();"));
        mainMenu2.addMenuItem(new menuItem("Reset Photo Crawl", "view_r", "code:doHideMenus(); resetCrawl();"));
    }
    if (g_elmFeatured || (g_bio && g_elmGalleries) || g_elmThumbnails || g_logo)
    {
        menuBarItemObj = new menuBarItem("View", mainMenu2, "View", true);
        menuBarObj.addMenuBarItem(menuBarItemObj);
    }

    mainMenu2 = new jsDOMenu(250);
    mainMenu2.addMenuItem(new menuItem("Pictures in 'Streets Of Boston'", "", "code:doHideMenus(); searchSmugmug('searchTypeU');"));
    mainMenu2.addMenuItem(new menuItem("Pictures in entire Smugmug", "", "code:doHideMenus(); searchSmugmug('searchTypeG');"));
    mainMenu2.addMenuItem(new menuItem("-"));
    mainMenu2.addMenuItem(new menuItem("Keywords in 'Streets Of Boston'", "", "code:doHideMenus(); searchSmugmug(null);"));
    mainMenu2.addMenuItem(new menuItem("-"));
    mainMenu2.addMenuItem(new menuItem("Over Date Range", "", "link:/date/"));

    menuBarItemObj = new menuBarItem("Find\u2026", mainMenu2, "Search", true);
    menuBarObj.addMenuBarItem(menuBarItemObj);

    var feedMenu = new jsDOMenu(210);
    feedMenu.addMenuItem(new menuItem("to Entire Portfolio", "", "code:doHideMenus();doSubscribe('portfolio');"));
    if (window.AlbumID && g_subscribeIDs[window.AlbumID])
    {
        feedMenu.addMenuItem(new menuItem("to This Gallery", "", "code:doHideMenus();doSubscribe('"+window.AlbumID+"');"));
    }
    var subscribeBarItemObj = new menuBarItem("Subscribe\u2026", feedMenu, "Subscribe", true);
    menuBarObj.addMenuBarItem(subscribeBarItemObj);
    
    if (/*document.getElementById("singleImage") ||*/ document.getElementById("filmstrip"))
    {
        var clElm = document.getElementById("singleImage") 
                             ? document.getElementById("singleImage")
                             : document.getElementById("filmstrip")
        var className = clElm.className;
        var enabled;

        mainMenu2 = new jsDOMenu(210);

        enabled = className.indexOf(" Small ") < 0;
        mainMenu2.addMenuItem(new menuItem("to Small", "", "code:doHideMenus(); setSISize('Small');", enabled));
        enabled = className.indexOf("Medium ") < 0;
        mainMenu2.addMenuItem(new menuItem("to Medium", "", "code:doHideMenus(); setSISize('Medium');", enabled));
        enabled = className.indexOf(" Large ") < 0;
        mainMenu2.addMenuItem(new menuItem("to Large", "", "code:doHideMenus(); setSISize('Large');", enabled));

        menuBarItemObj = new menuBarItem("Change Photo Size", mainMenu2, "MSize", true);
        menuBarObj.addMenuBarItem(menuBarItemObj);
    }
    if (!document.getElementById("singleImage") && document.getElementById("stylebar"))
    {
        var ctrlSel = document.template_chooser.TemplateID;
        var enabled;

        mainMenu2 = new jsDOMenu(210);

        enabled = ctrlSel.value != "3";
        mainMenu2.addMenuItem(new menuItem("to Smugmug (default)", "", "code:doHideMenus(); setStyle(3);", enabled));
        //enabled = ctrlSel.value != "10";
        //mainMenu2.addMenuItem(new menuItem("to Smugmug small screen", "", "code:doHideMenus(); setStyle(10);", enabled));
        enabled = ctrlSel.value != "12";
        mainMenu2.addMenuItem(new menuItem("to Critique (1 at a time)", "", "code:doHideMenus(); setStyle(12);", enabled));
        enabled = ctrlSel.value != "11";
        mainMenu2.addMenuItem(new menuItem("to Filmstrip", "", "code:doHideMenus(); setStyle(11);", enabled));
        enabled = ctrlSel.value != "8";
        mainMenu2.addMenuItem(new menuItem("to Slideshow", "", "code:doHideMenus(); setStyle(8);", enabled));
        enabled = ctrlSel.value != "9";
        mainMenu2.addMenuItem(new menuItem("to Journal", "", "code:doHideMenus(); setStyle(9);", enabled));
        enabled = ctrlSel.value != "4";
        mainMenu2.addMenuItem(new menuItem("to Traditional (PBase)", "", "code:doHideMenus(); setStyle(4);", enabled));
        enabled = ctrlSel.value != "7";
        mainMenu2.addMenuItem(new menuItem("to Thumbnails (all pics)", "", "code:doHideMenus(); setStyle(7);", enabled));

        menuBarItemObj = new menuBarItem("Change Gallery Style", mainMenu2, "Style", true);
        menuBarObj.addMenuBarItem(menuBarItemObj);
    }

    var communities = document.getElementById("communityMember");
    if (communities)
    {
        mainMenu2 = null;
        var links = communities.getElementsByTagName("A");
        for (var i = 0; i < links.length; i++)
        {
            var aLink = links[i];
            var href  = aLink.href;
            var aText = aLink.firstChild.data;

            if (i == 0)
                mainMenu2 = new jsDOMenu(210);

            mainMenu2.addMenuItem(new menuItem(aText, "", "link:"+href));
        }
        if (mainMenu2)
        {
            menuBarItemObj = new menuBarItem("Photo Communities", mainMenu2, "PhotCom", true);
            menuBarObj.addMenuBarItem(menuBarItemObj);
        }
    }

    var mainMenu3 = new jsDOMenu(210);
    mainMenu3.addMenuItem(new menuItem("About Artist & Site Help", "", "code:doHideMenus(); window.location='/gallery/870806';"));
    mainMenu3.addMenuItem(new menuItem("-"));
    mainMenu3.addMenuItem(new menuItem("Smugmug Help", "", "code:doHideMenus(); window.open('http://www.smugmug.com/help','_help');"));
    mainMenu3.addMenuItem(new menuItem("Smugmug Forum", "", "code:doHideMenus(); window.open('http://www.dgrin.com','_help');"));
    //mainMenu3.addMenuItem(new menuItem("-"));
    //mainMenu3.addMenuItem(new menuItem("Reset Menu", "", "code:resetMenuBar();"));
    mainMenu3.addMenuItem(new menuItem("-"));
    mainMenu3.addMenuItem(new menuItem("About\u2026", "", "code:doHideMenus(); alert(g_About+_g_UA);"));

    menuBarItemObj = new menuBarItem("Help", mainMenu3, "menu_help", true, "", "jsdomenubaritem menu_help", "jsdomenubaritemover menu_help", "jsdomenubaritemclick menu_help");
    menuBarObj.addMenuBarItem(menuBarItemObj);

    menuBarObj.setActivateMode("over");
    //menuBarObj.moveTo(4, 16);

    g_menuBar = menuBarObj;

    if (popUpMenu)
    {
        popUpMenu.setNoneExceptFilter(new Array("*.thumbnails", "*.albumNav_top"));
        setPopUpMenu(popUpMenu);
        activatePopUpMenuBy(1, 2);
    }
}

function doHideMenus()
{
    hideVisibleMenus();
    if (typeof(hideMenuBarMenus) == "function")
        hideMenuBarMenus();
}

function doSubscribe(pAlbumID) 
{
    if (pAlbumID && g_subscribeIDs[pAlbumID] &&
        g_subscribeIDs[pAlbumID].feed_id)
    {
        var email = prompt('Please enter your email address to be\nnotified of changes to my gallery or portfolio.', '');
        if (!email)
            return;
 
        document.getElementById("feed_email").value = email;
        document.getElementById("feed_url").value = g_feedURL+g_subscribeIDs[pAlbumID].feed_id;
        document.getElementById("feed_title").value = g_subscribeIDs[pAlbumID].feed_name;
        document.getElementById("feed_submit").click();
    }
}

function resetMenuBar()
{
    doHideMenus();
    g_menuBar.moveTo(4, 16);
}

function getMenuBarItem(pMenuBarItemId)
{
    return g_menuBar.items[pMenuBarItemId];
}

function getMenuItem(pMenuBarItemId, pMenuItemId)
{
    if (pMenuBarItemId)
    {
        var menuBar = getMenuBarItem(pMenuBarItemId);
        return menuBar ? menuBar.menu.items[pMenuItemId] : null;
    }
    else
    {
        var menuBar = popUpMenu;
        return menuBar ? menuBar.items[pMenuItemId] : null;
    }

}

function setStyle(pStyleNumber)
{
    var ctrlSel = document.template_chooser.TemplateID;
    var form    = document.template_chooser;
    ctrlSel.value = pStyleNumber;
    styleBarChange('Template', ctrlSel);
    // form.submit();
}

function setSISize(pSize)
{
    var ctrlSel = document.photosize_chooser.Size;
    if (document.getElementById("filmstrip") && window.changeSize)
    {
        ctrlSel.value = pSize;
        changeSize(pSize);
    }
    else
    {
        var form = document.photosize_chooser;

        ctrlSel.value = pSize;
        form.submit();
    }
}


function searchSmugmug(pType)
{
    var searchBox = document.getElementById("searchBoxDiv");
    searchBox.style.display = "block";

    var radioBtnU = document.getElementById("searchTypeU");
    var radioBtnG = document.getElementById("searchTypeG");

    radioBtnU.disabled = false;
    radioBtnG.disabled = false;

    if (pType)
    {
        document.getElementById(pType).checked = true;
    }
    else
    {
        radioBtnU.checked = true;
        radioBtnG.checked = false;
        radioBtnG.disabled = true;
        installSuggest();
    }

    var editBox = document.getElementById("searchWords");
    editBox.focus();
}

function installSuggest()
{
    try {
        /* Does not work well...
        InstallAC(document.searchBox,
                  document.searchBox.searchWords,
                  document.searchBox.submitButton,
                  'suggestRPC.mg','en');
        b.style.zIndex = 300;
        document.searchBox.onsubmit = doSearch;
        */
        ; // do nothing instead.
    }
    catch(xcpt) {  }
}

function hideSearch(pSearchDiv)
{
    var strExec = "document.getElementById('"+pSearchDiv.id+"').style.display='none';";
    window.setTimeout(strExec,10);
}

function doSearch(pForm)
{
    pForm = document.searchBox;

    var radioBtnU = document.getElementById("searchTypeU");
    var radioBtnG = document.getElementById("searchTypeG");

    var radioBtn = document.getElementById("searchTypeG");

    var editBox = document.getElementById("searchWords");
    var keywords = editBox.value.replace(/^\s+|\s+$/g, "");
    editBox.value = keywords;

    if (radioBtnG.checked==true)
    {
        if (keywords && keywords.length <= 3)
        {
            alert("Search words must be more than 3 characters long.\n"+
                  "Use longer words or try Google using:\n\n"+
                  "    "+keywords+" site:www.streetsofboston.com");
            return false;
        }

        pForm.action = "http://www.smugmug.com/search/index.mg";
    }
    else if (!radioBtnG.disabled)
    {
        // Using flyingdutchie.smugmug.com uses the co-branding styling.
        // That's nice. However, the class="searchResults" page uses TABLE elements.
        // This gives a terrible lay-out! For now, just use www instead of flyingduchie.

        if (keywords && keywords.length <= 3)
        {
            alert("Search words must be more than 3 characters long.\n"+
                  "Use longer words or try Google using:\n\n"+
                  "    "+keywords+" site:www.streetsofboston.com");
            return false;
        }

        pForm.action = "/search/index.mg";
        //pForm.action = "http://www.smugmug.com/search/index.mg";
    }
    else
    {
        if (keywords && keywords.length <= 3)
        {
            alert("Keywords must be more than 3 characters long.\n"+
                  "Use longer keywords or try Google using:\n\n"+
                  "    allinurl:"+keywords+" site:www.streetsofboston.com");
            return false;
        }
        keywords = keywords.replace(/\s*,\s*/g,"-");
        keywords = escape(keywords);
        pForm.action = "/keyword/"+keywords;
    }

    var searchBox = document.getElementById("searchBoxDiv");
    searchBox.style.display = "none";
    return true;
}

/* End Menu Script */

/* Extra helpers for jsdomenu changes */
function _chainEvent(pElm, pEvtName, pHandler)
{
/*
    if (isIE())
        pElm.attachEvent("on"+pEvtName, pHandler);
    else
        pElm.addEventListener(pEvtName, pHandler, false);
    return;
*/
    
    var oldHandler = pElm["on"+pEvtName];
    var chainFunc = function(e) {
        e = (e ? e : window.event);
	
        var didNotHandle = oldHandler ? oldHandler(e) : true;
        return didNotHandle ? pHandler(e) : didNotHandle;
    };

    pElm["on"+pEvtName] = chainFunc;
}

function stopBubble(e)
{
    if (isIE()) 
        event.cancelBubble = true;
    else 
        e.stopPropagation();
}

function getEventSource(pNSEvent)
{
    if (pNSEvent && isIE())
        return pNSEvent.srcElement;
    else if (pNSEvent)
    {
        var elm = pNSEvent.target;
        if (elm.nodeName == "#text")
            return elm.parentNode;
        else
            return elm;
    }
    else
        return null;
}


/* End extra helpers */

/* Begin jsdomenu.js */
/*

  jsDOMenu Version 1.3.1
  Copyright (C) 2003 - 2005 Toh Zhiqiang
  Released on 12 February 2005
  jsDOMenu is distributed under the terms of the GNU GPL license
  Refer to license.txt for more informatiom

*/

/*
Determine whether the browser is IE5.0.
*/
function isIE50() { // Private method
  return isIE5() && !isIE55();
}

/*
Determine whether the browser is IE5.5.
*/
function isIE55() { // Private method
  return navigator.userAgent.indexOf("MSIE 5.5") > -1;
}

/*
Determine whether the browser is IE5.0 or IE5.5.
*/
function isIE5() { // Private method
  return navigator.userAgent.indexOf("MSIE 5") > -1;
}

/*
Determine whether the browser is IE6.
*/
function isIE6() { // Private method
  return navigator.userAgent.indexOf("MSIE 6") > -1 && navigator.userAgent.indexOf("Opera") == -1;
}

/*
Determine whether the browser is IE.
*/
function isIE() { // Private method
  return isIE5() || isIE6();
}

/*
Determine whether the browser is Opera.
*/
function isOpera() { // Private method
  return navigator.userAgent.indexOf("Opera") > -1;
}

/*
Determine whether the browser is Safari.
*/
function isSafari() { // Private method
  return navigator.userAgent.indexOf("Safari") > -1;
}

/*
Determine the page render mode.

0: Quirks mode.
1: Strict mode.
*/
function getPageMode() { // Private method
  if (document.compatMode) {
    switch (document.compatMode) {
      case "BackCompat":
        return 0;
      case "CSS1Compat":
        return 1;
      case "QuirksMode":
        return 0;
    }
  }
  else {
    if (ie5) {
      return 0;
    }
    if (safari) {
      return 1;
    }
  }
  return 0;
}

/*
Alias for document.getElementById().
*/
function getElmId(id) { // Private method
  return document.getElementById(id);
}

/*
Alias for document.createElement().
*/
function createElm(tagName) { // Private method
  return document.createElement(tagName);
}

/*
Get the x-coordinate of the cursor position relative to the window.
*/
function getX(e) { // Private method
  if (!e) {
    var e = window.event;
  }
  if (safari) {
    return e.clientX - getScrollLeft();
  }
  else {
    return e.clientX;
  }
}

/*
Get the y-coordinate of the cursor position relative to the window.
*/
function getY(e) { // Private method
  if (!e) {
    var e = window.event;
  }
  if (safari) {
    return e.clientY - getScrollTop();
  }
  else {
    return e.clientY;
  }
}

/*
Get the scrollLeft property.
*/
function getScrollLeft() { // Private method
  switch (pageMode) {
    case 0:
      return document.body.scrollLeft;
    case 1:
      if (document.documentElement && document.documentElement.scrollLeft > 0) {
        return document.documentElement.scrollLeft;
      }
      else {
        return document.body.scrollLeft;
      }
  }
}

/*
Get the scrollTop property.
*/
function getScrollTop() { // Private method
  switch (pageMode) {
    case 0:
      return document.body.scrollTop;
    case 1:
      if (document.documentElement && document.documentElement.scrollTop > 0) {
        return document.documentElement.scrollTop;
      }
      else {
        return document.body.scrollTop;
      }
  }
}

/*
Get the clientHeight property.
*/
function getClientHeight() { // Private method
  switch (pageMode) {
    case 0:
      return document.body.clientHeight;
    case 1:
      if (safari) {
        return self.innerHeight;
      }
      else {
        if (!opera && document.documentElement && document.documentElement.clientHeight > 0) {
          return document.documentElement.clientHeight;
        }
        else {
          return document.body.clientHeight;
        }
      }
  }
}

/*
Get the clientWidth property.
*/
function getClientWidth() { // Private method
  switch (pageMode) {
    case 0:
      return document.body.clientWidth;
    case 1:
      if (safari) {
        return self.innerWidth;
      }
      else {
        if (!opera && document.documentElement && document.documentElement.clientWidth > 0) {
          return document.documentElement.clientWidth;
        }
        else {
          return document.body.clientWidth;
        }
      }
  }
}

/*
Convert the string into lower camel case.
*/
function toCamelCase(input) { // Private method
  var inputArray = input.split("-");
  if (inputArray.length == 1) {
    return inputArray[0];
  }
  else {
    var camelCase = inputArray[0];
    for (var i = 1, len = inputArray.length; i < len; i++) {
      camelCase += inputArray[i].charAt(0).toUpperCase() + inputArray[i].substring(1);
    }
    return camelCase;
  }
}

/*
Get the value of the property of the object.
*/
function getPropVal(obj, propertyName) { // Private method
  var propertyValue = obj.style[toCamelCase(propertyName)];
  if (propertyValue) {
    return propertyValue;
  }
  else {
    if (document.defaultView && document.defaultView.getComputedStyle) {
      return document.defaultView.getComputedStyle(obj, null).getPropertyValue(propertyName);
    }
    else {
      if (obj.currentStyle) {
        return obj.currentStyle[toCamelCase(propertyName)];
      }
      else {
        return null;
      }
    }
  }
}

/*
Get the integer value of the property of the object.
*/
function getPropIntVal(obj, propertyName) { // Private method
  return parseInt(getPropVal(obj, propertyName));
}

/*
Get the left position of the pop-up menu.
*/
function getMainMenuLeftPos(menuObj, x) { // Private method
  if (x + menuObj.offsetWidth <= getClientWidth()) {
    return x;
  }
  else {
    return x - menuObj.offsetWidth;
  }
}

/*
Get the top position of the pop-up menu.
*/
function getMainMenuTopPos(menuObj, y) { // Private method
  if (y + menuObj.offsetHeight <= getClientHeight()) {
    return y;
  }
  else {
    return y - menuObj.offsetHeight;
  }
}

/*
Get the left position of the submenu.
*/
function getSubMenuLeftPos(menuObj, x, offset) { // Private method
  if (x + menuObj.offsetWidth - 2 <= getClientWidth()) {
    return x - 2;
  }
  else {
    return x - menuObj.offsetWidth - offset;
  }
}

/*
Get the top position of the submenu.
*/
function getSubMenuTopPos(menuObj, y, offset) { // Private method
  var top = getPropIntVal(menuObj, btw);
  var bottom = getPropIntVal(menuObj, bbw);
  if (y + menuObj.offsetHeight <= getClientHeight()) {
    if (safari) {
      return y - top;
    }
    else {
      return y;
    }
  }
  else {
    if (safari) {
      return y - menuObj.offsetHeight + offset + bottom;
    }
    else {
      return y - menuObj.offsetHeight + offset + top + bottom;
    }
  }
}

/*
Pop up the submenu.
*/
function popUpSubMenu(menuItemObj) { // Private method
  var parentMenuObj = menuItemObj.parent.menuObj;
  var menuObj = menuItemObj.subMenu.menuObj;
  var x;
  var y;
  if (parentMenuObj.style.position == "fixed") {
    x = parentMenuObj.offsetLeft + parentMenuObj.offsetWidth - getPropIntVal(parentMenuObj, brw);
    y = parentMenuObj.offsetTop + menuItemObj.offsetTop + getPropIntVal(parentMenuObj, btw) - getPropIntVal(menuObj, btw);
    menuObj.style.position = "absolute";
    menuObj.style.left = getSubMenuLeftPos(menuObj, x, menuItemObj.offsetWidth) + px;
    menuObj.style.top = getSubMenuTopPos(menuObj, y, menuItemObj.offsetHeight) + px;
    menuObj.style.position = "fixed";
  }
  else {
    if (parentMenuObj.mode == "static" && !ie50) {
      x = menuItemObj.offsetLeft + parentMenuObj.offsetWidth - getPropIntVal(parentMenuObj, blw) - getPropIntVal(parentMenuObj, brw) - getScrollLeft();
      y = menuItemObj.offsetTop - getPropIntVal(menuObj, btw) - getScrollTop();
      if (ie55 || ie6) {
          x += getPropIntVal(parentMenuObj, blw);
          y += getPropIntVal(parentMenuObj, btw);
      }
      if (safari) {
        x += 8;
        y += getPropIntVal(menuObj, btw) + 13;
      }
      menuObj.style.left = (getSubMenuLeftPos(menuObj, x, menuItemObj.offsetWidth) + getScrollLeft()) + px;
      menuObj.style.top = (getSubMenuTopPos(menuObj, y, menuItemObj.offsetHeight) + getScrollTop()) + px;
    }
    else {
      x = parentMenuObj.offsetLeft + parentMenuObj.offsetWidth - getPropIntVal(parentMenuObj, brw) - getScrollLeft();
      y = parentMenuObj.offsetTop + menuItemObj.offsetTop + getPropIntVal(parentMenuObj, btw) - getPropIntVal(menuObj, btw) - getScrollTop();
      menuObj.style.left = (getSubMenuLeftPos(menuObj, x, menuItemObj.offsetWidth) + getScrollLeft()) + px;
      menuObj.style.top = (getSubMenuTopPos(menuObj, y, menuItemObj.offsetHeight) + getScrollTop()) + px;
    }
  }
  if (ie && menuObj.mode == "fixed") {
    menuObj.initialLeft = parseInt(menuObj.style.left) - getScrollLeft();
    menuObj.initialTop = parseInt(menuObj.style.top) - getScrollTop();
  }
  menuObj.style.visibility = "visible";
}

/*
Pop up the main menu.
*/
function popUpMainMenu(menuObj, e) { // Private method
  menuObj.style.left = (getMainMenuLeftPos(menuObj, getX(e)) + getScrollLeft()) + px;
  menuObj.style.top = (getMainMenuTopPos(menuObj, getY(e)) + getScrollTop()) + px;
  var display = popUpMenuObj.menuObj.style.display;
  //popUpMenuObj.menuObj.style.display = "none";
  popUpMenuObj.menuObj.style.visibility = "visible";
  popUpMenuObj.menuObj.style.display = display;
}

/*
Refresh the menu items.
*/
function refreshMenuItems(menuObj) { // Private method
  for (var i = 0, len = menuObj.childNodes.length; i < len; i++) {
    if (menuObj.childNodes[i].enabled) {
      menuObj.childNodes[i].className = menuObj.childNodes[i].itemClassName;
      if (menuObj.childNodes[i].subMenu) {
        menuObj.childNodes[i].arrowObj.className = menuObj.childNodes[i].arrowClassName;
      }
      if (menuObj.childNodes[i].iconObj) {
        menuObj.childNodes[i].iconObj.className = menuObj.childNodes[i].iconClassName;
      }
    }
  }
}

/*
Event handler that handles onmouseover event of the menu item.
*/
function menuItemOver(e) { // Private method
  var previousItem = this.parent.previousItem;
  if (previousItem) {
    if (previousItem.className == previousItem.itemClassNameOver) {
      previousItem.className = previousItem.itemClassName;
    }
    if (previousItem.subMenu) {
      previousItem.className = previousItem.itemClassName;
      previousItem.arrowObj.className = previousItem.arrowClassName;
      if (previousItem.iconObj) {
        previousItem.iconObj.className = previousItem.iconClassName;
      }
    }
    var menuObj = getElmId(this.parent.menuObj.id);
    for (var i = 0, len = menuObj.childNodes.length; i < len; i++) {
      if (menuObj.childNodes[i].enabled && menuObj.childNodes[i].subMenu) {
        hideMenus(menuObj.childNodes[i].subMenu.menuObj);
      }
    }
  }
  if (this.enabled) {
    this.className = this.itemClassNameOver;
    if (this.subMenu) {
      this.arrowObj.className = this.arrowClassNameOver;
      popUpSubMenu(this);
    }
    if (this.iconObj && this.iconClassNameOver) {
      this.iconObj.className = this.iconClassNameOver;
    }
  }
  this.parent.previousItem = this;
}

/*
Event handler that handles onclick event of the menu item.
*/
function menuItemClick(e) { // Private method
  if (this.enabled && this.actionOnClick) {
    var action = this.actionOnClick;
    if (action.indexOf("link:") == 0) {
      location.href = action.substr(5);
    }
    else {
      if (action.indexOf("code:") == 0) {
        eval(action.substr(5));
      }
      else {
        location.href = action;
      }
    }
  }

  if (!e) {
    var e = window.event;
    e.cancelBubble = true;
  }
  if (e.stopPropagation) {
    e.stopPropagation();
  }

  if (!this.enabled) /* MY CHANGES */
  {
    return false;
  } /* END MY CHANGES */

  if (this.parent.menuObj.mode == "cursor") {
    hideCursorMenus();
  }
  if (this.parent.menuObj.mode == "absolute" || this.parent.menuObj.mode == "fixed") {
    hideVisibleMenus();
    if (typeof(hideMenuBarMenus) == "function") {
      hideMenuBarMenus();
    }
  }
}

/*
Event handler that handles onmouseout event of the menu item.
*/
function menuItemOut() { // Private method
  if (this.enabled) {
    if (!(this.subMenu && this.subMenu.menuObj.style.visibility == "visible")) {
      this.className = this.itemClassName;
    }
    if (this.subMenu) {
      if (this.subMenu.menuObj.style.visibility == "visible") {
        this.arrowObj.className = this.arrowClassNameOver;
        if (this.iconObj) {
          this.iconObj.className = this.iconClassNameOver;
        }
      }
    }
    else {
      if (this.iconObj) {
        this.iconObj.className = this.iconClassName;
      }
    }
  }
}

/*
Determine whether any of the tag name/tag id pair in the filter matches the tagName/tagId pair.
*/
function findMatch(tagName, tagId, filter) { // Private method
  for (var i = 0, len = filter.length; i < len; i++) {
    var filterArray = filter[i].toLowerCase().split(".");
    if ((filterArray[0] == "*" && filterArray[1] == "*") ||
        (filterArray[0] == "*" && filterArray[1] == tagId) ||
        (filterArray[0] == tagName && filterArray[1] == "*") ||
        (filterArray[0] == tagName && filterArray[1] == tagId)) {
      return true;
    }
  }
  return false;
}

/*
Determine whether to show or hide the menu.
*/
function canShowMenu(tagName, tagId, allExcept, noneExcept) { // Private method
  if (allExcept.length > 0) {
    return (!findMatch(tagName.toLowerCase(), tagId.toLowerCase(), allExcept));
  }
  else {
    if (noneExcept.length > 0) {
      return findMatch(tagName.toLowerCase(), tagId.toLowerCase(), noneExcept);
    }
    else {
      return true;
    }
  }
}

/*
Shows/Hides the pop-up menu.
*/
function activatePopUpMenu(e) { // Private method
  if (!popUpMenuObj) {
    return false;
  }
  var state = popUpMenuObj.menuObj.style.visibility;
  if (state == "visible") {
    for (var i = 1; i <= menuCount; i++) {
      var menuObj = getElmId("DOMenu" + i);
      if (menuObj.mode == "cursor") {
        menuObj.style.visibility = "hidden";
        menuObj.style.left = "0px";
        menuObj.style.top = "0px";
        menuObj.initialLeft = 0;
        menuObj.initialTop = 0;
        refreshMenuItems(menuObj);
      }
    }
  }
  else {
    if (!e) {
      var e = window.event;
    }
    var targetElm = (e.target) ? e.target : e.srcElement;
    if (targetElm.nodeType == 3) {
      targetElm = targetElm.parentNode;
    }

    while (targetElm) //!!
    {                 //!!
      try { //!!
        if (canShowMenu(targetElm.tagName, targetElm.id, popUpMenuObj.menuObj.allExceptFilter, popUpMenuObj.menuObj.noneExceptFilter)) {
          popUpMainMenu(popUpMenuObj.menuObj, e);
          return true;
        }
        targetElm = targetElm.parentNode; //!!
      } catch(xcpt) { targetElm = null; } //!!
    }
  }
  return false;
}

/*
Event handler that handles left click event.
*/
function leftClickHandler(e) { // Private method
  if (getX(e) > getClientWidth() || getY(e) > getClientHeight()) {
    return;
  }
  if (!e) {
    var e = window.event;
  }
  if (e.button && e.button == 2) {
    return;
  }
  hideVisibleMenus();
  if (typeof(hideMenuBarMenus) == "function") {
    hideMenuBarMenus();
  }
  if (popUpMenuObj) {
    var state = popUpMenuObj.menuObj.style.visibility;
    if (state == "visible" && (hideValue == 0 || hideValue == 2)) {
      activatePopUpMenu(e);
    }
    if ((state == "hidden" || state == "") && (showValue == 0 || showValue == 2)) {
      activatePopUpMenu(e);
    }
  }
}

/*
Event handler that handles right click event.
*/
function rightClickHandler(e) { // Private method
  if (getX(e) > getClientWidth() || getY(e) > getClientHeight()) {
    return true;
  }
  hideVisibleMenus();
  if (typeof(hideMenuBarMenus) == "function") {
    hideMenuBarMenus();
  }
  if (popUpMenuObj) {
    var state = popUpMenuObj.menuObj.style.visibility;
    if (state == "visible" && (hideValue == 1 || hideValue == 2)) {
      activatePopUpMenu(e);
      return false;
    }
    if ((state == "hidden" || state == "") && (showValue == 1 || showValue == 2)) {
      if (activatePopUpMenu(e))
        return false;
    }
  }
  return true;
}

/*
Event handler that handles scroll event.
*/
function scrollHandler() { // Private method
  for (var i = 1; i <= menuCount; i++) {
      var menuObj = getElmId("DOMenu" + i);
      if (ie && menuObj.mode == "fixed") {
        menuObj.style.left = (menuObj.initialLeft + getScrollLeft()) + px;
        menuObj.style.top = (menuObj.initialTop + getScrollTop()) + px;
      }
  }
  if (typeof(menuBarScrollHandler) == "function") {
    menuBarScrollHandler();
  }
}

/*
Show the icon before the display text.
Arguments:
className          : Required. String that specifies the CSS class selector for the icon.
classNameOver      : Optional. String that specifies the CSS class selector for the icon when
                     the cursor is over the menu item.
*/
function showMenuItemIcon() { // Public method
  var iconElm = createElm("span");
  iconElm.id = this.id + "Icon";
  iconElm.className = arguments[0];
  this.insertBefore(iconElm, this.firstChild);
  var height;
  if (ie) {
    height = getPropIntVal(iconElm, "height");
  }
  else {
    height = iconElm.offsetHeight;
  }
  iconElm.style.top = Math.floor((this.offsetHeight - height) / 2) + px;
  if (ie) {
    var left = getPropIntVal(iconElm, "left");
    if (ie55 || ie6) {
      iconElm.style.left = (left - getPropIntVal(this, "padding-left")) + px;
    }
    else {
      iconElm.style.left = left + px;
    }
  }
  this.iconClassName = iconElm.className;
  if (arguments.length > 1 && arguments[1].length > 0) {
    this.iconClassNameOver = arguments[1];
  }
  this.iconObj = iconElm;
  this.setIconClassName = function(className) { // Public method
    this.iconClassName = className;
    this.iconObj.className = this.iconClassName;
  };
  this.setIconClassNameOver = function(classNameOver) { // Public method
    this.iconClassNameOver = classNameOver;
  };
}

/*
Set the menu object that will show up when the cursor is over the menu item object.
Argument:
menuObj            : Required. Menu object that will show up when the cursor is over the
                     menu item object.
*/
function setSubMenu(menuObj) { // Public method
  var arrowElm = createElm("div");
  arrowElm.id = this.id + "Arrow";
  arrowElm.className = this.arrowClassName;
  this.appendChild(arrowElm);
  var height;
  if (ie) {
    height = getPropIntVal(arrowElm, "height");
  }
  else {
    height = arrowElm.offsetHeight;
  }
  arrowElm.style.top = Math.floor((this.offsetHeight - height) / 2) + px;
  this.subMenu = menuObj;
  this.arrowObj = arrowElm;
  this.setArrowClassName = function(className) { // Public method
    this.arrowClassName = className;
    this.arrowObj.className = this.arrowClassName;
  };
  this.setArrowClassNameOver = function(classNameOver) { // Public method
    this.arrowClassNameOver = classNameOver;
  };
  menuObj.menuObj.style.zIndex = this.parent.menuObj.level + 1;
  menuObj.menuObj.level = this.parent.menuObj.level + 1;
}

/*
Add a new menu item to the menu.
Argument:
menuItemObj        : Required. Menu item object that is going to be added to the menu object.
*/
function addMenuItem(menuItemObj) { // Public method
  if (menuItemObj.displayText == "-") {
    var hrElm = createElm("hr");
    var itemElm = createElm("div");
    itemElm.appendChild(hrElm);
    itemElm.id = menuItemObj.id;
    if (menuItemObj.className.length > 0) {
      itemElm.sepClassName = menuItemObj.className;
    }
    else {
      itemElm.sepClassName = menuItemObj.sepClassName;
    }
    itemElm.className = itemElm.sepClassName;
    this.menuObj.appendChild(itemElm);
    itemElm.parent = this;
    itemElm.setClassName = function(className) { // Public method
      this.sepClassName = className;
      this.className = this.sepClassName;
    };
    itemElm.onclick = function(e) { // Private method
      if (!e) {
        var e = window.event;
        e.cancelBubble = true;
      }
      if (e.stopPropagation) {
        e.stopPropagation();
      }
    };
    itemElm.onmouseover = menuItemOver;
    if (menuItemObj.itemName.length > 0) {
      this.items[menuItemObj.itemName] = itemElm;
    }
    else {
      this.items[this.items.length] = itemElm;
    }
  }
  else {
    var itemElm = createElm("div");
    itemElm.id = menuItemObj.id;
    itemElm.actionOnClick = menuItemObj.actionOnClick;
    itemElm.enabled = menuItemObj.enabled;
    itemElm.itemClassName = menuItemObj.className+(itemElm.enabled?"":" jsdoitemdisabled");
    itemElm.itemClassNameOver = menuItemObj.classNameOver;
    itemElm.className = itemElm.itemClassName;
    itemElm.subMenu = null;
    itemElm.arrowClassName = arrowClassName;
    itemElm.arrowClassNameOver = arrowClassNameOver;
    var textNode = document.createTextNode(menuItemObj.displayText);
    itemElm.appendChild(textNode);
    this.menuObj.appendChild(itemElm);
    itemElm.parent = this;
    itemElm.setClassName = function(className) { // Public method
      this.itemClassName = className;
      this.className = this.itemClassName;
    };
    itemElm.setClassNameOver = function(classNameOver) { // Public method
      this.itemClassNameOver = classNameOver;
    };
    itemElm.setDisplayText = function(text) { // Public method
      if (this.childNodes[0].nodeType == 3) {
        this.childNodes[0].nodeValue = text;
      }
      else {
        this.childNodes[1].nodeValue = text;
      }
    };
    itemElm.getDisplayText = function() { // Public method
      if (this.childNodes[0].nodeType == 3) {
        return this.childNodes[0].nodeValue;
      }
      else {
        return this.childNodes[1].nodeValue;
      }
    };
    itemElm.setSubMenu = setSubMenu;
    itemElm.showIcon = showMenuItemIcon;
    itemElm.onmouseover = menuItemOver;
    itemElm.onclick = menuItemClick;
    itemElm.onmouseout = menuItemOut;
    if (menuItemObj.itemName.length > 0) {
      this.items[menuItemObj.itemName] = itemElm;
    }
    else {
      this.items[this.items.length] = itemElm;
    }
  }
}

/*
Create a new menu item object.
Arguments:
displayText        : Required. String that specifies the text to be displayed on the menu item. If
                     displayText = "-", a menu separator will be created instead.
itemName           : Optional. String that specifies the name of the menu item. Defaults to "" (no
                     name).
actionOnClick      : Optional. String that specifies the action to be done when the menu item is
                     being clicked. Defaults to "" (no action).
enabled            : Optional. Boolean that specifies whether the menu item is enabled/disabled.
                     Defaults to true.
className          : Optional. String that specifies the CSS class selector for the menu item.
                     Defaults to "jsdomenuitem".
classNameOver      : Optional. String that specifies the CSS class selector for the menu item when
                     the cursor is over it. Defaults to "jsdomenuitemover".
*/
function menuItem() { // Public method
  this.displayText = arguments[0];
  if (this.displayText == "-") {
    this.id = "menuSep" + (++sepCount);
    this.className = sepClassName;
  }
  else {
    this.id = "menuItem" + (++menuItemCount);
    this.className = menuItemClassName;
  }
  this.itemName = "";
  this.actionOnClick = "";
  this.enabled = true;
  this.classNameOver = menuItemClassNameOver;
  this.sepClassName = sepClassName;
  var len = arguments.length;
  if (len > 1 && arguments[1].length > 0) {
    this.itemName = arguments[1];
  }
  if (len > 2 && arguments[2].length > 0) {
    this.actionOnClick = arguments[2];
  }
  if (len > 3 && typeof(arguments[3]) == "boolean") {
    this.enabled = arguments[3];
  }
  if (len > 4 && arguments[4].length > 0) {
    if (arguments[4] == "-") {
      this.className = arguments[4];
      this.sepClassName = arguments[4];
    }
    else {
      this.className = arguments[4];
    }
  }
  if (len > 5 && arguments[5].length > 0) {
    this.classNameOver = arguments[5];
  }
}

/*
Create a new menu object.
Arguments:
width              : Required. Integer that specifies the width of the menu.
mode               : Optional. String that specifies the mode of the menu. Defaults to "cursor".
id                 : Optional, except when mode = "static". String that specifies the id of
                     the element that will contain the menu. This argument is required when
                     mode = "static".
alwaysVisible      : Optional. Boolean that specifies whether the menu is always visible. Defaults
                     to false.
className          : Optional. String that specifies the CSS class selector for the menu. Defaults
                     to "jsdomenudiv".
*/
function jsDOMenu() { // Public method
  this.items = new Array();
  var menuElm;
  var len = arguments.length;
  if (len > 2 && arguments[2].length > 0 && arguments[1] == "static") {
    menuElm = getElmId(arguments[2]);
    if (!menuElm) {
      return;
    }
    staticMenuId[staticMenuId.length] = arguments[2];
  }
  else {
    menuElm = createElm("div");
    menuElm.id = "DOMenu" + (++menuCount);
  }
  menuElm.level = 10;
  menuElm.previousItem = null;
  menuElm.allExceptFilter = allExceptFilter;
  menuElm.noneExceptFilter = noneExceptFilter;
  menuElm.className = menuClassName;
  menuElm.mode = menuMode;
  menuElm.alwaysVisible = false;
  menuElm.initialLeft = 0;
  menuElm.initialTop = 0;
  if (len > 1 && arguments[1].length > 0) {
    switch (arguments[1]) {
      case "cursor":
        menuElm.style.position = "absolute";
        menuMode.mode = "cursor";
        break;
      case "absolute":
        menuElm.style.position = "absolute";
        menuElm.mode = "absolute";
        break;
      case "fixed":
        if (ie) {
          menuElm.style.position = "absolute";
        }
        else {
          menuElm.style.position = "fixed";
        }
        menuElm.mode = "fixed";
        break;
      case "static":
        menuElm.style.position = "static";
        menuElm.mode = "static";
        break;
    }
  }
  if (len > 3 && typeof(arguments[3]) == "boolean") {
    menuElm.alwaysVisible = arguments[3];
  }
  if (len > 4 && arguments[4].length > 0) {
    menuElm.className = arguments[4];
  }
  menuElm.style.width = arguments[0] + px;
  menuElm.style.left = "0px";
  menuElm.style.top = "0px";
  if (menuElm.mode != "static") {
    document.body.appendChild(menuElm);
  }
  if (!getPropVal(menuElm, blw)) {
    menuElm.style.borderWidth = menuBorderWidth + px;
  }
  this.menuObj = menuElm;
  this.addMenuItem = addMenuItem;
  this.setClassName = function(className) { // Public method
    this.menuObj.className = className;
  };
  this.setMode = function(mode) { // Public method
    switch (mode) {
      case "cursor":
        this.menuObj.style.position = "absolute";
        this.menuObj.mode = "cursor";
        break;
      case "absolute":
        this.menuObj.style.position = "absolute";
        this.menuObj.mode = "absolute";
        this.menuObj.initialLeft = parseInt(this.menuObj.style.left);
        this.menuObj.initialTop = parseInt(this.menuObj.style.top);
        break;
      case "fixed":
        if (ie) {
          this.menuObj.style.position = "absolute";
          this.menuObj.initialLeft = parseInt(this.menuObj.style.left);
          this.menuObj.initialTop = parseInt(this.menuObj.style.top);
        }
        else {
          this.menuObj.style.position = "fixed";
        }
        this.menuObj.mode = "fixed";
        break;
    }
  };
  this.setAlwaysVisible = function(alwaysVisible) { // Public method
    if (typeof(alwaysVisible) == "boolean") {
      this.menuObj.alwaysVisible = alwaysVisible;
    }
  };
  this.show = function() { // Public method
    this.menuObj.style.visibility = "visible";
  };
  this.hide = function() { // Public method
    this.menuObj.style.visibility = "hidden";
    if (this.menuObj.mode == "cursor") {
      this.menuObj.style.left = "0px";
      this.menuObj.style.top = "0px";
      this.menuObj.initialLeft = 0;
      this.menuObj.initialTop = 0;
    }
  };
  this.setX = function(x) { // Public method
    this.menuObj.initialLeft = x;
    this.menuObj.style.left = x + px;
  };
  this.setY = function(y) { // Public method
    this.menuObj.initialTop = y;
    this.menuObj.style.top = y + px;
  };
  this.moveTo = function(x, y) { // Public method
    this.menuObj.initialLeft = x;
    this.menuObj.initialTop = y;
    this.menuObj.style.left = x + px;
    this.menuObj.style.top = y + px;
  };
  this.moveBy = function(x, y) { // Public method
    var left = parseInt(this.menuObj.style.left);
    var top = parseInt(this.menuObj.style.top);
    this.menuObj.initialLeft = left + x;
    this.menuObj.initialTop = top + y;
    this.menuObj.style.left = (left + x) + px;
    this.menuObj.style.top = (top + y) + px;
  };
  this.setAllExceptFilter = function(filter) { // Public method
    this.menuObj.allExceptFilter = filter;
    this.menuObj.noneExceptFilter = new Array();
  };
  this.setNoneExceptFilter = function(filter) { // Public method
    this.menuObj.noneExceptFilter = filter;
    this.menuObj.allExceptFilter = new Array();
  };
  this.setBorderWidth = function(width) { // Public method
    this.menuObj.style.borderWidth = width + px;
  };
}

/*
Specifies how the pop-up menu shows/hide.
Arguments:
showValue          : Required. Integer that specifies how the menu shows.
hideValue          : Optional. Integer that specifies how the menu hides. If not specified, the
                     menu shows/hides in the same manner.

0: Shows/Hides the menu by left click only.
1: Shows/Hides the menu by right click only.
2: Shows/Hides the menu by left or right click.
*/
function activatePopUpMenuBy() { // Public method
  showValue = typeof(arguments[0]) == "number" && arguments[0] > -1 ? arguments[0] : 0;
  if (arguments.length > 1) {
    hideValue = typeof(arguments[1]) == "number" && arguments[1] > -1 ? arguments[1] : 0;
  }
  else {
    hideValue = showValue;
  }
  if (showValue == 1 || showValue == 2 || hideValue == 1 || hideValue == 2) {
    //??document.oncontextmenu = rightClickHandler;
    _chainEvent(document, "contextmenu", rightClickHandler); //!!
  }
}

/*
Hide all menus, except those with alwaysVisible = true.
*/
function hideAllMenus() { // Public method
  for (var i = 1; i <= menuCount; i++) {
    var menuObj = getElmId("DOMenu" + i);
    if (!menuObj.alwaysVisible) {
      if (menuObj.style.position == "fixed") {
        menuObj.style.position == "absolute";
        menuObj.style.visibility = "hidden";
        menuObj.style.position == "fixed";
      }
      else {
        menuObj.style.visibility = "hidden";
        if (menuObj.mode == "cursor") {
          menuObj.style.left = "0px";
          menuObj.style.top = "0px";
          menuObj.initialLeft = 0;
          menuObj.initialTop = 0;
        }
      }
    }
    refreshMenuItems(menuObj);
  }
  for (var i = 0, len = staticMenuId.length; i < len; i++) {
    refreshMenuItems(getElmId(staticMenuId[i]));
  }
}

/*
Hide all menus with mode = "cursor", except those with alwaysVisible = true.
*/
function hideCursorMenus() { // Public method
  for (var i = 1; i <= menuCount; i++) {
    var menuObj = getElmId("DOMenu" + i);
    if (menuObj.mode == "cursor" && !menuObj.alwaysVisible) {
      menuObj.style.visibility = "hidden";
      menuObj.style.left = "0px";
      menuObj.style.top = "0px";
      menuObj.initialLeft = 0;
      menuObj.initialTop = 0;
    }
    if (menuObj.mode == "cursor") {
      refreshMenuItems(menuObj);
    }
  }
}

/*
Hide all menus with mode = "absolute" or mode = "fixed" or mode = "static", except those with
alwaysVisible = true.
*/
function hideVisibleMenus() { // Public method
  for (var i = 1; i <= menuCount; i++) {
    var menuObj = getElmId("DOMenu" + i);
    if ((menuObj.mode == "absolute" || menuObj.mode == "fixed") && !menuObj.alwaysVisible) {
      if (menuObj.style.position == "fixed") {
        menuObj.style.position = "absolute";
        menuObj.style.visibility = "hidden";
        menuObj.style.position = "fixed";
      }
      else {
        menuObj.style.visibility = "hidden";
        menuObj.style.left = "0px";
        menuObj.style.top = "0px";
        menuObj.initialLeft = 0;
        menuObj.initialTop = 0;
      }
    }
    if (menuObj.mode == "absolute" || menuObj.mode == "fixed") {
      refreshMenuItems(menuObj);
    }
  }
  for (var i = 0, len = staticMenuId.length; i < len; i++) {
    refreshMenuItems(getElmId(staticMenuId[i]));
  }
  if (typeof(staticMenuBarId) == "object") {
    for (var i = 0, len = staticMenuBarId.length; i < len; i++) {
      refreshMenuBarItems(getElmId(staticMenuBarId[i]));
    }
  }
}

/*
Hide the menu and all its submenus.
Argument:
menuObj            : Required. Menu object that specifies the menu and all its submenus to
                     be hidden.
*/
function hideMenus(menuObj) { // Public method
  refreshMenuItems(menuObj);
  for (var i = 0, len = menuObj.childNodes.length; i < len; i++) {
    if (menuObj.childNodes[i].enabled && menuObj.childNodes[i].subMenu) {
      hideMenus(menuObj.childNodes[i].subMenu.menuObj);
    }
  }
  if (menuObj.style.position == "fixed") {
    menuObj.style.position = "absolute";
    menuObj.style.visibility = "hidden";
    menuObj.style.position = "fixed";
  }
  else {
    menuObj.style.visibility = "hidden";
    menuObj.style.left = "0px";
    menuObj.style.top = "0px";
    menuObj.initialLeft = 0;
    menuObj.initialTop = 0;
  }
}

/*
Set the menu object to be the pop-up menu.
Argument:
menuObj            : Required. Menu object that specifies the pop-up menu.
*/
function setPopUpMenu(menuObj) { // Public method
  popUpMenuObj = menuObj;
}

/*
Check browser compatibility and create the menus.
*/
function initjsDOMenu() { // Public method
  if (document.createElement && document.getElementById) {
    var loadingElm = document.getElementById("loading_menu");
    if (loadingElm) {
        loadingElm.parentNode.removeChild(loadingElm);
    }
    createjsDOMenu();
  }
}

if (typeof(allExceptFilter) == "undefined") {
  var allExceptFilter = new Array("A.*",
                                  "BUTTON.*",
                                  "IMG.*",
                                  "INPUT.*",
                                  "OBJECT.*",
                                  "OPTION.*",
                                  "SELECT.*",
                                  "TEXTAREA.*"); // Public field
}

if (typeof(noneExceptFilter) == "undefined") {
  var noneExceptFilter = new Array(); // Public field
}

if (typeof(menuClassName) == "undefined") {
  var menuClassName = "jsdomenudiv"; // Public field
}

if (typeof(menuItemClassName) == "undefined") {
  var menuItemClassName = "jsdomenuitem"; // Public field
}

if (typeof(menuItemClassNameOver) == "undefined") {
  var menuItemClassNameOver = "jsdomenuitemover"; // Public field
}

if (typeof(sepClassName) == "undefined") {
  var sepClassName = "jsdomenusep"; // Public field
}

if (typeof(arrowClassName) == "undefined") {
  var arrowClassName = "jsdomenuarrow"; // Public field
}

if (typeof(arrowClassNameOver) == "undefined") {
  var arrowClassNameOver = "jsdomenuarrowover"; // Public field
}

if (typeof(menuMode == "undefined")) {
  var menuMode = "cursor"; // Public field
}

if (typeof(menuBorderWidth) == "undefined") {
  var menuBorderWidth = 2; // Public field
}

var ie50 = isIE50(); // Private field
var ie55 = isIE55(); // Private field
var ie5 = isIE5(); // Private field
var ie6 = isIE6(); // Private field
var ie = isIE(); // Private field
var opera = isOpera(); // Private field
var safari = isSafari(); // Private field
var pageMode = getPageMode(); // Private field
var px = "px"; // Private field
var btw = "border-top-width"; // Private field
var bbw = "border-bottom-width"; // Private field
var blw = "border-left-width"; // Private field
var brw = "border-right-width"; // Private field
var menuCount = 0; // Private field
var menuItemCount = 0; // Private field
var sepCount = 0; // Private field
var popUpMenuObj = null; // Private field
var showValue = 0; // Private field
var hideValue = 0; // Private field
var staticMenuId = new Array(); // Private field
document.onclick = leftClickHandler;
window.onscroll = scrollHandler;
/* End jsdomenu.js */

/* Begin jsdomenubar.js */
/*

  jsDOMenuBar Version 1.1.1
  Copyright (C) 2004 - 2005 Toh Zhiqiang
  Released on 12 February 2005
  jsDOMenuBar is distributed under the terms of the GNU GPL license
  Refer to license.txt for more informatiom

*/

/*
Get the left position of the menu bar menu.
*/
function getMainMenuBarMenuLeftPos(menuBarObj, menuBarItemObj, menuObj, x) { // Private method
  if (x + menuObj.offsetWidth <= getClientWidth()) {
    return x;
  }
  else {
    return x + menuBarItemObj.offsetWidth - menuObj.offsetWidth + getPropIntVal(menuObj, blw) + getPropIntVal(menuObj, brw);
  }
}

/*
Get the top position of the menu bar menu.
*/
function getMainMenuBarMenuTopPos(menuBarObj, menuBarItemObj, menuObj, y) { // Private method
  if (y + menuObj.offsetHeight <= getClientHeight()) {
    return y;
  }
  else {
    if ((ie55 || ie6) && menuBarObj.mode == "static" && pageMode == 0) {
      y = menuBarObj.offsetTop + menuBarObj.offsetHeight - getScrollTop();
    }
    if ((ie55 || ie6) && menuBarObj.mode == "static" && pageMode == 1) {
      return menuBarItemObj.offsetTop
           - menuObj.offsetHeight
           - getPropIntVal(menuBarObj, pt)
           + getPropIntVal(menuBarItemObj, pt)
           + getPropIntVal(menuBarItemObj, btw)
           - getScrollTop();
    }
    else {
      return y - menuObj.offsetHeight - menuBarObj.offsetHeight;
    }
  }
}

/*
Pop up the menu bar menu.
*/
function popUpMenuBarMenu(menuBarObj, menuBarItemObj, menuObj) { // Private method
  var x;
  var y;
  if (menuBarObj.style.position == "fixed") {
    x = menuBarObj.offsetLeft + menuBarItemObj.offsetLeft + getPropIntVal(menuBarObj, blw) - getPropIntVal(menuObj, blw);
    y = menuBarObj.offsetTop + menuBarObj.offsetHeight;
    if (opera || safari) {
      x -= getPropIntVal(menuBarObj, blw);
    }
    menuObj.style.position = "absolute";
    menuObj.style.left = getMainMenuBarMenuLeftPos(menuBarObj, menuBarItemObj, menuObj, x) + px;
    menuObj.style.top = getMainMenuBarMenuTopPos(menuBarObj, menuBarItemObj, menuObj, y) + px;
    menuObj.style.position = "fixed";
  }
  else {
    if (menuBarObj.mode == "static") {
      x = menuBarItemObj.offsetLeft - getPropIntVal(menuObj, blw) - getScrollLeft();
      y = menuBarObj.offsetTop + menuBarObj.offsetHeight - getScrollTop();
      if (ie55 || ie6) {
        x += getPropIntVal(menuBarObj, blw);
        y = menuBarItemObj.offsetTop + menuBarItemObj.offsetHeight
          + getPropIntVal(menuBarObj, bbw)
          + getPropIntVal(menuBarObj, pb)
          - getPropIntVal(menuBarItemObj, bbw)
          - getScrollTop();
      }
      if (safari) {
        x += 8;
        y += 13;
      }
      menuObj.style.left = (getMainMenuBarMenuLeftPos(menuBarObj, menuBarItemObj, menuObj, x) + getScrollLeft()) + px;
      menuObj.style.top = (getMainMenuBarMenuTopPos(menuBarObj, menuBarItemObj, menuObj, y) + getScrollTop()) + px;
    }
    else {
      x = menuBarObj.offsetLeft + menuBarItemObj.offsetLeft + getPropIntVal(menuBarObj, blw) - getPropIntVal(menuObj, blw) - getScrollLeft();
      y = menuBarObj.offsetTop + menuBarObj.offsetHeight - getScrollTop();
      if (opera || safari) {
        x -= getPropIntVal(menuBarObj, blw);
      }
      menuObj.style.left = (getMainMenuBarMenuLeftPos(menuBarObj, menuBarItemObj, menuObj, x) + getScrollLeft()) + px;
      menuObj.style.top = (getMainMenuBarMenuTopPos(menuBarObj, menuBarItemObj, menuObj, y) + getScrollTop()) + px;
    }
  }
  if (ie && menuObj.mode == "fixed") {
    menuObj.initialLeft = parseInt(menuObj.style.left) - getScrollLeft();
    menuObj.initialTop = parseInt(menuObj.style.top) - getScrollTop();
  }
  menuObj.style.visibility = "visible";
}

/*
Refresh the menu bar items.
*/
function refreshMenuBarItems(menuBarObj) { // Private method
  for (var i = 0, len = menuBarObj.childNodes.length; i < len; i++) {
    if (menuBarObj.childNodes[i].enabled && menuBarObj.childNodes[i].clicked) {
      menuBarObj.childNodes[i].className = menuBarObj.childNodes[i].itemClassName;
      if (menuBarObj.childNodes[i].iconObj) {
        menuBarObj.childNodes[i].iconObj.className = menuBarObj.childNodes[i].iconClassName;
      }
      menuBarObj.childNodes[i].clicked = false;
      if (menuBarObj.childNodes[i].menu) {
        hideMenus(menuBarObj.childNodes[i].menu.menuObj);
      }
      break;
    }
  }
  menuBarObj.activated = false;
}

/*!! Belated menu-bar-item click !!*/
var g_belatedElm = null;
function belatedClick()
{
    if (!window.g_belatedElm)
        return;

    g_belatedElm.onclick(null);
    g_belatedElm = null;
}
/*!!  !!*/

/*
Event handler that handles onmouseover event of the menu bar item.
*/
function menuBarItemOver(e) { // Private method
  if (this.parent.menuBarObj.activated) {
    if (!this.clicked) {
      var menuBarObj = this.parent.menuBarObj;
      for (var i = 0, len = menuBarObj.childNodes.length; i < len; i++) {
        if (menuBarObj.childNodes[i].enabled && menuBarObj.childNodes[i].clicked) {
          menuBarObj.childNodes[i].className = menuBarObj.childNodes[i].itemClassName;
          if (menuBarObj.childNodes[i].iconObj) {
            menuBarObj.childNodes[i].iconObj.className = menuBarObj.childNodes[i].iconClassName;
          }
          menuBarObj.childNodes[i].clicked = false;
          if (menuBarObj.childNodes[i].menu) {
            hideMenus(menuBarObj.childNodes[i].menu.menuObj);
          }
          break;
        }
      }
      if (this.enabled) {
        if (this.menu) {
          this.onclick(e);
        }
        else {
          if (this.actionOnClick) {
            this.className = this.itemClassNameClick;
            if (this.iconObj && this.iconClassNameClick) {
              this.iconObj.className = this.iconClassNameClick;
            }
            this.clicked = true;
          }
        }
      }
    }
  }
  else {
    var menuBarObj = this.parent.menuBarObj;
    for (var i = 0, len = menuBarObj.childNodes.length; i < len; i++) {
      if (menuBarObj.childNodes[i].enabled) {
        menuBarObj.childNodes[i].className = menuBarObj.childNodes[i].itemClassName;
        if (menuBarObj.childNodes[i].iconObj) {
          menuBarObj.childNodes[i].iconObj.className = menuBarObj.childNodes[i].iconClassName;
        }
      }
    }
    if (this.enabled && (this.menu || this.actionOnClick)) {
      switch (menuBarObj.activateMode) {
        case "click":
          this.className = this.itemClassNameOver;
          break;
        case "over":
          if (this.menu) {
            if (!window.g_belatedElm && window.belatedClick)
            {
              g_belatedElm = this; //!!
              window.setTimeout("belatedClick()",333); //!!
              this.className = this.itemClassNameOver; //!!
            }
            //this.onclick(e);
          }
          else {
            this.className = this.itemClassNameOver;
          }
          break;
      }
      if (this.iconObj && this.iconClassNameOver) {
        this.iconObj.className = this.iconClassNameOver;
      }
    }
  }
}

/*
Event handler that handles onclick event of the menu bar item.
*/
function menuBarItemClick(e) { // Private method
  if (this.enabled) {
    if (this.menu) {
      if (this.clicked) {
        this.className = this.itemClassNameOver;
        if (this.iconObj) {
          this.iconObj.className = this.iconClassNameOver;
        }
        hideMenus(this.menu.menuObj);
        this.clicked = false;
        this.parent.menuBarObj.activated = false;
      }
      else {
        g_belatedElm = null; //!!
        this.className = this.itemClassNameClick;
        if (this.iconObj && this.iconClassNameClick) {
          this.iconObj.className = this.iconClassNameClick;
        }
        popUpMenuBarMenu(this.parent.menuBarObj, this, this.menu.menuObj);
        this.clicked = true;
        this.parent.menuBarObj.activated = true;
      }
    }
    else {
      if (this.actionOnClick) {
        var action = this.actionOnClick;
        if (action.indexOf("link:") == 0) {
          location.href = action.substr(5);
        }
        else {
          if (action.indexOf("code:") == 0) {
            eval(action.substr(5));
          }
          else {
            location.href = action;
          }
        }
        this.className = this.itemClassName;
        if (this.iconObj) {
          this.iconObj.className = this.iconClassName;
        }
        this.clicked = false;
        this.parent.menuBarObj.activated = false;
      }
    }
  }

  if (!e) {
    e = window.event;
  }
  if (e) {
    e.cancelBubble = true;
  }
  if (e && e.stopPropagation) {
    e.stopPropagation();
  }
}

/*
Event handler that handles onmouseout event of the menu bar item.
*/
function menuBarItemOut() { // Private method
  if (!this.parent.menuBarObj.activated) {
    this.className = this.itemClassName;
    if (this.iconObj) {
      this.iconObj.className = this.iconClassName;
    }
  }
  g_belatedElm = null; //!!
}

/*
Event handler that handles onmousedown event of the menu bar.
*/
function menuBarDown(e) { // Private method
  draggingObj = this.parent.menuBarObj;
  var menuBarObj = this.parent.menuBarObj;
  menuBarObj.differenceLeft = getX(e) - menuBarObj.offsetLeft;
  menuBarObj.differenceTop = getY(e) - menuBarObj.offsetTop;
  hideMenuBarMenus();
  document.onmousemove = mouseMoveHandler;
  document.onmouseup = menuBarUp;
}

/*
Event handler that handles onmouseup event of the menu bar.
*/
function menuBarUp() { // Private method
  var menuBarObj = (this.parent && this.parent.menuBarObj)
            ? this.parent.menuBarObj
            : draggingObj;
  draggingObj = null;
  //!!draggingObj = null;
  //!!var menuBarObj = this.parent.menuBarObj;
  menuBarObj.differenceLeft = 0;
  menuBarObj.differenceTop = 0;
  menuBarObj.initialLeft = menuBarObj.offsetLeft - getScrollLeft();
  menuBarObj.initialTop = menuBarObj.offsetTop - getScrollTop();
  document.onmousemove = null;
  document.onmouseup = null;
}

/*
Event handler that handles mouse move event.
*/
function mouseMoveHandler(e) { // Private method
  if (draggingObj) {
    draggingObj.style.left = (getX(e) - draggingObj.differenceLeft) + px;
    draggingObj.style.top = (getY(e) - draggingObj.differenceTop) + px;
  }
}

/*
Event handler that handles scroll event.
*/
function menuBarScrollHandler() { // Private method
  for (var i = 1; i <= menuBarCount; i++) {
    var menuBarObj = getElmId("DOMenuBar" + i);
    if (ie && menuBarObj.mode == "fixed") {
      menuBarObj.style.left = (menuBarObj.initialLeft + getScrollLeft()) + px;
      menuBarObj.style.top = (menuBarObj.initialTop + getScrollTop()) + px;
    }
  }
}

/*
Hide all menu bar menus.
*/
function hideMenuBarMenus() { // Public method
  for (var i = 1; i <= menuBarCount; i++) {
    refreshMenuBarItems(getElmId("DOMenuBar" + i));
  }
}

/*
Show the icon before the display text.
Arguments:
className          : Required. String that specifies the CSS class selector for the icon.
classNameOver      : Optional. String that specifies the CSS class selector for the icon when
                     the cursor is over the menu bar item.
classNameClick     : Optional. String that specifies the CSS class selector for the icon when
                     the cursor is clicked on the menu bar item.
*/
function showMenuBarItemIcon() { // Public method
  var iconElm = createElm("span");
  var textNode = document.createTextNode("");
  iconElm.appendChild(textNode);
  iconElm.id = this.id + "Icon";
  iconElm.className = arguments[0];
  this.insertBefore(iconElm, this.firstChild);
  var height;
  var offsetHeight;
  var menuBarObj = this.parent.menuBarObj;
  var offset = getPropIntVal(menuBarObj, btw)
             + getPropIntVal(this, pt)
             - getPropIntVal(menuBarObj, pb)
             - getPropIntVal(menuBarObj, bbw)
             - getPropIntVal(this, pb);
  if (ie55 || ie6) {
    height = getPropIntVal(iconElm, "height");
    offsetHeight = (menuBarObj.mode == "static") ? menuBarObj.offsetHeight + offset : this.offsetHeight + getPropIntVal(this, pt) - getPropIntVal(this, pb);
  }
  else {
    height = iconElm.offsetHeight;
    offsetHeight = this.offsetHeight;
  }
  iconElm.style.top = Math.floor((offsetHeight - height) / 2) + px;
  if (opera && this.parent.menuBarObj.mode != "static") {
    iconElm.style.display = "none";
  }
  this.iconClassName = iconElm.className;
  var len = arguments.length;
  if (len > 1 && arguments[1].length > 0) {
    this.iconClassNameOver = arguments[1];
  }
  if (len > 2 && arguments[2].length > 0) {
    this.iconClassNameClick = arguments[2];
  }
  this.iconObj = iconElm;
  this.setIconClassName = function(className) { // Public method
    if (opera && this.parent.menuBarObj.mode != "static") {
      return;
    }
    this.iconClassName = className;
    this.iconObj.className = this.iconClassName;
  };
  this.setIconClassNameOver = function(classNameOver) { // Public method
    if (opera && this.parent.menuBarObj.mode != "static") {
      return;
    }
    this.iconClassNameOver = classNameOver;
  };
  this.setIconClassNameClick = function(classNameClick) { // Public method
    if (opera && this.parent.menuBarObj.mode != "static") {
      return;
    }
    this.iconClassNameClick = classNameClick;
  };
}

/*
Add a new menu bar item to the menu bar.
Argument:
menuBarItemObj     : Required. Menu bar item object that is going to be added to the menu bar
                     object.
*/
function addMenuBarItem(menuBarItemObj) { // Public method
  var itemElm = createElm("span");
  itemElm.id = menuBarItemObj.id;
  itemElm.menu = menuBarItemObj.menu;
  itemElm.enabled = menuBarItemObj.enabled;
  itemElm.clicked = false;
  itemElm.actionOnClick = menuBarItemObj.actionOnClick;
  itemElm.itemClassName = menuBarItemObj.className;
  itemElm.itemClassNameOver = menuBarItemObj.classNameOver;
  itemElm.itemClassNameClick = menuBarItemObj.classNameClick;
  itemElm.className = itemElm.itemClassName;
  if (ie50) {
    itemElm.style.height = "1%";
  }
  if (ie55) {
    itemElm.style.width = "auto";
  }
  var textNode = document.createTextNode(menuBarItemObj.displayText);
  itemElm.appendChild(textNode);
  this.menuBarObj.appendChild(itemElm);
  itemElm.parent = this;
  itemElm.setClassName = function(className) { // Public method
    this.itemClassName = className;
    this.className = this.itemClassName;
  };
  itemElm.setClassNameOver = function(classNameOver) { // Public method
    this.itemClassNameOver = classNameOver;
  };
  itemElm.setClassNameClick = function(classNameClick) { // Public method
    this.itemClassNameClick = classNameClick;
  };
  itemElm.setDisplayText = function(text) { // Public method
    if (this.childNodes[0].nodeType == 3) {
      this.childNodes[0].nodeValue = text;
    }
    else {
      this.childNodes[1].nodeValue = text;
    }
  };
  itemElm.getDisplayText = function() { // Public method
    if (this.childNodes[0].nodeType == 3) {
      return this.childNodes[0].nodeValue;
    }
    else {
      return this.childNodes[1].nodeValue;
    }
  };

  itemElm.setMenu = function(menu) { // Public method
    this.menu = menu;
  };
  itemElm.showIcon = showMenuBarItemIcon;
  itemElm.onmouseover = menuBarItemOver;
  itemElm.onclick = menuBarItemClick;
  itemElm.onmouseout = menuBarItemOut;
  if (menuBarItemObj.itemName.length > 0) {
    this.items[menuBarItemObj.itemName] = itemElm;
  }
  else {
    this.items[this.items.length] = itemElm;
  }
  var len = 0;
  for (var x in this.items) {
    ++len;
  }
  if (len == 1 && opera && pageMode == 0) {
    this.dragObj.style.height = (this.dragObj.offsetTop - itemElm.offsetTop) + px;
  }
}

/*
Create a new menu bar item object.
Arguments:
displayText        : Required. String that specifies the text to be displayed on the menu bar item.
menuObj            : Optional. Menu object that is going to be the main menu for the menu bar item.
                     Defaults to null (no menu).
itemName           : Optional. String that specifies the name of the menu bar item. Defaults to ""
                     (no name).
enabled            : Optional. Boolean that specifies whether the menu bar item is enabled/disabled.
                     Defaults to true.
actionOnClick      : Optional. String that specifies the action to be done when the menu item is
                     being clicked if no main menu has been set for the menu bar item. Defaults to
                     "" (no action).
className          : Optional. String that specifies the CSS class selector for the menu bar item.
                     Defaults to "jsdomenubaritem".
classNameOver      : Optional. String that specifies the CSS class selector for the menu item when
                     the cursor is over it. Defaults to "jsdomenubaritemover".
classNameClick     : Optional. String that specifies the CSS class selector for the menu item when
                     the cursor is clicked on it. Defaults to "jsdomenubaritemclick".
*/
function menuBarItem() { // Public method
  this.displayText = arguments[0];
  this.id = "menuBarItem" + (++menuBarItemCount);
  this.itemName = "";
  this.menu = null;
  this.enabled = true;
  this.actionOnClick = "";
  this.className = menuBarItemClassName;
  this.classNameOver = menuBarItemClassNameOver;
  this.classNameClick = menuBarItemClassNameClick;
  var len = arguments.length;
  if (len > 1 && typeof(arguments[1]) == "object") {
    this.menu = arguments[1];
  }
  if (len > 2 && arguments[2].length > 0) {
    this.itemName = arguments[2];
  }
  if (len > 3 && typeof(arguments[3]) == "boolean") {
    this.enabled = arguments[3];
  }
  if (len > 4 && arguments[4].length > 0) {
    this.actionOnClick = arguments[4];
  }
  if (len > 5 && arguments[5].length > 0) {
    this.className = arguments[5];
  }
  if (len > 6 && arguments[6].length > 0) {
    this.classNameOver = arguments[6];
  }
  if (len > 7 && arguments[7].length > 0) {
    this.classNameClick = arguments[7];
  }
}

/*
Create a new menu bar object.
Arguments:
mode               : Optional. String that specifies the mode of the menu bar. Defaults to "absolute".
id                 : Optional, except when mode = "static". String that specifies the id of
                     the element that will contain the menu bar. This argument is required when
                     mode = "static".
draggable          : Optional. Boolean that specifies whether the menu bar is draggable. Defaults to
                     false.
className          : Optional. String that specifies the CSS class selector for the menu bar. Defaults
                     to "jsdomenubardiv".
width              : Optional. Integer that specifies the width of the menu bar. Defaults to "auto".
height             : Optional. Integer that specifies the height of the menu bar. Defaults to "auto".
*/
function jsDOMenuBar() { // Public method
  this.items = new Array();
  var dragElm = createElm("span");
  dragElm.className = menuBarDragClassName;
  var textNode = document.createTextNode("");
  dragElm.appendChild(textNode);
  var menuBarElm;
  var len = arguments.length;
  if (len > 1 && arguments[1].length > 0 && arguments[0] == "static") {
    menuBarElm = getElmId(arguments[1]);
    if (!menuBarElm) {
      return;
    }
    staticMenuBarId[staticMenuBarId.length] = arguments[1];
    menuBarElm.appendChild(dragElm);
  }
  else {
    menuBarElm = createElm("div");
    menuBarElm.appendChild(dragElm);
    menuBarElm.id = "DOMenuBar" + (++menuBarCount);
  }
  menuBarElm.mode = menuBarMode;
  menuBarElm.activateMode = menuBarActivateMode;
  menuBarElm.draggable = false;
  menuBarElm.className = menuBarClassName;
  menuBarElm.activated = false;
  menuBarElm.initialLeft = 0;
  menuBarElm.initialTop = 0;
  menuBarElm.differenceLeft = 0;
  menuBarElm.differenceTop = 0;
  if (len > 0 && arguments[0].length > 0) {
    switch (arguments[0]) {
      case "absolute":
        menuBarElm.style.position = "absolute";
        menuBarElm.mode = "absolute";
        break;
      case "fixed":
        if (ie) {
          menuBarElm.style.position = "absolute";
        }
        else {
          menuBarElm.style.position = "fixed";
        }
        menuBarElm.mode = "fixed";
        break;
      case "static":
        menuBarElm.style.position = "static";
        menuBarElm.mode = "static";
        break;
    }
  }
  if (len > 2 && typeof(arguments[2]) == "boolean") {
    menuBarElm.draggable = arguments[2];
    if (menuBarElm.draggable) {
      dragElm.style.visibility = "visible";
    }
    else {
      dragElm.style.visibility = "hidden";
    }
  }
  if (len > 3 && arguments[3].length > 0) {
    menuBarElm.className = arguments[3];
  }
  if (len > 4 && typeof(arguments[4]) == "number" && arguments[4] > 0) {
    menuBarElm.style.width = arguments[4] + px;
  }
  if (len > 5 && typeof(arguments[5]) == "number" && arguments[5] > 0) {
    menuBarElm.style.height = arguments[5] + px;
  }
  menuBarElm.style.left = "0px";
  menuBarElm.style.top = "0px";
  if (ie50) {
    menuBarElm.style.height = "1%";
  }

  if (menuBarElm.mode != "static") {
    document.body.appendChild(menuBarElm);
  }
  else {
    //if (ie) {
    //  menuBarElm.style.height = "1%";
    //}
  }
  if (!getPropVal(menuBarElm, blw)) {
    menuBarElm.style.borderWidth = menuBarBorderWidth + px;
  }
  this.menuBarObj = menuBarElm;
  this.dragObj = dragElm;
  dragElm.parent = this;
  this.addMenuBarItem = addMenuBarItem;
  this.menuBarObj.onclick = function(e) { // Private method
    if (!e) {
      var e = window.event;
      e.cancelBubble = true;
    }
    if (e.stopPropagation) {
      e.stopPropagation();
    }
  };
  dragElm.onmousedown = menuBarDown;
  dragElm.onmouseup = menuBarUp;
  this.setMode = function(mode) { // Public method
    switch (mode) {
      case "absolute":
        this.menuBarObj.style.position = "absolute";
        this.menuBarObj.mode = "absolute";
        this.menuBarObj.initialLeft = parseInt(this.menuBarObj.style.left);
        this.menuBarObj.initialTop = parseInt(this.menuBarObj.style.top);
        break;
      case "fixed":
        if (ie) {
          this.menuBarObj.style.position = "absolute";
          this.menuBarObj.initialLeft = parseInt(this.menuBarObj.style.left);
          this.menuBarObj.initialTop = parseInt(this.menuBarObj.style.top);
        }
        else {
          this.menuBarObj.style.position = "fixed";
        }
        this.menuBarObj.mode = "fixed";
        break;
    }
  };
  this.setActivateMode = function(activateMode) { // Public method
    this.menuBarObj.activateMode = activateMode;
  };
  this.setDraggable = function(draggable) { // Public method
    if (typeof(draggable) == "boolean" && this.menuBarObj.mode != "static") {
      this.menuBarObj.draggable = draggable;
      if (this.menuBarObj.draggable) {
        this.dragObj.style.visibility = "visible";
      }
      else {
        this.dragObj.style.visibility = "hidden";
      }
    }
  };
  this.setClassName = function(className) { // Public method
    this.menuBarObj.className = className;
  };
  this.setDragClassName = function(className) { // Public method
    this.dragObj.className = className;
  };
  this.show = function() { // Public method
    this.menuBarObj.style.visibility = "visible";
  };
  this.hide = function() { // Public method
    this.menuBarObj.style.visibility = "hidden";
  };
  this.setX = function(x) { // Public method
    this.menuBarObj.initialLeft = x;
    this.menuBarObj.style.left = x + px;
  };
  this.setY = function(y) { // Public method
    this.menuBarObj.initialTop = y;
    this.menuBarObj.style.top = y + px;
  };
  this.moveTo = function(x, y) { // Public method
    this.menuBarObj.initialLeft = x;
    this.menuBarObj.initialTop = y;
    this.menuBarObj.style.left = x + px;
    this.menuBarObj.style.top = y + px;
  };
  this.moveBy = function(x, y) { // Public method
    var left = parseInt(this.menuBarObj.style.left);
    var top = parseInt(this.menuBarObj.style.top);
    this.menuBarObj.initialLeft = left + x;
    this.menuBarObj.initialTop = top + y;
    this.menuBarObj.style.left = (left + x) + px;
    this.menuBarObj.style.top = (top + y) + px;
  };
  this.setBorderWidth = function(width) { // Public method
    this.menuBarObj.style.borderWidth = width + px;
  };
}

if (typeof(menuBarClassName) == "undefined") {
  var menuBarClassName = "jsdomenubardiv"; // Public field
}

if (typeof(menuBarItemClassName) == "undefined") {
  var menuBarItemClassName = "jsdomenubaritem"; // Public field
}

if (typeof(menuBarItemClassNameOver) == "undefined") {
  var menuBarItemClassNameOver = "jsdomenubaritemover"; // Public field
}

if (typeof(menuBarItemClassNameClick) == "undefined") {
  var menuBarItemClassNameClick = "jsdomenubaritemclick"; // Public field
}

if (typeof(menuBarDragClassName) == "undefined") {
  var menuBarDragClassName = "jsdomenubardragdiv"; // Public field
}

if (typeof(menuBarMode) == "undefined") {
  var menuBarMode = "absolute"; // Public field
}

if (typeof(menuBarActivateMode) == "undefined") {
  var menuBarActivateMode = "click"; // Public field
}

if (typeof(menuBarBorderWidth) == "undefined") {
  var menuBarBorderWidth = 2; // Public field
}

var pt = "padding-top"; // Private field
var pb = "padding-bottom"; // Private field
var menuBarCount = 0; // Private field
var menuBarItemCount = 0; // Private field
var draggingObj = null; // Private field
var staticMenuBarId = new Array(); // Private field

/* End jsdomenubar.js */

if (document.implementation.createDocument) {
    //add the loadXML() method to the Document class
    Document.prototype.loadXML = function(strXML) {
        
    //create a DOMParser
    var objDOMParser = new DOMParser();
        
    //create new document from string
    var objDoc = objDOMParser.parseFromString(strXML, "text/xml");
    return objDoc;
    } //End: function
} //End: if

function importXML(pXML)
{
    if (document.implementation && document.implementation.createDocument)
        xmlDoc = document.implementation.createDocument("", "", null);
    else if (window.ActiveXObject)
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

    xmlDoc.async="false";
    xmlDoc.loadXML(pXML);
    if (document.implementation && document.implementation.createDocument)
    {
        return xmlDoc.loadXML(pXML);
    }
    else
    {
        xmlDoc.loadXML(pXML);
        return xmlDoc;
    }
}

/* public functions for fetching flat data from server */
var _g_ServiceRequestTimeout = 30000;
function ServerDataRequest(pTargetElement, pService, pData, pCallback)
{
    this.targetElement = pTargetElement;
    this.service       = pService;
    this.dataObj       = pData;
    this.callBackFunc  = pCallback;

    this.dequeueTime   = null;

    this.timedOut = function(pTimeOut)
    {
        if (!this.dequeueTime)
            return false;

        var now = new Date();
        if (now.getTime() - this.dequeueTime <= pTimeOut)
            return false;   // Still within the 'pTimeOut' milliseconds. No time-out (yet).
        else
        {
            window.status = "Request for data failed (timed out)";

            // Call the callback function without any XML-data.
            this.callBackFunc(this.targetElement,null);
            this.callBackFunc = null;

            // It lasted more than 'pTimeOut' miliseconds...
            // Abort the request to the server
            g_dataFetcher.abort();
            return true; // The request did time-out.
        }
    };
}

var g_dataFetcherQueue = new Array();
function getServerData(pTargetElement, pService, pData, pCallback)
{
    var queueItem = new ServerDataRequest(pTargetElement, pService, pData, pCallback);
    if (g_dataFetcherQueue.length == 0)
    {
        // Queue item and start the request-dispatcher loop.
        g_dataFetcherQueue.queue(queueItem);
        window.setTimeout("execDataFetcherQueue()", 1);
    }
    else // Just queue the item.
        g_dataFetcherQueue.queue(queueItem);
}

function execDataFetcherQueue()
{
    // This is called by the request-dispatcher loop.
    if (g_dataFetcherQueue.length > 0)
    {
        if (getServerData2(g_dataFetcherQueue.tail()))
            g_dataFetcherQueue.dequeue();

        // Continue the request-dispatcher loop.
        window.setTimeout("execDataFetcherQueue()", 200);
    }
    else if (g_currentRequest)
    {
        if (g_currentRequest.timedOut(_g_ServiceRequestTimeout))
            g_currentRequest = null;

        // Continue the request-dispatcher loop to check for a time-out a little later.
        window.setTimeout("execDataFetcherQueue()", 200);
    }
}

var g_dataFetcher    = null;
var g_currentRequest = null;
function g_handleXMLResponse()
{
    var reqOK = false;
    switch(g_dataFetcher.readyState)
    {
    case 0:
    case 1:
        return;
    case 2:
        if (g_sending)
            window.status = g_sending;
        return;
    case 3:
        if (g_receiving)
        window.status = g_receiving;
        return;
    case 4:
        reqOK = true;
        break;
    default:
        reqOK = false;
        return;
    }
    if (g_busy)
        window.status = " ";

    if (g_currentRequest && g_currentRequest.callBackFunc)
    {
        try {
            if (reqOK && g_dataFetcher.status == 200)
            {
                var doc = importXML(g_dataFetcher.responseText);
                if (!doc || !doc.lastChild)
                    reqOK = false;
            }
            else if (reqOK && g_dataFetcher.status != 200)
            {
                window.status = ("Request for data failed ("+g_dataFetcher.status+"): "+g_dataFetcher.statusText);
                reqOK = false;
            }
            else
            {
                window.status = ("Request for data failed");
                reqOK = false;
            }
        }
        catch (xcpt) {
            alert("Request for data failed (javascript error): "+xcpt.message);
            reqOK = false;
        }

        try {
            if (reqOK)
                g_currentRequest.callBackFunc(g_currentRequest.targetElement, doc.lastChild);
            else
                g_currentRequest.callBackFunc(g_currentRequest.targetElement, null);
        }
        catch (xcpt) {
            g_currentRequest.callBackFunc = null;
            throw xcpt;
        }

        g_currentRequest.callBackFunc = null;
    }
    g_currentRequest = null;
    window.setTimeout("execDataFetcherQueue()", 1);
}

function getServerData2(pQueueItem)
{
    if (g_currentRequest && !g_currentRequest.timedOut(_g_ServiceRequestTimeout))
        return false; // still busy: Wait until ready or until a time-out occurred.

    g_currentRequest = pQueueItem;
    g_currentRequest.dequeueTime = new Date();
    if (g_busy)
        window.status = " ";

    if (!g_dataFetcher)
    {
        try {
            g_dataFetcher = new XMLHttpRequest;
        }
        catch (xcpt) { }
        if (!g_dataFetcher)
            g_dataFetcher = new ActiveXObject("Microsoft.XMLHTTP");
    }

    var service = g_currentRequest.service+(g_currentRequest.dataObj? "?" : "");
    if (g_currentRequest.dataObj)
    {
        var prop;
        for (prop in g_currentRequest.dataObj)
        {
            service += prop+"="+escape(g_currentRequest.dataObj[prop])+"&";
        }
    }

    g_dataFetcher.abort();

    try {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
    } 
    catch (e) { }

    if (g_busy)
        window.status = g_busy;
    g_dataFetcher.open("POST", service, true); // don't cache results.

    if (g_busy)
        window.status = g_busy;
    g_dataFetcher.onreadystatechange = g_handleXMLResponse;
    g_dataFetcher.send(null);
    return true;
}

function testIfDataFetcherNotBusy()
{
    return !g_currentRequest;
}

function getXMLDataFromElm(pParentElm, pElmName)
{
    if (!pParentElm)  return "";

    var elms = pParentElm.getElementsByTagName(pElmName);
    if (!elms || elms.length == 0)  return "";

    var elm = elms[0];
    if (!elm || !elm.firstChild)  return "";

    return elm.firstChild.data;
}

function handleFeed(pSWidget, pXMLData)
{
    if (!pXMLData)
        return;

    var isRSS  = pXMLData.nodeName.toLowerCase() == "rss";
    //var isATOM = pXMLData.nodeName.toLowerCase() == "feed";

    var linkId = pXMLData.getElementsByTagName(isRSS ? "link" : "id")[0].firstChild.data;
    var i, max, row, col;

    var items = pXMLData.getElementsByTagName(isRSS ? "item" : "entry");
    var idxArray = new Array();

    for (i = 0; i < items.length; i++)
    {
        idxArray[i]=i;
    }
    if (pSWidget.doShuffle)
        fisherYates(idxArray);
    
    var html = '<div class="sw_widget" onclick="location.href=\''+linkId+'\';">';
    i = 0;
    max = Math.min(pSWidget.cols*pSWidget.rows, items.length);
    for (i = 0; i < max; i++)
    {
        var url = isRSS ? items[idxArray[i]].getElementsByTagName("enclosure")[0].getAttribute("url")
                        : items[idxArray[i]].getElementsByTagName("id")[0].firstChild.data;
        url = pSWidget.imgUrlReplace(url);
        html+='<div class="sw_cell" style="background-image: url('+url+');">';
        html+='</div>';
    }
    html+='</div>';
    document.getElementById(pSWidget.container).innerHTML = html;
}

function showSmugWidgets()
{
    var i;
    for (i = 0; i < g_SWidgets.length; i++)
    {
        if (document.getElementById(g_SWidgets[i].container))
            getServerData(g_SWidgets[i], g_SWidgets[i].url, null, handleFeed);
    }
}
