/*
 *         developed by Matteo Bicocchi on JQuery
 *        © 2002-2009 Open Lab srl, Matteo Bicocchi
 *			    www.open-lab.com - info@open-lab.com
 *       	version 2.7
 *       	tested on: 	Explorer and FireFox for PC
 *                  		FireFox and Safari for Mac Os X
 *                  		FireFox for Linux
 *         MIT (MIT-LICENSE.txt) licenses.
 */
// to get the element that is fireing a contextMenu event you have $.mbMenu.lastContextMenuEl that returns an object.

(function(a) {
  a.mbMenu = {actualMenuOpener:false, options:{template:"yourMenuVoiceTemplate", additionalData:"", menuSelector:".menuContainer", menuWidth:150, openOnRight:false, containment:"window", iconPath:"ico/", hasImages:true, fadeInTime:100, fadeOutTime:200, menuTop:0, menuLeft:0, submenuTop:0, submenuLeft:4, opacity:1, shadow:false, shadowColor:"black", shadowOpacity:0.2, openOnClick:true, closeOnMouseOut:false, closeAfter:500, minZindex:"auto", hoverIntent:0, submenuHoverIntent:0, onContextualMenu:function() {
  }}, buildMenu:function(b) {
    return this.each(function() {
      var c = this;
      c.id = !this.id ? "menu_" + Math.floor(Math.random() * 1E3) : this.id;
      this.options = {};
      a.extend(this.options, a.mbMenu.options);
      a.extend(this.options, b);
      a(".menu").hide();
      c.clicked = false;
      c.rootMenu = false;
      c.clearClicked = false;
      c.actualOpenedMenu = false;
      c.menuvoice = false;
      var i = a(this), f = this.options.openOnClick, h = this.options.closeOnMouseOut;
      a(i).each(function() {
        if(a.metadata) {
          a.metadata.setType("class");
          c.menuvoice = a(this).find(".rootVoice");
          a(c.menuvoice).each(function() {
            a(this).metadata().menu && a(this).attr("menu", a(this).metadata().menu)
          })
        }
        c.menuvoice = a(this).find("[menu]");
        a(c.menuvoice).each(function() {
          a(this).addClass("rootVoice");
          a(this).attr("nowrap", "nowrap")
        });
        f && a(c.menuvoice).bind("click", function() {
          if(a(this).attr("isOpen")) {
            a(this).removeMbMenu(c, true);
            a(this).addClass("selected")
          }else {
            a(this).buildMbMenu(c, a(this).attr("menu"));
            a(this).attr("isOpen", "true")
          }
          if(a(this).attr("menu") == "empty") {
            if(c.actualOpenedMenu) {
              a(c.actualOpenedMenu).removeClass("selected");
              c.clicked = true;
              a(this).removeAttr("isOpen");
              clearTimeout(c.clearClicked)
            }
            a(this).removeMbMenu(c)
          }
          return false
        });
        var p = a.browser.msie ? "mouseenter" : "mouseover", q = a.browser.msie ? "mouseleave" : "mouseout";
        if(this.options.hoverIntent == 0) {
          a(c.menuvoice).bind(p, function() {
            h && clearTimeout(a.mbMenu.deleteOnMouseOut);
            f || a(c).find(".selected").removeClass("selected");
            c.actualOpenedMenu && a(c.actualOpenedMenu).removeClass("selected");
            a(this).addClass("selected");
            if((c.clicked || !f) && !a(this).attr("isOpen")) {
              clearTimeout(c.clearClicked);
              a(this).buildMbMenu(c, a(this).attr("menu"));
              if(a(this).attr("menu") == "empty") {
                a(this).removeMbMenu(c);
                a(this).removeAttr("isOpen")
              }
            }
          });
          a(c.menuvoice).bind(q, function() {
            if(h) {
              a.mbMenu.deleteOnMouseOut = setTimeout(function() {
                a(this).removeMbMenu(c, true)
              }, a(i)[0].options.closeAfter)
            }
            c.clicked || a(this).removeClass("selected");
            a(document).bind("click", function() {
              a(this).removeMbMenu(c, true)
            })
          })
        }else {
          a(c.menuvoice).hoverIntent({over:function() {
            h && clearTimeout(a.mbMenu.deleteOnMouseOut);
            f || a(c).find(".selected").removeClass("selected");
            c.actualOpenedMenu && a(c.actualOpenedMenu).removeClass("selected");
            a(this).addClass("selected");
            if((c.clicked || !f) && !a(this).attr("isOpen")) {
              clearTimeout(c.clearClicked);
              a(this).buildMbMenu(c, a(this).attr("menu"));
              if(a(this).attr("menu") == "empty") {
                a(this).removeMbMenu(c);
                a(this).removeAttr("isOpen")
              }
            }
          }, sensitivity:30, interval:this.options.hoverIntent, timeout:0, out:function() {
            if(h) {
              a.mbMenu.deleteOnMouseOut = setTimeout(function() {
                a(this).removeMbMenu(c, true)
              }, a(i)[0].options.closeAfter)
            }
            c.clicked || a(this).removeClass("selected");
            a(document).bind("click", function() {
              a(this).removeMbMenu(c, true)
            })
          }})
        }
      })
    })
  }, buildContextualMenu:function(b) {
    return this.each(function() {
      var c = this;
      c.options = {};
      a.extend(c.options, a.mbMenu.options);
      a.extend(c.options, b);
      a(".mbmenu").hide();
      c.clicked = false;
      c.rootMenu = false;
      c.clearClicked = false;
      c.actualOpenedMenu = false;
      c.menuvoice = false;
      var i;
      if(a.metadata) {
        a.metadata.setType("class");
        i = a(this).find(".cmVoice");
        a(i).each(function() {
          a(this).metadata().cMenu && a(this).attr("cMenu", a(this).metadata().cMenu)
        })
      }
      i = a(this).find("[cMenu]");
      a(i).each(function() {
        a(this).css("-khtml-user-select", "none");
        var f = this;
        f.id = !f.id ? "menu_" + Math.floor(Math.random() * 100) : f.id;
        a(f).css({cursor:"default"});
        a(f).bind("contextmenu", "mousedown", function(h) {
          h.preventDefault();
          h.stopPropagation();
          h.cancelBubble = true;
          a.mbMenu.lastContextMenuEl = f;
          a.mbMenu.options.actualMenuOpener && a(c).removeMbMenu(a.mbMenu.options.actualMenuOpener);
          c.options.onContextualMenu(this, h);
          a(this).buildMbMenu(c, a(this).attr("cMenu"), "cm", h);
          a(this).attr("isOpen", "true")
        })
      })
    })
  }};
  a.fn.extend({buildMbMenu:function(b, c, i, f) {
    var h = a.browser.msie && a.browser.version == "6.0", p = a.browser.msie ? "mouseenter" : "mouseover", q = a.browser.msie ? "mouseleave" : "mouseout";
    if(f) {
      this.mouseX = a(this).getMouseX(f);
      this.mouseY = a(this).getMouseY(f)
    }
    a.mbMenu.options.actualMenuOpener && a.mbMenu.options.actualMenuOpener != b && a(b).removeMbMenu(a.mbMenu.options.actualMenuOpener);
    a.mbMenu.options.actualMenuOpener = b;
    if(!i || i == "cm") {
      if(b.rootMenu) {
        a(b.rootMenu).removeMbMenu(b);
        a(b.actualOpenedMenu).removeAttr("isOpen")
      }
      b.clicked = true;
      b.actualOpenedMenu = this;
      a(b.actualOpenedMenu).attr("isOpen", "true");
      a(b.actualOpenedMenu).addClass("selected")
    }
    var d = this;
    f = !i || i == "cm" ? a(document.body) : a(this).parent().parent();
    if(a(this).attr("menu") != "empty") {
      var l = b.options.menuSelector.replace(".", "");
      f.append("<div class='menuDiv'><div class='" + l + "' style='display:table'></div></div>");
      this.menu = f.find(".menuDiv");
      a(this.menu).css({width:0, height:0});
      b.options.minZindex != "auto" ? a(this.menu).css({zIndex:b.options.minZindex++}) : a(this.menu).mb_BringToFront();
      this.menuContainer = a(this.menu).find(b.options.menuSelector);
      a(this.menuContainer).bind(p, function() {
        a(d).addClass("selected")
      });
      a(this.menuContainer).css({position:"absolute", opacity:b.options.opacity});
      a("#" + c).html() || a.ajax({type:"POST", url:b.options.template, cache:false, async:false, data:"menuId=" + c + (b.options.additionalData != "" ? "&" + b.options.additionalData : ""), success:function(g) {
        a("body").append(g);
        a("#" + c).hide()
      }});
      a(this.menuContainer).hide();
      this.voices = a("#" + c).find("a").clone();
      if(b.options.shadow) {
        var k = a("<div class='menuShadow'></div>").hide();
        if(h) {
          k = a("<iframe class='menuShadow'></iframe>").hide()
        }
      }
      if(a.metadata) {
        a.metadata.setType("class");
        a(this.voices).each(function() {
          a(this).metadata().disabled && a(this).attr("disabled", a(this).metadata().disabled);
          a(this).metadata().img && a(this).attr("img", a(this).metadata().img);
          a(this).metadata().menu && a(this).attr("menu", a(this).metadata().menu);
          a(this).metadata().action && a(this).attr("action", a(this).metadata().action);
          a(this).metadata().disabled && a(this).attr("disabled", a(this).metadata().disabled)
        })
      }
      a(this.voices).each(function(g) {
        var e = this, j = "", o = a(e).attr("rel") == "text", s = a(e).attr("rel") == "title", r = a(e).is("[disabled]"), w = a(e).attr("rel") == "separator";
        if(b.options.hasImages && !o) {
          j = a(e).attr("img") ? a(e).attr("img") : "blank.gif";
          j = j.length > 3 && j.indexOf(".") > -1 ? "<img class='imgLine' src='" + b.options.iconPath + j + "'>" : j;
          j = "<td class='img'>" + j + "</td>"
        }
        j = "<table id='" + c + "_" + g + "' class='line" + (s ? " title" : "") + "' cellspacing='0' cellpadding='0' border='0' style='width:100%; display:table' width='100%'><tr>" + j + "<td class='voice' nowrap></td></tr></table>";
        if(w) {
          j = "<div class='separator' style='width:100%; display:inline-block'><img src='" + b.options.iconPath + "blank.gif' width='1' height='1'></div>"
        }
        if(o) {
          j = "<div style='width:100%; display:table' class='line' id='" + c + "_" + g + "'><div class='voice'></div></div>"
        }
        a(d.menuContainer).append(j);
        if(!w) {
          a(d.menuContainer).find("#" + c + "_" + g).find(".voice").append(this);
          if(a(this).attr("menu")) {
            a(d.menuContainer).find("#" + c + "_" + g).find(".voice a").wrap("<div class='menuArrow'></div>");
            a(d.menuContainer).find("#" + c + "_" + g).find(".menuArrow").addClass("subMenuOpener");
            a(d.menuContainer).find("#" + c + "_" + g).css({cursor:"default"});
            this.isOpener = true
          }
          if(o) {
            a(d.menuContainer).find("#" + c + "_" + g).find(".voice").addClass("textBox");
            this.isOpener = true
          }
          r && a(d.menuContainer).find("#" + c + "_" + g).addClass("disabled").css({cursor:"default"});
          if(!(o || s || r)) {
            a(d.menuContainer).find("#" + c + "_" + g).css({cursor:"pointer"});
            if(b.options.submenuHoverIntent == 0) {
              a(d.menuContainer).find("#" + c + "_" + g).bind("mouseover", function(m) {
                clearTimeout(a.mbMenu.deleteOnMouseOut);
                a(this).addClass("selected");
                if(d.menuContainer.actualSubmenu && !a(e).attr("menu")) {
                  a(d.menu).find(".menuDiv").remove();
                  a(d.menuContainer.actualSubmenu).removeClass("selected");
                  d.menuContainer.actualSubmenu = false
                }
                if(a(e).attr("menu")) {
                  if(d.menuContainer.actualSubmenu && d.menuContainer.actualSubmenu != this) {
                    a(d.menu).find(".menuDiv").remove();
                    a(d.menuContainer.actualSubmenu).removeClass("selected");
                    d.menuContainer.actualSubmenu = false
                  }
                  a(e).attr("action") || a(d.menuContainer).find("#" + c + "_" + g).css("cursor", "default");
                  if(!d.menuContainer.actualSubmenu || d.menuContainer.actualSubmenu != this) {
                    a(d.menu).find(".menuDiv").remove();
                    d.menuContainer.actualSubmenu = false;
                    a(this).buildMbMenu(b, a(e).attr("menu"), "sm", m);
                    d.menuContainer.actualSubmenu = this
                  }
                  a(this).attr("isOpen", "true");
                  return false
                }
              })
            }else {
              a(d.menuContainer).find("#" + c + "_" + g).bind("mouseover", function() {
                clearTimeout(a.mbMenu.deleteOnMouseOut);
                a(this).addClass("selected")
              });
              a(d.menuContainer).find("#" + c + "_" + g).hoverIntent({over:function(m) {
                if(d.menuContainer.actualSubmenu && !a(e).attr("menu")) {
                  a(d.menu).find(".menuDiv").remove();
                  a(d.menuContainer.actualSubmenu).removeClass("selected");
                  d.menuContainer.actualSubmenu = false
                }
                if(a(e).attr("menu")) {
                  if(d.menuContainer.actualSubmenu && d.menuContainer.actualSubmenu != this) {
                    a(d.menu).find(".menuDiv").remove();
                    a(d.menuContainer.actualSubmenu).removeClass("selected");
                    d.menuContainer.actualSubmenu = false
                  }
                  a(e).attr("action") || a(d.menuContainer).find("#" + c + "_" + g).css("cursor", "default");
                  if(!d.menuContainer.actualSubmenu || d.menuContainer.actualSubmenu != this) {
                    a(d.menu).find(".menuDiv").remove();
                    d.menuContainer.actualSubmenu = false;
                    a(this).buildMbMenu(b, a(e).attr("menu"), "sm", m);
                    d.menuContainer.actualSubmenu = this
                  }
                  a(this).attr("isOpen", "true");
                  return false
                }
              }, out:function() {
              }, sensitivity:30, interval:b.options.submenuHoverIntent, timeout:0})
            }
            a(d.menuContainer).find("#" + c + "_" + g).bind(q, function() {
              a(this).removeClass("selected")
            })
          }
          if(r || s || o) {
            a(this).removeAttr("href");
            a(d.menuContainer).find("#" + c + "_" + g).bind(p, function() {
              a(document).unbind("click");
              x && clearTimeout(a.mbMenu.deleteOnMouseOut);
              if(d.menuContainer.actualSubmenu) {
                a(d.menu).find(".menuDiv").remove();
                d.menuContainer.actualSubmenu = false
              }
            }).css("cursor", "default")
          }
          a(d.menuContainer).find("#" + c + "_" + g).bind("click", function() {
            if((a(e).attr("action") || a(e).attr("href")) && !r) {
              var m = a(e).attr("target") ? a(e).attr("target") : "_self";
              if(a(e).attr("href") && a(e).attr("href").indexOf("javascript:") > -1) {
                a(e).attr("action", a(e).attr("href").replace("javascript:", ""));
                a(e).removeAttr("href")
              }
              m = a(e).attr("action") ? a(e).attr("action") : "window.open('" + a(e).attr("href") + "', '" + m + "')";
              a(e).removeAttr("href");
              eval(m);
              a(this).removeMbMenu(b, true)
            }else {
              if(a(e).attr("menu")) {
                return false
              }
            }
          })
        }
      });
      var x = a(b)[0].options.closeOnMouseOut;
      if(x) {
        a(d.menuContainer).bind("mouseenter", function() {
          clearTimeout(a.mbMenu.deleteOnMouseOut)
        });
        a(d.menuContainer).bind("mouseleave", function() {
          var g = a.mbMenu.options.actualMenuOpener;
          a.mbMenu.deleteOnMouseOut = setTimeout(function() {
            a(this).removeMbMenu(g, true)
          }, a(b)[0].options.closeAfter)
        })
      }
      l = h = 0;
      a(this.menuContainer).css({width:b.options.menuWidth});
      a.browser.msie && a(this.menuContainer).css("width", a(this.menuContainer).width() + 2);
      switch(i) {
        case "sm":
          h = a(this).position().top + b.options.submenuTop;
          l = a(this).position().left + a(this).width() - b.options.submenuLeft;
          break;
        case "cm":
          h = this.mouseY - 5;
          l = this.mouseX - 5;
          break;
        default:
          if(b.options.openOnRight) {
            h = a(this).offset().top - (a.browser.msie ? 2 : 0) + b.options.menuTop;
            l = a(this).offset().left + a(this).outerWidth() - b.options.menuLeft - (a.browser.msie ? 2 : 0)
          }else {
            h = a(this).offset().top + a(this).outerHeight() - (!a.browser.mozilla ? 2 : 0) + b.options.menuTop;
            l = a(this).offset().left + b.options.menuLeft
          }
          break
      }
      a(this.menu).css({position:"absolute", top:h, left:l});
      if(!i || i == "cm") {
        b.rootMenu = this.menu
      }
      a(this.menuContainer).bind(q, function() {
        a(document).bind("click", function() {
          a(document).removeMbMenu(b, true)
        })
      });
      b.options.fadeInTime > 0 ? a(this.menuContainer).fadeIn(b.options.fadeInTime) : a(this.menuContainer).show();
      if(b.options.shadow) {
        a(this.menu).prepend(k);
        k.css({width:a(this.menuContainer).outerWidth(), height:a(this.menuContainer).outerHeight() - 1, position:"absolute", backgroundColor:b.options.shadowColor, border:0, opacity:b.options.shadowOpacity}).show()
      }
      var t = b.options.containment == "window" ? a(window).height() : a("#" + b.options.containment).offset().top + a("#" + b.options.containment).outerHeight(), n = b.options.containment == "window" ? a(window).width() : a("#" + b.options.containment).offset().left + a("#" + b.options.containment).outerWidth(), u = a(this.menuContainer).outerHeight();
      k = k ? k.outerWidth() : a(this.menuContainer).outerWidth();
      var v = a(f.find(".menuDiv:first")).offset().left - a(window).scrollLeft();
      f = a(f.find(".menuDiv:first")).offset().top - a(window).scrollTop();
      switch(i) {
        case "sm":
          if(v + k >= n && k < n) {
            l -= b.options.menuWidth * 2 - b.options.submenuLeft * 2
          }
          break;
        case "cm":
          if(v + b.options.menuWidth * 1.5 >= n && k < n) {
            l -= b.options.menuWidth - b.options.submenuLeft
          }
          break;
        default:
          if(v + k >= n && k < n) {
            l -= a(this.menuContainer).offset().left + k - n + 1
          }
          break
      }
      if(f + u >= t - 10 && u < t) {
        h -= f + u - t + 10
      }
      a(this.menu).css({top:h, left:l})
    }
  }, removeMbMenu:function(b, c) {
    if(!b) {
      b = a.mbMenu.options.actualMenuOpener
    }
    if(b.rootMenu) {
      a(b.actualOpenedMenu).removeAttr("isOpen").removeClass("selected");
      a(b.rootMenu).css({width:1, height:1});
      c ? a(b.rootMenu).fadeOut(b.options.fadeOutTime, function() {
        a(this).remove()
      }) : a(b.rootMenu).remove();
      b.rootMenu = false;
      b.clicked = false;
      a(document).unbind("click")
    }
  }, getMouseX:function(b) {
    b = a.browser.msie ? b.clientX + document.documentElement.scrollLeft : b.pageX;
    if(b < 0) {
      b = 0
    }
    return b
  }, getMouseY:function(b) {
    b = a.browser.msie ? b.clientY + document.documentElement.scrollTop : b.pageY;
    if(b < 0) {
      b = 0
    }
    return b
  }, mb_BringToFront:function() {
    var b = 10;
    a("*").each(function() {
      if(a(this).css("position") == "absolute") {
        b = parseInt(a(this).css("zIndex")) > b ? parseInt(a(this).css("zIndex")) : b
      }
    });
    a(this).css("zIndex", b += 10)
  }});
  a.fn.buildMenu = a.mbMenu.buildMenu;
  a.fn.buildContextualMenu = a.mbMenu.buildContextualMenu
})(jQuery);