function showDialogBoxNS(evt)
{
    var name = confirm("Are you sure you want to delete this portlet?")
    if(name == true)
    {
        var source = getEventSource(evt);
        var url = source.href;
        source.href = url+"&__deletePermanently=false";
        return true;
    }
    return false;
}

function showMultipleChoiceDialogBoxNS(evt)
{
    var name = confirm("Are you sure you want to delete this portlet?")
    var name1 = false;
    if(name == true)
    {
        var source = getEventSource(evt);
        var url = source.href;
        name1 = confirm("Press OK to delete permanently \nor Cancel to only delete from this session.\n");
        if(name1 == true)
        {
            source.href = url+"&__deletePermanently=true";
        }
        else
        {
            source.href = url+"&__deletePermanently=false";
        }
        return true;
    }
    return false;
}


function showDialogBoxIE()
{
    var name = confirm("Are you sure you want to delete this portlet?")
    if(name == true)
    {
        var source;
        var event = window.event;
        if(event != null)
        {
            source = event.srcElement;
        }
        var parent = source.parentNode;
        var url = parent.href;
        parent.href = url+"&__deletePermanently=false";
    }
    else
    {
        var event = window.event;
        if(event != null)
        {
            event.returnValue = false;
        }
    }
}

function showMultipleChoiceDialogBoxIE()
{
    var name = confirm("Are you sure you want to delete this portlet?")
    var name1 = false;
    if(name == true)
    {
        var source;
        var event = window.event;
        if(event != null)
        {
            source = event.srcElement;
        }
        var parent = source.parentNode;
        var url = parent.href;
        name1 = confirm("Press OK to delete permanently \nor Cancel to only delete from this session.\n");
        if(name1 == true)
        {
            parent.href = url+"&__deletePermanently=true";
        }
        else
        {
            parent.href = url+"&__deletePermanently=false";
        }
    }
    else
    {
        var event = window.event;
        if(event != null)
        {
            event.returnValue = false;
        }
    }
}

function detectNetscape()
{
    var n=navigator.appName
    if(n == "Netscape")
    {
        return true;
    }
    else
    {
        return false;
    }
}

function initPortletDeleteButtons()
{
    var portletDeleteButtonsSpanned = getSpannedDeleteButtons();
    var portletDeleteButtonsNonSpanned = getNonSpannedDeleteButtons();
    if(detectNetscape() == true)
    {
        for(var i = 0; i < portletDeleteButtonsSpanned.length; i++)
        {
            portletDeleteButtonsSpanned[i].onclick = showMultipleChoiceDialogBoxNS;
        }
        for(var i = 0; i < portletDeleteButtonsNonSpanned.length; i++)
        {
            portletDeleteButtonsNonSpanned[i].onclick = showDialogBoxNS;
        }
    }
    else
    {
        for(var i = 0; i < portletDeleteButtonsSpanned.length; i++)
        {
            portletDeleteButtonsSpanned[i].onclick = showMultipleChoiceDialogBoxIE;
        }
        for(var i = 0; i < portletDeleteButtonsNonSpanned.length; i++)
        {
            portletDeleteButtonsNonSpanned[i].onclick = showDialogBoxIE;
        }
    }
}

function getSpannedDeleteButtons()
{
    var anchors = document.getElementsByTagName("a");
    var spannedDeletes = new Array(0);
    var j = -1;
    for (var i = 0; i < anchors.length; i++)
    {
        var _className = anchors[i].className;
        if((_className == "bea-portal-button-delete") &&
           (anchors[i].parentNode.tagName == "span" || anchors[i].parentNode.tagName == "SPAN"))
        {
            j++;
            spannedDeletes[j] = anchors[i];
        }
    }
    return spannedDeletes;
}

function getNonSpannedDeleteButtons()
{
    var anchors = document.getElementsByTagName("a");
    var nonSpannedDeletes = new Array(0);
    var j = -1;
    for (var i = 0; i < anchors.length; i++)
    {
        var _className = anchors[i].className;
        if((_className == "bea-portal-button-delete") &&
           (anchors[i].parentNode.tagName != "span" && anchors[i].parentNode.tagName != "SPAN"))
        {
            j++;
            nonSpannedDeletes[j] = anchors[i];
        }
    }
    return nonSpannedDeletes;
}

