﻿/*
* 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://docs.jquery.com/UI
*
* $Date: 2008-04-01 08:23:47 -0500 (Tue, 01 Apr 2008) $
* $Rev: 5174 $
*/
; (function($) {

    //If the UI scope is not available, add it
    $.ui = $.ui || {};

    //Add methods that are vital for all mouse interaction stuff (plugin registering)
    $.extend($.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, arguments) {
                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, arguments);
                }
            }
        },
        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');

            //if (!$.browser.safari)
            //tmp.appendTo('body'); 

            //Opera and Safari set width and height to 0px instead of auto
            //Safari returns rgba(0,0,0,0) when bgcolor is not set
            $.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;
        }
    });

    /******* fn scope modifications ********/

    $.each(['Left', 'Top'], function(i, name) {
        if (!$.fn['scroll' + name]) $.fn['scroll' + name] = function(v) {
            return v != undefined ?
				this.each(function() { this == window || this == document ? window.scrollTo(name == 'Left' ? v : $(window)['scrollLeft'](), name == 'Top' ? v : $(window)['scrollTop']()) : this['scroll' + name] = v; }) :
				this[0] == window || this[0] == document ? self[(name == 'Left' ? 'pageXOffset' : 'pageYOffset')] || $.boxModel && document.documentElement['scroll' + name] || document.body['scroll' + name] : this[0]['scroll' + name];
        };
    });

    var _remove = $.fn.remove;
    $.fn.extend({
        position: function() {
            var offset = this.offset();
            var offsetParent = this.offsetParent();
            var parentOffset = offsetParent.offset();

            return {
                top: offset.top - num(this[0], 'marginTop') - parentOffset.top - num(offsetParent, 'borderTopWidth'),
                left: offset.left - num(this[0], 'marginLeft') - parentOffset.left - num(offsetParent, 'borderLeftWidth')
            };
        },
        offsetParent: function() {
            var offsetParent = this[0].offsetParent;
            while (offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && $.css(offsetParent, 'position') == 'static'))
                offsetParent = offsetParent.offsetParent;
            return $(offsetParent);
        },
        mouseInteraction: function(o) {
            return this.each(function() {
                new $.ui.mouseInteraction(this, o);
            });
        },
        removeMouseInteraction: function(o) {
            return this.each(function() {
                if ($.data(this, "ui-mouse"))
                    $.data(this, "ui-mouse").destroy();
            });
        },
        remove: function() {
            jQuery("*", this).add(this).trigger("remove");
            return _remove.apply(this, arguments);
        }
    });

    function num(el, prop) {
        return parseInt($.curCSS(el.jquery ? el[0] : el, prop, true)) || 0;
    };


    /********** Mouse Interaction Plugin *********/

    $.ui.mouseInteraction = function(element, options) {

        var self = this;
        this.element = element;

        $.data(this.element, "ui-mouse", this);
        this.options = $.extend({}, options);

        $(element).bind('mousedown.draggable', function() { return self.click.apply(self, arguments); });
        if ($.browser.msie) $(element).attr('unselectable', 'on'); //Prevent text selection in IE

        // prevent draggable-options-delay bug #2553
        $(element).mouseup(function() {
            if (self.timer) clearInterval(self.timer);
        });
    };

    $.extend($.ui.mouseInteraction.prototype, {

        destroy: function() { $(this.element).unbind('mousedown.draggable'); },
        trigger: function() { return this.click.apply(this, arguments); },
        click: function(e) {

            if (
				   e.which != 1 //only left click starts dragging
				|| $.inArray(e.target.nodeName.toLowerCase(), this.options.dragPrevention || []) != -1 // Prevent execution on defined elements
				|| (this.options.condition && !this.options.condition.apply(this.options.executor || this, [e, this.element])) //Prevent execution on condition
			) return true;

            var self = this;
            var initialize = function() {
                self._MP = { left: e.pageX, top: e.pageY }; // Store the click mouse position
                $(document).bind('mouseup.draggable', function() { return self.stop.apply(self, arguments); });
                $(document).bind('mousemove.draggable', function() { return self.drag.apply(self, arguments); });

                if (!self.initalized && Math.abs(self._MP.left - e.pageX) >= self.options.distance || Math.abs(self._MP.top - e.pageY) >= self.options.distance) {
                    if (self.options.start) self.options.start.call(self.options.executor || self, e, self.element);
                    if (self.options.drag) self.options.drag.call(self.options.executor || self, e, this.element); //This is actually not correct, but expected
                    self.initialized = true;
                }
            };

            if (this.options.delay) {
                if (this.timer) clearInterval(this.timer);
                this.timer = setTimeout(initialize, this.options.delay);
            } else {
                initialize();
            }

            return false;

        },
        stop: function(e) {

            var o = this.options;
            if (!this.initialized) return $(document).unbind('mouseup.draggable').unbind('mousemove.draggable');

            if (this.options.stop) this.options.stop.call(this.options.executor || this, e, this.element);
            $(document).unbind('mouseup.draggable').unbind('mousemove.draggable');
            this.initialized = false;
            return false;

        },
        drag: function(e) {

            var o = this.options;
            if ($.browser.msie && !e.button) return this.stop.apply(this, [e]); // IE mouseup check

            if (!this.initialized && (Math.abs(this._MP.left - e.pageX) >= o.distance || Math.abs(this._MP.top - e.pageY) >= o.distance)) {
                if (this.options.start) this.options.start.call(this.options.executor || this, e, this.element);
                this.initialized = true;
            } else {
                if (!this.initialized) return false;
            }

            if (o.drag) o.drag.call(this.options.executor || this, e, this.element);
            return false;

        }
    });

})(jQuery);
 