
/*
 * jQuery UI @VERSION
 * Copyright (c) 2008 Paul Bakaus (ui.jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 * http://ui.jquery.com/
 * $Date: 2008-05-04 16:52:15 +0200 (So, 04 Mai 2008) $
 * $Rev: 5419 $
 */
;
(function($){
    $.ui = {
        plugin: {
            add: function(module, option, set){
                var proto = $.ui[module].prototype;
                for (var i in set) {
                    proto.plugins[i] = proto.plugins[i] || [];
                    proto.plugins[i].push([option, set[i]]);
                }
            },
            call: function(instance, name, args){
                var set = instance.plugins[name];
                if (!set) {
                    return;
                }
                for (var i = 0; i < set.length; i++) {
                    if (instance.options[set[i][0]]) {
                        set[i][1].apply(instance.element, args);
                    }
                }
            }
        },
        cssCache: {},
        css: function(name){
            if ($.ui.cssCache[name]) {
                return $.ui.cssCache[name];
            }
            var tmp = $('<div class="ui-resizable-gen">').addClass(name).css({
                position: 'absolute',
                top: '-5000px',
                left: '-5000px',
                display: 'block'
            }).appendTo('body');
            $.ui.cssCache[name] = !!((!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) || !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor'))));
            try {
                $('body').get(0).removeChild(tmp.get(0));
            } 
            catch (e) {
            }
            return $.ui.cssCache[name];
        },
        disableSelection: function(e){
            e.unselectable = "on";
            e.onselectstart = function(){
                return false;
            };
            if (e.style) {
                e.style.MozUserSelect = "none";
            }
        },
        enableSelection: function(e){
            e.unselectable = "off";
            e.onselectstart = function(){
                return true;
            };
            if (e.style) {
                e.style.MozUserSelect = "";
            }
        },
        hasScroll: function(e, a){
            var scroll = /top/.test(a || "top") ? 'scrollTop' : 'scrollLeft', has = false;
            if (e[scroll] > 0) 
                return true;
            e[scroll] = 1;
            has = e[scroll] > 0 ? true : false;
            e[scroll] = 0;
            return has;
        }
    };
    var _remove = $.fn.remove;
    $.fn.remove = function(){
        $("*", this).add(this).trigger("remove");
        return _remove.apply(this, arguments);
    };
    function getter(namespace, plugin, method){
        var methods = $[namespace][plugin].getter || [];
        methods = (typeof methods == "string" ? methods.split(/,?\s+/) : methods);
        return ($.inArray(method, methods) != -1);
    }
    $.widget = function(name, prototype){
        var namespace = name.split(".")[0];
        name = name.split(".")[1];
        $.fn[name] = function(options){
            var isMethodCall = (typeof options == 'string'), args = Array.prototype.slice.call(arguments, 1);
            if (isMethodCall && getter(namespace, name, options)) {
                var instance = $.data(this[0], name);
                return (instance ? instance[options].apply(instance, args) : undefined);
            }
            return this.each(function(){
                var instance = $.data(this, name);
                if (isMethodCall && instance && $.isFunction(instance[options])) {
                    instance[options].apply(instance, args);
                }
                else 
                    if (!isMethodCall) {
                        $.data(this, name, new $[namespace][name](this, options));
                    }
            });
        };
        $[namespace][name] = function(element, options){
            var self = this;
            this.widgetName = name;
            this.widgetBaseClass = namespace + '-' + name;
            this.options = $.extend({
                disabled: false
            }, $[namespace][name].defaults, options);
            this.element = $(element).bind('setData.' + name, function(e, key, value){
                return self.setData(key, value);
            }).bind('getData.' + name, function(e, key){
                return self.getData(key);
            }).bind('remove', function(){
                return self.destroy();
            });
            this.init();
        };
        $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);
    };
    $.widget.prototype = {
        init: function(){
        },
        destroy: function(){
            this.element.removeData(this.widgetName);
        },
        getData: function(key){
            return this.options[key];
        },
        setData: function(key, value){
            this.options[key] = value;
            if (key == 'disabled') {
                this.element[value ? 'addClass' : 'removeClass'](this.widgetBaseClass + '-disabled');
            }
        },
        enable: function(){
            this.setData('disabled', false);
        },
        disable: function(){
            this.setData('disabled', true);
        }
    };
    $.ui.mouse = {
        mouseInit: function(){
            var self = this;
            this.element.bind('mousedown.' + this.widgetName, function(e){
                return self.mouseDown(e);
            });
            if ($.browser.msie) {
                this._mouseUnselectable = this.element.attr('unselectable');
                this.element.attr('unselectable', 'on');
            }
            this.started = false;
        },
        mouseDestroy: function(){
            this.element.unbind('.' + this.widgetName);
            ($.browser.msie && this.element.attr('unselectable', this._mouseUnselectable));
        },
        mouseDown: function(e){
            (this._mouseStarted && this.mouseUp(e));
            this._mouseDownEvent = e;
            var self = this, btnIsLeft = (e.which == 1), elIsCancel = (typeof this.options.cancel == "string" ? $(e.target).is(this.options.cancel) : false);
            if (!btnIsLeft || elIsCancel || !this.mouseCapture(e)) {
                return true;
            }
            this._mouseDelayMet = !this.options.delay;
            if (!this._mouseDelayMet) {
                this._mouseDelayTimer = setTimeout(function(){
                    self._mouseDelayMet = true;
                }, this.options.delay);
            }
            if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) {
                this._mouseStarted = (this.mouseStart(e) !== false);
                if (!this._mouseStarted) {
                    e.preventDefault();
                    return true;
                }
            }
            this._mouseMoveDelegate = function(e){
                return self.mouseMove(e);
            };
            this._mouseUpDelegate = function(e){
                return self.mouseUp(e);
            };
            $(document).bind('mousemove.' + this.widgetName, this._mouseMoveDelegate).bind('mouseup.' + this.widgetName, this._mouseUpDelegate);
            return false;
        },
        mouseMove: function(e){
            if ($.browser.msie && !e.button) {
                return this.mouseUp(e);
            }
            if (this._mouseStarted) {
                this.mouseDrag(e);
                return false;
            }
            if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) {
                this._mouseStarted = (this.mouseStart(this._mouseDownEvent, e) !== false);
                (this._mouseStarted ? this.mouseDrag(e) : this.mouseUp(e));
            }
            return !this._mouseStarted;
        },
        mouseUp: function(e){
            $(document).unbind('mousemove.' + this.widgetName, this._mouseMoveDelegate).unbind('mouseup.' + this.widgetName, this._mouseUpDelegate);
            if (this._mouseStarted) {
                this._mouseStarted = false;
                this.mouseStop(e);
            }
            return false;
        },
        mouseDistanceMet: function(e){
            return (Math.max(Math.abs(this._mouseDownEvent.pageX - e.pageX), Math.abs(this._mouseDownEvent.pageY - e.pageY)) >= this.options.distance);
        },
        mouseDelayMet: function(e){
            return this._mouseDelayMet;
        },
        mouseStart: function(e){
        },
        mouseDrag: function(e){
        },
        mouseStop: function(e){
        },
        mouseCapture: function(e){
            return true;
        }
    };
    $.ui.mouse.defaults = {
        cancel: null,
        distance: 1,
        delay: 0
    };
})(jQuery);



