/*



    Args

    menuContent         - селектор для выбора содержимого меню.

    contentIsChild      - контент - дочерний элемент ?

    menuCssClass        - css класс для рамки меню.

    showEvent           - 'over','click';

    hideDelay           - default:1000ms;  use when mouse out

    topPlus             - add to top pos menu def: parentItem.height()

    leftPlus            - add to left pos menu def: 0

    showSpeed           - speed to animate show|hide events default 'normal' values: 'slow' 'fast' 'normal' X in miliseconds

    close               - call back where menu is hides

    closeSelector       - selector to handle click event default:(base area);

    baseContainer       - containe to append menu container default: body

    isTooltip           - Режим подсказки, по умолчанию false

    hideSpeed           - скорость скрытия, 'normal'

    

    eventShow           - событие на показ меню fn(container)

    stopEventPropagation- останавливать распостронения события клик по меню

    

    Пример использования:

    

    $(".menu1").flyoutList({

                menuContent:'.content',

                contentIsChild:true,

                menuCssClass:'menu_box',

                showEvent:'over',

                hideDelay:1000,

                hideSpeed:'fast',

                showSpeed:'normal',

                topPlus:5,

                leftPlus:5,

                isTooltip:false

                });

    

*/

jQuery.fn.flyoutList=function(Args)

{

	this.each(function(){$(this).flyoutListItem(Args);});

	return this;

}

jQuery.fn.flyoutListItem = function(Args)

