diff options
Diffstat (limited to 'template-common/lib/ui/ui.core.js')
-rw-r--r-- | template-common/lib/ui/ui.core.js | 498 |
1 files changed, 363 insertions, 135 deletions
diff --git a/template-common/lib/ui/ui.core.js b/template-common/lib/ui/ui.core.js index 0b4ee1c36..5493e0aeb 100644 --- a/template-common/lib/ui/ui.core.js +++ b/template-common/lib/ui/ui.core.js @@ -1,15 +1,22 @@ -/* - * jQuery UI 1.5.3 +/* + * jQuery UI 1.7.2 * - * Copyright (c) 2008 Paul Bakaus (ui.jquery.com) + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI */ -;(function($) { +;jQuery.ui || (function($) { +var _remove = $.fn.remove, + isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9); + +//Helper functions and ui object $.ui = { + version: "1.7.2", + + // $.ui.plugin is deprecated. Use the proxy pattern instead. plugin: { add: function(module, option, set) { var proto = $.ui[module].prototype; @@ -20,137 +27,338 @@ $.ui = { }, call: function(instance, name, args) { var set = instance.plugins[name]; - if(!set) { return; } - + if(!set || !instance.element[0].parentNode) { 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-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]; + + contains: function(a, b) { + return document.compareDocumentPosition + ? a.compareDocumentPosition(b) & 16 + : a !== b && a.contains(b); }, - disableSelection: function(el) { - $(el).attr('unselectable', 'on').css('MozUserSelect', 'none'); + + hasScroll: function(el, a) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ($(el).css('overflow') == 'hidden') { return false; } + + var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop', + has = false; + + if (el[scroll] > 0) { return true; } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[scroll] = 1; + has = (el[scroll] > 0); + el[scroll] = 0; + return has; }, - enableSelection: function(el) { - $(el).attr('unselectable', 'off').css('MozUserSelect', ''); + + isOverAxis: function(x, reference, size) { + //Determines when x coordinate is over "b" element axis + return (x > reference) && (x < (reference + size)); }, - 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; + + isOver: function(y, x, top, left, height, width) { + //Determines when x, y coordinates is over "b" element + return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width); + }, + + keyCode: { + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SHIFT: 16, + SPACE: 32, + TAB: 9, + UP: 38 } }; +// WAI-ARIA normalization +if (isFF2) { + var attr = $.attr, + removeAttr = $.fn.removeAttr, + ariaNS = "http://www.w3.org/2005/07/aaa", + ariaState = /^aria-/, + ariaRole = /^wairole:/; -/** jQuery core modifications and additions **/ + $.attr = function(elem, name, value) { + var set = value !== undefined; + + return (name == 'role' + ? (set + ? attr.call(this, elem, name, "wairole:" + value) + : (attr.apply(this, arguments) || "").replace(ariaRole, "")) + : (ariaState.test(name) + ? (set + ? elem.setAttributeNS(ariaNS, + name.replace(ariaState, "aaa:"), value) + : attr.call(this, elem, name.replace(ariaState, "aaa:"))) + : attr.apply(this, arguments))); + }; + + $.fn.removeAttr = function(name) { + return (ariaState.test(name) + ? this.each(function() { + this.removeAttributeNS(ariaNS, name.replace(ariaState, "")); + }) : removeAttr.call(this, name)); + }; +} + +//jQuery plugins +$.fn.extend({ + remove: function() { + // Safari has a native remove event which actually removes DOM elements, + // so we have to use triggerHandler instead of trigger (#3037). + $("*", this).add(this).each(function() { + $(this).triggerHandler("remove"); + }); + return _remove.apply(this, arguments ); + }, + + enableSelection: function() { + return this + .attr('unselectable', 'off') + .css('MozUserSelect', '') + .unbind('selectstart.ui'); + }, + + disableSelection: function() { + return this + .attr('unselectable', 'on') + .css('MozUserSelect', 'none') + .bind('selectstart.ui', function() { return false; }); + }, + + scrollParent: function() { + var scrollParent; + if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } + + return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; + } +}); + + +//Additional selectors +$.extend($.expr[':'], { + data: function(elem, i, match) { + return !!$.data(elem, match[3]); + }, + + focusable: function(element) { + var nodeName = element.nodeName.toLowerCase(), + tabIndex = $.attr(element, 'tabindex'); + return (/input|select|textarea|button|object/.test(nodeName) + ? !element.disabled + : 'a' == nodeName || 'area' == nodeName + ? element.href || !isNaN(tabIndex) + : !isNaN(tabIndex)) + // the element and all of its ancestors must be visible + // the browser may report that the area is hidden + && !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length; + }, + + tabbable: function(element) { + var tabIndex = $.attr(element, 'tabindex'); + return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable'); + } +}); -var _remove = $.fn.remove; -$.fn.remove = function() { - $("*", this).add(this).triggerHandler("remove"); - return _remove.apply(this, arguments ); -}; // $.widget is a factory to create jQuery plugins // taking some boilerplate code out of the plugin code -// created by Scott González and Jörn Zaefferer -function getter(namespace, plugin, method) { - var methods = $[namespace][plugin].getter || []; - methods = (typeof methods == "string" ? methods.split(/,?\s+/) : methods); +function getter(namespace, plugin, method, args) { + function getMethods(type) { + var methods = $[namespace][plugin][type] || []; + return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods); + } + + var methods = getMethods('getter'); + if (args.length == 1 && typeof args[0] == 'string') { + methods = methods.concat(getMethods('getterSetter')); + } return ($.inArray(method, methods) != -1); } $.widget = function(name, prototype) { var namespace = name.split(".")[0]; name = name.split(".")[1]; - + // create plugin method $.fn[name] = function(options) { var isMethodCall = (typeof options == 'string'), args = Array.prototype.slice.call(arguments, 1); - - if (isMethodCall && getter(namespace, name, options)) { + + // prevent calls to internal methods + if (isMethodCall && options.substring(0, 1) == '_') { + return this; + } + + // handle getter methods + if (isMethodCall && getter(namespace, name, options, args)) { var instance = $.data(this[0], name); return (instance ? instance[options].apply(instance, args) : undefined); } - + + // handle initialization and non-getter methods 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)); - } + + // constructor + (!instance && !isMethodCall && + $.data(this, name, new $[namespace][name](this, options))._init()); + + // method call + (instance && isMethodCall && $.isFunction(instance[options]) && + instance[options].apply(instance, args)); }); }; - + // create widget constructor + $[namespace] = $[namespace] || {}; $[namespace][name] = function(element, options) { var self = this; - + + this.namespace = namespace; this.widgetName = name; + this.widgetEventPrefix = $[namespace][name].eventPrefix || name; this.widgetBaseClass = namespace + '-' + name; - - this.options = $.extend({}, $.widget.defaults, $[namespace][name].defaults, options); + + this.options = $.extend({}, + $.widget.defaults, + $[namespace][name].defaults, + $.metadata && $.metadata.get(element)[name], + options); + this.element = $(element) - .bind('setData.' + name, function(e, key, value) { - return self.setData(key, value); + .bind('setData.' + name, function(event, key, value) { + if (event.target == element) { + return self._setData(key, value); + } }) - .bind('getData.' + name, function(e, key) { - return self.getData(key); + .bind('getData.' + name, function(event, key) { + if (event.target == element) { + return self._getData(key); + } }) .bind('remove', function() { return self.destroy(); }); - this.init(); }; - + // add widget prototype $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype); + + // TODO: merge getter and getterSetter properties from widget prototype + // and plugin prototype + $[namespace][name].getterSetter = 'option'; }; $.widget.prototype = { - init: function() {}, + _init: function() {}, destroy: function() { - this.element.removeData(this.widgetName); + this.element.removeData(this.widgetName) + .removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled') + .removeAttr('aria-disabled'); + }, + + option: function(key, value) { + var options = key, + self = this; + + if (typeof key == "string") { + if (value === undefined) { + return this._getData(key); + } + options = {}; + options[key] = value; + } + + $.each(options, function(key, value) { + self._setData(key, value); + }); }, - - getData: function(key) { + _getData: function(key) { return this.options[key]; }, - setData: function(key, value) { + _setData: function(key, value) { this.options[key] = value; - + if (key == 'disabled') { - this.element[value ? 'addClass' : 'removeClass']( - this.widgetBaseClass + '-disabled'); + this.element + [value ? 'addClass' : 'removeClass']( + this.widgetBaseClass + '-disabled' + ' ' + + this.namespace + '-state-disabled') + .attr("aria-disabled", value); } }, - + enable: function() { - this.setData('disabled', false); + this._setData('disabled', false); }, disable: function() { - this.setData('disabled', true); + this._setData('disabled', true); + }, + + _trigger: function(type, event, data) { + var callback = this.options[type], + eventName = (type == this.widgetEventPrefix + ? type : this.widgetEventPrefix + type); + + event = $.Event(event); + event.type = eventName; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if (event.originalEvent) { + for (var i = $.event.props.length, prop; i;) { + prop = $.event.props[--i]; + event[prop] = event.originalEvent[prop]; + } + } + + this.element.trigger(event, data); + + return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false + || event.isDefaultPrevented()); } }; @@ -162,124 +370,144 @@ $.widget.defaults = { /** Mouse Interaction Plugin **/ $.ui.mouse = { - mouseInit: function() { + _mouseInit: function() { var self = this; - - this.element.bind('mousedown.'+this.widgetName, function(e) { - return self.mouseDown(e); - }); - + + this.element + .bind('mousedown.'+this.widgetName, function(event) { + return self._mouseDown(event); + }) + .bind('click.'+this.widgetName, function(event) { + if(self._preventClickEvent) { + self._preventClickEvent = false; + event.stopImmediatePropagation(); + return false; + } + }); + // Prevent text selection in IE if ($.browser.msie) { this._mouseUnselectable = this.element.attr('unselectable'); this.element.attr('unselectable', 'on'); } - + this.started = false; }, - + // TODO: make sure destroying one instance of mouse doesn't mess with // other instances of mouse - mouseDestroy: function() { + _mouseDestroy: function() { this.element.unbind('.'+this.widgetName); - + // Restore text selection in IE ($.browser.msie && this.element.attr('unselectable', this._mouseUnselectable)); }, - - mouseDown: function(e) { + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + // TODO: figure out why we have to use originalEvent + event.originalEvent = event.originalEvent || {}; + if (event.originalEvent.mouseHandled) { return; } + // we may have missed mouseup (out of window) - (this._mouseStarted && this.mouseUp(e)); - - this._mouseDownEvent = e; - + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + var self = this, - btnIsLeft = (e.which == 1), - elIsCancel = (typeof this.options.cancel == "string" ? $(e.target).parents().add(e.target).filter(this.options.cancel).length : false); - if (!btnIsLeft || elIsCancel || !this.mouseCapture(e)) { + btnIsLeft = (event.which == 1), + elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { return true; } - - this._mouseDelayMet = !this.options.delay; - if (!this._mouseDelayMet) { + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { this._mouseDelayTimer = setTimeout(function() { - self._mouseDelayMet = true; + self.mouseDelayMet = true; }, this.options.delay); } - - if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) { - this._mouseStarted = (this.mouseStart(e) !== false); + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); if (!this._mouseStarted) { - e.preventDefault(); + event.preventDefault(); return true; } } - + // these delegates are required to keep context - this._mouseMoveDelegate = function(e) { - return self.mouseMove(e); + this._mouseMoveDelegate = function(event) { + return self._mouseMove(event); }; - this._mouseUpDelegate = function(e) { - return self.mouseUp(e); + this._mouseUpDelegate = function(event) { + return self._mouseUp(event); }; $(document) .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); - - return false; + + // preventDefault() is used to prevent the selection of text here - + // however, in Safari, this causes select boxes not to be selectable + // anymore, so this fix is needed + ($.browser.safari || event.preventDefault()); + + event.originalEvent.mouseHandled = true; + return true; }, - - mouseMove: function(e) { + + _mouseMove: function(event) { // IE mouseup check - mouseup happened when mouse was out of window - if ($.browser.msie && !e.button) { - return this.mouseUp(e); + if ($.browser.msie && !event.button) { + return this._mouseUp(event); } - + if (this._mouseStarted) { - this.mouseDrag(e); - return false; + this._mouseDrag(event); + return event.preventDefault(); } - - if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) { + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = - (this.mouseStart(this._mouseDownEvent, e) !== false); - (this._mouseStarted ? this.mouseDrag(e) : this.mouseUp(e)); + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); } - + return !this._mouseStarted; }, - - mouseUp: function(e) { + + _mouseUp: function(event) { $(document) .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); - + if (this._mouseStarted) { this._mouseStarted = false; - this.mouseStop(e); + this._preventClickEvent = (event.target == this._mouseDownEvent.target); + this._mouseStop(event); } - + return false; }, - - mouseDistanceMet: function(e) { + + _mouseDistanceMet: function(event) { return (Math.max( - Math.abs(this._mouseDownEvent.pageX - e.pageX), - Math.abs(this._mouseDownEvent.pageY - e.pageY) + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) ) >= this.options.distance ); }, - - mouseDelayMet: function(e) { - return this._mouseDelayMet; + + _mouseDelayMet: function(event) { + return this.mouseDelayMet; }, - + // These are placeholder methods, to be overriden by extending plugin - mouseStart: function(e) {}, - mouseDrag: function(e) {}, - mouseStop: function(e) {}, - mouseCapture: function(e) { return true; } + _mouseStart: function(event) {}, + _mouseDrag: function(event) {}, + _mouseStop: function(event) {}, + _mouseCapture: function(event) { return true; } }; $.ui.mouse.defaults = { |