/* jQuery Tabs 
 * Copyright (c) 2008 Paul Bakaus (ui.jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 * http://ui.jquery.com/
 * $Date: 2008-05-04 16:52:15 +0200 (So, 04 Mai 2008) $
 * $Rev: 5419 $
 */
(function($){
    $.widget("ui.tabs", {
        init: function(){
            this.options.event += '.tabs';
            this.tabify(true);
        },
        setData: function(key, value){
            if ((/^selected/).test(key)) 
                this.select(value);
            else {
                this.options[key] = value;
                this.tabify();
            }
        },
        length: function(){
            return this.$tabs.length;
        },
        tabId: function(a){
            return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') || this.options.idPrefix + $.data(a);
        },
        ui: function(tab, panel){
            return {
                options: this.options,
                tab: tab,
                panel: panel
            };
        },
        tabify: function(init){
            this.$lis = $('li:has(a[href])', this.element);
            this.$tabs = this.$lis.map(function(){
                return $('a', this)[0];
            });
            this.$panels = $([]);
            var self = this, o = this.options;
            this.$tabs.each(function(i, a){
                if (a.hash && a.hash.replace('#', '')) 
                    self.$panels = self.$panels.add(a.hash);
                else 
                    if ($(a).attr('href') != '#') {
                        $.data(a, 'href.tabs', a.href);
                        $.data(a, 'load.tabs', a.href);
                        var id = self.tabId(a);
                        a.href = '#' + id;
                        var $panel = $('#' + id);
                        if (!$panel.length) {
                            $panel = $(o.panelTemplate).attr('id', id).addClass(o.panelClass).insertAfter(self.$panels[i - 1] || self.element);
                            $panel.data('destroy.tabs', true);
                        }
                        self.$panels = self.$panels.add($panel);
                    }
                    else 
                        o.disabled.push(i + 1);
            });
            if (init) {
                this.element.addClass(o.navClass);
                this.$panels.each(function(){
                    var $this = $(this);
                    $this.addClass(o.panelClass);
                });
                if (o.selected === undefined) {
                    if (location.hash) {
                        this.$tabs.each(function(i, a){
                            if (a.hash == location.hash) {
                                o.selected = i;
                                if ($.browser.msie || $.browser.opera) {
                                    var $toShow = $(location.hash), toShowId = $toShow.attr('id');
                                    $toShow.attr('id', '');
                                    setTimeout(function(){
                                        $toShow.attr('id', toShowId);
                                    }, 500);
                                }
                                scrollTo(0, 0);
                                return false;
                            }
                        });
                    }
                    else 
                        if (o.cookie) {
                            var index = parseInt($.cookie('ui-tabs' + $.data(self.element)), 10);
                            if (index && self.$tabs[index]) 
                                o.selected = index;
                        }
                        else 
                            if (self.$lis.filter('.' + o.selectedClass).length) 
                                o.selected = self.$lis.index(self.$lis.filter('.' + o.selectedClass)[0]);
                }
                o.selected = o.selected === null || o.selected !== undefined ? o.selected : 0;
                o.disabled = $.unique(o.disabled.concat($.map(this.$lis.filter('.' + o.disabledClass), function(n, i){
                    return self.$lis.index(n);
                }))).sort();
                if ($.inArray(o.selected, o.disabled) != -1) 
                    o.disabled.splice($.inArray(o.selected, o.disabled), 1);
                this.$panels.addClass(o.hideClass);
                this.$lis.removeClass(o.selectedClass);
                if (o.selected !== null) {
                    this.$panels.eq(o.selected).show().removeClass(o.hideClass);
                    this.$lis.eq(o.selected).addClass(o.selectedClass);
                    var onShow = function(){
                        $(self.element).triggerHandler('tabsshow', [self.ui(self.$tabs[o.selected], self.$panels[o.selected])], o.show);
                    };
                    if ($.data(this.$tabs[o.selected], 'load.tabs')) 
                        this.load(o.selected, onShow);
                    else 
                        onShow();
                }
                $(window).bind('unload', function(){
                    self.$tabs.unbind('.tabs');
                    self.$lis = self.$tabs = self.$panels = null;
                });
            }
            for (var i = 0, li; li = this.$lis[i]; i++) 
                $(li)[$.inArray(i, o.disabled) != -1 && !$(li).hasClass(o.selectedClass) ? 'addClass' : 'removeClass'](o.disabledClass);
            if (o.cache === false) 
                this.$tabs.removeData('cache.tabs');
            var hideFx, showFx, baseFx = {
                'min-width': 0,
                duration: 1
            }, baseDuration = 'normal';
            if (o.fx && o.fx.constructor == Array) 
                hideFx = o.fx[0] || baseFx, showFx = o.fx[1] || baseFx;
            else 
                hideFx = showFx = o.fx || baseFx;
            var resetCSS = {
                display: '',
                overflow: '',
                height: ''
            };
            if (!$.browser.msie) 
                resetCSS.opacity = '';
            function hideTab(clicked, $hide, $show){
                $hide.animate(hideFx, hideFx.duration || baseDuration, function(){
                    $hide.addClass(o.hideClass).css(resetCSS);
                    if ($.browser.msie && hideFx.opacity) 
                        $hide[0].style.filter = '';
                    if ($show) 
                        showTab(clicked, $show, $hide);
                });
            }
            function showTab(clicked, $show, $hide){
                if (showFx === baseFx) 
                    $show.css('display', 'block');
                $show.animate(showFx, showFx.duration || baseDuration, function(){
                    $show.removeClass(o.hideClass).css(resetCSS);
                    if ($.browser.msie && showFx.opacity) 
                        $show[0].style.filter = '';
                    $(self.element).triggerHandler('tabsshow', [self.ui(clicked, $show[0])], o.show);
                });
            }
            function switchTab(clicked, $li, $hide, $show){
                $li.addClass(o.selectedClass).siblings().removeClass(o.selectedClass);
                hideTab(clicked, $hide, $show);
            }
            this.$tabs.unbind('.tabs').bind(o.event, function(){
                var $li = $(this).parents('li:eq(0)'), $hide = self.$panels.filter(':visible'), $show = $(this.hash);
                if (($li.hasClass(o.selectedClass) && !o.unselect) || $li.hasClass(o.disabledClass) || $(this).hasClass(o.loadingClass) || $(self.element).triggerHandler('tabsselect', [self.ui(this, $show[0])], o.select) === false) {
                    this.blur();
                    return false;
                }
                self.options.selected = self.$tabs.index(this);
                if (o.unselect) {
                    if ($li.hasClass(o.selectedClass)) {
                        self.options.selected = null;
                        $li.removeClass(o.selectedClass);
                        self.$panels.stop();
                        hideTab(this, $hide);
                        this.blur();
                        return false;
                    }
                    else 
                        if (!$hide.length) {
                            self.$panels.stop();
                            var a = this;
                            self.load(self.$tabs.index(this), function(){
                                $li.addClass(o.selectedClass).addClass(o.unselectClass);
                                showTab(a, $show);
                            });
                            this.blur();
                            return false;
                        }
                }
                if (o.cookie) 
                    $.cookie('ui-tabs' + $.data(self.element), self.options.selected, o.cookie);
                self.$panels.stop();
                if ($show.length) {
                    var a = this;
                    self.load(self.$tabs.index(this), $hide.length ? function(){
                        switchTab(a, $li, $hide, $show);
                    }
 : function(){
                        $li.addClass(o.selectedClass);
                        showTab(a, $show);
                    });
                }
                else 
                    throw 'jQuery UI Tabs: Mismatching fragment identifier.';
                if ($.browser.msie) 
                    this.blur();
                return false;
            });
            if (!(/^click/).test(o.event)) 
                this.$tabs.bind('click.tabs', function(){
                    return false;
                });
        },
        add: function(url, label, index){
            if (index == undefined) 
                index = this.$tabs.length;
            var o = this.options;
            var $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label));
            $li.data('destroy.tabs', true);
            var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId($('a:first-child', $li)[0]);
            var $panel = $('#' + id);
            if (!$panel.length) {
                $panel = $(o.panelTemplate).attr('id', id).addClass(o.hideClass).data('destroy.tabs', true);
            }
            $panel.addClass(o.panelClass);
            if (index >= this.$lis.length) {
                $li.appendTo(this.element);
                $panel.appendTo(this.element[0].parentNode);
            }
            else {
                $li.insertBefore(this.$lis[index]);
                $panel.insertBefore(this.$panels[index]);
            }
            o.disabled = $.map(o.disabled, function(n, i){
                return n >= index ? ++n : n
            });
            this.tabify();
            if (this.$tabs.length == 1) {
                $li.addClass(o.selectedClass);
                $panel.removeClass(o.hideClass);
                var href = $.data(this.$tabs[0], 'load.tabs');
                if (href) 
                    this.load(index, href);
            }
            this.element.triggerHandler('tabsadd', [this.ui(this.$tabs[index], this.$panels[index])], o.add);
        },
        remove: function(index){
            var o = this.options, $li = this.$lis.eq(index).remove(), $panel = this.$panels.eq(index).remove();
            if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1) 
                this.select(index + (index + 1 < this.$tabs.length ? 1 : -1));
            o.disabled = $.map($.grep(o.disabled, function(n, i){
                return n != index;
            }), function(n, i){
                return n >= index ? --n : n
            });
            this.tabify();
            this.element.triggerHandler('tabsremove', [this.ui($li.find('a')[0], $panel[0])], o.remove);
        },
        enable: function(index){
            var o = this.options;
            if ($.inArray(index, o.disabled) == -1) 
                return;
            var $li = this.$lis.eq(index).removeClass(o.disabledClass);
            if ($.browser.safari) {
                $li.css('display', 'inline-block');
                setTimeout(function(){
                    $li.css('display', 'block');
                }, 0);
            }
            o.disabled = $.grep(o.disabled, function(n, i){
                return n != index;
            });
            this.element.triggerHandler('tabsenable', [this.ui(this.$tabs[index], this.$panels[index])], o.enable);
        },
        disable: function(index){
            var self = this, o = this.options;
            if (index != o.selected) {
                this.$lis.eq(index).addClass(o.disabledClass);
                o.disabled.push(index);
                o.disabled.sort();
                this.element.triggerHandler('tabsdisable', [this.ui(this.$tabs[index], this.$panels[index])], o.disable);
            }
        },
        select: function(index){
            if (typeof index == 'string') 
                index = this.$tabs.index(this.$tabs.filter('[href$=' + index + ']')[0]);
            this.$tabs.eq(index).trigger(this.options.event);
        },
        load: function(index, callback){
            var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0], bypassCache = callback == undefined || callback === false, url = $a.data('load.tabs');
            callback = callback ||
            function(){
            };
            if (!url || !bypassCache && $.data(a, 'cache.tabs')) {
                callback();
                return;
            }
            var inner = function(parent){
                var $parent = $(parent), $inner = $parent.find('*:last');
                return $inner.length && $inner || $parent;
            };
            var cleanup = function(){
                self.$tabs.filter('.' + o.loadingClass).removeClass(o.loadingClass).each(function(){
                    if (o.spinner) 
                        inner(this).parent().html(inner(this).data('label.tabs'));
                });
                self.xhr = null;
            };
            if (o.spinner) {
                var label = inner(a).html();
                inner(a).wrapInner('<em></em>').find('em').data('label.tabs', label).html(o.spinner);
            }
            var ajaxOptions = $.extend({}, o.ajaxOptions, {
                url: url,
                success: function(r, s){
                    $(a.hash).html(r);
                    cleanup();
                    if (o.cache) 
                        $.data(a, 'cache.tabs', true);
                    $(self.element).triggerHandler('tabsload', [self.ui(self.$tabs[index], self.$panels[index])], o.load);
                    o.ajaxOptions.success && o.ajaxOptions.success(r, s);
                    callback();
                }
            });
            if (this.xhr) {
                this.xhr.abort();
                cleanup();
            }
            $a.addClass(o.loadingClass);
            setTimeout(function(){
                self.xhr = $.ajax(ajaxOptions);
            }, 0);
        },
        url: function(index, url){
            this.$tabs.eq(index).removeData('cache.tabs').data('load.tabs', url);
        },
        destroy: function(){
            var o = this.options;
            this.element.unbind('.tabs').removeClass(o.navClass).removeData('tabs');
            this.$tabs.each(function(){
                var href = $.data(this, 'href.tabs');
                if (href) 
                    this.href = href;
                var $this = $(this).unbind('.tabs');
                $.each(['href', 'load', 'cache'], function(i, prefix){
                    $this.removeData(prefix + '.tabs');
                });
            });
            this.$lis.add(this.$panels).each(function(){
                if ($.data(this, 'destroy.tabs')) 
                    $(this).remove();
                else 
                    $(this).removeClass([o.selectedClass, o.unselectClass, o.disabledClass, o.panelClass, o.hideClass].join(' '));
            });
        }
    });
    $.ui.tabs.defaults = {
        unselect: false,
        event: 'click',
        disabled: [],
        cookie: null,
        spinner: 'Loading&#8230;',
        cache: false,
        idPrefix: 'ui-tabs-',
        ajaxOptions: {},
        fx: null,
        tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>',
        panelTemplate: '<div></div>',
        navClass: 'ui-tabs-nav',
        selectedClass: 'ui-tabs-selected',
        unselectClass: 'ui-tabs-unselect',
        disabledClass: 'ui-tabs-disabled',
        panelClass: 'ui-tabs-panel',
        hideClass: 'ui-tabs-hide',
        loadingClass: 'ui-tabs-loading'
    };
    $.ui.tabs.getter = "length";
    $.extend($.ui.tabs.prototype, {
        rotation: null,
        rotate: function(ms, continuing){
            continuing = continuing || false;
            var self = this, t = this.options.selected;
            function start(){
                self.rotation = setInterval(function(){
                    t = ++t < self.$tabs.length ? t : 0;
                    self.select(t);
                }, ms);
            }
            function stop(e){
                if (!e || e.clientX) {
                    clearInterval(self.rotation);
                }
            }
            if (ms) {
                start();
                if (!continuing) 
                    this.$tabs.bind(this.options.event, stop);
                else 
                    this.$tabs.bind(this.options.event, function(){
                        stop();
                        t = self.options.selected;
                        start();
                    });
            }
            else {
                stop();
                this.$tabs.unbind(this.options.event, stop);
            }
        }
    });
})(jQuery);


