﻿jQuery.fn.extend({
    everyTime: function(interval, label, fn, times, belay) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, times, belay);
        });
    },
    oneTime: function(interval, label, fn) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, 1);
        });
    },
    stopTime: function(label, fn) {
        return this.each(function() {
            jQuery.timer.remove(this, label, fn);
        });
    }
});
jQuery.extend({
    timer: {
        guid: 1,
        global: {},
        regex: /^([0-9]+)\s*(.*s)?$/,
        powers: {
            // Yeah this is major overkill...
            'ms': 1,
            'cs': 10,
            'ds': 100,
            's': 1000,
            'das': 10000,
            'hs': 100000,
            'ks': 1000000
        },
        timeParse: function(value) {
            if (value == undefined || value == null)
                return null;
            var result = this.regex.exec(jQuery.trim(value.toString()));
            if (result[2]) {
                var num = parseInt(result[1], 10);
                var mult = this.powers[result[2]] || 1;
                return num * mult;
            } else {
                return value;
            }
        },
        add: function(element, interval, label, fn, times, belay) {
            var counter = 0;
            if (jQuery.isFunction(label)) {
                if (!times)
                    times = fn;
                fn = label;
                label = interval;
            }
            interval = jQuery.timer.timeParse(interval);
            if (typeof interval != 'number' || isNaN(interval) || interval <= 0)
                return;
            if (times && times.constructor != Number) {
                belay = !!times;
                times = 0;
            }
            times = times || 0;
            belay = belay || false;
            if (!element.$timers)
                element.$timers = {};
            if (!element.$timers[label])
                element.$timers[label] = {};
            fn.$timerID = fn.$timerID || this.guid++;
            var handler = function() {
                if (belay && this.inProgress)
                    return;
                this.inProgress = true;
                if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
                    jQuery.timer.remove(element, label, fn);
                this.inProgress = false;
            };
            handler.$timerID = fn.$timerID;
            if (!element.$timers[label][fn.$timerID])
                element.$timers[label][fn.$timerID] = window.setInterval(handler, interval);
            if (!this.global[label])
                this.global[label] = [];
            this.global[label].push(element);
        },
        remove: function(element, label, fn) {
            var timers = element.$timers, ret;
            if (timers) {
                if (!label) {
                    for (label in timers)
                        this.remove(element, label, fn);
                } else if (timers[label]) {
                    if (fn) {
                        if (fn.$timerID) {
                            window.clearInterval(timers[label][fn.$timerID]);
                            delete timers[label][fn.$timerID];
                        }
                    } else {
                        for (var fn in timers[label]) {
                            window.clearInterval(timers[label][fn]);
                            delete timers[label][fn];
                        }
                    }
                    for (ret in timers[label]) break;
                    if (!ret) {
                        ret = null;
                        delete timers[label];
                    }
                }
                for (ret in timers) break;
                if (!ret)
                    element.$timers = null;
            }
        }
    }
});
if (jQuery.browser.msie)
    jQuery(window).one("unload", function() {
        var global = jQuery.timer.global;
        for (var label in global) {
            var els = global[label], i = els.length;
            while (--i)
                jQuery.timer.remove(els[i], label);
        }
    });
