/**

 * Interface Elements for jQuery

 * Fisheye menu

 * 

 * http://interface.eyecon.ro

 * 

 * Copyright (c) 2006 Stefan Petre

 * Dual licensed under the MIT (MIT-LICENSE.txt) 

 * and GPL (GPL-LICENSE.txt) licenses.

 *

 */



/**

 * Build a Fisheye menu from a list of links

 *

 * @name Fisheye

 * @description Build a Fisheye menu from a list of links

 * @param Hash hash A hash of parameters

 * @option String items items selection

 * @option String container container element

 * @option Integer itemWidth the minimum width for each item

 * @option Integer maxWidth the maximum width for each item

 * @option String itemsText selection of element that contains the text for each item

 * @option Integer proximity the distance from element that make item to interact

 * @option String valign vertical alignment

 * @option String halign horizontal alignment

 *

 * @type jQuery

 * @cat Plugins/Interface

 * @author Stefan Petre

 */

jQuery.iFisheye = {

    

    build : function(options)

    {

    

        return this.each(

            function()

            {

                var el = this;

                el.fisheyeCfg = {

                    items : jQuery(options.items, this),

                    container: jQuery(options.container, this),

                    pos : jQuery.iUtil.getPosition(this),

                    itemWidth: options.itemWidth,

                    itemsText: options.itemsText,

                    proximity: options.proximity,

                    valign: options.valign,

                    halign: options.halign,

                    maxWidth : options.maxWidth,

                    itemHeight : options.itemHeight,
                    
                    pone : options.pone

                //    ndebug : options.ndebug

                };

                jQuery.iFisheye.positionContainer(el, 0);

                jQuery(window).bind(

                    'resize',

                    function()

                    {

                        el.fisheyeCfg.pos = jQuery.iUtil.getPosition(el);

                        jQuery.iFisheye.positionContainer(el, 0);

                        jQuery.iFisheye.positionItems(el);

                    }

                );

                jQuery.iFisheye.positionItems(el);

                el.fisheyeCfg.items

                    .bind(

                        'mouseover',

                        function()

                        {

                            jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'block';

                        }

                    )

                    .bind(

                        'mouseout',

                        function()

                        {

                            jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'none';

                            

                        }

                    );

                jQuery(document).bind(

                    'mousemove',

                    function(e)

                    {

                        var pointer = jQuery.iUtil.getPointer(e);

                        var toAdd = 0;

                        if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'center')

                            var posx = pointer.x - el.fisheyeCfg.pos.x - (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size())/2 - el.fisheyeCfg.itemWidth/2;

                        else if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'right')

                            var posx = pointer.x - el.fisheyeCfg.pos.x - el.offsetWidth + el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size();

                        else 

                            var posx = pointer.x - el.fisheyeCfg.pos.x;
                            var pone = el.fisheyeCfg.pone;

                        //~ var posy = Math.pow(pointer.y - el.fisheyeCfg.pos.y - el.offsetHeight/2,2);
                        var posy = Math.pow(pointer.y - jQuery(el).position().top - el.offsetHeight/2,2);

                        var ndisty = pointer.y - jQuery(el).position().top + ((el.offsetHeight/2)* pone); //+ 20;//el.fisheyeCfg.pos.y;

                     if(ndisty < (el.fisheyeCfg.itemHeight+(el.fisheyeCfg.maxWidth/2)) && ((el.fisheyeCfg.itemHeight/2) * -1) < ndisty )



                        el.fisheyeCfg.items.each(

                        

                            function(nr)

                            {

//if (nr == 1) console.log("%s", ndisty);

                                distance = Math.sqrt(

                                    Math.pow(posx - nr*el.fisheyeCfg.itemWidth, 2)

                                    + posy

                                );

                                distance -= el.fisheyeCfg.itemWidth/2;

                                distance = distance < 0 ? 0 : distance;

                                distance = distance > el.fisheyeCfg.proximity ? el.fisheyeCfg.proximity : distance;

                                distance = el.fisheyeCfg.proximity - distance;

                                extraWidth = el.fisheyeCfg.maxWidth * distance/el.fisheyeCfg.proximity;

                                this.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px';

                                this.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px';

                                toAdd += extraWidth ;

                            }

                        );

                        else

                        el.fisheyeCfg.items.each(

                        

                            function(nr)

                            {

//if (nr == 1) console.log("%s", ndisty);



                                distance = 0;

                                extraWidth = el.fisheyeCfg.maxWidth * distance/el.fisheyeCfg.proximity;

                                this.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px';

                                this.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px';

                                toAdd += extraWidth ;

                            }

                        );

                        jQuery.iFisheye.positionContainer(el, toAdd);

                    }

                );

            }

        )

    },

    

    positionContainer : function(el, toAdd)

    {

        if (el.fisheyeCfg.halign)

            if (el.fisheyeCfg.halign == 'center')

                el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size())/2 - toAdd/2 + 'px';

            else if (el.fisheyeCfg.halign == 'left')

                el.fisheyeCfg.container.get(0).style.left =  - toAdd/el.fisheyeCfg.items.size() + 'px';

            else if (el.fisheyeCfg.halign == 'right')

                el.fisheyeCfg.container.get(0).style.left =  (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) - toAdd/2 + 'px';

        el.fisheyeCfg.container.get(0).style.width = el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size() + toAdd + 'px';

    },

    

    positionItems : function(el)

    {

        el.fisheyeCfg.items.each(

            function(nr)

            {

                this.style.width = el.fisheyeCfg.itemWidth + 'px';

                this.style.left = el.fisheyeCfg.itemWidth * nr + 'px';

            }

        );

    }

};



jQuery.fn.Fisheye = jQuery.iFisheye.build;