/*
 * This file illustrates one way to customize floating popup portlets.  However, it is not enabled by default.
 * To enable this javascript functionality, uncomment the call to "initPortletFloatButtons()" in skin.js.
 */

function initPortletFloatButtons()
{
    var links = document.getElementsByTagName("a");

    for (var i = 0; i < links.length; i++)
    {
        if (links[i].className && links[i].className == "bea-portal-button-float")
        {
            initPortletFloatButton(links[i]);
        }
    }
}

function initPortletFloatButton(link)
{
    link.onclick = floatPortlet;
}

function floatPortlet(event)
{
    var href = getEventAnchorHref(getEvent(event));
    var target = getEventAnchorTarget(getEvent(event));
    // This is the interesting line for customization purposes:
    window.open(href, target, "toolbar = no, width = 320, height = 240, directories = no, status = no, scrollbars = yes, resize = yes, menubar = no");
    // Returning false keeps the browser from submitting this button click to the server.
    return false;
}

function getEventAnchorHref(event)
{
    var source = getEventSource(event);
    // Correct source for IE
    source = getClickableImageEventSource(source);
    return (source && source.href ? source.href : "about:blank");
}

function getEventAnchorTarget(event)
{
    var source = getEventSource(event);
    // Correct source for IE
    source = getClickableImageEventSource(source);
    return (source && source.target ? source.target : "_blank");
}


// @todo Re-evaluate need for IDs

var tryClosePause = 1000;

var bookTag = "DIV";
var menuTag = "UL";
var menuItemTag = "LI";
var menuItemLinkTag = "A";
var menuHookTag = "DIV"

var bookClassRegex = new RegExp("bea-portal-book(?:-(primary))?$");
var menuClassRegex = new RegExp("bea-portal-book(?:-(primary))?-menu$");
var hookClassRegex = new RegExp("bea-portal-book(?:-(primary))?-menu-hook$");
var itemClassRegex = new RegExp("bea-portal-book(?:-(primary))?-menu-item(?:-(active))?$");
var linkClassRegex = new RegExp("bea-portal-book(?:-(primary))?-menu-item-link$");

var rootClassRegex = new RegExp("bea-portal-book(?:-(primary))?-menu-root$");
var nestedClassRegex = new RegExp("bea-portal-book(?:-(primary))?-menu-nested$");

var books = new Array();
var currentMenuItem;

function initDynamicMenus()
{
    initBooks();
    createMenus();
}

function initBooks()
{
    var bookCandidates = document.getElementsByTagName(bookTag);

    for (var i = 0; i < bookCandidates.length; i++)
    {
        if (bookCandidates[i].tagName && bookCandidates[i].tagName == bookTag
            && bookCandidates[i].className && bookCandidates[i].className.match(bookClassRegex))
        {
            var book = initBook(bookCandidates[i]);

            if (book)
            {
                books[books.length] = book;
            }
        }
    }
}

function initBook(tag)
{
    var book;
    var menuInstance = getFirstChildByClassRegex(tag, menuTag, menuClassRegex, bookClassRegex);
    var hookInstance = getFirstChildByClassRegex(tag, menuHookTag, hookClassRegex, bookClassRegex);

    if (tag && menuInstance && hookInstance)
    {
        var menu = initMenu(menuInstance);
        var hook = initMenuHook(hookInstance);

        if (menu && hook)
        {
            book = new Book(tag, menu, hook);
        }
    }

    return book;
}

function initMenu(tag)
{
    if (!tag)
    {
        alert("No tag defined!");
    }

    tag.style.display = "none";
    var menuItems = new Array();
    var child = tag.firstChild;

    while (child != null)
    {
        if (child.tagName && child.tagName == menuItemTag && child.className.match(itemClassRegex))
        {
            var itemGroups = child.className ? child.className.match(itemClassRegex) : null;

            if (itemGroups && itemGroups.length >= 1)
            {
                var isActive = false;

                if ((itemGroups.length == 2 && itemGroups[1] == "active")
                    || (itemGroups.length == 3 && itemGroups[2] == "active"))
                {
                    isActive = true;
                }

                menuItems[menuItems.length] = initMenuItem(child, isActive);
            }
        }

        child = child.nextSibling;
    }

    var groups = tag.className.match(menuClassRegex);
    var bookClassQualifier = (groups && groups.length >= 2 && groups[1] == "primary" ? "-primary" : "");
    return new Menu(tag, menuItems, bookClassQualifier);
}

function initMenuHook(tag)
{
    return new MenuHook(tag);
}

function initMenuItem(tag, isActive)
{
    var link;
    var menu;
    var child = tag.firstChild;

    while (child != null)
    {
        if (child.tagName && child.tagName == menuItemLinkTag && child.className.match(linkClassRegex))
        {
            var label = (child.innerText ? child.innerText : child.text);
            link = new Link(child, label);
        }
        else if (child.tagName && child.tagName == menuTag)
        {
            menu = initMenu(child);
        }

        child = child.nextSibling;
    }

    return new MenuItem(tag, link, isActive, menu);
}

function createMenus()
{
    for (var i = 0; i < books.length; i++)
    {
        createRootMenu(books[i].menu, books[i].hook, i);
    }
}

function createRootMenu(menu, hook, menuId)
{
    var menuContext = document.createElement("UL");
    menuContext.className = "bea-portal-book" + menu.bookClassQualifier + "-menu-root";
    menuContext.id = "menu-" + menuId;
    hook.tag.appendChild(menuContext);
    var itemClassName = "bea-portal-book" + menu.bookClassQualifier + "-menu-root-item";

    for (var i = 0; i < menu.menuItems.length; i++)
    {
        createMenuItem(menu.menuItems[i], menuContext, itemClassName, i, "LI", true);
    }
}

function createSubMenu(menu, hook, contextId)
{
    var menuContext = document.createElement("div");
    menuContext.style.display = "none";
    menuContext.className = "bea-portal-book" + menu.bookClassQualifier + "-menu-nested";
    menuContext.id = contextId + "-menu";
    hook.tag.appendChild(menuContext);
    var itemClassName = "bea-portal-book" + menu.bookClassQualifier + "-menu-nested-item";

    for (var i = 0; i < menu.menuItems.length; i++)
    {
        createMenuItem(menu.menuItems[i], menuContext, itemClassName, i, "DIV", false);
    }

    return menuContext;
}

function createMenuItem(menuItem, menuContext, itemClassName, itemId, tagName, isRoot)
{
    var itemContext = document.createElement(tagName);
    itemContext.className = itemClassName + (menuItem.isActive ? "-active" : "");
    menuContext.appendChild(itemContext);
    itemContext.id = menuContext.id + "-item-" + itemId;

    if (menuItem.link)
    {
        var link = document.createElement("a");
        link.href = menuItem.link.tag.href;
        var label = document.createTextNode(menuItem.link.label);
        addEventToElement(link, "mouseover", menuItemHoverIn, false);
        addEventToElement(link, "mouseout", menuItemHoverOut, false);
        itemContext.appendChild(link);
        link.appendChild(label);
    }

    if (menuItem.menu)
    {
        var subMenu = createSubMenu(menuItem.menu, new MenuHook(itemContext), itemContext.id);
        itemContext.appendChild(subMenu);
    }
}

function menuItemHoverIn(evt)
{
    var event = getEvent(evt);
    var source = getEventSource(event);
    var parent = source.parentNode;
    currentMenuItem = parent;
    parent.renderedHeight = parent.offsetHeight;
    parent.renderedWidth = parent.offsetWidth;
    closeAll(parent);
    openPath(parent);
}

function menuItemHoverOut(evt)
{
    var event = getEvent(evt);
    var source = getEventSource(event);
    var parent = source.parentNode;
    currentMenuItem = null;
    tryClose(parent);
}

var tmpMenuItem;
function tryClose(menuItem)
{
    if (!currentMenuItem)
    {
        tmpMenuItem = menuItem;
        setTimeout("wlp_default_close(tmpMenuItem)", tryClosePause);
    }
}

function wlp_default_close(menuItem)
{
    if (menuItem && !currentMenuItem)
    {
        closeAll(menuItem);
    }
}

function getMenuChild(parent)
{
    var child = parent.firstChild;
    var done = false;

    while (!done && child)
    {
        if (child && child.className && child.className.match(nestedClassRegex))
        {
            done = true;
        }
        else
        {
            child = child.nextSibling;
        }
    }

    return child;
}

function openPath(menuItem)
{
    var path = new Array();
    var childMenu = getMenuChild(menuItem);

    if (childMenu)
    {
        path[path.length] = new Array();
        path[path.length - 1][0] = menuItem;
        path[path.length - 1][1] = childMenu;
    }

    var menu = menuItem.parentNode;

    while (menu && !menu.className.match(rootClassRegex))
    {
        menuItem = menu.parentNode;
        path[path.length] = new Array();
        path[path.length - 1][0] = menuItem;
        path[path.length - 1][1] = menu;
        menu = menuItem.parentNode;
    }

    for (var i = 0; i < path.length; i++)
    {
        openMenu(path[i][0], path[i][1], path.length - 1 - i);
    }
}

function openMenu(menuItem, menu, depth)
{
    var width = (menuItem.offsetWidth == 0 ? menuItem.renderedWidth : menuItem.offsetWidth);
    var pos = (depth == 0 ? 1 : getMenuItemPosition(menuItem));
    var height = (menuItem.offsetHeight == 0 ? menuItem.renderedHeight : menuItem.offsetHeight);
    var coords = (depth == 0 ? getDocumentOffset(menuItem) : [menuItem.offsetLeft, menuItem.offsetTop]);
    menu.style.position = "absolute";
    menu.style.display = "block";
    menu.style.left = coords[0] + (depth == 0 ? 0 : width) + "px";
    menu.style.top = coords[1] + (pos * height) + "px";
}

function getDocumentOffset(object)
{
    var coords = new Array();
    coords[0] = object.offsetLeft;
    coords[1] = object.offsetTop;

    while((object = object.offsetParent) != null)
    {
        coords[0] += object.offsetLeft;
        coords[1] += object.offsetTop;
    }

    return coords;
}

function getMenuItemPosition(menuItem)
{
    var pos = 0;
    var parentMenu = menuItem.parentNode;
    var childMenuItem = parentMenu.firstChild;
    var hit = false;

    while (childMenuItem)
    {
        if (childMenuItem == menuItem)
        {
            hit = true;
            break;
        }

        pos++;
        childMenuItem = childMenuItem.nextSibling;
    }

    if (!hit)
    {
        alert("Parent menu does not contain child menu item!");
    }

    return pos;
}

// @review Consider a closeAllBut(menuItem) that closes everything in the path above the menuItem for Mozilla

function closeAll(menuItem)
{
    var rootMenu = menuItem.parentNode;

    while (rootMenu && !rootMenu.className.match(rootClassRegex))
    {
        rootMenu = rootMenu.parentNode.parentNode;
    }

    closeAllChildren(rootMenu);
}

function closeAllChildren(menu)
{
    var child = menu.firstChild;

    while (child)
    {
        var subMenu = getMenuChild(child);

        if (subMenu)
        {
            closeAllChildren(subMenu);
            subMenu.style.display = "none";
        }

        child = child.nextSibling;
    }
}

function Book(tag, menu, hook)
{
    this.tag = tag;
    this.menu = menu;
    this.hook = hook;
}

function Menu(tag, menuItems, bookClassQualifier)
{
    this.tag = tag;
    this.menuItems = menuItems;
    this.bookClassQualifier = bookClassQualifier;
}

function MenuHook(tag)
{
    this.tag = tag;
}

function MenuItem(tag, link, isActive, menu)
{
    this.tag = tag;
    this.link = link;
    this.isActive = isActive;
    this.menu = menu;
}

function Link(tag, label)
{
    this.tag = tag;
    this.label = label;
}

var menufx_menuClassRegex = new RegExp("bea-portal-book-primary-menu-single-item(?:-active)?$");

function initRolloverMenus()
{
    var listItems = document.getElementsByTagName('li');
    for (var i = 0; i < listItems.length; i++)
    {
        if (listItems[i].className && listItems[i].className.match(menufx_menuClassRegex))
        {
            initRolloverMenu(listItems[i]);
        }
    }
}

function initRolloverMenu(listItem)
{
    var image = getImage(listItem);

    if (image && image.src && image.longDesc)
    {
        image.rollOffSrc = image.src;
        image.rollOnSrc = image.longDesc;

        image.fxEnabled = true;
        addEventToElement(image, "mouseover", fxRollIn, true);
        addEventToElement(image, "mouseout", fxRollOut, true);
    }
}

function getImage(listItem)
{
    var image;
    var images = listItem.getElementsByTagName("img");
    if (images && images.length == 1)
    {
        image = images[0];
    }

    return image;
}

function fxRollIn(event)
{
    var image = getEventSource(getEvent(event));
    if (image && image.rollOnSrc && image.fxEnabled)
    {
        image.src = image.rollOnSrc;
    }
}

