var jkoutlinemenu={

effectduration: 500, //duration of animation, in milliseconds
outlinemenulabels: [],
outlinemenus: [], //array to contain each block menu instances
zIndexVal: 5000, //starting z-index value for drop down menu
$shimobj: null,

addshim:function(){
        $(document.body).append('<IFRAME id="outlineiframeshim" src="'+(location.protocol=="https:"? 'blank.htm' : 'about:blank')+'" style="display:none; left:0; top:0; z-index:999; position:absolute; filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)" frameBorder="0" scrolling="no"></IFRAME>')
        this.$shimobj=$("#outlineiframeshim")
        //alert(this.$shimobj.attr("src"))
},

alignmenu:function(e, outlinemenu_pos){
        var outlinemenu=this.outlinemenus[outlinemenu_pos]
        var $anchor=outlinemenu.$anchorobj
        var $menu=outlinemenu.$menuobj
        var menuleft=($(window).width()-(outlinemenu.offsetx-$(document).scrollLeft())>outlinemenu.actualwidth)? outlinemenu.offsetx : outlinemenu.offsetx-outlinemenu.actualwidth+outlinemenu.anchorwidth //get x coord of menu
        var menutop=($(window).height()-(outlinemenu.offsety-$(document).scrollTop()+outlinemenu.anchorheight)>outlinemenu.actualheight)? outlinemenu.offsety+outlinemenu.anchorheight : outlinemenu.offsety-outlinemenu.actualheight //get y coord of menu
        $menu.css({left:menuleft+"px", top:menutop+"px"})
        this.$shimobj.css({width:outlinemenu.actualwidth+"px", height:outlinemenu.actualheight+"px", left:menuleft+"px", top:menutop+"px", display:"block"})
},

showmenu:function(e, outlinemenu_pos){
        var outlinemenu=this.outlinemenus[outlinemenu_pos]
        var $menu=outlinemenu.$menuobj
        var $menuinner=outlinemenu.$menuinner
        if ($menu.css("display")=="none"){
                this.alignmenu(e, outlinemenu_pos)
                $menu.css("z-index", ++this.zIndexVal)
                $menu.show(this.effectduration, function(){
                        $menuinner.css('visibility', 'visible')
                })
        }
        else if ($menu.css("display")=="block" && e.type=="click"){ //if menu is hidden and this is a "click" event (versus "mouseout")
                this.hidemenu(e, outlinemenu_pos)
        }
        return false
},

hidemenu:function(e, outlinemenu_pos){
        var outlinemenu=this.outlinemenus[outlinemenu_pos]
        var $menu=outlinemenu.$menuobj
        var $menuinner=outlinemenu.$menuinner
        $menuinner.css('visibility', 'hidden')
        this.$shimobj.css({display:"none", left:0, top:0})
        $menu.hide(this.effectduration)
},

definemenu:function(anchorid, menuid, revealtype, optwidth, optheight){
        var $=jQuery
        this.outlinemenulabels.push([anchorid, menuid, revealtype, optwidth, optheight])
},

render:function($){
        for (var i=0, labels=this.outlinemenulabels[i]; i<this.outlinemenulabels.length; i++, labels=this.outlinemenulabels[i]){
                this.outlinemenus.push({$anchorobj:$("#"+labels[0]), $menuobj:$("#"+labels[1]), $menuinner:$("#"+labels[1]).children('ul:first-child'), revealtype:labels[2]})
                var outlinemenu=this.outlinemenus[i]
                outlinemenu.$anchorobj.add(outlinemenu.$menuobj).attr("_outlinemenupos", i+"pos")
                outlinemenu.$menuobj.css(parseInt(labels[3])>10? {width:parseInt(labels[3])+"px"} : {})
                outlinemenu.$menuobj.css(parseInt(labels[4])<outlinemenu.$menuobj.height()? {height:parseInt(labels[4])+"px", overflow:"scroll", overflowX:"hidden"} : {})
                outlinemenu.actualwidth=outlinemenu.$menuobj.outerWidth()
                outlinemenu.actualheight=outlinemenu.$menuobj.outerHeight()
                outlinemenu.offsetx=outlinemenu.$anchorobj.offset().left
                outlinemenu.offsety=outlinemenu.$anchorobj.offset().top
                outlinemenu.anchorwidth=outlinemenu.$anchorobj.outerWidth()
                outlinemenu.anchorheight=outlinemenu.$anchorobj.outerHeight()
                outlinemenu.$menuobj.css("z-index", ++this.zIndexVal).hide()
                outlinemenu.$menuinner.css("visibility", "hidden")
                outlinemenu.$anchorobj.bind(outlinemenu.revealtype=="click"? "click" : "mouseenter", function(e){
                                return jkoutlinemenu.showmenu(e, parseInt(this.getAttribute("_outlinemenupos")))
                })

        } //end for loop
        $(document).bind("click", function(e){
                for (var i=0; i<jkoutlinemenu.outlinemenus.length; i++){
                        jkoutlinemenu.hidemenu(e, i)
                }
        }) //end document.click
        $(window).bind("resize", function(){
                for (var i=0; i<jkoutlinemenu.outlinemenus.length; i++){
                        var outlinemenu=jkoutlinemenu.outlinemenus[i]
                        outlinemenu.offsetx=outlinemenu.$anchorobj.offset().left
                        outlinemenu.offsety=outlinemenu.$anchorobj.offset().top
                }
        })
        jkoutlinemenu.addshim()
}

}

jQuery(document).ready(function($){
        jkoutlinemenu.render($)
})