/* 
 * jQuery bgIframe plugin 2.1.1
 * Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * $LastChangedDate: 2007-07-21 18:45:56 -0500 (Sat, 21 Jul 2007) $
 * $Rev: 2447 $
 * Version 2.1.1
 */
(function($){
    $.fn.bgIframe = $.fn.bgiframe = function(s){
        if ($.browser.msie && /6.0/.test(navigator.userAgent)) {
            s = $.extend({
                top: 'auto',
                left: 'auto',
                width: 'auto',
                height: 'auto',
                opacity: true,
                src: 'javascript:false;'
            }, s ||
            {});
            var prop = function(n){
                return n && n.constructor == Number ? n + 'px' : n;
            }, html = '<iframe class="bgiframe"frameborder="0"tabindex="-1"src="' + s.src + '"' + 'style="display:block;position:absolute;z-index:-1;' + (s.opacity !== false ? 'filter:Alpha(Opacity=\'0\');' : '') + 'top:' + (s.top == 'auto' ? 'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')' : prop(s.top)) + ';' + 'left:' + (s.left == 'auto' ? 'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')' : prop(s.left)) + ';' + 'width:' + (s.width == 'auto' ? 'expression(this.parentNode.offsetWidth+\'px\')' : prop(s.width)) + ';' + 'height:' + (s.height == 'auto' ? 'expression(this.parentNode.offsetHeight+\'px\')' : prop(s.height)) + ';' + '"/>';
            return this.each(function(){
                if ($('> iframe.bgiframe', this).length == 0) 
                    this.insertBefore(document.createElement(html), this.firstChild);
            });
        }
        return this;
    };
})(jQuery);