{

    if (Args == undefined) return;

    var menuHandler = this;

    var fn = new Object();





    var contentIsChild = Args.contentIsChild == undefined ? true : Args.contentIsChild;



    var menuContent;

    if (contentIsChild)

        menuContent = Args.menuContent == undefined ? null : menuHandler.find(Args.menuContent);

    else

        menuContent = Args.menuContent == undefined ? null : $(Args.menuContent);



    menuContent.attr("position", "absolute");



    var isTooltip = Args.isTooltip == undefined ? false : Args.isTooltip;

    var isMovable = Args.isMovable == undefined ? false : Args.isMovable;



    var menuCssClass = Args.menuCssClass == undefined ? 'menu_box' : Args.menuCssClass;

    var showEvent = Args.showEvent == undefined ? 'over' : Args.showEvent;

    var hideDelay = Args.hideDelay == undefined ? 1000 : Args.hideDelay;

    var showSpeed = Args.showSpeed == undefined ? 'normal' : Args.showSpeed;

    var hideSpeed = Args.hideSpeed == undefined ? 'normal' : Args.hideSpeed;

    var baseContainer = Args.baseContainer == undefined ? document.body : Args.baseContainer;



    var topPlus = Args.topPlus == undefined ? (parentItem == null ? 0 : parentItem.height()) : Args.topPlus;

    var leftPlus = Args.leftPlus == undefined ? 0 : Args.leftPlus;



    var showBaseElement = Args.showBaseElement == undefined ? menuHandler : $(Args.showBaseElement);



    var close = Args.close == undefined ? null : Args.close;

    var eventShow = Args.eventShow == undefined ? null : Args.eventShow; ;



    fn.eventClose = Args.close == undefined ? null : Args.close;

    fn.eventShow = Args.eventShow == undefined ? null : Args.eventShow;



    //var BaseContainer=document.createElement('DIV');

    var BaseContainer = menuContent;

    var Visible = false;



    var closeElement = Args.closeSelector == undefined ? $(BaseContainer) : menuContainer.find(Args.closeSelector);



    BaseContainer.css('position', 'absolute');

    BaseContainer.css('z-index', '1000');

    BaseContainer.css('display', 'none');

    menuContent.addClass(menuCssClass);

    //BaseContainer.className=menuCssClass;

    //baseContainer.appendChild(BaseContainer);



    //BaseContainer=$(BaseContainer);

    //menuContent.remove();

    //BaseContainer.append(menuContent);

    //menuContent.show();



    var lastEvent = null;

    var lastEventInterval = null;



    var curHideInterval = null;



    fn.Item = function(pItem)

    {

        if (pItem == undefined) return parentItem;

        parentItem = pItem;

        fn.InitItem();

    }

    fn.CheckOver = function(e)

    {

        if (!Visible) return;

        lastEvent = e;





        fn.CheckOverProcess();

        /*

        if(lastEventInterval==null)

        {

        lastEventInterval=setTimeout(fn.CheckOverProcess,100);

        }

        */

    }

    fn.CheckOverProcess = function()

    {

        var e = lastEvent;

        clearTimeout(lastEventInterval);

        lastEventInterval = null;



        if (isMovable)

        {

            BaseContainer.css("top", lastEvent.pageY + topPlus);

            BaseContainer.css("left", lastEvent.pageX + leftPlus);



            //BaseContainer.animate({top:lastEvent.pageY+topPlus,left:lastEvent.pageX+leftPlus},'fast');

        }

        //if(!Visible) return;

        var pos = BaseContainer.position();



        if (!isTooltip)

        {

            if (AiDA.tools.isOver(BaseContainer, e.pageX, e.pageY))

            //if (e.pageX >= pos.left && e.pageX <= pos.left + BaseContainer.outerWidth())

            //if (e.pageY >= pos.top && e.pageY <= pos.top + BaseContainer.outerHeight())

            {

                if (curHideInterval != null) clearTimeout(curHideInterval);

                curHideInterval = null;

                return;

            }

        }

        var pos2 = menuHandler.position();

        var IsOver = AiDA.tools.isOver(menuHandler, e.pageX, e.pageY);

        //document.getElementById("debug").innerHTML = "IsOver " + IsOver;

        //document.getElementById("debug").innerHTML += 

        if (IsOver)

        //if (e.pageX >= pos2.left && e.pageX <= pos2.left + menuHandler.outerWidth())

        //    if (e.pageY >= pos2.top && e.pageY <= pos2.top + menuHandler.outerHeight())

        {

            if (curHideInterval != null) clearTimeout(curHideInterval);

            curHideInterval = null;

            return;

        }



        if (curHideInterval != null) return;

        curHideInterval = setTimeout(fn.HideMenu, hideDelay);



    }

    fn.ShowMenuEnd = function()

    {

        Visible = true;

        if (fn.eventShow != null) fn.eventShow(BaseContainer);

    }

    fn.ShowMenu = function(e)

    {

        closeElement.click(fn.HideMenu);

        if (!isMovable)

        {

            var pos = showBaseElement.position();

            //alert((pos.top+topPlus).toString()+' '+(pos.left+leftPlus).toString());

            BaseContainer.css("top", pos.top + topPlus);

            BaseContainer.css("left", pos.left + leftPlus);

        }

        else

        {

            BaseContainer.css("top", e.pageY + topPlus);

            BaseContainer.css("left", e.pageX + leftPlus);

            //BaseContainer.animate({top:e.pageY+topPlus,left:e.pageX+leftPlus},300);

        }

        //BaseContainer.show(showSpeed,fn.ShowMenuEnd);

        BaseContainer.slideDown(showSpeed, fn.ShowMenuEnd);



        return false;



    }

    fn.HideMenu = function(e)

    {

        Visible = false;

        if (curHideInterval != null) clearTimeout(curHideInterval);

        curHideInterval = null;

        BaseContainer.slideUp(hideSpeed);

        if (fn.eventClose != null)

        {

            fn.eventClose(this);

        }

		if(e!=undefined) e.stopPropagation();

    }

    fn.InitItem = function()

    {

        if (menuHandler != null)

        {

            if (showEvent == 'over') menuHandler.mouseover(fn.ShowMenu);

            if (showEvent == 'click') menuHandler.click(fn.ShowMenu);

        }

    }

    fn.StopClick = function(e)

    {

        //if(e!=undefined) e.stopPropagation();

    }

    fn.Init = function()

    {

        $(document.body).mousemove(fn.CheckOver);

        closeElement.click(fn.HideMenu);

        closeElement.contents().click(fn.StopClick);



        fn.InitItem();

    }

    fn.Init();



    return this;

}


