/*
 * Tooltip - jQuery plugin  for styled tooltips
 *
 * Copyright (c) 2006 Jörn Zaefferer, Stefan Petre
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * $Id$
 *
 */
/*eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(7($){6 4,G,9,C,u,Q,r;$.1s.1b=7(8){8=$.23({},U.24.Y,8);3(!4){4=$(\'<1t 25="26"><L></L><p 1c="k"></p><p 1c="V"></p></1t>\').c().l({28:\'1G\',1x:"1y"}).1z(\'k\');G=$(\'L\',4);9=$(\'p.k\',4);C=$(\'p.V\',4)}$(1).S(\'[@d]\').O(7(){1.f=8}).J("1h",1v).J(8.a,1r);A 1};7 1r(a){3(1.f.R)r=1A(m,1.f.R);D m();3(1.f.1m)$(\'k\').J(\'1f\',B);B(a);$(1).J(\'X\',c)}7 1v(){3(1==u||!1.d)A;u=1;6 q=$(1),8=1.f;6 d=Q=q.z(\'d\');q.z(\'d\',\'\');3(8.M){6 T=d.1B(8.M);G.E(T.1C());9.1D();19(6 i=0,K;K=T[i];i++){3(i>0)9.10("<1E/>");9.10(K)}3(9.E())9.m();D 9.c()}D{G.E(d);9.c()}6 F=(q.z(\'F\')||q.z(\'1e\'));3(8.1p&&F)C.E(F.1R(\'1H://\',\'\')).m();D C.c();3(8.o){4.1J(8.o)}3(8.N&&$.1d.14){4.O(7(){3(1.13.H!=\'17\'){6 s=1.13.H;s=s.1K(5,s.1q-2);$(1).l({\'H\':\'17\',\'S\':"1M:1N.1O.1Q(1S=Z, 1T=1U, 1e=\'"+s+"\')"})}})}}7 m(){r=t;4.m();B()}7 B(a){3(u==t){$(\'k\').W(\'1f\',B);A}6 j=4[0].1j;6 g=4[0].1l;3(a){j=a.1V+15;g=a.1W+15;4.l({j:j+\'I\',g:g+\'I\'})}6 v=1o(),h=4[0];3(v.x+v.16<h.1j+h.1k){j-=h.1k+20;4.l({j:j+\'I\'})}3(v.y+v.1a<h.1l+h.1n){g-=h.1n+20;4.l({g:g+\'I\'})}}7 1o(){6 e=1u.22||{},b=1u.k||{},w=27;7 P(){6 v=1w;19(6 i=0;i<U.1q;i++){6 n=U[i];3(n&&n<v)v=n}A v}A{x:w.1F||e.11||b.11||0,y:w.1I||e.12||b.12||0,16:P(e.18,b.18,w.1P),1a:P(e.1g,b.1g,w.1X)}}7 c(){3(r)1Z(r);u=t;4.c();3(1.f.o){4.21(1.f.o)}$(1).z(\'d\',Q).W(\'X\',c);3(1.f.N&&$.1d.14){4.O(7(){$(1).l({\'S\':\'\',H:\'\'})})}}$.1s.1b.Y={R:1L,a:"1h",1m:1i,1p:Z,M:t,o:t,N:1i}})(1Y);',62,133,'|this||if|helper||var|function|settings|tBody|event||hide|title||tSettings|top|||left|body|css|show||extraClass||source|tID|image|null|current|||||attr|return|update|tUrl|else|html|href|tTitle|backgroundImage|px|bind|part|h3|showBody|fixPNG|each|min|oldTitle|delay|filter|parts|arguments|url|unbind|mouseout|defaults|true|append|scrollLeft|scrollTop|currentStyle|msie||cx|none|clientWidth|for|cy|Tooltip|class|browser|src|mousemove|clientHeight|mouseover|false|offsetLeft|offsetWidth|offsetTop|track|offsetHeight|viewport|showURL|length|handle|fn|div|document|save|Infinity|zIndex|3000|appendTo|setTimeout|split|shift|empty|br|pageXOffset|absolute|http|pageYOffset|addClass|substring|250|progid|DXImageTransform|Microsoft|innerWidth|AlphaImageLoader|replace|enabled|sizingMethod|crop|pageX|pageY|innerHeight|jQuery|clearTimeout||removeClass|documentElement|extend|callee|id|tooltip|window|position'.split('|'),0,{}))
*/

/*
 * Tooltip 1.0 - jQuery plugin  for styled tooltips
 *
 * Copyright (c) 2006 Jörn Zaefferer, Stefan Petre
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id$
 *
 */

