



function DropDownMenuX(id){

    
    this.type="horizontal";

    
    this.delay={
        "show":0,
        "hide":0
}
    
    this.position={
        "level1":{"top":0,"left":0},
        "levelX":{"top":0,"left":0}
}

    
    this.fixIeSelectBoxBug=true;

    
    this.zIndex={
        "visible":1000,
        "hidden":-1
};

    
    this.browser={
        "ie":Boolean(document.body.currentStyle),
        "ie5":(navigator.appVersion.indexOf("MSIE 5.5") !=-1||navigator.appVersion.indexOf("MSIE 5.0") !=-1),
        "ie6":(navigator.appVersion.indexOf("MSIE 6.0") !=-1)
};
    
    if(!this.browser.ie){
        this.browser.ie5=false;
        this.browser.ie6=false;
}

    
    this.init=function(){
        if(!document.getElementById(this.id)){return alert("DropDownMenuX.init() failed. Element '"+this.id+"' does not exist.");}
        if(this.type !="horizontal" && this.type !="vertical"){return alert("DropDownMenuX.init() failed. Unknown menu type: '"+this.type+"'");}
        if(this.browser.ie && this.browser.ie5){fixWrap();}
        fixSections();
        parse(document.getElementById(this.id).childNodes,this.tree,this.id);
}

    
    function fixSections(){
        var arr=document.getElementById(self.id).getElementsByTagName("div");
        var sections=new Array();
        var widths=new Array();
        
        for(var i=0;i<arr.length;i++){
            if(arr[i].className=="section"){
                sections.push(arr[i]);
}
}
        for(var i=0;i<sections.length;i++){
            widths.push(getMaxWidth(sections[i].childNodes));
}
        for(var i=0;i<sections.length;i++){
            sections[i].style.width=(widths[i])+"px";
}
        if(self.browser.ie){
            for(var i=0;i<sections.length;i++){
                setMaxWidth(sections[i].childNodes,widths[i]);
}
}
}

    function fixWrap(){
        var elements=document.getElementById(self.id).getElementsByTagName("a");
        for(var i=0;i<elements.length;i++){
            if(/item2/.test(elements[i].className)){
                elements[i].innerHTML='<div nowrap="nowrap">'+elements[i].innerHTML+'</div>';
}
}
}

    
    function getMaxWidth(nodes){
        var maxWidth=0;
        for(var i=0;i<nodes.length;i++){
            if(nodes[i].nodeType !=1||/section/.test(nodes[i].className)){continue;}
            if(nodes[i].offsetWidth>maxWidth){maxWidth=nodes[i].offsetWidth;}
}
        return maxWidth;
}

    
    function setMaxWidth(nodes,maxWidth){
        for(var i=0;i<nodes.length;i++){
            if(nodes[i].nodeType==1 &&/item2/.test(nodes[i].className) && nodes[i].currentStyle){
                if(self.browser.ie5){
                    nodes[i].style.width=(maxWidth)+"px";
}else{
                    nodes[i].style.width=(maxWidth-parseInt(nodes[i].currentStyle.paddingLeft)-parseInt(nodes[i].currentStyle.paddingRight))+"px";
}
}
}
}

    
    function parse(nodes,tree,id){
        for(var i=0;i<nodes.length;i++){
            if(1 !=nodes[i].nodeType){
                continue;
}
            switch(true){
                
                case/\bitem1\b/.test(nodes[i].className):
                    nodes[i].id=id+"-"+tree.length;
                    tree.push(new Array());
                    nodes[i].onmouseover=itemOver;
                    nodes[i].onmouseout=itemOut;
                    break;
                
                case/\bitem2\b/.test(nodes[i].className):
                    nodes[i].id=id+"-"+tree.length;
                    tree.push(new Array());
                    nodes[i].onmouseover=itemOver;
                    nodes[i].onmouseout=itemOut;
                    break;
                
                case/\bsection\b/.test(nodes[i].className):
                    
                    nodes[i].id=id+"-"+(tree.length-1)+"-section";
                    nodes[i].onmouseover=sectionOver;
                    nodes[i].onmouseout=sectionOut;
                    
                    var box1=document.getElementById(id+"-"+(tree.length-1));
                    var box2=document.getElementById(nodes[i].id);
                    var el=new Element(box1.id);
                    if(1==el.level){
                        if("horizontal"==self.type){
                            box2.style.top=box1.offsetTop+box1.offsetHeight+self.position.level1.top+"px";
                            if(self.browser.ie5){
                                box2.style.left=self.position.level1.left+"px";
}else{
                                box2.style.left=box1.offsetLeft+self.position.level1.left+"px";
}
}else if("vertical"==self.type){
                            box2.style.top=box1.offsetTop+self.position.level1.top+"px";
                            if(self.browser.ie5){
                                box2.style.left=box1.offsetWidth+self.position.level1.left+"px";
}else{
                                box2.style.left=box1.offsetLeft+box1.offsetWidth+self.position.level1.left+"px";
}
}
}else{
                        box2.style.top=box1.offsetTop+self.position.levelX.top+"px";
                        box2.style.left=box1.offsetLeft+box1.offsetWidth+self.position.levelX.left+"px";
}
                    
                    self.sections.push(nodes[i].id);
                    self.sectionsShowCnt.push(0);
                    self.sectionsHideCnt.push(0);
                    if(self.fixIeSelectBoxBug && self.browser.ie6){
                        nodes[i].innerHTML=nodes[i].innerHTML+'<iframe id="'+nodes[i].id+'-iframe" src="javascript:false;" scrolling="no" frameborder="0" style="position: absolute; top: 0px; left: 0px; display: none; filter:alpha(opacity=0);"></iframe>';
}
                    break;
}
            if(nodes[i].childNodes){
                if(/\bsection\b/.test(nodes[i].className)){
                    parse(nodes[i].childNodes,tree[tree.length-1],id+"-"+(tree.length-1));
}else{
                    parse(nodes[i].childNodes,tree,id);
}
}
}
}

    
    function itemOver(){
        
        self.itemShowCnt++;
        var id_section=this.id+"-section";
        if(self.visible.length){
            var el=new Element(self.visible.getLast());
            el=document.getElementById(el.getParent().id);
            if(/item\d-active/.test(el.className)){
                el.className=el.className.replace(/(item\d)-active/,"$1");
}
}
        if(self.sections.contains(id_section)){
            clearTimers();
            self.sectionsHideCnt[self.sections.indexOf(id_section)]++;
            var cnt=self.sectionsShowCnt[self.sections.indexOf(id_section)];
            var timerId=setTimeout(function(a,b){return function(){self.showSection(a,b);}}(id_section,cnt),self.delay.show);
            self.timers.push(timerId);
}else{
            if(self.visible.length){
                clearTimers();
                var timerId=setTimeout(function(a,b){return function(){self.showItem(a,b);}}(this.id,self.itemShowCnt),self.delay.show);
                self.timers.push(timerId);
}
}
}

    
    function itemOut(){
        
        self.itemShowCnt++;
        var id_section=this.id+"-section";
        if(self.sections.contains(id_section)){
            self.sectionsShowCnt[self.sections.indexOf(id_section)]++;
            if(self.visible.contains(id_section)){
                var cnt=self.sectionsHideCnt[self.sections.indexOf(id_section)];
                var timerId=setTimeout(function(a,b){return function(){self.hideSection(a,b);}}(id_section,cnt),self.delay.hide);
                self.timers.push(timerId);
}
}
}

    
    function sectionOver(){
        
        self.sectionsHideCnt[self.sections.indexOf(this.id)]++;
        var el=new Element(this.id);
        var parent=document.getElementById(el.getParent().id);
        if(!/item\d-active/.test(parent.className)){
            parent.className=parent.className.replace(/(item\d)/,"$1-active");
}
}

    
    function sectionOut(){
        
        self.sectionsShowCnt[self.sections.indexOf(this.id)]++;
        var cnt=self.sectionsHideCnt[self.sections.indexOf(this.id)];
        var timerId=setTimeout(function(a,b){return function(){self.hideSection(a,b);}}(this.id,cnt),self.delay.hide);
        self.timers.push(timerId);
}

    
    this.showSection=function(id,cnt){
        if(typeof cnt !="undefined"){
            if(cnt !=this.sectionsShowCnt[this.sections.indexOf(id)]){return;}
}
        
        this.sectionsShowCnt[this.sections.indexOf(id)]++;
        if(this.visible.length){
            if(id==this.visible.getLast()){return;}
            var el=new Element(id);
            var parents=el.getParentSections();
            
            for(var i=this.visible.length-1;i>=0;i--){
                if(parents.contains(this.visible[i])){
                    break;
}else{
                    this.hideSection(this.visible[i]);
}
}
}
        var el=new Element(id);
        var parent=document.getElementById(el.getParent().id);
        if(!/item\d-active/.test(parent.className)){
            parent.className=parent.className.replace(/(item\d)/,"$1-active");
}
        if(document.all){document.getElementById(id).style.display="block";}
        document.getElementById(id).style.visibility="visible";
        document.getElementById(id).style.zIndex=this.zIndex.visible;
        if(this.fixIeSelectBoxBug && this.browser.ie6){
            var div=document.getElementById(id);
            var iframe=document.getElementById(id+"-iframe");
            iframe.style.width=div.offsetWidth+parseInt(div.currentStyle.borderLeftWidth)+parseInt(div.currentStyle.borderRightWidth);
            iframe.style.height=div.offsetHeight+parseInt(div.currentStyle.borderTopWidth)+parseInt(div.currentStyle.borderBottomWidth);
            iframe.style.top=-parseInt(div.currentStyle.borderTopWidth);
            iframe.style.left=-parseInt(div.currentStyle.borderLeftWidth);
            iframe.style.zIndex=div.style.zIndex-1;
            iframe.style.display="block";
}
        this.visible.push(id);
}

    
    this.showItem=function(id,cnt){
        if(typeof cnt !="undefined"){
            if(cnt !=this.itemShowCnt){return;}
}
        this.itemShowCnt++;
        if(this.visible.length){
            var el=new Element(id+"-section");
            var parents=el.getParentSections();
            
            for(var i=this.visible.length-1;i>=0;i--){
                if(parents.contains(this.visible[i])){
                    break;
}else{
                    this.hideSection(this.visible[i]);
}
}
}
}

    
    this.hideSection=function(id,cnt){
        if(typeof cnt !="undefined"){
            if(cnt !=this.sectionsHideCnt[this.sections.indexOf(id)]){return;}
            if(id==this.visible.getLast()){
                
                for(var i=this.visible.length-1;i>=0;i--){
                    this.hideSection(this.visible[i]);
}
                return;
}
}
        
        var el=new Element(id);
        var parent=document.getElementById(el.getParent().id);
        if(/item\d-active/.test(parent.className)){
            parent.className=parent.className.replace(/(item\d)-active/,"$1");
}
        document.getElementById(id).style.zIndex=this.zIndex.hidden;
        document.getElementById(id).style.visibility="hidden";
        if(document.all){document.getElementById(id).style.display="none";}
        if(this.fixIeSelectBoxBug && this.browser.ie6){
            var iframe=document.getElementById(id+"-iframe");
            iframe.style.display="none";
}
        if(this.visible.contains(id)){
            if(id==this.visible.getLast()){
                this.visible.pop();
}else{
                
                return;
}
}else{
            
            return;
}
        this.sectionsHideCnt[this.sections.indexOf(id)]++;
}

    
    function Element(id){
        
        this.menu=self;
        this.id=id;

        
        this.getLevel=function(){
            var s=this.id.substr(this.menu.id.length);
            return s.substrCount("-");
}

        
        this.getParent=function(){
            var s=this.id.substr(this.menu.id.length);
            var a=s.split("-");
            a.pop();
            return new Element(this.menu.id+a.join("-"));
}

        
        this.hasParent=function(){
            var s=this.id.substr(this.menu.id.length);
            var a=s.split("-");
            return a.length>2;
}

        
        this.hasChilds=function(){
            return Boolean(document.getElementById(this.id+"-section"));
}

        
        this.getParentSections=function(){
            var s=this.id.substr(this.menu.id.length);
            s=s.substr(0,s.length-"-section".length);
            var a=s.split("-");
            a.shift();
            a.pop();
            var s=this.menu.id;
            var parents=[];
            for(var i=0;i<a.length;i++){
                s+=("-"+a[i]);
                parents.push(s+"-section");
}
            return parents;
}
        
        this.level=this.getLevel();
}

    
    function clearTimers(){
        for(var i=self.timers.length-1;i>=0;i--){
            clearTimeout(self.timers[i]);
            self.timers.pop();
}
}

    var self=this;
    this.id=id;
    this.tree=[];
    this.sections=[];
    this.sectionsShowCnt=[];
    this.sectionsHideCnt=[];
    this.itemShowCnt=0;
    this.timers=[];this.visible=[];
}


if(typeof Array.prototype.indexOf=="undefined"){
    Array.prototype.indexOf=function(item){
        for(var i=0;i<this.length;i++){
            if(this[i]===item){
                return i;
}
}
        return-1;
}
}


if(typeof Array.prototype.contains=="undefined"){
    Array.prototype.contains=function(s){
        for(var i=0;i<this.length;i++){
            if(this[i]===s){
                return true;
}
}
        return false;
}
}
if(typeof String.prototype.substrCount=="undefined"){
    String.prototype.substrCount=function(s){
        return this.split(s).length-1;
}
}
if(typeof Array.prototype.getLast=="undefined"){
    Array.prototype.getLast=function(){
        return this[this.length-1];
}
}
