﻿var __menuTimer = new Array()


var AJAXMenu = Class.create()
AJAXMenu.prototype = {
    initialize: function(JSONParams, parent) {
        if (!JSONParams) JSONParams = {}
        this.typeOf = 'AJAXMenu'
        if (parent) this.parent = parent
        this.className = (JSONParams.className) ? JSONParams.className : null
        this.styles = (JSONParams.styles) ? JSONParams.styles : null
        this.itemClassName = (JSONParams.itemClassName) ? JSONParams.itemClassName : null
        this.itemStyles = (JSONParams.itemStyles) ? JSONParams.itemStyles : null
        this.itemSelectedClassName = (JSONParams.itemSelectedClassName) ? JSONParams.itemSelectedClassName : null
        this.itemSelectedStyles = (JSONParams.itemSelectedStyles) ? JSONParams.itemSelectedStyles : null
        this.itemOverClassName = (JSONParams.itemOverClassName) ? JSONParams.itemOverClassName : null
        this.itemOverStyles = (JSONParams.itemOverStyles) ? JSONParams.itemOverStyles : null

        this.subClassName = 'subMenu'
        this.subStyles = null
        this.subItemClassName = null
        this.subItemStyles = null
        this.subItemSelectedClassName = 'selected'
        this.subItemSelectedStyles = null
        this.subItemOverClassName = 'over'
        this.subItemOverStyles = null
        this.subImageCol = { isVisible: false, className: null, width: null, styles: null }

        this.isFixed = JSONParams.isFixed
        this.orientation = (JSONParams.orientation) ? JSONParams.orientation : null  // pas utilisé.
        this.onSelectedItem = (JSONParams.onSelectedItem) ? JSONParams.onSelectedItem : null
        this.onAfterBindingMenu = (JSONParams.onAfterBindingMenu) ? JSONParams.onAfterBindingMenu : null
        this.imageCol = JSONParams.imageCol
        this.id = JSONParams.id
        this.element = $(this.id)
        this.isSubMenu = false

        if (!this.parent || (this.parent && this.parent.typeOf == 'AJAXTableau')) {
            this.render()
            this.setFixed(JSONParams.isFixed)
            this.items = new AJAXMenuItems(JSONParams.items, this)
        }

        if (typeof this.onAfterBindingMenu == 'function') this.onAfterBindingMenu(this)
    },

    render: function() {
        if (!this.element) { this.element = new Element('UL') } // logiquement utilisé pour les subItems
        this.element.update()
        if (Object.isString(this.id)) this.element.id = this.id
        this.setClassName(this.className)
        this.setStyles(this.styles)
        return this.element
    },
    
    clear:function(){this.element.update()},

    setClassName: function(className) { this.className = className; this.element.className = className },
    setStyles: function(styles) { this.styles = styles; this.element.setStyle(styles) },
    setFixed: function(m) {
        this.element.setStyle({ position: (!m) ? 'absolute' : '' });
        this.isFixed = m
    },
    setSelectedItem: function(index) { this.items[index].setSelected(true) },
    getSelectedValue: function() { var value; this.items.each(function(it) { if (it.isSelected) { value = it.value; return } }); return value },
    clearSelected: function() { this.items.each(function(it) { it.setSelected(false) }) },
    getSelectedItem: function() { var v; this.items.each(function(it) { if (it.isSelected) { v = it; return } }); return v },
    getSelectedItemIndex:function () {for(var i = 0; i<this.items.length; i++){if (this.items[i].isSelected == true) return i}},
    getItemByValue: function(value) { var val; this.items.each(function(it) { if (it.value == value) { val = it }; return }); return val },
    hide: function() { return hideSubMenu(this.element) },
    show: function() {
        var pos = this.parent.element.cumulativeOffset()
        var dim = this.parent.element.getDimensions()
        this.element.setStyle({ top: (pos.top + dim.height) + 'px', left: pos.left + 'px' })
        this.element.show()
    },

    checkTimer: function() {


        if (this.parent) {
            if (__ObjMenuTimer) { window.clearTimeout(__ObjMenuTimer); __ObjMenuTimer = null }
        }
    },

    clearTimer: function() { window.clearTimeout(this.winTimer); if (this.parent) this.parent.clearTimer() }

}