/**
 * Display a customized tooltip instead of the default one
 * for every selected element. The tooltip behaviour mimics
 * the default one, but lets you style the tooltip and
 * specify the delay before displaying it.
 *
 * In addition, it displays the href value, if it is available.
 * 
 * To style the tooltip, use these selectors in your stylesheet:
 *
 * #tooltip - The tooltip container
 *
 * #tooltip h3 - The tooltip title
 *
 * #tooltip p.body - The tooltip body, shown when using showBody
 *
 * #tooltip p.url - The tooltip url, shown when using showURL
 *
 * @example $('a, input, img').Tooltip();
 * @desc Shows tooltips for anchors, inputs and images, if they have a title
 *
 * @example $('label').Tooltip({
 *   delay: 0,
 *   track: true,
 *   event: "click"
 * });
 * @desc Shows tooltips for labels with no delay, tracking mousemovement, displaying the tooltip when the label is clicked.
 *
 * @example // modify global settings
 * $.extend($.fn.Tooltip.defaults, {
 * 	track: true,
 * 	delay: 0,
 * 	showURL: false,
 * 	showBody: " - ",
 *  fixPNG: true
 * });
 * // setup fancy tooltips
 * $('a.pretty').Tooltip({
 * 	 extraClass: "fancy"
 * });
 $('img.pretty').Tooltip({
 * 	 extraClass: "fancy-img",
 * });
 * @desc This example starts with modifying the global settings, applying them to all following Tooltips; Afterwards, Tooltips for anchors with class pretty are created with an extra class for the Tooltip: "fancy" for anchors, "fancy-img" for images
 *
 * @param Object settings (optional) Customize your Tooltips
 * @option Number delay The number of milliseconds before a tooltip is display, default is 250
 * @option String event The event on which the tooltip is displayed, default is "mouseover", "click" works fine, too
 * @option Boolean track If true, let the tooltip track the mousemovement, default is false
 * @option Boolean showURL If true, shows the href or src attribute within p.url, default is true
 * @option String showBody If specified, uses the String to split the title, displaying the first part in the h3 tag, all following in the p.body tag, separated with <br/>s, default is null
 * @option String extraClass If specified, adds the class to the tooltip helper, default is null
 * @option Boolean fixPNG If true, fixes transparent PNGs in IE, default is false
 * @option Function bodyHandler TODO document me
 *
 * @name Tooltip
 * @type jQuery
 * @cat Plugins/Tooltip
 * @author Jörn Zaefferer (http://bassistance.de)
 */
(function($) {

    // the tooltip element
    var helper = {},
    // the current tooltipped element
		current,
    // the title of the current element, used for restoring
		title,
    // timeout id for delayed tooltips
		tID,
    // IE 5.5 or 6
		IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent);

    $.fn.extend({
        Tooltip: function(settings) {
            // setup configuration
            settings = $.extend({}, $.Tooltip.defaults, settings);

            createHelper();

            // bind events for every selected element with a title attribute
            this.filter('[@title]')
            // save settings into each element
				.each(function() {
				    this.tSettings = settings;
				})
            // bind events
				.bind("mouseover", save)
				.bind(settings.event, handle);
            return this;
        },
        fixPNG: IE ? function() {
            return this.each(function() {
                var image = $(this).css('backgroundImage');
                if (image.match(/^url\(["'](.*\.png)["']\)$/i)) {
                    image = RegExp.$1;
                    $(this).css({
                        'backgroundImage': 'none',
                        'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
                    }).each(function() {
                        var position = $(this).css('position');
                        if (position != 'absolute' && position != 'relative')
                            $(this).css('position', 'relative');
                    });
                }
            });
        } : function() { return this; },
        unfixPNG: IE ? function() {
            return this.each(function() {
                $(this).css({ 'filter': '', backgroundImage: '' });
            });
        } : function() { return this; },
        getAndSetAttr: function(name, value) {
            var result = this.attr(name);
            this.attr(name, value);
            return result;
        },
        hideWhenEmpty: function() {
            return this.each(function() {
                $(this)[$(this).html() ? "show" : "hide"]();
            });
        },
        url: function() {
            return this.attr('href') || this.attr('src');
        }
    });

    function createHelper() {
        // there can be only one tooltip helper
        if (helper.parent)
            return;
        // create the helper, h3 for title, div for url
        helper.parent = $('<div id="tooltip"><h3>a</h3><p class="body"></p><p class="url"></p></div>')
        // hide it at first
			.hide()
        // move to top and position absolute, to let it follow the mouse
			.css({ position: 'absolute', zIndex: "3000" })
        // add to document
			.appendTo('body');

        // save references to title and url elements
        helper.title = $('h3', helper.parent);
        helper.body = $('p.body', helper.parent);
        helper.url = $('p.url', helper.parent);
    }

    // main event handler to start showing tooltips
    function handle(event) {
        // show helper, either with timeout or on instant
        if (this.tSettings.delay)
            tID = setTimeout(show, this.tSettings.delay);
        else
            show();

        // if selected, update the helper position when the mouse moves
        if (this.tSettings.track)
           // $('body').bind('mousemove', update);

        // update at least once
        update(event);

        // hide the helper when the mouse was clicked on the element
        if (this.tSettings.event != "click")
            $(this).bind('click', hide);

        // hide the helper when the mouse moves out of the element
        $(this).bind('mouseout', hide);
    }

    // save elements title before the tooltip is displayed
    function save() {
        // if this is the current source, or it has no title (occurs with click event), stop
        if (this == current || !this.title)
            return;

        // save current
        current = this;
        title = $(this).getAndSetAttr('title', '');

        if (this.tSettings.bodyHandler) {
            helper.title.hide();
            helper.body.html(this.tSettings.bodyHandler.call(this)).show();
        } else if (this.tSettings.showBody) {
            var parts = title.split(this.tSettings.showBody);
            helper.title.html(parts.shift()).show();
            helper.body.empty();
            for (var i = 0, part; part = parts[i]; i++) {
                if (i > 0)
                    helper.body.append("<br/>");
                helper.body.append(part);
            }
            helper.body.hideWhenEmpty();
        } else {
            helper.title.html(title).show();
            helper.body.hide();
        }

        // if element has href or src, add and show it, otherwise hide it
        if (this.tSettings.showURL && $(this).url())
            helper.url.html($(this).url().replace('http://', '')).show();
        else
            helper.url.hide();

        // add an optional class for this tip
        helper.parent.addClass(this.tSettings.extraClass);

        // fix PNG background for IE
        if (this.tSettings.fixPNG)
            helper.parent.fixPNG();
    }

    // delete timeout and show helper
    function show() {
        tID = null;
        helper.parent.show();
        update();
    }

    /**
    * callback for mousemove
    * updates the helper position
    * removes itself when no current element
    */
    function update(event) {
        // if no current element is available, remove this listener
        if (current == null) {
           // $('body').unbind('mousemove', update);
            return;
        }

        var left = helper.parent[0].offsetLeft;
        var top = helper.parent[0].offsetTop;
        if (event) {
            // position the helper 15 pixel to bottom right, starting from mouse position
            left = event.pageX + 15;
            top = event.pageY + 15;
           // top = 50;
           // left = 50;
            helper.parent.css({
                left: left + 'px',
                top: top + 'px'
            });
        }

        var v = viewport(),
			h = helper.parent[0];
        // check horizontal position
        if (v.x + v.cx < h.offsetLeft + h.offsetWidth) {
            left -= h.offsetWidth + 20;
            helper.parent.css({ left: left + 'px' });
        }
        // check vertical position
        if (v.y + v.cy < h.offsetTop + h.offsetHeight) {
            top -= h.offsetHeight + 20;
            helper.parent.css({ top: top + 'px' });
        }
    }

    function viewport() {
        var e = document.documentElement || {},
			b = document.body || {},
			w = window;
        function min() {
            var v = Infinity;
            for (var i = 0; i < arguments.length; i++) {
                var n = arguments[i];
                if (n && n < v) v = n;
            }
            return v;
        }
        return {
            x: w.pageXOffset || e.scrollLeft || b.scrollLeft || 0,
            y: w.pageYOffset || e.scrollTop || b.scrollTop || 0,
            cx: min(e.clientWidth, b.clientWidth, w.innerWidth),
            cy: min(e.clientHeight, b.clientHeight, w.innerHeight)
        };
    }

    // hide helper and restore added classes and the title
    function hide(event) {
        // clear timeout if possible
        if (tID)
            clearTimeout(tID);
        // no more current element
        current = null;

        helper.parent.hide().removeClass(this.tSettings.extraClass);

        // restore title and remove this listener
        if (event.type != "click") {
            $(this)
				.attr('title', title)
				.unbind('mouseout', hide);
        }
        if (this.tSettings.event != "click")
            $(this).unbind('click', hide);

        if (this.tSettings.fixPNG)
            helper.parent.unfixPNG();
    }

    $.Tooltip = {};

    // define global defaults, editable by client
    $.Tooltip.defaults = {
        delay: 250,
        event: "mouseover",
        showURL: true,
        extraClass: ""
    };

})(jQuery);