/*
 * jQuery Tooltip plugin 1.1
 * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/
 * 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: jquery.tooltip.js 2237 2007-07-04 19:11:15Z joern.zaefferer $
 */
(function($){
    var helper = {}, current, title, tID, IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent), track = false;
    $.Tooltip = {
        blocked: false,
        defaults: {
            delay: 200,
            showURL: true,
            extraClass: "",
            top: 15,
            left: 15
        },
        block: function(){
            $.Tooltip.blocked = !$.Tooltip.blocked;
        }
    };
    $.fn.extend({
        Tooltip: function(settings){
            settings = $.extend({}, $.Tooltip.defaults, settings);
            createHelper();
            return this.each(function(){
                this.tSettings = settings;
                this.tooltipText = this.title;
                $(this).removeAttr("title");
                this.alt = "";
            }).hover(save, hide).click(hide);
        },
        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;
        },
        hideWhenEmpty: function(){
            return this.each(function(){
                $(this)[$(this).html() ? "show" : "hide"]();
            });
        },
        url: function(){
            return this.attr('href') || this.attr('src');
        }
    });
    function createHelper(){
        if (helper.parent) 
            return;
        helper.parent = $('<div id="tooltip"><h3></h3><div class="body"></div><div class="url"></div></div>').hide().appendTo('body');
        if ($.fn.bgiframe) 
            helper.parent.bgiframe();
        helper.title = $('h3', helper.parent);
        helper.body = $('div.body', helper.parent);
        helper.url = $('div.url', helper.parent);
    }
    function handle(event){
        if (this.tSettings.delay) 
            tID = setTimeout(show, this.tSettings.delay);
        else 
            show();
        track = !!this.tSettings.track;
        $('body').bind('mousemove', update);
        update(event);
    }
    function save(){
        if ($.Tooltip.blocked || this == current || !this.tooltipText) 
            return;
        current = this;
        title = this.tooltipText;
        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 (this.tSettings.showURL && $(this).url()) 
            helper.url.html($(this).url().replace('http://', '')).show();
        else 
            helper.url.hide();
        helper.parent.addClass(this.tSettings.extraClass);
        if (this.tSettings.fixPNG) 
            helper.parent.fixPNG();
        handle.apply(this, arguments);
    }
    function show(){
        tID = null;
        helper.parent.show();
        update();
    }
    function update(event){
        if ($.Tooltip.blocked) 
            return;
        if (!track && helper.parent.is(":visible")) {
            $('body').unbind('mousemove', update)
        }
        if (current == null) {
            $('body').unbind('mousemove', update);
            return;
        }
        var left = helper.parent[0].offsetLeft;
        var top = helper.parent[0].offsetTop;
        if (event) {
            left = event.pageX + current.tSettings.left;
            top = event.pageY + current.tSettings.top;
            helper.parent.css({
                left: left + 'px',
                top: top + 'px'
            });
        }
        var v = viewport(), h = helper.parent[0];
        if (v.x + v.cx < h.offsetLeft + h.offsetWidth) {
            left -= h.offsetWidth + 20 + current.tSettings.left;
            helper.parent.css({
                left: left + 'px'
            });
        }
        if (v.y + v.cy < h.offsetTop + h.offsetHeight) {
            top -= h.offsetHeight + 20 + current.tSettings.top;
            helper.parent.css({
                top: top + 'px'
            });
        }
    }
    function viewport(){
        return {
            x: $(window).scrollLeft(),
            y: $(window).scrollTop(),
            cx: $(window).width(),
            cy: $(window).height()
        };
    }
    function hide(event){
        if ($.Tooltip.blocked) 
            return;
        if (tID) 
            clearTimeout(tID);
        current = null;
        helper.parent.hide().removeClass(this.tSettings.extraClass);
        if (this.tSettings.fixPNG) 
            helper.parent.unfixPNG();
    }
})(jQuery);




