/* jQuery Context Menu
 * Created: Dec 16th, 2009 by DynamicDrive.com. This notice must stay intact for usage
 * Author: Dynamic Drive at http://www.dynamicdrive.com/
 * Visit http://www.dynamicdrive.com/ for full source code
 */

var jquerycontextmenu = {

    arrowpath: 'images/arrow.gif',
    contextmenuoffsets: [1, -1],

    builtcontextmenuids: [],

    positionul: function($, $ul, e) {
        var istoplevel = $ul.hasClass('jqcontextmenu');
        var docrightedge = $(document).scrollLeft() + $(window).width() - 40;
        var docbottomedge = $(document).scrollTop() + $(window).height() - 40;
        if (istoplevel) {
            var x = e.pageX + this.contextmenuoffsets[0];
            var y = e.pageY + this.contextmenuoffsets[1];
            x = (x + $ul.data('dimensions').w > docrightedge) ? docrightedge - $ul.data('dimensions').w : x;
            y = (y + $ul.data('dimensions').h > docbottomedge) ? docbottomedge - $ul.data('dimensions').h : y;
        } else {
            var $parentli = $ul.data('$parentliref');
            var parentlioffset = $parentli.offset();
            var x = $ul.data('dimensions').parentliw;
            var y = 0;

            x = (parentlioffset.left + x + $ul.data('dimensions').w > docrightedge) ? x - $ul.data('dimensions').parentliw - $ul.data('dimensions').w : x;
            y = (parentlioffset.top + $ul.data('dimensions').h > docbottomedge) ? y - $ul.data('dimensions').h + $ul.data('dimensions').parentlih : y;
        }
        $ul.css({left:x, top:y})
    },

    showbox: function($, $contextmenu, e) {
//        jquerycontextmenu.buildcontextmenu($, $contextmenu);
        $contextmenu.show();
    },

    hidebox: function($, $contextmenu) {
        $contextmenu.find('ul').andSelf().hide();
    },

    buildcontextmenu: function($, $menu) {
        $menu.css({display: 'block', visibility: 'hidden'}).appendTo(document.body);
        $menu.data('dimensions', {w: $menu.outerWidth(), h: $menu.outerHeight()});
        var $lis = $menu.find("ul").parent();
        $lis.each(function (i) {
            var $li = $(this).css({zIndex: 1000 + i});
            var $subul = $li.find('ul:eq(0)').css({display:'block'});
            $subul.data('dimensions', {w:$subul.outerWidth(), h:$subul.outerHeight(), parentliw:this.offsetWidth, parentlih:this.offsetHeight});
            $subul.data('$parentliref', $li);
            $li.data('$subulref', $subul);
//            $li.children("a:eq(0)").append('<img src="' + jquerycontextmenu.arrowpath + '" class="rightarrowclass" style="border:0;" />');

            $li.bind('mouseenter', function (e) {
                var $targetul = $(this).data('$subulref');
                if ($targetul.queue().length <= 1) {
                    jquerycontextmenu.positionul($, $targetul, e);
                    $targetul.show()
                }
            });

            $li.bind('mouseleave', function (e) {
                $(this).data('$subulref').hide()
            })
        });

        $menu.find('ul').andSelf().css({display:'none', visibility:'visible'});
        this.builtcontextmenuids.push($menu.get(0).id);
    },


    init: function ($, $target, $contextmenu) {
        if (this.builtcontextmenuids.length == 0) {
            $(document).bind("click", function(e) {
                if (e.button == 0) {
                    jquerycontextmenu.hidebox($, $('.jqcontextmenu'))
                }
            })
        }

        if (jQuery.inArray($contextmenu.get(0).id, this.builtcontextmenuids) == -1)
            this.buildcontextmenu($, $contextmenu);

        $(document).bind("click", function(e) {
            if (e.button == 0) {
                jquerycontextmenu.hidebox($, $('.jqcontextmenu'))
            }
        });

        if ($target.parents().filter('ul.jqcontextmenu').length > 0)
            return;

        $target.bind("contextmenu", function(e) {
            jquerycontextmenu.hidebox($, $('.jqcontextmenu'));
            jquerycontextmenu.positionul($, $contextmenu, e);
            jquerycontextmenu.showbox($, $contextmenu, e);
            return false
        })
    }
};

$.fn.addcontextmenu = function(contextmenuid) {
    var $ = jQuery;
    return this.each(function() { //return jQuery obj
        var $target = $(this);
        jquerycontextmenu.init($, $target, $('#' + contextmenuid));
    })
};