Removed individual jQueryUI JavaScript files in favor of loading jQueryUI from Google Ajax API.
Updated jQuery to latest version from Google Ajax API. Integrated pull-request from BlindHunter to add the ability to override templates on a per-model basis. Updated README.master
parent
d22307c8fb
commit
04bdb80637
|
|
@ -5,3 +5,4 @@ django_admin_sortable.egg-info
|
||||||
*.pyc
|
*.pyc
|
||||||
*.pyo
|
*.pyo
|
||||||
.idea
|
.idea
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
|
||||||
10
README
10
README
|
|
@ -5,8 +5,7 @@ admin-sortable
|
||||||
What is it?
|
What is it?
|
||||||
=============
|
=============
|
||||||
The adminsortable app adds generic drag-and-drop facilities
|
The adminsortable app adds generic drag-and-drop facilities
|
||||||
to any Django model class or Tabular Inline via Django Admin
|
to any Django model class or Inlines via Django Admin and jQueryUI.
|
||||||
and jQueryUI.
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
=============
|
=============
|
||||||
|
|
@ -130,10 +129,11 @@ Status
|
||||||
admin-sortable is currently used in production.
|
admin-sortable is currently used in production.
|
||||||
|
|
||||||
|
|
||||||
What's new in 1.3.3
|
What's new in 1.3.4?
|
||||||
=============
|
=============
|
||||||
- Fixed an issue where sortable inlines weren't getting the correct CSS class
|
- Added support to override templates on a per-model basis. This is useful if you would
|
||||||
which gave them the appearance of not being sortable.
|
like to provide an alternate display of the sortable items, such as thumbnails.
|
||||||
|
Thanks to BlindHunter (https://github.com/BlindHunter) for contributing this functionality!
|
||||||
|
|
||||||
Features
|
Features
|
||||||
=============
|
=============
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
VERSION = (1, 3, 3) # following PEP 386
|
VERSION = (1, 3, 4) # following PEP 386
|
||||||
DEV_N = None
|
DEV_N = None
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,763 +0,0 @@
|
||||||
/*
|
|
||||||
* jQuery UI Effects 1.8.16
|
|
||||||
*
|
|
||||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/UI/Effects/
|
|
||||||
*/
|
|
||||||
;jQuery.effects || (function($, undefined) {
|
|
||||||
|
|
||||||
$.effects = {};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/****************************** COLOR ANIMATIONS ******************************/
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
// override the animation for color styles
|
|
||||||
$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
|
|
||||||
'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
|
|
||||||
function(i, attr) {
|
|
||||||
$.fx.step[attr] = function(fx) {
|
|
||||||
if (!fx.colorInit) {
|
|
||||||
fx.start = getColor(fx.elem, attr);
|
|
||||||
fx.end = getRGB(fx.end);
|
|
||||||
fx.colorInit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
fx.elem.style[attr] = 'rgb(' +
|
|
||||||
Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
|
|
||||||
Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
|
|
||||||
Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// Color Conversion functions from highlightFade
|
|
||||||
// By Blair Mitchelmore
|
|
||||||
// http://jquery.offput.ca/highlightFade/
|
|
||||||
|
|
||||||
// Parse strings looking for color tuples [255,255,255]
|
|
||||||
function getRGB(color) {
|
|
||||||
var result;
|
|
||||||
|
|
||||||
// Check if we're already dealing with an array of colors
|
|
||||||
if ( color && color.constructor == Array && color.length == 3 )
|
|
||||||
return color;
|
|
||||||
|
|
||||||
// Look for rgb(num,num,num)
|
|
||||||
if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
|
|
||||||
return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
|
|
||||||
|
|
||||||
// Look for rgb(num%,num%,num%)
|
|
||||||
if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
|
|
||||||
return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
|
|
||||||
|
|
||||||
// Look for #a0b1c2
|
|
||||||
if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
|
|
||||||
return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
|
|
||||||
|
|
||||||
// Look for #fff
|
|
||||||
if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
|
|
||||||
return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
|
|
||||||
|
|
||||||
// Look for rgba(0, 0, 0, 0) == transparent in Safari 3
|
|
||||||
if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
|
|
||||||
return colors['transparent'];
|
|
||||||
|
|
||||||
// Otherwise, we're most likely dealing with a named color
|
|
||||||
return colors[$.trim(color).toLowerCase()];
|
|
||||||
}
|
|
||||||
|
|
||||||
function getColor(elem, attr) {
|
|
||||||
var color;
|
|
||||||
|
|
||||||
do {
|
|
||||||
color = $.curCSS(elem, attr);
|
|
||||||
|
|
||||||
// Keep going until we find an element that has color, or we hit the body
|
|
||||||
if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
|
|
||||||
break;
|
|
||||||
|
|
||||||
attr = "backgroundColor";
|
|
||||||
} while ( elem = elem.parentNode );
|
|
||||||
|
|
||||||
return getRGB(color);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Some named colors to work with
|
|
||||||
// From Interface by Stefan Petre
|
|
||||||
// http://interface.eyecon.ro/
|
|
||||||
|
|
||||||
var colors = {
|
|
||||||
aqua:[0,255,255],
|
|
||||||
azure:[240,255,255],
|
|
||||||
beige:[245,245,220],
|
|
||||||
black:[0,0,0],
|
|
||||||
blue:[0,0,255],
|
|
||||||
brown:[165,42,42],
|
|
||||||
cyan:[0,255,255],
|
|
||||||
darkblue:[0,0,139],
|
|
||||||
darkcyan:[0,139,139],
|
|
||||||
darkgrey:[169,169,169],
|
|
||||||
darkgreen:[0,100,0],
|
|
||||||
darkkhaki:[189,183,107],
|
|
||||||
darkmagenta:[139,0,139],
|
|
||||||
darkolivegreen:[85,107,47],
|
|
||||||
darkorange:[255,140,0],
|
|
||||||
darkorchid:[153,50,204],
|
|
||||||
darkred:[139,0,0],
|
|
||||||
darksalmon:[233,150,122],
|
|
||||||
darkviolet:[148,0,211],
|
|
||||||
fuchsia:[255,0,255],
|
|
||||||
gold:[255,215,0],
|
|
||||||
green:[0,128,0],
|
|
||||||
indigo:[75,0,130],
|
|
||||||
khaki:[240,230,140],
|
|
||||||
lightblue:[173,216,230],
|
|
||||||
lightcyan:[224,255,255],
|
|
||||||
lightgreen:[144,238,144],
|
|
||||||
lightgrey:[211,211,211],
|
|
||||||
lightpink:[255,182,193],
|
|
||||||
lightyellow:[255,255,224],
|
|
||||||
lime:[0,255,0],
|
|
||||||
magenta:[255,0,255],
|
|
||||||
maroon:[128,0,0],
|
|
||||||
navy:[0,0,128],
|
|
||||||
olive:[128,128,0],
|
|
||||||
orange:[255,165,0],
|
|
||||||
pink:[255,192,203],
|
|
||||||
purple:[128,0,128],
|
|
||||||
violet:[128,0,128],
|
|
||||||
red:[255,0,0],
|
|
||||||
silver:[192,192,192],
|
|
||||||
white:[255,255,255],
|
|
||||||
yellow:[255,255,0],
|
|
||||||
transparent: [255,255,255]
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/****************************** CLASS ANIMATIONS ******************************/
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
var classAnimationActions = ['add', 'remove', 'toggle'],
|
|
||||||
shorthandStyles = {
|
|
||||||
border: 1,
|
|
||||||
borderBottom: 1,
|
|
||||||
borderColor: 1,
|
|
||||||
borderLeft: 1,
|
|
||||||
borderRight: 1,
|
|
||||||
borderTop: 1,
|
|
||||||
borderWidth: 1,
|
|
||||||
margin: 1,
|
|
||||||
padding: 1
|
|
||||||
};
|
|
||||||
|
|
||||||
function getElementStyles() {
|
|
||||||
var style = document.defaultView
|
|
||||||
? document.defaultView.getComputedStyle(this, null)
|
|
||||||
: this.currentStyle,
|
|
||||||
newStyle = {},
|
|
||||||
key,
|
|
||||||
camelCase;
|
|
||||||
|
|
||||||
// webkit enumerates style porperties
|
|
||||||
if (style && style.length && style[0] && style[style[0]]) {
|
|
||||||
var len = style.length;
|
|
||||||
while (len--) {
|
|
||||||
key = style[len];
|
|
||||||
if (typeof style[key] == 'string') {
|
|
||||||
camelCase = key.replace(/\-(\w)/g, function(all, letter){
|
|
||||||
return letter.toUpperCase();
|
|
||||||
});
|
|
||||||
newStyle[camelCase] = style[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (key in style) {
|
|
||||||
if (typeof style[key] === 'string') {
|
|
||||||
newStyle[key] = style[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return newStyle;
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterStyles(styles) {
|
|
||||||
var name, value;
|
|
||||||
for (name in styles) {
|
|
||||||
value = styles[name];
|
|
||||||
if (
|
|
||||||
// ignore null and undefined values
|
|
||||||
value == null ||
|
|
||||||
// ignore functions (when does this occur?)
|
|
||||||
$.isFunction(value) ||
|
|
||||||
// shorthand styles that need to be expanded
|
|
||||||
name in shorthandStyles ||
|
|
||||||
// ignore scrollbars (break in IE)
|
|
||||||
(/scrollbar/).test(name) ||
|
|
||||||
|
|
||||||
// only colors or values that can be converted to numbers
|
|
||||||
(!(/color/i).test(name) && isNaN(parseFloat(value)))
|
|
||||||
) {
|
|
||||||
delete styles[name];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return styles;
|
|
||||||
}
|
|
||||||
|
|
||||||
function styleDifference(oldStyle, newStyle) {
|
|
||||||
var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
|
|
||||||
name;
|
|
||||||
|
|
||||||
for (name in newStyle) {
|
|
||||||
if (oldStyle[name] != newStyle[name]) {
|
|
||||||
diff[name] = newStyle[name];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return diff;
|
|
||||||
}
|
|
||||||
|
|
||||||
$.effects.animateClass = function(value, duration, easing, callback) {
|
|
||||||
if ($.isFunction(easing)) {
|
|
||||||
callback = easing;
|
|
||||||
easing = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.queue(function() {
|
|
||||||
var that = $(this),
|
|
||||||
originalStyleAttr = that.attr('style') || ' ',
|
|
||||||
originalStyle = filterStyles(getElementStyles.call(this)),
|
|
||||||
newStyle,
|
|
||||||
className = that.attr('class');
|
|
||||||
|
|
||||||
$.each(classAnimationActions, function(i, action) {
|
|
||||||
if (value[action]) {
|
|
||||||
that[action + 'Class'](value[action]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
newStyle = filterStyles(getElementStyles.call(this));
|
|
||||||
that.attr('class', className);
|
|
||||||
|
|
||||||
that.animate(styleDifference(originalStyle, newStyle), {
|
|
||||||
queue: false,
|
|
||||||
duration: duration,
|
|
||||||
easing: easing,
|
|
||||||
complete: function() {
|
|
||||||
$.each(classAnimationActions, function(i, action) {
|
|
||||||
if (value[action]) { that[action + 'Class'](value[action]); }
|
|
||||||
});
|
|
||||||
// work around bug in IE by clearing the cssText before setting it
|
|
||||||
if (typeof that.attr('style') == 'object') {
|
|
||||||
that.attr('style').cssText = '';
|
|
||||||
that.attr('style').cssText = originalStyleAttr;
|
|
||||||
} else {
|
|
||||||
that.attr('style', originalStyleAttr);
|
|
||||||
}
|
|
||||||
if (callback) { callback.apply(this, arguments); }
|
|
||||||
$.dequeue( this );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
$.fn.extend({
|
|
||||||
_addClass: $.fn.addClass,
|
|
||||||
addClass: function(classNames, speed, easing, callback) {
|
|
||||||
return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
|
|
||||||
},
|
|
||||||
|
|
||||||
_removeClass: $.fn.removeClass,
|
|
||||||
removeClass: function(classNames,speed,easing,callback) {
|
|
||||||
return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
|
|
||||||
},
|
|
||||||
|
|
||||||
_toggleClass: $.fn.toggleClass,
|
|
||||||
toggleClass: function(classNames, force, speed, easing, callback) {
|
|
||||||
if ( typeof force == "boolean" || force === undefined ) {
|
|
||||||
if ( !speed ) {
|
|
||||||
// without speed parameter;
|
|
||||||
return this._toggleClass(classNames, force);
|
|
||||||
} else {
|
|
||||||
return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// without switch parameter;
|
|
||||||
return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
switchClass: function(remove,add,speed,easing,callback) {
|
|
||||||
return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/*********************************** EFFECTS **********************************/
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
$.extend($.effects, {
|
|
||||||
version: "1.8.16",
|
|
||||||
|
|
||||||
// Saves a set of properties in a data storage
|
|
||||||
save: function(element, set) {
|
|
||||||
for(var i=0; i < set.length; i++) {
|
|
||||||
if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Restores a set of previously saved properties from a data storage
|
|
||||||
restore: function(element, set) {
|
|
||||||
for(var i=0; i < set.length; i++) {
|
|
||||||
if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
setMode: function(el, mode) {
|
|
||||||
if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
|
|
||||||
return mode;
|
|
||||||
},
|
|
||||||
|
|
||||||
getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
|
|
||||||
// this should be a little more flexible in the future to handle a string & hash
|
|
||||||
var y, x;
|
|
||||||
switch (origin[0]) {
|
|
||||||
case 'top': y = 0; break;
|
|
||||||
case 'middle': y = 0.5; break;
|
|
||||||
case 'bottom': y = 1; break;
|
|
||||||
default: y = origin[0] / original.height;
|
|
||||||
};
|
|
||||||
switch (origin[1]) {
|
|
||||||
case 'left': x = 0; break;
|
|
||||||
case 'center': x = 0.5; break;
|
|
||||||
case 'right': x = 1; break;
|
|
||||||
default: x = origin[1] / original.width;
|
|
||||||
};
|
|
||||||
return {x: x, y: y};
|
|
||||||
},
|
|
||||||
|
|
||||||
// Wraps the element around a wrapper that copies position properties
|
|
||||||
createWrapper: function(element) {
|
|
||||||
|
|
||||||
// if the element is already wrapped, return it
|
|
||||||
if (element.parent().is('.ui-effects-wrapper')) {
|
|
||||||
return element.parent();
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrap the element
|
|
||||||
var props = {
|
|
||||||
width: element.outerWidth(true),
|
|
||||||
height: element.outerHeight(true),
|
|
||||||
'float': element.css('float')
|
|
||||||
},
|
|
||||||
wrapper = $('<div></div>')
|
|
||||||
.addClass('ui-effects-wrapper')
|
|
||||||
.css({
|
|
||||||
fontSize: '100%',
|
|
||||||
background: 'transparent',
|
|
||||||
border: 'none',
|
|
||||||
margin: 0,
|
|
||||||
padding: 0
|
|
||||||
}),
|
|
||||||
active = document.activeElement;
|
|
||||||
|
|
||||||
element.wrap(wrapper);
|
|
||||||
|
|
||||||
// Fixes #7595 - Elements lose focus when wrapped.
|
|
||||||
if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
|
|
||||||
$( active ).focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
|
|
||||||
|
|
||||||
// transfer positioning properties to the wrapper
|
|
||||||
if (element.css('position') == 'static') {
|
|
||||||
wrapper.css({ position: 'relative' });
|
|
||||||
element.css({ position: 'relative' });
|
|
||||||
} else {
|
|
||||||
$.extend(props, {
|
|
||||||
position: element.css('position'),
|
|
||||||
zIndex: element.css('z-index')
|
|
||||||
});
|
|
||||||
$.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
|
|
||||||
props[pos] = element.css(pos);
|
|
||||||
if (isNaN(parseInt(props[pos], 10))) {
|
|
||||||
props[pos] = 'auto';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
|
|
||||||
}
|
|
||||||
|
|
||||||
return wrapper.css(props).show();
|
|
||||||
},
|
|
||||||
|
|
||||||
removeWrapper: function(element) {
|
|
||||||
var parent,
|
|
||||||
active = document.activeElement;
|
|
||||||
|
|
||||||
if (element.parent().is('.ui-effects-wrapper')) {
|
|
||||||
parent = element.parent().replaceWith(element);
|
|
||||||
// Fixes #7595 - Elements lose focus when wrapped.
|
|
||||||
if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
|
|
||||||
$( active ).focus();
|
|
||||||
}
|
|
||||||
return parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
return element;
|
|
||||||
},
|
|
||||||
|
|
||||||
setTransition: function(element, list, factor, value) {
|
|
||||||
value = value || {};
|
|
||||||
$.each(list, function(i, x){
|
|
||||||
unit = element.cssUnit(x);
|
|
||||||
if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
|
|
||||||
});
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
function _normalizeArguments(effect, options, speed, callback) {
|
|
||||||
// shift params for method overloading
|
|
||||||
if (typeof effect == 'object') {
|
|
||||||
callback = options;
|
|
||||||
speed = null;
|
|
||||||
options = effect;
|
|
||||||
effect = options.effect;
|
|
||||||
}
|
|
||||||
if ($.isFunction(options)) {
|
|
||||||
callback = options;
|
|
||||||
speed = null;
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
if (typeof options == 'number' || $.fx.speeds[options]) {
|
|
||||||
callback = speed;
|
|
||||||
speed = options;
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
if ($.isFunction(speed)) {
|
|
||||||
callback = speed;
|
|
||||||
speed = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
speed = speed || options.duration;
|
|
||||||
speed = $.fx.off ? 0 : typeof speed == 'number'
|
|
||||||
? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
|
|
||||||
|
|
||||||
callback = callback || options.complete;
|
|
||||||
|
|
||||||
return [effect, options, speed, callback];
|
|
||||||
}
|
|
||||||
|
|
||||||
function standardSpeed( speed ) {
|
|
||||||
// valid standard speeds
|
|
||||||
if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// invalid strings - treat as "normal" speed
|
|
||||||
if ( typeof speed === "string" && !$.effects[ speed ] ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$.fn.extend({
|
|
||||||
effect: function(effect, options, speed, callback) {
|
|
||||||
var args = _normalizeArguments.apply(this, arguments),
|
|
||||||
// TODO: make effects take actual parameters instead of a hash
|
|
||||||
args2 = {
|
|
||||||
options: args[1],
|
|
||||||
duration: args[2],
|
|
||||||
callback: args[3]
|
|
||||||
},
|
|
||||||
mode = args2.options.mode,
|
|
||||||
effectMethod = $.effects[effect];
|
|
||||||
|
|
||||||
if ( $.fx.off || !effectMethod ) {
|
|
||||||
// delegate to the original method (e.g., .show()) if possible
|
|
||||||
if ( mode ) {
|
|
||||||
return this[ mode ]( args2.duration, args2.callback );
|
|
||||||
} else {
|
|
||||||
return this.each(function() {
|
|
||||||
if ( args2.callback ) {
|
|
||||||
args2.callback.call( this );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return effectMethod.call(this, args2);
|
|
||||||
},
|
|
||||||
|
|
||||||
_show: $.fn.show,
|
|
||||||
show: function(speed) {
|
|
||||||
if ( standardSpeed( speed ) ) {
|
|
||||||
return this._show.apply(this, arguments);
|
|
||||||
} else {
|
|
||||||
var args = _normalizeArguments.apply(this, arguments);
|
|
||||||
args[1].mode = 'show';
|
|
||||||
return this.effect.apply(this, args);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_hide: $.fn.hide,
|
|
||||||
hide: function(speed) {
|
|
||||||
if ( standardSpeed( speed ) ) {
|
|
||||||
return this._hide.apply(this, arguments);
|
|
||||||
} else {
|
|
||||||
var args = _normalizeArguments.apply(this, arguments);
|
|
||||||
args[1].mode = 'hide';
|
|
||||||
return this.effect.apply(this, args);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// jQuery core overloads toggle and creates _toggle
|
|
||||||
__toggle: $.fn.toggle,
|
|
||||||
toggle: function(speed) {
|
|
||||||
if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
|
|
||||||
return this.__toggle.apply(this, arguments);
|
|
||||||
} else {
|
|
||||||
var args = _normalizeArguments.apply(this, arguments);
|
|
||||||
args[1].mode = 'toggle';
|
|
||||||
return this.effect.apply(this, args);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// helper functions
|
|
||||||
cssUnit: function(key) {
|
|
||||||
var style = this.css(key), val = [];
|
|
||||||
$.each( ['em','px','%','pt'], function(i, unit){
|
|
||||||
if(style.indexOf(unit) > 0)
|
|
||||||
val = [parseFloat(style), unit];
|
|
||||||
});
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/*********************************** EASING ***********************************/
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
|
|
||||||
*
|
|
||||||
* Uses the built in easing capabilities added In jQuery 1.1
|
|
||||||
* to offer multiple easing options
|
|
||||||
*
|
|
||||||
* TERMS OF USE - jQuery Easing
|
|
||||||
*
|
|
||||||
* Open source under the BSD License.
|
|
||||||
*
|
|
||||||
* Copyright 2008 George McGinley Smith
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this list of
|
|
||||||
* conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice, this list
|
|
||||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
|
||||||
* provided with the distribution.
|
|
||||||
*
|
|
||||||
* Neither the name of the author nor the names of contributors may be used to endorse
|
|
||||||
* or promote products derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
|
||||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
||||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
||||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
||||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// t: current time, b: begInnIng value, c: change In value, d: duration
|
|
||||||
$.easing.jswing = $.easing.swing;
|
|
||||||
|
|
||||||
$.extend($.easing,
|
|
||||||
{
|
|
||||||
def: 'easeOutQuad',
|
|
||||||
swing: function (x, t, b, c, d) {
|
|
||||||
//alert($.easing.default);
|
|
||||||
return $.easing[$.easing.def](x, t, b, c, d);
|
|
||||||
},
|
|
||||||
easeInQuad: function (x, t, b, c, d) {
|
|
||||||
return c*(t/=d)*t + b;
|
|
||||||
},
|
|
||||||
easeOutQuad: function (x, t, b, c, d) {
|
|
||||||
return -c *(t/=d)*(t-2) + b;
|
|
||||||
},
|
|
||||||
easeInOutQuad: function (x, t, b, c, d) {
|
|
||||||
if ((t/=d/2) < 1) return c/2*t*t + b;
|
|
||||||
return -c/2 * ((--t)*(t-2) - 1) + b;
|
|
||||||
},
|
|
||||||
easeInCubic: function (x, t, b, c, d) {
|
|
||||||
return c*(t/=d)*t*t + b;
|
|
||||||
},
|
|
||||||
easeOutCubic: function (x, t, b, c, d) {
|
|
||||||
return c*((t=t/d-1)*t*t + 1) + b;
|
|
||||||
},
|
|
||||||
easeInOutCubic: function (x, t, b, c, d) {
|
|
||||||
if ((t/=d/2) < 1) return c/2*t*t*t + b;
|
|
||||||
return c/2*((t-=2)*t*t + 2) + b;
|
|
||||||
},
|
|
||||||
easeInQuart: function (x, t, b, c, d) {
|
|
||||||
return c*(t/=d)*t*t*t + b;
|
|
||||||
},
|
|
||||||
easeOutQuart: function (x, t, b, c, d) {
|
|
||||||
return -c * ((t=t/d-1)*t*t*t - 1) + b;
|
|
||||||
},
|
|
||||||
easeInOutQuart: function (x, t, b, c, d) {
|
|
||||||
if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
|
|
||||||
return -c/2 * ((t-=2)*t*t*t - 2) + b;
|
|
||||||
},
|
|
||||||
easeInQuint: function (x, t, b, c, d) {
|
|
||||||
return c*(t/=d)*t*t*t*t + b;
|
|
||||||
},
|
|
||||||
easeOutQuint: function (x, t, b, c, d) {
|
|
||||||
return c*((t=t/d-1)*t*t*t*t + 1) + b;
|
|
||||||
},
|
|
||||||
easeInOutQuint: function (x, t, b, c, d) {
|
|
||||||
if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
|
|
||||||
return c/2*((t-=2)*t*t*t*t + 2) + b;
|
|
||||||
},
|
|
||||||
easeInSine: function (x, t, b, c, d) {
|
|
||||||
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
|
|
||||||
},
|
|
||||||
easeOutSine: function (x, t, b, c, d) {
|
|
||||||
return c * Math.sin(t/d * (Math.PI/2)) + b;
|
|
||||||
},
|
|
||||||
easeInOutSine: function (x, t, b, c, d) {
|
|
||||||
return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
|
|
||||||
},
|
|
||||||
easeInExpo: function (x, t, b, c, d) {
|
|
||||||
return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
|
|
||||||
},
|
|
||||||
easeOutExpo: function (x, t, b, c, d) {
|
|
||||||
return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
|
|
||||||
},
|
|
||||||
easeInOutExpo: function (x, t, b, c, d) {
|
|
||||||
if (t==0) return b;
|
|
||||||
if (t==d) return b+c;
|
|
||||||
if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
|
|
||||||
return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
|
|
||||||
},
|
|
||||||
easeInCirc: function (x, t, b, c, d) {
|
|
||||||
return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
|
|
||||||
},
|
|
||||||
easeOutCirc: function (x, t, b, c, d) {
|
|
||||||
return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
|
|
||||||
},
|
|
||||||
easeInOutCirc: function (x, t, b, c, d) {
|
|
||||||
if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
|
|
||||||
return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
|
|
||||||
},
|
|
||||||
easeInElastic: function (x, t, b, c, d) {
|
|
||||||
var s=1.70158;var p=0;var a=c;
|
|
||||||
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
|
|
||||||
if (a < Math.abs(c)) { a=c; var s=p/4; }
|
|
||||||
else var s = p/(2*Math.PI) * Math.asin (c/a);
|
|
||||||
return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
|
|
||||||
},
|
|
||||||
easeOutElastic: function (x, t, b, c, d) {
|
|
||||||
var s=1.70158;var p=0;var a=c;
|
|
||||||
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
|
|
||||||
if (a < Math.abs(c)) { a=c; var s=p/4; }
|
|
||||||
else var s = p/(2*Math.PI) * Math.asin (c/a);
|
|
||||||
return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
|
|
||||||
},
|
|
||||||
easeInOutElastic: function (x, t, b, c, d) {
|
|
||||||
var s=1.70158;var p=0;var a=c;
|
|
||||||
if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
|
|
||||||
if (a < Math.abs(c)) { a=c; var s=p/4; }
|
|
||||||
else var s = p/(2*Math.PI) * Math.asin (c/a);
|
|
||||||
if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
|
|
||||||
return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
|
|
||||||
},
|
|
||||||
easeInBack: function (x, t, b, c, d, s) {
|
|
||||||
if (s == undefined) s = 1.70158;
|
|
||||||
return c*(t/=d)*t*((s+1)*t - s) + b;
|
|
||||||
},
|
|
||||||
easeOutBack: function (x, t, b, c, d, s) {
|
|
||||||
if (s == undefined) s = 1.70158;
|
|
||||||
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
|
|
||||||
},
|
|
||||||
easeInOutBack: function (x, t, b, c, d, s) {
|
|
||||||
if (s == undefined) s = 1.70158;
|
|
||||||
if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
|
|
||||||
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
|
|
||||||
},
|
|
||||||
easeInBounce: function (x, t, b, c, d) {
|
|
||||||
return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
|
|
||||||
},
|
|
||||||
easeOutBounce: function (x, t, b, c, d) {
|
|
||||||
if ((t/=d) < (1/2.75)) {
|
|
||||||
return c*(7.5625*t*t) + b;
|
|
||||||
} else if (t < (2/2.75)) {
|
|
||||||
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
|
|
||||||
} else if (t < (2.5/2.75)) {
|
|
||||||
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
|
|
||||||
} else {
|
|
||||||
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
easeInOutBounce: function (x, t, b, c, d) {
|
|
||||||
if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
|
|
||||||
return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* TERMS OF USE - EASING EQUATIONS
|
|
||||||
*
|
|
||||||
* Open source under the BSD License.
|
|
||||||
*
|
|
||||||
* Copyright 2001 Robert Penner
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this list of
|
|
||||||
* conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice, this list
|
|
||||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
|
||||||
* provided with the distribution.
|
|
||||||
*
|
|
||||||
* Neither the name of the author nor the names of contributors may be used to endorse
|
|
||||||
* or promote products derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
|
||||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
||||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
||||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
||||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
})(jQuery);
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
* jQuery UI Effects Highlight 1.8.16
|
|
||||||
*
|
|
||||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/UI/Effects/Highlight
|
|
||||||
*
|
|
||||||
* Depends:
|
|
||||||
* jquery.effects.core.js
|
|
||||||
*/
|
|
||||||
(function( $, undefined ) {
|
|
||||||
|
|
||||||
$.effects.highlight = function(o) {
|
|
||||||
return this.queue(function() {
|
|
||||||
var elem = $(this),
|
|
||||||
props = ['backgroundImage', 'backgroundColor', 'opacity'],
|
|
||||||
mode = $.effects.setMode(elem, o.options.mode || 'show'),
|
|
||||||
animation = {
|
|
||||||
backgroundColor: elem.css('backgroundColor')
|
|
||||||
};
|
|
||||||
|
|
||||||
if (mode == 'hide') {
|
|
||||||
animation.opacity = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
$.effects.save(elem, props);
|
|
||||||
elem
|
|
||||||
.show()
|
|
||||||
.css({
|
|
||||||
backgroundImage: 'none',
|
|
||||||
backgroundColor: o.options.color || '#ffff99'
|
|
||||||
})
|
|
||||||
.animate(animation, {
|
|
||||||
queue: false,
|
|
||||||
duration: o.duration,
|
|
||||||
easing: o.options.easing,
|
|
||||||
complete: function() {
|
|
||||||
(mode == 'hide' && elem.hide());
|
|
||||||
$.effects.restore(elem, props);
|
|
||||||
(mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
|
|
||||||
(o.callback && o.callback.apply(this, arguments));
|
|
||||||
elem.dequeue();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
})(jQuery);
|
|
||||||
|
|
@ -1,314 +0,0 @@
|
||||||
/*!
|
|
||||||
* jQuery UI 1.8.16
|
|
||||||
*
|
|
||||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/UI
|
|
||||||
*/
|
|
||||||
(function( $, undefined ) {
|
|
||||||
|
|
||||||
// prevent duplicate loading
|
|
||||||
// this is only a problem because we proxy existing functions
|
|
||||||
// and we don't want to double proxy them
|
|
||||||
$.ui = $.ui || {};
|
|
||||||
if ( $.ui.version ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$.extend( $.ui, {
|
|
||||||
version: "1.8.16",
|
|
||||||
|
|
||||||
keyCode: {
|
|
||||||
ALT: 18,
|
|
||||||
BACKSPACE: 8,
|
|
||||||
CAPS_LOCK: 20,
|
|
||||||
COMMA: 188,
|
|
||||||
COMMAND: 91,
|
|
||||||
COMMAND_LEFT: 91, // COMMAND
|
|
||||||
COMMAND_RIGHT: 93,
|
|
||||||
CONTROL: 17,
|
|
||||||
DELETE: 46,
|
|
||||||
DOWN: 40,
|
|
||||||
END: 35,
|
|
||||||
ENTER: 13,
|
|
||||||
ESCAPE: 27,
|
|
||||||
HOME: 36,
|
|
||||||
INSERT: 45,
|
|
||||||
LEFT: 37,
|
|
||||||
MENU: 93, // COMMAND_RIGHT
|
|
||||||
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,
|
|
||||||
WINDOWS: 91 // COMMAND
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// plugins
|
|
||||||
$.fn.extend({
|
|
||||||
propAttr: $.fn.prop || $.fn.attr,
|
|
||||||
|
|
||||||
_focus: $.fn.focus,
|
|
||||||
focus: function( delay, fn ) {
|
|
||||||
return typeof delay === "number" ?
|
|
||||||
this.each(function() {
|
|
||||||
var elem = this;
|
|
||||||
setTimeout(function() {
|
|
||||||
$( elem ).focus();
|
|
||||||
if ( fn ) {
|
|
||||||
fn.call( elem );
|
|
||||||
}
|
|
||||||
}, delay );
|
|
||||||
}) :
|
|
||||||
this._focus.apply( this, arguments );
|
|
||||||
},
|
|
||||||
|
|
||||||
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;
|
|
||||||
},
|
|
||||||
|
|
||||||
zIndex: function( zIndex ) {
|
|
||||||
if ( zIndex !== undefined ) {
|
|
||||||
return this.css( "zIndex", zIndex );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( this.length ) {
|
|
||||||
var elem = $( this[ 0 ] ), position, value;
|
|
||||||
while ( elem.length && elem[ 0 ] !== document ) {
|
|
||||||
// Ignore z-index if position is set to a value where z-index is ignored by the browser
|
|
||||||
// This makes behavior of this function consistent across browsers
|
|
||||||
// WebKit always returns auto if the element is positioned
|
|
||||||
position = elem.css( "position" );
|
|
||||||
if ( position === "absolute" || position === "relative" || position === "fixed" ) {
|
|
||||||
// IE returns 0 when zIndex is not specified
|
|
||||||
// other browsers return a string
|
|
||||||
// we ignore the case of nested elements with an explicit value of 0
|
|
||||||
// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
|
|
||||||
value = parseInt( elem.css( "zIndex" ), 10 );
|
|
||||||
if ( !isNaN( value ) && value !== 0 ) {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elem = elem.parent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
disableSelection: function() {
|
|
||||||
return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
|
|
||||||
".ui-disableSelection", function( event ) {
|
|
||||||
event.preventDefault();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
enableSelection: function() {
|
|
||||||
return this.unbind( ".ui-disableSelection" );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$.each( [ "Width", "Height" ], function( i, name ) {
|
|
||||||
var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
|
|
||||||
type = name.toLowerCase(),
|
|
||||||
orig = {
|
|
||||||
innerWidth: $.fn.innerWidth,
|
|
||||||
innerHeight: $.fn.innerHeight,
|
|
||||||
outerWidth: $.fn.outerWidth,
|
|
||||||
outerHeight: $.fn.outerHeight
|
|
||||||
};
|
|
||||||
|
|
||||||
function reduce( elem, size, border, margin ) {
|
|
||||||
$.each( side, function() {
|
|
||||||
size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
|
|
||||||
if ( border ) {
|
|
||||||
size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
|
|
||||||
}
|
|
||||||
if ( margin ) {
|
|
||||||
size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
$.fn[ "inner" + name ] = function( size ) {
|
|
||||||
if ( size === undefined ) {
|
|
||||||
return orig[ "inner" + name ].call( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.each(function() {
|
|
||||||
$( this ).css( type, reduce( this, size ) + "px" );
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
$.fn[ "outer" + name] = function( size, margin ) {
|
|
||||||
if ( typeof size !== "number" ) {
|
|
||||||
return orig[ "outer" + name ].call( this, size );
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.each(function() {
|
|
||||||
$( this).css( type, reduce( this, size, true, margin ) + "px" );
|
|
||||||
});
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// selectors
|
|
||||||
function focusable( element, isTabIndexNotNaN ) {
|
|
||||||
var nodeName = element.nodeName.toLowerCase();
|
|
||||||
if ( "area" === nodeName ) {
|
|
||||||
var map = element.parentNode,
|
|
||||||
mapName = map.name,
|
|
||||||
img;
|
|
||||||
if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
img = $( "img[usemap=#" + mapName + "]" )[0];
|
|
||||||
return !!img && visible( img );
|
|
||||||
}
|
|
||||||
return ( /input|select|textarea|button|object/.test( nodeName )
|
|
||||||
? !element.disabled
|
|
||||||
: "a" == nodeName
|
|
||||||
? element.href || isTabIndexNotNaN
|
|
||||||
: isTabIndexNotNaN)
|
|
||||||
// the element and all of its ancestors must be visible
|
|
||||||
&& visible( element );
|
|
||||||
}
|
|
||||||
|
|
||||||
function visible( element ) {
|
|
||||||
return !$( element ).parents().andSelf().filter(function() {
|
|
||||||
return $.curCSS( this, "visibility" ) === "hidden" ||
|
|
||||||
$.expr.filters.hidden( this );
|
|
||||||
}).length;
|
|
||||||
}
|
|
||||||
|
|
||||||
$.extend( $.expr[ ":" ], {
|
|
||||||
data: function( elem, i, match ) {
|
|
||||||
return !!$.data( elem, match[ 3 ] );
|
|
||||||
},
|
|
||||||
|
|
||||||
focusable: function( element ) {
|
|
||||||
return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
|
|
||||||
},
|
|
||||||
|
|
||||||
tabbable: function( element ) {
|
|
||||||
var tabIndex = $.attr( element, "tabindex" ),
|
|
||||||
isTabIndexNaN = isNaN( tabIndex );
|
|
||||||
return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// support
|
|
||||||
$(function() {
|
|
||||||
var body = document.body,
|
|
||||||
div = body.appendChild( div = document.createElement( "div" ) );
|
|
||||||
|
|
||||||
$.extend( div.style, {
|
|
||||||
minHeight: "100px",
|
|
||||||
height: "auto",
|
|
||||||
padding: 0,
|
|
||||||
borderWidth: 0
|
|
||||||
});
|
|
||||||
|
|
||||||
$.support.minHeight = div.offsetHeight === 100;
|
|
||||||
$.support.selectstart = "onselectstart" in div;
|
|
||||||
|
|
||||||
// set display to none to avoid a layout bug in IE
|
|
||||||
// http://dev.jquery.com/ticket/4014
|
|
||||||
body.removeChild( div ).style.display = "none";
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// deprecated
|
|
||||||
$.extend( $.ui, {
|
|
||||||
// $.ui.plugin is deprecated. Use the proxy pattern instead.
|
|
||||||
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 || !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 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
|
|
||||||
contains: function( a, b ) {
|
|
||||||
return document.compareDocumentPosition ?
|
|
||||||
a.compareDocumentPosition( b ) & 16 :
|
|
||||||
a !== b && a.contains( b );
|
|
||||||
},
|
|
||||||
|
|
||||||
// only used by resizable
|
|
||||||
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;
|
|
||||||
},
|
|
||||||
|
|
||||||
// these are odd functions, fix the API or move into individual plugins
|
|
||||||
isOverAxis: function( x, reference, size ) {
|
|
||||||
//Determines when x coordinate is over "b" element axis
|
|
||||||
return ( x > reference ) && ( x < ( reference + size ) );
|
|
||||||
},
|
|
||||||
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 );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
})( jQuery );
|
|
||||||
|
|
@ -1,825 +0,0 @@
|
||||||
/*
|
|
||||||
* jQuery UI Draggable 1.8.16
|
|
||||||
*
|
|
||||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/UI/Draggables
|
|
||||||
*
|
|
||||||
* Depends:
|
|
||||||
* jquery.ui.core.js
|
|
||||||
* jquery.ui.mouse.js
|
|
||||||
* jquery.ui.widget.js
|
|
||||||
*/
|
|
||||||
(function( $, undefined ) {
|
|
||||||
|
|
||||||
$.widget("ui.draggable", $.ui.mouse, {
|
|
||||||
widgetEventPrefix: "drag",
|
|
||||||
options: {
|
|
||||||
addClasses: true,
|
|
||||||
appendTo: "parent",
|
|
||||||
axis: false,
|
|
||||||
connectToSortable: false,
|
|
||||||
containment: false,
|
|
||||||
cursor: "auto",
|
|
||||||
cursorAt: false,
|
|
||||||
grid: false,
|
|
||||||
handle: false,
|
|
||||||
helper: "original",
|
|
||||||
iframeFix: false,
|
|
||||||
opacity: false,
|
|
||||||
refreshPositions: false,
|
|
||||||
revert: false,
|
|
||||||
revertDuration: 500,
|
|
||||||
scope: "default",
|
|
||||||
scroll: true,
|
|
||||||
scrollSensitivity: 20,
|
|
||||||
scrollSpeed: 20,
|
|
||||||
snap: false,
|
|
||||||
snapMode: "both",
|
|
||||||
snapTolerance: 20,
|
|
||||||
stack: false,
|
|
||||||
zIndex: false
|
|
||||||
},
|
|
||||||
_create: function() {
|
|
||||||
|
|
||||||
if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
|
|
||||||
this.element[0].style.position = 'relative';
|
|
||||||
|
|
||||||
(this.options.addClasses && this.element.addClass("ui-draggable"));
|
|
||||||
(this.options.disabled && this.element.addClass("ui-draggable-disabled"));
|
|
||||||
|
|
||||||
this._mouseInit();
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
destroy: function() {
|
|
||||||
if(!this.element.data('draggable')) return;
|
|
||||||
this.element
|
|
||||||
.removeData("draggable")
|
|
||||||
.unbind(".draggable")
|
|
||||||
.removeClass("ui-draggable"
|
|
||||||
+ " ui-draggable-dragging"
|
|
||||||
+ " ui-draggable-disabled");
|
|
||||||
this._mouseDestroy();
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseCapture: function(event) {
|
|
||||||
|
|
||||||
var o = this.options;
|
|
||||||
|
|
||||||
// among others, prevent a drag on a resizable-handle
|
|
||||||
if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
//Quit if we're not on a valid handle
|
|
||||||
this.handle = this._getHandle(event);
|
|
||||||
if (!this.handle)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ( o.iframeFix ) {
|
|
||||||
$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
|
|
||||||
$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
|
|
||||||
.css({
|
|
||||||
width: this.offsetWidth+"px", height: this.offsetHeight+"px",
|
|
||||||
position: "absolute", opacity: "0.001", zIndex: 1000
|
|
||||||
})
|
|
||||||
.css($(this).offset())
|
|
||||||
.appendTo("body");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseStart: function(event) {
|
|
||||||
|
|
||||||
var o = this.options;
|
|
||||||
|
|
||||||
//Create and append the visible helper
|
|
||||||
this.helper = this._createHelper(event);
|
|
||||||
|
|
||||||
//Cache the helper size
|
|
||||||
this._cacheHelperProportions();
|
|
||||||
|
|
||||||
//If ddmanager is used for droppables, set the global draggable
|
|
||||||
if($.ui.ddmanager)
|
|
||||||
$.ui.ddmanager.current = this;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* - Position generation -
|
|
||||||
* This block generates everything position related - it's the core of draggables.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//Cache the margins of the original element
|
|
||||||
this._cacheMargins();
|
|
||||||
|
|
||||||
//Store the helper's css position
|
|
||||||
this.cssPosition = this.helper.css("position");
|
|
||||||
this.scrollParent = this.helper.scrollParent();
|
|
||||||
|
|
||||||
//The element's absolute position on the page minus margins
|
|
||||||
this.offset = this.positionAbs = this.element.offset();
|
|
||||||
this.offset = {
|
|
||||||
top: this.offset.top - this.margins.top,
|
|
||||||
left: this.offset.left - this.margins.left
|
|
||||||
};
|
|
||||||
|
|
||||||
$.extend(this.offset, {
|
|
||||||
click: { //Where the click happened, relative to the element
|
|
||||||
left: event.pageX - this.offset.left,
|
|
||||||
top: event.pageY - this.offset.top
|
|
||||||
},
|
|
||||||
parent: this._getParentOffset(),
|
|
||||||
relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
|
|
||||||
});
|
|
||||||
|
|
||||||
//Generate the original position
|
|
||||||
this.originalPosition = this.position = this._generatePosition(event);
|
|
||||||
this.originalPageX = event.pageX;
|
|
||||||
this.originalPageY = event.pageY;
|
|
||||||
|
|
||||||
//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
|
|
||||||
(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
|
|
||||||
|
|
||||||
//Set a containment if given in the options
|
|
||||||
if(o.containment)
|
|
||||||
this._setContainment();
|
|
||||||
|
|
||||||
//Trigger event + callbacks
|
|
||||||
if(this._trigger("start", event) === false) {
|
|
||||||
this._clear();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Recache the helper size
|
|
||||||
this._cacheHelperProportions();
|
|
||||||
|
|
||||||
//Prepare the droppable offsets
|
|
||||||
if ($.ui.ddmanager && !o.dropBehaviour)
|
|
||||||
$.ui.ddmanager.prepareOffsets(this, event);
|
|
||||||
|
|
||||||
this.helper.addClass("ui-draggable-dragging");
|
|
||||||
this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
|
|
||||||
|
|
||||||
//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
|
|
||||||
if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseDrag: function(event, noPropagation) {
|
|
||||||
|
|
||||||
//Compute the helpers position
|
|
||||||
this.position = this._generatePosition(event);
|
|
||||||
this.positionAbs = this._convertPositionTo("absolute");
|
|
||||||
|
|
||||||
//Call plugins and callbacks and use the resulting position if something is returned
|
|
||||||
if (!noPropagation) {
|
|
||||||
var ui = this._uiHash();
|
|
||||||
if(this._trigger('drag', event, ui) === false) {
|
|
||||||
this._mouseUp({});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this.position = ui.position;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
|
|
||||||
if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
|
|
||||||
if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseStop: function(event) {
|
|
||||||
|
|
||||||
//If we are using droppables, inform the manager about the drop
|
|
||||||
var dropped = false;
|
|
||||||
if ($.ui.ddmanager && !this.options.dropBehaviour)
|
|
||||||
dropped = $.ui.ddmanager.drop(this, event);
|
|
||||||
|
|
||||||
//if a drop comes from outside (a sortable)
|
|
||||||
if(this.dropped) {
|
|
||||||
dropped = this.dropped;
|
|
||||||
this.dropped = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//if the original element is removed, don't bother to continue if helper is set to "original"
|
|
||||||
if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
|
|
||||||
var self = this;
|
|
||||||
$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
|
|
||||||
if(self._trigger("stop", event) !== false) {
|
|
||||||
self._clear();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if(this._trigger("stop", event) !== false) {
|
|
||||||
this._clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseUp: function(event) {
|
|
||||||
if (this.options.iframeFix === true) {
|
|
||||||
$("div.ui-draggable-iframeFix").each(function() {
|
|
||||||
this.parentNode.removeChild(this);
|
|
||||||
}); //Remove frame helpers
|
|
||||||
}
|
|
||||||
|
|
||||||
//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
|
|
||||||
if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
|
|
||||||
|
|
||||||
return $.ui.mouse.prototype._mouseUp.call(this, event);
|
|
||||||
},
|
|
||||||
|
|
||||||
cancel: function() {
|
|
||||||
|
|
||||||
if(this.helper.is(".ui-draggable-dragging")) {
|
|
||||||
this._mouseUp({});
|
|
||||||
} else {
|
|
||||||
this._clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_getHandle: function(event) {
|
|
||||||
|
|
||||||
var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
|
|
||||||
$(this.options.handle, this.element)
|
|
||||||
.find("*")
|
|
||||||
.andSelf()
|
|
||||||
.each(function() {
|
|
||||||
if(this == event.target) handle = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
return handle;
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_createHelper: function(event) {
|
|
||||||
|
|
||||||
var o = this.options;
|
|
||||||
var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
|
|
||||||
|
|
||||||
if(!helper.parents('body').length)
|
|
||||||
helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
|
|
||||||
|
|
||||||
if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
|
|
||||||
helper.css("position", "absolute");
|
|
||||||
|
|
||||||
return helper;
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_adjustOffsetFromHelper: function(obj) {
|
|
||||||
if (typeof obj == 'string') {
|
|
||||||
obj = obj.split(' ');
|
|
||||||
}
|
|
||||||
if ($.isArray(obj)) {
|
|
||||||
obj = {left: +obj[0], top: +obj[1] || 0};
|
|
||||||
}
|
|
||||||
if ('left' in obj) {
|
|
||||||
this.offset.click.left = obj.left + this.margins.left;
|
|
||||||
}
|
|
||||||
if ('right' in obj) {
|
|
||||||
this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
|
|
||||||
}
|
|
||||||
if ('top' in obj) {
|
|
||||||
this.offset.click.top = obj.top + this.margins.top;
|
|
||||||
}
|
|
||||||
if ('bottom' in obj) {
|
|
||||||
this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_getParentOffset: function() {
|
|
||||||
|
|
||||||
//Get the offsetParent and cache its position
|
|
||||||
this.offsetParent = this.helper.offsetParent();
|
|
||||||
var po = this.offsetParent.offset();
|
|
||||||
|
|
||||||
// This is a special case where we need to modify a offset calculated on start, since the following happened:
|
|
||||||
// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
|
|
||||||
// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
|
|
||||||
// the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
|
|
||||||
if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
|
|
||||||
po.left += this.scrollParent.scrollLeft();
|
|
||||||
po.top += this.scrollParent.scrollTop();
|
|
||||||
}
|
|
||||||
|
|
||||||
if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
|
|
||||||
|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
|
|
||||||
po = { top: 0, left: 0 };
|
|
||||||
|
|
||||||
return {
|
|
||||||
top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
|
|
||||||
left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
|
|
||||||
};
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_getRelativeOffset: function() {
|
|
||||||
|
|
||||||
if(this.cssPosition == "relative") {
|
|
||||||
var p = this.element.position();
|
|
||||||
return {
|
|
||||||
top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
|
|
||||||
left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
return { top: 0, left: 0 };
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_cacheMargins: function() {
|
|
||||||
this.margins = {
|
|
||||||
left: (parseInt(this.element.css("marginLeft"),10) || 0),
|
|
||||||
top: (parseInt(this.element.css("marginTop"),10) || 0),
|
|
||||||
right: (parseInt(this.element.css("marginRight"),10) || 0),
|
|
||||||
bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
_cacheHelperProportions: function() {
|
|
||||||
this.helperProportions = {
|
|
||||||
width: this.helper.outerWidth(),
|
|
||||||
height: this.helper.outerHeight()
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
_setContainment: function() {
|
|
||||||
|
|
||||||
var o = this.options;
|
|
||||||
if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
|
|
||||||
if(o.containment == 'document' || o.containment == 'window') this.containment = [
|
|
||||||
o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
|
|
||||||
o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
|
|
||||||
(o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
|
|
||||||
(o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
|
|
||||||
];
|
|
||||||
|
|
||||||
if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
|
|
||||||
var c = $(o.containment);
|
|
||||||
var ce = c[0]; if(!ce) return;
|
|
||||||
var co = c.offset();
|
|
||||||
var over = ($(ce).css("overflow") != 'hidden');
|
|
||||||
|
|
||||||
this.containment = [
|
|
||||||
(parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
|
|
||||||
(parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
|
|
||||||
(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
|
|
||||||
(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top - this.margins.bottom
|
|
||||||
];
|
|
||||||
this.relative_container = c;
|
|
||||||
|
|
||||||
} else if(o.containment.constructor == Array) {
|
|
||||||
this.containment = o.containment;
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_convertPositionTo: function(d, pos) {
|
|
||||||
|
|
||||||
if(!pos) pos = this.position;
|
|
||||||
var mod = d == "absolute" ? 1 : -1;
|
|
||||||
var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
|
|
||||||
|
|
||||||
return {
|
|
||||||
top: (
|
|
||||||
pos.top // The absolute mouse position
|
|
||||||
+ this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
|
|
||||||
+ this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
|
|
||||||
- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
|
|
||||||
),
|
|
||||||
left: (
|
|
||||||
pos.left // The absolute mouse position
|
|
||||||
+ this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
|
|
||||||
+ this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
|
|
||||||
- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_generatePosition: function(event) {
|
|
||||||
|
|
||||||
var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
|
|
||||||
var pageX = event.pageX;
|
|
||||||
var pageY = event.pageY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* - Position constraining -
|
|
||||||
* Constrain the position to a mix of grid, containment.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if(this.originalPosition) { //If we are not dragging yet, we won't check for options
|
|
||||||
var containment;
|
|
||||||
if(this.containment) {
|
|
||||||
if (this.relative_container){
|
|
||||||
var co = this.relative_container.offset();
|
|
||||||
containment = [ this.containment[0] + co.left,
|
|
||||||
this.containment[1] + co.top,
|
|
||||||
this.containment[2] + co.left,
|
|
||||||
this.containment[3] + co.top ];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
containment = this.containment;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
|
|
||||||
if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
|
|
||||||
if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
|
|
||||||
if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(o.grid) {
|
|
||||||
//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
|
|
||||||
var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
|
|
||||||
pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
|
|
||||||
|
|
||||||
var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
|
|
||||||
pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
top: (
|
|
||||||
pageY // The absolute mouse position
|
|
||||||
- this.offset.click.top // Click offset (relative to the element)
|
|
||||||
- this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
|
|
||||||
- this.offset.parent.top // The offsetParent's offset without borders (offset + border)
|
|
||||||
+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
|
|
||||||
),
|
|
||||||
left: (
|
|
||||||
pageX // The absolute mouse position
|
|
||||||
- this.offset.click.left // Click offset (relative to the element)
|
|
||||||
- this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
|
|
||||||
- this.offset.parent.left // The offsetParent's offset without borders (offset + border)
|
|
||||||
+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_clear: function() {
|
|
||||||
this.helper.removeClass("ui-draggable-dragging");
|
|
||||||
if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
|
|
||||||
//if($.ui.ddmanager) $.ui.ddmanager.current = null;
|
|
||||||
this.helper = null;
|
|
||||||
this.cancelHelperRemoval = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// From now on bulk stuff - mainly helpers
|
|
||||||
|
|
||||||
_trigger: function(type, event, ui) {
|
|
||||||
ui = ui || this._uiHash();
|
|
||||||
$.ui.plugin.call(this, type, [event, ui]);
|
|
||||||
if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
|
|
||||||
return $.Widget.prototype._trigger.call(this, type, event, ui);
|
|
||||||
},
|
|
||||||
|
|
||||||
plugins: {},
|
|
||||||
|
|
||||||
_uiHash: function(event) {
|
|
||||||
return {
|
|
||||||
helper: this.helper,
|
|
||||||
position: this.position,
|
|
||||||
originalPosition: this.originalPosition,
|
|
||||||
offset: this.positionAbs
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
$.extend($.ui.draggable, {
|
|
||||||
version: "1.8.16"
|
|
||||||
});
|
|
||||||
|
|
||||||
$.ui.plugin.add("draggable", "connectToSortable", {
|
|
||||||
start: function(event, ui) {
|
|
||||||
|
|
||||||
var inst = $(this).data("draggable"), o = inst.options,
|
|
||||||
uiSortable = $.extend({}, ui, { item: inst.element });
|
|
||||||
inst.sortables = [];
|
|
||||||
$(o.connectToSortable).each(function() {
|
|
||||||
var sortable = $.data(this, 'sortable');
|
|
||||||
if (sortable && !sortable.options.disabled) {
|
|
||||||
inst.sortables.push({
|
|
||||||
instance: sortable,
|
|
||||||
shouldRevert: sortable.options.revert
|
|
||||||
});
|
|
||||||
sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
|
|
||||||
sortable._trigger("activate", event, uiSortable);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
},
|
|
||||||
stop: function(event, ui) {
|
|
||||||
|
|
||||||
//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
|
|
||||||
var inst = $(this).data("draggable"),
|
|
||||||
uiSortable = $.extend({}, ui, { item: inst.element });
|
|
||||||
|
|
||||||
$.each(inst.sortables, function() {
|
|
||||||
if(this.instance.isOver) {
|
|
||||||
|
|
||||||
this.instance.isOver = 0;
|
|
||||||
|
|
||||||
inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
|
|
||||||
this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
|
|
||||||
|
|
||||||
//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
|
|
||||||
if(this.shouldRevert) this.instance.options.revert = true;
|
|
||||||
|
|
||||||
//Trigger the stop of the sortable
|
|
||||||
this.instance._mouseStop(event);
|
|
||||||
|
|
||||||
this.instance.options.helper = this.instance.options._helper;
|
|
||||||
|
|
||||||
//If the helper has been the original item, restore properties in the sortable
|
|
||||||
if(inst.options.helper == 'original')
|
|
||||||
this.instance.currentItem.css({ top: 'auto', left: 'auto' });
|
|
||||||
|
|
||||||
} else {
|
|
||||||
this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
|
|
||||||
this.instance._trigger("deactivate", event, uiSortable);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
},
|
|
||||||
drag: function(event, ui) {
|
|
||||||
|
|
||||||
var inst = $(this).data("draggable"), self = this;
|
|
||||||
|
|
||||||
var checkPos = function(o) {
|
|
||||||
var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
|
|
||||||
var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
|
|
||||||
var itemHeight = o.height, itemWidth = o.width;
|
|
||||||
var itemTop = o.top, itemLeft = o.left;
|
|
||||||
|
|
||||||
return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
|
|
||||||
};
|
|
||||||
|
|
||||||
$.each(inst.sortables, function(i) {
|
|
||||||
|
|
||||||
//Copy over some variables to allow calling the sortable's native _intersectsWith
|
|
||||||
this.instance.positionAbs = inst.positionAbs;
|
|
||||||
this.instance.helperProportions = inst.helperProportions;
|
|
||||||
this.instance.offset.click = inst.offset.click;
|
|
||||||
|
|
||||||
if(this.instance._intersectsWith(this.instance.containerCache)) {
|
|
||||||
|
|
||||||
//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
|
|
||||||
if(!this.instance.isOver) {
|
|
||||||
|
|
||||||
this.instance.isOver = 1;
|
|
||||||
//Now we fake the start of dragging for the sortable instance,
|
|
||||||
//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
|
|
||||||
//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
|
|
||||||
this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
|
|
||||||
this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
|
|
||||||
this.instance.options.helper = function() { return ui.helper[0]; };
|
|
||||||
|
|
||||||
event.target = this.instance.currentItem[0];
|
|
||||||
this.instance._mouseCapture(event, true);
|
|
||||||
this.instance._mouseStart(event, true, true);
|
|
||||||
|
|
||||||
//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
|
|
||||||
this.instance.offset.click.top = inst.offset.click.top;
|
|
||||||
this.instance.offset.click.left = inst.offset.click.left;
|
|
||||||
this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
|
|
||||||
this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
|
|
||||||
|
|
||||||
inst._trigger("toSortable", event);
|
|
||||||
inst.dropped = this.instance.element; //draggable revert needs that
|
|
||||||
//hack so receive/update callbacks work (mostly)
|
|
||||||
inst.currentItem = inst.element;
|
|
||||||
this.instance.fromOutside = inst;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
|
|
||||||
if(this.instance.currentItem) this.instance._mouseDrag(event);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
//If it doesn't intersect with the sortable, and it intersected before,
|
|
||||||
//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
|
|
||||||
if(this.instance.isOver) {
|
|
||||||
|
|
||||||
this.instance.isOver = 0;
|
|
||||||
this.instance.cancelHelperRemoval = true;
|
|
||||||
|
|
||||||
//Prevent reverting on this forced stop
|
|
||||||
this.instance.options.revert = false;
|
|
||||||
|
|
||||||
// The out event needs to be triggered independently
|
|
||||||
this.instance._trigger('out', event, this.instance._uiHash(this.instance));
|
|
||||||
|
|
||||||
this.instance._mouseStop(event, true);
|
|
||||||
this.instance.options.helper = this.instance.options._helper;
|
|
||||||
|
|
||||||
//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
|
|
||||||
this.instance.currentItem.remove();
|
|
||||||
if(this.instance.placeholder) this.instance.placeholder.remove();
|
|
||||||
|
|
||||||
inst._trigger("fromSortable", event);
|
|
||||||
inst.dropped = false; //draggable revert needs that
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$.ui.plugin.add("draggable", "cursor", {
|
|
||||||
start: function(event, ui) {
|
|
||||||
var t = $('body'), o = $(this).data('draggable').options;
|
|
||||||
if (t.css("cursor")) o._cursor = t.css("cursor");
|
|
||||||
t.css("cursor", o.cursor);
|
|
||||||
},
|
|
||||||
stop: function(event, ui) {
|
|
||||||
var o = $(this).data('draggable').options;
|
|
||||||
if (o._cursor) $('body').css("cursor", o._cursor);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$.ui.plugin.add("draggable", "opacity", {
|
|
||||||
start: function(event, ui) {
|
|
||||||
var t = $(ui.helper), o = $(this).data('draggable').options;
|
|
||||||
if(t.css("opacity")) o._opacity = t.css("opacity");
|
|
||||||
t.css('opacity', o.opacity);
|
|
||||||
},
|
|
||||||
stop: function(event, ui) {
|
|
||||||
var o = $(this).data('draggable').options;
|
|
||||||
if(o._opacity) $(ui.helper).css('opacity', o._opacity);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$.ui.plugin.add("draggable", "scroll", {
|
|
||||||
start: function(event, ui) {
|
|
||||||
var i = $(this).data("draggable");
|
|
||||||
if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
|
|
||||||
},
|
|
||||||
drag: function(event, ui) {
|
|
||||||
|
|
||||||
var i = $(this).data("draggable"), o = i.options, scrolled = false;
|
|
||||||
|
|
||||||
if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
|
|
||||||
|
|
||||||
if(!o.axis || o.axis != 'x') {
|
|
||||||
if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
|
|
||||||
i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
|
|
||||||
else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
|
|
||||||
i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!o.axis || o.axis != 'y') {
|
|
||||||
if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
|
|
||||||
i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
|
|
||||||
else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
|
|
||||||
i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if(!o.axis || o.axis != 'x') {
|
|
||||||
if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
|
|
||||||
scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
|
|
||||||
else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
|
|
||||||
scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!o.axis || o.axis != 'y') {
|
|
||||||
if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
|
|
||||||
scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
|
|
||||||
else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
|
|
||||||
scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
|
|
||||||
$.ui.ddmanager.prepareOffsets(i, event);
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$.ui.plugin.add("draggable", "snap", {
|
|
||||||
start: function(event, ui) {
|
|
||||||
|
|
||||||
var i = $(this).data("draggable"), o = i.options;
|
|
||||||
i.snapElements = [];
|
|
||||||
|
|
||||||
$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
|
|
||||||
var $t = $(this); var $o = $t.offset();
|
|
||||||
if(this != i.element[0]) i.snapElements.push({
|
|
||||||
item: this,
|
|
||||||
width: $t.outerWidth(), height: $t.outerHeight(),
|
|
||||||
top: $o.top, left: $o.left
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
},
|
|
||||||
drag: function(event, ui) {
|
|
||||||
|
|
||||||
var inst = $(this).data("draggable"), o = inst.options;
|
|
||||||
var d = o.snapTolerance;
|
|
||||||
|
|
||||||
var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
|
|
||||||
y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
|
|
||||||
|
|
||||||
for (var i = inst.snapElements.length - 1; i >= 0; i--){
|
|
||||||
|
|
||||||
var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
|
|
||||||
t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
|
|
||||||
|
|
||||||
//Yes, I know, this is insane ;)
|
|
||||||
if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
|
|
||||||
if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
|
|
||||||
inst.snapElements[i].snapping = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(o.snapMode != 'inner') {
|
|
||||||
var ts = Math.abs(t - y2) <= d;
|
|
||||||
var bs = Math.abs(b - y1) <= d;
|
|
||||||
var ls = Math.abs(l - x2) <= d;
|
|
||||||
var rs = Math.abs(r - x1) <= d;
|
|
||||||
if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
|
|
||||||
if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
|
|
||||||
if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
|
|
||||||
if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
|
|
||||||
}
|
|
||||||
|
|
||||||
var first = (ts || bs || ls || rs);
|
|
||||||
|
|
||||||
if(o.snapMode != 'outer') {
|
|
||||||
var ts = Math.abs(t - y1) <= d;
|
|
||||||
var bs = Math.abs(b - y2) <= d;
|
|
||||||
var ls = Math.abs(l - x1) <= d;
|
|
||||||
var rs = Math.abs(r - x2) <= d;
|
|
||||||
if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
|
|
||||||
if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
|
|
||||||
if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
|
|
||||||
if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
|
|
||||||
(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
|
|
||||||
inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$.ui.plugin.add("draggable", "stack", {
|
|
||||||
start: function(event, ui) {
|
|
||||||
|
|
||||||
var o = $(this).data("draggable").options;
|
|
||||||
|
|
||||||
var group = $.makeArray($(o.stack)).sort(function(a,b) {
|
|
||||||
return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
|
|
||||||
});
|
|
||||||
if (!group.length) { return; }
|
|
||||||
|
|
||||||
var min = parseInt(group[0].style.zIndex) || 0;
|
|
||||||
$(group).each(function(i) {
|
|
||||||
this.style.zIndex = min + i;
|
|
||||||
});
|
|
||||||
|
|
||||||
this[0].style.zIndex = min + group.length;
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$.ui.plugin.add("draggable", "zIndex", {
|
|
||||||
start: function(event, ui) {
|
|
||||||
var t = $(ui.helper), o = $(this).data("draggable").options;
|
|
||||||
if(t.css("zIndex")) o._zIndex = t.css("zIndex");
|
|
||||||
t.css('zIndex', o.zIndex);
|
|
||||||
},
|
|
||||||
stop: function(event, ui) {
|
|
||||||
var o = $(this).data("draggable").options;
|
|
||||||
if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
})(jQuery);
|
|
||||||
|
|
@ -1,296 +0,0 @@
|
||||||
/*
|
|
||||||
* jQuery UI Droppable 1.8.16
|
|
||||||
*
|
|
||||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/UI/Droppables
|
|
||||||
*
|
|
||||||
* Depends:
|
|
||||||
* jquery.ui.core.js
|
|
||||||
* jquery.ui.widget.js
|
|
||||||
* jquery.ui.mouse.js
|
|
||||||
* jquery.ui.draggable.js
|
|
||||||
*/
|
|
||||||
(function( $, undefined ) {
|
|
||||||
|
|
||||||
$.widget("ui.droppable", {
|
|
||||||
widgetEventPrefix: "drop",
|
|
||||||
options: {
|
|
||||||
accept: '*',
|
|
||||||
activeClass: false,
|
|
||||||
addClasses: true,
|
|
||||||
greedy: false,
|
|
||||||
hoverClass: false,
|
|
||||||
scope: 'default',
|
|
||||||
tolerance: 'intersect'
|
|
||||||
},
|
|
||||||
_create: function() {
|
|
||||||
|
|
||||||
var o = this.options, accept = o.accept;
|
|
||||||
this.isover = 0; this.isout = 1;
|
|
||||||
|
|
||||||
this.accept = $.isFunction(accept) ? accept : function(d) {
|
|
||||||
return d.is(accept);
|
|
||||||
};
|
|
||||||
|
|
||||||
//Store the droppable's proportions
|
|
||||||
this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
|
|
||||||
|
|
||||||
// Add the reference and positions to the manager
|
|
||||||
$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
|
|
||||||
$.ui.ddmanager.droppables[o.scope].push(this);
|
|
||||||
|
|
||||||
(o.addClasses && this.element.addClass("ui-droppable"));
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
destroy: function() {
|
|
||||||
var drop = $.ui.ddmanager.droppables[this.options.scope];
|
|
||||||
for ( var i = 0; i < drop.length; i++ )
|
|
||||||
if ( drop[i] == this )
|
|
||||||
drop.splice(i, 1);
|
|
||||||
|
|
||||||
this.element
|
|
||||||
.removeClass("ui-droppable ui-droppable-disabled")
|
|
||||||
.removeData("droppable")
|
|
||||||
.unbind(".droppable");
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
_setOption: function(key, value) {
|
|
||||||
|
|
||||||
if(key == 'accept') {
|
|
||||||
this.accept = $.isFunction(value) ? value : function(d) {
|
|
||||||
return d.is(value);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
$.Widget.prototype._setOption.apply(this, arguments);
|
|
||||||
},
|
|
||||||
|
|
||||||
_activate: function(event) {
|
|
||||||
var draggable = $.ui.ddmanager.current;
|
|
||||||
if(this.options.activeClass) this.element.addClass(this.options.activeClass);
|
|
||||||
(draggable && this._trigger('activate', event, this.ui(draggable)));
|
|
||||||
},
|
|
||||||
|
|
||||||
_deactivate: function(event) {
|
|
||||||
var draggable = $.ui.ddmanager.current;
|
|
||||||
if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
|
|
||||||
(draggable && this._trigger('deactivate', event, this.ui(draggable)));
|
|
||||||
},
|
|
||||||
|
|
||||||
_over: function(event) {
|
|
||||||
|
|
||||||
var draggable = $.ui.ddmanager.current;
|
|
||||||
if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
|
|
||||||
|
|
||||||
if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
|
|
||||||
if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
|
|
||||||
this._trigger('over', event, this.ui(draggable));
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_out: function(event) {
|
|
||||||
|
|
||||||
var draggable = $.ui.ddmanager.current;
|
|
||||||
if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
|
|
||||||
|
|
||||||
if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
|
|
||||||
if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
|
|
||||||
this._trigger('out', event, this.ui(draggable));
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
_drop: function(event,custom) {
|
|
||||||
|
|
||||||
var draggable = custom || $.ui.ddmanager.current;
|
|
||||||
if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
|
|
||||||
|
|
||||||
var childrenIntersection = false;
|
|
||||||
this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
|
|
||||||
var inst = $.data(this, 'droppable');
|
|
||||||
if(
|
|
||||||
inst.options.greedy
|
|
||||||
&& !inst.options.disabled
|
|
||||||
&& inst.options.scope == draggable.options.scope
|
|
||||||
&& inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
|
|
||||||
&& $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
|
|
||||||
) { childrenIntersection = true; return false; }
|
|
||||||
});
|
|
||||||
if(childrenIntersection) return false;
|
|
||||||
|
|
||||||
if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
|
|
||||||
if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
|
|
||||||
if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
|
|
||||||
this._trigger('drop', event, this.ui(draggable));
|
|
||||||
return this.element;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
ui: function(c) {
|
|
||||||
return {
|
|
||||||
draggable: (c.currentItem || c.element),
|
|
||||||
helper: c.helper,
|
|
||||||
position: c.position,
|
|
||||||
offset: c.positionAbs
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
$.extend($.ui.droppable, {
|
|
||||||
version: "1.8.16"
|
|
||||||
});
|
|
||||||
|
|
||||||
$.ui.intersect = function(draggable, droppable, toleranceMode) {
|
|
||||||
|
|
||||||
if (!droppable.offset) return false;
|
|
||||||
|
|
||||||
var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
|
|
||||||
y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
|
|
||||||
var l = droppable.offset.left, r = l + droppable.proportions.width,
|
|
||||||
t = droppable.offset.top, b = t + droppable.proportions.height;
|
|
||||||
|
|
||||||
switch (toleranceMode) {
|
|
||||||
case 'fit':
|
|
||||||
return (l <= x1 && x2 <= r
|
|
||||||
&& t <= y1 && y2 <= b);
|
|
||||||
break;
|
|
||||||
case 'intersect':
|
|
||||||
return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
|
|
||||||
&& x2 - (draggable.helperProportions.width / 2) < r // Left Half
|
|
||||||
&& t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
|
|
||||||
&& y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
|
|
||||||
break;
|
|
||||||
case 'pointer':
|
|
||||||
var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
|
|
||||||
draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
|
|
||||||
isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
|
|
||||||
return isOver;
|
|
||||||
break;
|
|
||||||
case 'touch':
|
|
||||||
return (
|
|
||||||
(y1 >= t && y1 <= b) || // Top edge touching
|
|
||||||
(y2 >= t && y2 <= b) || // Bottom edge touching
|
|
||||||
(y1 < t && y2 > b) // Surrounded vertically
|
|
||||||
) && (
|
|
||||||
(x1 >= l && x1 <= r) || // Left edge touching
|
|
||||||
(x2 >= l && x2 <= r) || // Right edge touching
|
|
||||||
(x1 < l && x2 > r) // Surrounded horizontally
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
This manager tracks offsets of draggables and droppables
|
|
||||||
*/
|
|
||||||
$.ui.ddmanager = {
|
|
||||||
current: null,
|
|
||||||
droppables: { 'default': [] },
|
|
||||||
prepareOffsets: function(t, event) {
|
|
||||||
|
|
||||||
var m = $.ui.ddmanager.droppables[t.options.scope] || [];
|
|
||||||
var type = event ? event.type : null; // workaround for #2317
|
|
||||||
var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
|
|
||||||
|
|
||||||
droppablesLoop: for (var i = 0; i < m.length; i++) {
|
|
||||||
|
|
||||||
if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted
|
|
||||||
for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
|
|
||||||
m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue
|
|
||||||
|
|
||||||
if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
|
|
||||||
|
|
||||||
m[i].offset = m[i].element.offset();
|
|
||||||
m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
drop: function(draggable, event) {
|
|
||||||
|
|
||||||
var dropped = false;
|
|
||||||
$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
|
|
||||||
|
|
||||||
if(!this.options) return;
|
|
||||||
if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
|
|
||||||
dropped = dropped || this._drop.call(this, event);
|
|
||||||
|
|
||||||
if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
|
|
||||||
this.isout = 1; this.isover = 0;
|
|
||||||
this._deactivate.call(this, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
return dropped;
|
|
||||||
|
|
||||||
},
|
|
||||||
dragStart: function( draggable, event ) {
|
|
||||||
//Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
|
|
||||||
draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
|
|
||||||
if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
|
|
||||||
});
|
|
||||||
},
|
|
||||||
drag: function(draggable, event) {
|
|
||||||
|
|
||||||
//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
|
|
||||||
if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
|
|
||||||
|
|
||||||
//Run through all droppables and check their positions based on specific tolerance options
|
|
||||||
$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
|
|
||||||
|
|
||||||
if(this.options.disabled || this.greedyChild || !this.visible) return;
|
|
||||||
var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
|
|
||||||
|
|
||||||
var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
|
|
||||||
if(!c) return;
|
|
||||||
|
|
||||||
var parentInstance;
|
|
||||||
if (this.options.greedy) {
|
|
||||||
var parent = this.element.parents(':data(droppable):eq(0)');
|
|
||||||
if (parent.length) {
|
|
||||||
parentInstance = $.data(parent[0], 'droppable');
|
|
||||||
parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// we just moved into a greedy child
|
|
||||||
if (parentInstance && c == 'isover') {
|
|
||||||
parentInstance['isover'] = 0;
|
|
||||||
parentInstance['isout'] = 1;
|
|
||||||
parentInstance._out.call(parentInstance, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
|
|
||||||
this[c == "isover" ? "_over" : "_out"].call(this, event);
|
|
||||||
|
|
||||||
// we just moved out of a greedy child
|
|
||||||
if (parentInstance && c == 'isout') {
|
|
||||||
parentInstance['isout'] = 0;
|
|
||||||
parentInstance['isover'] = 1;
|
|
||||||
parentInstance._over.call(parentInstance, event);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
},
|
|
||||||
dragStop: function( draggable, event ) {
|
|
||||||
draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
|
|
||||||
//Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
|
|
||||||
if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
})(jQuery);
|
|
||||||
|
|
@ -1,162 +0,0 @@
|
||||||
/*!
|
|
||||||
* jQuery UI Mouse 1.8.16
|
|
||||||
*
|
|
||||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/UI/Mouse
|
|
||||||
*
|
|
||||||
* Depends:
|
|
||||||
* jquery.ui.widget.js
|
|
||||||
*/
|
|
||||||
(function( $, undefined ) {
|
|
||||||
|
|
||||||
var mouseHandled = false;
|
|
||||||
$( document ).mouseup( function( e ) {
|
|
||||||
mouseHandled = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
$.widget("ui.mouse", {
|
|
||||||
options: {
|
|
||||||
cancel: ':input,option',
|
|
||||||
distance: 1,
|
|
||||||
delay: 0
|
|
||||||
},
|
|
||||||
_mouseInit: function() {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
this.element
|
|
||||||
.bind('mousedown.'+this.widgetName, function(event) {
|
|
||||||
return self._mouseDown(event);
|
|
||||||
})
|
|
||||||
.bind('click.'+this.widgetName, function(event) {
|
|
||||||
if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
|
|
||||||
$.removeData(event.target, self.widgetName + '.preventClickEvent');
|
|
||||||
event.stopImmediatePropagation();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.started = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// TODO: make sure destroying one instance of mouse doesn't mess with
|
|
||||||
// other instances of mouse
|
|
||||||
_mouseDestroy: function() {
|
|
||||||
this.element.unbind('.'+this.widgetName);
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseDown: function(event) {
|
|
||||||
// don't let more than one widget handle mouseStart
|
|
||||||
if( mouseHandled ) { return };
|
|
||||||
|
|
||||||
// we may have missed mouseup (out of window)
|
|
||||||
(this._mouseStarted && this._mouseUp(event));
|
|
||||||
|
|
||||||
this._mouseDownEvent = event;
|
|
||||||
|
|
||||||
var self = this,
|
|
||||||
btnIsLeft = (event.which == 1),
|
|
||||||
// event.target.nodeName works around a bug in IE 8 with
|
|
||||||
// disabled inputs (#7620)
|
|
||||||
elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
|
|
||||||
if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.mouseDelayMet = !this.options.delay;
|
|
||||||
if (!this.mouseDelayMet) {
|
|
||||||
this._mouseDelayTimer = setTimeout(function() {
|
|
||||||
self.mouseDelayMet = true;
|
|
||||||
}, this.options.delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
|
||||||
this._mouseStarted = (this._mouseStart(event) !== false);
|
|
||||||
if (!this._mouseStarted) {
|
|
||||||
event.preventDefault();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Click event may never have fired (Gecko & Opera)
|
|
||||||
if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
|
|
||||||
$.removeData(event.target, this.widgetName + '.preventClickEvent');
|
|
||||||
}
|
|
||||||
|
|
||||||
// these delegates are required to keep context
|
|
||||||
this._mouseMoveDelegate = function(event) {
|
|
||||||
return self._mouseMove(event);
|
|
||||||
};
|
|
||||||
this._mouseUpDelegate = function(event) {
|
|
||||||
return self._mouseUp(event);
|
|
||||||
};
|
|
||||||
$(document)
|
|
||||||
.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
|
|
||||||
.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
mouseHandled = true;
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseMove: function(event) {
|
|
||||||
// IE mouseup check - mouseup happened when mouse was out of window
|
|
||||||
if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
|
|
||||||
return this._mouseUp(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._mouseStarted) {
|
|
||||||
this._mouseDrag(event);
|
|
||||||
return event.preventDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
|
|
||||||
this._mouseStarted =
|
|
||||||
(this._mouseStart(this._mouseDownEvent, event) !== false);
|
|
||||||
(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
|
|
||||||
}
|
|
||||||
|
|
||||||
return !this._mouseStarted;
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseUp: function(event) {
|
|
||||||
$(document)
|
|
||||||
.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
|
|
||||||
.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
|
|
||||||
|
|
||||||
if (this._mouseStarted) {
|
|
||||||
this._mouseStarted = false;
|
|
||||||
|
|
||||||
if (event.target == this._mouseDownEvent.target) {
|
|
||||||
$.data(event.target, this.widgetName + '.preventClickEvent', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._mouseStop(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseDistanceMet: function(event) {
|
|
||||||
return (Math.max(
|
|
||||||
Math.abs(this._mouseDownEvent.pageX - event.pageX),
|
|
||||||
Math.abs(this._mouseDownEvent.pageY - event.pageY)
|
|
||||||
) >= this.options.distance
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
_mouseDelayMet: function(event) {
|
|
||||||
return this.mouseDelayMet;
|
|
||||||
},
|
|
||||||
|
|
||||||
// These are placeholder methods, to be overriden by extending plugin
|
|
||||||
_mouseStart: function(event) {},
|
|
||||||
_mouseDrag: function(event) {},
|
|
||||||
_mouseStop: function(event) {},
|
|
||||||
_mouseCapture: function(event) { return true; }
|
|
||||||
});
|
|
||||||
|
|
||||||
})(jQuery);
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,268 +0,0 @@
|
||||||
/*!
|
|
||||||
* jQuery UI Widget 1.8.16
|
|
||||||
*
|
|
||||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* http://docs.jquery.com/UI/Widget
|
|
||||||
*/
|
|
||||||
(function( $, undefined ) {
|
|
||||||
|
|
||||||
// jQuery 1.4+
|
|
||||||
if ( $.cleanData ) {
|
|
||||||
var _cleanData = $.cleanData;
|
|
||||||
$.cleanData = function( elems ) {
|
|
||||||
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
|
|
||||||
try {
|
|
||||||
$( elem ).triggerHandler( "remove" );
|
|
||||||
// http://bugs.jquery.com/ticket/8235
|
|
||||||
} catch( e ) {}
|
|
||||||
}
|
|
||||||
_cleanData( elems );
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
var _remove = $.fn.remove;
|
|
||||||
$.fn.remove = function( selector, keepData ) {
|
|
||||||
return this.each(function() {
|
|
||||||
if ( !keepData ) {
|
|
||||||
if ( !selector || $.filter( selector, [ this ] ).length ) {
|
|
||||||
$( "*", this ).add( [ this ] ).each(function() {
|
|
||||||
try {
|
|
||||||
$( this ).triggerHandler( "remove" );
|
|
||||||
// http://bugs.jquery.com/ticket/8235
|
|
||||||
} catch( e ) {}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _remove.call( $(this), selector, keepData );
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
$.widget = function( name, base, prototype ) {
|
|
||||||
var namespace = name.split( "." )[ 0 ],
|
|
||||||
fullName;
|
|
||||||
name = name.split( "." )[ 1 ];
|
|
||||||
fullName = namespace + "-" + name;
|
|
||||||
|
|
||||||
if ( !prototype ) {
|
|
||||||
prototype = base;
|
|
||||||
base = $.Widget;
|
|
||||||
}
|
|
||||||
|
|
||||||
// create selector for plugin
|
|
||||||
$.expr[ ":" ][ fullName ] = function( elem ) {
|
|
||||||
return !!$.data( elem, name );
|
|
||||||
};
|
|
||||||
|
|
||||||
$[ namespace ] = $[ namespace ] || {};
|
|
||||||
$[ namespace ][ name ] = function( options, element ) {
|
|
||||||
// allow instantiation without initializing for simple inheritance
|
|
||||||
if ( arguments.length ) {
|
|
||||||
this._createWidget( options, element );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var basePrototype = new base();
|
|
||||||
// we need to make the options hash a property directly on the new instance
|
|
||||||
// otherwise we'll modify the options hash on the prototype that we're
|
|
||||||
// inheriting from
|
|
||||||
// $.each( basePrototype, function( key, val ) {
|
|
||||||
// if ( $.isPlainObject(val) ) {
|
|
||||||
// basePrototype[ key ] = $.extend( {}, val );
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
basePrototype.options = $.extend( true, {}, basePrototype.options );
|
|
||||||
$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
|
|
||||||
namespace: namespace,
|
|
||||||
widgetName: name,
|
|
||||||
widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
|
|
||||||
widgetBaseClass: fullName
|
|
||||||
}, prototype );
|
|
||||||
|
|
||||||
$.widget.bridge( name, $[ namespace ][ name ] );
|
|
||||||
};
|
|
||||||
|
|
||||||
$.widget.bridge = function( name, object ) {
|
|
||||||
$.fn[ name ] = function( options ) {
|
|
||||||
var isMethodCall = typeof options === "string",
|
|
||||||
args = Array.prototype.slice.call( arguments, 1 ),
|
|
||||||
returnValue = this;
|
|
||||||
|
|
||||||
// allow multiple hashes to be passed on init
|
|
||||||
options = !isMethodCall && args.length ?
|
|
||||||
$.extend.apply( null, [ true, options ].concat(args) ) :
|
|
||||||
options;
|
|
||||||
|
|
||||||
// prevent calls to internal methods
|
|
||||||
if ( isMethodCall && options.charAt( 0 ) === "_" ) {
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isMethodCall ) {
|
|
||||||
this.each(function() {
|
|
||||||
var instance = $.data( this, name ),
|
|
||||||
methodValue = instance && $.isFunction( instance[options] ) ?
|
|
||||||
instance[ options ].apply( instance, args ) :
|
|
||||||
instance;
|
|
||||||
// TODO: add this back in 1.9 and use $.error() (see #5972)
|
|
||||||
// if ( !instance ) {
|
|
||||||
// throw "cannot call methods on " + name + " prior to initialization; " +
|
|
||||||
// "attempted to call method '" + options + "'";
|
|
||||||
// }
|
|
||||||
// if ( !$.isFunction( instance[options] ) ) {
|
|
||||||
// throw "no such method '" + options + "' for " + name + " widget instance";
|
|
||||||
// }
|
|
||||||
// var methodValue = instance[ options ].apply( instance, args );
|
|
||||||
if ( methodValue !== instance && methodValue !== undefined ) {
|
|
||||||
returnValue = methodValue;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.each(function() {
|
|
||||||
var instance = $.data( this, name );
|
|
||||||
if ( instance ) {
|
|
||||||
instance.option( options || {} )._init();
|
|
||||||
} else {
|
|
||||||
$.data( this, name, new object( options, this ) );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
$.Widget = function( options, element ) {
|
|
||||||
// allow instantiation without initializing for simple inheritance
|
|
||||||
if ( arguments.length ) {
|
|
||||||
this._createWidget( options, element );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$.Widget.prototype = {
|
|
||||||
widgetName: "widget",
|
|
||||||
widgetEventPrefix: "",
|
|
||||||
options: {
|
|
||||||
disabled: false
|
|
||||||
},
|
|
||||||
_createWidget: function( options, element ) {
|
|
||||||
// $.widget.bridge stores the plugin instance, but we do it anyway
|
|
||||||
// so that it's stored even before the _create function runs
|
|
||||||
$.data( element, this.widgetName, this );
|
|
||||||
this.element = $( element );
|
|
||||||
this.options = $.extend( true, {},
|
|
||||||
this.options,
|
|
||||||
this._getCreateOptions(),
|
|
||||||
options );
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
this.element.bind( "remove." + this.widgetName, function() {
|
|
||||||
self.destroy();
|
|
||||||
});
|
|
||||||
|
|
||||||
this._create();
|
|
||||||
this._trigger( "create" );
|
|
||||||
this._init();
|
|
||||||
},
|
|
||||||
_getCreateOptions: function() {
|
|
||||||
return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
|
|
||||||
},
|
|
||||||
_create: function() {},
|
|
||||||
_init: function() {},
|
|
||||||
|
|
||||||
destroy: function() {
|
|
||||||
this.element
|
|
||||||
.unbind( "." + this.widgetName )
|
|
||||||
.removeData( this.widgetName );
|
|
||||||
this.widget()
|
|
||||||
.unbind( "." + this.widgetName )
|
|
||||||
.removeAttr( "aria-disabled" )
|
|
||||||
.removeClass(
|
|
||||||
this.widgetBaseClass + "-disabled " +
|
|
||||||
"ui-state-disabled" );
|
|
||||||
},
|
|
||||||
|
|
||||||
widget: function() {
|
|
||||||
return this.element;
|
|
||||||
},
|
|
||||||
|
|
||||||
option: function( key, value ) {
|
|
||||||
var options = key;
|
|
||||||
|
|
||||||
if ( arguments.length === 0 ) {
|
|
||||||
// don't return a reference to the internal hash
|
|
||||||
return $.extend( {}, this.options );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof key === "string" ) {
|
|
||||||
if ( value === undefined ) {
|
|
||||||
return this.options[ key ];
|
|
||||||
}
|
|
||||||
options = {};
|
|
||||||
options[ key ] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._setOptions( options );
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
_setOptions: function( options ) {
|
|
||||||
var self = this;
|
|
||||||
$.each( options, function( key, value ) {
|
|
||||||
self._setOption( key, value );
|
|
||||||
});
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
_setOption: function( key, value ) {
|
|
||||||
this.options[ key ] = value;
|
|
||||||
|
|
||||||
if ( key === "disabled" ) {
|
|
||||||
this.widget()
|
|
||||||
[ value ? "addClass" : "removeClass"](
|
|
||||||
this.widgetBaseClass + "-disabled" + " " +
|
|
||||||
"ui-state-disabled" )
|
|
||||||
.attr( "aria-disabled", value );
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
enable: function() {
|
|
||||||
return this._setOption( "disabled", false );
|
|
||||||
},
|
|
||||||
disable: function() {
|
|
||||||
return this._setOption( "disabled", true );
|
|
||||||
},
|
|
||||||
|
|
||||||
_trigger: function( type, event, data ) {
|
|
||||||
var callback = this.options[ type ];
|
|
||||||
|
|
||||||
event = $.Event( event );
|
|
||||||
event.type = ( type === this.widgetEventPrefix ?
|
|
||||||
type :
|
|
||||||
this.widgetEventPrefix + type ).toLowerCase();
|
|
||||||
data = data || {};
|
|
||||||
|
|
||||||
// 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() );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
})( jQuery );
|
|
||||||
|
|
@ -1,11 +1,4 @@
|
||||||
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
|
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/jquery.ui.core.js"></script>
|
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script>
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/jquery.ui.widget.js"></script>
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/jquery.ui.mouse.js"></script>
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/jquery.ui.draggable.js"></script>
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/jquery.ui.droppable.js"></script>
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/jquery.ui.sortable.js"></script>
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/jquery.effects.core.js"></script>
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/jquery.effects.highlight.js"></script>
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/admin.sortable.stacked.inlines.js"></script>
|
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/admin.sortable.stacked.inlines.js"></script>
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/admin.sortable.js"></script>
|
<script type="text/javascript" src="{{ STATIC_URL }}adminsortable/js/admin.sortable.js"></script>
|
||||||
|
|
|
||||||
Binary file not shown.
4
setup.py
4
setup.py
|
|
@ -12,8 +12,8 @@ setup(
|
||||||
long_description=README,
|
long_description=README,
|
||||||
license='APL',
|
license='APL',
|
||||||
author='Brandon Taylor',
|
author='Brandon Taylor',
|
||||||
author_email='btaylorweb@gmail.com',
|
author_email='brandon@iambrandontaylor.com',
|
||||||
url='http://btaylorweb.com/',
|
url='http://iambrandontaylor.com/',
|
||||||
packages=find_packages(exclude=['sample_project']),
|
packages=find_packages(exclude=['sample_project']),
|
||||||
zip_safe=False,
|
zip_safe=False,
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue