/*inici*/
//----------------------------------------------------------------------------
// Code to determine the browser and version.
//----------------------------------------------------------------------------

function Browser() {
    var ua, s, i;

    this.isIE    = false;  // Internet Explorer
    this.isOP    = false;  // Opera
    this.isNS    = false;  // Netscape
    this.version = null;

    ua = navigator.userAgent;

    s = "Opera";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isOP = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

    s = "Netscape6/";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

    // Treat any other "Gecko" browser as Netscape 6.1.

    s = "Gecko";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = 6.1;
        return;
    }

    s = "MSIE";
    if ((i = ua.indexOf(s))) {
        this.isIE = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }
}

var browser = new Browser();

/********************************************
* objecte que encapsula totes les functions *
********************************************/
function menu(prefixe){
    
    //propietats
    this.activeButton = null;
    this.prefixe = prefixe;
    
    //mode normal || submenú
    this.mode = 'normal';
    
    //mčtodes
    
    //barra menus i boto actiu
    this.buttonClick = buttonClick;
    this.buttonMouseover = buttonMouseover;
    this.depressButton = depressButton;
    this.resetButton = resetButton;
    
    //menús i submenús
    this.menuMouseover = menuMouseover;
    this.menuItemMouseover = menuItemMouseover;
    this.closeSubMenu = closeSubMenu;
    this.buttonOrMenuMouseout = buttonOrMenuMouseout;
    this.buttonOrMenuMouseout2 = buttonOrMenuMouseout2;
    
    //inicialitza menús
    this.menuInit = menuInit;
    
    //generals
    this.getContainerWith = getContainerWith;
    this.hasClassName = hasClassName;
    this.removeClassName = removeClassName;
    this.getPageOffsetLeft = getPageOffsetLeft;
    this.getPageOffsetTop = getPageOffsetTop;
    this.me_ShowHide = me_ShowHide;
    
}


//----------------------------------------------------------------------------
// Code for handling the menu bar and active button. 
//----------------------------------------------------------------------------

function buttonClick(event, menuId) {
    
    var button;

    // Get the target button element.

    if (browser.isIE){
        button = window.event.srcElement;
    }else{
        button = event.currentTarget;
    }
    // Blur focus from the link to remove that annoying outline.

    //button.blur();
    
    // Associate the named menu to this button if not already done.
    // Additionally, initialize menu display.

    if (button.menu == null) {
        button.menu = document.getElementById(this.prefixe+menuId);
        if (button.menu.isInitialized == null){
            this.menuInit(button.menu);
        }
    
    }

    // [MODIFIED] Added for activate/deactivate on mouseover.
    // Set mouseout event handler for the button, if not already done.

    if (button.onmouseout == null){
        //alert('button.menu.id:'+button.menu.id);
        button.onmouseout = this.buttonOrMenuMouseout;
        //passem la referčncia a l'objecte actual
        button.obj = this;
    }
    
    // Exit if this button is the currently active one.

    if (button == this.activeButton){
        return false;
    }
    // [END MODIFIED]

    // Reset the currently active button, if any.

    if (this.activeButton != null){
        this.resetButton(this.activeButton);
    }

    // Activate this button, unless it was the currently active one.

    if (button != this.activeButton) {
        this.depressButton(button);
        this.activeButton = button;
    }else{
        this.activeButton = null;
    }

    return false;
    
}

function buttonMouseover(event, menuId) {

    var button;

    // [MODIFIED] Added for activate/deactivate on mouseover.

    // Activates this button's menu if no other is currently active.

    if (this.activeButton == null) {
        this.buttonClick(event, menuId);
        return;
    }
  
    // [END MODIFIED]

    // Find the target button element.

    if (browser.isIE){
        button = window.event.srcElement;
    }else{
        button = event.currentTarget;
    }

    // If any other button menu is active, make this one active instead.
    if (this.activeButton != null && this.activeButton != button){
        this.buttonClick(event, menuId);
    }
    
}

function depressButton(button) {

    var x, y;

    // Update the button's style class to make it look like it's
    // depressed.

    button.className += " "+this.prefixe+"menuButtonActive";

    // [MODIFIED] Added for activate/deactivate on mouseover.

    // Set mouseout event handler for the button, if not already done.

    if (button.onmouseout == null){
        //alert('button.id:'+button.id);
        button.onmouseout = this.buttonOrMenuMouseout;
        //passem la referčncia a l'objecte actual
        button.obj = this;
    }
    
    if (button.menu.onmouseout == null){
        //alert('button.menu.id:(2)'+button.menu.id);
        button.menu.onmouseout = this.buttonOrMenuMouseout;
        //passem la referčncia a l'objecte actual
        button.menu.obj = this;
    }

    // [END MODIFIED]

    // Position the associated drop down menu under the button and
    // show it.

    /*
    x = getPageOffsetLeft(button);
    y = getPageOffsetTop(button) + button.offsetHeight;
    */
    //x = getPageOffsetLeft(button)+ button.offsetWidth+9;
    x = 169;
    y = this.getPageOffsetTop(button);

    // For IE, adjust position.

    if (browser.isIE) {
        /*uep*/
        //x += button.offsetParent.clientLeft;
        //y += button.offsetParent.clientTop;
    }

    button.menu.style.left = x + "px";
    button.menu.style.top  = y + "px";
    button.menu.style.visibility = "visible";
    
    this.me_ShowHide(button.menu,true)

}

function resetButton(button) {

    // Restore the button's style class.
    this.removeClassName(button, this.prefixe+"menuButtonActive");
    
    if (this.mode == 'submenu'){
        //alert('button.id:'+button.id+'\nbutton.menu:'+button.menu);
    }

    // Hide the button's menu, first closing any sub menus.
    if (this.mode !='submenu'){
        if (button.menu != null) {
            this.closeSubMenu(button.menu);
            button.menu.style.visibility = "hidden";
            this.me_ShowHide(button.menu,false)
        }
    }else{
        this.closeSubMenu(button);
        //button.style.visibility = "hidden";
        //this.me_ShowHide(button,false)
    }
}

//----------------------------------------------------------------------------
// Code to handle the menus and sub menus.
//----------------------------------------------------------------------------

function menuMouseover(event) {

    var menu;

    // Find the target menu element.
    if (browser.isIE){
        menu = this.getContainerWith(window.event.srcElement, "DIV", this.prefixe+"menu");
    }else{
        menu = event.currentTarget;
    }
    
    // Close any active sub menu.
    if (menu.activeItem != null){
        this.closeSubMenu(menu);
    }
    
}

function menuItemMouseover(event, menuId) {

    var item, menu, x, y;

    // Find the target item element and its parent menu element.
    if (browser.isIE){
        item = this.getContainerWith(window.event.srcElement, "A", this.prefixe+"menuItem") || this.getContainerWith(window.event.srcElement, "A", this.prefixe+"firstMenuItem") || this.getContainerWith(window.event.srcElement, "A", this.prefixe+"menuItem2") || this.getContainerWith(window.event.srcElement, "A", this.prefixe+"firstMenuItem2");
    }else{
        item = event.currentTarget;
    }
    menu = this.getContainerWith(item, "DIV", this.prefixe+"menu");
    
    // Close any active sub menu and mark this one as active.
    if (menu.activeItem != null){
        this.closeSubMenu(menu);
    }
    menu.activeItem = item;
    
    // Highlight the item element.
    
    item.className += " "+this.prefixe+"menuItemHighlight";
    
    // Initialize the sub menu, if not already done.

    if (item.subMenu == null) {
        item.subMenu = document.getElementById(this.prefixe+menuId);
        if (item.subMenu.isInitialized == null){
            this.menuInit(item.subMenu);
        }
    }
    
    // [MODIFIED] Added for activate/deactivate on mouseover.

    // Set mouseout event handler for the sub menu, if not already done.
    if (item.subMenu.onmouseout == null){
        if (this.mode != 'submenu'){
            item.subMenu.onmouseout = this.buttonOrMenuMouseout;
        }else{
            item.subMenu.onmouseout = this.buttonOrMenuMouseout2;
        }
        item.subMenu.obj = this;
    }
    
    // [END MODIFIED]

    // Get position for submenu based on the menu item.

    x = this.getPageOffsetLeft(item) + item.offsetWidth+1;
    y = this.getPageOffsetTop(item);

    // Adjust position to fit in view.

    var maxX, maxY;

    if (browser.isIE) {
        maxX = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) + (document.documentElement.clientWidth != 0 ? document.documentElement.clientWidth : document.body.clientWidth);
        maxY = Math.max(document.documentElement.scrollTop, document.body.scrollTop) +(document.documentElement.clientHeight != 0 ? document.documentElement.clientHeight : document.body.clientHeight);
    }
    if (browser.isOP) {
        maxX = document.documentElement.scrollLeft + window.innerWidth;
        maxY = document.documentElement.scrollTop  + window.innerHeight;
    }
    if (browser.isNS) {
        maxX = window.scrollX + window.innerWidth;
        maxY = window.scrollY + window.innerHeight;
    }
    maxX -= item.subMenu.offsetWidth;
    maxY -= item.subMenu.offsetHeight;

    if (x > maxX){
        x = Math.max(0, x - item.offsetWidth - item.subMenu.offsetWidth + (menu.offsetWidth - item.offsetWidth));
    }
    y = Math.max(0, Math.min(y, maxY));

    // Position and show the sub menu.

    item.subMenu.style.left = x + "px";
    item.subMenu.style.top  = y + "px";
    item.subMenu.style.visibility = "visible";

    // Stop the event from bubbling.
    if (browser.isIE){
        window.event.cancelBubble = true;
    }else{
        event.stopPropagation();
    }
}

function closeSubMenu(menu) {

    if (menu == null || menu.activeItem == null){
        return;
    } 
    
    // Recursively close any sub menus.
    if (menu.activeItem.subMenu != null) {
        this.closeSubMenu(menu.activeItem.subMenu);
        menu.activeItem.subMenu.style.visibility = "hidden";
        menu.activeItem.subMenu = null;
    }
    this.removeClassName(menu.activeItem, this.prefixe+"menuItemHighlight");
    menu.activeItem = null;
}

// [MODIFIED] Added for activate/deactivate on mouseover. Handler for mouseout
// event on buttons and menus.

function buttonOrMenuMouseout(event) {

    var el;
    
    // If there is no active button, exit.
    if (this.obj.activeButton == null){
        return;
    }

    // Find the element the mouse is moving to.
    if (browser.isIE){
        el = window.event.toElement;
    }else if (event.relatedTarget != null){
        el = (event.relatedTarget.tagName ? event.relatedTarget : event.relatedTarget.parentNode);
    }
    
    // If the element is not part of a menu, reset the active button.
    //if (this.getContainerWith(el, "DIV", this.prefixe+"menu") == null) {
    if (this.obj.getContainerWith(el, "DIV", this.obj.prefixe+"menu") == null) {
        this.obj.resetButton(this.obj.activeButton);
        this.obj.activeButton = null;
    }
    
}

//mčtode personalitzat pel submenu
function buttonOrMenuMouseout2(event) {

    var el;
    
    // If there is no active button, exit.
    if (this.obj.activeButton == null){
        return;
    }
        
    // Find the element the mouse is moving to.
    if (browser.isIE){
        el = window.event.toElement;
    }else if (event.relatedTarget != null){
        el = (event.relatedTarget.tagName ? event.relatedTarget : event.relatedTarget.parentNode);
    }
    
    // If the element is not part of a menu, reset the active button.
    
    //alert(el);
    
    //this.obj.removeClassName(document.getElementById(this.obj.activeButton), this.obj.prefixe+"menuButtonActive");
    //document.getElementById(this.id).style.visibility='hidden';
    //this.obj.resetButton(this.id);
    //if (this.obj.getContainerWith(el, "DIV", this.obj.prefixe+"menu") == null) {
    /*
    if (this.obj.getContainerWith(el, "DIV", this.obj.prefixe+"menu")) {
        alert('sad');
        this.obj.resetButton(this.obj.activeButton);
        //this.obj.activeButton = null;
    }
    */
    
    
    var menu = document.getElementById(this.obj.activeButton);
    
    // Close any active sub menu and mark this one as active.
    if (menu.activeItem != null){
        this.obj.closeSubMenu(menu);
    }
    
    
}

// [END MODIFIED]

//----------------------------------------------------------------------------
// Code to initialize menus.
//----------------------------------------------------------------------------

function menuInit(menu) {

    var itemList, spanList;
    var textEl, arrowEl;
    var itemWidth;
    var w, dw;
    var i, j;

    // For IE, replace arrow characters.
    if (browser.isIE) {
        menu.style.lineHeight = "2.5ex";
        spanList = menu.getElementsByTagName("SPAN");
        for (i = 0; i < spanList.length; i++){
            if (this.hasClassName(spanList[i], this.prefixe+"menuItemArrow")) {
                spanList[i].style.fontFamily = "Webdings";
                spanList[i].firstChild.nodeValue = "4";
            }
        }
    }

    // Find the width of a menu item.

    itemList = menu.getElementsByTagName("A");
    if (itemList.length > 0){
        itemWidth = itemList[0].offsetWidth;
    }else{
        return;
    }

    // For items with arrows, add padding to item text to make the
    // arrows flush right.
    for (i = 0; i < itemList.length; i++) {
        spanList = itemList[i].getElementsByTagName("SPAN");
        textEl  = null;
        arrowEl = null;
        for (j = 0; j < spanList.length; j++) {
            if (this.hasClassName(spanList[j], this.prefixe+"menuItemText")){
                textEl = spanList[j];
            }
            if (this.hasClassName(spanList[j], this.prefixe+"menuItemArrow")){
                arrowEl = spanList[j];
            }
        }
        if (textEl != null && arrowEl != null) {
            textEl.style.paddingRight = (itemWidth - (textEl.offsetWidth + arrowEl.offsetWidth)) + "px";
            // For Opera, remove the negative right margin to fix a display bug.
            if (browser.isOP){
                arrowEl.style.marginRight = "0px";
            }
        }
    }

    // Fix IE hover problem by setting an explicit width on first item of the menu.
    if (browser.isIE) {
        w = itemList[0].offsetWidth;
        itemList[0].style.width = w + "px";
        dw = itemList[0].offsetWidth - w;
        w -= dw;
        itemList[0].style.width = w + "px";
    }

    // Mark menu as initialized.
    menu.isInitialized = true;
    
}

//----------------------------------------------------------------------------
// General utility functions.
//----------------------------------------------------------------------------

function getContainerWith(node, tagName, className) {

    // Starting with the given node, find the nearest containing element
    // with the specified tag name and style class.
    
    while (node != null) {
        if (node.tagName != null && node.tagName == tagName && this.hasClassName(node, className)){
            return node;
        }
        node = node.parentNode;
    }

    return node;
  
}

function hasClassName(el, name) {

    var i, list;

    // Return true if the given element currently has the given class
    // name.

    list = el.className.split(" ");
    for (i = 0; i < list.length; i++){
        if (list[i] == name){
            return true;
        }
    }
    
    return false;
    
}

function removeClassName(el, name) {

    var i, curList, newList;

    if (el.className == null){
        return;
    }

    // Remove the given class name from the element's className property.
    newList = new Array();
    curList = el.className.split(" ");
    for (i = 0; i < curList.length; i++){
        if (curList[i] != name){
            newList.push(curList[i]);
        }
    }
    
    el.className = newList.join(" ");
    
}

function getPageOffsetLeft(el) {

    var x;

    // Return the x coordinate of an element relative to the page.

    x = el.offsetLeft;
    if (el.offsetParent != null){
        x += this.getPageOffsetLeft(el.offsetParent);
    }

    return x;
    
}

function getPageOffsetTop(el) {

    var y;

    // Return the x coordinate of an element relative to the page.
    y = el.offsetTop;
    if (el.offsetParent != null){
        y += this.getPageOffsetTop(el.offsetParent);
    }
    return y;
}

function me_ShowHide(objLayer, oculta){

    if (!DynAPI.document.all[objLayer.id]) {
        return;
    }
    DynAPI.document.all[objLayer.id].updateValues();
    if (oculta){
        setTimeout('ComboHide.hide(DynAPI.document.all[\''+objLayer.id+'\'])', 20);    
    }else{
        ComboHide.show();
    }
    
}
/*final*/