(function($) {
    var dropShadowZindex = 1; //z-index counter
    $.fn.dropShadow = function(options) {
        // Default options
        var opt = $.extend({
            left: 4,
            top: 4,
            blur: 2,
            opacity: .5,
            color: "black",
            swap: false
        }, options);
        var jShadows = $([]); //empty jQuery collection
        // Loop through original elements
        this.not(".dropShadow").each(function() {
            var jthis = $(this);
            var shadows = [];
            var blur = (opt.blur <= 0) ? 0 : opt.blur;
            var opacity = (blur == 0) ? opt.opacity : opt.opacity / (blur * 8);
            var zOriginal = (opt.swap) ? dropShadowZindex : dropShadowZindex + 1;
            var zShadow = (opt.swap) ? dropShadowZindex + 1 : dropShadowZindex;
            // Create ID for shadow
            var shadowId;
            if (this.id) {
                shadowId = this.id + "_dropShadow";
            }
            else {
                shadowId = "ds" + (1 + Math.floor(9999 * Math.random()));
            }
            // Modify original element
            $.data(this, "shadowId", shadowId); //store id in expando
            $.data(this, "shadowOptions", options); //store options in expando
            jthis
.attr("shadowId", shadowId)
.css("zIndex", zOriginal);
            if (jthis.css("position") != "absolute") {
                jthis.css({
                    position: "relative",
                    zoom: 1 //for IE layout
                });
            }
            // Create first shadow layer
            bgColor = jthis.css("backgroundColor");
            if (bgColor == "rgba(0, 0, 0, 0)") bgColor = "transparent"; //Safari
            if (bgColor != "transparent" || jthis.css("backgroundImage") != "none"
|| this.nodeName == "SELECT"
|| this.nodeName == "INPUT"
|| this.nodeName == "TEXTAREA") {
                shadows[0] = $("<div></div>")
.css("background", opt.color);
            }
            else {
                shadows[0] = jthis
.clone()
.removeAttr("id")
.removeAttr("name")
.removeAttr("shadowId")
.css("color", opt.color);
            }
            shadows[0]
.addClass("dropShadow")
.css({
    height: jthis.outerHeight(),
    left: blur,
    opacity: opacity,
    position: "absolute",
    top: blur,
    width: jthis.outerWidth(),
    zIndex: zShadow
});
            // Create other shadow layers
            var layers = (8 * blur) + 1;
            for (i = 1; i < layers; i++) {
                shadows[i] = shadows[0].clone();
            }
            // Position layers
            var i = 1;
            var j = blur;
            while (j > 0) {
                shadows[i].css({ left: j * 2, top: 0 }); //top
                shadows[i + 1].css({ left: j * 4, top: j * 2 }); //right
                shadows[i + 2].css({ left: j * 2, top: j * 4 }); //bottom
                shadows[i + 3].css({ left: 0, top: j * 2 }); //left
                shadows[i + 4].css({ left: j * 3, top: j }); //top-right
                shadows[i + 5].css({ left: j * 3, top: j * 3 }); //bottom-right
                shadows[i + 6].css({ left: j, top: j * 3 }); //bottom-left
                shadows[i + 7].css({ left: j, top: j }); //top-left
                i += 8;
                j--;
            }
            // Create container
            var divShadow = $("<div></div>")
.attr("id", shadowId)
.addClass("dropShadow")
.css({
    left: jthis.position().left + opt.left - blur,
    marginTop: jthis.css("marginTop"),
    marginRight: jthis.css("marginRight"),
    marginBottom: jthis.css("marginBottom"),
    marginLeft: jthis.css("marginLeft"),
    position: "absolute",
    top: jthis.position().top + opt.top - blur,
    zIndex: zShadow
});
            // Add layers to container
            for (i = 0; i < layers; i++) {
                divShadow.append(shadows[i]);
            }
            // Add container to DOM
            jthis.after(divShadow);
            // Add shadow to return set
            jShadows = jShadows.add(divShadow);
            // Re-align shadow on window resize
            $(window).resize(function() {
                try {
                    divShadow.css({
                        left: jthis.position().left + opt.left - blur,
                        top: jthis.position().top + opt.top - blur
                    });
                }
                catch (e) { }
            });
            // Increment z-index counter
            dropShadowZindex += 2;
        }); //end each
        return this.pushStack(jShadows);
    };
    $.fn.redrawShadow = function() {
        // Remove existing shadows
        this.removeShadow();
        // Draw new shadows
        return this.each(function() {
            var shadowOptions = $.data(this, "shadowOptions");
            $(this).dropShadow(shadowOptions);
        });
    };
    $.fn.removeShadow = function() {
        return this.each(function() {
            var shadowId = $(this).shadowId();
            $("div#" + shadowId).remove();
        });
    };
    $.fn.shadowId = function() {
        return $.data(this[0], "shadowId");
    };
    $(function() {
        // Suppress printing of shadows
        var noPrint = "<style type='text/css' media='print'>";
        noPrint += ".dropShadow{visibility:hidden;}</style>";
        $("head").append(noPrint);
    });
})(jQuery);
(function($) {
    jQuery.fn.mbTooltip = function(options) {
        return this.each(function() {
            this.options = {
                live: true,
                opacity: .9,
                wait: 2000,
                timePerWord: 70,
                cssClass: "default",
                hasArrow: true,
                imgPath: "images/",
                hasShadow: true,
                shadowColor: "black",
                shadowLeft: 1,
                ancor: "mouse", //"parent",
                shadowTop: 1,
                mb_fade: 200
            };
            $.extend(this.options, options);
            if (this.options.live) $("[title]").live("mouseover", function() { $(this).mbTooltip(options); });
            var ttEl = $(this).is("[title]") ? $(this) : $(this).find("[title]");
            var wait = this.options.wait;
            var hasShadow = this.options.hasShadow;
            var fade = this.options.mb_fade;
            var myOptions = this.options;
            $(ttEl).each(function() {
                $(this).attr("tooltip", $(this).attr("title"));
                $(this).removeAttr("title");
                $(this).attr("tooltipEnable", "true");
                var theEl = $(this);
                var ttCont = theEl.attr("tooltip");
                var hover = $.browser.msie ? "mouseenter" : "mouseover";
                $(this).bind(hover, function(e) {
                    if (myOptions.ancor == "mouse") $().mb_getXY();
                    $(this).one("mouseout", function() {
                        $(this).stopTime();
                        $(this).deleteTooltip(hasShadow, fade);
                    }).one("click", function() {
                        $(this).stopTime();
                        $(this).deleteTooltip(hasShadow, fade);
                    });
                    $(this).oneTime(wait, function() {
                        if ($(this).attr("tooltipEnable") == "true")
                            $(this).buildTooltip(ttCont, myOptions, e);
                    });
                });
            });
        });
    };
    var mbX = 0;
    var mbY = 0;
    $.fn.extend({
        mb_getXY: function() {
            $().bind("mousemove", function(e) {
                mbX = e.pageX;
                mbY = e.pageY;
            });
            return { x: mbX, y: mbY };
        },
        buildTooltip: function(cont, options) {
            this.options = {};
            $.extend(this.options, options);
            var parent = $(this);
            $("body").append("<div id='tooltip'></div>");
            var imgUrl = this.options.imgPath + "up.png";
            $("#tooltip").html(cont);
            $("#tooltip").addClass(this.options.cssClass);
            if (this.options.hasArrow) {
                $("#tooltip").prepend("<img id='ttimg' src='" + imgUrl + "'>");
                $("#ttimg").css({
                    position: "absolute",
                    opacity: .5
                });
                $("#ttimg").addClass("top");
            }
            $("#tooltip").css({
                position: "absolute",
                top: this.options.ancor == "mouse" ? $().mb_getXY().y + 7 : parent.offset().top + (parent.outerHeight()),
                left: this.options.ancor == "mouse" ? $().mb_getXY().x + 7 : parent.offset().left,
                opacity: 0
            });
            $("#tooltip").findBestPos(parent, this.options.imgPath, this.options.ancor);
            if (this.options.ancor == "mouse") $().unbind("mousemove");
            if (this.options.hasShadow) {
                $("#tooltip").dropShadow({ left: this.options.shadowLeft, top: this.options.shadowTop, blur: 2, opacity: 0.3, color: this.options.shadowColor });
                $(".dropShadow").css("display", "none");
                $(".dropShadow").mb_BringToFront();
                $(".dropShadow").fadeIn(this.options.mb_fade);
            }
            $("#tooltip").mb_BringToFront();
            $("#tooltip").fadeTo(this.options.mb_fade, this.options.opacity, function() { });
            var timetoshow = 3000 + cont.length * this.options.timePerWord;
            var hasShadow = this.options.hasShadow;
            var fade = this.options.mb_fade;
            $(this).oneTime(timetoshow, function() { $(this).deleteTooltip(hasShadow, fade); });
        },
        deleteTooltip: function(hasShadow, fade) {
            var sel = hasShadow ? "#tooltip,.dropShadow" : "#tooltip";
            $(sel).fadeOut(fade, function() { $(sel).remove(); });
        },
        findBestPos: function(parent, imgPath, ancor) {
            var theEl = $(this);
            var ww = $(window).width() + $(window).scrollLeft();
            var wh = $(window).height() + $(window).scrollTop();
            var w = theEl.outerWidth();
            theEl.css({ width: w });
            var t = ((theEl.offset().top + theEl.outerHeight(true)) > wh) ? theEl.offset().top - (ancor != "mouse" ? parent.outerHeight() : 0) - theEl.outerHeight() - 20 : theEl.offset().top;
            t = t < 0 ? 0 : t;
            var l = ((theEl.offset().left + w) > ww - 5) ? theEl.offset().left - (w - (ancor != "mouse" ? parent.outerWidth() : 0)) : theEl.offset().left;
            l = l < 0 ? 0 : l;
            if (theEl.offset().top + theEl.outerHeight(true) > wh) {
                $("#ttimg").attr("src", imgPath + "bottom.png");
                $("#ttimg").removeClass("top").addClass("bottom");
            }
            theEl.css({ width: w, top: t, left: l });
        },
        disableTooltip: function() {
            $(this).find("[tooltip]").attr("tooltipEnable", "false");
        },
        enableTooltip: function() {
            $(this).find("[tooltip]").attr("tooltipEnable", "true");
        }
    });
    jQuery.fn.mb_BringToFront = function() {
        var zi = 10;
        $('*').each(function() {
            if ($(this).css("position") == "absolute") {
                var cur = parseInt($(this).css('zIndex'));
                zi = cur > zi ? parseInt($(this).css('zIndex')) : zi;
            }
        });
        $(this).css('zIndex', zi += 100);
    };
    $(function() {
        //due to a problem of getter/setter for select
        $("select[title]").each(function() {
            var selectSpan = $("<span></span>");
            selectSpan.attr("title", $(this).attr("title"));
            $(this).wrapAll(selectSpan);
            $(this).removeAttr("title");
        });
    });
})(jQuery);

