2014-04-11 17:59:09 -04:00
/ * ! j Q u e r y U I - v 1 . 1 0 . 4 - 2 0 1 4 - 0 4 - 1 1
2014-01-03 13:32:13 -05:00
* http : //jqueryui.com
* Includes : jquery . ui . core . js , jquery . ui . widget . js , jquery . ui . mouse . js , jquery . ui . position . js , jquery . ui . resizable . js , jquery . ui . sortable . js , jquery . ui . autocomplete . js , jquery . ui . menu . js , jquery . ui . slider . js , jquery . ui . effect . js , jquery . ui . effect - bounce . js , jquery . ui . effect - highlight . js , jquery . ui . effect - pulsate . js , jquery . ui . effect - shake . js , jquery . ui . effect - transfer . js
2014-04-11 17:59:09 -04:00
* Copyright 2014 jQuery Foundation and other contributors ; Licensed MIT * /
2014-01-03 13:32:13 -05:00
( function ( $ , undefined ) {
var uuid = 0 ,
runiqueId = /^ui-id-\d+$/ ;
// $.ui might exist from components with no dependencies, e.g., $.ui.position
$ . ui = $ . ui || { } ;
$ . extend ( $ . ui , {
2014-04-11 17:59:09 -04:00
version : "1.10.4" ,
2014-01-03 13:32:13 -05:00
keyCode : {
BACKSPACE : 8 ,
COMMA : 188 ,
DELETE : 46 ,
DOWN : 40 ,
END : 35 ,
ENTER : 13 ,
ESCAPE : 27 ,
HOME : 36 ,
LEFT : 37 ,
NUMPAD _ADD : 107 ,
NUMPAD _DECIMAL : 110 ,
NUMPAD _DIVIDE : 111 ,
NUMPAD _ENTER : 108 ,
NUMPAD _MULTIPLY : 106 ,
NUMPAD _SUBTRACT : 109 ,
PAGE _DOWN : 34 ,
PAGE _UP : 33 ,
PERIOD : 190 ,
RIGHT : 39 ,
SPACE : 32 ,
TAB : 9 ,
UP : 38
}
} ) ;
// plugins
$ . fn . extend ( {
focus : ( function ( orig ) {
return function ( delay , fn ) {
return typeof delay === "number" ?
this . each ( function ( ) {
var elem = this ;
setTimeout ( function ( ) {
$ ( elem ) . focus ( ) ;
if ( fn ) {
fn . call ( elem ) ;
}
} , delay ) ;
} ) :
orig . apply ( this , arguments ) ;
} ;
} ) ( $ . fn . focus ) ,
scrollParent : function ( ) {
var scrollParent ;
if ( ( $ . ui . ie && ( /(static|relative)/ ) . test ( this . css ( "position" ) ) ) || ( /absolute/ ) . test ( this . css ( "position" ) ) ) {
scrollParent = this . parents ( ) . filter ( function ( ) {
return ( /(relative|absolute|fixed)/ ) . test ( $ . css ( this , "position" ) ) && ( /(auto|scroll)/ ) . test ( $ . css ( this , "overflow" ) + $ . css ( this , "overflow-y" ) + $ . css ( this , "overflow-x" ) ) ;
} ) . eq ( 0 ) ;
} else {
scrollParent = this . parents ( ) . filter ( function ( ) {
return ( /(auto|scroll)/ ) . test ( $ . css ( this , "overflow" ) + $ . css ( this , "overflow-y" ) + $ . css ( this , "overflow-x" ) ) ;
} ) . 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 ;
} ,
uniqueId : function ( ) {
return this . each ( function ( ) {
if ( ! this . id ) {
this . id = "ui-id-" + ( ++ uuid ) ;
}
} ) ;
} ,
removeUniqueId : function ( ) {
return this . each ( function ( ) {
if ( runiqueId . test ( this . id ) ) {
$ ( this ) . removeAttr ( "id" ) ;
}
} ) ;
}
} ) ;
// selectors
function focusable ( element , isTabIndexNotNaN ) {
var map , mapName , img ,
nodeName = element . nodeName . toLowerCase ( ) ;
if ( "area" === nodeName ) {
map = element . parentNode ;
mapName = map . name ;
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 $ . expr . filters . visible ( element ) &&
! $ ( element ) . parents ( ) . addBack ( ) . filter ( function ( ) {
return $ . css ( this , "visibility" ) === "hidden" ;
} ) . length ;
}
$ . extend ( $ . expr [ ":" ] , {
data : $ . expr . createPseudo ?
$ . expr . createPseudo ( function ( dataName ) {
return function ( elem ) {
return ! ! $ . data ( elem , dataName ) ;
} ;
} ) :
// support: jQuery <1.8
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: jQuery <1.8
if ( ! $ ( "<a>" ) . outerWidth ( 1 ) . jquery ) {
$ . 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 ( $ . css ( elem , "padding" + this ) ) || 0 ;
if ( border ) {
size -= parseFloat ( $ . css ( elem , "border" + this + "Width" ) ) || 0 ;
}
if ( margin ) {
size -= parseFloat ( $ . css ( elem , "margin" + this ) ) || 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" ) ;
} ) ;
} ;
} ) ;
}
// support: jQuery <1.8
if ( ! $ . fn . addBack ) {
$ . fn . addBack = function ( selector ) {
return this . add ( selector == null ?
this . prevObject : this . prevObject . filter ( selector )
) ;
} ;
}
// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
if ( $ ( "<a>" ) . data ( "a-b" , "a" ) . removeData ( "a-b" ) . data ( "a-b" ) ) {
$ . fn . removeData = ( function ( removeData ) {
return function ( key ) {
if ( arguments . length ) {
return removeData . call ( this , $ . camelCase ( key ) ) ;
} else {
return removeData . call ( this ) ;
}
} ;
} ) ( $ . fn . removeData ) ;
}
// deprecated
$ . ui . ie = ! ! /msie [\w.]+/ . exec ( navigator . userAgent . toLowerCase ( ) ) ;
$ . support . selectstart = "onselectstart" in document . createElement ( "div" ) ;
$ . fn . extend ( {
disableSelection : function ( ) {
return this . bind ( ( $ . support . selectstart ? "selectstart" : "mousedown" ) +
".ui-disableSelection" , function ( event ) {
event . preventDefault ( ) ;
} ) ;
} ,
enableSelection : function ( ) {
return this . unbind ( ".ui-disableSelection" ) ;
}
} ) ;
$ . extend ( $ . ui , {
// $.ui.plugin is deprecated. Use $.widget() extensions instead.
plugin : {
add : function ( module , option , set ) {
var i ,
proto = $ . ui [ module ] . prototype ;
for ( i in set ) {
proto . plugins [ i ] = proto . plugins [ i ] || [ ] ;
proto . plugins [ i ] . push ( [ option , set [ i ] ] ) ;
}
} ,
call : function ( instance , name , args ) {
var i ,
set = instance . plugins [ name ] ;
if ( ! set || ! instance . element [ 0 ] . parentNode || instance . element [ 0 ] . parentNode . nodeType === 11 ) {
return ;
}
for ( i = 0 ; i < set . length ; i ++ ) {
if ( instance . options [ set [ i ] [ 0 ] ] ) {
set [ i ] [ 1 ] . apply ( instance . element , args ) ;
}
}
}
} ,
// 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 ;
}
} ) ;
} ) ( jQuery ) ;
( function ( $ , undefined ) {
var uuid = 0 ,
slice = Array . prototype . slice ,
_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 ) ;
} ;
$ . widget = function ( name , base , prototype ) {
var fullName , existingConstructor , constructor , basePrototype ,
// proxiedPrototype allows the provided prototype to remain unmodified
// so that it can be used as a mixin for multiple widgets (#8876)
proxiedPrototype = { } ,
namespace = name . split ( "." ) [ 0 ] ;
name = name . split ( "." ) [ 1 ] ;
fullName = namespace + "-" + name ;
if ( ! prototype ) {
prototype = base ;
base = $ . Widget ;
}
// create selector for plugin
$ . expr [ ":" ] [ fullName . toLowerCase ( ) ] = function ( elem ) {
return ! ! $ . data ( elem , fullName ) ;
} ;
$ [ namespace ] = $ [ namespace ] || { } ;
existingConstructor = $ [ namespace ] [ name ] ;
constructor = $ [ namespace ] [ name ] = function ( options , element ) {
// allow instantiation without "new" keyword
if ( ! this . _createWidget ) {
return new constructor ( options , element ) ;
}
// allow instantiation without initializing for simple inheritance
// must use "new" keyword (the code above always passes args)
if ( arguments . length ) {
this . _createWidget ( options , element ) ;
}
} ;
// extend with the existing constructor to carry over any static properties
$ . extend ( constructor , existingConstructor , {
version : prototype . version ,
// copy the object used to create the prototype in case we need to
// redefine the widget later
_proto : $ . extend ( { } , prototype ) ,
// track widgets that inherit from this widget in case this widget is
// redefined after a widget inherits from it
_childConstructors : [ ]
} ) ;
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
basePrototype . options = $ . widget . extend ( { } , basePrototype . options ) ;
$ . each ( prototype , function ( prop , value ) {
if ( ! $ . isFunction ( value ) ) {
proxiedPrototype [ prop ] = value ;
return ;
}
proxiedPrototype [ prop ] = ( function ( ) {
var _super = function ( ) {
return base . prototype [ prop ] . apply ( this , arguments ) ;
} ,
_superApply = function ( args ) {
return base . prototype [ prop ] . apply ( this , args ) ;
} ;
return function ( ) {
var _ _super = this . _super ,
_ _superApply = this . _superApply ,
returnValue ;
this . _super = _super ;
this . _superApply = _superApply ;
returnValue = value . apply ( this , arguments ) ;
this . _super = _ _super ;
this . _superApply = _ _superApply ;
return returnValue ;
} ;
} ) ( ) ;
} ) ;
constructor . prototype = $ . widget . extend ( basePrototype , {
// TODO: remove support for widgetEventPrefix
// always use the name + a colon as the prefix, e.g., draggable:start
// don't prefix for widgets that aren't DOM-based
2014-04-11 17:59:09 -04:00
widgetEventPrefix : existingConstructor ? ( basePrototype . widgetEventPrefix || name ) : name
2014-01-03 13:32:13 -05:00
} , proxiedPrototype , {
constructor : constructor ,
namespace : namespace ,
widgetName : name ,
widgetFullName : fullName
} ) ;
// If this widget is being redefined then we need to find all widgets that
// are inheriting from it and redefine all of them so that they inherit from
// the new version of this widget. We're essentially trying to replace one
// level in the prototype chain.
if ( existingConstructor ) {
$ . each ( existingConstructor . _childConstructors , function ( i , child ) {
var childPrototype = child . prototype ;
// redefine the child widget using the same prototype that was
// originally used, but inherit from the new version of the base
$ . widget ( childPrototype . namespace + "." + childPrototype . widgetName , constructor , child . _proto ) ;
} ) ;
// remove the list of existing child constructors from the old constructor
// so the old child constructors can be garbage collected
delete existingConstructor . _childConstructors ;
} else {
base . _childConstructors . push ( constructor ) ;
}
$ . widget . bridge ( name , constructor ) ;
} ;
$ . widget . extend = function ( target ) {
var input = slice . call ( arguments , 1 ) ,
inputIndex = 0 ,
inputLength = input . length ,
key ,
value ;
for ( ; inputIndex < inputLength ; inputIndex ++ ) {
for ( key in input [ inputIndex ] ) {
value = input [ inputIndex ] [ key ] ;
if ( input [ inputIndex ] . hasOwnProperty ( key ) && value !== undefined ) {
// Clone objects
if ( $ . isPlainObject ( value ) ) {
target [ key ] = $ . isPlainObject ( target [ key ] ) ?
$ . widget . extend ( { } , target [ key ] , value ) :
// Don't extend strings, arrays, etc. with objects
$ . widget . extend ( { } , value ) ;
// Copy everything else by reference
} else {
target [ key ] = value ;
}
}
}
}
return target ;
} ;
$ . widget . bridge = function ( name , object ) {
var fullName = object . prototype . widgetFullName || name ;
$ . fn [ name ] = function ( options ) {
var isMethodCall = typeof options === "string" ,
args = slice . call ( arguments , 1 ) ,
returnValue = this ;
// allow multiple hashes to be passed on init
options = ! isMethodCall && args . length ?
$ . widget . extend . apply ( null , [ options ] . concat ( args ) ) :
options ;
if ( isMethodCall ) {
this . each ( function ( ) {
var methodValue ,
instance = $ . data ( this , fullName ) ;
if ( ! instance ) {
return $ . error ( "cannot call methods on " + name + " prior to initialization; " +
"attempted to call method '" + options + "'" ) ;
}
if ( ! $ . isFunction ( instance [ options ] ) || options . charAt ( 0 ) === "_" ) {
return $ . error ( "no such method '" + options + "' for " + name + " widget instance" ) ;
}
methodValue = instance [ options ] . apply ( instance , args ) ;
if ( methodValue !== instance && methodValue !== undefined ) {
returnValue = methodValue && methodValue . jquery ?
returnValue . pushStack ( methodValue . get ( ) ) :
methodValue ;
return false ;
}
} ) ;
} else {
this . each ( function ( ) {
var instance = $ . data ( this , fullName ) ;
if ( instance ) {
instance . option ( options || { } ) . _init ( ) ;
} else {
$ . data ( this , fullName , new object ( options , this ) ) ;
}
} ) ;
}
return returnValue ;
} ;
} ;
$ . Widget = function ( /* options, element */ ) { } ;
$ . Widget . _childConstructors = [ ] ;
$ . Widget . prototype = {
widgetName : "widget" ,
widgetEventPrefix : "" ,
defaultElement : "<div>" ,
options : {
disabled : false ,
// callbacks
create : null
} ,
_createWidget : function ( options , element ) {
element = $ ( element || this . defaultElement || this ) [ 0 ] ;
this . element = $ ( element ) ;
this . uuid = uuid ++ ;
this . eventNamespace = "." + this . widgetName + this . uuid ;
this . options = $ . widget . extend ( { } ,
this . options ,
this . _getCreateOptions ( ) ,
options ) ;
this . bindings = $ ( ) ;
this . hoverable = $ ( ) ;
this . focusable = $ ( ) ;
if ( element !== this ) {
$ . data ( element , this . widgetFullName , this ) ;
this . _on ( true , this . element , {
remove : function ( event ) {
if ( event . target === element ) {
this . destroy ( ) ;
}
}
} ) ;
this . document = $ ( element . style ?
// element within the document
element . ownerDocument :
// element is window or document
element . document || element ) ;
this . window = $ ( this . document [ 0 ] . defaultView || this . document [ 0 ] . parentWindow ) ;
}
this . _create ( ) ;
this . _trigger ( "create" , null , this . _getCreateEventData ( ) ) ;
this . _init ( ) ;
} ,
_getCreateOptions : $ . noop ,
_getCreateEventData : $ . noop ,
_create : $ . noop ,
_init : $ . noop ,
destroy : function ( ) {
this . _destroy ( ) ;
// we can probably remove the unbind calls in 2.0
// all event bindings should go through this._on()
this . element
. unbind ( this . eventNamespace )
// 1.9 BC for #7810
// TODO remove dual storage
. removeData ( this . widgetName )
. removeData ( this . widgetFullName )
// support: jquery <1.6.3
// http://bugs.jquery.com/ticket/9413
. removeData ( $ . camelCase ( this . widgetFullName ) ) ;
this . widget ( )
. unbind ( this . eventNamespace )
. removeAttr ( "aria-disabled" )
. removeClass (
this . widgetFullName + "-disabled " +
"ui-state-disabled" ) ;
// clean up events and states
this . bindings . unbind ( this . eventNamespace ) ;
this . hoverable . removeClass ( "ui-state-hover" ) ;
this . focusable . removeClass ( "ui-state-focus" ) ;
} ,
_destroy : $ . noop ,
widget : function ( ) {
return this . element ;
} ,
option : function ( key , value ) {
var options = key ,
parts ,
curOption ,
i ;
if ( arguments . length === 0 ) {
// don't return a reference to the internal hash
return $ . widget . extend ( { } , this . options ) ;
}
if ( typeof key === "string" ) {
// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
options = { } ;
parts = key . split ( "." ) ;
key = parts . shift ( ) ;
if ( parts . length ) {
curOption = options [ key ] = $ . widget . extend ( { } , this . options [ key ] ) ;
for ( i = 0 ; i < parts . length - 1 ; i ++ ) {
curOption [ parts [ i ] ] = curOption [ parts [ i ] ] || { } ;
curOption = curOption [ parts [ i ] ] ;
}
key = parts . pop ( ) ;
2014-04-11 17:59:09 -04:00
if ( arguments . length === 1 ) {
2014-01-03 13:32:13 -05:00
return curOption [ key ] === undefined ? null : curOption [ key ] ;
}
curOption [ key ] = value ;
} else {
2014-04-11 17:59:09 -04:00
if ( arguments . length === 1 ) {
2014-01-03 13:32:13 -05:00
return this . options [ key ] === undefined ? null : this . options [ key ] ;
}
options [ key ] = value ;
}
}
this . _setOptions ( options ) ;
return this ;
} ,
_setOptions : function ( options ) {
var key ;
for ( key in options ) {
this . _setOption ( key , options [ key ] ) ;
}
return this ;
} ,
_setOption : function ( key , value ) {
this . options [ key ] = value ;
if ( key === "disabled" ) {
this . widget ( )
. toggleClass ( this . widgetFullName + "-disabled ui-state-disabled" , ! ! value )
. attr ( "aria-disabled" , value ) ;
this . hoverable . removeClass ( "ui-state-hover" ) ;
this . focusable . removeClass ( "ui-state-focus" ) ;
}
return this ;
} ,
enable : function ( ) {
return this . _setOption ( "disabled" , false ) ;
} ,
disable : function ( ) {
return this . _setOption ( "disabled" , true ) ;
} ,
_on : function ( suppressDisabledCheck , element , handlers ) {
var delegateElement ,
instance = this ;
// no suppressDisabledCheck flag, shuffle arguments
if ( typeof suppressDisabledCheck !== "boolean" ) {
handlers = element ;
element = suppressDisabledCheck ;
suppressDisabledCheck = false ;
}
// no element argument, shuffle and use this.element
if ( ! handlers ) {
handlers = element ;
element = this . element ;
delegateElement = this . widget ( ) ;
} else {
// accept selectors, DOM elements
element = delegateElement = $ ( element ) ;
this . bindings = this . bindings . add ( element ) ;
}
$ . each ( handlers , function ( event , handler ) {
function handlerProxy ( ) {
// allow widgets to customize the disabled handling
// - disabled as an array instead of boolean
// - disabled class as method for disabling individual parts
if ( ! suppressDisabledCheck &&
( instance . options . disabled === true ||
$ ( this ) . hasClass ( "ui-state-disabled" ) ) ) {
return ;
}
return ( typeof handler === "string" ? instance [ handler ] : handler )
. apply ( instance , arguments ) ;
}
// copy the guid so direct unbinding works
if ( typeof handler !== "string" ) {
handlerProxy . guid = handler . guid =
handler . guid || handlerProxy . guid || $ . guid ++ ;
}
var match = event . match ( /^(\w+)\s*(.*)$/ ) ,
eventName = match [ 1 ] + instance . eventNamespace ,
selector = match [ 2 ] ;
if ( selector ) {
delegateElement . delegate ( selector , eventName , handlerProxy ) ;
} else {
element . bind ( eventName , handlerProxy ) ;
}
} ) ;
} ,
_off : function ( element , eventName ) {
eventName = ( eventName || "" ) . split ( " " ) . join ( this . eventNamespace + " " ) + this . eventNamespace ;
element . unbind ( eventName ) . undelegate ( eventName ) ;
} ,
_delay : function ( handler , delay ) {
function handlerProxy ( ) {
return ( typeof handler === "string" ? instance [ handler ] : handler )
. apply ( instance , arguments ) ;
}
var instance = this ;
return setTimeout ( handlerProxy , delay || 0 ) ;
} ,
_hoverable : function ( element ) {
this . hoverable = this . hoverable . add ( element ) ;
this . _on ( element , {
mouseenter : function ( event ) {
$ ( event . currentTarget ) . addClass ( "ui-state-hover" ) ;
} ,
mouseleave : function ( event ) {
$ ( event . currentTarget ) . removeClass ( "ui-state-hover" ) ;
}
} ) ;
} ,
_focusable : function ( element ) {
this . focusable = this . focusable . add ( element ) ;
this . _on ( element , {
focusin : function ( event ) {
$ ( event . currentTarget ) . addClass ( "ui-state-focus" ) ;
} ,
focusout : function ( event ) {
$ ( event . currentTarget ) . removeClass ( "ui-state-focus" ) ;
}
} ) ;
} ,
_trigger : function ( type , event , data ) {
var prop , orig ,
callback = this . options [ type ] ;
data = data || { } ;
event = $ . Event ( event ) ;
event . type = ( type === this . widgetEventPrefix ?
type :
this . widgetEventPrefix + type ) . toLowerCase ( ) ;
// the original event may come from any element
// so we need to reset the target on the new event
event . target = this . element [ 0 ] ;
// copy original event properties over to the new event
orig = event . originalEvent ;
if ( orig ) {
for ( prop in orig ) {
if ( ! ( prop in event ) ) {
event [ prop ] = orig [ prop ] ;
}
}
}
this . element . trigger ( event , data ) ;
return ! ( $ . isFunction ( callback ) &&
callback . apply ( this . element [ 0 ] , [ event ] . concat ( data ) ) === false ||
event . isDefaultPrevented ( ) ) ;
}
} ;
$ . each ( { show : "fadeIn" , hide : "fadeOut" } , function ( method , defaultEffect ) {
$ . Widget . prototype [ "_" + method ] = function ( element , options , callback ) {
if ( typeof options === "string" ) {
options = { effect : options } ;
}
var hasOptions ,
effectName = ! options ?
method :
options === true || typeof options === "number" ?
defaultEffect :
options . effect || defaultEffect ;
options = options || { } ;
if ( typeof options === "number" ) {
options = { duration : options } ;
}
hasOptions = ! $ . isEmptyObject ( options ) ;
options . complete = callback ;
if ( options . delay ) {
element . delay ( options . delay ) ;
}
if ( hasOptions && $ . effects && $ . effects . effect [ effectName ] ) {
element [ method ] ( options ) ;
} else if ( effectName !== method && element [ effectName ] ) {
element [ effectName ] ( options . duration , options . easing , callback ) ;
} else {
element . queue ( function ( next ) {
$ ( this ) [ method ] ( ) ;
if ( callback ) {
callback . call ( element [ 0 ] ) ;
}
next ( ) ;
} ) ;
}
} ;
} ) ;
} ) ( jQuery ) ;
( function ( $ , undefined ) {
var mouseHandled = false ;
$ ( document ) . mouseup ( function ( ) {
mouseHandled = false ;
} ) ;
$ . widget ( "ui.mouse" , {
2014-04-11 17:59:09 -04:00
version : "1.10.4" ,
2014-01-03 13:32:13 -05:00
options : {
cancel : "input,textarea,button,select,option" ,
distance : 1 ,
delay : 0
} ,
_mouseInit : function ( ) {
var that = this ;
this . element
. bind ( "mousedown." + this . widgetName , function ( event ) {
return that . _mouseDown ( event ) ;
} )
. bind ( "click." + this . widgetName , function ( event ) {
if ( true === $ . data ( event . target , that . widgetName + ".preventClickEvent" ) ) {
$ . removeData ( event . target , that . 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 ) ;
if ( this . _mouseMoveDelegate ) {
$ ( document )
. unbind ( "mousemove." + this . widgetName , this . _mouseMoveDelegate )
. unbind ( "mouseup." + this . widgetName , this . _mouseUpDelegate ) ;
}
} ,
_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 that = 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 ( ) {
that . 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 that . _mouseMove ( event ) ;
} ;
this . _mouseUpDelegate = function ( event ) {
return that . _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 ( $ . ui . ie && ( ! document . documentMode || 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 ) ;
( function ( $ , undefined ) {
$ . ui = $ . ui || { } ;
var cachedScrollbarWidth ,
max = Math . max ,
abs = Math . abs ,
round = Math . round ,
rhorizontal = /left|center|right/ ,
rvertical = /top|center|bottom/ ,
roffset = /[\+\-]\d+(\.[\d]+)?%?/ ,
rposition = /^\w+/ ,
rpercent = /%$/ ,
_position = $ . fn . position ;
function getOffsets ( offsets , width , height ) {
return [
parseFloat ( offsets [ 0 ] ) * ( rpercent . test ( offsets [ 0 ] ) ? width / 100 : 1 ) ,
parseFloat ( offsets [ 1 ] ) * ( rpercent . test ( offsets [ 1 ] ) ? height / 100 : 1 )
] ;
}
function parseCss ( element , property ) {
return parseInt ( $ . css ( element , property ) , 10 ) || 0 ;
}
function getDimensions ( elem ) {
var raw = elem [ 0 ] ;
if ( raw . nodeType === 9 ) {
return {
width : elem . width ( ) ,
height : elem . height ( ) ,
offset : { top : 0 , left : 0 }
} ;
}
if ( $ . isWindow ( raw ) ) {
return {
width : elem . width ( ) ,
height : elem . height ( ) ,
offset : { top : elem . scrollTop ( ) , left : elem . scrollLeft ( ) }
} ;
}
if ( raw . preventDefault ) {
return {
width : 0 ,
height : 0 ,
offset : { top : raw . pageY , left : raw . pageX }
} ;
}
return {
width : elem . outerWidth ( ) ,
height : elem . outerHeight ( ) ,
offset : elem . offset ( )
} ;
}
$ . position = {
scrollbarWidth : function ( ) {
if ( cachedScrollbarWidth !== undefined ) {
return cachedScrollbarWidth ;
}
var w1 , w2 ,
2014-04-11 17:59:09 -04:00
div = $ ( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ) ,
2014-01-03 13:32:13 -05:00
innerDiv = div . children ( ) [ 0 ] ;
$ ( "body" ) . append ( div ) ;
w1 = innerDiv . offsetWidth ;
div . css ( "overflow" , "scroll" ) ;
w2 = innerDiv . offsetWidth ;
if ( w1 === w2 ) {
w2 = div [ 0 ] . clientWidth ;
}
div . remove ( ) ;
return ( cachedScrollbarWidth = w1 - w2 ) ;
} ,
getScrollInfo : function ( within ) {
2014-04-11 17:59:09 -04:00
var overflowX = within . isWindow || within . isDocument ? "" :
within . element . css ( "overflow-x" ) ,
overflowY = within . isWindow || within . isDocument ? "" :
within . element . css ( "overflow-y" ) ,
2014-01-03 13:32:13 -05:00
hasOverflowX = overflowX === "scroll" ||
( overflowX === "auto" && within . width < within . element [ 0 ] . scrollWidth ) ,
hasOverflowY = overflowY === "scroll" ||
( overflowY === "auto" && within . height < within . element [ 0 ] . scrollHeight ) ;
return {
width : hasOverflowY ? $ . position . scrollbarWidth ( ) : 0 ,
height : hasOverflowX ? $ . position . scrollbarWidth ( ) : 0
} ;
} ,
getWithinInfo : function ( element ) {
var withinElement = $ ( element || window ) ,
2014-04-11 17:59:09 -04:00
isWindow = $ . isWindow ( withinElement [ 0 ] ) ,
isDocument = ! ! withinElement [ 0 ] && withinElement [ 0 ] . nodeType === 9 ;
2014-01-03 13:32:13 -05:00
return {
element : withinElement ,
isWindow : isWindow ,
2014-04-11 17:59:09 -04:00
isDocument : isDocument ,
2014-01-03 13:32:13 -05:00
offset : withinElement . offset ( ) || { left : 0 , top : 0 } ,
scrollLeft : withinElement . scrollLeft ( ) ,
scrollTop : withinElement . scrollTop ( ) ,
width : isWindow ? withinElement . width ( ) : withinElement . outerWidth ( ) ,
height : isWindow ? withinElement . height ( ) : withinElement . outerHeight ( )
} ;
}
} ;
$ . fn . position = function ( options ) {
if ( ! options || ! options . of ) {
return _position . apply ( this , arguments ) ;
}
// make a copy, we don't want to modify arguments
options = $ . extend ( { } , options ) ;
var atOffset , targetWidth , targetHeight , targetOffset , basePosition , dimensions ,
target = $ ( options . of ) ,
within = $ . position . getWithinInfo ( options . within ) ,
scrollInfo = $ . position . getScrollInfo ( within ) ,
collision = ( options . collision || "flip" ) . split ( " " ) ,
offsets = { } ;
dimensions = getDimensions ( target ) ;
if ( target [ 0 ] . preventDefault ) {
// force left top to allow flipping
options . at = "left top" ;
}
targetWidth = dimensions . width ;
targetHeight = dimensions . height ;
targetOffset = dimensions . offset ;
// clone to reuse original targetOffset later
basePosition = $ . extend ( { } , targetOffset ) ;
// force my and at to have valid horizontal and vertical positions
// if a value is missing or invalid, it will be converted to center
$ . each ( [ "my" , "at" ] , function ( ) {
var pos = ( options [ this ] || "" ) . split ( " " ) ,
horizontalOffset ,
verticalOffset ;
if ( pos . length === 1 ) {
pos = rhorizontal . test ( pos [ 0 ] ) ?
pos . concat ( [ "center" ] ) :
rvertical . test ( pos [ 0 ] ) ?
[ "center" ] . concat ( pos ) :
[ "center" , "center" ] ;
}
pos [ 0 ] = rhorizontal . test ( pos [ 0 ] ) ? pos [ 0 ] : "center" ;
pos [ 1 ] = rvertical . test ( pos [ 1 ] ) ? pos [ 1 ] : "center" ;
// calculate offsets
horizontalOffset = roffset . exec ( pos [ 0 ] ) ;
verticalOffset = roffset . exec ( pos [ 1 ] ) ;
offsets [ this ] = [
horizontalOffset ? horizontalOffset [ 0 ] : 0 ,
verticalOffset ? verticalOffset [ 0 ] : 0
] ;
// reduce to just the positions without the offsets
options [ this ] = [
rposition . exec ( pos [ 0 ] ) [ 0 ] ,
rposition . exec ( pos [ 1 ] ) [ 0 ]
] ;
} ) ;
// normalize collision option
if ( collision . length === 1 ) {
collision [ 1 ] = collision [ 0 ] ;
}
if ( options . at [ 0 ] === "right" ) {
basePosition . left += targetWidth ;
} else if ( options . at [ 0 ] === "center" ) {
basePosition . left += targetWidth / 2 ;
}
if ( options . at [ 1 ] === "bottom" ) {
basePosition . top += targetHeight ;
} else if ( options . at [ 1 ] === "center" ) {
basePosition . top += targetHeight / 2 ;
}
atOffset = getOffsets ( offsets . at , targetWidth , targetHeight ) ;
basePosition . left += atOffset [ 0 ] ;
basePosition . top += atOffset [ 1 ] ;
return this . each ( function ( ) {
var collisionPosition , using ,
elem = $ ( this ) ,
elemWidth = elem . outerWidth ( ) ,
elemHeight = elem . outerHeight ( ) ,
marginLeft = parseCss ( this , "marginLeft" ) ,
marginTop = parseCss ( this , "marginTop" ) ,
collisionWidth = elemWidth + marginLeft + parseCss ( this , "marginRight" ) + scrollInfo . width ,
collisionHeight = elemHeight + marginTop + parseCss ( this , "marginBottom" ) + scrollInfo . height ,
position = $ . extend ( { } , basePosition ) ,
myOffset = getOffsets ( offsets . my , elem . outerWidth ( ) , elem . outerHeight ( ) ) ;
if ( options . my [ 0 ] === "right" ) {
position . left -= elemWidth ;
} else if ( options . my [ 0 ] === "center" ) {
position . left -= elemWidth / 2 ;
}
if ( options . my [ 1 ] === "bottom" ) {
position . top -= elemHeight ;
} else if ( options . my [ 1 ] === "center" ) {
position . top -= elemHeight / 2 ;
}
position . left += myOffset [ 0 ] ;
position . top += myOffset [ 1 ] ;
// if the browser doesn't support fractions, then round for consistent results
if ( ! $ . support . offsetFractions ) {
position . left = round ( position . left ) ;
position . top = round ( position . top ) ;
}
collisionPosition = {
marginLeft : marginLeft ,
marginTop : marginTop
} ;
$ . each ( [ "left" , "top" ] , function ( i , dir ) {
if ( $ . ui . position [ collision [ i ] ] ) {
$ . ui . position [ collision [ i ] ] [ dir ] ( position , {
targetWidth : targetWidth ,
targetHeight : targetHeight ,
elemWidth : elemWidth ,
elemHeight : elemHeight ,
collisionPosition : collisionPosition ,
collisionWidth : collisionWidth ,
collisionHeight : collisionHeight ,
offset : [ atOffset [ 0 ] + myOffset [ 0 ] , atOffset [ 1 ] + myOffset [ 1 ] ] ,
my : options . my ,
at : options . at ,
within : within ,
elem : elem
} ) ;
}
} ) ;
if ( options . using ) {
// adds feedback as second argument to using callback, if present
using = function ( props ) {
var left = targetOffset . left - position . left ,
right = left + targetWidth - elemWidth ,
top = targetOffset . top - position . top ,
bottom = top + targetHeight - elemHeight ,
feedback = {
target : {
element : target ,
left : targetOffset . left ,
top : targetOffset . top ,
width : targetWidth ,
height : targetHeight
} ,
element : {
element : elem ,
left : position . left ,
top : position . top ,
width : elemWidth ,
height : elemHeight
} ,
horizontal : right < 0 ? "left" : left > 0 ? "right" : "center" ,
vertical : bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
} ;
if ( targetWidth < elemWidth && abs ( left + right ) < targetWidth ) {
feedback . horizontal = "center" ;
}
if ( targetHeight < elemHeight && abs ( top + bottom ) < targetHeight ) {
feedback . vertical = "middle" ;
}
if ( max ( abs ( left ) , abs ( right ) ) > max ( abs ( top ) , abs ( bottom ) ) ) {
feedback . important = "horizontal" ;
} else {
feedback . important = "vertical" ;
}
options . using . call ( this , props , feedback ) ;
} ;
}
elem . offset ( $ . extend ( position , { using : using } ) ) ;
} ) ;
} ;
$ . ui . position = {
fit : {
left : function ( position , data ) {
var within = data . within ,
withinOffset = within . isWindow ? within . scrollLeft : within . offset . left ,
outerWidth = within . width ,
collisionPosLeft = position . left - data . collisionPosition . marginLeft ,
overLeft = withinOffset - collisionPosLeft ,
overRight = collisionPosLeft + data . collisionWidth - outerWidth - withinOffset ,
newOverRight ;
// element is wider than within
if ( data . collisionWidth > outerWidth ) {
// element is initially over the left side of within
if ( overLeft > 0 && overRight <= 0 ) {
newOverRight = position . left + overLeft + data . collisionWidth - outerWidth - withinOffset ;
position . left += overLeft - newOverRight ;
// element is initially over right side of within
} else if ( overRight > 0 && overLeft <= 0 ) {
position . left = withinOffset ;
// element is initially over both left and right sides of within
} else {
if ( overLeft > overRight ) {
position . left = withinOffset + outerWidth - data . collisionWidth ;
} else {
position . left = withinOffset ;
}
}
// too far left -> align with left edge
} else if ( overLeft > 0 ) {
position . left += overLeft ;
// too far right -> align with right edge
} else if ( overRight > 0 ) {
position . left -= overRight ;
// adjust based on position and margin
} else {
position . left = max ( position . left - collisionPosLeft , position . left ) ;
}
} ,
top : function ( position , data ) {
var within = data . within ,
withinOffset = within . isWindow ? within . scrollTop : within . offset . top ,
outerHeight = data . within . height ,
collisionPosTop = position . top - data . collisionPosition . marginTop ,
overTop = withinOffset - collisionPosTop ,
overBottom = collisionPosTop + data . collisionHeight - outerHeight - withinOffset ,
newOverBottom ;
// element is taller than within
if ( data . collisionHeight > outerHeight ) {
// element is initially over the top of within
if ( overTop > 0 && overBottom <= 0 ) {
newOverBottom = position . top + overTop + data . collisionHeight - outerHeight - withinOffset ;
position . top += overTop - newOverBottom ;
// element is initially over bottom of within
} else if ( overBottom > 0 && overTop <= 0 ) {
position . top = withinOffset ;
// element is initially over both top and bottom of within
} else {
if ( overTop > overBottom ) {
position . top = withinOffset + outerHeight - data . collisionHeight ;
} else {
position . top = withinOffset ;
}
}
// too far up -> align with top
} else if ( overTop > 0 ) {
position . top += overTop ;
// too far down -> align with bottom edge
} else if ( overBottom > 0 ) {
position . top -= overBottom ;
// adjust based on position and margin
} else {
position . top = max ( position . top - collisionPosTop , position . top ) ;
}
}
} ,
flip : {
left : function ( position , data ) {
var within = data . within ,
withinOffset = within . offset . left + within . scrollLeft ,
outerWidth = within . width ,
offsetLeft = within . isWindow ? within . scrollLeft : within . offset . left ,
collisionPosLeft = position . left - data . collisionPosition . marginLeft ,
overLeft = collisionPosLeft - offsetLeft ,
overRight = collisionPosLeft + data . collisionWidth - outerWidth - offsetLeft ,
myOffset = data . my [ 0 ] === "left" ?
- data . elemWidth :
data . my [ 0 ] === "right" ?
data . elemWidth :
0 ,
atOffset = data . at [ 0 ] === "left" ?
data . targetWidth :
data . at [ 0 ] === "right" ?
- data . targetWidth :
0 ,
offset = - 2 * data . offset [ 0 ] ,
newOverRight ,
newOverLeft ;
if ( overLeft < 0 ) {
newOverRight = position . left + myOffset + atOffset + offset + data . collisionWidth - outerWidth - withinOffset ;
if ( newOverRight < 0 || newOverRight < abs ( overLeft ) ) {
position . left += myOffset + atOffset + offset ;
}
}
else if ( overRight > 0 ) {
newOverLeft = position . left - data . collisionPosition . marginLeft + myOffset + atOffset + offset - offsetLeft ;
if ( newOverLeft > 0 || abs ( newOverLeft ) < overRight ) {
position . left += myOffset + atOffset + offset ;
}
}
} ,
top : function ( position , data ) {
var within = data . within ,
withinOffset = within . offset . top + within . scrollTop ,
outerHeight = within . height ,
offsetTop = within . isWindow ? within . scrollTop : within . offset . top ,
collisionPosTop = position . top - data . collisionPosition . marginTop ,
overTop = collisionPosTop - offsetTop ,
overBottom = collisionPosTop + data . collisionHeight - outerHeight - offsetTop ,
top = data . my [ 1 ] === "top" ,
myOffset = top ?
- data . elemHeight :
data . my [ 1 ] === "bottom" ?
data . elemHeight :
0 ,
atOffset = data . at [ 1 ] === "top" ?
data . targetHeight :
data . at [ 1 ] === "bottom" ?
- data . targetHeight :
0 ,
offset = - 2 * data . offset [ 1 ] ,
newOverTop ,
newOverBottom ;
if ( overTop < 0 ) {
newOverBottom = position . top + myOffset + atOffset + offset + data . collisionHeight - outerHeight - withinOffset ;
if ( ( position . top + myOffset + atOffset + offset ) > overTop && ( newOverBottom < 0 || newOverBottom < abs ( overTop ) ) ) {
position . top += myOffset + atOffset + offset ;
}
}
else if ( overBottom > 0 ) {
2014-04-11 17:59:09 -04:00
newOverTop = position . top - data . collisionPosition . marginTop + myOffset + atOffset + offset - offsetTop ;
2014-01-03 13:32:13 -05:00
if ( ( position . top + myOffset + atOffset + offset ) > overBottom && ( newOverTop > 0 || abs ( newOverTop ) < overBottom ) ) {
position . top += myOffset + atOffset + offset ;
}
}
}
} ,
flipfit : {
left : function ( ) {
$ . ui . position . flip . left . apply ( this , arguments ) ;
$ . ui . position . fit . left . apply ( this , arguments ) ;
} ,
top : function ( ) {
$ . ui . position . flip . top . apply ( this , arguments ) ;
$ . ui . position . fit . top . apply ( this , arguments ) ;
}
}
} ;
// fraction support test
( function ( ) {
var testElement , testElementParent , testElementStyle , offsetLeft , i ,
body = document . getElementsByTagName ( "body" ) [ 0 ] ,
div = document . createElement ( "div" ) ;
//Create a "fake body" for testing based on method used in jQuery.support
testElement = document . createElement ( body ? "div" : "body" ) ;
testElementStyle = {
visibility : "hidden" ,
width : 0 ,
height : 0 ,
border : 0 ,
margin : 0 ,
background : "none"
} ;
if ( body ) {
$ . extend ( testElementStyle , {
position : "absolute" ,
left : "-1000px" ,
top : "-1000px"
} ) ;
}
for ( i in testElementStyle ) {
testElement . style [ i ] = testElementStyle [ i ] ;
}
testElement . appendChild ( div ) ;
testElementParent = body || document . documentElement ;
testElementParent . insertBefore ( testElement , testElementParent . firstChild ) ;
div . style . cssText = "position: absolute; left: 10.7432222px;" ;
offsetLeft = $ ( div ) . offset ( ) . left ;
$ . support . offsetFractions = offsetLeft > 10 && offsetLeft < 11 ;
testElement . innerHTML = "" ;
testElementParent . removeChild ( testElement ) ;
} ) ( ) ;
} ( jQuery ) ) ;
( function ( $ , undefined ) {
function num ( v ) {
return parseInt ( v , 10 ) || 0 ;
}
function isNumber ( value ) {
return ! isNaN ( parseInt ( value , 10 ) ) ;
}
$ . widget ( "ui.resizable" , $ . ui . mouse , {
2014-04-11 17:59:09 -04:00
version : "1.10.4" ,
2014-01-03 13:32:13 -05:00
widgetEventPrefix : "resize" ,
options : {
alsoResize : false ,
animate : false ,
animateDuration : "slow" ,
animateEasing : "swing" ,
aspectRatio : false ,
autoHide : false ,
containment : false ,
ghost : false ,
grid : false ,
handles : "e,s,se" ,
helper : false ,
maxHeight : null ,
maxWidth : null ,
minHeight : 10 ,
minWidth : 10 ,
// See #7960
zIndex : 90 ,
// callbacks
resize : null ,
start : null ,
stop : null
} ,
_create : function ( ) {
var n , i , handle , axis , hname ,
that = this ,
o = this . options ;
this . element . addClass ( "ui-resizable" ) ;
$ . extend ( this , {
_aspectRatio : ! ! ( o . aspectRatio ) ,
aspectRatio : o . aspectRatio ,
originalElement : this . element ,
_proportionallyResizeElements : [ ] ,
_helper : o . helper || o . ghost || o . animate ? o . helper || "ui-resizable-helper" : null
} ) ;
//Wrap the element if it cannot hold child nodes
if ( this . element [ 0 ] . nodeName . match ( /canvas|textarea|input|select|button|img/i ) ) {
//Create a wrapper element and set the wrapper to the new current internal element
this . element . wrap (
$ ( "<div class='ui-wrapper' style='overflow: hidden;'></div>" ) . css ( {
position : this . element . css ( "position" ) ,
width : this . element . outerWidth ( ) ,
height : this . element . outerHeight ( ) ,
top : this . element . css ( "top" ) ,
left : this . element . css ( "left" )
} )
) ;
//Overwrite the original this.element
this . element = this . element . parent ( ) . data (
"ui-resizable" , this . element . data ( "ui-resizable" )
) ;
this . elementIsWrapper = true ;
//Move margins to the wrapper
this . element . css ( { marginLeft : this . originalElement . css ( "marginLeft" ) , marginTop : this . originalElement . css ( "marginTop" ) , marginRight : this . originalElement . css ( "marginRight" ) , marginBottom : this . originalElement . css ( "marginBottom" ) } ) ;
this . originalElement . css ( { marginLeft : 0 , marginTop : 0 , marginRight : 0 , marginBottom : 0 } ) ;
//Prevent Safari textarea resize
this . originalResizeStyle = this . originalElement . css ( "resize" ) ;
this . originalElement . css ( "resize" , "none" ) ;
//Push the actual element to our proportionallyResize internal array
this . _proportionallyResizeElements . push ( this . originalElement . css ( { position : "static" , zoom : 1 , display : "block" } ) ) ;
// avoid IE jump (hard set the margin)
this . originalElement . css ( { margin : this . originalElement . css ( "margin" ) } ) ;
// fix handlers offset
this . _proportionallyResize ( ) ;
}
this . handles = o . handles || ( ! $ ( ".ui-resizable-handle" , this . element ) . length ? "e,s,se" : { n : ".ui-resizable-n" , e : ".ui-resizable-e" , s : ".ui-resizable-s" , w : ".ui-resizable-w" , se : ".ui-resizable-se" , sw : ".ui-resizable-sw" , ne : ".ui-resizable-ne" , nw : ".ui-resizable-nw" } ) ;
if ( this . handles . constructor === String ) {
if ( this . handles === "all" ) {
this . handles = "n,e,s,w,se,sw,ne,nw" ;
}
n = this . handles . split ( "," ) ;
this . handles = { } ;
for ( i = 0 ; i < n . length ; i ++ ) {
handle = $ . trim ( n [ i ] ) ;
hname = "ui-resizable-" + handle ;
axis = $ ( "<div class='ui-resizable-handle " + hname + "'></div>" ) ;
// Apply zIndex to all handles - see #7960
axis . css ( { zIndex : o . zIndex } ) ;
//TODO : What's going on here?
if ( "se" === handle ) {
axis . addClass ( "ui-icon ui-icon-gripsmall-diagonal-se" ) ;
}
//Insert into internal handles object and append to element
this . handles [ handle ] = ".ui-resizable-" + handle ;
this . element . append ( axis ) ;
}
}
this . _renderAxis = function ( target ) {
var i , axis , padPos , padWrapper ;
target = target || this . element ;
for ( i in this . handles ) {
if ( this . handles [ i ] . constructor === String ) {
this . handles [ i ] = $ ( this . handles [ i ] , this . element ) . show ( ) ;
}
//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
if ( this . elementIsWrapper && this . originalElement [ 0 ] . nodeName . match ( /textarea|input|select|button/i ) ) {
axis = $ ( this . handles [ i ] , this . element ) ;
//Checking the correct pad and border
padWrapper = /sw|ne|nw|se|n|s/ . test ( i ) ? axis . outerHeight ( ) : axis . outerWidth ( ) ;
//The padding type i have to apply...
padPos = [ "padding" ,
/ne|nw|n/ . test ( i ) ? "Top" :
/se|sw|s/ . test ( i ) ? "Bottom" :
/^e$/ . test ( i ) ? "Right" : "Left" ] . join ( "" ) ;
target . css ( padPos , padWrapper ) ;
this . _proportionallyResize ( ) ;
}
//TODO: What's that good for? There's not anything to be executed left
if ( ! $ ( this . handles [ i ] ) . length ) {
continue ;
}
}
} ;
//TODO: make renderAxis a prototype function
this . _renderAxis ( this . element ) ;
this . _handles = $ ( ".ui-resizable-handle" , this . element )
. disableSelection ( ) ;
//Matching axis name
this . _handles . mouseover ( function ( ) {
if ( ! that . resizing ) {
if ( this . className ) {
axis = this . className . match ( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i ) ;
}
//Axis, default = se
that . axis = axis && axis [ 1 ] ? axis [ 1 ] : "se" ;
}
} ) ;
//If we want to auto hide the elements
if ( o . autoHide ) {
this . _handles . hide ( ) ;
$ ( this . element )
. addClass ( "ui-resizable-autohide" )
. mouseenter ( function ( ) {
if ( o . disabled ) {
return ;
}
$ ( this ) . removeClass ( "ui-resizable-autohide" ) ;
that . _handles . show ( ) ;
} )
. mouseleave ( function ( ) {
if ( o . disabled ) {
return ;
}
if ( ! that . resizing ) {
$ ( this ) . addClass ( "ui-resizable-autohide" ) ;
that . _handles . hide ( ) ;
}
} ) ;
}
//Initialize the mouse interaction
this . _mouseInit ( ) ;
} ,
_destroy : function ( ) {
this . _mouseDestroy ( ) ;
var wrapper ,
_destroy = function ( exp ) {
$ ( exp ) . removeClass ( "ui-resizable ui-resizable-disabled ui-resizable-resizing" )
. removeData ( "resizable" ) . removeData ( "ui-resizable" ) . unbind ( ".resizable" ) . find ( ".ui-resizable-handle" ) . remove ( ) ;
} ;
//TODO: Unwrap at same DOM position
if ( this . elementIsWrapper ) {
_destroy ( this . element ) ;
wrapper = this . element ;
this . originalElement . css ( {
position : wrapper . css ( "position" ) ,
width : wrapper . outerWidth ( ) ,
height : wrapper . outerHeight ( ) ,
top : wrapper . css ( "top" ) ,
left : wrapper . css ( "left" )
} ) . insertAfter ( wrapper ) ;
wrapper . remove ( ) ;
}
this . originalElement . css ( "resize" , this . originalResizeStyle ) ;
_destroy ( this . originalElement ) ;
return this ;
} ,
_mouseCapture : function ( event ) {
var i , handle ,
capture = false ;
for ( i in this . handles ) {
handle = $ ( this . handles [ i ] ) [ 0 ] ;
if ( handle === event . target || $ . contains ( handle , event . target ) ) {
capture = true ;
}
}
return ! this . options . disabled && capture ;
} ,
_mouseStart : function ( event ) {
var curleft , curtop , cursor ,
o = this . options ,
iniPos = this . element . position ( ) ,
el = this . element ;
this . resizing = true ;
// bugfix for http://dev.jquery.com/ticket/1749
if ( ( /absolute/ ) . test ( el . css ( "position" ) ) ) {
el . css ( { position : "absolute" , top : el . css ( "top" ) , left : el . css ( "left" ) } ) ;
} else if ( el . is ( ".ui-draggable" ) ) {
el . css ( { position : "absolute" , top : iniPos . top , left : iniPos . left } ) ;
}
this . _renderProxy ( ) ;
curleft = num ( this . helper . css ( "left" ) ) ;
curtop = num ( this . helper . css ( "top" ) ) ;
if ( o . containment ) {
curleft += $ ( o . containment ) . scrollLeft ( ) || 0 ;
curtop += $ ( o . containment ) . scrollTop ( ) || 0 ;
}
//Store needed variables
this . offset = this . helper . offset ( ) ;
this . position = { left : curleft , top : curtop } ;
2014-04-11 17:59:09 -04:00
this . size = this . _helper ? { width : this . helper . width ( ) , height : this . helper . height ( ) } : { width : el . width ( ) , height : el . height ( ) } ;
2014-01-03 13:32:13 -05:00
this . originalSize = this . _helper ? { width : el . outerWidth ( ) , height : el . outerHeight ( ) } : { width : el . width ( ) , height : el . height ( ) } ;
this . originalPosition = { left : curleft , top : curtop } ;
this . sizeDiff = { width : el . outerWidth ( ) - el . width ( ) , height : el . outerHeight ( ) - el . height ( ) } ;
this . originalMousePosition = { left : event . pageX , top : event . pageY } ;
//Aspect Ratio
this . aspectRatio = ( typeof o . aspectRatio === "number" ) ? o . aspectRatio : ( ( this . originalSize . width / this . originalSize . height ) || 1 ) ;
cursor = $ ( ".ui-resizable-" + this . axis ) . css ( "cursor" ) ;
$ ( "body" ) . css ( "cursor" , cursor === "auto" ? this . axis + "-resize" : cursor ) ;
el . addClass ( "ui-resizable-resizing" ) ;
this . _propagate ( "start" , event ) ;
return true ;
} ,
_mouseDrag : function ( event ) {
//Increase performance, avoid regex
var data ,
el = this . helper , props = { } ,
smp = this . originalMousePosition ,
a = this . axis ,
prevTop = this . position . top ,
prevLeft = this . position . left ,
prevWidth = this . size . width ,
prevHeight = this . size . height ,
dx = ( event . pageX - smp . left ) || 0 ,
dy = ( event . pageY - smp . top ) || 0 ,
trigger = this . _change [ a ] ;
if ( ! trigger ) {
return false ;
}
// Calculate the attrs that will be change
data = trigger . apply ( this , [ event , dx , dy ] ) ;
// Put this in the mouseDrag handler since the user can start pressing shift while resizing
this . _updateVirtualBoundaries ( event . shiftKey ) ;
if ( this . _aspectRatio || event . shiftKey ) {
data = this . _updateRatio ( data , event ) ;
}
data = this . _respectSize ( data , event ) ;
this . _updateCache ( data ) ;
// plugins callbacks need to be called first
this . _propagate ( "resize" , event ) ;
if ( this . position . top !== prevTop ) {
props . top = this . position . top + "px" ;
}
if ( this . position . left !== prevLeft ) {
props . left = this . position . left + "px" ;
}
if ( this . size . width !== prevWidth ) {
props . width = this . size . width + "px" ;
}
if ( this . size . height !== prevHeight ) {
props . height = this . size . height + "px" ;
}
el . css ( props ) ;
if ( ! this . _helper && this . _proportionallyResizeElements . length ) {
this . _proportionallyResize ( ) ;
}
// Call the user callback if the element was resized
if ( ! $ . isEmptyObject ( props ) ) {
this . _trigger ( "resize" , event , this . ui ( ) ) ;
}
return false ;
} ,
_mouseStop : function ( event ) {
this . resizing = false ;
var pr , ista , soffseth , soffsetw , s , left , top ,
o = this . options , that = this ;
if ( this . _helper ) {
pr = this . _proportionallyResizeElements ;
ista = pr . length && ( /textarea/i ) . test ( pr [ 0 ] . nodeName ) ;
soffseth = ista && $ . ui . hasScroll ( pr [ 0 ] , "left" ) /* TODO - jump height */ ? 0 : that . sizeDiff . height ;
soffsetw = ista ? 0 : that . sizeDiff . width ;
s = { width : ( that . helper . width ( ) - soffsetw ) , height : ( that . helper . height ( ) - soffseth ) } ;
left = ( parseInt ( that . element . css ( "left" ) , 10 ) + ( that . position . left - that . originalPosition . left ) ) || null ;
top = ( parseInt ( that . element . css ( "top" ) , 10 ) + ( that . position . top - that . originalPosition . top ) ) || null ;
if ( ! o . animate ) {
this . element . css ( $ . extend ( s , { top : top , left : left } ) ) ;
}
that . helper . height ( that . size . height ) ;
that . helper . width ( that . size . width ) ;
if ( this . _helper && ! o . animate ) {
this . _proportionallyResize ( ) ;
}
}
$ ( "body" ) . css ( "cursor" , "auto" ) ;
this . element . removeClass ( "ui-resizable-resizing" ) ;
this . _propagate ( "stop" , event ) ;
if ( this . _helper ) {
this . helper . remove ( ) ;
}
return false ;
} ,
_updateVirtualBoundaries : function ( forceAspectRatio ) {
var pMinWidth , pMaxWidth , pMinHeight , pMaxHeight , b ,
o = this . options ;
b = {
minWidth : isNumber ( o . minWidth ) ? o . minWidth : 0 ,
maxWidth : isNumber ( o . maxWidth ) ? o . maxWidth : Infinity ,
minHeight : isNumber ( o . minHeight ) ? o . minHeight : 0 ,
maxHeight : isNumber ( o . maxHeight ) ? o . maxHeight : Infinity
} ;
if ( this . _aspectRatio || forceAspectRatio ) {
// We want to create an enclosing box whose aspect ration is the requested one
// First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
pMinWidth = b . minHeight * this . aspectRatio ;
pMinHeight = b . minWidth / this . aspectRatio ;
pMaxWidth = b . maxHeight * this . aspectRatio ;
pMaxHeight = b . maxWidth / this . aspectRatio ;
if ( pMinWidth > b . minWidth ) {
b . minWidth = pMinWidth ;
}
if ( pMinHeight > b . minHeight ) {
b . minHeight = pMinHeight ;
}
if ( pMaxWidth < b . maxWidth ) {
b . maxWidth = pMaxWidth ;
}
if ( pMaxHeight < b . maxHeight ) {
b . maxHeight = pMaxHeight ;
}
}
this . _vBoundaries = b ;
} ,
_updateCache : function ( data ) {
this . offset = this . helper . offset ( ) ;
if ( isNumber ( data . left ) ) {
this . position . left = data . left ;
}
if ( isNumber ( data . top ) ) {
this . position . top = data . top ;
}
if ( isNumber ( data . height ) ) {
this . size . height = data . height ;
}
if ( isNumber ( data . width ) ) {
this . size . width = data . width ;
}
} ,
_updateRatio : function ( data ) {
var cpos = this . position ,
csize = this . size ,
a = this . axis ;
if ( isNumber ( data . height ) ) {
data . width = ( data . height * this . aspectRatio ) ;
} else if ( isNumber ( data . width ) ) {
data . height = ( data . width / this . aspectRatio ) ;
}
if ( a === "sw" ) {
data . left = cpos . left + ( csize . width - data . width ) ;
data . top = null ;
}
if ( a === "nw" ) {
data . top = cpos . top + ( csize . height - data . height ) ;
data . left = cpos . left + ( csize . width - data . width ) ;
}
return data ;
} ,
_respectSize : function ( data ) {
var o = this . _vBoundaries ,
a = this . axis ,
ismaxw = isNumber ( data . width ) && o . maxWidth && ( o . maxWidth < data . width ) , ismaxh = isNumber ( data . height ) && o . maxHeight && ( o . maxHeight < data . height ) ,
isminw = isNumber ( data . width ) && o . minWidth && ( o . minWidth > data . width ) , isminh = isNumber ( data . height ) && o . minHeight && ( o . minHeight > data . height ) ,
dw = this . originalPosition . left + this . originalSize . width ,
dh = this . position . top + this . size . height ,
cw = /sw|nw|w/ . test ( a ) , ch = /nw|ne|n/ . test ( a ) ;
if ( isminw ) {
data . width = o . minWidth ;
}
if ( isminh ) {
data . height = o . minHeight ;
}
if ( ismaxw ) {
data . width = o . maxWidth ;
}
if ( ismaxh ) {
data . height = o . maxHeight ;
}
if ( isminw && cw ) {
data . left = dw - o . minWidth ;
}
if ( ismaxw && cw ) {
data . left = dw - o . maxWidth ;
}
if ( isminh && ch ) {
data . top = dh - o . minHeight ;
}
if ( ismaxh && ch ) {
data . top = dh - o . maxHeight ;
}
// fixing jump error on top/left - bug #2330
if ( ! data . width && ! data . height && ! data . left && data . top ) {
data . top = null ;
} else if ( ! data . width && ! data . height && ! data . top && data . left ) {
data . left = null ;
}
return data ;
} ,
_proportionallyResize : function ( ) {
if ( ! this . _proportionallyResizeElements . length ) {
return ;
}
var i , j , borders , paddings , prel ,
element = this . helper || this . element ;
for ( i = 0 ; i < this . _proportionallyResizeElements . length ; i ++ ) {
prel = this . _proportionallyResizeElements [ i ] ;
if ( ! this . borderDif ) {
this . borderDif = [ ] ;
borders = [ prel . css ( "borderTopWidth" ) , prel . css ( "borderRightWidth" ) , prel . css ( "borderBottomWidth" ) , prel . css ( "borderLeftWidth" ) ] ;
paddings = [ prel . css ( "paddingTop" ) , prel . css ( "paddingRight" ) , prel . css ( "paddingBottom" ) , prel . css ( "paddingLeft" ) ] ;
for ( j = 0 ; j < borders . length ; j ++ ) {
this . borderDif [ j ] = ( parseInt ( borders [ j ] , 10 ) || 0 ) + ( parseInt ( paddings [ j ] , 10 ) || 0 ) ;
}
}
prel . css ( {
height : ( element . height ( ) - this . borderDif [ 0 ] - this . borderDif [ 2 ] ) || 0 ,
width : ( element . width ( ) - this . borderDif [ 1 ] - this . borderDif [ 3 ] ) || 0
} ) ;
}
} ,
_renderProxy : function ( ) {
var el = this . element , o = this . options ;
this . elementOffset = el . offset ( ) ;
if ( this . _helper ) {
this . helper = this . helper || $ ( "<div style='overflow:hidden;'></div>" ) ;
this . helper . addClass ( this . _helper ) . css ( {
width : this . element . outerWidth ( ) - 1 ,
height : this . element . outerHeight ( ) - 1 ,
position : "absolute" ,
left : this . elementOffset . left + "px" ,
top : this . elementOffset . top + "px" ,
zIndex : ++ o . zIndex //TODO: Don't modify option
} ) ;
this . helper
. appendTo ( "body" )
. disableSelection ( ) ;
} else {
this . helper = this . element ;
}
} ,
_change : {
e : function ( event , dx ) {
return { width : this . originalSize . width + dx } ;
} ,
w : function ( event , dx ) {
var cs = this . originalSize , sp = this . originalPosition ;
return { left : sp . left + dx , width : cs . width - dx } ;
} ,
n : function ( event , dx , dy ) {
var cs = this . originalSize , sp = this . originalPosition ;
return { top : sp . top + dy , height : cs . height - dy } ;
} ,
s : function ( event , dx , dy ) {
return { height : this . originalSize . height + dy } ;
} ,
se : function ( event , dx , dy ) {
return $ . extend ( this . _change . s . apply ( this , arguments ) , this . _change . e . apply ( this , [ event , dx , dy ] ) ) ;
} ,
sw : function ( event , dx , dy ) {
return $ . extend ( this . _change . s . apply ( this , arguments ) , this . _change . w . apply ( this , [ event , dx , dy ] ) ) ;
} ,
ne : function ( event , dx , dy ) {
return $ . extend ( this . _change . n . apply ( this , arguments ) , this . _change . e . apply ( this , [ event , dx , dy ] ) ) ;
} ,
nw : function ( event , dx , dy ) {
return $ . extend ( this . _change . n . apply ( this , arguments ) , this . _change . w . apply ( this , [ event , dx , dy ] ) ) ;
}
} ,
_propagate : function ( n , event ) {
$ . ui . plugin . call ( this , n , [ event , this . ui ( ) ] ) ;
( n !== "resize" && this . _trigger ( n , event , this . ui ( ) ) ) ;
} ,
plugins : { } ,
ui : function ( ) {
return {
originalElement : this . originalElement ,
element : this . element ,
helper : this . helper ,
position : this . position ,
size : this . size ,
originalSize : this . originalSize ,
originalPosition : this . originalPosition
} ;
}
} ) ;
/ *
* Resizable Extensions
* /
$ . ui . plugin . add ( "resizable" , "animate" , {
stop : function ( event ) {
var that = $ ( this ) . data ( "ui-resizable" ) ,
o = that . options ,
pr = that . _proportionallyResizeElements ,
ista = pr . length && ( /textarea/i ) . test ( pr [ 0 ] . nodeName ) ,
soffseth = ista && $ . ui . hasScroll ( pr [ 0 ] , "left" ) /* TODO - jump height */ ? 0 : that . sizeDiff . height ,
soffsetw = ista ? 0 : that . sizeDiff . width ,
style = { width : ( that . size . width - soffsetw ) , height : ( that . size . height - soffseth ) } ,
left = ( parseInt ( that . element . css ( "left" ) , 10 ) + ( that . position . left - that . originalPosition . left ) ) || null ,
top = ( parseInt ( that . element . css ( "top" ) , 10 ) + ( that . position . top - that . originalPosition . top ) ) || null ;
that . element . animate (
$ . extend ( style , top && left ? { top : top , left : left } : { } ) , {
duration : o . animateDuration ,
easing : o . animateEasing ,
step : function ( ) {
var data = {
width : parseInt ( that . element . css ( "width" ) , 10 ) ,
height : parseInt ( that . element . css ( "height" ) , 10 ) ,
top : parseInt ( that . element . css ( "top" ) , 10 ) ,
left : parseInt ( that . element . css ( "left" ) , 10 )
} ;
if ( pr && pr . length ) {
$ ( pr [ 0 ] ) . css ( { width : data . width , height : data . height } ) ;
}
// propagating resize, and updating values for each animation step
that . _updateCache ( data ) ;
that . _propagate ( "resize" , event ) ;
}
}
) ;
}
} ) ;
$ . ui . plugin . add ( "resizable" , "containment" , {
start : function ( ) {
var element , p , co , ch , cw , width , height ,
that = $ ( this ) . data ( "ui-resizable" ) ,
o = that . options ,
el = that . element ,
oc = o . containment ,
ce = ( oc instanceof $ ) ? oc . get ( 0 ) : ( /parent/ . test ( oc ) ) ? el . parent ( ) . get ( 0 ) : oc ;
if ( ! ce ) {
return ;
}
that . containerElement = $ ( ce ) ;
if ( /document/ . test ( oc ) || oc === document ) {
that . containerOffset = { left : 0 , top : 0 } ;
that . containerPosition = { left : 0 , top : 0 } ;
that . parentData = {
element : $ ( document ) , left : 0 , top : 0 ,
width : $ ( document ) . width ( ) , height : $ ( document ) . height ( ) || document . body . parentNode . scrollHeight
} ;
}
// i'm a node, so compute top, left, right, bottom
else {
element = $ ( ce ) ;
p = [ ] ;
$ ( [ "Top" , "Right" , "Left" , "Bottom" ] ) . each ( function ( i , name ) { p [ i ] = num ( element . css ( "padding" + name ) ) ; } ) ;
that . containerOffset = element . offset ( ) ;
that . containerPosition = element . position ( ) ;
that . containerSize = { height : ( element . innerHeight ( ) - p [ 3 ] ) , width : ( element . innerWidth ( ) - p [ 1 ] ) } ;
co = that . containerOffset ;
ch = that . containerSize . height ;
cw = that . containerSize . width ;
width = ( $ . ui . hasScroll ( ce , "left" ) ? ce . scrollWidth : cw ) ;
height = ( $ . ui . hasScroll ( ce ) ? ce . scrollHeight : ch ) ;
that . parentData = {
element : ce , left : co . left , top : co . top , width : width , height : height
} ;
}
} ,
resize : function ( event ) {
var woset , hoset , isParent , isOffsetRelative ,
that = $ ( this ) . data ( "ui-resizable" ) ,
o = that . options ,
co = that . containerOffset , cp = that . position ,
pRatio = that . _aspectRatio || event . shiftKey ,
cop = { top : 0 , left : 0 } , ce = that . containerElement ;
if ( ce [ 0 ] !== document && ( /static/ ) . test ( ce . css ( "position" ) ) ) {
cop = co ;
}
if ( cp . left < ( that . _helper ? co . left : 0 ) ) {
that . size . width = that . size . width + ( that . _helper ? ( that . position . left - co . left ) : ( that . position . left - cop . left ) ) ;
if ( pRatio ) {
that . size . height = that . size . width / that . aspectRatio ;
}
that . position . left = o . helper ? co . left : 0 ;
}
if ( cp . top < ( that . _helper ? co . top : 0 ) ) {
that . size . height = that . size . height + ( that . _helper ? ( that . position . top - co . top ) : that . position . top ) ;
if ( pRatio ) {
that . size . width = that . size . height * that . aspectRatio ;
}
that . position . top = that . _helper ? co . top : 0 ;
}
that . offset . left = that . parentData . left + that . position . left ;
that . offset . top = that . parentData . top + that . position . top ;
woset = Math . abs ( ( that . _helper ? that . offset . left - cop . left : ( that . offset . left - cop . left ) ) + that . sizeDiff . width ) ;
hoset = Math . abs ( ( that . _helper ? that . offset . top - cop . top : ( that . offset . top - co . top ) ) + that . sizeDiff . height ) ;
isParent = that . containerElement . get ( 0 ) === that . element . parent ( ) . get ( 0 ) ;
isOffsetRelative = /relative|absolute/ . test ( that . containerElement . css ( "position" ) ) ;
2014-04-11 17:59:09 -04:00
if ( isParent && isOffsetRelative ) {
woset -= Math . abs ( that . parentData . left ) ;
2014-01-03 13:32:13 -05:00
}
if ( woset + that . size . width >= that . parentData . width ) {
that . size . width = that . parentData . width - woset ;
if ( pRatio ) {
that . size . height = that . size . width / that . aspectRatio ;
}
}
if ( hoset + that . size . height >= that . parentData . height ) {
that . size . height = that . parentData . height - hoset ;
if ( pRatio ) {
that . size . width = that . size . height * that . aspectRatio ;
}
}
} ,
stop : function ( ) {
var that = $ ( this ) . data ( "ui-resizable" ) ,
o = that . options ,
co = that . containerOffset ,
cop = that . containerPosition ,
ce = that . containerElement ,
helper = $ ( that . helper ) ,
ho = helper . offset ( ) ,
w = helper . outerWidth ( ) - that . sizeDiff . width ,
h = helper . outerHeight ( ) - that . sizeDiff . height ;
if ( that . _helper && ! o . animate && ( /relative/ ) . test ( ce . css ( "position" ) ) ) {
$ ( this ) . css ( { left : ho . left - cop . left - co . left , width : w , height : h } ) ;
}
if ( that . _helper && ! o . animate && ( /static/ ) . test ( ce . css ( "position" ) ) ) {
$ ( this ) . css ( { left : ho . left - cop . left - co . left , width : w , height : h } ) ;
}
}
} ) ;
$ . ui . plugin . add ( "resizable" , "alsoResize" , {
start : function ( ) {
var that = $ ( this ) . data ( "ui-resizable" ) ,
o = that . options ,
_store = function ( exp ) {
$ ( exp ) . each ( function ( ) {
var el = $ ( this ) ;
el . data ( "ui-resizable-alsoresize" , {
width : parseInt ( el . width ( ) , 10 ) , height : parseInt ( el . height ( ) , 10 ) ,
left : parseInt ( el . css ( "left" ) , 10 ) , top : parseInt ( el . css ( "top" ) , 10 )
} ) ;
} ) ;
} ;
if ( typeof ( o . alsoResize ) === "object" && ! o . alsoResize . parentNode ) {
if ( o . alsoResize . length ) { o . alsoResize = o . alsoResize [ 0 ] ; _store ( o . alsoResize ) ; }
else { $ . each ( o . alsoResize , function ( exp ) { _store ( exp ) ; } ) ; }
} else {
_store ( o . alsoResize ) ;
}
} ,
resize : function ( event , ui ) {
var that = $ ( this ) . data ( "ui-resizable" ) ,
o = that . options ,
os = that . originalSize ,
op = that . originalPosition ,
delta = {
height : ( that . size . height - os . height ) || 0 , width : ( that . size . width - os . width ) || 0 ,
top : ( that . position . top - op . top ) || 0 , left : ( that . position . left - op . left ) || 0
} ,
_alsoResize = function ( exp , c ) {
$ ( exp ) . each ( function ( ) {
var el = $ ( this ) , start = $ ( this ) . data ( "ui-resizable-alsoresize" ) , style = { } ,
css = c && c . length ? c : el . parents ( ui . originalElement [ 0 ] ) . length ? [ "width" , "height" ] : [ "width" , "height" , "top" , "left" ] ;
$ . each ( css , function ( i , prop ) {
var sum = ( start [ prop ] || 0 ) + ( delta [ prop ] || 0 ) ;
if ( sum && sum >= 0 ) {
style [ prop ] = sum || null ;
}
} ) ;
el . css ( style ) ;
} ) ;
} ;
if ( typeof ( o . alsoResize ) === "object" && ! o . alsoResize . nodeType ) {
$ . each ( o . alsoResize , function ( exp , c ) { _alsoResize ( exp , c ) ; } ) ;
} else {
_alsoResize ( o . alsoResize ) ;
}
} ,
stop : function ( ) {
$ ( this ) . removeData ( "resizable-alsoresize" ) ;
}
} ) ;
$ . ui . plugin . add ( "resizable" , "ghost" , {
start : function ( ) {
var that = $ ( this ) . data ( "ui-resizable" ) , o = that . options , cs = that . size ;
that . ghost = that . originalElement . clone ( ) ;
that . ghost
. css ( { opacity : 0.25 , display : "block" , position : "relative" , height : cs . height , width : cs . width , margin : 0 , left : 0 , top : 0 } )
. addClass ( "ui-resizable-ghost" )
. addClass ( typeof o . ghost === "string" ? o . ghost : "" ) ;
that . ghost . appendTo ( that . helper ) ;
} ,
resize : function ( ) {
var that = $ ( this ) . data ( "ui-resizable" ) ;
if ( that . ghost ) {
that . ghost . css ( { position : "relative" , height : that . size . height , width : that . size . width } ) ;
}
} ,
stop : function ( ) {
var that = $ ( this ) . data ( "ui-resizable" ) ;
if ( that . ghost && that . helper ) {
that . helper . get ( 0 ) . removeChild ( that . ghost . get ( 0 ) ) ;
}
}
} ) ;
$ . ui . plugin . add ( "resizable" , "grid" , {
resize : function ( ) {
var that = $ ( this ) . data ( "ui-resizable" ) ,
o = that . options ,
cs = that . size ,
os = that . originalSize ,
op = that . originalPosition ,
a = that . axis ,
grid = typeof o . grid === "number" ? [ o . grid , o . grid ] : o . grid ,
gridX = ( grid [ 0 ] || 1 ) ,
gridY = ( grid [ 1 ] || 1 ) ,
ox = Math . round ( ( cs . width - os . width ) / gridX ) * gridX ,
oy = Math . round ( ( cs . height - os . height ) / gridY ) * gridY ,
newWidth = os . width + ox ,
newHeight = os . height + oy ,
isMaxWidth = o . maxWidth && ( o . maxWidth < newWidth ) ,
isMaxHeight = o . maxHeight && ( o . maxHeight < newHeight ) ,
isMinWidth = o . minWidth && ( o . minWidth > newWidth ) ,
isMinHeight = o . minHeight && ( o . minHeight > newHeight ) ;
o . grid = grid ;
if ( isMinWidth ) {
newWidth = newWidth + gridX ;
}
if ( isMinHeight ) {
newHeight = newHeight + gridY ;
}
if ( isMaxWidth ) {
newWidth = newWidth - gridX ;
}
if ( isMaxHeight ) {
newHeight = newHeight - gridY ;
}
if ( /^(se|s|e)$/ . test ( a ) ) {
that . size . width = newWidth ;
that . size . height = newHeight ;
} else if ( /^(ne)$/ . test ( a ) ) {
that . size . width = newWidth ;
that . size . height = newHeight ;
that . position . top = op . top - oy ;
} else if ( /^(sw)$/ . test ( a ) ) {
that . size . width = newWidth ;
that . size . height = newHeight ;
that . position . left = op . left - ox ;
} else {
2014-04-11 17:59:09 -04:00
if ( newHeight - gridY > 0 ) {
that . size . height = newHeight ;
that . position . top = op . top - oy ;
} else {
that . size . height = gridY ;
that . position . top = op . top + os . height - gridY ;
}
if ( newWidth - gridX > 0 ) {
that . size . width = newWidth ;
that . position . left = op . left - ox ;
} else {
that . size . width = gridX ;
that . position . left = op . left + os . width - gridX ;
}
2014-01-03 13:32:13 -05:00
}
}
} ) ;
} ) ( jQuery ) ;
( function ( $ , undefined ) {
function isOverAxis ( x , reference , size ) {
return ( x > reference ) && ( x < ( reference + size ) ) ;
}
function isFloating ( item ) {
return ( /left|right/ ) . test ( item . css ( "float" ) ) || ( /inline|table-cell/ ) . test ( item . css ( "display" ) ) ;
}
$ . widget ( "ui.sortable" , $ . ui . mouse , {
2014-04-11 17:59:09 -04:00
version : "1.10.4" ,
2014-01-03 13:32:13 -05:00
widgetEventPrefix : "sort" ,
ready : false ,
options : {
appendTo : "parent" ,
axis : false ,
connectWith : false ,
containment : false ,
cursor : "auto" ,
cursorAt : false ,
dropOnEmpty : true ,
forcePlaceholderSize : false ,
forceHelperSize : false ,
grid : false ,
handle : false ,
helper : "original" ,
items : "> *" ,
opacity : false ,
placeholder : false ,
revert : false ,
scroll : true ,
scrollSensitivity : 20 ,
scrollSpeed : 20 ,
scope : "default" ,
tolerance : "intersect" ,
zIndex : 1000 ,
// callbacks
activate : null ,
beforeStop : null ,
change : null ,
deactivate : null ,
out : null ,
over : null ,
receive : null ,
remove : null ,
sort : null ,
start : null ,
stop : null ,
update : null
} ,
_create : function ( ) {
var o = this . options ;
this . containerCache = { } ;
this . element . addClass ( "ui-sortable" ) ;
//Get the items
this . refresh ( ) ;
//Let's determine if the items are being displayed horizontally
this . floating = this . items . length ? o . axis === "x" || isFloating ( this . items [ 0 ] . item ) : false ;
//Let's determine the parent's offset
this . offset = this . element . offset ( ) ;
//Initialize mouse events for interaction
this . _mouseInit ( ) ;
//We're ready to go
this . ready = true ;
} ,
_destroy : function ( ) {
this . element
. removeClass ( "ui-sortable ui-sortable-disabled" ) ;
this . _mouseDestroy ( ) ;
for ( var i = this . items . length - 1 ; i >= 0 ; i -- ) {
this . items [ i ] . item . removeData ( this . widgetName + "-item" ) ;
}
return this ;
} ,
_setOption : function ( key , value ) {
if ( key === "disabled" ) {
this . options [ key ] = value ;
this . widget ( ) . toggleClass ( "ui-sortable-disabled" , ! ! value ) ;
} else {
// Don't call widget base _setOption for disable as it adds ui-state-disabled class
$ . Widget . prototype . _setOption . apply ( this , arguments ) ;
}
} ,
_mouseCapture : function ( event , overrideHandle ) {
var currentItem = null ,
validHandle = false ,
that = this ;
if ( this . reverting ) {
return false ;
}
if ( this . options . disabled || this . options . type === "static" ) {
return false ;
}
//We have to refresh the items data once first
this . _refreshItems ( event ) ;
//Find out if the clicked node (or one of its parents) is a actual item in this.items
$ ( event . target ) . parents ( ) . each ( function ( ) {
if ( $ . data ( this , that . widgetName + "-item" ) === that ) {
currentItem = $ ( this ) ;
return false ;
}
} ) ;
if ( $ . data ( event . target , that . widgetName + "-item" ) === that ) {
currentItem = $ ( event . target ) ;
}
if ( ! currentItem ) {
return false ;
}
if ( this . options . handle && ! overrideHandle ) {
$ ( this . options . handle , currentItem ) . find ( "*" ) . addBack ( ) . each ( function ( ) {
if ( this === event . target ) {
validHandle = true ;
}
} ) ;
if ( ! validHandle ) {
return false ;
}
}
this . currentItem = currentItem ;
this . _removeCurrentsFromItems ( ) ;
return true ;
} ,
_mouseStart : function ( event , overrideHandle , noActivation ) {
var i , body ,
o = this . options ;
this . currentContainer = this ;
//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
this . refreshPositions ( ) ;
//Create and append the visible helper
this . helper = this . _createHelper ( event ) ;
//Cache the helper size
this . _cacheHelperProportions ( ) ;
/ *
* - Position generation -
* This block generates everything position related - it ' s the core of draggables .
* /
//Cache the margins of the original element
this . _cacheMargins ( ) ;
//Get the next scrolling parent
this . scrollParent = this . helper . scrollParent ( ) ;
//The element's absolute position on the page minus margins
this . offset = this . currentItem . 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
} ) ;
// Only after we got the offset, we can change the helper's position to absolute
// TODO: Still need to figure out a way to make relative sorting possible
this . helper . css ( "position" , "absolute" ) ;
this . cssPosition = this . helper . css ( "position" ) ;
//Generate the original position
this . originalPosition = 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 ) ) ;
//Cache the former DOM position
this . domPosition = { prev : this . currentItem . prev ( ) [ 0 ] , parent : this . currentItem . parent ( ) [ 0 ] } ;
//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
if ( this . helper [ 0 ] !== this . currentItem [ 0 ] ) {
this . currentItem . hide ( ) ;
}
//Create the placeholder
this . _createPlaceholder ( ) ;
//Set a containment if given in the options
if ( o . containment ) {
this . _setContainment ( ) ;
}
if ( o . cursor && o . cursor !== "auto" ) { // cursor option
body = this . document . find ( "body" ) ;
// support: IE
this . storedCursor = body . css ( "cursor" ) ;
body . css ( "cursor" , o . cursor ) ;
this . storedStylesheet = $ ( "<style>*{ cursor: " + o . cursor + " !important; }</style>" ) . appendTo ( body ) ;
}
if ( o . opacity ) { // opacity option
if ( this . helper . css ( "opacity" ) ) {
this . _storedOpacity = this . helper . css ( "opacity" ) ;
}
this . helper . css ( "opacity" , o . opacity ) ;
}
if ( o . zIndex ) { // zIndex option
if ( this . helper . css ( "zIndex" ) ) {
this . _storedZIndex = this . helper . css ( "zIndex" ) ;
}
this . helper . css ( "zIndex" , o . zIndex ) ;
}
//Prepare scrolling
if ( this . scrollParent [ 0 ] !== document && this . scrollParent [ 0 ] . tagName !== "HTML" ) {
this . overflowOffset = this . scrollParent . offset ( ) ;
}
//Call callbacks
this . _trigger ( "start" , event , this . _uiHash ( ) ) ;
//Recache the helper size
if ( ! this . _preserveHelperProportions ) {
this . _cacheHelperProportions ( ) ;
}
//Post "activate" events to possible containers
if ( ! noActivation ) {
for ( i = this . containers . length - 1 ; i >= 0 ; i -- ) {
this . containers [ i ] . _trigger ( "activate" , event , this . _uiHash ( this ) ) ;
}
}
//Prepare possible droppables
if ( $ . ui . ddmanager ) {
$ . ui . ddmanager . current = this ;
}
if ( $ . ui . ddmanager && ! o . dropBehaviour ) {
$ . ui . ddmanager . prepareOffsets ( this , event ) ;
}
this . dragging = true ;
this . helper . addClass ( "ui-sortable-helper" ) ;
this . _mouseDrag ( event ) ; //Execute the drag once - this causes the helper not to be visible before getting its correct position
return true ;
} ,
_mouseDrag : function ( event ) {
var i , item , itemElement , intersection ,
o = this . options ,
scrolled = false ;
//Compute the helpers position
this . position = this . _generatePosition ( event ) ;
this . positionAbs = this . _convertPositionTo ( "absolute" ) ;
if ( ! this . lastPositionAbs ) {
this . lastPositionAbs = this . positionAbs ;
}
//Do scrolling
if ( this . options . scroll ) {
if ( this . scrollParent [ 0 ] !== document && this . scrollParent [ 0 ] . tagName !== "HTML" ) {
if ( ( this . overflowOffset . top + this . scrollParent [ 0 ] . offsetHeight ) - event . pageY < o . scrollSensitivity ) {
this . scrollParent [ 0 ] . scrollTop = scrolled = this . scrollParent [ 0 ] . scrollTop + o . scrollSpeed ;
} else if ( event . pageY - this . overflowOffset . top < o . scrollSensitivity ) {
this . scrollParent [ 0 ] . scrollTop = scrolled = this . scrollParent [ 0 ] . scrollTop - o . scrollSpeed ;
}
if ( ( this . overflowOffset . left + this . scrollParent [ 0 ] . offsetWidth ) - event . pageX < o . scrollSensitivity ) {
this . scrollParent [ 0 ] . scrollLeft = scrolled = this . scrollParent [ 0 ] . scrollLeft + o . scrollSpeed ;
} else if ( event . pageX - this . overflowOffset . left < o . scrollSensitivity ) {
this . scrollParent [ 0 ] . scrollLeft = scrolled = this . scrollParent [ 0 ] . scrollLeft - o . scrollSpeed ;
}
} else {
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 ( 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 ( this , event ) ;
}
}
//Regenerate the absolute position used for position checks
this . positionAbs = this . _convertPositionTo ( "absolute" ) ;
//Set the helper 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" ;
}
//Rearrange
for ( i = this . items . length - 1 ; i >= 0 ; i -- ) {
//Cache variables and intersection, continue if no intersection
item = this . items [ i ] ;
itemElement = item . item [ 0 ] ;
intersection = this . _intersectsWithPointer ( item ) ;
if ( ! intersection ) {
continue ;
}
// Only put the placeholder inside the current Container, skip all
2014-04-11 17:59:09 -04:00
// items from other containers. This works because when moving
2014-01-03 13:32:13 -05:00
// an item from one container to another the
// currentContainer is switched before the placeholder is moved.
//
2014-04-11 17:59:09 -04:00
// Without this, moving items in "sub-sortables" can cause
// the placeholder to jitter beetween the outer and inner container.
2014-01-03 13:32:13 -05:00
if ( item . instance !== this . currentContainer ) {
continue ;
}
// cannot intersect with itself
// no useless actions that have been done before
// no action if the item moved is the parent of the item checked
if ( itemElement !== this . currentItem [ 0 ] &&
this . placeholder [ intersection === 1 ? "next" : "prev" ] ( ) [ 0 ] !== itemElement &&
! $ . contains ( this . placeholder [ 0 ] , itemElement ) &&
( this . options . type === "semi-dynamic" ? ! $ . contains ( this . element [ 0 ] , itemElement ) : true )
) {
this . direction = intersection === 1 ? "down" : "up" ;
if ( this . options . tolerance === "pointer" || this . _intersectsWithSides ( item ) ) {
this . _rearrange ( event , item ) ;
} else {
break ;
}
this . _trigger ( "change" , event , this . _uiHash ( ) ) ;
break ;
}
}
//Post events to containers
this . _contactContainers ( event ) ;
//Interconnect with droppables
if ( $ . ui . ddmanager ) {
$ . ui . ddmanager . drag ( this , event ) ;
}
//Call callbacks
this . _trigger ( "sort" , event , this . _uiHash ( ) ) ;
this . lastPositionAbs = this . positionAbs ;
return false ;
} ,
_mouseStop : function ( event , noPropagation ) {
if ( ! event ) {
return ;
}
//If we are using droppables, inform the manager about the drop
if ( $ . ui . ddmanager && ! this . options . dropBehaviour ) {
$ . ui . ddmanager . drop ( this , event ) ;
}
if ( this . options . revert ) {
var that = this ,
cur = this . placeholder . offset ( ) ,
axis = this . options . axis ,
animation = { } ;
if ( ! axis || axis === "x" ) {
animation . left = cur . left - this . offset . parent . left - this . margins . left + ( this . offsetParent [ 0 ] === document . body ? 0 : this . offsetParent [ 0 ] . scrollLeft ) ;
}
if ( ! axis || axis === "y" ) {
animation . top = cur . top - this . offset . parent . top - this . margins . top + ( this . offsetParent [ 0 ] === document . body ? 0 : this . offsetParent [ 0 ] . scrollTop ) ;
}
this . reverting = true ;
$ ( this . helper ) . animate ( animation , parseInt ( this . options . revert , 10 ) || 500 , function ( ) {
that . _clear ( event ) ;
} ) ;
} else {
this . _clear ( event , noPropagation ) ;
}
return false ;
} ,
cancel : function ( ) {
if ( this . dragging ) {
this . _mouseUp ( { target : null } ) ;
if ( this . options . helper === "original" ) {
this . currentItem . css ( this . _storedCSS ) . removeClass ( "ui-sortable-helper" ) ;
} else {
this . currentItem . show ( ) ;
}
//Post deactivating events to containers
for ( var i = this . containers . length - 1 ; i >= 0 ; i -- ) {
this . containers [ i ] . _trigger ( "deactivate" , null , this . _uiHash ( this ) ) ;
if ( this . containers [ i ] . containerCache . over ) {
this . containers [ i ] . _trigger ( "out" , null , this . _uiHash ( this ) ) ;
this . containers [ i ] . containerCache . over = 0 ;
}
}
}
if ( this . placeholder ) {
//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
if ( this . placeholder [ 0 ] . parentNode ) {
this . placeholder [ 0 ] . parentNode . removeChild ( this . placeholder [ 0 ] ) ;
}
if ( this . options . helper !== "original" && this . helper && this . helper [ 0 ] . parentNode ) {
this . helper . remove ( ) ;
}
$ . extend ( this , {
helper : null ,
dragging : false ,
reverting : false ,
_noFinalSort : null
} ) ;
if ( this . domPosition . prev ) {
$ ( this . domPosition . prev ) . after ( this . currentItem ) ;
} else {
$ ( this . domPosition . parent ) . prepend ( this . currentItem ) ;
}
}
return this ;
} ,
serialize : function ( o ) {
var items = this . _getItemsAsjQuery ( o && o . connected ) ,
str = [ ] ;
o = o || { } ;
$ ( items ) . each ( function ( ) {
var res = ( $ ( o . item || this ) . attr ( o . attribute || "id" ) || "" ) . match ( o . expression || ( /(.+)[\-=_](.+)/ ) ) ;
if ( res ) {
str . push ( ( o . key || res [ 1 ] + "[]" ) + "=" + ( o . key && o . expression ? res [ 1 ] : res [ 2 ] ) ) ;
}
} ) ;
if ( ! str . length && o . key ) {
str . push ( o . key + "=" ) ;
}
return str . join ( "&" ) ;
} ,
toArray : function ( o ) {
var items = this . _getItemsAsjQuery ( o && o . connected ) ,
ret = [ ] ;
o = o || { } ;
items . each ( function ( ) { ret . push ( $ ( o . item || this ) . attr ( o . attribute || "id" ) || "" ) ; } ) ;
return ret ;
} ,
/* Be careful with the following core functions */
_intersectsWith : function ( item ) {
var x1 = this . positionAbs . left ,
x2 = x1 + this . helperProportions . width ,
y1 = this . positionAbs . top ,
y2 = y1 + this . helperProportions . height ,
l = item . left ,
r = l + item . width ,
t = item . top ,
b = t + item . height ,
dyClick = this . offset . click . top ,
dxClick = this . offset . click . left ,
isOverElementHeight = ( this . options . axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ) ,
isOverElementWidth = ( this . options . axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ) ,
isOverElement = isOverElementHeight && isOverElementWidth ;
if ( this . options . tolerance === "pointer" ||
this . options . forcePointerForContainers ||
( this . options . tolerance !== "pointer" && this . helperProportions [ this . floating ? "width" : "height" ] > item [ this . floating ? "width" : "height" ] )
) {
return isOverElement ;
} else {
return ( l < x1 + ( this . helperProportions . width / 2 ) && // Right Half
x2 - ( this . helperProportions . width / 2 ) < r && // Left Half
t < y1 + ( this . helperProportions . height / 2 ) && // Bottom Half
y2 - ( this . helperProportions . height / 2 ) < b ) ; // Top Half
}
} ,
_intersectsWithPointer : function ( item ) {
var isOverElementHeight = ( this . options . axis === "x" ) || isOverAxis ( this . positionAbs . top + this . offset . click . top , item . top , item . height ) ,
isOverElementWidth = ( this . options . axis === "y" ) || isOverAxis ( this . positionAbs . left + this . offset . click . left , item . left , item . width ) ,
isOverElement = isOverElementHeight && isOverElementWidth ,
verticalDirection = this . _getDragVerticalDirection ( ) ,
horizontalDirection = this . _getDragHorizontalDirection ( ) ;
if ( ! isOverElement ) {
return false ;
}
return this . floating ?
( ( ( horizontalDirection && horizontalDirection === "right" ) || verticalDirection === "down" ) ? 2 : 1 )
: ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) ) ;
} ,
_intersectsWithSides : function ( item ) {
var isOverBottomHalf = isOverAxis ( this . positionAbs . top + this . offset . click . top , item . top + ( item . height / 2 ) , item . height ) ,
isOverRightHalf = isOverAxis ( this . positionAbs . left + this . offset . click . left , item . left + ( item . width / 2 ) , item . width ) ,
verticalDirection = this . _getDragVerticalDirection ( ) ,
horizontalDirection = this . _getDragHorizontalDirection ( ) ;
if ( this . floating && horizontalDirection ) {
return ( ( horizontalDirection === "right" && isOverRightHalf ) || ( horizontalDirection === "left" && ! isOverRightHalf ) ) ;
} else {
return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) || ( verticalDirection === "up" && ! isOverBottomHalf ) ) ;
}
} ,
_getDragVerticalDirection : function ( ) {
var delta = this . positionAbs . top - this . lastPositionAbs . top ;
return delta !== 0 && ( delta > 0 ? "down" : "up" ) ;
} ,
_getDragHorizontalDirection : function ( ) {
var delta = this . positionAbs . left - this . lastPositionAbs . left ;
return delta !== 0 && ( delta > 0 ? "right" : "left" ) ;
} ,
refresh : function ( event ) {
this . _refreshItems ( event ) ;
this . refreshPositions ( ) ;
return this ;
} ,
_connectWith : function ( ) {
var options = this . options ;
return options . connectWith . constructor === String ? [ options . connectWith ] : options . connectWith ;
} ,
_getItemsAsjQuery : function ( connected ) {
var i , j , cur , inst ,
items = [ ] ,
queries = [ ] ,
connectWith = this . _connectWith ( ) ;
if ( connectWith && connected ) {
for ( i = connectWith . length - 1 ; i >= 0 ; i -- ) {
cur = $ ( connectWith [ i ] ) ;
for ( j = cur . length - 1 ; j >= 0 ; j -- ) {
inst = $ . data ( cur [ j ] , this . widgetFullName ) ;
if ( inst && inst !== this && ! inst . options . disabled ) {
queries . push ( [ $ . isFunction ( inst . options . items ) ? inst . options . items . call ( inst . element ) : $ ( inst . options . items , inst . element ) . not ( ".ui-sortable-helper" ) . not ( ".ui-sortable-placeholder" ) , inst ] ) ;
}
}
}
}
queries . push ( [ $ . isFunction ( this . options . items ) ? this . options . items . call ( this . element , null , { options : this . options , item : this . currentItem } ) : $ ( this . options . items , this . element ) . not ( ".ui-sortable-helper" ) . not ( ".ui-sortable-placeholder" ) , this ] ) ;
2014-04-11 17:59:09 -04:00
function addItems ( ) {
items . push ( this ) ;
}
2014-01-03 13:32:13 -05:00
for ( i = queries . length - 1 ; i >= 0 ; i -- ) {
2014-04-11 17:59:09 -04:00
queries [ i ] [ 0 ] . each ( addItems ) ;
2014-01-03 13:32:13 -05:00
}
return $ ( items ) ;
} ,
_removeCurrentsFromItems : function ( ) {
var list = this . currentItem . find ( ":data(" + this . widgetName + "-item)" ) ;
this . items = $ . grep ( this . items , function ( item ) {
for ( var j = 0 ; j < list . length ; j ++ ) {
if ( list [ j ] === item . item [ 0 ] ) {
return false ;
}
}
return true ;
} ) ;
} ,
_refreshItems : function ( event ) {
this . items = [ ] ;
this . containers = [ this ] ;
var i , j , cur , inst , targetData , _queries , item , queriesLength ,
items = this . items ,
queries = [ [ $ . isFunction ( this . options . items ) ? this . options . items . call ( this . element [ 0 ] , event , { item : this . currentItem } ) : $ ( this . options . items , this . element ) , this ] ] ,
connectWith = this . _connectWith ( ) ;
if ( connectWith && this . ready ) { //Shouldn't be run the first time through due to massive slow-down
for ( i = connectWith . length - 1 ; i >= 0 ; i -- ) {
cur = $ ( connectWith [ i ] ) ;
for ( j = cur . length - 1 ; j >= 0 ; j -- ) {
inst = $ . data ( cur [ j ] , this . widgetFullName ) ;
if ( inst && inst !== this && ! inst . options . disabled ) {
queries . push ( [ $ . isFunction ( inst . options . items ) ? inst . options . items . call ( inst . element [ 0 ] , event , { item : this . currentItem } ) : $ ( inst . options . items , inst . element ) , inst ] ) ;
this . containers . push ( inst ) ;
}
}
}
}
for ( i = queries . length - 1 ; i >= 0 ; i -- ) {
targetData = queries [ i ] [ 1 ] ;
_queries = queries [ i ] [ 0 ] ;
for ( j = 0 , queriesLength = _queries . length ; j < queriesLength ; j ++ ) {
item = $ ( _queries [ j ] ) ;
item . data ( this . widgetName + "-item" , targetData ) ; // Data for target checking (mouse manager)
items . push ( {
item : item ,
instance : targetData ,
width : 0 , height : 0 ,
left : 0 , top : 0
} ) ;
}
}
} ,
refreshPositions : function ( fast ) {
//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
if ( this . offsetParent && this . helper ) {
this . offset . parent = this . _getParentOffset ( ) ;
}
var i , item , t , p ;
for ( i = this . items . length - 1 ; i >= 0 ; i -- ) {
item = this . items [ i ] ;
//We ignore calculating positions of all connected containers when we're not over them
if ( item . instance !== this . currentContainer && this . currentContainer && item . item [ 0 ] !== this . currentItem [ 0 ] ) {
continue ;
}
t = this . options . toleranceElement ? $ ( this . options . toleranceElement , item . item ) : item . item ;
if ( ! fast ) {
item . width = t . outerWidth ( ) ;
item . height = t . outerHeight ( ) ;
}
p = t . offset ( ) ;
item . left = p . left ;
item . top = p . top ;
}
if ( this . options . custom && this . options . custom . refreshContainers ) {
this . options . custom . refreshContainers . call ( this ) ;
} else {
for ( i = this . containers . length - 1 ; i >= 0 ; i -- ) {
p = this . containers [ i ] . element . offset ( ) ;
this . containers [ i ] . containerCache . left = p . left ;
this . containers [ i ] . containerCache . top = p . top ;
this . containers [ i ] . containerCache . width = this . containers [ i ] . element . outerWidth ( ) ;
this . containers [ i ] . containerCache . height = this . containers [ i ] . element . outerHeight ( ) ;
}
}
return this ;
} ,
_createPlaceholder : function ( that ) {
that = that || this ;
var className ,
o = that . options ;
if ( ! o . placeholder || o . placeholder . constructor === String ) {
className = o . placeholder ;
o . placeholder = {
element : function ( ) {
var nodeName = that . currentItem [ 0 ] . nodeName . toLowerCase ( ) ,
element = $ ( "<" + nodeName + ">" , that . document [ 0 ] )
. addClass ( className || that . currentItem [ 0 ] . className + " ui-sortable-placeholder" )
. removeClass ( "ui-sortable-helper" ) ;
if ( nodeName === "tr" ) {
that . currentItem . children ( ) . each ( function ( ) {
$ ( "<td> </td>" , that . document [ 0 ] )
. attr ( "colspan" , $ ( this ) . attr ( "colspan" ) || 1 )
. appendTo ( element ) ;
} ) ;
} else if ( nodeName === "img" ) {
element . attr ( "src" , that . currentItem . attr ( "src" ) ) ;
}
if ( ! className ) {
element . css ( "visibility" , "hidden" ) ;
}
return element ;
} ,
update : function ( container , p ) {
// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
if ( className && ! o . forcePlaceholderSize ) {
return ;
}
//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
if ( ! p . height ( ) ) { p . height ( that . currentItem . innerHeight ( ) - parseInt ( that . currentItem . css ( "paddingTop" ) || 0 , 10 ) - parseInt ( that . currentItem . css ( "paddingBottom" ) || 0 , 10 ) ) ; }
if ( ! p . width ( ) ) { p . width ( that . currentItem . innerWidth ( ) - parseInt ( that . currentItem . css ( "paddingLeft" ) || 0 , 10 ) - parseInt ( that . currentItem . css ( "paddingRight" ) || 0 , 10 ) ) ; }
}
} ;
}
//Create the placeholder
that . placeholder = $ ( o . placeholder . element . call ( that . element , that . currentItem ) ) ;
//Append it after the actual current item
that . currentItem . after ( that . placeholder ) ;
//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
o . placeholder . update ( that , that . placeholder ) ;
} ,
_contactContainers : function ( event ) {
var i , j , dist , itemWithLeastDistance , posProperty , sizeProperty , base , cur , nearBottom , floating ,
innermostContainer = null ,
innermostIndex = null ;
// get innermost container that intersects with item
for ( i = this . containers . length - 1 ; i >= 0 ; i -- ) {
// never consider a container that's located within the item itself
if ( $ . contains ( this . currentItem [ 0 ] , this . containers [ i ] . element [ 0 ] ) ) {
continue ;
}
if ( this . _intersectsWith ( this . containers [ i ] . containerCache ) ) {
// if we've already found a container and it's more "inner" than this, then continue
if ( innermostContainer && $ . contains ( this . containers [ i ] . element [ 0 ] , innermostContainer . element [ 0 ] ) ) {
continue ;
}
innermostContainer = this . containers [ i ] ;
innermostIndex = i ;
} else {
// container doesn't intersect. trigger "out" event if necessary
if ( this . containers [ i ] . containerCache . over ) {
this . containers [ i ] . _trigger ( "out" , event , this . _uiHash ( this ) ) ;
this . containers [ i ] . containerCache . over = 0 ;
}
}
}
// if no intersecting containers found, return
if ( ! innermostContainer ) {
return ;
}
// move the item into the container if it's not there already
if ( this . containers . length === 1 ) {
if ( ! this . containers [ innermostIndex ] . containerCache . over ) {
this . containers [ innermostIndex ] . _trigger ( "over" , event , this . _uiHash ( this ) ) ;
this . containers [ innermostIndex ] . containerCache . over = 1 ;
}
} else {
//When entering a new container, we will find the item with the least distance and append our item near it
dist = 10000 ;
itemWithLeastDistance = null ;
floating = innermostContainer . floating || isFloating ( this . currentItem ) ;
posProperty = floating ? "left" : "top" ;
sizeProperty = floating ? "width" : "height" ;
base = this . positionAbs [ posProperty ] + this . offset . click [ posProperty ] ;
for ( j = this . items . length - 1 ; j >= 0 ; j -- ) {
if ( ! $ . contains ( this . containers [ innermostIndex ] . element [ 0 ] , this . items [ j ] . item [ 0 ] ) ) {
continue ;
}
if ( this . items [ j ] . item [ 0 ] === this . currentItem [ 0 ] ) {
continue ;
}
if ( floating && ! isOverAxis ( this . positionAbs . top + this . offset . click . top , this . items [ j ] . top , this . items [ j ] . height ) ) {
continue ;
}
cur = this . items [ j ] . item . offset ( ) [ posProperty ] ;
nearBottom = false ;
if ( Math . abs ( cur - base ) > Math . abs ( cur + this . items [ j ] [ sizeProperty ] - base ) ) {
nearBottom = true ;
cur += this . items [ j ] [ sizeProperty ] ;
}
if ( Math . abs ( cur - base ) < dist ) {
dist = Math . abs ( cur - base ) ; itemWithLeastDistance = this . items [ j ] ;
this . direction = nearBottom ? "up" : "down" ;
}
}
//Check if dropOnEmpty is enabled
if ( ! itemWithLeastDistance && ! this . options . dropOnEmpty ) {
return ;
}
if ( this . currentContainer === this . containers [ innermostIndex ] ) {
return ;
}
itemWithLeastDistance ? this . _rearrange ( event , itemWithLeastDistance , null , true ) : this . _rearrange ( event , null , this . containers [ innermostIndex ] . element , true ) ;
this . _trigger ( "change" , event , this . _uiHash ( ) ) ;
this . containers [ innermostIndex ] . _trigger ( "change" , event , this . _uiHash ( this ) ) ;
this . currentContainer = this . containers [ innermostIndex ] ;
//Update the placeholder
this . options . placeholder . update ( this . currentContainer , this . placeholder ) ;
this . containers [ innermostIndex ] . _trigger ( "over" , event , this . _uiHash ( this ) ) ;
this . containers [ innermostIndex ] . containerCache . over = 1 ;
}
} ,
_createHelper : function ( event ) {
var o = this . options ,
helper = $ . isFunction ( o . helper ) ? $ ( o . helper . apply ( this . element [ 0 ] , [ event , this . currentItem ] ) ) : ( o . helper === "clone" ? this . currentItem . clone ( ) : this . currentItem ) ;
//Add the helper to the DOM if that didn't happen already
if ( ! helper . parents ( "body" ) . length ) {
$ ( o . appendTo !== "parent" ? o . appendTo : this . currentItem [ 0 ] . parentNode ) [ 0 ] . appendChild ( helper [ 0 ] ) ;
}
if ( helper [ 0 ] === this . currentItem [ 0 ] ) {
this . _storedCSS = { width : this . currentItem [ 0 ] . style . width , height : this . currentItem [ 0 ] . style . height , position : this . currentItem . css ( "position" ) , top : this . currentItem . css ( "top" ) , left : this . currentItem . css ( "left" ) } ;
}
if ( ! helper [ 0 ] . style . width || o . forceHelperSize ) {
helper . width ( this . currentItem . width ( ) ) ;
}
if ( ! helper [ 0 ] . style . height || o . forceHelperSize ) {
helper . height ( this . currentItem . height ( ) ) ;
}
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 && $ . contains ( this . scrollParent [ 0 ] , this . offsetParent [ 0 ] ) ) {
po . left += this . scrollParent . scrollLeft ( ) ;
po . top += this . scrollParent . scrollTop ( ) ;
}
// This needs to be actually done for all browsers, since pageX/pageY includes this information
// with an ugly IE fix
if ( this . offsetParent [ 0 ] === document . body || ( this . offsetParent [ 0 ] . tagName && this . offsetParent [ 0 ] . tagName . toLowerCase ( ) === "html" && $ . ui . ie ) ) {
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 . currentItem . 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 . currentItem . css ( "marginLeft" ) , 10 ) || 0 ) ,
top : ( parseInt ( this . currentItem . css ( "marginTop" ) , 10 ) || 0 )
} ;
} ,
_cacheHelperProportions : function ( ) {
this . helperProportions = {
width : this . helper . outerWidth ( ) ,
height : this . helper . outerHeight ( )
} ;
} ,
_setContainment : function ( ) {
var ce , co , over ,
o = this . options ;
if ( o . containment === "parent" ) {
o . containment = this . helper [ 0 ] . parentNode ;
}
if ( o . containment === "document" || o . containment === "window" ) {
this . containment = [
0 - this . offset . relative . left - this . offset . parent . left ,
0 - this . offset . relative . top - this . offset . parent . top ,
$ ( o . containment === "document" ? document : window ) . width ( ) - this . helperProportions . width - this . margins . left ,
( $ ( o . containment === "document" ? document : window ) . height ( ) || document . body . parentNode . scrollHeight ) - this . helperProportions . height - this . margins . top
] ;
}
if ( ! ( /^(document|window|parent)$/ ) . test ( o . containment ) ) {
ce = $ ( o . containment ) [ 0 ] ;
co = $ ( o . containment ) . offset ( ) ;
over = ( $ ( ce ) . css ( "overflow" ) !== "hidden" ) ;
this . containment = [
co . left + ( parseInt ( $ ( ce ) . css ( "borderLeftWidth" ) , 10 ) || 0 ) + ( parseInt ( $ ( ce ) . css ( "paddingLeft" ) , 10 ) || 0 ) - this . margins . left ,
co . top + ( parseInt ( $ ( ce ) . css ( "borderTopWidth" ) , 10 ) || 0 ) + ( parseInt ( $ ( ce ) . css ( "paddingTop" ) , 10 ) || 0 ) - this . margins . top ,
co . left + ( 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 ,
co . top + ( 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
] ;
}
} ,
_convertPositionTo : function ( d , pos ) {
if ( ! pos ) {
pos = this . position ;
}
var mod = d === "absolute" ? 1 : - 1 ,
scroll = this . cssPosition === "absolute" && ! ( this . scrollParent [ 0 ] !== document && $ . 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)
( ( 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)
( ( this . cssPosition === "fixed" ? - this . scrollParent . scrollLeft ( ) : scrollIsRootNode ? 0 : scroll . scrollLeft ( ) ) * mod )
)
} ;
} ,
_generatePosition : function ( event ) {
var top , left ,
o = this . options ,
pageX = event . pageX ,
pageY = event . pageY ,
scroll = this . cssPosition === "absolute" && ! ( this . scrollParent [ 0 ] !== document && $ . contains ( this . scrollParent [ 0 ] , this . offsetParent [ 0 ] ) ) ? this . offsetParent : this . scrollParent , scrollIsRootNode = ( /(html|body)/i ) . test ( scroll [ 0 ] . tagName ) ;
// This is another very weird special case that only happens for relative elements:
// 1. If the css position is relative
// 2. and the scroll parent is the document or similar to the offset parent
// we have to refresh the relative offset during the scroll so there are no jumps
if ( this . cssPosition === "relative" && ! ( this . scrollParent [ 0 ] !== document && this . scrollParent [ 0 ] !== this . offsetParent [ 0 ] ) ) {
this . offset . relative = this . _getRelativeOffset ( ) ;
}
/ *
* - 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
if ( this . containment ) {
if ( event . pageX - this . offset . click . left < this . containment [ 0 ] ) {
pageX = this . containment [ 0 ] + this . offset . click . left ;
}
if ( event . pageY - this . offset . click . top < this . containment [ 1 ] ) {
pageY = this . containment [ 1 ] + this . offset . click . top ;
}
if ( event . pageX - this . offset . click . left > this . containment [ 2 ] ) {
pageX = this . containment [ 2 ] + this . offset . click . left ;
}
if ( event . pageY - this . offset . click . top > this . containment [ 3 ] ) {
pageY = this . containment [ 3 ] + this . offset . click . top ;
}
}
if ( o . grid ) {
top = this . originalPageY + Math . round ( ( pageY - this . originalPageY ) / o . grid [ 1 ] ) * o . grid [ 1 ] ;
pageY = this . containment ? ( ( top - this . offset . click . top >= this . containment [ 1 ] && top - this . offset . click . top <= this . containment [ 3 ] ) ? top : ( ( top - this . offset . click . top >= this . containment [ 1 ] ) ? top - o . grid [ 1 ] : top + o . grid [ 1 ] ) ) : top ;
left = this . originalPageX + Math . round ( ( pageX - this . originalPageX ) / o . grid [ 0 ] ) * o . grid [ 0 ] ;
pageX = this . containment ? ( ( left - this . offset . click . left >= this . containment [ 0 ] && left - this . offset . click . left <= this . containment [ 2 ] ) ? left : ( ( left - this . offset . click . left >= this . 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)
( ( 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)
( ( this . cssPosition === "fixed" ? - this . scrollParent . scrollLeft ( ) : scrollIsRootNode ? 0 : scroll . scrollLeft ( ) ) )
)
} ;
} ,
_rearrange : function ( event , i , a , hardRefresh ) {
a ? a [ 0 ] . appendChild ( this . placeholder [ 0 ] ) : i . item [ 0 ] . parentNode . insertBefore ( this . placeholder [ 0 ] , ( this . direction === "down" ? i . item [ 0 ] : i . item [ 0 ] . nextSibling ) ) ;
//Various things done here to improve the performance:
// 1. we create a setTimeout, that calls refreshPositions
// 2. on the instance, we have a counter variable, that get's higher after every append
// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
// 4. this lets only the last addition to the timeout stack through
this . counter = this . counter ? ++ this . counter : 1 ;
var counter = this . counter ;
this . _delay ( function ( ) {
if ( counter === this . counter ) {
this . refreshPositions ( ! hardRefresh ) ; //Precompute after each DOM insertion, NOT on mousemove
}
} ) ;
} ,
_clear : function ( event , noPropagation ) {
this . reverting = false ;
// We delay all events that have to be triggered to after the point where the placeholder has been removed and
// everything else normalized again
var i ,
delayedTriggers = [ ] ;
// We first have to update the dom position of the actual currentItem
// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
if ( ! this . _noFinalSort && this . currentItem . parent ( ) . length ) {
this . placeholder . before ( this . currentItem ) ;
}
this . _noFinalSort = null ;
if ( this . helper [ 0 ] === this . currentItem [ 0 ] ) {
for ( i in this . _storedCSS ) {
if ( this . _storedCSS [ i ] === "auto" || this . _storedCSS [ i ] === "static" ) {
this . _storedCSS [ i ] = "" ;
}
}
this . currentItem . css ( this . _storedCSS ) . removeClass ( "ui-sortable-helper" ) ;
} else {
this . currentItem . show ( ) ;
}
if ( this . fromOutside && ! noPropagation ) {
delayedTriggers . push ( function ( event ) { this . _trigger ( "receive" , event , this . _uiHash ( this . fromOutside ) ) ; } ) ;
}
if ( ( this . fromOutside || this . domPosition . prev !== this . currentItem . prev ( ) . not ( ".ui-sortable-helper" ) [ 0 ] || this . domPosition . parent !== this . currentItem . parent ( ) [ 0 ] ) && ! noPropagation ) {
delayedTriggers . push ( function ( event ) { this . _trigger ( "update" , event , this . _uiHash ( ) ) ; } ) ; //Trigger update callback if the DOM position has changed
}
// Check if the items Container has Changed and trigger appropriate
// events.
if ( this !== this . currentContainer ) {
if ( ! noPropagation ) {
delayedTriggers . push ( function ( event ) { this . _trigger ( "remove" , event , this . _uiHash ( ) ) ; } ) ;
delayedTriggers . push ( ( function ( c ) { return function ( event ) { c . _trigger ( "receive" , event , this . _uiHash ( this ) ) ; } ; } ) . call ( this , this . currentContainer ) ) ;
delayedTriggers . push ( ( function ( c ) { return function ( event ) { c . _trigger ( "update" , event , this . _uiHash ( this ) ) ; } ; } ) . call ( this , this . currentContainer ) ) ;
}
}
//Post events to containers
2014-04-11 17:59:09 -04:00
function delayEvent ( type , instance , container ) {
return function ( event ) {
container . _trigger ( type , event , instance . _uiHash ( instance ) ) ;
} ;
}
2014-01-03 13:32:13 -05:00
for ( i = this . containers . length - 1 ; i >= 0 ; i -- ) {
2014-04-11 17:59:09 -04:00
if ( ! noPropagation ) {
delayedTriggers . push ( delayEvent ( "deactivate" , this , this . containers [ i ] ) ) ;
2014-01-03 13:32:13 -05:00
}
if ( this . containers [ i ] . containerCache . over ) {
2014-04-11 17:59:09 -04:00
delayedTriggers . push ( delayEvent ( "out" , this , this . containers [ i ] ) ) ;
2014-01-03 13:32:13 -05:00
this . containers [ i ] . containerCache . over = 0 ;
}
}
//Do what was originally in plugins
if ( this . storedCursor ) {
this . document . find ( "body" ) . css ( "cursor" , this . storedCursor ) ;
this . storedStylesheet . remove ( ) ;
}
if ( this . _storedOpacity ) {
this . helper . css ( "opacity" , this . _storedOpacity ) ;
}
if ( this . _storedZIndex ) {
this . helper . css ( "zIndex" , this . _storedZIndex === "auto" ? "" : this . _storedZIndex ) ;
}
this . dragging = false ;
if ( this . cancelHelperRemoval ) {
if ( ! noPropagation ) {
this . _trigger ( "beforeStop" , event , this . _uiHash ( ) ) ;
for ( i = 0 ; i < delayedTriggers . length ; i ++ ) {
delayedTriggers [ i ] . call ( this , event ) ;
} //Trigger all delayed events
this . _trigger ( "stop" , event , this . _uiHash ( ) ) ;
}
this . fromOutside = false ;
return false ;
}
if ( ! noPropagation ) {
this . _trigger ( "beforeStop" , event , this . _uiHash ( ) ) ;
}
//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
this . placeholder [ 0 ] . parentNode . removeChild ( this . placeholder [ 0 ] ) ;
if ( this . helper [ 0 ] !== this . currentItem [ 0 ] ) {
this . helper . remove ( ) ;
}
this . helper = null ;
if ( ! noPropagation ) {
for ( i = 0 ; i < delayedTriggers . length ; i ++ ) {
delayedTriggers [ i ] . call ( this , event ) ;
} //Trigger all delayed events
this . _trigger ( "stop" , event , this . _uiHash ( ) ) ;
}
this . fromOutside = false ;
return true ;
} ,
_trigger : function ( ) {
if ( $ . Widget . prototype . _trigger . apply ( this , arguments ) === false ) {
this . cancel ( ) ;
}
} ,
_uiHash : function ( _inst ) {
var inst = _inst || this ;
return {
helper : inst . helper ,
placeholder : inst . placeholder || $ ( [ ] ) ,
position : inst . position ,
originalPosition : inst . originalPosition ,
offset : inst . positionAbs ,
item : inst . currentItem ,
sender : _inst ? _inst . element : null
} ;
}
} ) ;
} ) ( jQuery ) ;
( function ( $ , undefined ) {
$ . widget ( "ui.autocomplete" , {
2014-04-11 17:59:09 -04:00
version : "1.10.4" ,
2014-01-03 13:32:13 -05:00
defaultElement : "<input>" ,
options : {
appendTo : null ,
autoFocus : false ,
delay : 300 ,
minLength : 1 ,
position : {
my : "left top" ,
at : "left bottom" ,
collision : "none"
} ,
source : null ,
// callbacks
change : null ,
close : null ,
focus : null ,
open : null ,
response : null ,
search : null ,
select : null
} ,
2014-04-11 17:59:09 -04:00
requestIndex : 0 ,
2014-01-03 13:32:13 -05:00
pending : 0 ,
_create : function ( ) {
// Some browsers only repeat keydown events, not keypress events,
// so we use the suppressKeyPress flag to determine if we've already
// handled the keydown event. #7269
// Unfortunately the code for & in keypress is the same as the up arrow,
// so we use the suppressKeyPressRepeat flag to avoid handling keypress
// events when we know the keydown event was used to modify the
// search term. #7799
var suppressKeyPress , suppressKeyPressRepeat , suppressInput ,
nodeName = this . element [ 0 ] . nodeName . toLowerCase ( ) ,
isTextarea = nodeName === "textarea" ,
isInput = nodeName === "input" ;
this . isMultiLine =
// Textareas are always multi-line
isTextarea ? true :
// Inputs are always single-line, even if inside a contentEditable element
// IE also treats inputs as contentEditable
isInput ? false :
// All other element types are determined by whether or not they're contentEditable
this . element . prop ( "isContentEditable" ) ;
this . valueMethod = this . element [ isTextarea || isInput ? "val" : "text" ] ;
this . isNewMenu = true ;
this . element
. addClass ( "ui-autocomplete-input" )
. attr ( "autocomplete" , "off" ) ;
this . _on ( this . element , {
keydown : function ( event ) {
if ( this . element . prop ( "readOnly" ) ) {
suppressKeyPress = true ;
suppressInput = true ;
suppressKeyPressRepeat = true ;
return ;
}
suppressKeyPress = false ;
suppressInput = false ;
suppressKeyPressRepeat = false ;
var keyCode = $ . ui . keyCode ;
switch ( event . keyCode ) {
case keyCode . PAGE _UP :
suppressKeyPress = true ;
this . _move ( "previousPage" , event ) ;
break ;
case keyCode . PAGE _DOWN :
suppressKeyPress = true ;
this . _move ( "nextPage" , event ) ;
break ;
case keyCode . UP :
suppressKeyPress = true ;
this . _keyEvent ( "previous" , event ) ;
break ;
case keyCode . DOWN :
suppressKeyPress = true ;
this . _keyEvent ( "next" , event ) ;
break ;
case keyCode . ENTER :
case keyCode . NUMPAD _ENTER :
// when menu is open and has focus
if ( this . menu . active ) {
// #6055 - Opera still allows the keypress to occur
// which causes forms to submit
suppressKeyPress = true ;
event . preventDefault ( ) ;
this . menu . select ( event ) ;
}
break ;
case keyCode . TAB :
if ( this . menu . active ) {
this . menu . select ( event ) ;
}
break ;
case keyCode . ESCAPE :
if ( this . menu . element . is ( ":visible" ) ) {
this . _value ( this . term ) ;
this . close ( event ) ;
// Different browsers have different default behavior for escape
// Single press can mean undo or clear
// Double press in IE means clear the whole form
event . preventDefault ( ) ;
}
break ;
default :
suppressKeyPressRepeat = true ;
// search timeout should be triggered before the input value is changed
this . _searchTimeout ( event ) ;
break ;
}
} ,
keypress : function ( event ) {
if ( suppressKeyPress ) {
suppressKeyPress = false ;
if ( ! this . isMultiLine || this . menu . element . is ( ":visible" ) ) {
event . preventDefault ( ) ;
}
return ;
}
if ( suppressKeyPressRepeat ) {
return ;
}
// replicate some key handlers to allow them to repeat in Firefox and Opera
var keyCode = $ . ui . keyCode ;
switch ( event . keyCode ) {
case keyCode . PAGE _UP :
this . _move ( "previousPage" , event ) ;
break ;
case keyCode . PAGE _DOWN :
this . _move ( "nextPage" , event ) ;
break ;
case keyCode . UP :
this . _keyEvent ( "previous" , event ) ;
break ;
case keyCode . DOWN :
this . _keyEvent ( "next" , event ) ;
break ;
}
} ,
input : function ( event ) {
if ( suppressInput ) {
suppressInput = false ;
event . preventDefault ( ) ;
return ;
}
this . _searchTimeout ( event ) ;
} ,
focus : function ( ) {
this . selectedItem = null ;
this . previous = this . _value ( ) ;
} ,
blur : function ( event ) {
if ( this . cancelBlur ) {
delete this . cancelBlur ;
return ;
}
clearTimeout ( this . searching ) ;
this . close ( event ) ;
this . _change ( event ) ;
}
} ) ;
this . _initSource ( ) ;
this . menu = $ ( "<ul>" )
. addClass ( "ui-autocomplete ui-front" )
. appendTo ( this . _appendTo ( ) )
. menu ( {
// disable ARIA support, the live region takes care of that
role : null
} )
. hide ( )
. data ( "ui-menu" ) ;
this . _on ( this . menu . element , {
mousedown : function ( event ) {
// prevent moving focus out of the text field
event . preventDefault ( ) ;
// IE doesn't prevent moving focus even with event.preventDefault()
// so we set a flag to know when we should ignore the blur event
this . cancelBlur = true ;
this . _delay ( function ( ) {
delete this . cancelBlur ;
} ) ;
// clicking on the scrollbar causes focus to shift to the body
// but we can't detect a mouseup or a click immediately afterward
// so we have to track the next mousedown and close the menu if
// the user clicks somewhere outside of the autocomplete
var menuElement = this . menu . element [ 0 ] ;
if ( ! $ ( event . target ) . closest ( ".ui-menu-item" ) . length ) {
this . _delay ( function ( ) {
var that = this ;
this . document . one ( "mousedown" , function ( event ) {
if ( event . target !== that . element [ 0 ] &&
event . target !== menuElement &&
! $ . contains ( menuElement , event . target ) ) {
that . close ( ) ;
}
} ) ;
} ) ;
}
} ,
menufocus : function ( event , ui ) {
// support: Firefox
// Prevent accidental activation of menu items in Firefox (#7024 #9118)
if ( this . isNewMenu ) {
this . isNewMenu = false ;
if ( event . originalEvent && /^mouse/ . test ( event . originalEvent . type ) ) {
this . menu . blur ( ) ;
this . document . one ( "mousemove" , function ( ) {
$ ( event . target ) . trigger ( event . originalEvent ) ;
} ) ;
return ;
}
}
var item = ui . item . data ( "ui-autocomplete-item" ) ;
if ( false !== this . _trigger ( "focus" , event , { item : item } ) ) {
// use value to match what will end up in the input, if it was a key event
if ( event . originalEvent && /^key/ . test ( event . originalEvent . type ) ) {
this . _value ( item . value ) ;
}
} else {
// Normally the input is populated with the item's value as the
// menu is navigated, causing screen readers to notice a change and
// announce the item. Since the focus event was canceled, this doesn't
// happen, so we update the live region so that screen readers can
// still notice the change and announce it.
this . liveRegion . text ( item . value ) ;
}
} ,
menuselect : function ( event , ui ) {
var item = ui . item . data ( "ui-autocomplete-item" ) ,
previous = this . previous ;
// only trigger when focus was lost (click on menu)
if ( this . element [ 0 ] !== this . document [ 0 ] . activeElement ) {
this . element . focus ( ) ;
this . previous = previous ;
// #6109 - IE triggers two focus events and the second
// is asynchronous, so we need to reset the previous
// term synchronously and asynchronously :-(
this . _delay ( function ( ) {
this . previous = previous ;
this . selectedItem = item ;
} ) ;
}
if ( false !== this . _trigger ( "select" , event , { item : item } ) ) {
this . _value ( item . value ) ;
}
// reset the term after the select event
// this allows custom select handling to work properly
this . term = this . _value ( ) ;
this . close ( event ) ;
this . selectedItem = item ;
}
} ) ;
this . liveRegion = $ ( "<span>" , {
role : "status" ,
"aria-live" : "polite"
} )
. addClass ( "ui-helper-hidden-accessible" )
. insertBefore ( this . element ) ;
// turning off autocomplete prevents the browser from remembering the
// value when navigating through history, so we re-enable autocomplete
// if the page is unloaded before the widget is destroyed. #7790
this . _on ( this . window , {
beforeunload : function ( ) {
this . element . removeAttr ( "autocomplete" ) ;
}
} ) ;
} ,
_destroy : function ( ) {
clearTimeout ( this . searching ) ;
this . element
. removeClass ( "ui-autocomplete-input" )
. removeAttr ( "autocomplete" ) ;
this . menu . element . remove ( ) ;
this . liveRegion . remove ( ) ;
} ,
_setOption : function ( key , value ) {
this . _super ( key , value ) ;
if ( key === "source" ) {
this . _initSource ( ) ;
}
if ( key === "appendTo" ) {
this . menu . element . appendTo ( this . _appendTo ( ) ) ;
}
if ( key === "disabled" && value && this . xhr ) {
this . xhr . abort ( ) ;
}
} ,
_appendTo : function ( ) {
var element = this . options . appendTo ;
if ( element ) {
element = element . jquery || element . nodeType ?
$ ( element ) :
this . document . find ( element ) . eq ( 0 ) ;
}
if ( ! element ) {
element = this . element . closest ( ".ui-front" ) ;
}
if ( ! element . length ) {
element = this . document [ 0 ] . body ;
}
return element ;
} ,
_initSource : function ( ) {
var array , url ,
that = this ;
if ( $ . isArray ( this . options . source ) ) {
array = this . options . source ;
this . source = function ( request , response ) {
response ( $ . ui . autocomplete . filter ( array , request . term ) ) ;
} ;
} else if ( typeof this . options . source === "string" ) {
url = this . options . source ;
this . source = function ( request , response ) {
if ( that . xhr ) {
that . xhr . abort ( ) ;
}
that . xhr = $ . ajax ( {
url : url ,
data : request ,
dataType : "json" ,
success : function ( data ) {
response ( data ) ;
} ,
error : function ( ) {
response ( [ ] ) ;
}
} ) ;
} ;
} else {
this . source = this . options . source ;
}
} ,
_searchTimeout : function ( event ) {
clearTimeout ( this . searching ) ;
this . searching = this . _delay ( function ( ) {
// only search if the value has changed
if ( this . term !== this . _value ( ) ) {
this . selectedItem = null ;
this . search ( null , event ) ;
}
} , this . options . delay ) ;
} ,
search : function ( value , event ) {
value = value != null ? value : this . _value ( ) ;
// always save the actual value, not the one passed as an argument
this . term = this . _value ( ) ;
if ( value . length < this . options . minLength ) {
return this . close ( event ) ;
}
if ( this . _trigger ( "search" , event ) === false ) {
return ;
}
return this . _search ( value ) ;
} ,
_search : function ( value ) {
this . pending ++ ;
this . element . addClass ( "ui-autocomplete-loading" ) ;
this . cancelSearch = false ;
this . source ( { term : value } , this . _response ( ) ) ;
} ,
_response : function ( ) {
2014-04-11 17:59:09 -04:00
var index = ++ this . requestIndex ;
2014-01-03 13:32:13 -05:00
2014-04-11 17:59:09 -04:00
return $ . proxy ( function ( content ) {
if ( index === this . requestIndex ) {
this . _ _response ( content ) ;
2014-01-03 13:32:13 -05:00
}
2014-04-11 17:59:09 -04:00
this . pending -- ;
if ( ! this . pending ) {
this . element . removeClass ( "ui-autocomplete-loading" ) ;
2014-01-03 13:32:13 -05:00
}
2014-04-11 17:59:09 -04:00
} , this ) ;
2014-01-03 13:32:13 -05:00
} ,
_ _response : function ( content ) {
if ( content ) {
content = this . _normalize ( content ) ;
}
this . _trigger ( "response" , null , { content : content } ) ;
if ( ! this . options . disabled && content && content . length && ! this . cancelSearch ) {
this . _suggest ( content ) ;
this . _trigger ( "open" ) ;
} else {
// use ._close() instead of .close() so we don't cancel future searches
this . _close ( ) ;
}
} ,
close : function ( event ) {
this . cancelSearch = true ;
this . _close ( event ) ;
} ,
_close : function ( event ) {
if ( this . menu . element . is ( ":visible" ) ) {
this . menu . element . hide ( ) ;
this . menu . blur ( ) ;
this . isNewMenu = true ;
this . _trigger ( "close" , event ) ;
}
} ,
_change : function ( event ) {
if ( this . previous !== this . _value ( ) ) {
this . _trigger ( "change" , event , { item : this . selectedItem } ) ;
}
} ,
_normalize : function ( items ) {
// assume all items have the right format when the first item is complete
if ( items . length && items [ 0 ] . label && items [ 0 ] . value ) {
return items ;
}
return $ . map ( items , function ( item ) {
if ( typeof item === "string" ) {
return {
label : item ,
value : item
} ;
}
return $ . extend ( {
label : item . label || item . value ,
value : item . value || item . label
} , item ) ;
} ) ;
} ,
_suggest : function ( items ) {
var ul = this . menu . element . empty ( ) ;
this . _renderMenu ( ul , items ) ;
this . isNewMenu = true ;
this . menu . refresh ( ) ;
// size and position menu
ul . show ( ) ;
this . _resizeMenu ( ) ;
ul . position ( $ . extend ( {
of : this . element
} , this . options . position ) ) ;
if ( this . options . autoFocus ) {
this . menu . next ( ) ;
}
} ,
_resizeMenu : function ( ) {
var ul = this . menu . element ;
ul . outerWidth ( Math . max (
// Firefox wraps long text (possibly a rounding bug)
// so we add 1px to avoid the wrapping (#7513)
ul . width ( "" ) . outerWidth ( ) + 1 ,
this . element . outerWidth ( )
) ) ;
} ,
_renderMenu : function ( ul , items ) {
var that = this ;
$ . each ( items , function ( index , item ) {
that . _renderItemData ( ul , item ) ;
} ) ;
} ,
_renderItemData : function ( ul , item ) {
return this . _renderItem ( ul , item ) . data ( "ui-autocomplete-item" , item ) ;
} ,
_renderItem : function ( ul , item ) {
return $ ( "<li>" )
. append ( $ ( "<a>" ) . text ( item . label ) )
. appendTo ( ul ) ;
} ,
_move : function ( direction , event ) {
if ( ! this . menu . element . is ( ":visible" ) ) {
this . search ( null , event ) ;
return ;
}
if ( this . menu . isFirstItem ( ) && /^previous/ . test ( direction ) ||
this . menu . isLastItem ( ) && /^next/ . test ( direction ) ) {
this . _value ( this . term ) ;
this . menu . blur ( ) ;
return ;
}
this . menu [ direction ] ( event ) ;
} ,
widget : function ( ) {
return this . menu . element ;
} ,
_value : function ( ) {
return this . valueMethod . apply ( this . element , arguments ) ;
} ,
_keyEvent : function ( keyEvent , event ) {
if ( ! this . isMultiLine || this . menu . element . is ( ":visible" ) ) {
this . _move ( keyEvent , event ) ;
// prevents moving cursor to beginning/end of the text field in some browsers
event . preventDefault ( ) ;
}
}
} ) ;
$ . extend ( $ . ui . autocomplete , {
escapeRegex : function ( value ) {
return value . replace ( /[\-\[\]{}()*+?.,\\\^$|#\s]/g , "\\$&" ) ;
} ,
filter : function ( array , term ) {
var matcher = new RegExp ( $ . ui . autocomplete . escapeRegex ( term ) , "i" ) ;
return $ . grep ( array , function ( value ) {
return matcher . test ( value . label || value . value || value ) ;
} ) ;
}
} ) ;
// live region extension, adding a `messages` option
// NOTE: This is an experimental API. We are still investigating
// a full solution for string manipulation and internationalization.
$ . widget ( "ui.autocomplete" , $ . ui . autocomplete , {
options : {
messages : {
noResults : "No search results." ,
results : function ( amount ) {
return amount + ( amount > 1 ? " results are" : " result is" ) +
" available, use up and down arrow keys to navigate." ;
}
}
} ,
_ _response : function ( content ) {
var message ;
this . _superApply ( arguments ) ;
if ( this . options . disabled || this . cancelSearch ) {
return ;
}
if ( content && content . length ) {
message = this . options . messages . results ( content . length ) ;
} else {
message = this . options . messages . noResults ;
}
this . liveRegion . text ( message ) ;
}
} ) ;
} ( jQuery ) ) ;
( function ( $ , undefined ) {
$ . widget ( "ui.menu" , {
2014-04-11 17:59:09 -04:00
version : "1.10.4" ,
2014-01-03 13:32:13 -05:00
defaultElement : "<ul>" ,
delay : 300 ,
options : {
icons : {
submenu : "ui-icon-carat-1-e"
} ,
menus : "ul" ,
position : {
my : "left top" ,
at : "right top"
} ,
role : "menu" ,
// callbacks
blur : null ,
focus : null ,
select : null
} ,
_create : function ( ) {
this . activeMenu = this . element ;
// flag used to prevent firing of the click handler
// as the event bubbles up through nested menus
this . mouseHandled = false ;
this . element
. uniqueId ( )
. addClass ( "ui-menu ui-widget ui-widget-content ui-corner-all" )
. toggleClass ( "ui-menu-icons" , ! ! this . element . find ( ".ui-icon" ) . length )
. attr ( {
role : this . options . role ,
tabIndex : 0
} )
// need to catch all clicks on disabled menu
// not possible through _on
. bind ( "click" + this . eventNamespace , $ . proxy ( function ( event ) {
if ( this . options . disabled ) {
event . preventDefault ( ) ;
}
} , this ) ) ;
if ( this . options . disabled ) {
this . element
. addClass ( "ui-state-disabled" )
. attr ( "aria-disabled" , "true" ) ;
}
this . _on ( {
// Prevent focus from sticking to links inside menu after clicking
// them (focus should always stay on UL during navigation).
"mousedown .ui-menu-item > a" : function ( event ) {
event . preventDefault ( ) ;
} ,
"click .ui-state-disabled > a" : function ( event ) {
event . preventDefault ( ) ;
} ,
"click .ui-menu-item:has(a)" : function ( event ) {
var target = $ ( event . target ) . closest ( ".ui-menu-item" ) ;
if ( ! this . mouseHandled && target . not ( ".ui-state-disabled" ) . length ) {
this . select ( event ) ;
2014-04-11 17:59:09 -04:00
// Only set the mouseHandled flag if the event will bubble, see #9469.
if ( ! event . isPropagationStopped ( ) ) {
this . mouseHandled = true ;
}
2014-01-03 13:32:13 -05:00
// Open submenu on click
if ( target . has ( ".ui-menu" ) . length ) {
this . expand ( event ) ;
2014-04-11 17:59:09 -04:00
} else if ( ! this . element . is ( ":focus" ) && $ ( this . document [ 0 ] . activeElement ) . closest ( ".ui-menu" ) . length ) {
2014-01-03 13:32:13 -05:00
// Redirect focus to the menu
this . element . trigger ( "focus" , [ true ] ) ;
// If the active item is on the top level, let it stay active.
// Otherwise, blur the active item since it is no longer visible.
if ( this . active && this . active . parents ( ".ui-menu" ) . length === 1 ) {
clearTimeout ( this . timer ) ;
}
}
}
} ,
"mouseenter .ui-menu-item" : function ( event ) {
var target = $ ( event . currentTarget ) ;
// Remove ui-state-active class from siblings of the newly focused menu item
// to avoid a jump caused by adjacent elements both having a class with a border
target . siblings ( ) . children ( ".ui-state-active" ) . removeClass ( "ui-state-active" ) ;
this . focus ( event , target ) ;
} ,
mouseleave : "collapseAll" ,
"mouseleave .ui-menu" : "collapseAll" ,
focus : function ( event , keepActiveItem ) {
// If there's already an active item, keep it active
// If not, activate the first item
var item = this . active || this . element . children ( ".ui-menu-item" ) . eq ( 0 ) ;
if ( ! keepActiveItem ) {
this . focus ( event , item ) ;
}
} ,
blur : function ( event ) {
this . _delay ( function ( ) {
if ( ! $ . contains ( this . element [ 0 ] , this . document [ 0 ] . activeElement ) ) {
this . collapseAll ( event ) ;
}
} ) ;
} ,
keydown : "_keydown"
} ) ;
this . refresh ( ) ;
// Clicks outside of a menu collapse any open menus
this . _on ( this . document , {
click : function ( event ) {
if ( ! $ ( event . target ) . closest ( ".ui-menu" ) . length ) {
this . collapseAll ( event ) ;
}
// Reset the mouseHandled flag
this . mouseHandled = false ;
}
} ) ;
} ,
_destroy : function ( ) {
// Destroy (sub)menus
this . element
. removeAttr ( "aria-activedescendant" )
. find ( ".ui-menu" ) . addBack ( )
. removeClass ( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
. removeAttr ( "role" )
. removeAttr ( "tabIndex" )
. removeAttr ( "aria-labelledby" )
. removeAttr ( "aria-expanded" )
. removeAttr ( "aria-hidden" )
. removeAttr ( "aria-disabled" )
. removeUniqueId ( )
. show ( ) ;
// Destroy menu items
this . element . find ( ".ui-menu-item" )
. removeClass ( "ui-menu-item" )
. removeAttr ( "role" )
. removeAttr ( "aria-disabled" )
. children ( "a" )
. removeUniqueId ( )
. removeClass ( "ui-corner-all ui-state-hover" )
. removeAttr ( "tabIndex" )
. removeAttr ( "role" )
. removeAttr ( "aria-haspopup" )
. children ( ) . each ( function ( ) {
var elem = $ ( this ) ;
if ( elem . data ( "ui-menu-submenu-carat" ) ) {
elem . remove ( ) ;
}
} ) ;
// Destroy menu dividers
this . element . find ( ".ui-menu-divider" ) . removeClass ( "ui-menu-divider ui-widget-content" ) ;
} ,
_keydown : function ( event ) {
var match , prev , character , skip , regex ,
preventDefault = true ;
function escape ( value ) {
return value . replace ( /[\-\[\]{}()*+?.,\\\^$|#\s]/g , "\\$&" ) ;
}
switch ( event . keyCode ) {
case $ . ui . keyCode . PAGE _UP :
this . previousPage ( event ) ;
break ;
case $ . ui . keyCode . PAGE _DOWN :
this . nextPage ( event ) ;
break ;
case $ . ui . keyCode . HOME :
this . _move ( "first" , "first" , event ) ;
break ;
case $ . ui . keyCode . END :
this . _move ( "last" , "last" , event ) ;
break ;
case $ . ui . keyCode . UP :
this . previous ( event ) ;
break ;
case $ . ui . keyCode . DOWN :
this . next ( event ) ;
break ;
case $ . ui . keyCode . LEFT :
this . collapse ( event ) ;
break ;
case $ . ui . keyCode . RIGHT :
if ( this . active && ! this . active . is ( ".ui-state-disabled" ) ) {
this . expand ( event ) ;
}
break ;
case $ . ui . keyCode . ENTER :
case $ . ui . keyCode . SPACE :
this . _activate ( event ) ;
break ;
case $ . ui . keyCode . ESCAPE :
this . collapse ( event ) ;
break ;
default :
preventDefault = false ;
prev = this . previousFilter || "" ;
character = String . fromCharCode ( event . keyCode ) ;
skip = false ;
clearTimeout ( this . filterTimer ) ;
if ( character === prev ) {
skip = true ;
} else {
character = prev + character ;
}
regex = new RegExp ( "^" + escape ( character ) , "i" ) ;
match = this . activeMenu . children ( ".ui-menu-item" ) . filter ( function ( ) {
return regex . test ( $ ( this ) . children ( "a" ) . text ( ) ) ;
} ) ;
match = skip && match . index ( this . active . next ( ) ) !== - 1 ?
this . active . nextAll ( ".ui-menu-item" ) :
match ;
// If no matches on the current filter, reset to the last character pressed
// to move down the menu to the first item that starts with that character
if ( ! match . length ) {
character = String . fromCharCode ( event . keyCode ) ;
regex = new RegExp ( "^" + escape ( character ) , "i" ) ;
match = this . activeMenu . children ( ".ui-menu-item" ) . filter ( function ( ) {
return regex . test ( $ ( this ) . children ( "a" ) . text ( ) ) ;
} ) ;
}
if ( match . length ) {
this . focus ( event , match ) ;
if ( match . length > 1 ) {
this . previousFilter = character ;
this . filterTimer = this . _delay ( function ( ) {
delete this . previousFilter ;
} , 1000 ) ;
} else {
delete this . previousFilter ;
}
} else {
delete this . previousFilter ;
}
}
if ( preventDefault ) {
event . preventDefault ( ) ;
}
} ,
_activate : function ( event ) {
if ( ! this . active . is ( ".ui-state-disabled" ) ) {
if ( this . active . children ( "a[aria-haspopup='true']" ) . length ) {
this . expand ( event ) ;
} else {
this . select ( event ) ;
}
}
} ,
refresh : function ( ) {
var menus ,
icon = this . options . icons . submenu ,
submenus = this . element . find ( this . options . menus ) ;
2014-04-11 17:59:09 -04:00
this . element . toggleClass ( "ui-menu-icons" , ! ! this . element . find ( ".ui-icon" ) . length ) ;
2014-01-03 13:32:13 -05:00
// Initialize nested menus
submenus . filter ( ":not(.ui-menu)" )
. addClass ( "ui-menu ui-widget ui-widget-content ui-corner-all" )
. hide ( )
. attr ( {
role : this . options . role ,
"aria-hidden" : "true" ,
"aria-expanded" : "false"
} )
. each ( function ( ) {
var menu = $ ( this ) ,
item = menu . prev ( "a" ) ,
submenuCarat = $ ( "<span>" )
. addClass ( "ui-menu-icon ui-icon " + icon )
. data ( "ui-menu-submenu-carat" , true ) ;
item
. attr ( "aria-haspopup" , "true" )
. prepend ( submenuCarat ) ;
menu . attr ( "aria-labelledby" , item . attr ( "id" ) ) ;
} ) ;
menus = submenus . add ( this . element ) ;
// Don't refresh list items that are already adapted
menus . children ( ":not(.ui-menu-item):has(a)" )
. addClass ( "ui-menu-item" )
. attr ( "role" , "presentation" )
. children ( "a" )
. uniqueId ( )
. addClass ( "ui-corner-all" )
. attr ( {
tabIndex : - 1 ,
role : this . _itemRole ( )
} ) ;
// Initialize unlinked menu-items containing spaces and/or dashes only as dividers
menus . children ( ":not(.ui-menu-item)" ) . each ( function ( ) {
var item = $ ( this ) ;
// hyphen, em dash, en dash
if ( ! /[^\-\u2014\u2013\s]/ . test ( item . text ( ) ) ) {
item . addClass ( "ui-widget-content ui-menu-divider" ) ;
}
} ) ;
// Add aria-disabled attribute to any disabled menu item
menus . children ( ".ui-state-disabled" ) . attr ( "aria-disabled" , "true" ) ;
// If the active item has been removed, blur the menu
if ( this . active && ! $ . contains ( this . element [ 0 ] , this . active [ 0 ] ) ) {
this . blur ( ) ;
}
} ,
_itemRole : function ( ) {
return {
menu : "menuitem" ,
listbox : "option"
} [ this . options . role ] ;
} ,
_setOption : function ( key , value ) {
if ( key === "icons" ) {
this . element . find ( ".ui-menu-icon" )
. removeClass ( this . options . icons . submenu )
. addClass ( value . submenu ) ;
}
this . _super ( key , value ) ;
} ,
focus : function ( event , item ) {
var nested , focused ;
this . blur ( event , event && event . type === "focus" ) ;
this . _scrollIntoView ( item ) ;
this . active = item . first ( ) ;
focused = this . active . children ( "a" ) . addClass ( "ui-state-focus" ) ;
// Only update aria-activedescendant if there's a role
// otherwise we assume focus is managed elsewhere
if ( this . options . role ) {
this . element . attr ( "aria-activedescendant" , focused . attr ( "id" ) ) ;
}
// Highlight active parent menu item, if any
this . active
. parent ( )
. closest ( ".ui-menu-item" )
. children ( "a:first" )
. addClass ( "ui-state-active" ) ;
if ( event && event . type === "keydown" ) {
this . _close ( ) ;
} else {
this . timer = this . _delay ( function ( ) {
this . _close ( ) ;
} , this . delay ) ;
}
nested = item . children ( ".ui-menu" ) ;
2014-04-11 17:59:09 -04:00
if ( nested . length && event && ( /^mouse/ . test ( event . type ) ) ) {
2014-01-03 13:32:13 -05:00
this . _startOpening ( nested ) ;
}
this . activeMenu = item . parent ( ) ;
this . _trigger ( "focus" , event , { item : item } ) ;
} ,
_scrollIntoView : function ( item ) {
var borderTop , paddingTop , offset , scroll , elementHeight , itemHeight ;
if ( this . _hasScroll ( ) ) {
borderTop = parseFloat ( $ . css ( this . activeMenu [ 0 ] , "borderTopWidth" ) ) || 0 ;
paddingTop = parseFloat ( $ . css ( this . activeMenu [ 0 ] , "paddingTop" ) ) || 0 ;
offset = item . offset ( ) . top - this . activeMenu . offset ( ) . top - borderTop - paddingTop ;
scroll = this . activeMenu . scrollTop ( ) ;
elementHeight = this . activeMenu . height ( ) ;
itemHeight = item . height ( ) ;
if ( offset < 0 ) {
this . activeMenu . scrollTop ( scroll + offset ) ;
} else if ( offset + itemHeight > elementHeight ) {
this . activeMenu . scrollTop ( scroll + offset - elementHeight + itemHeight ) ;
}
}
} ,
blur : function ( event , fromFocus ) {
if ( ! fromFocus ) {
clearTimeout ( this . timer ) ;
}
if ( ! this . active ) {
return ;
}
this . active . children ( "a" ) . removeClass ( "ui-state-focus" ) ;
this . active = null ;
this . _trigger ( "blur" , event , { item : this . active } ) ;
} ,
_startOpening : function ( submenu ) {
clearTimeout ( this . timer ) ;
// Don't open if already open fixes a Firefox bug that caused a .5 pixel
// shift in the submenu position when mousing over the carat icon
if ( submenu . attr ( "aria-hidden" ) !== "true" ) {
return ;
}
this . timer = this . _delay ( function ( ) {
this . _close ( ) ;
this . _open ( submenu ) ;
} , this . delay ) ;
} ,
_open : function ( submenu ) {
var position = $ . extend ( {
of : this . active
} , this . options . position ) ;
clearTimeout ( this . timer ) ;
this . element . find ( ".ui-menu" ) . not ( submenu . parents ( ".ui-menu" ) )
. hide ( )
. attr ( "aria-hidden" , "true" ) ;
submenu
. show ( )
. removeAttr ( "aria-hidden" )
. attr ( "aria-expanded" , "true" )
. position ( position ) ;
} ,
collapseAll : function ( event , all ) {
clearTimeout ( this . timer ) ;
this . timer = this . _delay ( function ( ) {
// If we were passed an event, look for the submenu that contains the event
var currentMenu = all ? this . element :
$ ( event && event . target ) . closest ( this . element . find ( ".ui-menu" ) ) ;
// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
if ( ! currentMenu . length ) {
currentMenu = this . element ;
}
this . _close ( currentMenu ) ;
this . blur ( event ) ;
this . activeMenu = currentMenu ;
} , this . delay ) ;
} ,
// With no arguments, closes the currently active menu - if nothing is active
// it closes all menus. If passed an argument, it will search for menus BELOW
_close : function ( startMenu ) {
if ( ! startMenu ) {
startMenu = this . active ? this . active . parent ( ) : this . element ;
}
startMenu
. find ( ".ui-menu" )
. hide ( )
. attr ( "aria-hidden" , "true" )
. attr ( "aria-expanded" , "false" )
. end ( )
. find ( "a.ui-state-active" )
. removeClass ( "ui-state-active" ) ;
} ,
collapse : function ( event ) {
var newItem = this . active &&
this . active . parent ( ) . closest ( ".ui-menu-item" , this . element ) ;
if ( newItem && newItem . length ) {
this . _close ( ) ;
this . focus ( event , newItem ) ;
}
} ,
expand : function ( event ) {
var newItem = this . active &&
this . active
. children ( ".ui-menu " )
. children ( ".ui-menu-item" )
. first ( ) ;
if ( newItem && newItem . length ) {
this . _open ( newItem . parent ( ) ) ;
// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
this . _delay ( function ( ) {
this . focus ( event , newItem ) ;
} ) ;
}
} ,
next : function ( event ) {
this . _move ( "next" , "first" , event ) ;
} ,
previous : function ( event ) {
this . _move ( "prev" , "last" , event ) ;
} ,
isFirstItem : function ( ) {
return this . active && ! this . active . prevAll ( ".ui-menu-item" ) . length ;
} ,
isLastItem : function ( ) {
return this . active && ! this . active . nextAll ( ".ui-menu-item" ) . length ;
} ,
_move : function ( direction , filter , event ) {
var next ;
if ( this . active ) {
if ( direction === "first" || direction === "last" ) {
next = this . active
[ direction === "first" ? "prevAll" : "nextAll" ] ( ".ui-menu-item" )
. eq ( - 1 ) ;
} else {
next = this . active
[ direction + "All" ] ( ".ui-menu-item" )
. eq ( 0 ) ;
}
}
if ( ! next || ! next . length || ! this . active ) {
next = this . activeMenu . children ( ".ui-menu-item" ) [ filter ] ( ) ;
}
this . focus ( event , next ) ;
} ,
nextPage : function ( event ) {
var item , base , height ;
if ( ! this . active ) {
this . next ( event ) ;
return ;
}
if ( this . isLastItem ( ) ) {
return ;
}
if ( this . _hasScroll ( ) ) {
base = this . active . offset ( ) . top ;
height = this . element . height ( ) ;
this . active . nextAll ( ".ui-menu-item" ) . each ( function ( ) {
item = $ ( this ) ;
return item . offset ( ) . top - base - height < 0 ;
} ) ;
this . focus ( event , item ) ;
} else {
this . focus ( event , this . activeMenu . children ( ".ui-menu-item" )
[ ! this . active ? "first" : "last" ] ( ) ) ;
}
} ,
previousPage : function ( event ) {
var item , base , height ;
if ( ! this . active ) {
this . next ( event ) ;
return ;
}
if ( this . isFirstItem ( ) ) {
return ;
}
if ( this . _hasScroll ( ) ) {
base = this . active . offset ( ) . top ;
height = this . element . height ( ) ;
this . active . prevAll ( ".ui-menu-item" ) . each ( function ( ) {
item = $ ( this ) ;
return item . offset ( ) . top - base + height > 0 ;
} ) ;
this . focus ( event , item ) ;
} else {
this . focus ( event , this . activeMenu . children ( ".ui-menu-item" ) . first ( ) ) ;
}
} ,
_hasScroll : function ( ) {
return this . element . outerHeight ( ) < this . element . prop ( "scrollHeight" ) ;
} ,
select : function ( event ) {
// TODO: It should never be possible to not have an active item at this
// point, but the tests don't trigger mouseenter before click.
this . active = this . active || $ ( event . target ) . closest ( ".ui-menu-item" ) ;
var ui = { item : this . active } ;
if ( ! this . active . has ( ".ui-menu" ) . length ) {
this . collapseAll ( event , true ) ;
}
this . _trigger ( "select" , event , ui ) ;
}
} ) ;
} ( jQuery ) ) ;
( function ( $ , undefined ) {
// number of pages in a slider
// (how many times can you page up/down to go through the whole range)
var numPages = 5 ;
$ . widget ( "ui.slider" , $ . ui . mouse , {
2014-04-11 17:59:09 -04:00
version : "1.10.4" ,
2014-01-03 13:32:13 -05:00
widgetEventPrefix : "slide" ,
options : {
animate : false ,
distance : 0 ,
max : 100 ,
min : 0 ,
orientation : "horizontal" ,
range : false ,
step : 1 ,
value : 0 ,
values : null ,
// callbacks
change : null ,
slide : null ,
start : null ,
stop : null
} ,
_create : function ( ) {
this . _keySliding = false ;
this . _mouseSliding = false ;
this . _animateOff = true ;
this . _handleIndex = null ;
this . _detectOrientation ( ) ;
this . _mouseInit ( ) ;
this . element
. addClass ( "ui-slider" +
" ui-slider-" + this . orientation +
" ui-widget" +
" ui-widget-content" +
" ui-corner-all" ) ;
this . _refresh ( ) ;
this . _setOption ( "disabled" , this . options . disabled ) ;
this . _animateOff = false ;
} ,
_refresh : function ( ) {
this . _createRange ( ) ;
this . _createHandles ( ) ;
this . _setupEvents ( ) ;
this . _refreshValue ( ) ;
} ,
_createHandles : function ( ) {
var i , handleCount ,
options = this . options ,
existingHandles = this . element . find ( ".ui-slider-handle" ) . addClass ( "ui-state-default ui-corner-all" ) ,
handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>" ,
handles = [ ] ;
handleCount = ( options . values && options . values . length ) || 1 ;
if ( existingHandles . length > handleCount ) {
existingHandles . slice ( handleCount ) . remove ( ) ;
existingHandles = existingHandles . slice ( 0 , handleCount ) ;
}
for ( i = existingHandles . length ; i < handleCount ; i ++ ) {
handles . push ( handle ) ;
}
this . handles = existingHandles . add ( $ ( handles . join ( "" ) ) . appendTo ( this . element ) ) ;
this . handle = this . handles . eq ( 0 ) ;
this . handles . each ( function ( i ) {
$ ( this ) . data ( "ui-slider-handle-index" , i ) ;
} ) ;
} ,
_createRange : function ( ) {
var options = this . options ,
classes = "" ;
if ( options . range ) {
if ( options . range === true ) {
if ( ! options . values ) {
options . values = [ this . _valueMin ( ) , this . _valueMin ( ) ] ;
} else if ( options . values . length && options . values . length !== 2 ) {
options . values = [ options . values [ 0 ] , options . values [ 0 ] ] ;
} else if ( $ . isArray ( options . values ) ) {
options . values = options . values . slice ( 0 ) ;
}
}
if ( ! this . range || ! this . range . length ) {
this . range = $ ( "<div></div>" )
. appendTo ( this . element ) ;
classes = "ui-slider-range" +
// note: this isn't the most fittingly semantic framework class for this element,
// but worked best visually with a variety of themes
" ui-widget-header ui-corner-all" ;
} else {
this . range . removeClass ( "ui-slider-range-min ui-slider-range-max" )
// Handle range switching from true to min/max
. css ( {
"left" : "" ,
"bottom" : ""
} ) ;
}
this . range . addClass ( classes +
( ( options . range === "min" || options . range === "max" ) ? " ui-slider-range-" + options . range : "" ) ) ;
} else {
2014-04-11 17:59:09 -04:00
if ( this . range ) {
this . range . remove ( ) ;
}
this . range = null ;
2014-01-03 13:32:13 -05:00
}
} ,
_setupEvents : function ( ) {
var elements = this . handles . add ( this . range ) . filter ( "a" ) ;
this . _off ( elements ) ;
this . _on ( elements , this . _handleEvents ) ;
this . _hoverable ( elements ) ;
this . _focusable ( elements ) ;
} ,
_destroy : function ( ) {
this . handles . remove ( ) ;
2014-04-11 17:59:09 -04:00
if ( this . range ) {
this . range . remove ( ) ;
}
2014-01-03 13:32:13 -05:00
this . element
. removeClass ( "ui-slider" +
" ui-slider-horizontal" +
" ui-slider-vertical" +
" ui-widget" +
" ui-widget-content" +
" ui-corner-all" ) ;
this . _mouseDestroy ( ) ;
} ,
_mouseCapture : function ( event ) {
var position , normValue , distance , closestHandle , index , allowed , offset , mouseOverHandle ,
that = this ,
o = this . options ;
if ( o . disabled ) {
return false ;
}
this . elementSize = {
width : this . element . outerWidth ( ) ,
height : this . element . outerHeight ( )
} ;
this . elementOffset = this . element . offset ( ) ;
position = { x : event . pageX , y : event . pageY } ;
normValue = this . _normValueFromMouse ( position ) ;
distance = this . _valueMax ( ) - this . _valueMin ( ) + 1 ;
this . handles . each ( function ( i ) {
var thisDistance = Math . abs ( normValue - that . values ( i ) ) ;
if ( ( distance > thisDistance ) ||
( distance === thisDistance &&
( i === that . _lastChangedValue || that . values ( i ) === o . min ) ) ) {
distance = thisDistance ;
closestHandle = $ ( this ) ;
index = i ;
}
} ) ;
allowed = this . _start ( event , index ) ;
if ( allowed === false ) {
return false ;
}
this . _mouseSliding = true ;
this . _handleIndex = index ;
closestHandle
. addClass ( "ui-state-active" )
. focus ( ) ;
offset = closestHandle . offset ( ) ;
mouseOverHandle = ! $ ( event . target ) . parents ( ) . addBack ( ) . is ( ".ui-slider-handle" ) ;
this . _clickOffset = mouseOverHandle ? { left : 0 , top : 0 } : {
left : event . pageX - offset . left - ( closestHandle . width ( ) / 2 ) ,
top : event . pageY - offset . top -
( closestHandle . height ( ) / 2 ) -
( parseInt ( closestHandle . css ( "borderTopWidth" ) , 10 ) || 0 ) -
( parseInt ( closestHandle . css ( "borderBottomWidth" ) , 10 ) || 0 ) +
( parseInt ( closestHandle . css ( "marginTop" ) , 10 ) || 0 )
} ;
if ( ! this . handles . hasClass ( "ui-state-hover" ) ) {
this . _slide ( event , index , normValue ) ;
}
this . _animateOff = true ;
return true ;
} ,
_mouseStart : function ( ) {
return true ;
} ,
_mouseDrag : function ( event ) {
var position = { x : event . pageX , y : event . pageY } ,
normValue = this . _normValueFromMouse ( position ) ;
this . _slide ( event , this . _handleIndex , normValue ) ;
return false ;
} ,
_mouseStop : function ( event ) {
this . handles . removeClass ( "ui-state-active" ) ;
this . _mouseSliding = false ;
this . _stop ( event , this . _handleIndex ) ;
this . _change ( event , this . _handleIndex ) ;
this . _handleIndex = null ;
this . _clickOffset = null ;
this . _animateOff = false ;
return false ;
} ,
_detectOrientation : function ( ) {
this . orientation = ( this . options . orientation === "vertical" ) ? "vertical" : "horizontal" ;
} ,
_normValueFromMouse : function ( position ) {
var pixelTotal ,
pixelMouse ,
percentMouse ,
valueTotal ,
valueMouse ;
if ( this . orientation === "horizontal" ) {
pixelTotal = this . elementSize . width ;
pixelMouse = position . x - this . elementOffset . left - ( this . _clickOffset ? this . _clickOffset . left : 0 ) ;
} else {
pixelTotal = this . elementSize . height ;
pixelMouse = position . y - this . elementOffset . top - ( this . _clickOffset ? this . _clickOffset . top : 0 ) ;
}
percentMouse = ( pixelMouse / pixelTotal ) ;
if ( percentMouse > 1 ) {
percentMouse = 1 ;
}
if ( percentMouse < 0 ) {
percentMouse = 0 ;
}
if ( this . orientation === "vertical" ) {
percentMouse = 1 - percentMouse ;
}
valueTotal = this . _valueMax ( ) - this . _valueMin ( ) ;
valueMouse = this . _valueMin ( ) + percentMouse * valueTotal ;
return this . _trimAlignValue ( valueMouse ) ;
} ,
_start : function ( event , index ) {
var uiHash = {
handle : this . handles [ index ] ,
value : this . value ( )
} ;
if ( this . options . values && this . options . values . length ) {
uiHash . value = this . values ( index ) ;
uiHash . values = this . values ( ) ;
}
return this . _trigger ( "start" , event , uiHash ) ;
} ,
_slide : function ( event , index , newVal ) {
var otherVal ,
newValues ,
allowed ;
if ( this . options . values && this . options . values . length ) {
otherVal = this . values ( index ? 0 : 1 ) ;
if ( ( this . options . values . length === 2 && this . options . range === true ) &&
( ( index === 0 && newVal > otherVal ) || ( index === 1 && newVal < otherVal ) )
) {
newVal = otherVal ;
}
if ( newVal !== this . values ( index ) ) {
newValues = this . values ( ) ;
newValues [ index ] = newVal ;
// A slide can be canceled by returning false from the slide callback
allowed = this . _trigger ( "slide" , event , {
handle : this . handles [ index ] ,
value : newVal ,
values : newValues
} ) ;
otherVal = this . values ( index ? 0 : 1 ) ;
if ( allowed !== false ) {
2014-04-11 17:59:09 -04:00
this . values ( index , newVal ) ;
2014-01-03 13:32:13 -05:00
}
}
} else {
if ( newVal !== this . value ( ) ) {
// A slide can be canceled by returning false from the slide callback
allowed = this . _trigger ( "slide" , event , {
handle : this . handles [ index ] ,
value : newVal
} ) ;
if ( allowed !== false ) {
this . value ( newVal ) ;
}
}
}
} ,
_stop : function ( event , index ) {
var uiHash = {
handle : this . handles [ index ] ,
value : this . value ( )
} ;
if ( this . options . values && this . options . values . length ) {
uiHash . value = this . values ( index ) ;
uiHash . values = this . values ( ) ;
}
this . _trigger ( "stop" , event , uiHash ) ;
} ,
_change : function ( event , index ) {
if ( ! this . _keySliding && ! this . _mouseSliding ) {
var uiHash = {
handle : this . handles [ index ] ,
value : this . value ( )
} ;
if ( this . options . values && this . options . values . length ) {
uiHash . value = this . values ( index ) ;
uiHash . values = this . values ( ) ;
}
//store the last changed value index for reference when handles overlap
this . _lastChangedValue = index ;
this . _trigger ( "change" , event , uiHash ) ;
}
} ,
value : function ( newValue ) {
if ( arguments . length ) {
this . options . value = this . _trimAlignValue ( newValue ) ;
this . _refreshValue ( ) ;
this . _change ( null , 0 ) ;
return ;
}
return this . _value ( ) ;
} ,
values : function ( index , newValue ) {
var vals ,
newValues ,
i ;
if ( arguments . length > 1 ) {
this . options . values [ index ] = this . _trimAlignValue ( newValue ) ;
this . _refreshValue ( ) ;
this . _change ( null , index ) ;
return ;
}
if ( arguments . length ) {
if ( $ . isArray ( arguments [ 0 ] ) ) {
vals = this . options . values ;
newValues = arguments [ 0 ] ;
for ( i = 0 ; i < vals . length ; i += 1 ) {
vals [ i ] = this . _trimAlignValue ( newValues [ i ] ) ;
this . _change ( null , i ) ;
}
this . _refreshValue ( ) ;
} else {
if ( this . options . values && this . options . values . length ) {
return this . _values ( index ) ;
} else {
return this . value ( ) ;
}
}
} else {
return this . _values ( ) ;
}
} ,
_setOption : function ( key , value ) {
var i ,
valsLength = 0 ;
if ( key === "range" && this . options . range === true ) {
if ( value === "min" ) {
this . options . value = this . _values ( 0 ) ;
this . options . values = null ;
} else if ( value === "max" ) {
this . options . value = this . _values ( this . options . values . length - 1 ) ;
this . options . values = null ;
}
}
if ( $ . isArray ( this . options . values ) ) {
valsLength = this . options . values . length ;
}
$ . Widget . prototype . _setOption . apply ( this , arguments ) ;
switch ( key ) {
case "orientation" :
this . _detectOrientation ( ) ;
this . element
. removeClass ( "ui-slider-horizontal ui-slider-vertical" )
. addClass ( "ui-slider-" + this . orientation ) ;
this . _refreshValue ( ) ;
break ;
case "value" :
this . _animateOff = true ;
this . _refreshValue ( ) ;
this . _change ( null , 0 ) ;
this . _animateOff = false ;
break ;
case "values" :
this . _animateOff = true ;
this . _refreshValue ( ) ;
for ( i = 0 ; i < valsLength ; i += 1 ) {
this . _change ( null , i ) ;
}
this . _animateOff = false ;
break ;
case "min" :
case "max" :
this . _animateOff = true ;
this . _refreshValue ( ) ;
this . _animateOff = false ;
break ;
case "range" :
this . _animateOff = true ;
this . _refresh ( ) ;
this . _animateOff = false ;
break ;
}
} ,
//internal value getter
// _value() returns value trimmed by min and max, aligned by step
_value : function ( ) {
var val = this . options . value ;
val = this . _trimAlignValue ( val ) ;
return val ;
} ,
//internal values getter
// _values() returns array of values trimmed by min and max, aligned by step
// _values( index ) returns single value trimmed by min and max, aligned by step
_values : function ( index ) {
var val ,
vals ,
i ;
if ( arguments . length ) {
val = this . options . values [ index ] ;
val = this . _trimAlignValue ( val ) ;
return val ;
} else if ( this . options . values && this . options . values . length ) {
// .slice() creates a copy of the array
// this copy gets trimmed by min and max and then returned
vals = this . options . values . slice ( ) ;
for ( i = 0 ; i < vals . length ; i += 1 ) {
vals [ i ] = this . _trimAlignValue ( vals [ i ] ) ;
}
return vals ;
} else {
return [ ] ;
}
} ,
// returns the step-aligned value that val is closest to, between (inclusive) min and max
_trimAlignValue : function ( val ) {
if ( val <= this . _valueMin ( ) ) {
return this . _valueMin ( ) ;
}
if ( val >= this . _valueMax ( ) ) {
return this . _valueMax ( ) ;
}
var step = ( this . options . step > 0 ) ? this . options . step : 1 ,
valModStep = ( val - this . _valueMin ( ) ) % step ,
alignValue = val - valModStep ;
if ( Math . abs ( valModStep ) * 2 >= step ) {
alignValue += ( valModStep > 0 ) ? step : ( - step ) ;
}
// Since JavaScript has problems with large floats, round
// the final value to 5 digits after the decimal point (see #4124)
return parseFloat ( alignValue . toFixed ( 5 ) ) ;
} ,
_valueMin : function ( ) {
return this . options . min ;
} ,
_valueMax : function ( ) {
return this . options . max ;
} ,
_refreshValue : function ( ) {
var lastValPercent , valPercent , value , valueMin , valueMax ,
oRange = this . options . range ,
o = this . options ,
that = this ,
animate = ( ! this . _animateOff ) ? o . animate : false ,
_set = { } ;
if ( this . options . values && this . options . values . length ) {
this . handles . each ( function ( i ) {
valPercent = ( that . values ( i ) - that . _valueMin ( ) ) / ( that . _valueMax ( ) - that . _valueMin ( ) ) * 100 ;
_set [ that . orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%" ;
$ ( this ) . stop ( 1 , 1 ) [ animate ? "animate" : "css" ] ( _set , o . animate ) ;
if ( that . options . range === true ) {
if ( that . orientation === "horizontal" ) {
if ( i === 0 ) {
that . range . stop ( 1 , 1 ) [ animate ? "animate" : "css" ] ( { left : valPercent + "%" } , o . animate ) ;
}
if ( i === 1 ) {
that . range [ animate ? "animate" : "css" ] ( { width : ( valPercent - lastValPercent ) + "%" } , { queue : false , duration : o . animate } ) ;
}
} else {
if ( i === 0 ) {
that . range . stop ( 1 , 1 ) [ animate ? "animate" : "css" ] ( { bottom : ( valPercent ) + "%" } , o . animate ) ;
}
if ( i === 1 ) {
that . range [ animate ? "animate" : "css" ] ( { height : ( valPercent - lastValPercent ) + "%" } , { queue : false , duration : o . animate } ) ;
}
}
}
lastValPercent = valPercent ;
} ) ;
} else {
value = this . value ( ) ;
valueMin = this . _valueMin ( ) ;
valueMax = this . _valueMax ( ) ;
valPercent = ( valueMax !== valueMin ) ?
( value - valueMin ) / ( valueMax - valueMin ) * 100 :
0 ;
_set [ this . orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%" ;
this . handle . stop ( 1 , 1 ) [ animate ? "animate" : "css" ] ( _set , o . animate ) ;
if ( oRange === "min" && this . orientation === "horizontal" ) {
this . range . stop ( 1 , 1 ) [ animate ? "animate" : "css" ] ( { width : valPercent + "%" } , o . animate ) ;
}
if ( oRange === "max" && this . orientation === "horizontal" ) {
this . range [ animate ? "animate" : "css" ] ( { width : ( 100 - valPercent ) + "%" } , { queue : false , duration : o . animate } ) ;
}
if ( oRange === "min" && this . orientation === "vertical" ) {
this . range . stop ( 1 , 1 ) [ animate ? "animate" : "css" ] ( { height : valPercent + "%" } , o . animate ) ;
}
if ( oRange === "max" && this . orientation === "vertical" ) {
this . range [ animate ? "animate" : "css" ] ( { height : ( 100 - valPercent ) + "%" } , { queue : false , duration : o . animate } ) ;
}
}
} ,
_handleEvents : {
keydown : function ( event ) {
var allowed , curVal , newVal , step ,
index = $ ( event . target ) . data ( "ui-slider-handle-index" ) ;
switch ( event . keyCode ) {
case $ . ui . keyCode . HOME :
case $ . ui . keyCode . END :
case $ . ui . keyCode . PAGE _UP :
case $ . ui . keyCode . PAGE _DOWN :
case $ . ui . keyCode . UP :
case $ . ui . keyCode . RIGHT :
case $ . ui . keyCode . DOWN :
case $ . ui . keyCode . LEFT :
event . preventDefault ( ) ;
if ( ! this . _keySliding ) {
this . _keySliding = true ;
$ ( event . target ) . addClass ( "ui-state-active" ) ;
allowed = this . _start ( event , index ) ;
if ( allowed === false ) {
return ;
}
}
break ;
}
step = this . options . step ;
if ( this . options . values && this . options . values . length ) {
curVal = newVal = this . values ( index ) ;
} else {
curVal = newVal = this . value ( ) ;
}
switch ( event . keyCode ) {
case $ . ui . keyCode . HOME :
newVal = this . _valueMin ( ) ;
break ;
case $ . ui . keyCode . END :
newVal = this . _valueMax ( ) ;
break ;
case $ . ui . keyCode . PAGE _UP :
newVal = this . _trimAlignValue ( curVal + ( ( this . _valueMax ( ) - this . _valueMin ( ) ) / numPages ) ) ;
break ;
case $ . ui . keyCode . PAGE _DOWN :
newVal = this . _trimAlignValue ( curVal - ( ( this . _valueMax ( ) - this . _valueMin ( ) ) / numPages ) ) ;
break ;
case $ . ui . keyCode . UP :
case $ . ui . keyCode . RIGHT :
if ( curVal === this . _valueMax ( ) ) {
return ;
}
newVal = this . _trimAlignValue ( curVal + step ) ;
break ;
case $ . ui . keyCode . DOWN :
case $ . ui . keyCode . LEFT :
if ( curVal === this . _valueMin ( ) ) {
return ;
}
newVal = this . _trimAlignValue ( curVal - step ) ;
break ;
}
this . _slide ( event , index , newVal ) ;
} ,
click : function ( event ) {
event . preventDefault ( ) ;
} ,
keyup : function ( event ) {
var index = $ ( event . target ) . data ( "ui-slider-handle-index" ) ;
if ( this . _keySliding ) {
this . _keySliding = false ;
this . _stop ( event , index ) ;
this . _change ( event , index ) ;
$ ( event . target ) . removeClass ( "ui-state-active" ) ;
}
}
}
} ) ;
} ( jQuery ) ) ;
( function ( $ , undefined ) {
var dataSpace = "ui-effects-" ;
$ . effects = {
effect : { }
} ;
/ * !
* jQuery Color Animations v2 . 1.2
* https : //github.com/jquery/jquery-color
*
* Copyright 2013 jQuery Foundation and other contributors
* Released under the MIT license .
* http : //jquery.org/license
*
* Date : Wed Jan 16 08 : 47 : 09 2013 - 0600
* /
( function ( jQuery , undefined ) {
var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor" ,
// plusequals test for += 100 -= 100
rplusequals = /^([\-+])=\s*(\d+\.?\d*)/ ,
// a set of RE's that can match strings and generate color tuples.
stringParsers = [ {
re : /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/ ,
parse : function ( execResult ) {
return [
execResult [ 1 ] ,
execResult [ 2 ] ,
execResult [ 3 ] ,
execResult [ 4 ]
] ;
}
} , {
re : /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/ ,
parse : function ( execResult ) {
return [
execResult [ 1 ] * 2.55 ,
execResult [ 2 ] * 2.55 ,
execResult [ 3 ] * 2.55 ,
execResult [ 4 ]
] ;
}
} , {
// this regex ignores A-F because it's compared against an already lowercased string
re : /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/ ,
parse : function ( execResult ) {
return [
parseInt ( execResult [ 1 ] , 16 ) ,
parseInt ( execResult [ 2 ] , 16 ) ,
parseInt ( execResult [ 3 ] , 16 )
] ;
}
} , {
// this regex ignores A-F because it's compared against an already lowercased string
re : /#([a-f0-9])([a-f0-9])([a-f0-9])/ ,
parse : function ( execResult ) {
return [
parseInt ( execResult [ 1 ] + execResult [ 1 ] , 16 ) ,
parseInt ( execResult [ 2 ] + execResult [ 2 ] , 16 ) ,
parseInt ( execResult [ 3 ] + execResult [ 3 ] , 16 )
] ;
}
} , {
re : /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/ ,
space : "hsla" ,
parse : function ( execResult ) {
return [
execResult [ 1 ] ,
execResult [ 2 ] / 100 ,
execResult [ 3 ] / 100 ,
execResult [ 4 ]
] ;
}
} ] ,
// jQuery.Color( )
color = jQuery . Color = function ( color , green , blue , alpha ) {
return new jQuery . Color . fn . parse ( color , green , blue , alpha ) ;
} ,
spaces = {
rgba : {
props : {
red : {
idx : 0 ,
type : "byte"
} ,
green : {
idx : 1 ,
type : "byte"
} ,
blue : {
idx : 2 ,
type : "byte"
}
}
} ,
hsla : {
props : {
hue : {
idx : 0 ,
type : "degrees"
} ,
saturation : {
idx : 1 ,
type : "percent"
} ,
lightness : {
idx : 2 ,
type : "percent"
}
}
}
} ,
propTypes = {
"byte" : {
floor : true ,
max : 255
} ,
"percent" : {
max : 1
} ,
"degrees" : {
mod : 360 ,
floor : true
}
} ,
support = color . support = { } ,
// element for support tests
supportElem = jQuery ( "<p>" ) [ 0 ] ,
// colors = jQuery.Color.names
colors ,
// local aliases of functions called often
each = jQuery . each ;
// determine rgba support immediately
supportElem . style . cssText = "background-color:rgba(1,1,1,.5)" ;
support . rgba = supportElem . style . backgroundColor . indexOf ( "rgba" ) > - 1 ;
// define cache name and alpha properties
// for rgba and hsla spaces
each ( spaces , function ( spaceName , space ) {
space . cache = "_" + spaceName ;
space . props . alpha = {
idx : 3 ,
type : "percent" ,
def : 1
} ;
} ) ;
function clamp ( value , prop , allowEmpty ) {
var type = propTypes [ prop . type ] || { } ;
if ( value == null ) {
return ( allowEmpty || ! prop . def ) ? null : prop . def ;
}
// ~~ is an short way of doing floor for positive numbers
value = type . floor ? ~ ~ value : parseFloat ( value ) ;
// IE will pass in empty strings as value for alpha,
// which will hit this case
if ( isNaN ( value ) ) {
return prop . def ;
}
if ( type . mod ) {
// we add mod before modding to make sure that negatives values
// get converted properly: -10 -> 350
return ( value + type . mod ) % type . mod ;
}
// for now all property types without mod have min and max
return 0 > value ? 0 : type . max < value ? type . max : value ;
}
function stringParse ( string ) {
var inst = color ( ) ,
rgba = inst . _rgba = [ ] ;
string = string . toLowerCase ( ) ;
each ( stringParsers , function ( i , parser ) {
var parsed ,
match = parser . re . exec ( string ) ,
values = match && parser . parse ( match ) ,
spaceName = parser . space || "rgba" ;
if ( values ) {
parsed = inst [ spaceName ] ( values ) ;
// if this was an rgba parse the assignment might happen twice
// oh well....
inst [ spaces [ spaceName ] . cache ] = parsed [ spaces [ spaceName ] . cache ] ;
rgba = inst . _rgba = parsed . _rgba ;
// exit each( stringParsers ) here because we matched
return false ;
}
} ) ;
// Found a stringParser that handled it
if ( rgba . length ) {
// if this came from a parsed string, force "transparent" when alpha is 0
// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
if ( rgba . join ( ) === "0,0,0,0" ) {
jQuery . extend ( rgba , colors . transparent ) ;
}
return inst ;
}
// named colors
return colors [ string ] ;
}
color . fn = jQuery . extend ( color . prototype , {
parse : function ( red , green , blue , alpha ) {
if ( red === undefined ) {
this . _rgba = [ null , null , null , null ] ;
return this ;
}
if ( red . jquery || red . nodeType ) {
red = jQuery ( red ) . css ( green ) ;
green = undefined ;
}
var inst = this ,
type = jQuery . type ( red ) ,
rgba = this . _rgba = [ ] ;
// more than 1 argument specified - assume ( red, green, blue, alpha )
if ( green !== undefined ) {
red = [ red , green , blue , alpha ] ;
type = "array" ;
}
if ( type === "string" ) {
return this . parse ( stringParse ( red ) || colors . _default ) ;
}
if ( type === "array" ) {
each ( spaces . rgba . props , function ( key , prop ) {
rgba [ prop . idx ] = clamp ( red [ prop . idx ] , prop ) ;
} ) ;
return this ;
}
if ( type === "object" ) {
if ( red instanceof color ) {
each ( spaces , function ( spaceName , space ) {
if ( red [ space . cache ] ) {
inst [ space . cache ] = red [ space . cache ] . slice ( ) ;
}
} ) ;
} else {
each ( spaces , function ( spaceName , space ) {
var cache = space . cache ;
each ( space . props , function ( key , prop ) {
// if the cache doesn't exist, and we know how to convert
if ( ! inst [ cache ] && space . to ) {
// if the value was null, we don't need to copy it
// if the key was alpha, we don't need to copy it either
if ( key === "alpha" || red [ key ] == null ) {
return ;
}
inst [ cache ] = space . to ( inst . _rgba ) ;
}
// this is the only case where we allow nulls for ALL properties.
// call clamp with alwaysAllowEmpty
inst [ cache ] [ prop . idx ] = clamp ( red [ key ] , prop , true ) ;
} ) ;
// everything defined but alpha?
if ( inst [ cache ] && jQuery . inArray ( null , inst [ cache ] . slice ( 0 , 3 ) ) < 0 ) {
// use the default of 1
inst [ cache ] [ 3 ] = 1 ;
if ( space . from ) {
inst . _rgba = space . from ( inst [ cache ] ) ;
}
}
} ) ;
}
return this ;
}
} ,
is : function ( compare ) {
var is = color ( compare ) ,
same = true ,
inst = this ;
each ( spaces , function ( _ , space ) {
var localCache ,
isCache = is [ space . cache ] ;
if ( isCache ) {
localCache = inst [ space . cache ] || space . to && space . to ( inst . _rgba ) || [ ] ;
each ( space . props , function ( _ , prop ) {
if ( isCache [ prop . idx ] != null ) {
same = ( isCache [ prop . idx ] === localCache [ prop . idx ] ) ;
return same ;
}
} ) ;
}
return same ;
} ) ;
return same ;
} ,
_space : function ( ) {
var used = [ ] ,
inst = this ;
each ( spaces , function ( spaceName , space ) {
if ( inst [ space . cache ] ) {
used . push ( spaceName ) ;
}
} ) ;
return used . pop ( ) ;
} ,
transition : function ( other , distance ) {
var end = color ( other ) ,
spaceName = end . _space ( ) ,
space = spaces [ spaceName ] ,
startColor = this . alpha ( ) === 0 ? color ( "transparent" ) : this ,
start = startColor [ space . cache ] || space . to ( startColor . _rgba ) ,
result = start . slice ( ) ;
end = end [ space . cache ] ;
each ( space . props , function ( key , prop ) {
var index = prop . idx ,
startValue = start [ index ] ,
endValue = end [ index ] ,
type = propTypes [ prop . type ] || { } ;
// if null, don't override start value
if ( endValue === null ) {
return ;
}
// if null - use end
if ( startValue === null ) {
result [ index ] = endValue ;
} else {
if ( type . mod ) {
if ( endValue - startValue > type . mod / 2 ) {
startValue += type . mod ;
} else if ( startValue - endValue > type . mod / 2 ) {
startValue -= type . mod ;
}
}
result [ index ] = clamp ( ( endValue - startValue ) * distance + startValue , prop ) ;
}
} ) ;
return this [ spaceName ] ( result ) ;
} ,
blend : function ( opaque ) {
// if we are already opaque - return ourself
if ( this . _rgba [ 3 ] === 1 ) {
return this ;
}
var rgb = this . _rgba . slice ( ) ,
a = rgb . pop ( ) ,
blend = color ( opaque ) . _rgba ;
return color ( jQuery . map ( rgb , function ( v , i ) {
return ( 1 - a ) * blend [ i ] + a * v ;
} ) ) ;
} ,
toRgbaString : function ( ) {
var prefix = "rgba(" ,
rgba = jQuery . map ( this . _rgba , function ( v , i ) {
return v == null ? ( i > 2 ? 1 : 0 ) : v ;
} ) ;
if ( rgba [ 3 ] === 1 ) {
rgba . pop ( ) ;
prefix = "rgb(" ;
}
return prefix + rgba . join ( ) + ")" ;
} ,
toHslaString : function ( ) {
var prefix = "hsla(" ,
hsla = jQuery . map ( this . hsla ( ) , function ( v , i ) {
if ( v == null ) {
v = i > 2 ? 1 : 0 ;
}
// catch 1 and 2
if ( i && i < 3 ) {
v = Math . round ( v * 100 ) + "%" ;
}
return v ;
} ) ;
if ( hsla [ 3 ] === 1 ) {
hsla . pop ( ) ;
prefix = "hsl(" ;
}
return prefix + hsla . join ( ) + ")" ;
} ,
toHexString : function ( includeAlpha ) {
var rgba = this . _rgba . slice ( ) ,
alpha = rgba . pop ( ) ;
if ( includeAlpha ) {
rgba . push ( ~ ~ ( alpha * 255 ) ) ;
}
return "#" + jQuery . map ( rgba , function ( v ) {
// default to 0 when nulls exist
v = ( v || 0 ) . toString ( 16 ) ;
return v . length === 1 ? "0" + v : v ;
} ) . join ( "" ) ;
} ,
toString : function ( ) {
return this . _rgba [ 3 ] === 0 ? "transparent" : this . toRgbaString ( ) ;
}
} ) ;
color . fn . parse . prototype = color . fn ;
// hsla conversions adapted from:
// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
function hue2rgb ( p , q , h ) {
h = ( h + 1 ) % 1 ;
if ( h * 6 < 1 ) {
return p + ( q - p ) * h * 6 ;
}
if ( h * 2 < 1 ) {
return q ;
}
if ( h * 3 < 2 ) {
return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6 ;
}
return p ;
}
spaces . hsla . to = function ( rgba ) {
if ( rgba [ 0 ] == null || rgba [ 1 ] == null || rgba [ 2 ] == null ) {
return [ null , null , null , rgba [ 3 ] ] ;
}
var r = rgba [ 0 ] / 255 ,
g = rgba [ 1 ] / 255 ,
b = rgba [ 2 ] / 255 ,
a = rgba [ 3 ] ,
max = Math . max ( r , g , b ) ,
min = Math . min ( r , g , b ) ,
diff = max - min ,
add = max + min ,
l = add * 0.5 ,
h , s ;
if ( min === max ) {
h = 0 ;
} else if ( r === max ) {
h = ( 60 * ( g - b ) / diff ) + 360 ;
} else if ( g === max ) {
h = ( 60 * ( b - r ) / diff ) + 120 ;
} else {
h = ( 60 * ( r - g ) / diff ) + 240 ;
}
// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
if ( diff === 0 ) {
s = 0 ;
} else if ( l <= 0.5 ) {
s = diff / add ;
} else {
s = diff / ( 2 - add ) ;
}
return [ Math . round ( h ) % 360 , s , l , a == null ? 1 : a ] ;
} ;
spaces . hsla . from = function ( hsla ) {
if ( hsla [ 0 ] == null || hsla [ 1 ] == null || hsla [ 2 ] == null ) {
return [ null , null , null , hsla [ 3 ] ] ;
}
var h = hsla [ 0 ] / 360 ,
s = hsla [ 1 ] ,
l = hsla [ 2 ] ,
a = hsla [ 3 ] ,
q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s ,
p = 2 * l - q ;
return [
Math . round ( hue2rgb ( p , q , h + ( 1 / 3 ) ) * 255 ) ,
Math . round ( hue2rgb ( p , q , h ) * 255 ) ,
Math . round ( hue2rgb ( p , q , h - ( 1 / 3 ) ) * 255 ) ,
a
] ;
} ;
each ( spaces , function ( spaceName , space ) {
var props = space . props ,
cache = space . cache ,
to = space . to ,
from = space . from ;
// makes rgba() and hsla()
color . fn [ spaceName ] = function ( value ) {
// generate a cache for this space if it doesn't exist
if ( to && ! this [ cache ] ) {
this [ cache ] = to ( this . _rgba ) ;
}
if ( value === undefined ) {
return this [ cache ] . slice ( ) ;
}
var ret ,
type = jQuery . type ( value ) ,
arr = ( type === "array" || type === "object" ) ? value : arguments ,
local = this [ cache ] . slice ( ) ;
each ( props , function ( key , prop ) {
var val = arr [ type === "object" ? key : prop . idx ] ;
if ( val == null ) {
val = local [ prop . idx ] ;
}
local [ prop . idx ] = clamp ( val , prop ) ;
} ) ;
if ( from ) {
ret = color ( from ( local ) ) ;
ret [ cache ] = local ;
return ret ;
} else {
return color ( local ) ;
}
} ;
// makes red() green() blue() alpha() hue() saturation() lightness()
each ( props , function ( key , prop ) {
// alpha is included in more than one space
if ( color . fn [ key ] ) {
return ;
}
color . fn [ key ] = function ( value ) {
var vtype = jQuery . type ( value ) ,
fn = ( key === "alpha" ? ( this . _hsla ? "hsla" : "rgba" ) : spaceName ) ,
local = this [ fn ] ( ) ,
cur = local [ prop . idx ] ,
match ;
if ( vtype === "undefined" ) {
return cur ;
}
if ( vtype === "function" ) {
value = value . call ( this , cur ) ;
vtype = jQuery . type ( value ) ;
}
if ( value == null && prop . empty ) {
return this ;
}
if ( vtype === "string" ) {
match = rplusequals . exec ( value ) ;
if ( match ) {
value = cur + parseFloat ( match [ 2 ] ) * ( match [ 1 ] === "+" ? 1 : - 1 ) ;
}
}
local [ prop . idx ] = value ;
return this [ fn ] ( local ) ;
} ;
} ) ;
} ) ;
// add cssHook and .fx.step function for each named hook.
// accept a space separated string of properties
color . hook = function ( hook ) {
var hooks = hook . split ( " " ) ;
each ( hooks , function ( i , hook ) {
jQuery . cssHooks [ hook ] = {
set : function ( elem , value ) {
var parsed , curElem ,
backgroundColor = "" ;
if ( value !== "transparent" && ( jQuery . type ( value ) !== "string" || ( parsed = stringParse ( value ) ) ) ) {
value = color ( parsed || value ) ;
if ( ! support . rgba && value . _rgba [ 3 ] !== 1 ) {
curElem = hook === "backgroundColor" ? elem . parentNode : elem ;
while (
( backgroundColor === "" || backgroundColor === "transparent" ) &&
curElem && curElem . style
) {
try {
backgroundColor = jQuery . css ( curElem , "backgroundColor" ) ;
curElem = curElem . parentNode ;
} catch ( e ) {
}
}
value = value . blend ( backgroundColor && backgroundColor !== "transparent" ?
backgroundColor :
"_default" ) ;
}
value = value . toRgbaString ( ) ;
}
try {
elem . style [ hook ] = value ;
} catch ( e ) {
// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
}
}
} ;
jQuery . fx . step [ hook ] = function ( fx ) {
if ( ! fx . colorInit ) {
fx . start = color ( fx . elem , hook ) ;
fx . end = color ( fx . end ) ;
fx . colorInit = true ;
}
jQuery . cssHooks [ hook ] . set ( fx . elem , fx . start . transition ( fx . end , fx . pos ) ) ;
} ;
} ) ;
} ;
color . hook ( stepHooks ) ;
jQuery . cssHooks . borderColor = {
expand : function ( value ) {
var expanded = { } ;
each ( [ "Top" , "Right" , "Bottom" , "Left" ] , function ( i , part ) {
expanded [ "border" + part + "Color" ] = value ;
} ) ;
return expanded ;
}
} ;
// Basic color names only.
// Usage of any of the other color names requires adding yourself or including
// jquery.color.svg-names.js.
colors = jQuery . Color . names = {
// 4.1. Basic color keywords
aqua : "#00ffff" ,
black : "#000000" ,
blue : "#0000ff" ,
fuchsia : "#ff00ff" ,
gray : "#808080" ,
green : "#008000" ,
lime : "#00ff00" ,
maroon : "#800000" ,
navy : "#000080" ,
olive : "#808000" ,
purple : "#800080" ,
red : "#ff0000" ,
silver : "#c0c0c0" ,
teal : "#008080" ,
white : "#ffffff" ,
yellow : "#ffff00" ,
// 4.2.3. "transparent" color keyword
transparent : [ null , null , null , 0 ] ,
_default : "#ffffff"
} ;
} ) ( jQuery ) ;
/******************************************************************************/
/****************************** CLASS ANIMATIONS ******************************/
/******************************************************************************/
( function ( ) {
var classAnimationActions = [ "add" , "remove" , "toggle" ] ,
shorthandStyles = {
border : 1 ,
borderBottom : 1 ,
borderColor : 1 ,
borderLeft : 1 ,
borderRight : 1 ,
borderTop : 1 ,
borderWidth : 1 ,
margin : 1 ,
padding : 1
} ;
$ . each ( [ "borderLeftStyle" , "borderRightStyle" , "borderBottomStyle" , "borderTopStyle" ] , function ( _ , prop ) {
$ . fx . step [ prop ] = function ( fx ) {
if ( fx . end !== "none" && ! fx . setAttr || fx . pos === 1 && ! fx . setAttr ) {
jQuery . style ( fx . elem , prop , fx . end ) ;
fx . setAttr = true ;
}
} ;
} ) ;
function getElementStyles ( elem ) {
var key , len ,
style = elem . ownerDocument . defaultView ?
elem . ownerDocument . defaultView . getComputedStyle ( elem , null ) :
elem . currentStyle ,
styles = { } ;
if ( style && style . length && style [ 0 ] && style [ style [ 0 ] ] ) {
len = style . length ;
while ( len -- ) {
key = style [ len ] ;
if ( typeof style [ key ] === "string" ) {
styles [ $ . camelCase ( key ) ] = style [ key ] ;
}
}
// support: Opera, IE <9
} else {
for ( key in style ) {
if ( typeof style [ key ] === "string" ) {
styles [ key ] = style [ key ] ;
}
}
}
return styles ;
}
function styleDifference ( oldStyle , newStyle ) {
var diff = { } ,
name , value ;
for ( name in newStyle ) {
value = newStyle [ name ] ;
if ( oldStyle [ name ] !== value ) {
if ( ! shorthandStyles [ name ] ) {
if ( $ . fx . step [ name ] || ! isNaN ( parseFloat ( value ) ) ) {
diff [ name ] = value ;
}
}
}
}
return diff ;
}
// support: jQuery <1.8
if ( ! $ . fn . addBack ) {
$ . fn . addBack = function ( selector ) {
return this . add ( selector == null ?
this . prevObject : this . prevObject . filter ( selector )
) ;
} ;
}
$ . effects . animateClass = function ( value , duration , easing , callback ) {
var o = $ . speed ( duration , easing , callback ) ;
return this . queue ( function ( ) {
var animated = $ ( this ) ,
baseClass = animated . attr ( "class" ) || "" ,
applyClassChange ,
allAnimations = o . children ? animated . find ( "*" ) . addBack ( ) : animated ;
// map the animated objects to store the original styles.
allAnimations = allAnimations . map ( function ( ) {
var el = $ ( this ) ;
return {
el : el ,
start : getElementStyles ( this )
} ;
} ) ;
// apply class change
applyClassChange = function ( ) {
$ . each ( classAnimationActions , function ( i , action ) {
if ( value [ action ] ) {
animated [ action + "Class" ] ( value [ action ] ) ;
}
} ) ;
} ;
applyClassChange ( ) ;
// map all animated objects again - calculate new styles and diff
allAnimations = allAnimations . map ( function ( ) {
this . end = getElementStyles ( this . el [ 0 ] ) ;
this . diff = styleDifference ( this . start , this . end ) ;
return this ;
} ) ;
// apply original class
animated . attr ( "class" , baseClass ) ;
// map all animated objects again - this time collecting a promise
allAnimations = allAnimations . map ( function ( ) {
var styleInfo = this ,
dfd = $ . Deferred ( ) ,
opts = $ . extend ( { } , o , {
queue : false ,
complete : function ( ) {
dfd . resolve ( styleInfo ) ;
}
} ) ;
this . el . animate ( this . diff , opts ) ;
return dfd . promise ( ) ;
} ) ;
// once all animations have completed:
$ . when . apply ( $ , allAnimations . get ( ) ) . done ( function ( ) {
// set the final class
applyClassChange ( ) ;
// for each animated element,
// clear all css properties that were animated
$ . each ( arguments , function ( ) {
var el = this . el ;
$ . each ( this . diff , function ( key ) {
el . css ( key , "" ) ;
} ) ;
} ) ;
// this is guarnteed to be there if you use jQuery.speed()
// it also handles dequeuing the next anim...
o . complete . call ( animated [ 0 ] ) ;
} ) ;
} ) ;
} ;
$ . fn . extend ( {
addClass : ( function ( orig ) {
return function ( classNames , speed , easing , callback ) {
return speed ?
$ . effects . animateClass . call ( this ,
{ add : classNames } , speed , easing , callback ) :
orig . apply ( this , arguments ) ;
} ;
} ) ( $ . fn . addClass ) ,
removeClass : ( function ( orig ) {
return function ( classNames , speed , easing , callback ) {
return arguments . length > 1 ?
$ . effects . animateClass . call ( this ,
{ remove : classNames } , speed , easing , callback ) :
orig . apply ( this , arguments ) ;
} ;
} ) ( $ . fn . removeClass ) ,
toggleClass : ( function ( orig ) {
return function ( classNames , force , speed , easing , callback ) {
if ( typeof force === "boolean" || force === undefined ) {
if ( ! speed ) {
// without speed parameter
return orig . apply ( this , arguments ) ;
} else {
return $ . effects . animateClass . call ( this ,
( force ? { add : classNames } : { remove : classNames } ) ,
speed , easing , callback ) ;
}
} else {
// without force parameter
return $ . effects . animateClass . call ( this ,
{ toggle : classNames } , force , speed , easing ) ;
}
} ;
} ) ( $ . fn . toggleClass ) ,
switchClass : function ( remove , add , speed , easing , callback ) {
return $ . effects . animateClass . call ( this , {
add : add ,
remove : remove
} , speed , easing , callback ) ;
}
} ) ;
} ) ( ) ;
/******************************************************************************/
/*********************************** EFFECTS **********************************/
/******************************************************************************/
( function ( ) {
$ . extend ( $ . effects , {
2014-04-11 17:59:09 -04:00
version : "1.10.4" ,
2014-01-03 13:32:13 -05:00
// 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 ( dataSpace + set [ i ] , element [ 0 ] . style [ set [ i ] ] ) ;
}
}
} ,
// Restores a set of previously saved properties from a data storage
restore : function ( element , set ) {
var val , i ;
for ( i = 0 ; i < set . length ; i ++ ) {
if ( set [ i ] !== null ) {
val = element . data ( dataSpace + set [ i ] ) ;
// support: jQuery 1.6.2
// http://bugs.jquery.com/ticket/9917
// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
// We can't differentiate between "" and 0 here, so we just assume
// empty string since it's likely to be a more common value...
if ( val === undefined ) {
val = "" ;
}
element . css ( set [ i ] , val ) ;
}
}
} ,
setMode : function ( el , mode ) {
if ( mode === "toggle" ) {
mode = el . is ( ":hidden" ) ? "show" : "hide" ;
}
return mode ;
} ,
// Translates a [top,left] array into a baseline value
// this should be a little more flexible in the future to handle a string & hash
getBaseline : function ( origin , original ) {
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
} ) ,
// Store the size in case width/height are defined in % - Fixes #5245
size = {
width : element . width ( ) ,
height : element . height ( )
} ,
active = document . activeElement ;
// support: Firefox
// Firefox incorrectly exposes anonymous content
// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
try {
active . id ;
} catch ( e ) {
active = document . body ;
}
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 lose 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"
} ) ;
}
element . css ( size ) ;
return wrapper . css ( props ) . show ( ) ;
} ,
removeWrapper : function ( element ) {
var active = document . activeElement ;
if ( element . parent ( ) . is ( ".ui-effects-wrapper" ) ) {
element . parent ( ) . replaceWith ( element ) ;
// Fixes #7595 - Elements lose focus when wrapped.
if ( element [ 0 ] === active || $ . contains ( element [ 0 ] , active ) ) {
$ ( active ) . focus ( ) ;
}
}
return element ;
} ,
setTransition : function ( element , list , factor , value ) {
value = value || { } ;
$ . each ( list , function ( i , x ) {
var unit = element . cssUnit ( x ) ;
if ( unit [ 0 ] > 0 ) {
value [ x ] = unit [ 0 ] * factor + unit [ 1 ] ;
}
} ) ;
return value ;
}
} ) ;
// return an effect options object for the given parameters:
function _normalizeArguments ( effect , options , speed , callback ) {
// allow passing all options as the first parameter
if ( $ . isPlainObject ( effect ) ) {
options = effect ;
effect = effect . effect ;
}
// convert to an object
effect = { effect : effect } ;
// catch (effect, null, ...)
if ( options == null ) {
options = { } ;
}
// catch (effect, callback)
if ( $ . isFunction ( options ) ) {
callback = options ;
speed = null ;
options = { } ;
}
// catch (effect, speed, ?)
if ( typeof options === "number" || $ . fx . speeds [ options ] ) {
callback = speed ;
speed = options ;
options = { } ;
}
// catch (effect, options, callback)
if ( $ . isFunction ( speed ) ) {
callback = speed ;
speed = null ;
}
// add options to effect
if ( options ) {
$ . extend ( effect , options ) ;
}
speed = speed || options . duration ;
effect . duration = $ . fx . off ? 0 :
typeof speed === "number" ? speed :
speed in $ . fx . speeds ? $ . fx . speeds [ speed ] :
$ . fx . speeds . _default ;
effect . complete = callback || options . complete ;
return effect ;
}
function standardAnimationOption ( option ) {
// Valid standard speeds (nothing, number, named speed)
if ( ! option || typeof option === "number" || $ . fx . speeds [ option ] ) {
return true ;
}
// Invalid strings - treat as "normal" speed
if ( typeof option === "string" && ! $ . effects . effect [ option ] ) {
return true ;
}
// Complete callback
if ( $ . isFunction ( option ) ) {
return true ;
}
// Options hash (but not naming an effect)
if ( typeof option === "object" && ! option . effect ) {
return true ;
}
// Didn't match any standard API
return false ;
}
$ . fn . extend ( {
effect : function ( /* effect, options, speed, callback */ ) {
var args = _normalizeArguments . apply ( this , arguments ) ,
mode = args . mode ,
queue = args . queue ,
effectMethod = $ . effects . effect [ args . effect ] ;
if ( $ . fx . off || ! effectMethod ) {
// delegate to the original method (e.g., .show()) if possible
if ( mode ) {
return this [ mode ] ( args . duration , args . complete ) ;
} else {
return this . each ( function ( ) {
if ( args . complete ) {
args . complete . call ( this ) ;
}
} ) ;
}
}
function run ( next ) {
var elem = $ ( this ) ,
complete = args . complete ,
mode = args . mode ;
function done ( ) {
if ( $ . isFunction ( complete ) ) {
complete . call ( elem [ 0 ] ) ;
}
if ( $ . isFunction ( next ) ) {
next ( ) ;
}
}
// If the element already has the correct final state, delegate to
// the core methods so the internal tracking of "olddisplay" works.
if ( elem . is ( ":hidden" ) ? mode === "hide" : mode === "show" ) {
elem [ mode ] ( ) ;
done ( ) ;
} else {
effectMethod . call ( elem [ 0 ] , args , done ) ;
}
}
return queue === false ? this . each ( run ) : this . queue ( queue || "fx" , run ) ;
} ,
show : ( function ( orig ) {
return function ( option ) {
if ( standardAnimationOption ( option ) ) {
return orig . apply ( this , arguments ) ;
} else {
var args = _normalizeArguments . apply ( this , arguments ) ;
args . mode = "show" ;
return this . effect . call ( this , args ) ;
}
} ;
} ) ( $ . fn . show ) ,
hide : ( function ( orig ) {
return function ( option ) {
if ( standardAnimationOption ( option ) ) {
return orig . apply ( this , arguments ) ;
} else {
var args = _normalizeArguments . apply ( this , arguments ) ;
args . mode = "hide" ;
return this . effect . call ( this , args ) ;
}
} ;
} ) ( $ . fn . hide ) ,
toggle : ( function ( orig ) {
return function ( option ) {
if ( standardAnimationOption ( option ) || typeof option === "boolean" ) {
return orig . apply ( this , arguments ) ;
} else {
var args = _normalizeArguments . apply ( this , arguments ) ;
args . mode = "toggle" ;
return this . effect . call ( this , args ) ;
}
} ;
} ) ( $ . fn . toggle ) ,
// 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 ***********************************/
/******************************************************************************/
( function ( ) {
// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
var baseEasings = { } ;
$ . each ( [ "Quad" , "Cubic" , "Quart" , "Quint" , "Expo" ] , function ( i , name ) {
baseEasings [ name ] = function ( p ) {
return Math . pow ( p , i + 2 ) ;
} ;
} ) ;
$ . extend ( baseEasings , {
Sine : function ( p ) {
return 1 - Math . cos ( p * Math . PI / 2 ) ;
} ,
Circ : function ( p ) {
return 1 - Math . sqrt ( 1 - p * p ) ;
} ,
Elastic : function ( p ) {
return p === 0 || p === 1 ? p :
- Math . pow ( 2 , 8 * ( p - 1 ) ) * Math . sin ( ( ( p - 1 ) * 80 - 7.5 ) * Math . PI / 15 ) ;
} ,
Back : function ( p ) {
return p * p * ( 3 * p - 2 ) ;
} ,
Bounce : function ( p ) {
var pow2 ,
bounce = 4 ;
while ( p < ( ( pow2 = Math . pow ( 2 , -- bounce ) ) - 1 ) / 11 ) { }
return 1 / Math . pow ( 4 , 3 - bounce ) - 7.5625 * Math . pow ( ( pow2 * 3 - 2 ) / 22 - p , 2 ) ;
}
} ) ;
$ . each ( baseEasings , function ( name , easeIn ) {
$ . easing [ "easeIn" + name ] = easeIn ;
$ . easing [ "easeOut" + name ] = function ( p ) {
return 1 - easeIn ( 1 - p ) ;
} ;
$ . easing [ "easeInOut" + name ] = function ( p ) {
return p < 0.5 ?
easeIn ( p * 2 ) / 2 :
1 - easeIn ( p * - 2 + 2 ) / 2 ;
} ;
} ) ;
} ) ( ) ;
} ) ( jQuery ) ;
( function ( $ , undefined ) {
$ . effects . effect . bounce = function ( o , done ) {
var el = $ ( this ) ,
props = [ "position" , "top" , "bottom" , "left" , "right" , "height" , "width" ] ,
// defaults:
mode = $ . effects . setMode ( el , o . mode || "effect" ) ,
hide = mode === "hide" ,
show = mode === "show" ,
direction = o . direction || "up" ,
distance = o . distance ,
times = o . times || 5 ,
// number of internal animations
anims = times * 2 + ( show || hide ? 1 : 0 ) ,
speed = o . duration / anims ,
easing = o . easing ,
// utility:
ref = ( direction === "up" || direction === "down" ) ? "top" : "left" ,
motion = ( direction === "up" || direction === "left" ) ,
i ,
upAnim ,
downAnim ,
// we will need to re-assemble the queue to stack our animations in place
queue = el . queue ( ) ,
queuelen = queue . length ;
// Avoid touching opacity to prevent clearType and PNG issues in IE
if ( show || hide ) {
props . push ( "opacity" ) ;
}
$ . effects . save ( el , props ) ;
el . show ( ) ;
$ . effects . createWrapper ( el ) ; // Create Wrapper
// default distance for the BIGGEST bounce is the outer Distance / 3
if ( ! distance ) {
distance = el [ ref === "top" ? "outerHeight" : "outerWidth" ] ( ) / 3 ;
}
if ( show ) {
downAnim = { opacity : 1 } ;
downAnim [ ref ] = 0 ;
// if we are showing, force opacity 0 and set the initial position
// then do the "first" animation
el . css ( "opacity" , 0 )
. css ( ref , motion ? - distance * 2 : distance * 2 )
. animate ( downAnim , speed , easing ) ;
}
// start at the smallest distance if we are hiding
if ( hide ) {
distance = distance / Math . pow ( 2 , times - 1 ) ;
}
downAnim = { } ;
downAnim [ ref ] = 0 ;
// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
for ( i = 0 ; i < times ; i ++ ) {
upAnim = { } ;
upAnim [ ref ] = ( motion ? "-=" : "+=" ) + distance ;
el . animate ( upAnim , speed , easing )
. animate ( downAnim , speed , easing ) ;
distance = hide ? distance * 2 : distance / 2 ;
}
// Last Bounce when Hiding
if ( hide ) {
upAnim = { opacity : 0 } ;
upAnim [ ref ] = ( motion ? "-=" : "+=" ) + distance ;
el . animate ( upAnim , speed , easing ) ;
}
el . queue ( function ( ) {
if ( hide ) {
el . hide ( ) ;
}
$ . effects . restore ( el , props ) ;
$ . effects . removeWrapper ( el ) ;
done ( ) ;
} ) ;
// inject all the animations we just queued to be first in line (after "inprogress")
if ( queuelen > 1 ) {
queue . splice . apply ( queue ,
[ 1 , 0 ] . concat ( queue . splice ( queuelen , anims + 1 ) ) ) ;
}
el . dequeue ( ) ;
} ;
} ) ( jQuery ) ;
( function ( $ , undefined ) {
$ . effects . effect . highlight = function ( o , done ) {
var elem = $ ( this ) ,
props = [ "backgroundImage" , "backgroundColor" , "opacity" ] ,
mode = $ . effects . setMode ( elem , o . mode || "show" ) ,
animation = {
backgroundColor : elem . css ( "backgroundColor" )
} ;
if ( mode === "hide" ) {
animation . opacity = 0 ;
}
$ . effects . save ( elem , props ) ;
elem
. show ( )
. css ( {
backgroundImage : "none" ,
backgroundColor : o . color || "#ffff99"
} )
. animate ( animation , {
queue : false ,
duration : o . duration ,
easing : o . easing ,
complete : function ( ) {
if ( mode === "hide" ) {
elem . hide ( ) ;
}
$ . effects . restore ( elem , props ) ;
done ( ) ;
}
} ) ;
} ;
} ) ( jQuery ) ;
( function ( $ , undefined ) {
$ . effects . effect . pulsate = function ( o , done ) {
var elem = $ ( this ) ,
mode = $ . effects . setMode ( elem , o . mode || "show" ) ,
show = mode === "show" ,
hide = mode === "hide" ,
showhide = ( show || mode === "hide" ) ,
// showing or hiding leaves of the "last" animation
anims = ( ( o . times || 5 ) * 2 ) + ( showhide ? 1 : 0 ) ,
duration = o . duration / anims ,
animateTo = 0 ,
queue = elem . queue ( ) ,
queuelen = queue . length ,
i ;
if ( show || ! elem . is ( ":visible" ) ) {
elem . css ( "opacity" , 0 ) . show ( ) ;
animateTo = 1 ;
}
// anims - 1 opacity "toggles"
for ( i = 1 ; i < anims ; i ++ ) {
elem . animate ( {
opacity : animateTo
} , duration , o . easing ) ;
animateTo = 1 - animateTo ;
}
elem . animate ( {
opacity : animateTo
} , duration , o . easing ) ;
elem . queue ( function ( ) {
if ( hide ) {
elem . hide ( ) ;
}
done ( ) ;
} ) ;
// We just queued up "anims" animations, we need to put them next in the queue
if ( queuelen > 1 ) {
queue . splice . apply ( queue ,
[ 1 , 0 ] . concat ( queue . splice ( queuelen , anims + 1 ) ) ) ;
}
elem . dequeue ( ) ;
} ;
} ) ( jQuery ) ;
( function ( $ , undefined ) {
$ . effects . effect . shake = function ( o , done ) {
var el = $ ( this ) ,
props = [ "position" , "top" , "bottom" , "left" , "right" , "height" , "width" ] ,
mode = $ . effects . setMode ( el , o . mode || "effect" ) ,
direction = o . direction || "left" ,
distance = o . distance || 20 ,
times = o . times || 3 ,
anims = times * 2 + 1 ,
speed = Math . round ( o . duration / anims ) ,
ref = ( direction === "up" || direction === "down" ) ? "top" : "left" ,
positiveMotion = ( direction === "up" || direction === "left" ) ,
animation = { } ,
animation1 = { } ,
animation2 = { } ,
i ,
// we will need to re-assemble the queue to stack our animations in place
queue = el . queue ( ) ,
queuelen = queue . length ;
$ . effects . save ( el , props ) ;
el . show ( ) ;
$ . effects . createWrapper ( el ) ;
// Animation
animation [ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance ;
animation1 [ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2 ;
animation2 [ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2 ;
// Animate
el . animate ( animation , speed , o . easing ) ;
// Shakes
for ( i = 1 ; i < times ; i ++ ) {
el . animate ( animation1 , speed , o . easing ) . animate ( animation2 , speed , o . easing ) ;
}
el
. animate ( animation1 , speed , o . easing )
. animate ( animation , speed / 2 , o . easing )
. queue ( function ( ) {
if ( mode === "hide" ) {
el . hide ( ) ;
}
$ . effects . restore ( el , props ) ;
$ . effects . removeWrapper ( el ) ;
done ( ) ;
} ) ;
// inject all the animations we just queued to be first in line (after "inprogress")
if ( queuelen > 1 ) {
queue . splice . apply ( queue ,
[ 1 , 0 ] . concat ( queue . splice ( queuelen , anims + 1 ) ) ) ;
}
el . dequeue ( ) ;
} ;
} ) ( jQuery ) ;
( function ( $ , undefined ) {
$ . effects . effect . transfer = function ( o , done ) {
var elem = $ ( this ) ,
target = $ ( o . to ) ,
targetFixed = target . css ( "position" ) === "fixed" ,
body = $ ( "body" ) ,
fixTop = targetFixed ? body . scrollTop ( ) : 0 ,
fixLeft = targetFixed ? body . scrollLeft ( ) : 0 ,
endPosition = target . offset ( ) ,
animation = {
top : endPosition . top - fixTop ,
left : endPosition . left - fixLeft ,
height : target . innerHeight ( ) ,
width : target . innerWidth ( )
} ,
startPosition = elem . offset ( ) ,
transfer = $ ( "<div class='ui-effects-transfer'></div>" )
. appendTo ( document . body )
. addClass ( o . className )
. css ( {
top : startPosition . top - fixTop ,
left : startPosition . left - fixLeft ,
height : elem . innerHeight ( ) ,
width : elem . innerWidth ( ) ,
position : targetFixed ? "fixed" : "absolute"
} )
. animate ( animation , o . duration , o . easing , function ( ) {
transfer . remove ( ) ;
done ( ) ;
} ) ;
} ;
} ) ( jQuery ) ;