/**
 * @author Alexander Farkas
 * v. 1.21
 */
(function($) {
    if (!document.defaultView || !document.defaultView.getComputedStyle) { // IE6-IE8
        var oldCurCSS = jQuery.curCSS;
        jQuery.curCSS = function(elem, name, force) {
            if (name === 'background-position') {
                name = 'backgroundPosition';
            }
            if (name !== 'backgroundPosition' || !elem.currentStyle || elem.currentStyle[ name ]) {
                return oldCurCSS.apply(this, arguments);
            }
            var style = elem.style;
            if (!force && style && style[ name ]) {
                return style[ name ];
            }
            return oldCurCSS(elem, 'backgroundPositionX', force) + ' ' + oldCurCSS(elem, 'backgroundPositionY', force);
        };
    }
    var oldAnim = $.fn.animate;
    $.fn.animate = function(prop) {
        if ('background-position' in prop) {
            prop.backgroundPosition = prop['background-position'];
            delete prop['background-position'];
        }
        if ('backgroundPosition' in prop) {
            prop.backgroundPosition = '(' + prop.backgroundPosition;
        }
        return oldAnim.apply(this, arguments);
    };
    function toArray(strg) {
        strg = strg.replace(/left|top/g, '0px');
        strg = strg.replace(/right|bottom/g, '100%');
        strg = strg.replace(/([0-9\.]+)(\s|\)|$)/g, "$1px$2");
        var res = strg.match(/(-?[0-9\.]+)(px|\%|em|pt)\s(-?[0-9\.]+)(px|\%|em|pt)/);
        return [parseFloat(res[1], 10),res[2],parseFloat(res[3], 10),res[4]];
    }

    $.fx.step.backgroundPosition = function(fx) {
        if (!fx.bgPosReady) {
            var start = $.curCSS(fx.elem, 'backgroundPosition');
            if (!start) {//FF2 no inline-style fallback
                start = '0px 0px';
            }
            start = toArray(start);
            fx.start = [start[0],start[2]];
            var end = toArray(fx.options.curAnim.backgroundPosition);
            fx.end = [end[0],end[2]];
            fx.unit = [end[1],end[3]];
            fx.bgPosReady = true;
        }
//return;
        var nowPosX = [];
        nowPosX[0] = ((fx.end[0] - fx.start[0]) * fx.pos) + fx.start[0] + fx.unit[0];
        nowPosX[1] = ((fx.end[1] - fx.start[1]) * fx.pos) + fx.start[1] + fx.unit[1];
        fx.elem.style.backgroundPosition = nowPosX[0] + ' ' + nowPosX[1];
    };
})(jQuery);
/**
 * jQuery.timers - Timer abstractions for jQuery
 * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)
 * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
 * Date: 2009/02/08
 *
 * @author Blair Mitchelmore
 * @version 1.1.2
 *
 **/
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.event.special
jQuery.extend({
            timer: {
                global: [],
                guid: 1,
                dataKey: "jQuery.timer",
                regex: /^([0-9]+(?:\.[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 = parseFloat(result[1]);
                        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;
                    var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {});
                    if (!timers[label])
                        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 (!timers[label][fn.timerID])
                        timers[label][fn.timerID] = window.setInterval(handler, interval);
                    this.global.push(element);
                },
                remove: function(element, label, fn) {
                    var timers = jQuery.data(element, this.dataKey), 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)
                            jQuery.removeData(element, this.dataKey);
                    }
                }
            }
        });
jQuery(window).bind("unload", function() {
    jQuery.each(jQuery.timer.global, function(index, item) {
        jQuery.timer.remove(item);
    });
});