var AJAXMenuItems = Class.create()
AJAXMenuItems.prototype = {
    initialize:function(JSONItems, parent){
        var a = new Array()
        Object.extend(this,$A(a))
        this['push'] = a['push']
        this['length'] = a['length']
        this['indexOf'] = a['indexOf']
        this['splice'] = a['splice']
        this['clear'] = a['clear']

        this.parent = parent
        if (JSONItems) this.addRange($A(JSONItems)); 
    },
    
    addRange:function(JSONItems){ JSONItems.each(function(it){this.add(it)}.bind(this))},
    add:function(JSONItem){this.push(new AJAXMenuItem(JSONItem, this))},
    clearTimer:function(){window.clearTimeout(this.winTimer); if (this.parent) this.parent.clearTimer()} 

}


var AJAXMenuItem = Class.create()
AJAXMenuItem.prototype = {
    initialize:function(item, parent){
        this.parent = parent
        this.typeOf = 'AJAXMenuItem'
        this.parentMenu =   this.parent.parent
        this.text =         null
        this.value =        null
        this.navigateUrl = null
        this.targetUrl = null
        this.toolTipText =  null
        this.items =        null
        this.subMenu =      null
        if (item){for (var property in item) this[property]=item[property];}
        this.myBoxObject =  null
        this.element =      null
        this.isSelected =   false
        this.winTimer = null
        
        if (!this.targetUrl) this.targetUrl = '_blank'
        this.renderLi()
        this.render()
        
    },
    
    
    renderLi:function(){
        this.element = new Element('LI')
        if (this.parentMenu.orientation=='hor')         this.element.setStyle({cssFloat:'left'})
        if (this.parentMenu.itemClassName)              this.element.setClassName(this.parentMenu.itemClassName)
        if (this.parentMenu.itemStyles)                 this.element.setStyle(this.parentMenu.itemStyles)
        if (this.isSelected) this.setSelected(true)
        
        

        this.element.title = this.toolTipText
        this.element.observe('click', function(e){this.setSelected(true)}.bindAsEventListener(this))
        
        this.element.observe('mouseover', function(e){
            this.clearTimer()
            this.element.addClassName(this.parentMenu.itemOverClassName)
            if (this.parentMenu.itemOverClassStyles) this.setStyle(this.parentMenu.itemOverClassStyles)
            if (this.items){ 
                if (this.items.length > 0){
                    var s = this.subMenu.show()
                }
            }
            if (!this.useCurvy) return
            this.setCurvy(this.curvySettings)
           
        }.bindAsEventListener(this))

        this.element.observe('mouseout', function(e){
            
            this.element.removeClassName(this.parentMenu.itemOverClassName)
            if (this.parentMenu.itemStyles) this.setStyle(this.parentMenu.itemStyles)
            //if (this.parentMenu.isSubMenu) this.parentMenu.parent.winTimer = this.parentMenu.hide()
            if (this.items){if (this.items.length > 0) this.winTimer = this.subMenu.hide()}
            if (!this.useCurvy) return
            this.setCurvy(this.curvySettings)
           
        }.bindAsEventListener(this))
    },
    
    clearTimer:function(){
        window.clearTimeout(this.winTimer)
        if (this.parent){
            this.parent.clearTimer()
        }
    },
    
    render:function(){
        var elTxt
        this.element.update()
        if (this.imageSrc){
            this.image = new Element('IMG', {src:this.imageSrc})
        }
        
        if (this.text){
            var t = new Element('NOBR').update(this.text)
            
            if (this.navigateUrl){
                elTxt = new Element('A', {href:this.navigateUrl, target:this.targetUrl}).insert(t)
            } else {
                elTxt = t
            }
        }
     
        if (!this.parentMenu.imageCol.isVisible){this.renderElement(elTxt)}else{this.renderTableElement(elTxt)}
        
        
        if (this.items){
            if (this.items.length > 0){
                this.initSubMenu()
            }    
        }
          
        this.parentMenu.element.insert(this.element)
        if (this.useCurvy) this.setCurvy(this.curvySettings)
        return this.element

    },
    
    setText:function(text){
        this.text = text
        var aB = this.element.select('NOBR')
        var b = aB[0]
        b.update(text)
        
    },
    
    setNavigateUrl:function(url){
        this.navigateUrl = url
        var as = this.element.select('A')
        if (!as) return
        
        as.each(function(a){a.href = url})


    },

    initSubMenu: function() {
        this.subMenu = new AJAXMenu(null, this)


        this.subMenu.className = this.parentMenu.className + ' ' + this.parentMenu.subClassName
        this.subMenu.Styles = this.parentMenu.subStytles
        this.subMenu.itemClassName = this.parentMenu.subItemClassName
        this.subMenu.itemStyles = this.parentMenu.subItemStyles
        this.subMenu.itemSelectedClassName = this.parentMenu.subItemSelectedClassName
        this.subMenu.itemSelectedStyles = this.parentMenu.subItemSelectedStyles
        this.subMenu.itemOverClassName = this.parentMenu.subItemOverClassName
        this.subMenu.itemOverStyles = this.parentMenu.subItemOverStyles
        this.subMenu.imageCol = this.parentMenu.subImageCol
        this.subMenu.isFixed = this.parentMenu.isFixed

        this.subMenu.render()
        this.subMenu.items = new AJAXMenuItems(this.items, this.subMenu)


        this.subMenu.setFixed(this.parentMenu.isFixed)

        //this.element.insert(this.subMenu.element)
        this.subMenu.hide()
        //
        if (this.subMenu.isFixed == true) { this.element.insert(this.subMenu.element) } else { document.forms[0].appendChild(this.subMenu.element) }
        this.subMenu.isSubMenu = true 
             
    },
    
    renderElement:function(txt){
        if (this.image) this.element.insert(this.image)
        if (txt) this.element.insert(txt)   
    },
    
    renderTableElement:function(txt){
        var t = new Element('TABLE', {cellpadding:'0', cellspacing:'0'})
        var tr = new Element('TR')
        t.insert(tr)
        tr.insert(new Element('TD',{width:this.parentMenu.imageCol.width}).insert(this.image))
        tr.insert(new Element('TD').insert(txt))
        this.element.insert(t)
 
    },
    
    setSelected:function(selected){
        
        if (selected){
            this.parentMenu.clearSelected()  
            this.isSelected = true
            this.element.addClassName(this.parentMenu.itemSelectedClassName) 
            if (this.parentMenu.itemSelectedStyles) this.element.setStyle(this.parentMenu.itemSelectedStyles)
            if (this.useCurvy)this.setCurvy(this.curvySettings)
             
            if (typeof this.parentMenu.onSelectedItem == 'function') this.parentMenu.onSelectedItem(this.parentMenu, this)
            if (typeof this.parentMenu.onTableauMenuSelect=='function'){ this.parentMenu.onTableauMenuSelect(this.parentMenu, this)} 
        }else{
            this.isSelected = false
            this.element.removeClassName(this.parentMenu.itemSelectedClassName)
            if (this.parentMenu.itemStyles) this.element.setStyle(this.parentMenu.itemStyles)
            if (this.useCurvy)this.setCurvy(this.curvySettings) 
        }
    },

    show: function() { this.element.show() },
    hide:function(){this.element.hide()},
    
    setCurvy:function(curvySettings){
        this.removeCurvy()
        if (!this.useCurvy) {
            this.curvySettings = null
        } else {
            if (curvySettings){
                this.curvySettings = curvySettings
            } else {
                this.curvySettings = {tl: { radius: 5 }, tr: { radius: 5 }, bl: { radius: 0 },br: { radius: 0 }, antiAlias: true, autoPad: true, validTags: ['li']} 
            }
        }
     
        this.myBoxObject = new curvyCorners(this.curvySettings, this.element);
        this.myBoxObject.applyCornersToAll();
        
        if (this.isSelected) this.element.select('div[name="cc"]')[1].setStyle({backgroundColor:'transparent'})
    },
    
    removeCurvy:function(){
        var els = this.element.select('div[name="cc"]')
        els.each(function(d){this.element.removeChild(d)}.bind(this))
        this.element.setStyle({backgroundPosition:'', borderTopWidth:'', borderBottomWidth:''})
        if (this.parentMenu.itemStyles) this.element.setStyle(this.parentMenu.itemStyles)
    },
    
    setStyle:function(style){
        this.element.setStyle(style)
    
    }
 
}


function hideSubMenu(el){
   return window.setTimeout(function(){el.hide()}, 100)
   //__menuTimer.push(window.setTimeout(function(){el.hide()}, 400))



}