function fxRollOut(event)
{
    var image = getEventSource(getEvent(event));
    if (image && image.rollOffSrc && image.fxEnabled)
    {
        image.src = image.rollOffSrc;
    }
}

function initSkin()
{
    initDynamicMenus();
    initRolloverMenus();
    initPortletDeleteButtons();
    // See the comments in float.js about this function...
    //initPortletFloatButtons();
}


function getParentByClassName(element, className)
{
    var parent = element;

    if (className)
    {
        while (parent && parent.className != className)
        {
            parent = parent.parentNode;
        }
    }

    return parent;
}

function getFirstChildByClassRegex(element, tagName, classRegex, stopClassRegex)
{
    var match;
    var child = element.firstChild;

    while (child != null && (!child.className || !child.className.match(stopClassRegex)))
    {
        if (child.tagName && child.tagName == tagName && child.className && child.className.match(classRegex))
        {
            match = child;
            break;
        }
        else
        {
            match = getFirstChildByClassRegex(child, tagName, classRegex, stopClassRegex);

            if (match)
            {
                break;
            }
        }

        child = child.nextSibling;
    }

    return match;
}

function getChildrenByClassRegex(root, classRegexes, tagName, matches)
{
    matches = (matches ? matches : new Array());

    if (root)
    {
        var child = root.firstChild;

        while (child)
        {
            if (!tagName || child.tagName == tagName)
            {
                for (index in classRegexes)
                {
                    if (child.className && child.className.match(classRegexes[index]))
                    {
                        matches[matches.length] = child;
                    }
                }
            }

            getChildrenByClassRegex(child, classRegexes, tagName, matches);
            child = child.nextSibling;
        }
    }

    return matches;
}

function addEventToElement(target, eventType, func, useCapture)
{
    var result = false;

    if (target.addEventListener)
    {
        target.addEventListener(eventType, func, useCapture);
        result = true;
    }
    else if (target.attachEvent)
    {
        result = target.attachEvent("on" + eventType, func);
    }
    else
    {
        alert("Handler could not be attached");
    }

    return result;
}

function addEventToElements(targets, eventType, func, useCapture)
{
    var result = true;

    for (var i = 0; i < targets.length; i++)
    {
        result &= addEventToElement(targets[i], eventType, func, useCapture);
    }

    return result;
}

function removeEventFromElement(target, eventType, func, useCapture)
{
    var result = false;

    if (target.removeEventListener)
    {
        target.removeEventListener(eventType, func, useCapture);
        result = true;
    }
    else if (target.detachEvent)
    {
        result = target.detachEvent("on" + eventType, func);
    }
    else
    {
        window.alert("Handler could not be removed");
    }

    return result;
}

function removeEventFromElements(targets, eventType, func, useCapture)
{
    var result = true;

    for (var i = 0; i < targets.length; i++)
    {
        result &= removeEventFromElement(targets[i], eventType, func, useCapture);
    }

    return result;
}

function getEvent(event)
{
    var evt = event;

    if (!evt)
    {
        evt = window.event;
    }

    return evt;
}

function getEventSource(event)
{
    var source;

    if (event && event.srcElement)
    {
        source = event.srcElement;
    }
    else if (event && event.currentTarget)
    {
        source = event.currentTarget;
    }
    else
    {
        window.alert("Event source not found!");
    }

    return source;
}

function getClickableImageEventSource(source)
{
    // If IE, the original source will be the image being clicked instead of the parent element that generated the event
    if (source && source.src)
    {
        source = source.parentNode;
    }

    return source;
}

/**
 * @deprecated
 */
var console = (beaPortalConsole ? beaPortalConsole : new Console());

/**
 * @deprecated
 */
function Console()
{
    this.canvas = null;
    this.println = consolePrintln;
    this.show = consoleShow;
}

/**
 * @deprecated
 */
function consolePrintln(object)
{
    if (!this.canvas)
    {
        this.canvas = window.open("about:blank", "Console", "toolbar = no, width = 640, height = 480, directories = no, status = no, scrollbars = yes, resize = no, menubar = no");
    }

    this.canvas.document.write(object);
    this.canvas.document.write("<br/>");
}

/**
 * @deprecated
 */
function consoleShow(object)
{
    this.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

    for (property in object)
    {
        this.println(property + " = " + eval("object." + property));
    }

    this.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
}
