annotate jquery-ui.js @ 2:3c160414da2e default tip

initial upload
author shiltemann
date Thu, 26 Feb 2015 14:05:23 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1 /*! jQuery UI - v1.10.4 - 2014-01-17
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2 * http://jqueryui.com
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3 * Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.slider.js, jquery.ui.sortable.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4 * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8 var uuid = 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9 runiqueId = /^ui-id-\d+$/;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11 // $.ui might exist from components with no dependencies, e.g., $.ui.position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12 $.ui = $.ui || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14 $.extend( $.ui, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
16
3c160414da2e initial upload
shiltemann
parents:
diff changeset
17 keyCode: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
18 BACKSPACE: 8,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
19 COMMA: 188,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
20 DELETE: 46,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
21 DOWN: 40,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
22 END: 35,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
23 ENTER: 13,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
24 ESCAPE: 27,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
25 HOME: 36,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
26 LEFT: 37,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
27 NUMPAD_ADD: 107,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
28 NUMPAD_DECIMAL: 110,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
29 NUMPAD_DIVIDE: 111,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
30 NUMPAD_ENTER: 108,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
31 NUMPAD_MULTIPLY: 106,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
32 NUMPAD_SUBTRACT: 109,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
33 PAGE_DOWN: 34,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
34 PAGE_UP: 33,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
35 PERIOD: 190,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
36 RIGHT: 39,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
37 SPACE: 32,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
38 TAB: 9,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
39 UP: 38
3c160414da2e initial upload
shiltemann
parents:
diff changeset
40 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
41 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
42
3c160414da2e initial upload
shiltemann
parents:
diff changeset
43 // plugins
3c160414da2e initial upload
shiltemann
parents:
diff changeset
44 $.fn.extend({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
45 focus: (function( orig ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
46 return function( delay, fn ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
47 return typeof delay === "number" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
48 this.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
49 var elem = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
50 setTimeout(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
51 $( elem ).focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
52 if ( fn ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
53 fn.call( elem );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
54 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
55 }, delay );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
56 }) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
57 orig.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
58 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
59 })( $.fn.focus ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
60
3c160414da2e initial upload
shiltemann
parents:
diff changeset
61 scrollParent: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
62 var scrollParent;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
63 if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
64 scrollParent = this.parents().filter(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
65 return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
66 }).eq(0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
67 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
68 scrollParent = this.parents().filter(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
69 return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
70 }).eq(0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
71 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
72
3c160414da2e initial upload
shiltemann
parents:
diff changeset
73 return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
74 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
75
3c160414da2e initial upload
shiltemann
parents:
diff changeset
76 zIndex: function( zIndex ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
77 if ( zIndex !== undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
78 return this.css( "zIndex", zIndex );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
79 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
80
3c160414da2e initial upload
shiltemann
parents:
diff changeset
81 if ( this.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
82 var elem = $( this[ 0 ] ), position, value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
83 while ( elem.length && elem[ 0 ] !== document ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
84 // Ignore z-index if position is set to a value where z-index is ignored by the browser
3c160414da2e initial upload
shiltemann
parents:
diff changeset
85 // This makes behavior of this function consistent across browsers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
86 // WebKit always returns auto if the element is positioned
3c160414da2e initial upload
shiltemann
parents:
diff changeset
87 position = elem.css( "position" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
88 if ( position === "absolute" || position === "relative" || position === "fixed" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
89 // IE returns 0 when zIndex is not specified
3c160414da2e initial upload
shiltemann
parents:
diff changeset
90 // other browsers return a string
3c160414da2e initial upload
shiltemann
parents:
diff changeset
91 // we ignore the case of nested elements with an explicit value of 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
92 // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
3c160414da2e initial upload
shiltemann
parents:
diff changeset
93 value = parseInt( elem.css( "zIndex" ), 10 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
94 if ( !isNaN( value ) && value !== 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
95 return value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
96 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
97 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
98 elem = elem.parent();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
99 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
100 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
101
3c160414da2e initial upload
shiltemann
parents:
diff changeset
102 return 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
103 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
104
3c160414da2e initial upload
shiltemann
parents:
diff changeset
105 uniqueId: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
106 return this.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
107 if ( !this.id ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
108 this.id = "ui-id-" + (++uuid);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
109 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
110 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
111 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
112
3c160414da2e initial upload
shiltemann
parents:
diff changeset
113 removeUniqueId: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
114 return this.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
115 if ( runiqueId.test( this.id ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
116 $( this ).removeAttr( "id" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
117 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
118 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
119 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
120 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
121
3c160414da2e initial upload
shiltemann
parents:
diff changeset
122 // selectors
3c160414da2e initial upload
shiltemann
parents:
diff changeset
123 function focusable( element, isTabIndexNotNaN ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
124 var map, mapName, img,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
125 nodeName = element.nodeName.toLowerCase();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
126 if ( "area" === nodeName ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
127 map = element.parentNode;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
128 mapName = map.name;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
129 if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
130 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
131 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
132 img = $( "img[usemap=#" + mapName + "]" )[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
133 return !!img && visible( img );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
134 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
135 return ( /input|select|textarea|button|object/.test( nodeName ) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
136 !element.disabled :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
137 "a" === nodeName ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
138 element.href || isTabIndexNotNaN :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
139 isTabIndexNotNaN) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
140 // the element and all of its ancestors must be visible
3c160414da2e initial upload
shiltemann
parents:
diff changeset
141 visible( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
142 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
143
3c160414da2e initial upload
shiltemann
parents:
diff changeset
144 function visible( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
145 return $.expr.filters.visible( element ) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
146 !$( element ).parents().addBack().filter(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
147 return $.css( this, "visibility" ) === "hidden";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
148 }).length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
149 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
150
3c160414da2e initial upload
shiltemann
parents:
diff changeset
151 $.extend( $.expr[ ":" ], {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
152 data: $.expr.createPseudo ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
153 $.expr.createPseudo(function( dataName ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
154 return function( elem ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
155 return !!$.data( elem, dataName );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
156 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
157 }) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
158 // support: jQuery <1.8
3c160414da2e initial upload
shiltemann
parents:
diff changeset
159 function( elem, i, match ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
160 return !!$.data( elem, match[ 3 ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
161 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
162
3c160414da2e initial upload
shiltemann
parents:
diff changeset
163 focusable: function( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
164 return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
165 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
166
3c160414da2e initial upload
shiltemann
parents:
diff changeset
167 tabbable: function( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
168 var tabIndex = $.attr( element, "tabindex" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
169 isTabIndexNaN = isNaN( tabIndex );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
170 return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
171 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
172 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
173
3c160414da2e initial upload
shiltemann
parents:
diff changeset
174 // support: jQuery <1.8
3c160414da2e initial upload
shiltemann
parents:
diff changeset
175 if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
176 $.each( [ "Width", "Height" ], function( i, name ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
177 var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
178 type = name.toLowerCase(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
179 orig = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
180 innerWidth: $.fn.innerWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
181 innerHeight: $.fn.innerHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
182 outerWidth: $.fn.outerWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
183 outerHeight: $.fn.outerHeight
3c160414da2e initial upload
shiltemann
parents:
diff changeset
184 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
185
3c160414da2e initial upload
shiltemann
parents:
diff changeset
186 function reduce( elem, size, border, margin ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
187 $.each( side, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
188 size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
189 if ( border ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
190 size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
191 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
192 if ( margin ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
193 size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
194 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
195 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
196 return size;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
197 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
198
3c160414da2e initial upload
shiltemann
parents:
diff changeset
199 $.fn[ "inner" + name ] = function( size ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
200 if ( size === undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
201 return orig[ "inner" + name ].call( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
202 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
203
3c160414da2e initial upload
shiltemann
parents:
diff changeset
204 return this.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
205 $( this ).css( type, reduce( this, size ) + "px" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
206 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
207 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
208
3c160414da2e initial upload
shiltemann
parents:
diff changeset
209 $.fn[ "outer" + name] = function( size, margin ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
210 if ( typeof size !== "number" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
211 return orig[ "outer" + name ].call( this, size );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
212 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
213
3c160414da2e initial upload
shiltemann
parents:
diff changeset
214 return this.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
215 $( this).css( type, reduce( this, size, true, margin ) + "px" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
216 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
217 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
218 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
219 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
220
3c160414da2e initial upload
shiltemann
parents:
diff changeset
221 // support: jQuery <1.8
3c160414da2e initial upload
shiltemann
parents:
diff changeset
222 if ( !$.fn.addBack ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
223 $.fn.addBack = function( selector ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
224 return this.add( selector == null ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
225 this.prevObject : this.prevObject.filter( selector )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
226 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
227 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
228 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
229
3c160414da2e initial upload
shiltemann
parents:
diff changeset
230 // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
231 if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
232 $.fn.removeData = (function( removeData ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
233 return function( key ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
234 if ( arguments.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
235 return removeData.call( this, $.camelCase( key ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
236 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
237 return removeData.call( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
238 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
239 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
240 })( $.fn.removeData );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
241 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
242
3c160414da2e initial upload
shiltemann
parents:
diff changeset
243
3c160414da2e initial upload
shiltemann
parents:
diff changeset
244
3c160414da2e initial upload
shiltemann
parents:
diff changeset
245
3c160414da2e initial upload
shiltemann
parents:
diff changeset
246
3c160414da2e initial upload
shiltemann
parents:
diff changeset
247 // deprecated
3c160414da2e initial upload
shiltemann
parents:
diff changeset
248 $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
249
3c160414da2e initial upload
shiltemann
parents:
diff changeset
250 $.support.selectstart = "onselectstart" in document.createElement( "div" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
251 $.fn.extend({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
252 disableSelection: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
253 return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
254 ".ui-disableSelection", function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
255 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
256 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
257 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
258
3c160414da2e initial upload
shiltemann
parents:
diff changeset
259 enableSelection: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
260 return this.unbind( ".ui-disableSelection" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
261 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
262 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
263
3c160414da2e initial upload
shiltemann
parents:
diff changeset
264 $.extend( $.ui, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
265 // $.ui.plugin is deprecated. Use $.widget() extensions instead.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
266 plugin: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
267 add: function( module, option, set ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
268 var i,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
269 proto = $.ui[ module ].prototype;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
270 for ( i in set ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
271 proto.plugins[ i ] = proto.plugins[ i ] || [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
272 proto.plugins[ i ].push( [ option, set[ i ] ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
273 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
274 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
275 call: function( instance, name, args ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
276 var i,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
277 set = instance.plugins[ name ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
278 if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
279 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
280 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
281
3c160414da2e initial upload
shiltemann
parents:
diff changeset
282 for ( i = 0; i < set.length; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
283 if ( instance.options[ set[ i ][ 0 ] ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
284 set[ i ][ 1 ].apply( instance.element, args );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
285 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
286 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
287 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
288 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
289
3c160414da2e initial upload
shiltemann
parents:
diff changeset
290 // only used by resizable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
291 hasScroll: function( el, a ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
292
3c160414da2e initial upload
shiltemann
parents:
diff changeset
293 //If overflow is hidden, the element might have extra content, but the user wants to hide it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
294 if ( $( el ).css( "overflow" ) === "hidden") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
295 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
296 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
297
3c160414da2e initial upload
shiltemann
parents:
diff changeset
298 var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
299 has = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
300
3c160414da2e initial upload
shiltemann
parents:
diff changeset
301 if ( el[ scroll ] > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
302 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
303 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
304
3c160414da2e initial upload
shiltemann
parents:
diff changeset
305 // TODO: determine which cases actually cause this to happen
3c160414da2e initial upload
shiltemann
parents:
diff changeset
306 // if the element doesn't have the scroll set, see if it's possible to
3c160414da2e initial upload
shiltemann
parents:
diff changeset
307 // set the scroll
3c160414da2e initial upload
shiltemann
parents:
diff changeset
308 el[ scroll ] = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
309 has = ( el[ scroll ] > 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
310 el[ scroll ] = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
311 return has;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
312 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
313 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
314
3c160414da2e initial upload
shiltemann
parents:
diff changeset
315 })( jQuery );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
316 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
317
3c160414da2e initial upload
shiltemann
parents:
diff changeset
318 var uuid = 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
319 slice = Array.prototype.slice,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
320 _cleanData = $.cleanData;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
321 $.cleanData = function( elems ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
322 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
323 try {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
324 $( elem ).triggerHandler( "remove" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
325 // http://bugs.jquery.com/ticket/8235
3c160414da2e initial upload
shiltemann
parents:
diff changeset
326 } catch( e ) {}
3c160414da2e initial upload
shiltemann
parents:
diff changeset
327 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
328 _cleanData( elems );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
329 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
330
3c160414da2e initial upload
shiltemann
parents:
diff changeset
331 $.widget = function( name, base, prototype ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
332 var fullName, existingConstructor, constructor, basePrototype,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
333 // proxiedPrototype allows the provided prototype to remain unmodified
3c160414da2e initial upload
shiltemann
parents:
diff changeset
334 // so that it can be used as a mixin for multiple widgets (#8876)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
335 proxiedPrototype = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
336 namespace = name.split( "." )[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
337
3c160414da2e initial upload
shiltemann
parents:
diff changeset
338 name = name.split( "." )[ 1 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
339 fullName = namespace + "-" + name;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
340
3c160414da2e initial upload
shiltemann
parents:
diff changeset
341 if ( !prototype ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
342 prototype = base;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
343 base = $.Widget;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
344 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
345
3c160414da2e initial upload
shiltemann
parents:
diff changeset
346 // create selector for plugin
3c160414da2e initial upload
shiltemann
parents:
diff changeset
347 $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
348 return !!$.data( elem, fullName );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
349 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
350
3c160414da2e initial upload
shiltemann
parents:
diff changeset
351 $[ namespace ] = $[ namespace ] || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
352 existingConstructor = $[ namespace ][ name ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
353 constructor = $[ namespace ][ name ] = function( options, element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
354 // allow instantiation without "new" keyword
3c160414da2e initial upload
shiltemann
parents:
diff changeset
355 if ( !this._createWidget ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
356 return new constructor( options, element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
357 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
358
3c160414da2e initial upload
shiltemann
parents:
diff changeset
359 // allow instantiation without initializing for simple inheritance
3c160414da2e initial upload
shiltemann
parents:
diff changeset
360 // must use "new" keyword (the code above always passes args)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
361 if ( arguments.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
362 this._createWidget( options, element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
363 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
364 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
365 // extend with the existing constructor to carry over any static properties
3c160414da2e initial upload
shiltemann
parents:
diff changeset
366 $.extend( constructor, existingConstructor, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
367 version: prototype.version,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
368 // copy the object used to create the prototype in case we need to
3c160414da2e initial upload
shiltemann
parents:
diff changeset
369 // redefine the widget later
3c160414da2e initial upload
shiltemann
parents:
diff changeset
370 _proto: $.extend( {}, prototype ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
371 // track widgets that inherit from this widget in case this widget is
3c160414da2e initial upload
shiltemann
parents:
diff changeset
372 // redefined after a widget inherits from it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
373 _childConstructors: []
3c160414da2e initial upload
shiltemann
parents:
diff changeset
374 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
375
3c160414da2e initial upload
shiltemann
parents:
diff changeset
376 basePrototype = new base();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
377 // we need to make the options hash a property directly on the new instance
3c160414da2e initial upload
shiltemann
parents:
diff changeset
378 // otherwise we'll modify the options hash on the prototype that we're
3c160414da2e initial upload
shiltemann
parents:
diff changeset
379 // inheriting from
3c160414da2e initial upload
shiltemann
parents:
diff changeset
380 basePrototype.options = $.widget.extend( {}, basePrototype.options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
381 $.each( prototype, function( prop, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
382 if ( !$.isFunction( value ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
383 proxiedPrototype[ prop ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
384 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
385 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
386 proxiedPrototype[ prop ] = (function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
387 var _super = function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
388 return base.prototype[ prop ].apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
389 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
390 _superApply = function( args ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
391 return base.prototype[ prop ].apply( this, args );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
392 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
393 return function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
394 var __super = this._super,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
395 __superApply = this._superApply,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
396 returnValue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
397
3c160414da2e initial upload
shiltemann
parents:
diff changeset
398 this._super = _super;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
399 this._superApply = _superApply;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
400
3c160414da2e initial upload
shiltemann
parents:
diff changeset
401 returnValue = value.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
402
3c160414da2e initial upload
shiltemann
parents:
diff changeset
403 this._super = __super;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
404 this._superApply = __superApply;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
405
3c160414da2e initial upload
shiltemann
parents:
diff changeset
406 return returnValue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
407 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
408 })();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
409 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
410 constructor.prototype = $.widget.extend( basePrototype, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
411 // TODO: remove support for widgetEventPrefix
3c160414da2e initial upload
shiltemann
parents:
diff changeset
412 // always use the name + a colon as the prefix, e.g., draggable:start
3c160414da2e initial upload
shiltemann
parents:
diff changeset
413 // don't prefix for widgets that aren't DOM-based
3c160414da2e initial upload
shiltemann
parents:
diff changeset
414 widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
3c160414da2e initial upload
shiltemann
parents:
diff changeset
415 }, proxiedPrototype, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
416 constructor: constructor,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
417 namespace: namespace,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
418 widgetName: name,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
419 widgetFullName: fullName
3c160414da2e initial upload
shiltemann
parents:
diff changeset
420 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
421
3c160414da2e initial upload
shiltemann
parents:
diff changeset
422 // If this widget is being redefined then we need to find all widgets that
3c160414da2e initial upload
shiltemann
parents:
diff changeset
423 // are inheriting from it and redefine all of them so that they inherit from
3c160414da2e initial upload
shiltemann
parents:
diff changeset
424 // the new version of this widget. We're essentially trying to replace one
3c160414da2e initial upload
shiltemann
parents:
diff changeset
425 // level in the prototype chain.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
426 if ( existingConstructor ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
427 $.each( existingConstructor._childConstructors, function( i, child ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
428 var childPrototype = child.prototype;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
429
3c160414da2e initial upload
shiltemann
parents:
diff changeset
430 // redefine the child widget using the same prototype that was
3c160414da2e initial upload
shiltemann
parents:
diff changeset
431 // originally used, but inherit from the new version of the base
3c160414da2e initial upload
shiltemann
parents:
diff changeset
432 $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
433 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
434 // remove the list of existing child constructors from the old constructor
3c160414da2e initial upload
shiltemann
parents:
diff changeset
435 // so the old child constructors can be garbage collected
3c160414da2e initial upload
shiltemann
parents:
diff changeset
436 delete existingConstructor._childConstructors;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
437 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
438 base._childConstructors.push( constructor );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
439 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
440
3c160414da2e initial upload
shiltemann
parents:
diff changeset
441 $.widget.bridge( name, constructor );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
442 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
443
3c160414da2e initial upload
shiltemann
parents:
diff changeset
444 $.widget.extend = function( target ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
445 var input = slice.call( arguments, 1 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
446 inputIndex = 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
447 inputLength = input.length,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
448 key,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
449 value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
450 for ( ; inputIndex < inputLength; inputIndex++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
451 for ( key in input[ inputIndex ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
452 value = input[ inputIndex ][ key ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
453 if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
454 // Clone objects
3c160414da2e initial upload
shiltemann
parents:
diff changeset
455 if ( $.isPlainObject( value ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
456 target[ key ] = $.isPlainObject( target[ key ] ) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
457 $.widget.extend( {}, target[ key ], value ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
458 // Don't extend strings, arrays, etc. with objects
3c160414da2e initial upload
shiltemann
parents:
diff changeset
459 $.widget.extend( {}, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
460 // Copy everything else by reference
3c160414da2e initial upload
shiltemann
parents:
diff changeset
461 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
462 target[ key ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
463 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
464 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
465 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
466 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
467 return target;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
468 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
469
3c160414da2e initial upload
shiltemann
parents:
diff changeset
470 $.widget.bridge = function( name, object ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
471 var fullName = object.prototype.widgetFullName || name;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
472 $.fn[ name ] = function( options ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
473 var isMethodCall = typeof options === "string",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
474 args = slice.call( arguments, 1 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
475 returnValue = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
476
3c160414da2e initial upload
shiltemann
parents:
diff changeset
477 // allow multiple hashes to be passed on init
3c160414da2e initial upload
shiltemann
parents:
diff changeset
478 options = !isMethodCall && args.length ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
479 $.widget.extend.apply( null, [ options ].concat(args) ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
480 options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
481
3c160414da2e initial upload
shiltemann
parents:
diff changeset
482 if ( isMethodCall ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
483 this.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
484 var methodValue,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
485 instance = $.data( this, fullName );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
486 if ( !instance ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
487 return $.error( "cannot call methods on " + name + " prior to initialization; " +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
488 "attempted to call method '" + options + "'" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
489 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
490 if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
491 return $.error( "no such method '" + options + "' for " + name + " widget instance" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
492 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
493 methodValue = instance[ options ].apply( instance, args );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
494 if ( methodValue !== instance && methodValue !== undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
495 returnValue = methodValue && methodValue.jquery ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
496 returnValue.pushStack( methodValue.get() ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
497 methodValue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
498 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
499 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
500 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
501 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
502 this.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
503 var instance = $.data( this, fullName );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
504 if ( instance ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
505 instance.option( options || {} )._init();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
506 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
507 $.data( this, fullName, new object( options, this ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
508 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
509 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
510 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
511
3c160414da2e initial upload
shiltemann
parents:
diff changeset
512 return returnValue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
513 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
514 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
515
3c160414da2e initial upload
shiltemann
parents:
diff changeset
516 $.Widget = function( /* options, element */ ) {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
517 $.Widget._childConstructors = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
518
3c160414da2e initial upload
shiltemann
parents:
diff changeset
519 $.Widget.prototype = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
520 widgetName: "widget",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
521 widgetEventPrefix: "",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
522 defaultElement: "<div>",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
523 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
524 disabled: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
525
3c160414da2e initial upload
shiltemann
parents:
diff changeset
526 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
527 create: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
528 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
529 _createWidget: function( options, element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
530 element = $( element || this.defaultElement || this )[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
531 this.element = $( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
532 this.uuid = uuid++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
533 this.eventNamespace = "." + this.widgetName + this.uuid;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
534 this.options = $.widget.extend( {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
535 this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
536 this._getCreateOptions(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
537 options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
538
3c160414da2e initial upload
shiltemann
parents:
diff changeset
539 this.bindings = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
540 this.hoverable = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
541 this.focusable = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
542
3c160414da2e initial upload
shiltemann
parents:
diff changeset
543 if ( element !== this ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
544 $.data( element, this.widgetFullName, this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
545 this._on( true, this.element, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
546 remove: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
547 if ( event.target === element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
548 this.destroy();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
549 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
550 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
551 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
552 this.document = $( element.style ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
553 // element within the document
3c160414da2e initial upload
shiltemann
parents:
diff changeset
554 element.ownerDocument :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
555 // element is window or document
3c160414da2e initial upload
shiltemann
parents:
diff changeset
556 element.document || element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
557 this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
558 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
559
3c160414da2e initial upload
shiltemann
parents:
diff changeset
560 this._create();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
561 this._trigger( "create", null, this._getCreateEventData() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
562 this._init();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
563 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
564 _getCreateOptions: $.noop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
565 _getCreateEventData: $.noop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
566 _create: $.noop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
567 _init: $.noop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
568
3c160414da2e initial upload
shiltemann
parents:
diff changeset
569 destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
570 this._destroy();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
571 // we can probably remove the unbind calls in 2.0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
572 // all event bindings should go through this._on()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
573 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
574 .unbind( this.eventNamespace )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
575 // 1.9 BC for #7810
3c160414da2e initial upload
shiltemann
parents:
diff changeset
576 // TODO remove dual storage
3c160414da2e initial upload
shiltemann
parents:
diff changeset
577 .removeData( this.widgetName )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
578 .removeData( this.widgetFullName )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
579 // support: jquery <1.6.3
3c160414da2e initial upload
shiltemann
parents:
diff changeset
580 // http://bugs.jquery.com/ticket/9413
3c160414da2e initial upload
shiltemann
parents:
diff changeset
581 .removeData( $.camelCase( this.widgetFullName ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
582 this.widget()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
583 .unbind( this.eventNamespace )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
584 .removeAttr( "aria-disabled" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
585 .removeClass(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
586 this.widgetFullName + "-disabled " +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
587 "ui-state-disabled" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
588
3c160414da2e initial upload
shiltemann
parents:
diff changeset
589 // clean up events and states
3c160414da2e initial upload
shiltemann
parents:
diff changeset
590 this.bindings.unbind( this.eventNamespace );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
591 this.hoverable.removeClass( "ui-state-hover" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
592 this.focusable.removeClass( "ui-state-focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
593 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
594 _destroy: $.noop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
595
3c160414da2e initial upload
shiltemann
parents:
diff changeset
596 widget: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
597 return this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
598 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
599
3c160414da2e initial upload
shiltemann
parents:
diff changeset
600 option: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
601 var options = key,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
602 parts,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
603 curOption,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
604 i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
605
3c160414da2e initial upload
shiltemann
parents:
diff changeset
606 if ( arguments.length === 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
607 // don't return a reference to the internal hash
3c160414da2e initial upload
shiltemann
parents:
diff changeset
608 return $.widget.extend( {}, this.options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
609 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
610
3c160414da2e initial upload
shiltemann
parents:
diff changeset
611 if ( typeof key === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
612 // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
613 options = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
614 parts = key.split( "." );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
615 key = parts.shift();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
616 if ( parts.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
617 curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
618 for ( i = 0; i < parts.length - 1; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
619 curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
620 curOption = curOption[ parts[ i ] ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
621 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
622 key = parts.pop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
623 if ( arguments.length === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
624 return curOption[ key ] === undefined ? null : curOption[ key ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
625 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
626 curOption[ key ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
627 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
628 if ( arguments.length === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
629 return this.options[ key ] === undefined ? null : this.options[ key ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
630 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
631 options[ key ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
632 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
633 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
634
3c160414da2e initial upload
shiltemann
parents:
diff changeset
635 this._setOptions( options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
636
3c160414da2e initial upload
shiltemann
parents:
diff changeset
637 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
638 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
639 _setOptions: function( options ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
640 var key;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
641
3c160414da2e initial upload
shiltemann
parents:
diff changeset
642 for ( key in options ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
643 this._setOption( key, options[ key ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
644 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
645
3c160414da2e initial upload
shiltemann
parents:
diff changeset
646 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
647 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
648 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
649 this.options[ key ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
650
3c160414da2e initial upload
shiltemann
parents:
diff changeset
651 if ( key === "disabled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
652 this.widget()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
653 .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
654 .attr( "aria-disabled", value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
655 this.hoverable.removeClass( "ui-state-hover" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
656 this.focusable.removeClass( "ui-state-focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
657 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
658
3c160414da2e initial upload
shiltemann
parents:
diff changeset
659 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
660 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
661
3c160414da2e initial upload
shiltemann
parents:
diff changeset
662 enable: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
663 return this._setOption( "disabled", false );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
664 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
665 disable: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
666 return this._setOption( "disabled", true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
667 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
668
3c160414da2e initial upload
shiltemann
parents:
diff changeset
669 _on: function( suppressDisabledCheck, element, handlers ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
670 var delegateElement,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
671 instance = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
672
3c160414da2e initial upload
shiltemann
parents:
diff changeset
673 // no suppressDisabledCheck flag, shuffle arguments
3c160414da2e initial upload
shiltemann
parents:
diff changeset
674 if ( typeof suppressDisabledCheck !== "boolean" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
675 handlers = element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
676 element = suppressDisabledCheck;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
677 suppressDisabledCheck = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
678 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
679
3c160414da2e initial upload
shiltemann
parents:
diff changeset
680 // no element argument, shuffle and use this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
681 if ( !handlers ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
682 handlers = element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
683 element = this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
684 delegateElement = this.widget();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
685 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
686 // accept selectors, DOM elements
3c160414da2e initial upload
shiltemann
parents:
diff changeset
687 element = delegateElement = $( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
688 this.bindings = this.bindings.add( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
689 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
690
3c160414da2e initial upload
shiltemann
parents:
diff changeset
691 $.each( handlers, function( event, handler ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
692 function handlerProxy() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
693 // allow widgets to customize the disabled handling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
694 // - disabled as an array instead of boolean
3c160414da2e initial upload
shiltemann
parents:
diff changeset
695 // - disabled class as method for disabling individual parts
3c160414da2e initial upload
shiltemann
parents:
diff changeset
696 if ( !suppressDisabledCheck &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
697 ( instance.options.disabled === true ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
698 $( this ).hasClass( "ui-state-disabled" ) ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
699 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
700 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
701 return ( typeof handler === "string" ? instance[ handler ] : handler )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
702 .apply( instance, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
703 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
704
3c160414da2e initial upload
shiltemann
parents:
diff changeset
705 // copy the guid so direct unbinding works
3c160414da2e initial upload
shiltemann
parents:
diff changeset
706 if ( typeof handler !== "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
707 handlerProxy.guid = handler.guid =
3c160414da2e initial upload
shiltemann
parents:
diff changeset
708 handler.guid || handlerProxy.guid || $.guid++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
709 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
710
3c160414da2e initial upload
shiltemann
parents:
diff changeset
711 var match = event.match( /^(\w+)\s*(.*)$/ ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
712 eventName = match[1] + instance.eventNamespace,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
713 selector = match[2];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
714 if ( selector ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
715 delegateElement.delegate( selector, eventName, handlerProxy );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
716 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
717 element.bind( eventName, handlerProxy );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
718 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
719 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
720 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
721
3c160414da2e initial upload
shiltemann
parents:
diff changeset
722 _off: function( element, eventName ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
723 eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
724 element.unbind( eventName ).undelegate( eventName );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
725 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
726
3c160414da2e initial upload
shiltemann
parents:
diff changeset
727 _delay: function( handler, delay ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
728 function handlerProxy() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
729 return ( typeof handler === "string" ? instance[ handler ] : handler )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
730 .apply( instance, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
731 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
732 var instance = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
733 return setTimeout( handlerProxy, delay || 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
734 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
735
3c160414da2e initial upload
shiltemann
parents:
diff changeset
736 _hoverable: function( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
737 this.hoverable = this.hoverable.add( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
738 this._on( element, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
739 mouseenter: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
740 $( event.currentTarget ).addClass( "ui-state-hover" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
741 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
742 mouseleave: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
743 $( event.currentTarget ).removeClass( "ui-state-hover" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
744 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
745 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
746 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
747
3c160414da2e initial upload
shiltemann
parents:
diff changeset
748 _focusable: function( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
749 this.focusable = this.focusable.add( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
750 this._on( element, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
751 focusin: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
752 $( event.currentTarget ).addClass( "ui-state-focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
753 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
754 focusout: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
755 $( event.currentTarget ).removeClass( "ui-state-focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
756 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
757 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
758 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
759
3c160414da2e initial upload
shiltemann
parents:
diff changeset
760 _trigger: function( type, event, data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
761 var prop, orig,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
762 callback = this.options[ type ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
763
3c160414da2e initial upload
shiltemann
parents:
diff changeset
764 data = data || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
765 event = $.Event( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
766 event.type = ( type === this.widgetEventPrefix ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
767 type :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
768 this.widgetEventPrefix + type ).toLowerCase();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
769 // the original event may come from any element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
770 // so we need to reset the target on the new event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
771 event.target = this.element[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
772
3c160414da2e initial upload
shiltemann
parents:
diff changeset
773 // copy original event properties over to the new event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
774 orig = event.originalEvent;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
775 if ( orig ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
776 for ( prop in orig ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
777 if ( !( prop in event ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
778 event[ prop ] = orig[ prop ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
779 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
780 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
781 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
782
3c160414da2e initial upload
shiltemann
parents:
diff changeset
783 this.element.trigger( event, data );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
784 return !( $.isFunction( callback ) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
785 callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
786 event.isDefaultPrevented() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
787 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
788 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
789
3c160414da2e initial upload
shiltemann
parents:
diff changeset
790 $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
791 $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
792 if ( typeof options === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
793 options = { effect: options };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
794 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
795 var hasOptions,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
796 effectName = !options ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
797 method :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
798 options === true || typeof options === "number" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
799 defaultEffect :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
800 options.effect || defaultEffect;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
801 options = options || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
802 if ( typeof options === "number" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
803 options = { duration: options };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
804 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
805 hasOptions = !$.isEmptyObject( options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
806 options.complete = callback;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
807 if ( options.delay ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
808 element.delay( options.delay );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
809 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
810 if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
811 element[ method ]( options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
812 } else if ( effectName !== method && element[ effectName ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
813 element[ effectName ]( options.duration, options.easing, callback );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
814 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
815 element.queue(function( next ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
816 $( this )[ method ]();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
817 if ( callback ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
818 callback.call( element[ 0 ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
819 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
820 next();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
821 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
822 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
823 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
824 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
825
3c160414da2e initial upload
shiltemann
parents:
diff changeset
826 })( jQuery );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
827 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
828
3c160414da2e initial upload
shiltemann
parents:
diff changeset
829 var mouseHandled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
830 $( document ).mouseup( function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
831 mouseHandled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
832 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
833
3c160414da2e initial upload
shiltemann
parents:
diff changeset
834 $.widget("ui.mouse", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
835 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
836 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
837 cancel: "input,textarea,button,select,option",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
838 distance: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
839 delay: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
840 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
841 _mouseInit: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
842 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
843
3c160414da2e initial upload
shiltemann
parents:
diff changeset
844 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
845 .bind("mousedown."+this.widgetName, function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
846 return that._mouseDown(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
847 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
848 .bind("click."+this.widgetName, function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
849 if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
850 $.removeData(event.target, that.widgetName + ".preventClickEvent");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
851 event.stopImmediatePropagation();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
852 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
853 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
854 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
855
3c160414da2e initial upload
shiltemann
parents:
diff changeset
856 this.started = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
857 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
858
3c160414da2e initial upload
shiltemann
parents:
diff changeset
859 // TODO: make sure destroying one instance of mouse doesn't mess with
3c160414da2e initial upload
shiltemann
parents:
diff changeset
860 // other instances of mouse
3c160414da2e initial upload
shiltemann
parents:
diff changeset
861 _mouseDestroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
862 this.element.unbind("."+this.widgetName);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
863 if ( this._mouseMoveDelegate ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
864 $(document)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
865 .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
866 .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
867 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
868 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
869
3c160414da2e initial upload
shiltemann
parents:
diff changeset
870 _mouseDown: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
871 // don't let more than one widget handle mouseStart
3c160414da2e initial upload
shiltemann
parents:
diff changeset
872 if( mouseHandled ) { return; }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
873
3c160414da2e initial upload
shiltemann
parents:
diff changeset
874 // we may have missed mouseup (out of window)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
875 (this._mouseStarted && this._mouseUp(event));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
876
3c160414da2e initial upload
shiltemann
parents:
diff changeset
877 this._mouseDownEvent = event;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
878
3c160414da2e initial upload
shiltemann
parents:
diff changeset
879 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
880 btnIsLeft = (event.which === 1),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
881 // event.target.nodeName works around a bug in IE 8 with
3c160414da2e initial upload
shiltemann
parents:
diff changeset
882 // disabled inputs (#7620)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
883 elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
884 if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
885 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
886 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
887
3c160414da2e initial upload
shiltemann
parents:
diff changeset
888 this.mouseDelayMet = !this.options.delay;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
889 if (!this.mouseDelayMet) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
890 this._mouseDelayTimer = setTimeout(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
891 that.mouseDelayMet = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
892 }, this.options.delay);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
893 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
894
3c160414da2e initial upload
shiltemann
parents:
diff changeset
895 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
896 this._mouseStarted = (this._mouseStart(event) !== false);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
897 if (!this._mouseStarted) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
898 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
899 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
900 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
901 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
902
3c160414da2e initial upload
shiltemann
parents:
diff changeset
903 // Click event may never have fired (Gecko & Opera)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
904 if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
905 $.removeData(event.target, this.widgetName + ".preventClickEvent");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
906 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
907
3c160414da2e initial upload
shiltemann
parents:
diff changeset
908 // these delegates are required to keep context
3c160414da2e initial upload
shiltemann
parents:
diff changeset
909 this._mouseMoveDelegate = function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
910 return that._mouseMove(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
911 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
912 this._mouseUpDelegate = function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
913 return that._mouseUp(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
914 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
915 $(document)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
916 .bind("mousemove."+this.widgetName, this._mouseMoveDelegate)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
917 .bind("mouseup."+this.widgetName, this._mouseUpDelegate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
918
3c160414da2e initial upload
shiltemann
parents:
diff changeset
919 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
920
3c160414da2e initial upload
shiltemann
parents:
diff changeset
921 mouseHandled = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
922 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
923 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
924
3c160414da2e initial upload
shiltemann
parents:
diff changeset
925 _mouseMove: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
926 // IE mouseup check - mouseup happened when mouse was out of window
3c160414da2e initial upload
shiltemann
parents:
diff changeset
927 if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
928 return this._mouseUp(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
929 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
930
3c160414da2e initial upload
shiltemann
parents:
diff changeset
931 if (this._mouseStarted) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
932 this._mouseDrag(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
933 return event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
934 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
935
3c160414da2e initial upload
shiltemann
parents:
diff changeset
936 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
937 this._mouseStarted =
3c160414da2e initial upload
shiltemann
parents:
diff changeset
938 (this._mouseStart(this._mouseDownEvent, event) !== false);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
939 (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
940 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
941
3c160414da2e initial upload
shiltemann
parents:
diff changeset
942 return !this._mouseStarted;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
943 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
944
3c160414da2e initial upload
shiltemann
parents:
diff changeset
945 _mouseUp: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
946 $(document)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
947 .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
948 .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
949
3c160414da2e initial upload
shiltemann
parents:
diff changeset
950 if (this._mouseStarted) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
951 this._mouseStarted = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
952
3c160414da2e initial upload
shiltemann
parents:
diff changeset
953 if (event.target === this._mouseDownEvent.target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
954 $.data(event.target, this.widgetName + ".preventClickEvent", true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
955 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
956
3c160414da2e initial upload
shiltemann
parents:
diff changeset
957 this._mouseStop(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
958 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
959
3c160414da2e initial upload
shiltemann
parents:
diff changeset
960 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
961 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
962
3c160414da2e initial upload
shiltemann
parents:
diff changeset
963 _mouseDistanceMet: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
964 return (Math.max(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
965 Math.abs(this._mouseDownEvent.pageX - event.pageX),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
966 Math.abs(this._mouseDownEvent.pageY - event.pageY)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
967 ) >= this.options.distance
3c160414da2e initial upload
shiltemann
parents:
diff changeset
968 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
969 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
970
3c160414da2e initial upload
shiltemann
parents:
diff changeset
971 _mouseDelayMet: function(/* event */) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
972 return this.mouseDelayMet;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
973 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
974
3c160414da2e initial upload
shiltemann
parents:
diff changeset
975 // These are placeholder methods, to be overriden by extending plugin
3c160414da2e initial upload
shiltemann
parents:
diff changeset
976 _mouseStart: function(/* event */) {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
977 _mouseDrag: function(/* event */) {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
978 _mouseStop: function(/* event */) {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
979 _mouseCapture: function(/* event */) { return true; }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
980 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
981
3c160414da2e initial upload
shiltemann
parents:
diff changeset
982 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
983 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
984
3c160414da2e initial upload
shiltemann
parents:
diff changeset
985 $.ui = $.ui || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
986
3c160414da2e initial upload
shiltemann
parents:
diff changeset
987 var cachedScrollbarWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
988 max = Math.max,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
989 abs = Math.abs,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
990 round = Math.round,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
991 rhorizontal = /left|center|right/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
992 rvertical = /top|center|bottom/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
993 roffset = /[\+\-]\d+(\.[\d]+)?%?/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
994 rposition = /^\w+/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
995 rpercent = /%$/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
996 _position = $.fn.position;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
997
3c160414da2e initial upload
shiltemann
parents:
diff changeset
998 function getOffsets( offsets, width, height ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
999 return [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1000 parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1001 parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1002 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1003 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1004
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1005 function parseCss( element, property ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1006 return parseInt( $.css( element, property ), 10 ) || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1007 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1008
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1009 function getDimensions( elem ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1010 var raw = elem[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1011 if ( raw.nodeType === 9 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1012 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1013 width: elem.width(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1014 height: elem.height(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1015 offset: { top: 0, left: 0 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1016 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1017 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1018 if ( $.isWindow( raw ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1019 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1020 width: elem.width(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1021 height: elem.height(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1022 offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1023 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1024 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1025 if ( raw.preventDefault ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1026 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1027 width: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1028 height: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1029 offset: { top: raw.pageY, left: raw.pageX }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1030 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1031 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1032 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1033 width: elem.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1034 height: elem.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1035 offset: elem.offset()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1036 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1037 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1038
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1039 $.position = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1040 scrollbarWidth: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1041 if ( cachedScrollbarWidth !== undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1042 return cachedScrollbarWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1043 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1044 var w1, w2,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1045 div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1046 innerDiv = div.children()[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1047
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1048 $( "body" ).append( div );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1049 w1 = innerDiv.offsetWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1050 div.css( "overflow", "scroll" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1051
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1052 w2 = innerDiv.offsetWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1053
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1054 if ( w1 === w2 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1055 w2 = div[0].clientWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1056 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1057
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1058 div.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1059
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1060 return (cachedScrollbarWidth = w1 - w2);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1061 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1062 getScrollInfo: function( within ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1063 var overflowX = within.isWindow || within.isDocument ? "" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1064 within.element.css( "overflow-x" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1065 overflowY = within.isWindow || within.isDocument ? "" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1066 within.element.css( "overflow-y" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1067 hasOverflowX = overflowX === "scroll" ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1068 ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1069 hasOverflowY = overflowY === "scroll" ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1070 ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1071 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1072 width: hasOverflowY ? $.position.scrollbarWidth() : 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1073 height: hasOverflowX ? $.position.scrollbarWidth() : 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1074 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1075 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1076 getWithinInfo: function( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1077 var withinElement = $( element || window ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1078 isWindow = $.isWindow( withinElement[0] ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1079 isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1080 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1081 element: withinElement,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1082 isWindow: isWindow,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1083 isDocument: isDocument,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1084 offset: withinElement.offset() || { left: 0, top: 0 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1085 scrollLeft: withinElement.scrollLeft(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1086 scrollTop: withinElement.scrollTop(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1087 width: isWindow ? withinElement.width() : withinElement.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1088 height: isWindow ? withinElement.height() : withinElement.outerHeight()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1089 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1090 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1091 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1092
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1093 $.fn.position = function( options ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1094 if ( !options || !options.of ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1095 return _position.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1096 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1097
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1098 // make a copy, we don't want to modify arguments
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1099 options = $.extend( {}, options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1100
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1101 var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1102 target = $( options.of ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1103 within = $.position.getWithinInfo( options.within ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1104 scrollInfo = $.position.getScrollInfo( within ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1105 collision = ( options.collision || "flip" ).split( " " ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1106 offsets = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1107
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1108 dimensions = getDimensions( target );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1109 if ( target[0].preventDefault ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1110 // force left top to allow flipping
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1111 options.at = "left top";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1112 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1113 targetWidth = dimensions.width;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1114 targetHeight = dimensions.height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1115 targetOffset = dimensions.offset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1116 // clone to reuse original targetOffset later
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1117 basePosition = $.extend( {}, targetOffset );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1118
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1119 // force my and at to have valid horizontal and vertical positions
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1120 // if a value is missing or invalid, it will be converted to center
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1121 $.each( [ "my", "at" ], function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1122 var pos = ( options[ this ] || "" ).split( " " ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1123 horizontalOffset,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1124 verticalOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1125
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1126 if ( pos.length === 1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1127 pos = rhorizontal.test( pos[ 0 ] ) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1128 pos.concat( [ "center" ] ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1129 rvertical.test( pos[ 0 ] ) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1130 [ "center" ].concat( pos ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1131 [ "center", "center" ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1132 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1133 pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1134 pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1135
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1136 // calculate offsets
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1137 horizontalOffset = roffset.exec( pos[ 0 ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1138 verticalOffset = roffset.exec( pos[ 1 ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1139 offsets[ this ] = [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1140 horizontalOffset ? horizontalOffset[ 0 ] : 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1141 verticalOffset ? verticalOffset[ 0 ] : 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1142 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1143
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1144 // reduce to just the positions without the offsets
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1145 options[ this ] = [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1146 rposition.exec( pos[ 0 ] )[ 0 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1147 rposition.exec( pos[ 1 ] )[ 0 ]
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1148 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1149 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1150
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1151 // normalize collision option
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1152 if ( collision.length === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1153 collision[ 1 ] = collision[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1154 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1155
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1156 if ( options.at[ 0 ] === "right" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1157 basePosition.left += targetWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1158 } else if ( options.at[ 0 ] === "center" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1159 basePosition.left += targetWidth / 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1160 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1161
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1162 if ( options.at[ 1 ] === "bottom" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1163 basePosition.top += targetHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1164 } else if ( options.at[ 1 ] === "center" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1165 basePosition.top += targetHeight / 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1166 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1167
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1168 atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1169 basePosition.left += atOffset[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1170 basePosition.top += atOffset[ 1 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1171
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1172 return this.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1173 var collisionPosition, using,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1174 elem = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1175 elemWidth = elem.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1176 elemHeight = elem.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1177 marginLeft = parseCss( this, "marginLeft" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1178 marginTop = parseCss( this, "marginTop" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1179 collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1180 collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1181 position = $.extend( {}, basePosition ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1182 myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1183
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1184 if ( options.my[ 0 ] === "right" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1185 position.left -= elemWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1186 } else if ( options.my[ 0 ] === "center" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1187 position.left -= elemWidth / 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1188 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1189
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1190 if ( options.my[ 1 ] === "bottom" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1191 position.top -= elemHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1192 } else if ( options.my[ 1 ] === "center" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1193 position.top -= elemHeight / 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1194 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1195
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1196 position.left += myOffset[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1197 position.top += myOffset[ 1 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1198
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1199 // if the browser doesn't support fractions, then round for consistent results
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1200 if ( !$.support.offsetFractions ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1201 position.left = round( position.left );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1202 position.top = round( position.top );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1203 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1204
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1205 collisionPosition = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1206 marginLeft: marginLeft,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1207 marginTop: marginTop
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1208 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1209
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1210 $.each( [ "left", "top" ], function( i, dir ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1211 if ( $.ui.position[ collision[ i ] ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1212 $.ui.position[ collision[ i ] ][ dir ]( position, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1213 targetWidth: targetWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1214 targetHeight: targetHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1215 elemWidth: elemWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1216 elemHeight: elemHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1217 collisionPosition: collisionPosition,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1218 collisionWidth: collisionWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1219 collisionHeight: collisionHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1220 offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1221 my: options.my,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1222 at: options.at,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1223 within: within,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1224 elem : elem
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1225 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1226 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1227 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1228
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1229 if ( options.using ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1230 // adds feedback as second argument to using callback, if present
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1231 using = function( props ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1232 var left = targetOffset.left - position.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1233 right = left + targetWidth - elemWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1234 top = targetOffset.top - position.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1235 bottom = top + targetHeight - elemHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1236 feedback = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1237 target: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1238 element: target,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1239 left: targetOffset.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1240 top: targetOffset.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1241 width: targetWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1242 height: targetHeight
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1243 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1244 element: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1245 element: elem,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1246 left: position.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1247 top: position.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1248 width: elemWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1249 height: elemHeight
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1250 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1251 horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1252 vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1253 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1254 if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1255 feedback.horizontal = "center";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1256 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1257 if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1258 feedback.vertical = "middle";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1259 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1260 if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1261 feedback.important = "horizontal";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1262 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1263 feedback.important = "vertical";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1264 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1265 options.using.call( this, props, feedback );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1266 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1267 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1268
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1269 elem.offset( $.extend( position, { using: using } ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1270 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1271 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1272
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1273 $.ui.position = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1274 fit: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1275 left: function( position, data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1276 var within = data.within,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1277 withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1278 outerWidth = within.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1279 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1280 overLeft = withinOffset - collisionPosLeft,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1281 overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1282 newOverRight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1283
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1284 // element is wider than within
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1285 if ( data.collisionWidth > outerWidth ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1286 // element is initially over the left side of within
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1287 if ( overLeft > 0 && overRight <= 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1288 newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1289 position.left += overLeft - newOverRight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1290 // element is initially over right side of within
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1291 } else if ( overRight > 0 && overLeft <= 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1292 position.left = withinOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1293 // element is initially over both left and right sides of within
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1294 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1295 if ( overLeft > overRight ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1296 position.left = withinOffset + outerWidth - data.collisionWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1297 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1298 position.left = withinOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1299 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1300 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1301 // too far left -> align with left edge
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1302 } else if ( overLeft > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1303 position.left += overLeft;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1304 // too far right -> align with right edge
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1305 } else if ( overRight > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1306 position.left -= overRight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1307 // adjust based on position and margin
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1308 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1309 position.left = max( position.left - collisionPosLeft, position.left );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1310 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1311 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1312 top: function( position, data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1313 var within = data.within,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1314 withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1315 outerHeight = data.within.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1316 collisionPosTop = position.top - data.collisionPosition.marginTop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1317 overTop = withinOffset - collisionPosTop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1318 overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1319 newOverBottom;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1320
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1321 // element is taller than within
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1322 if ( data.collisionHeight > outerHeight ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1323 // element is initially over the top of within
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1324 if ( overTop > 0 && overBottom <= 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1325 newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1326 position.top += overTop - newOverBottom;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1327 // element is initially over bottom of within
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1328 } else if ( overBottom > 0 && overTop <= 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1329 position.top = withinOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1330 // element is initially over both top and bottom of within
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1331 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1332 if ( overTop > overBottom ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1333 position.top = withinOffset + outerHeight - data.collisionHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1334 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1335 position.top = withinOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1336 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1337 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1338 // too far up -> align with top
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1339 } else if ( overTop > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1340 position.top += overTop;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1341 // too far down -> align with bottom edge
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1342 } else if ( overBottom > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1343 position.top -= overBottom;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1344 // adjust based on position and margin
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1345 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1346 position.top = max( position.top - collisionPosTop, position.top );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1347 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1348 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1349 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1350 flip: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1351 left: function( position, data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1352 var within = data.within,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1353 withinOffset = within.offset.left + within.scrollLeft,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1354 outerWidth = within.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1355 offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1356 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1357 overLeft = collisionPosLeft - offsetLeft,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1358 overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1359 myOffset = data.my[ 0 ] === "left" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1360 -data.elemWidth :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1361 data.my[ 0 ] === "right" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1362 data.elemWidth :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1363 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1364 atOffset = data.at[ 0 ] === "left" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1365 data.targetWidth :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1366 data.at[ 0 ] === "right" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1367 -data.targetWidth :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1368 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1369 offset = -2 * data.offset[ 0 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1370 newOverRight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1371 newOverLeft;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1372
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1373 if ( overLeft < 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1374 newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1375 if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1376 position.left += myOffset + atOffset + offset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1377 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1378 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1379 else if ( overRight > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1380 newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1381 if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1382 position.left += myOffset + atOffset + offset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1383 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1384 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1385 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1386 top: function( position, data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1387 var within = data.within,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1388 withinOffset = within.offset.top + within.scrollTop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1389 outerHeight = within.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1390 offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1391 collisionPosTop = position.top - data.collisionPosition.marginTop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1392 overTop = collisionPosTop - offsetTop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1393 overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1394 top = data.my[ 1 ] === "top",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1395 myOffset = top ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1396 -data.elemHeight :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1397 data.my[ 1 ] === "bottom" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1398 data.elemHeight :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1399 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1400 atOffset = data.at[ 1 ] === "top" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1401 data.targetHeight :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1402 data.at[ 1 ] === "bottom" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1403 -data.targetHeight :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1404 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1405 offset = -2 * data.offset[ 1 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1406 newOverTop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1407 newOverBottom;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1408 if ( overTop < 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1409 newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1410 if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1411 position.top += myOffset + atOffset + offset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1412 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1413 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1414 else if ( overBottom > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1415 newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1416 if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1417 position.top += myOffset + atOffset + offset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1418 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1419 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1420 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1421 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1422 flipfit: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1423 left: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1424 $.ui.position.flip.left.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1425 $.ui.position.fit.left.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1426 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1427 top: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1428 $.ui.position.flip.top.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1429 $.ui.position.fit.top.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1430 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1431 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1432 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1433
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1434 // fraction support test
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1435 (function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1436 var testElement, testElementParent, testElementStyle, offsetLeft, i,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1437 body = document.getElementsByTagName( "body" )[ 0 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1438 div = document.createElement( "div" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1439
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1440 //Create a "fake body" for testing based on method used in jQuery.support
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1441 testElement = document.createElement( body ? "div" : "body" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1442 testElementStyle = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1443 visibility: "hidden",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1444 width: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1445 height: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1446 border: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1447 margin: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1448 background: "none"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1449 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1450 if ( body ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1451 $.extend( testElementStyle, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1452 position: "absolute",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1453 left: "-1000px",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1454 top: "-1000px"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1455 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1456 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1457 for ( i in testElementStyle ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1458 testElement.style[ i ] = testElementStyle[ i ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1459 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1460 testElement.appendChild( div );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1461 testElementParent = body || document.documentElement;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1462 testElementParent.insertBefore( testElement, testElementParent.firstChild );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1463
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1464 div.style.cssText = "position: absolute; left: 10.7432222px;";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1465
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1466 offsetLeft = $( div ).offset().left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1467 $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1468
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1469 testElement.innerHTML = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1470 testElementParent.removeChild( testElement );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1471 })();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1472
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1473 }( jQuery ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1474 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1475
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1476 var uid = 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1477 hideProps = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1478 showProps = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1479
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1480 hideProps.height = hideProps.paddingTop = hideProps.paddingBottom =
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1481 hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1482 showProps.height = showProps.paddingTop = showProps.paddingBottom =
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1483 showProps.borderTopWidth = showProps.borderBottomWidth = "show";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1484
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1485 $.widget( "ui.accordion", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1486 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1487 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1488 active: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1489 animate: {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1490 collapsible: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1491 event: "click",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1492 header: "> li > :first-child,> :not(li):even",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1493 heightStyle: "auto",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1494 icons: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1495 activeHeader: "ui-icon-triangle-1-s",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1496 header: "ui-icon-triangle-1-e"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1497 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1498
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1499 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1500 activate: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1501 beforeActivate: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1502 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1503
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1504 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1505 var options = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1506 this.prevShow = this.prevHide = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1507 this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1508 // ARIA
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1509 .attr( "role", "tablist" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1510
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1511 // don't allow collapsible: false and active: false / null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1512 if ( !options.collapsible && (options.active === false || options.active == null) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1513 options.active = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1514 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1515
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1516 this._processPanels();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1517 // handle negative values
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1518 if ( options.active < 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1519 options.active += this.headers.length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1520 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1521 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1522 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1523
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1524 _getCreateEventData: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1525 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1526 header: this.active,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1527 panel: !this.active.length ? $() : this.active.next(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1528 content: !this.active.length ? $() : this.active.next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1529 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1530 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1531
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1532 _createIcons: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1533 var icons = this.options.icons;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1534 if ( icons ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1535 $( "<span>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1536 .addClass( "ui-accordion-header-icon ui-icon " + icons.header )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1537 .prependTo( this.headers );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1538 this.active.children( ".ui-accordion-header-icon" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1539 .removeClass( icons.header )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1540 .addClass( icons.activeHeader );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1541 this.headers.addClass( "ui-accordion-icons" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1542 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1543 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1544
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1545 _destroyIcons: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1546 this.headers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1547 .removeClass( "ui-accordion-icons" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1548 .children( ".ui-accordion-header-icon" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1549 .remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1550 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1551
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1552 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1553 var contents;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1554
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1555 // clean up main element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1556 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1557 .removeClass( "ui-accordion ui-widget ui-helper-reset" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1558 .removeAttr( "role" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1559
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1560 // clean up headers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1561 this.headers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1562 .removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1563 .removeAttr( "role" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1564 .removeAttr( "aria-expanded" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1565 .removeAttr( "aria-selected" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1566 .removeAttr( "aria-controls" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1567 .removeAttr( "tabIndex" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1568 .each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1569 if ( /^ui-accordion/.test( this.id ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1570 this.removeAttribute( "id" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1571 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1572 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1573 this._destroyIcons();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1574
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1575 // clean up content panels
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1576 contents = this.headers.next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1577 .css( "display", "" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1578 .removeAttr( "role" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1579 .removeAttr( "aria-hidden" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1580 .removeAttr( "aria-labelledby" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1581 .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1582 .each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1583 if ( /^ui-accordion/.test( this.id ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1584 this.removeAttribute( "id" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1585 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1586 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1587 if ( this.options.heightStyle !== "content" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1588 contents.css( "height", "" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1589 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1590 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1591
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1592 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1593 if ( key === "active" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1594 // _activate() will handle invalid values and update this.options
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1595 this._activate( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1596 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1597 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1598
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1599 if ( key === "event" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1600 if ( this.options.event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1601 this._off( this.headers, this.options.event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1602 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1603 this._setupEvents( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1604 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1605
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1606 this._super( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1607
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1608 // setting collapsible: false while collapsed; open first panel
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1609 if ( key === "collapsible" && !value && this.options.active === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1610 this._activate( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1611 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1612
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1613 if ( key === "icons" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1614 this._destroyIcons();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1615 if ( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1616 this._createIcons();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1617 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1618 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1619
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1620 // #5332 - opacity doesn't cascade to positioned elements in IE
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1621 // so we need to add the disabled class to the headers and panels
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1622 if ( key === "disabled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1623 this.headers.add( this.headers.next() )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1624 .toggleClass( "ui-state-disabled", !!value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1625 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1626 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1627
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1628 _keydown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1629 if ( event.altKey || event.ctrlKey ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1630 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1631 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1632
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1633 var keyCode = $.ui.keyCode,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1634 length = this.headers.length,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1635 currentIndex = this.headers.index( event.target ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1636 toFocus = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1637
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1638 switch ( event.keyCode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1639 case keyCode.RIGHT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1640 case keyCode.DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1641 toFocus = this.headers[ ( currentIndex + 1 ) % length ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1642 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1643 case keyCode.LEFT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1644 case keyCode.UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1645 toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1646 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1647 case keyCode.SPACE:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1648 case keyCode.ENTER:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1649 this._eventHandler( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1650 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1651 case keyCode.HOME:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1652 toFocus = this.headers[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1653 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1654 case keyCode.END:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1655 toFocus = this.headers[ length - 1 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1656 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1657 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1658
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1659 if ( toFocus ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1660 $( event.target ).attr( "tabIndex", -1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1661 $( toFocus ).attr( "tabIndex", 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1662 toFocus.focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1663 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1664 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1665 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1666
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1667 _panelKeyDown : function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1668 if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1669 $( event.currentTarget ).prev().focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1670 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1671 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1672
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1673 refresh: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1674 var options = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1675 this._processPanels();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1676
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1677 // was collapsed or no panel
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1678 if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1679 options.active = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1680 this.active = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1681 // active false only when collapsible is true
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1682 } else if ( options.active === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1683 this._activate( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1684 // was active, but active panel is gone
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1685 } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1686 // all remaining panel are disabled
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1687 if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1688 options.active = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1689 this.active = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1690 // activate previous panel
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1691 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1692 this._activate( Math.max( 0, options.active - 1 ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1693 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1694 // was active, active panel still exists
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1695 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1696 // make sure active index is correct
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1697 options.active = this.headers.index( this.active );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1698 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1699
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1700 this._destroyIcons();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1701
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1702 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1703 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1704
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1705 _processPanels: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1706 this.headers = this.element.find( this.options.header )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1707 .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1708
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1709 this.headers.next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1710 .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1711 .filter(":not(.ui-accordion-content-active)")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1712 .hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1713 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1714
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1715 _refresh: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1716 var maxHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1717 options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1718 heightStyle = options.heightStyle,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1719 parent = this.element.parent(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1720 accordionId = this.accordionId = "ui-accordion-" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1721 (this.element.attr( "id" ) || ++uid);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1722
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1723 this.active = this._findActive( options.active )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1724 .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1725 .removeClass( "ui-corner-all" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1726 this.active.next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1727 .addClass( "ui-accordion-content-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1728 .show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1729
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1730 this.headers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1731 .attr( "role", "tab" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1732 .each(function( i ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1733 var header = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1734 headerId = header.attr( "id" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1735 panel = header.next(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1736 panelId = panel.attr( "id" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1737 if ( !headerId ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1738 headerId = accordionId + "-header-" + i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1739 header.attr( "id", headerId );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1740 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1741 if ( !panelId ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1742 panelId = accordionId + "-panel-" + i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1743 panel.attr( "id", panelId );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1744 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1745 header.attr( "aria-controls", panelId );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1746 panel.attr( "aria-labelledby", headerId );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1747 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1748 .next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1749 .attr( "role", "tabpanel" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1750
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1751 this.headers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1752 .not( this.active )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1753 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1754 "aria-selected": "false",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1755 "aria-expanded": "false",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1756 tabIndex: -1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1757 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1758 .next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1759 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1760 "aria-hidden": "true"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1761 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1762 .hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1763
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1764 // make sure at least one header is in the tab order
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1765 if ( !this.active.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1766 this.headers.eq( 0 ).attr( "tabIndex", 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1767 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1768 this.active.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1769 "aria-selected": "true",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1770 "aria-expanded": "true",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1771 tabIndex: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1772 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1773 .next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1774 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1775 "aria-hidden": "false"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1776 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1777 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1778
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1779 this._createIcons();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1780
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1781 this._setupEvents( options.event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1782
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1783 if ( heightStyle === "fill" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1784 maxHeight = parent.height();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1785 this.element.siblings( ":visible" ).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1786 var elem = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1787 position = elem.css( "position" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1788
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1789 if ( position === "absolute" || position === "fixed" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1790 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1791 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1792 maxHeight -= elem.outerHeight( true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1793 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1794
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1795 this.headers.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1796 maxHeight -= $( this ).outerHeight( true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1797 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1798
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1799 this.headers.next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1800 .each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1801 $( this ).height( Math.max( 0, maxHeight -
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1802 $( this ).innerHeight() + $( this ).height() ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1803 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1804 .css( "overflow", "auto" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1805 } else if ( heightStyle === "auto" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1806 maxHeight = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1807 this.headers.next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1808 .each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1809 maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1810 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1811 .height( maxHeight );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1812 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1813 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1814
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1815 _activate: function( index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1816 var active = this._findActive( index )[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1817
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1818 // trying to activate the already active panel
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1819 if ( active === this.active[ 0 ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1820 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1821 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1822
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1823 // trying to collapse, simulate a click on the currently active header
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1824 active = active || this.active[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1825
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1826 this._eventHandler({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1827 target: active,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1828 currentTarget: active,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1829 preventDefault: $.noop
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1830 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1831 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1832
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1833 _findActive: function( selector ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1834 return typeof selector === "number" ? this.headers.eq( selector ) : $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1835 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1836
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1837 _setupEvents: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1838 var events = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1839 keydown: "_keydown"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1840 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1841 if ( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1842 $.each( event.split(" "), function( index, eventName ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1843 events[ eventName ] = "_eventHandler";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1844 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1845 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1846
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1847 this._off( this.headers.add( this.headers.next() ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1848 this._on( this.headers, events );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1849 this._on( this.headers.next(), { keydown: "_panelKeyDown" });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1850 this._hoverable( this.headers );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1851 this._focusable( this.headers );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1852 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1853
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1854 _eventHandler: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1855 var options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1856 active = this.active,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1857 clicked = $( event.currentTarget ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1858 clickedIsActive = clicked[ 0 ] === active[ 0 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1859 collapsing = clickedIsActive && options.collapsible,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1860 toShow = collapsing ? $() : clicked.next(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1861 toHide = active.next(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1862 eventData = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1863 oldHeader: active,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1864 oldPanel: toHide,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1865 newHeader: collapsing ? $() : clicked,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1866 newPanel: toShow
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1867 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1868
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1869 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1870
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1871 if (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1872 // click on active header, but not collapsible
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1873 ( clickedIsActive && !options.collapsible ) ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1874 // allow canceling activation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1875 ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1876 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1877 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1878
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1879 options.active = collapsing ? false : this.headers.index( clicked );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1880
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1881 // when the call to ._toggle() comes after the class changes
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1882 // it causes a very odd bug in IE 8 (see #6720)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1883 this.active = clickedIsActive ? $() : clicked;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1884 this._toggle( eventData );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1885
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1886 // switch classes
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1887 // corner classes on the previously active header stay after the animation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1888 active.removeClass( "ui-accordion-header-active ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1889 if ( options.icons ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1890 active.children( ".ui-accordion-header-icon" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1891 .removeClass( options.icons.activeHeader )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1892 .addClass( options.icons.header );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1893 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1894
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1895 if ( !clickedIsActive ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1896 clicked
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1897 .removeClass( "ui-corner-all" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1898 .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1899 if ( options.icons ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1900 clicked.children( ".ui-accordion-header-icon" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1901 .removeClass( options.icons.header )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1902 .addClass( options.icons.activeHeader );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1903 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1904
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1905 clicked
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1906 .next()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1907 .addClass( "ui-accordion-content-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1908 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1909 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1910
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1911 _toggle: function( data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1912 var toShow = data.newPanel,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1913 toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1914
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1915 // handle activating a panel during the animation for another activation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1916 this.prevShow.add( this.prevHide ).stop( true, true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1917 this.prevShow = toShow;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1918 this.prevHide = toHide;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1919
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1920 if ( this.options.animate ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1921 this._animate( toShow, toHide, data );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1922 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1923 toHide.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1924 toShow.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1925 this._toggleComplete( data );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1926 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1927
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1928 toHide.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1929 "aria-hidden": "true"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1930 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1931 toHide.prev().attr( "aria-selected", "false" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1932 // if we're switching panels, remove the old header from the tab order
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1933 // if we're opening from collapsed state, remove the previous header from the tab order
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1934 // if we're collapsing, then keep the collapsing header in the tab order
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1935 if ( toShow.length && toHide.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1936 toHide.prev().attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1937 "tabIndex": -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1938 "aria-expanded": "false"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1939 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1940 } else if ( toShow.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1941 this.headers.filter(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1942 return $( this ).attr( "tabIndex" ) === 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1943 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1944 .attr( "tabIndex", -1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1945 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1946
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1947 toShow
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1948 .attr( "aria-hidden", "false" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1949 .prev()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1950 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1951 "aria-selected": "true",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1952 tabIndex: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1953 "aria-expanded": "true"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1954 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1955 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1956
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1957 _animate: function( toShow, toHide, data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1958 var total, easing, duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1959 that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1960 adjust = 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1961 down = toShow.length &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1962 ( !toHide.length || ( toShow.index() < toHide.index() ) ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1963 animate = this.options.animate || {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1964 options = down && animate.down || animate,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1965 complete = function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1966 that._toggleComplete( data );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1967 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1968
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1969 if ( typeof options === "number" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1970 duration = options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1971 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1972 if ( typeof options === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1973 easing = options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1974 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1975 // fall back from options to animation in case of partial down settings
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1976 easing = easing || options.easing || animate.easing;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1977 duration = duration || options.duration || animate.duration;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1978
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1979 if ( !toHide.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1980 return toShow.animate( showProps, duration, easing, complete );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1981 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1982 if ( !toShow.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1983 return toHide.animate( hideProps, duration, easing, complete );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1984 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1985
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1986 total = toShow.show().outerHeight();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1987 toHide.animate( hideProps, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1988 duration: duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1989 easing: easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1990 step: function( now, fx ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1991 fx.now = Math.round( now );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1992 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1993 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1994 toShow
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1995 .hide()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1996 .animate( showProps, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1997 duration: duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1998 easing: easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
1999 complete: complete,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2000 step: function( now, fx ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2001 fx.now = Math.round( now );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2002 if ( fx.prop !== "height" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2003 adjust += fx.now;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2004 } else if ( that.options.heightStyle !== "content" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2005 fx.now = Math.round( total - toHide.outerHeight() - adjust );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2006 adjust = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2007 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2008 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2009 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2010 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2011
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2012 _toggleComplete: function( data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2013 var toHide = data.oldPanel;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2014
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2015 toHide
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2016 .removeClass( "ui-accordion-content-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2017 .prev()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2018 .removeClass( "ui-corner-top" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2019 .addClass( "ui-corner-all" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2020
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2021 // Work around for rendering bug in IE (#5421)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2022 if ( toHide.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2023 toHide.parent()[0].className = toHide.parent()[0].className;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2024 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2025 this._trigger( "activate", null, data );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2026 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2027 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2028
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2029 })( jQuery );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2030 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2031
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2032 $.widget( "ui.autocomplete", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2033 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2034 defaultElement: "<input>",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2035 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2036 appendTo: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2037 autoFocus: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2038 delay: 300,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2039 minLength: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2040 position: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2041 my: "left top",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2042 at: "left bottom",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2043 collision: "none"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2044 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2045 source: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2046
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2047 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2048 change: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2049 close: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2050 focus: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2051 open: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2052 response: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2053 search: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2054 select: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2055 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2056
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2057 requestIndex: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2058 pending: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2059
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2060 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2061 // Some browsers only repeat keydown events, not keypress events,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2062 // so we use the suppressKeyPress flag to determine if we've already
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2063 // handled the keydown event. #7269
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2064 // Unfortunately the code for & in keypress is the same as the up arrow,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2065 // so we use the suppressKeyPressRepeat flag to avoid handling keypress
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2066 // events when we know the keydown event was used to modify the
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2067 // search term. #7799
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2068 var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2069 nodeName = this.element[0].nodeName.toLowerCase(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2070 isTextarea = nodeName === "textarea",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2071 isInput = nodeName === "input";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2072
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2073 this.isMultiLine =
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2074 // Textareas are always multi-line
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2075 isTextarea ? true :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2076 // Inputs are always single-line, even if inside a contentEditable element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2077 // IE also treats inputs as contentEditable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2078 isInput ? false :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2079 // All other element types are determined by whether or not they're contentEditable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2080 this.element.prop( "isContentEditable" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2081
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2082 this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2083 this.isNewMenu = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2084
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2085 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2086 .addClass( "ui-autocomplete-input" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2087 .attr( "autocomplete", "off" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2088
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2089 this._on( this.element, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2090 keydown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2091 if ( this.element.prop( "readOnly" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2092 suppressKeyPress = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2093 suppressInput = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2094 suppressKeyPressRepeat = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2095 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2096 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2097
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2098 suppressKeyPress = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2099 suppressInput = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2100 suppressKeyPressRepeat = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2101 var keyCode = $.ui.keyCode;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2102 switch( event.keyCode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2103 case keyCode.PAGE_UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2104 suppressKeyPress = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2105 this._move( "previousPage", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2106 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2107 case keyCode.PAGE_DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2108 suppressKeyPress = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2109 this._move( "nextPage", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2110 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2111 case keyCode.UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2112 suppressKeyPress = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2113 this._keyEvent( "previous", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2114 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2115 case keyCode.DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2116 suppressKeyPress = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2117 this._keyEvent( "next", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2118 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2119 case keyCode.ENTER:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2120 case keyCode.NUMPAD_ENTER:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2121 // when menu is open and has focus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2122 if ( this.menu.active ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2123 // #6055 - Opera still allows the keypress to occur
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2124 // which causes forms to submit
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2125 suppressKeyPress = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2126 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2127 this.menu.select( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2128 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2129 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2130 case keyCode.TAB:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2131 if ( this.menu.active ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2132 this.menu.select( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2133 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2134 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2135 case keyCode.ESCAPE:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2136 if ( this.menu.element.is( ":visible" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2137 this._value( this.term );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2138 this.close( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2139 // Different browsers have different default behavior for escape
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2140 // Single press can mean undo or clear
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2141 // Double press in IE means clear the whole form
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2142 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2143 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2144 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2145 default:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2146 suppressKeyPressRepeat = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2147 // search timeout should be triggered before the input value is changed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2148 this._searchTimeout( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2149 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2150 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2151 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2152 keypress: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2153 if ( suppressKeyPress ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2154 suppressKeyPress = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2155 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2156 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2157 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2158 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2159 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2160 if ( suppressKeyPressRepeat ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2161 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2162 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2163
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2164 // replicate some key handlers to allow them to repeat in Firefox and Opera
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2165 var keyCode = $.ui.keyCode;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2166 switch( event.keyCode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2167 case keyCode.PAGE_UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2168 this._move( "previousPage", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2169 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2170 case keyCode.PAGE_DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2171 this._move( "nextPage", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2172 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2173 case keyCode.UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2174 this._keyEvent( "previous", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2175 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2176 case keyCode.DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2177 this._keyEvent( "next", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2178 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2179 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2180 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2181 input: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2182 if ( suppressInput ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2183 suppressInput = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2184 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2185 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2186 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2187 this._searchTimeout( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2188 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2189 focus: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2190 this.selectedItem = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2191 this.previous = this._value();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2192 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2193 blur: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2194 if ( this.cancelBlur ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2195 delete this.cancelBlur;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2196 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2197 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2198
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2199 clearTimeout( this.searching );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2200 this.close( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2201 this._change( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2202 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2203 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2204
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2205 this._initSource();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2206 this.menu = $( "<ul>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2207 .addClass( "ui-autocomplete ui-front" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2208 .appendTo( this._appendTo() )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2209 .menu({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2210 // disable ARIA support, the live region takes care of that
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2211 role: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2212 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2213 .hide()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2214 .data( "ui-menu" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2215
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2216 this._on( this.menu.element, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2217 mousedown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2218 // prevent moving focus out of the text field
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2219 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2220
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2221 // IE doesn't prevent moving focus even with event.preventDefault()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2222 // so we set a flag to know when we should ignore the blur event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2223 this.cancelBlur = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2224 this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2225 delete this.cancelBlur;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2226 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2227
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2228 // clicking on the scrollbar causes focus to shift to the body
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2229 // but we can't detect a mouseup or a click immediately afterward
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2230 // so we have to track the next mousedown and close the menu if
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2231 // the user clicks somewhere outside of the autocomplete
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2232 var menuElement = this.menu.element[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2233 if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2234 this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2235 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2236 this.document.one( "mousedown", function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2237 if ( event.target !== that.element[ 0 ] &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2238 event.target !== menuElement &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2239 !$.contains( menuElement, event.target ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2240 that.close();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2241 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2242 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2243 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2244 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2245 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2246 menufocus: function( event, ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2247 // support: Firefox
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2248 // Prevent accidental activation of menu items in Firefox (#7024 #9118)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2249 if ( this.isNewMenu ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2250 this.isNewMenu = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2251 if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2252 this.menu.blur();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2253
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2254 this.document.one( "mousemove", function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2255 $( event.target ).trigger( event.originalEvent );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2256 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2257
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2258 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2259 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2260 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2261
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2262 var item = ui.item.data( "ui-autocomplete-item" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2263 if ( false !== this._trigger( "focus", event, { item: item } ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2264 // use value to match what will end up in the input, if it was a key event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2265 if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2266 this._value( item.value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2267 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2268 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2269 // Normally the input is populated with the item's value as the
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2270 // menu is navigated, causing screen readers to notice a change and
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2271 // announce the item. Since the focus event was canceled, this doesn't
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2272 // happen, so we update the live region so that screen readers can
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2273 // still notice the change and announce it.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2274 this.liveRegion.text( item.value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2275 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2276 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2277 menuselect: function( event, ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2278 var item = ui.item.data( "ui-autocomplete-item" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2279 previous = this.previous;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2280
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2281 // only trigger when focus was lost (click on menu)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2282 if ( this.element[0] !== this.document[0].activeElement ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2283 this.element.focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2284 this.previous = previous;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2285 // #6109 - IE triggers two focus events and the second
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2286 // is asynchronous, so we need to reset the previous
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2287 // term synchronously and asynchronously :-(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2288 this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2289 this.previous = previous;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2290 this.selectedItem = item;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2291 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2292 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2293
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2294 if ( false !== this._trigger( "select", event, { item: item } ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2295 this._value( item.value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2296 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2297 // reset the term after the select event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2298 // this allows custom select handling to work properly
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2299 this.term = this._value();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2300
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2301 this.close( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2302 this.selectedItem = item;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2303 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2304 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2305
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2306 this.liveRegion = $( "<span>", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2307 role: "status",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2308 "aria-live": "polite"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2309 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2310 .addClass( "ui-helper-hidden-accessible" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2311 .insertBefore( this.element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2312
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2313 // turning off autocomplete prevents the browser from remembering the
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2314 // value when navigating through history, so we re-enable autocomplete
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2315 // if the page is unloaded before the widget is destroyed. #7790
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2316 this._on( this.window, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2317 beforeunload: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2318 this.element.removeAttr( "autocomplete" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2319 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2320 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2321 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2322
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2323 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2324 clearTimeout( this.searching );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2325 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2326 .removeClass( "ui-autocomplete-input" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2327 .removeAttr( "autocomplete" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2328 this.menu.element.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2329 this.liveRegion.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2330 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2331
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2332 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2333 this._super( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2334 if ( key === "source" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2335 this._initSource();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2336 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2337 if ( key === "appendTo" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2338 this.menu.element.appendTo( this._appendTo() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2339 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2340 if ( key === "disabled" && value && this.xhr ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2341 this.xhr.abort();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2342 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2343 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2344
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2345 _appendTo: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2346 var element = this.options.appendTo;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2347
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2348 if ( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2349 element = element.jquery || element.nodeType ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2350 $( element ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2351 this.document.find( element ).eq( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2352 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2353
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2354 if ( !element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2355 element = this.element.closest( ".ui-front" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2356 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2357
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2358 if ( !element.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2359 element = this.document[0].body;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2360 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2361
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2362 return element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2363 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2364
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2365 _initSource: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2366 var array, url,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2367 that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2368 if ( $.isArray(this.options.source) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2369 array = this.options.source;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2370 this.source = function( request, response ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2371 response( $.ui.autocomplete.filter( array, request.term ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2372 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2373 } else if ( typeof this.options.source === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2374 url = this.options.source;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2375 this.source = function( request, response ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2376 if ( that.xhr ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2377 that.xhr.abort();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2378 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2379 that.xhr = $.ajax({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2380 url: url,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2381 data: request,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2382 dataType: "json",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2383 success: function( data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2384 response( data );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2385 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2386 error: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2387 response( [] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2388 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2389 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2390 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2391 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2392 this.source = this.options.source;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2393 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2394 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2395
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2396 _searchTimeout: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2397 clearTimeout( this.searching );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2398 this.searching = this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2399 // only search if the value has changed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2400 if ( this.term !== this._value() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2401 this.selectedItem = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2402 this.search( null, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2403 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2404 }, this.options.delay );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2405 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2406
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2407 search: function( value, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2408 value = value != null ? value : this._value();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2409
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2410 // always save the actual value, not the one passed as an argument
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2411 this.term = this._value();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2412
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2413 if ( value.length < this.options.minLength ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2414 return this.close( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2415 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2416
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2417 if ( this._trigger( "search", event ) === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2418 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2419 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2420
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2421 return this._search( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2422 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2423
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2424 _search: function( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2425 this.pending++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2426 this.element.addClass( "ui-autocomplete-loading" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2427 this.cancelSearch = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2428
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2429 this.source( { term: value }, this._response() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2430 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2431
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2432 _response: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2433 var index = ++this.requestIndex;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2434
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2435 return $.proxy(function( content ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2436 if ( index === this.requestIndex ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2437 this.__response( content );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2438 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2439
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2440 this.pending--;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2441 if ( !this.pending ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2442 this.element.removeClass( "ui-autocomplete-loading" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2443 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2444 }, this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2445 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2446
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2447 __response: function( content ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2448 if ( content ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2449 content = this._normalize( content );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2450 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2451 this._trigger( "response", null, { content: content } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2452 if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2453 this._suggest( content );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2454 this._trigger( "open" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2455 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2456 // use ._close() instead of .close() so we don't cancel future searches
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2457 this._close();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2458 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2459 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2460
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2461 close: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2462 this.cancelSearch = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2463 this._close( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2464 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2465
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2466 _close: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2467 if ( this.menu.element.is( ":visible" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2468 this.menu.element.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2469 this.menu.blur();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2470 this.isNewMenu = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2471 this._trigger( "close", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2472 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2473 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2474
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2475 _change: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2476 if ( this.previous !== this._value() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2477 this._trigger( "change", event, { item: this.selectedItem } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2478 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2479 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2480
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2481 _normalize: function( items ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2482 // assume all items have the right format when the first item is complete
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2483 if ( items.length && items[0].label && items[0].value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2484 return items;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2485 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2486 return $.map( items, function( item ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2487 if ( typeof item === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2488 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2489 label: item,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2490 value: item
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2491 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2492 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2493 return $.extend({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2494 label: item.label || item.value,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2495 value: item.value || item.label
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2496 }, item );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2497 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2498 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2499
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2500 _suggest: function( items ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2501 var ul = this.menu.element.empty();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2502 this._renderMenu( ul, items );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2503 this.isNewMenu = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2504 this.menu.refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2505
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2506 // size and position menu
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2507 ul.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2508 this._resizeMenu();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2509 ul.position( $.extend({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2510 of: this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2511 }, this.options.position ));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2512
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2513 if ( this.options.autoFocus ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2514 this.menu.next();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2515 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2516 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2517
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2518 _resizeMenu: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2519 var ul = this.menu.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2520 ul.outerWidth( Math.max(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2521 // Firefox wraps long text (possibly a rounding bug)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2522 // so we add 1px to avoid the wrapping (#7513)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2523 ul.width( "" ).outerWidth() + 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2524 this.element.outerWidth()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2525 ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2526 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2527
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2528 _renderMenu: function( ul, items ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2529 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2530 $.each( items, function( index, item ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2531 that._renderItemData( ul, item );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2532 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2533 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2534
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2535 _renderItemData: function( ul, item ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2536 return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2537 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2538
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2539 _renderItem: function( ul, item ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2540 return $( "<li>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2541 .append( $( "<a>" ).text( item.label ) )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2542 .appendTo( ul );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2543 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2544
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2545 _move: function( direction, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2546 if ( !this.menu.element.is( ":visible" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2547 this.search( null, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2548 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2549 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2550 if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2551 this.menu.isLastItem() && /^next/.test( direction ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2552 this._value( this.term );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2553 this.menu.blur();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2554 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2555 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2556 this.menu[ direction ]( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2557 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2558
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2559 widget: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2560 return this.menu.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2561 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2562
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2563 _value: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2564 return this.valueMethod.apply( this.element, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2565 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2566
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2567 _keyEvent: function( keyEvent, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2568 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2569 this._move( keyEvent, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2570
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2571 // prevents moving cursor to beginning/end of the text field in some browsers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2572 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2573 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2574 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2575 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2576
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2577 $.extend( $.ui.autocomplete, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2578 escapeRegex: function( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2579 return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2580 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2581 filter: function(array, term) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2582 var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2583 return $.grep( array, function(value) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2584 return matcher.test( value.label || value.value || value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2585 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2586 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2587 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2588
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2589
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2590 // live region extension, adding a `messages` option
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2591 // NOTE: This is an experimental API. We are still investigating
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2592 // a full solution for string manipulation and internationalization.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2593 $.widget( "ui.autocomplete", $.ui.autocomplete, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2594 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2595 messages: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2596 noResults: "No search results.",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2597 results: function( amount ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2598 return amount + ( amount > 1 ? " results are" : " result is" ) +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2599 " available, use up and down arrow keys to navigate.";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2600 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2601 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2602 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2603
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2604 __response: function( content ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2605 var message;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2606 this._superApply( arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2607 if ( this.options.disabled || this.cancelSearch ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2608 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2609 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2610 if ( content && content.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2611 message = this.options.messages.results( content.length );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2612 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2613 message = this.options.messages.noResults;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2614 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2615 this.liveRegion.text( message );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2616 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2617 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2618
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2619 }( jQuery ));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2620 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2621
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2622 var lastActive,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2623 baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2624 typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2625 formResetHandler = function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2626 var form = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2627 setTimeout(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2628 form.find( ":ui-button" ).button( "refresh" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2629 }, 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2630 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2631 radioGroup = function( radio ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2632 var name = radio.name,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2633 form = radio.form,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2634 radios = $( [] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2635 if ( name ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2636 name = name.replace( /'/g, "\\'" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2637 if ( form ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2638 radios = $( form ).find( "[name='" + name + "']" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2639 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2640 radios = $( "[name='" + name + "']", radio.ownerDocument )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2641 .filter(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2642 return !this.form;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2643 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2644 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2645 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2646 return radios;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2647 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2648
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2649 $.widget( "ui.button", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2650 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2651 defaultElement: "<button>",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2652 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2653 disabled: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2654 text: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2655 label: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2656 icons: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2657 primary: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2658 secondary: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2659 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2660 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2661 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2662 this.element.closest( "form" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2663 .unbind( "reset" + this.eventNamespace )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2664 .bind( "reset" + this.eventNamespace, formResetHandler );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2665
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2666 if ( typeof this.options.disabled !== "boolean" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2667 this.options.disabled = !!this.element.prop( "disabled" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2668 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2669 this.element.prop( "disabled", this.options.disabled );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2670 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2671
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2672 this._determineButtonType();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2673 this.hasTitle = !!this.buttonElement.attr( "title" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2674
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2675 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2676 options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2677 toggleButton = this.type === "checkbox" || this.type === "radio",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2678 activeClass = !toggleButton ? "ui-state-active" : "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2679
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2680 if ( options.label === null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2681 options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2682 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2683
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2684 this._hoverable( this.buttonElement );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2685
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2686 this.buttonElement
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2687 .addClass( baseClasses )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2688 .attr( "role", "button" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2689 .bind( "mouseenter" + this.eventNamespace, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2690 if ( options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2691 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2692 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2693 if ( this === lastActive ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2694 $( this ).addClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2695 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2696 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2697 .bind( "mouseleave" + this.eventNamespace, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2698 if ( options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2699 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2700 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2701 $( this ).removeClass( activeClass );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2702 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2703 .bind( "click" + this.eventNamespace, function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2704 if ( options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2705 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2706 event.stopImmediatePropagation();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2707 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2708 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2709
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2710 // Can't use _focusable() because the element that receives focus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2711 // and the element that gets the ui-state-focus class are different
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2712 this._on({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2713 focus: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2714 this.buttonElement.addClass( "ui-state-focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2715 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2716 blur: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2717 this.buttonElement.removeClass( "ui-state-focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2718 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2719 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2720
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2721 if ( toggleButton ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2722 this.element.bind( "change" + this.eventNamespace, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2723 that.refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2724 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2725 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2726
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2727 if ( this.type === "checkbox" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2728 this.buttonElement.bind( "click" + this.eventNamespace, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2729 if ( options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2730 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2731 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2732 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2733 } else if ( this.type === "radio" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2734 this.buttonElement.bind( "click" + this.eventNamespace, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2735 if ( options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2736 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2737 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2738 $( this ).addClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2739 that.buttonElement.attr( "aria-pressed", "true" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2740
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2741 var radio = that.element[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2742 radioGroup( radio )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2743 .not( radio )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2744 .map(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2745 return $( this ).button( "widget" )[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2746 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2747 .removeClass( "ui-state-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2748 .attr( "aria-pressed", "false" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2749 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2750 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2751 this.buttonElement
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2752 .bind( "mousedown" + this.eventNamespace, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2753 if ( options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2754 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2755 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2756 $( this ).addClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2757 lastActive = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2758 that.document.one( "mouseup", function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2759 lastActive = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2760 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2761 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2762 .bind( "mouseup" + this.eventNamespace, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2763 if ( options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2764 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2765 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2766 $( this ).removeClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2767 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2768 .bind( "keydown" + this.eventNamespace, function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2769 if ( options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2770 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2771 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2772 if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2773 $( this ).addClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2774 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2775 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2776 // see #8559, we bind to blur here in case the button element loses
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2777 // focus between keydown and keyup, it would be left in an "active" state
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2778 .bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2779 $( this ).removeClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2780 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2781
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2782 if ( this.buttonElement.is("a") ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2783 this.buttonElement.keyup(function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2784 if ( event.keyCode === $.ui.keyCode.SPACE ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2785 // TODO pass through original event correctly (just as 2nd argument doesn't work)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2786 $( this ).click();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2787 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2788 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2789 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2790 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2791
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2792 // TODO: pull out $.Widget's handling for the disabled option into
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2793 // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2794 // be overridden by individual plugins
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2795 this._setOption( "disabled", options.disabled );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2796 this._resetButton();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2797 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2798
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2799 _determineButtonType: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2800 var ancestor, labelSelector, checked;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2801
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2802 if ( this.element.is("[type=checkbox]") ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2803 this.type = "checkbox";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2804 } else if ( this.element.is("[type=radio]") ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2805 this.type = "radio";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2806 } else if ( this.element.is("input") ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2807 this.type = "input";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2808 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2809 this.type = "button";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2810 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2811
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2812 if ( this.type === "checkbox" || this.type === "radio" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2813 // we don't search against the document in case the element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2814 // is disconnected from the DOM
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2815 ancestor = this.element.parents().last();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2816 labelSelector = "label[for='" + this.element.attr("id") + "']";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2817 this.buttonElement = ancestor.find( labelSelector );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2818 if ( !this.buttonElement.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2819 ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2820 this.buttonElement = ancestor.filter( labelSelector );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2821 if ( !this.buttonElement.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2822 this.buttonElement = ancestor.find( labelSelector );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2823 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2824 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2825 this.element.addClass( "ui-helper-hidden-accessible" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2826
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2827 checked = this.element.is( ":checked" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2828 if ( checked ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2829 this.buttonElement.addClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2830 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2831 this.buttonElement.prop( "aria-pressed", checked );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2832 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2833 this.buttonElement = this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2834 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2835 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2836
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2837 widget: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2838 return this.buttonElement;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2839 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2840
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2841 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2842 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2843 .removeClass( "ui-helper-hidden-accessible" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2844 this.buttonElement
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2845 .removeClass( baseClasses + " ui-state-active " + typeClasses )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2846 .removeAttr( "role" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2847 .removeAttr( "aria-pressed" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2848 .html( this.buttonElement.find(".ui-button-text").html() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2849
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2850 if ( !this.hasTitle ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2851 this.buttonElement.removeAttr( "title" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2852 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2853 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2854
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2855 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2856 this._super( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2857 if ( key === "disabled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2858 this.element.prop( "disabled", !!value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2859 if ( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2860 this.buttonElement.removeClass( "ui-state-focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2861 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2862 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2863 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2864 this._resetButton();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2865 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2866
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2867 refresh: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2868 //See #8237 & #8828
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2869 var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2870
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2871 if ( isDisabled !== this.options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2872 this._setOption( "disabled", isDisabled );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2873 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2874 if ( this.type === "radio" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2875 radioGroup( this.element[0] ).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2876 if ( $( this ).is( ":checked" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2877 $( this ).button( "widget" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2878 .addClass( "ui-state-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2879 .attr( "aria-pressed", "true" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2880 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2881 $( this ).button( "widget" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2882 .removeClass( "ui-state-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2883 .attr( "aria-pressed", "false" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2884 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2885 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2886 } else if ( this.type === "checkbox" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2887 if ( this.element.is( ":checked" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2888 this.buttonElement
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2889 .addClass( "ui-state-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2890 .attr( "aria-pressed", "true" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2891 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2892 this.buttonElement
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2893 .removeClass( "ui-state-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2894 .attr( "aria-pressed", "false" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2895 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2896 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2897 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2898
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2899 _resetButton: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2900 if ( this.type === "input" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2901 if ( this.options.label ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2902 this.element.val( this.options.label );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2903 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2904 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2905 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2906 var buttonElement = this.buttonElement.removeClass( typeClasses ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2907 buttonText = $( "<span></span>", this.document[0] )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2908 .addClass( "ui-button-text" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2909 .html( this.options.label )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2910 .appendTo( buttonElement.empty() )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2911 .text(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2912 icons = this.options.icons,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2913 multipleIcons = icons.primary && icons.secondary,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2914 buttonClasses = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2915
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2916 if ( icons.primary || icons.secondary ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2917 if ( this.options.text ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2918 buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2919 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2920
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2921 if ( icons.primary ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2922 buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2923 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2924
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2925 if ( icons.secondary ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2926 buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2927 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2928
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2929 if ( !this.options.text ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2930 buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2931
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2932 if ( !this.hasTitle ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2933 buttonElement.attr( "title", $.trim( buttonText ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2934 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2935 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2936 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2937 buttonClasses.push( "ui-button-text-only" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2938 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2939 buttonElement.addClass( buttonClasses.join( " " ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2940 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2941 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2942
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2943 $.widget( "ui.buttonset", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2944 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2945 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2946 items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2947 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2948
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2949 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2950 this.element.addClass( "ui-buttonset" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2951 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2952
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2953 _init: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2954 this.refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2955 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2956
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2957 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2958 if ( key === "disabled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2959 this.buttons.button( "option", key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2960 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2961
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2962 this._super( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2963 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2964
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2965 refresh: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2966 var rtl = this.element.css( "direction" ) === "rtl";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2967
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2968 this.buttons = this.element.find( this.options.items )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2969 .filter( ":ui-button" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2970 .button( "refresh" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2971 .end()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2972 .not( ":ui-button" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2973 .button()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2974 .end()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2975 .map(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2976 return $( this ).button( "widget" )[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2977 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2978 .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2979 .filter( ":first" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2980 .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2981 .end()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2982 .filter( ":last" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2983 .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2984 .end()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2985 .end();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2986 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2987
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2988 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2989 this.element.removeClass( "ui-buttonset" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2990 this.buttons
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2991 .map(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2992 return $( this ).button( "widget" )[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2993 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2994 .removeClass( "ui-corner-left ui-corner-right" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2995 .end()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2996 .button( "destroy" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2997 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2998 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
2999
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3000 }( jQuery ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3001 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3002
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3003 $.extend($.ui, { datepicker: { version: "1.10.4" } });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3004
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3005 var PROP_NAME = "datepicker",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3006 instActive;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3007
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3008 /* Date picker manager.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3009 Use the singleton instance of this class, $.datepicker, to interact with the date picker.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3010 Settings for (groups of) date pickers are maintained in an instance object,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3011 allowing multiple different settings on the same page. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3012
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3013 function Datepicker() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3014 this._curInst = null; // The current instance in use
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3015 this._keyEvent = false; // If the last event was a key event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3016 this._disabledInputs = []; // List of date picker inputs that have been disabled
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3017 this._datepickerShowing = false; // True if the popup picker is showing , false if not
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3018 this._inDialog = false; // True if showing within a "dialog", false if not
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3019 this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3020 this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3021 this._appendClass = "ui-datepicker-append"; // The name of the append marker class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3022 this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3023 this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3024 this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3025 this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3026 this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3027 this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3028 this.regional = []; // Available regional settings, indexed by language code
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3029 this.regional[""] = { // Default regional settings
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3030 closeText: "Done", // Display text for close link
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3031 prevText: "Prev", // Display text for previous month link
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3032 nextText: "Next", // Display text for next month link
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3033 currentText: "Today", // Display text for current month link
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3034 monthNames: ["January","February","March","April","May","June",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3035 "July","August","September","October","November","December"], // Names of months for drop-down and formatting
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3036 monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3037 dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3038 dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3039 dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3040 weekHeader: "Wk", // Column header for week of the year
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3041 dateFormat: "mm/dd/yy", // See format options on parseDate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3042 firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3043 isRTL: false, // True if right-to-left language, false if left-to-right
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3044 showMonthAfterYear: false, // True if the year select precedes month, false for month then year
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3045 yearSuffix: "" // Additional text to append to the year in the month headers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3046 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3047 this._defaults = { // Global defaults for all the date picker instances
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3048 showOn: "focus", // "focus" for popup on focus,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3049 // "button" for trigger button, or "both" for either
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3050 showAnim: "fadeIn", // Name of jQuery animation for popup
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3051 showOptions: {}, // Options for enhanced animations
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3052 defaultDate: null, // Used when field is blank: actual date,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3053 // +/-number for offset from today, null for today
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3054 appendText: "", // Display text following the input box, e.g. showing the format
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3055 buttonText: "...", // Text for trigger button
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3056 buttonImage: "", // URL for trigger button image
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3057 buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3058 hideIfNoPrevNext: false, // True to hide next/previous month links
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3059 // if not applicable, false to just disable them
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3060 navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3061 gotoCurrent: false, // True if today link goes back to current selection instead
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3062 changeMonth: false, // True if month can be selected directly, false if only prev/next
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3063 changeYear: false, // True if year can be selected directly, false if only prev/next
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3064 yearRange: "c-10:c+10", // Range of years to display in drop-down,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3065 // either relative to today's year (-nn:+nn), relative to currently displayed year
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3066 // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3067 showOtherMonths: false, // True to show dates in other months, false to leave blank
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3068 selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3069 showWeek: false, // True to show week of the year, false to not show it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3070 calculateWeek: this.iso8601Week, // How to calculate the week of the year,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3071 // takes a Date and returns the number of the week for it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3072 shortYearCutoff: "+10", // Short year values < this are in the current century,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3073 // > this are in the previous century,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3074 // string value starting with "+" for current year + value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3075 minDate: null, // The earliest selectable date, or null for no limit
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3076 maxDate: null, // The latest selectable date, or null for no limit
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3077 duration: "fast", // Duration of display/closure
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3078 beforeShowDay: null, // Function that takes a date and returns an array with
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3079 // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3080 // [2] = cell title (optional), e.g. $.datepicker.noWeekends
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3081 beforeShow: null, // Function that takes an input field and
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3082 // returns a set of custom settings for the date picker
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3083 onSelect: null, // Define a callback function when a date is selected
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3084 onChangeMonthYear: null, // Define a callback function when the month or year is changed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3085 onClose: null, // Define a callback function when the datepicker is closed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3086 numberOfMonths: 1, // Number of months to show at a time
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3087 showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3088 stepMonths: 1, // Number of months to step back/forward
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3089 stepBigMonths: 12, // Number of months to step back/forward for the big links
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3090 altField: "", // Selector for an alternate field to store selected dates into
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3091 altFormat: "", // The date format to use for the alternate field
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3092 constrainInput: true, // The input is constrained by the current date format
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3093 showButtonPanel: false, // True to show button panel, false to not show it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3094 autoSize: false, // True to size the input for the date format, false to leave as is
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3095 disabled: false // The initial disabled state
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3096 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3097 $.extend(this._defaults, this.regional[""]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3098 this.dpDiv = bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3099 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3100
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3101 $.extend(Datepicker.prototype, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3102 /* Class name added to elements to indicate already configured with a date picker. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3103 markerClassName: "hasDatepicker",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3104
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3105 //Keep track of the maximum number of rows displayed (see #7043)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3106 maxRows: 4,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3107
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3108 // TODO rename to "widget" when switching to widget factory
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3109 _widgetDatepicker: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3110 return this.dpDiv;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3111 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3112
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3113 /* Override the default settings for all instances of the date picker.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3114 * @param settings object - the new settings to use as defaults (anonymous object)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3115 * @return the manager object
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3116 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3117 setDefaults: function(settings) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3118 extendRemove(this._defaults, settings || {});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3119 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3120 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3121
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3122 /* Attach the date picker to a jQuery selection.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3123 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3124 * @param settings object - the new settings to use for this date picker instance (anonymous)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3125 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3126 _attachDatepicker: function(target, settings) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3127 var nodeName, inline, inst;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3128 nodeName = target.nodeName.toLowerCase();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3129 inline = (nodeName === "div" || nodeName === "span");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3130 if (!target.id) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3131 this.uuid += 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3132 target.id = "dp" + this.uuid;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3133 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3134 inst = this._newInst($(target), inline);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3135 inst.settings = $.extend({}, settings || {});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3136 if (nodeName === "input") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3137 this._connectDatepicker(target, inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3138 } else if (inline) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3139 this._inlineDatepicker(target, inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3140 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3141 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3142
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3143 /* Create a new instance object. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3144 _newInst: function(target, inline) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3145 var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3146 return {id: id, input: target, // associated target
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3147 selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3148 drawMonth: 0, drawYear: 0, // month being drawn
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3149 inline: inline, // is datepicker inline or not
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3150 dpDiv: (!inline ? this.dpDiv : // presentation div
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3151 bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3152 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3153
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3154 /* Attach the date picker to an input field. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3155 _connectDatepicker: function(target, inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3156 var input = $(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3157 inst.append = $([]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3158 inst.trigger = $([]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3159 if (input.hasClass(this.markerClassName)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3160 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3161 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3162 this._attachments(input, inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3163 input.addClass(this.markerClassName).keydown(this._doKeyDown).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3164 keypress(this._doKeyPress).keyup(this._doKeyUp);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3165 this._autoSize(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3166 $.data(target, PROP_NAME, inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3167 //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3168 if( inst.settings.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3169 this._disableDatepicker( target );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3170 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3171 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3172
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3173 /* Make attachments based on settings. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3174 _attachments: function(input, inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3175 var showOn, buttonText, buttonImage,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3176 appendText = this._get(inst, "appendText"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3177 isRTL = this._get(inst, "isRTL");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3178
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3179 if (inst.append) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3180 inst.append.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3181 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3182 if (appendText) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3183 inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3184 input[isRTL ? "before" : "after"](inst.append);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3185 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3186
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3187 input.unbind("focus", this._showDatepicker);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3188
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3189 if (inst.trigger) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3190 inst.trigger.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3191 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3192
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3193 showOn = this._get(inst, "showOn");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3194 if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3195 input.focus(this._showDatepicker);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3196 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3197 if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3198 buttonText = this._get(inst, "buttonText");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3199 buttonImage = this._get(inst, "buttonImage");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3200 inst.trigger = $(this._get(inst, "buttonImageOnly") ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3201 $("<img/>").addClass(this._triggerClass).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3202 attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3203 $("<button type='button'></button>").addClass(this._triggerClass).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3204 html(!buttonImage ? buttonText : $("<img/>").attr(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3205 { src:buttonImage, alt:buttonText, title:buttonText })));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3206 input[isRTL ? "before" : "after"](inst.trigger);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3207 inst.trigger.click(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3208 if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3209 $.datepicker._hideDatepicker();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3210 } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3211 $.datepicker._hideDatepicker();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3212 $.datepicker._showDatepicker(input[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3213 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3214 $.datepicker._showDatepicker(input[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3215 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3216 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3217 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3218 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3219 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3220
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3221 /* Apply the maximum length for the date format. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3222 _autoSize: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3223 if (this._get(inst, "autoSize") && !inst.inline) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3224 var findMax, max, maxI, i,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3225 date = new Date(2009, 12 - 1, 20), // Ensure double digits
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3226 dateFormat = this._get(inst, "dateFormat");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3227
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3228 if (dateFormat.match(/[DM]/)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3229 findMax = function(names) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3230 max = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3231 maxI = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3232 for (i = 0; i < names.length; i++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3233 if (names[i].length > max) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3234 max = names[i].length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3235 maxI = i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3236 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3237 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3238 return maxI;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3239 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3240 date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3241 "monthNames" : "monthNamesShort"))));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3242 date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3243 "dayNames" : "dayNamesShort"))) + 20 - date.getDay());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3244 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3245 inst.input.attr("size", this._formatDate(inst, date).length);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3246 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3247 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3248
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3249 /* Attach an inline date picker to a div. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3250 _inlineDatepicker: function(target, inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3251 var divSpan = $(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3252 if (divSpan.hasClass(this.markerClassName)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3253 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3254 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3255 divSpan.addClass(this.markerClassName).append(inst.dpDiv);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3256 $.data(target, PROP_NAME, inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3257 this._setDate(inst, this._getDefaultDate(inst), true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3258 this._updateDatepicker(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3259 this._updateAlternate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3260 //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3261 if( inst.settings.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3262 this._disableDatepicker( target );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3263 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3264 // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3265 // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3266 inst.dpDiv.css( "display", "block" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3267 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3268
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3269 /* Pop-up the date picker in a "dialog" box.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3270 * @param input element - ignored
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3271 * @param date string or Date - the initial date to display
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3272 * @param onSelect function - the function to call when a date is selected
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3273 * @param settings object - update the dialog date picker instance's settings (anonymous object)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3274 * @param pos int[2] - coordinates for the dialog's position within the screen or
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3275 * event - with x/y coordinates or
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3276 * leave empty for default (screen centre)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3277 * @return the manager object
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3278 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3279 _dialogDatepicker: function(input, date, onSelect, settings, pos) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3280 var id, browserWidth, browserHeight, scrollX, scrollY,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3281 inst = this._dialogInst; // internal instance
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3282
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3283 if (!inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3284 this.uuid += 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3285 id = "dp" + this.uuid;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3286 this._dialogInput = $("<input type='text' id='" + id +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3287 "' style='position: absolute; top: -100px; width: 0px;'/>");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3288 this._dialogInput.keydown(this._doKeyDown);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3289 $("body").append(this._dialogInput);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3290 inst = this._dialogInst = this._newInst(this._dialogInput, false);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3291 inst.settings = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3292 $.data(this._dialogInput[0], PROP_NAME, inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3293 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3294 extendRemove(inst.settings, settings || {});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3295 date = (date && date.constructor === Date ? this._formatDate(inst, date) : date);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3296 this._dialogInput.val(date);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3297
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3298 this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3299 if (!this._pos) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3300 browserWidth = document.documentElement.clientWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3301 browserHeight = document.documentElement.clientHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3302 scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3303 scrollY = document.documentElement.scrollTop || document.body.scrollTop;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3304 this._pos = // should use actual width/height below
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3305 [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3306 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3307
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3308 // move input on screen for focus, but hidden behind dialog
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3309 this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3310 inst.settings.onSelect = onSelect;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3311 this._inDialog = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3312 this.dpDiv.addClass(this._dialogClass);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3313 this._showDatepicker(this._dialogInput[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3314 if ($.blockUI) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3315 $.blockUI(this.dpDiv);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3316 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3317 $.data(this._dialogInput[0], PROP_NAME, inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3318 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3319 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3320
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3321 /* Detach a datepicker from its control.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3322 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3323 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3324 _destroyDatepicker: function(target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3325 var nodeName,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3326 $target = $(target),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3327 inst = $.data(target, PROP_NAME);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3328
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3329 if (!$target.hasClass(this.markerClassName)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3330 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3331 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3332
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3333 nodeName = target.nodeName.toLowerCase();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3334 $.removeData(target, PROP_NAME);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3335 if (nodeName === "input") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3336 inst.append.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3337 inst.trigger.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3338 $target.removeClass(this.markerClassName).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3339 unbind("focus", this._showDatepicker).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3340 unbind("keydown", this._doKeyDown).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3341 unbind("keypress", this._doKeyPress).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3342 unbind("keyup", this._doKeyUp);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3343 } else if (nodeName === "div" || nodeName === "span") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3344 $target.removeClass(this.markerClassName).empty();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3345 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3346 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3347
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3348 /* Enable the date picker to a jQuery selection.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3349 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3350 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3351 _enableDatepicker: function(target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3352 var nodeName, inline,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3353 $target = $(target),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3354 inst = $.data(target, PROP_NAME);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3355
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3356 if (!$target.hasClass(this.markerClassName)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3357 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3358 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3359
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3360 nodeName = target.nodeName.toLowerCase();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3361 if (nodeName === "input") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3362 target.disabled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3363 inst.trigger.filter("button").
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3364 each(function() { this.disabled = false; }).end().
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3365 filter("img").css({opacity: "1.0", cursor: ""});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3366 } else if (nodeName === "div" || nodeName === "span") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3367 inline = $target.children("." + this._inlineClass);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3368 inline.children().removeClass("ui-state-disabled");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3369 inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3370 prop("disabled", false);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3371 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3372 this._disabledInputs = $.map(this._disabledInputs,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3373 function(value) { return (value === target ? null : value); }); // delete entry
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3374 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3375
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3376 /* Disable the date picker to a jQuery selection.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3377 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3378 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3379 _disableDatepicker: function(target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3380 var nodeName, inline,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3381 $target = $(target),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3382 inst = $.data(target, PROP_NAME);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3383
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3384 if (!$target.hasClass(this.markerClassName)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3385 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3386 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3387
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3388 nodeName = target.nodeName.toLowerCase();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3389 if (nodeName === "input") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3390 target.disabled = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3391 inst.trigger.filter("button").
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3392 each(function() { this.disabled = true; }).end().
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3393 filter("img").css({opacity: "0.5", cursor: "default"});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3394 } else if (nodeName === "div" || nodeName === "span") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3395 inline = $target.children("." + this._inlineClass);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3396 inline.children().addClass("ui-state-disabled");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3397 inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3398 prop("disabled", true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3399 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3400 this._disabledInputs = $.map(this._disabledInputs,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3401 function(value) { return (value === target ? null : value); }); // delete entry
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3402 this._disabledInputs[this._disabledInputs.length] = target;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3403 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3404
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3405 /* Is the first field in a jQuery collection disabled as a datepicker?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3406 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3407 * @return boolean - true if disabled, false if enabled
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3408 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3409 _isDisabledDatepicker: function(target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3410 if (!target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3411 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3412 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3413 for (var i = 0; i < this._disabledInputs.length; i++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3414 if (this._disabledInputs[i] === target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3415 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3416 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3417 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3418 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3419 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3420
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3421 /* Retrieve the instance data for the target control.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3422 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3423 * @return object - the associated instance data
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3424 * @throws error if a jQuery problem getting data
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3425 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3426 _getInst: function(target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3427 try {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3428 return $.data(target, PROP_NAME);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3429 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3430 catch (err) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3431 throw "Missing instance data for this datepicker";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3432 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3433 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3434
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3435 /* Update or retrieve the settings for a date picker attached to an input field or division.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3436 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3437 * @param name object - the new settings to update or
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3438 * string - the name of the setting to change or retrieve,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3439 * when retrieving also "all" for all instance settings or
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3440 * "defaults" for all global defaults
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3441 * @param value any - the new value for the setting
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3442 * (omit if above is an object or to retrieve a value)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3443 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3444 _optionDatepicker: function(target, name, value) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3445 var settings, date, minDate, maxDate,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3446 inst = this._getInst(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3447
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3448 if (arguments.length === 2 && typeof name === "string") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3449 return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3450 (inst ? (name === "all" ? $.extend({}, inst.settings) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3451 this._get(inst, name)) : null));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3452 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3453
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3454 settings = name || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3455 if (typeof name === "string") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3456 settings = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3457 settings[name] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3458 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3459
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3460 if (inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3461 if (this._curInst === inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3462 this._hideDatepicker();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3463 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3464
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3465 date = this._getDateDatepicker(target, true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3466 minDate = this._getMinMaxDate(inst, "min");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3467 maxDate = this._getMinMaxDate(inst, "max");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3468 extendRemove(inst.settings, settings);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3469 // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3470 if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3471 inst.settings.minDate = this._formatDate(inst, minDate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3472 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3473 if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3474 inst.settings.maxDate = this._formatDate(inst, maxDate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3475 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3476 if ( "disabled" in settings ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3477 if ( settings.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3478 this._disableDatepicker(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3479 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3480 this._enableDatepicker(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3481 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3482 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3483 this._attachments($(target), inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3484 this._autoSize(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3485 this._setDate(inst, date);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3486 this._updateAlternate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3487 this._updateDatepicker(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3488 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3489 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3490
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3491 // change method deprecated
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3492 _changeDatepicker: function(target, name, value) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3493 this._optionDatepicker(target, name, value);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3494 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3495
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3496 /* Redraw the date picker attached to an input field or division.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3497 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3498 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3499 _refreshDatepicker: function(target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3500 var inst = this._getInst(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3501 if (inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3502 this._updateDatepicker(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3503 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3504 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3505
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3506 /* Set the dates for a jQuery selection.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3507 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3508 * @param date Date - the new date
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3509 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3510 _setDateDatepicker: function(target, date) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3511 var inst = this._getInst(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3512 if (inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3513 this._setDate(inst, date);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3514 this._updateDatepicker(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3515 this._updateAlternate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3516 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3517 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3518
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3519 /* Get the date(s) for the first entry in a jQuery selection.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3520 * @param target element - the target input field or division or span
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3521 * @param noDefault boolean - true if no default date is to be used
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3522 * @return Date - the current date
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3523 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3524 _getDateDatepicker: function(target, noDefault) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3525 var inst = this._getInst(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3526 if (inst && !inst.inline) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3527 this._setDateFromField(inst, noDefault);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3528 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3529 return (inst ? this._getDate(inst) : null);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3530 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3531
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3532 /* Handle keystrokes. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3533 _doKeyDown: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3534 var onSelect, dateStr, sel,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3535 inst = $.datepicker._getInst(event.target),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3536 handled = true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3537 isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3538
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3539 inst._keyEvent = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3540 if ($.datepicker._datepickerShowing) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3541 switch (event.keyCode) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3542 case 9: $.datepicker._hideDatepicker();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3543 handled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3544 break; // hide on tab out
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3545 case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3546 $.datepicker._currentClass + ")", inst.dpDiv);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3547 if (sel[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3548 $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3549 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3550
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3551 onSelect = $.datepicker._get(inst, "onSelect");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3552 if (onSelect) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3553 dateStr = $.datepicker._formatDate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3554
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3555 // trigger custom callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3556 onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3557 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3558 $.datepicker._hideDatepicker();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3559 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3560
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3561 return false; // don't submit the form
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3562 case 27: $.datepicker._hideDatepicker();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3563 break; // hide on escape
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3564 case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3565 -$.datepicker._get(inst, "stepBigMonths") :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3566 -$.datepicker._get(inst, "stepMonths")), "M");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3567 break; // previous month/year on page up/+ ctrl
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3568 case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3569 +$.datepicker._get(inst, "stepBigMonths") :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3570 +$.datepicker._get(inst, "stepMonths")), "M");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3571 break; // next month/year on page down/+ ctrl
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3572 case 35: if (event.ctrlKey || event.metaKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3573 $.datepicker._clearDate(event.target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3574 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3575 handled = event.ctrlKey || event.metaKey;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3576 break; // clear on ctrl or command +end
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3577 case 36: if (event.ctrlKey || event.metaKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3578 $.datepicker._gotoToday(event.target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3579 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3580 handled = event.ctrlKey || event.metaKey;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3581 break; // current on ctrl or command +home
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3582 case 37: if (event.ctrlKey || event.metaKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3583 $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3584 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3585 handled = event.ctrlKey || event.metaKey;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3586 // -1 day on ctrl or command +left
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3587 if (event.originalEvent.altKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3588 $.datepicker._adjustDate(event.target, (event.ctrlKey ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3589 -$.datepicker._get(inst, "stepBigMonths") :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3590 -$.datepicker._get(inst, "stepMonths")), "M");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3591 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3592 // next month/year on alt +left on Mac
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3593 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3594 case 38: if (event.ctrlKey || event.metaKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3595 $.datepicker._adjustDate(event.target, -7, "D");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3596 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3597 handled = event.ctrlKey || event.metaKey;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3598 break; // -1 week on ctrl or command +up
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3599 case 39: if (event.ctrlKey || event.metaKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3600 $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3601 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3602 handled = event.ctrlKey || event.metaKey;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3603 // +1 day on ctrl or command +right
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3604 if (event.originalEvent.altKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3605 $.datepicker._adjustDate(event.target, (event.ctrlKey ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3606 +$.datepicker._get(inst, "stepBigMonths") :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3607 +$.datepicker._get(inst, "stepMonths")), "M");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3608 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3609 // next month/year on alt +right
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3610 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3611 case 40: if (event.ctrlKey || event.metaKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3612 $.datepicker._adjustDate(event.target, +7, "D");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3613 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3614 handled = event.ctrlKey || event.metaKey;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3615 break; // +1 week on ctrl or command +down
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3616 default: handled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3617 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3618 } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3619 $.datepicker._showDatepicker(this);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3620 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3621 handled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3622 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3623
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3624 if (handled) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3625 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3626 event.stopPropagation();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3627 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3628 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3629
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3630 /* Filter entered characters - based on date format. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3631 _doKeyPress: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3632 var chars, chr,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3633 inst = $.datepicker._getInst(event.target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3634
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3635 if ($.datepicker._get(inst, "constrainInput")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3636 chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3637 chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3638 return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3639 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3640 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3641
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3642 /* Synchronise manual entry and field/alternate field. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3643 _doKeyUp: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3644 var date,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3645 inst = $.datepicker._getInst(event.target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3646
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3647 if (inst.input.val() !== inst.lastVal) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3648 try {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3649 date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3650 (inst.input ? inst.input.val() : null),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3651 $.datepicker._getFormatConfig(inst));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3652
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3653 if (date) { // only if valid
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3654 $.datepicker._setDateFromField(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3655 $.datepicker._updateAlternate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3656 $.datepicker._updateDatepicker(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3657 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3658 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3659 catch (err) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3660 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3661 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3662 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3663 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3664
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3665 /* Pop-up the date picker for a given input field.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3666 * If false returned from beforeShow event handler do not show.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3667 * @param input element - the input field attached to the date picker or
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3668 * event - if triggered by focus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3669 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3670 _showDatepicker: function(input) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3671 input = input.target || input;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3672 if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3673 input = $("input", input.parentNode)[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3674 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3675
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3676 if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3677 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3678 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3679
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3680 var inst, beforeShow, beforeShowSettings, isFixed,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3681 offset, showAnim, duration;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3682
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3683 inst = $.datepicker._getInst(input);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3684 if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3685 $.datepicker._curInst.dpDiv.stop(true, true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3686 if ( inst && $.datepicker._datepickerShowing ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3687 $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3688 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3689 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3690
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3691 beforeShow = $.datepicker._get(inst, "beforeShow");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3692 beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3693 if(beforeShowSettings === false){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3694 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3695 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3696 extendRemove(inst.settings, beforeShowSettings);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3697
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3698 inst.lastVal = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3699 $.datepicker._lastInput = input;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3700 $.datepicker._setDateFromField(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3701
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3702 if ($.datepicker._inDialog) { // hide cursor
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3703 input.value = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3704 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3705 if (!$.datepicker._pos) { // position below input
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3706 $.datepicker._pos = $.datepicker._findPos(input);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3707 $.datepicker._pos[1] += input.offsetHeight; // add the height
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3708 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3709
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3710 isFixed = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3711 $(input).parents().each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3712 isFixed |= $(this).css("position") === "fixed";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3713 return !isFixed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3714 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3715
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3716 offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3717 $.datepicker._pos = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3718 //to avoid flashes on Firefox
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3719 inst.dpDiv.empty();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3720 // determine sizing offscreen
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3721 inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3722 $.datepicker._updateDatepicker(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3723 // fix width for dynamic number of date pickers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3724 // and adjust position before showing
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3725 offset = $.datepicker._checkOffset(inst, offset, isFixed);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3726 inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3727 "static" : (isFixed ? "fixed" : "absolute")), display: "none",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3728 left: offset.left + "px", top: offset.top + "px"});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3729
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3730 if (!inst.inline) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3731 showAnim = $.datepicker._get(inst, "showAnim");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3732 duration = $.datepicker._get(inst, "duration");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3733 inst.dpDiv.zIndex($(input).zIndex()+1);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3734 $.datepicker._datepickerShowing = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3735
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3736 if ( $.effects && $.effects.effect[ showAnim ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3737 inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3738 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3739 inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3740 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3741
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3742 if ( $.datepicker._shouldFocusInput( inst ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3743 inst.input.focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3744 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3745
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3746 $.datepicker._curInst = inst;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3747 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3748 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3749
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3750 /* Generate the date picker content. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3751 _updateDatepicker: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3752 this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3753 instActive = inst; // for delegate hover events
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3754 inst.dpDiv.empty().append(this._generateHTML(inst));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3755 this._attachHandlers(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3756 inst.dpDiv.find("." + this._dayOverClass + " a").mouseover();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3757
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3758 var origyearshtml,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3759 numMonths = this._getNumberOfMonths(inst),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3760 cols = numMonths[1],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3761 width = 17;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3762
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3763 inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3764 if (cols > 1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3765 inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3766 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3767 inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3768 "Class"]("ui-datepicker-multi");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3769 inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3770 "Class"]("ui-datepicker-rtl");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3771
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3772 if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3773 inst.input.focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3774 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3775
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3776 // deffered render of the years select (to avoid flashes on Firefox)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3777 if( inst.yearshtml ){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3778 origyearshtml = inst.yearshtml;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3779 setTimeout(function(){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3780 //assure that inst.yearshtml didn't change.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3781 if( origyearshtml === inst.yearshtml && inst.yearshtml ){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3782 inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3783 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3784 origyearshtml = inst.yearshtml = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3785 }, 0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3786 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3787 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3788
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3789 // #6694 - don't focus the input if it's already focused
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3790 // this breaks the change event in IE
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3791 // Support: IE and jQuery <1.9
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3792 _shouldFocusInput: function( inst ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3793 return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3794 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3795
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3796 /* Check positioning to remain on screen. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3797 _checkOffset: function(inst, offset, isFixed) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3798 var dpWidth = inst.dpDiv.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3799 dpHeight = inst.dpDiv.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3800 inputWidth = inst.input ? inst.input.outerWidth() : 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3801 inputHeight = inst.input ? inst.input.outerHeight() : 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3802 viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3803 viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3804
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3805 offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3806 offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3807 offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3808
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3809 // now check if datepicker is showing outside window viewport - move to a better place if so.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3810 offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3811 Math.abs(offset.left + dpWidth - viewWidth) : 0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3812 offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3813 Math.abs(dpHeight + inputHeight) : 0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3814
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3815 return offset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3816 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3817
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3818 /* Find an object's position on the screen. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3819 _findPos: function(obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3820 var position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3821 inst = this._getInst(obj),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3822 isRTL = this._get(inst, "isRTL");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3823
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3824 while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3825 obj = obj[isRTL ? "previousSibling" : "nextSibling"];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3826 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3827
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3828 position = $(obj).offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3829 return [position.left, position.top];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3830 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3831
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3832 /* Hide the date picker from view.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3833 * @param input element - the input field attached to the date picker
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3834 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3835 _hideDatepicker: function(input) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3836 var showAnim, duration, postProcess, onClose,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3837 inst = this._curInst;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3838
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3839 if (!inst || (input && inst !== $.data(input, PROP_NAME))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3840 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3841 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3842
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3843 if (this._datepickerShowing) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3844 showAnim = this._get(inst, "showAnim");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3845 duration = this._get(inst, "duration");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3846 postProcess = function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3847 $.datepicker._tidyDialog(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3848 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3849
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3850 // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3851 if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3852 inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3853 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3854 inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3855 (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3856 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3857
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3858 if (!showAnim) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3859 postProcess();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3860 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3861 this._datepickerShowing = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3862
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3863 onClose = this._get(inst, "onClose");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3864 if (onClose) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3865 onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3866 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3867
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3868 this._lastInput = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3869 if (this._inDialog) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3870 this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3871 if ($.blockUI) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3872 $.unblockUI();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3873 $("body").append(this.dpDiv);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3874 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3875 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3876 this._inDialog = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3877 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3878 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3879
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3880 /* Tidy up after a dialog display. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3881 _tidyDialog: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3882 inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3883 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3884
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3885 /* Close date picker if clicked elsewhere. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3886 _checkExternalClick: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3887 if (!$.datepicker._curInst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3888 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3889 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3890
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3891 var $target = $(event.target),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3892 inst = $.datepicker._getInst($target[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3893
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3894 if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3895 $target.parents("#" + $.datepicker._mainDivId).length === 0 &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3896 !$target.hasClass($.datepicker.markerClassName) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3897 !$target.closest("." + $.datepicker._triggerClass).length &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3898 $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3899 ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3900 $.datepicker._hideDatepicker();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3901 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3902 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3903
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3904 /* Adjust one of the date sub-fields. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3905 _adjustDate: function(id, offset, period) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3906 var target = $(id),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3907 inst = this._getInst(target[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3908
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3909 if (this._isDisabledDatepicker(target[0])) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3910 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3911 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3912 this._adjustInstDate(inst, offset +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3913 (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3914 period);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3915 this._updateDatepicker(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3916 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3917
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3918 /* Action for current link. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3919 _gotoToday: function(id) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3920 var date,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3921 target = $(id),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3922 inst = this._getInst(target[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3923
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3924 if (this._get(inst, "gotoCurrent") && inst.currentDay) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3925 inst.selectedDay = inst.currentDay;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3926 inst.drawMonth = inst.selectedMonth = inst.currentMonth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3927 inst.drawYear = inst.selectedYear = inst.currentYear;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3928 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3929 date = new Date();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3930 inst.selectedDay = date.getDate();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3931 inst.drawMonth = inst.selectedMonth = date.getMonth();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3932 inst.drawYear = inst.selectedYear = date.getFullYear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3933 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3934 this._notifyChange(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3935 this._adjustDate(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3936 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3937
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3938 /* Action for selecting a new month/year. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3939 _selectMonthYear: function(id, select, period) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3940 var target = $(id),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3941 inst = this._getInst(target[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3942
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3943 inst["selected" + (period === "M" ? "Month" : "Year")] =
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3944 inst["draw" + (period === "M" ? "Month" : "Year")] =
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3945 parseInt(select.options[select.selectedIndex].value,10);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3946
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3947 this._notifyChange(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3948 this._adjustDate(target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3949 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3950
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3951 /* Action for selecting a day. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3952 _selectDay: function(id, month, year, td) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3953 var inst,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3954 target = $(id);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3955
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3956 if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3957 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3958 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3959
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3960 inst = this._getInst(target[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3961 inst.selectedDay = inst.currentDay = $("a", td).html();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3962 inst.selectedMonth = inst.currentMonth = month;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3963 inst.selectedYear = inst.currentYear = year;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3964 this._selectDate(id, this._formatDate(inst,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3965 inst.currentDay, inst.currentMonth, inst.currentYear));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3966 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3967
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3968 /* Erase the input field and hide the date picker. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3969 _clearDate: function(id) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3970 var target = $(id);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3971 this._selectDate(target, "");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3972 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3973
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3974 /* Update the input field with the selected date. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3975 _selectDate: function(id, dateStr) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3976 var onSelect,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3977 target = $(id),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3978 inst = this._getInst(target[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3979
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3980 dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3981 if (inst.input) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3982 inst.input.val(dateStr);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3983 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3984 this._updateAlternate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3985
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3986 onSelect = this._get(inst, "onSelect");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3987 if (onSelect) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3988 onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3989 } else if (inst.input) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3990 inst.input.trigger("change"); // fire the change event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3991 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3992
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3993 if (inst.inline){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3994 this._updateDatepicker(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3995 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3996 this._hideDatepicker();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3997 this._lastInput = inst.input[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3998 if (typeof(inst.input[0]) !== "object") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
3999 inst.input.focus(); // restore focus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4000 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4001 this._lastInput = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4002 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4003 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4004
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4005 /* Update any alternate field to synchronise with the main field. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4006 _updateAlternate: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4007 var altFormat, date, dateStr,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4008 altField = this._get(inst, "altField");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4009
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4010 if (altField) { // update alternate field too
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4011 altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4012 date = this._getDate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4013 dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4014 $(altField).each(function() { $(this).val(dateStr); });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4015 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4016 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4017
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4018 /* Set as beforeShowDay function to prevent selection of weekends.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4019 * @param date Date - the date to customise
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4020 * @return [boolean, string] - is this date selectable?, what is its CSS class?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4021 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4022 noWeekends: function(date) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4023 var day = date.getDay();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4024 return [(day > 0 && day < 6), ""];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4025 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4026
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4027 /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4028 * @param date Date - the date to get the week for
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4029 * @return number - the number of the week within the year that contains this date
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4030 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4031 iso8601Week: function(date) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4032 var time,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4033 checkDate = new Date(date.getTime());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4034
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4035 // Find Thursday of this week starting on Monday
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4036 checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4037
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4038 time = checkDate.getTime();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4039 checkDate.setMonth(0); // Compare with Jan 1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4040 checkDate.setDate(1);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4041 return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4042 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4043
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4044 /* Parse a string value into a date object.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4045 * See formatDate below for the possible formats.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4046 *
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4047 * @param format string - the expected format of the date
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4048 * @param value string - the date in the above format
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4049 * @param settings Object - attributes include:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4050 * shortYearCutoff number - the cutoff year for determining the century (optional)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4051 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4052 * dayNames string[7] - names of the days from Sunday (optional)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4053 * monthNamesShort string[12] - abbreviated names of the months (optional)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4054 * monthNames string[12] - names of the months (optional)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4055 * @return Date - the extracted date value or null if value is blank
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4056 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4057 parseDate: function (format, value, settings) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4058 if (format == null || value == null) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4059 throw "Invalid arguments";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4060 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4061
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4062 value = (typeof value === "object" ? value.toString() : value + "");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4063 if (value === "") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4064 return null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4065 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4066
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4067 var iFormat, dim, extra,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4068 iValue = 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4069 shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4070 shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4071 new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4072 dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4073 dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4074 monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4075 monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4076 year = -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4077 month = -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4078 day = -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4079 doy = -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4080 literal = false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4081 date,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4082 // Check whether a format character is doubled
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4083 lookAhead = function(match) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4084 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4085 if (matches) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4086 iFormat++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4087 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4088 return matches;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4089 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4090 // Extract a number from the string value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4091 getNumber = function(match) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4092 var isDoubled = lookAhead(match),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4093 size = (match === "@" ? 14 : (match === "!" ? 20 :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4094 (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4095 digits = new RegExp("^\\d{1," + size + "}"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4096 num = value.substring(iValue).match(digits);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4097 if (!num) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4098 throw "Missing number at position " + iValue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4099 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4100 iValue += num[0].length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4101 return parseInt(num[0], 10);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4102 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4103 // Extract a name from the string value and convert to an index
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4104 getName = function(match, shortNames, longNames) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4105 var index = -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4106 names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4107 return [ [k, v] ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4108 }).sort(function (a, b) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4109 return -(a[1].length - b[1].length);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4110 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4111
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4112 $.each(names, function (i, pair) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4113 var name = pair[1];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4114 if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4115 index = pair[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4116 iValue += name.length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4117 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4118 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4119 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4120 if (index !== -1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4121 return index + 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4122 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4123 throw "Unknown name at position " + iValue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4124 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4125 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4126 // Confirm that a literal character matches the string value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4127 checkLiteral = function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4128 if (value.charAt(iValue) !== format.charAt(iFormat)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4129 throw "Unexpected literal at position " + iValue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4130 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4131 iValue++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4132 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4133
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4134 for (iFormat = 0; iFormat < format.length; iFormat++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4135 if (literal) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4136 if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4137 literal = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4138 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4139 checkLiteral();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4140 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4141 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4142 switch (format.charAt(iFormat)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4143 case "d":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4144 day = getNumber("d");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4145 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4146 case "D":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4147 getName("D", dayNamesShort, dayNames);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4148 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4149 case "o":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4150 doy = getNumber("o");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4151 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4152 case "m":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4153 month = getNumber("m");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4154 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4155 case "M":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4156 month = getName("M", monthNamesShort, monthNames);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4157 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4158 case "y":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4159 year = getNumber("y");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4160 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4161 case "@":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4162 date = new Date(getNumber("@"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4163 year = date.getFullYear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4164 month = date.getMonth() + 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4165 day = date.getDate();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4166 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4167 case "!":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4168 date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4169 year = date.getFullYear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4170 month = date.getMonth() + 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4171 day = date.getDate();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4172 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4173 case "'":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4174 if (lookAhead("'")){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4175 checkLiteral();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4176 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4177 literal = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4178 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4179 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4180 default:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4181 checkLiteral();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4182 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4183 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4184 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4185
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4186 if (iValue < value.length){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4187 extra = value.substr(iValue);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4188 if (!/^\s+/.test(extra)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4189 throw "Extra/unparsed characters found in date: " + extra;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4190 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4191 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4192
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4193 if (year === -1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4194 year = new Date().getFullYear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4195 } else if (year < 100) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4196 year += new Date().getFullYear() - new Date().getFullYear() % 100 +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4197 (year <= shortYearCutoff ? 0 : -100);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4198 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4199
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4200 if (doy > -1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4201 month = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4202 day = doy;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4203 do {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4204 dim = this._getDaysInMonth(year, month - 1);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4205 if (day <= dim) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4206 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4207 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4208 month++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4209 day -= dim;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4210 } while (true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4211 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4212
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4213 date = this._daylightSavingAdjust(new Date(year, month - 1, day));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4214 if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4215 throw "Invalid date"; // E.g. 31/02/00
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4216 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4217 return date;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4218 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4219
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4220 /* Standard date formats. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4221 ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4222 COOKIE: "D, dd M yy",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4223 ISO_8601: "yy-mm-dd",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4224 RFC_822: "D, d M y",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4225 RFC_850: "DD, dd-M-y",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4226 RFC_1036: "D, d M y",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4227 RFC_1123: "D, d M yy",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4228 RFC_2822: "D, d M yy",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4229 RSS: "D, d M y", // RFC 822
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4230 TICKS: "!",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4231 TIMESTAMP: "@",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4232 W3C: "yy-mm-dd", // ISO 8601
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4233
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4234 _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4235 Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4236
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4237 /* Format a date object into a string value.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4238 * The format can be combinations of the following:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4239 * d - day of month (no leading zero)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4240 * dd - day of month (two digit)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4241 * o - day of year (no leading zeros)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4242 * oo - day of year (three digit)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4243 * D - day name short
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4244 * DD - day name long
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4245 * m - month of year (no leading zero)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4246 * mm - month of year (two digit)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4247 * M - month name short
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4248 * MM - month name long
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4249 * y - year (two digit)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4250 * yy - year (four digit)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4251 * @ - Unix timestamp (ms since 01/01/1970)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4252 * ! - Windows ticks (100ns since 01/01/0001)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4253 * "..." - literal text
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4254 * '' - single quote
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4255 *
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4256 * @param format string - the desired format of the date
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4257 * @param date Date - the date value to format
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4258 * @param settings Object - attributes include:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4259 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4260 * dayNames string[7] - names of the days from Sunday (optional)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4261 * monthNamesShort string[12] - abbreviated names of the months (optional)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4262 * monthNames string[12] - names of the months (optional)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4263 * @return string - the date in the above format
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4264 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4265 formatDate: function (format, date, settings) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4266 if (!date) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4267 return "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4268 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4269
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4270 var iFormat,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4271 dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4272 dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4273 monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4274 monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4275 // Check whether a format character is doubled
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4276 lookAhead = function(match) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4277 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4278 if (matches) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4279 iFormat++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4280 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4281 return matches;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4282 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4283 // Format a number, with leading zero if necessary
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4284 formatNumber = function(match, value, len) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4285 var num = "" + value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4286 if (lookAhead(match)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4287 while (num.length < len) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4288 num = "0" + num;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4289 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4290 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4291 return num;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4292 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4293 // Format a name, short or long as requested
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4294 formatName = function(match, value, shortNames, longNames) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4295 return (lookAhead(match) ? longNames[value] : shortNames[value]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4296 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4297 output = "",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4298 literal = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4299
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4300 if (date) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4301 for (iFormat = 0; iFormat < format.length; iFormat++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4302 if (literal) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4303 if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4304 literal = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4305 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4306 output += format.charAt(iFormat);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4307 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4308 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4309 switch (format.charAt(iFormat)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4310 case "d":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4311 output += formatNumber("d", date.getDate(), 2);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4312 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4313 case "D":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4314 output += formatName("D", date.getDay(), dayNamesShort, dayNames);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4315 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4316 case "o":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4317 output += formatNumber("o",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4318 Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4319 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4320 case "m":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4321 output += formatNumber("m", date.getMonth() + 1, 2);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4322 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4323 case "M":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4324 output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4325 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4326 case "y":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4327 output += (lookAhead("y") ? date.getFullYear() :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4328 (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4329 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4330 case "@":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4331 output += date.getTime();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4332 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4333 case "!":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4334 output += date.getTime() * 10000 + this._ticksTo1970;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4335 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4336 case "'":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4337 if (lookAhead("'")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4338 output += "'";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4339 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4340 literal = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4341 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4342 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4343 default:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4344 output += format.charAt(iFormat);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4345 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4346 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4347 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4348 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4349 return output;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4350 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4351
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4352 /* Extract all possible characters from the date format. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4353 _possibleChars: function (format) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4354 var iFormat,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4355 chars = "",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4356 literal = false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4357 // Check whether a format character is doubled
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4358 lookAhead = function(match) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4359 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4360 if (matches) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4361 iFormat++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4362 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4363 return matches;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4364 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4365
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4366 for (iFormat = 0; iFormat < format.length; iFormat++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4367 if (literal) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4368 if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4369 literal = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4370 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4371 chars += format.charAt(iFormat);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4372 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4373 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4374 switch (format.charAt(iFormat)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4375 case "d": case "m": case "y": case "@":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4376 chars += "0123456789";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4377 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4378 case "D": case "M":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4379 return null; // Accept anything
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4380 case "'":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4381 if (lookAhead("'")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4382 chars += "'";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4383 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4384 literal = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4385 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4386 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4387 default:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4388 chars += format.charAt(iFormat);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4389 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4390 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4391 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4392 return chars;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4393 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4394
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4395 /* Get a setting value, defaulting if necessary. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4396 _get: function(inst, name) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4397 return inst.settings[name] !== undefined ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4398 inst.settings[name] : this._defaults[name];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4399 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4400
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4401 /* Parse existing date and initialise date picker. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4402 _setDateFromField: function(inst, noDefault) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4403 if (inst.input.val() === inst.lastVal) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4404 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4405 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4406
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4407 var dateFormat = this._get(inst, "dateFormat"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4408 dates = inst.lastVal = inst.input ? inst.input.val() : null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4409 defaultDate = this._getDefaultDate(inst),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4410 date = defaultDate,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4411 settings = this._getFormatConfig(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4412
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4413 try {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4414 date = this.parseDate(dateFormat, dates, settings) || defaultDate;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4415 } catch (event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4416 dates = (noDefault ? "" : dates);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4417 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4418 inst.selectedDay = date.getDate();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4419 inst.drawMonth = inst.selectedMonth = date.getMonth();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4420 inst.drawYear = inst.selectedYear = date.getFullYear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4421 inst.currentDay = (dates ? date.getDate() : 0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4422 inst.currentMonth = (dates ? date.getMonth() : 0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4423 inst.currentYear = (dates ? date.getFullYear() : 0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4424 this._adjustInstDate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4425 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4426
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4427 /* Retrieve the default date shown on opening. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4428 _getDefaultDate: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4429 return this._restrictMinMax(inst,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4430 this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4431 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4432
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4433 /* A date may be specified as an exact value or a relative one. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4434 _determineDate: function(inst, date, defaultDate) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4435 var offsetNumeric = function(offset) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4436 var date = new Date();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4437 date.setDate(date.getDate() + offset);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4438 return date;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4439 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4440 offsetString = function(offset) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4441 try {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4442 return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4443 offset, $.datepicker._getFormatConfig(inst));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4444 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4445 catch (e) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4446 // Ignore
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4447 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4448
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4449 var date = (offset.toLowerCase().match(/^c/) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4450 $.datepicker._getDate(inst) : null) || new Date(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4451 year = date.getFullYear(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4452 month = date.getMonth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4453 day = date.getDate(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4454 pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4455 matches = pattern.exec(offset);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4456
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4457 while (matches) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4458 switch (matches[2] || "d") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4459 case "d" : case "D" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4460 day += parseInt(matches[1],10); break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4461 case "w" : case "W" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4462 day += parseInt(matches[1],10) * 7; break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4463 case "m" : case "M" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4464 month += parseInt(matches[1],10);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4465 day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4466 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4467 case "y": case "Y" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4468 year += parseInt(matches[1],10);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4469 day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4470 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4471 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4472 matches = pattern.exec(offset);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4473 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4474 return new Date(year, month, day);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4475 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4476 newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4477 (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4478
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4479 newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4480 if (newDate) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4481 newDate.setHours(0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4482 newDate.setMinutes(0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4483 newDate.setSeconds(0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4484 newDate.setMilliseconds(0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4485 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4486 return this._daylightSavingAdjust(newDate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4487 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4488
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4489 /* Handle switch to/from daylight saving.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4490 * Hours may be non-zero on daylight saving cut-over:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4491 * > 12 when midnight changeover, but then cannot generate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4492 * midnight datetime, so jump to 1AM, otherwise reset.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4493 * @param date (Date) the date to check
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4494 * @return (Date) the corrected date
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4495 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4496 _daylightSavingAdjust: function(date) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4497 if (!date) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4498 return null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4499 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4500 date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4501 return date;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4502 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4503
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4504 /* Set the date(s) directly. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4505 _setDate: function(inst, date, noChange) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4506 var clear = !date,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4507 origMonth = inst.selectedMonth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4508 origYear = inst.selectedYear,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4509 newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4510
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4511 inst.selectedDay = inst.currentDay = newDate.getDate();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4512 inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4513 inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4514 if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4515 this._notifyChange(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4516 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4517 this._adjustInstDate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4518 if (inst.input) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4519 inst.input.val(clear ? "" : this._formatDate(inst));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4520 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4521 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4522
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4523 /* Retrieve the date(s) directly. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4524 _getDate: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4525 var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4526 this._daylightSavingAdjust(new Date(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4527 inst.currentYear, inst.currentMonth, inst.currentDay)));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4528 return startDate;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4529 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4530
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4531 /* Attach the onxxx handlers. These are declared statically so
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4532 * they work with static code transformers like Caja.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4533 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4534 _attachHandlers: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4535 var stepMonths = this._get(inst, "stepMonths"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4536 id = "#" + inst.id.replace( /\\\\/g, "\\" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4537 inst.dpDiv.find("[data-handler]").map(function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4538 var handler = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4539 prev: function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4540 $.datepicker._adjustDate(id, -stepMonths, "M");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4541 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4542 next: function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4543 $.datepicker._adjustDate(id, +stepMonths, "M");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4544 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4545 hide: function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4546 $.datepicker._hideDatepicker();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4547 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4548 today: function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4549 $.datepicker._gotoToday(id);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4550 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4551 selectDay: function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4552 $.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4553 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4554 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4555 selectMonth: function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4556 $.datepicker._selectMonthYear(id, this, "M");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4557 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4558 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4559 selectYear: function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4560 $.datepicker._selectMonthYear(id, this, "Y");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4561 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4562 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4563 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4564 $(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4565 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4566 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4567
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4568 /* Generate the HTML for the current state of the date picker. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4569 _generateHTML: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4570 var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4571 controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4572 monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4573 selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4574 cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4575 printDate, dRow, tbody, daySettings, otherMonth, unselectable,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4576 tempDate = new Date(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4577 today = this._daylightSavingAdjust(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4578 new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4579 isRTL = this._get(inst, "isRTL"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4580 showButtonPanel = this._get(inst, "showButtonPanel"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4581 hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4582 navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4583 numMonths = this._getNumberOfMonths(inst),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4584 showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4585 stepMonths = this._get(inst, "stepMonths"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4586 isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4587 currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4588 new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4589 minDate = this._getMinMaxDate(inst, "min"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4590 maxDate = this._getMinMaxDate(inst, "max"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4591 drawMonth = inst.drawMonth - showCurrentAtPos,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4592 drawYear = inst.drawYear;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4593
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4594 if (drawMonth < 0) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4595 drawMonth += 12;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4596 drawYear--;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4597 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4598 if (maxDate) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4599 maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4600 maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4601 maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4602 while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4603 drawMonth--;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4604 if (drawMonth < 0) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4605 drawMonth = 11;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4606 drawYear--;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4607 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4608 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4609 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4610 inst.drawMonth = drawMonth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4611 inst.drawYear = drawYear;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4612
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4613 prevText = this._get(inst, "prevText");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4614 prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4615 this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4616 this._getFormatConfig(inst)));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4617
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4618 prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4619 "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4620 " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4621 (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+ prevText +"'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4622
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4623 nextText = this._get(inst, "nextText");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4624 nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4625 this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4626 this._getFormatConfig(inst)));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4627
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4628 next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4629 "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4630 " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4631 (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+ nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4632
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4633 currentText = this._get(inst, "currentText");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4634 gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4635 currentText = (!navigationAsDateFormat ? currentText :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4636 this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4637
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4638 controls = (!inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4639 this._get(inst, "closeText") + "</button>" : "");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4640
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4641 buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4642 (this._isInRange(inst, gotoDate) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4643 ">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4644
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4645 firstDay = parseInt(this._get(inst, "firstDay"),10);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4646 firstDay = (isNaN(firstDay) ? 0 : firstDay);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4647
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4648 showWeek = this._get(inst, "showWeek");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4649 dayNames = this._get(inst, "dayNames");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4650 dayNamesMin = this._get(inst, "dayNamesMin");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4651 monthNames = this._get(inst, "monthNames");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4652 monthNamesShort = this._get(inst, "monthNamesShort");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4653 beforeShowDay = this._get(inst, "beforeShowDay");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4654 showOtherMonths = this._get(inst, "showOtherMonths");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4655 selectOtherMonths = this._get(inst, "selectOtherMonths");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4656 defaultDate = this._getDefaultDate(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4657 html = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4658 dow;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4659 for (row = 0; row < numMonths[0]; row++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4660 group = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4661 this.maxRows = 4;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4662 for (col = 0; col < numMonths[1]; col++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4663 selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4664 cornerClass = " ui-corner-all";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4665 calender = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4666 if (isMultiMonth) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4667 calender += "<div class='ui-datepicker-group";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4668 if (numMonths[1] > 1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4669 switch (col) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4670 case 0: calender += " ui-datepicker-group-first";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4671 cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4672 case numMonths[1]-1: calender += " ui-datepicker-group-last";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4673 cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4674 default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4675 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4676 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4677 calender += "'>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4678 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4679 calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4680 (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4681 (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4682 this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4683 row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4684 "</div><table class='ui-datepicker-calendar'><thead>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4685 "<tr>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4686 thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4687 for (dow = 0; dow < 7; dow++) { // days of the week
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4688 day = (dow + firstDay) % 7;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4689 thead += "<th" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4690 "<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4691 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4692 calender += thead + "</tr></thead><tbody>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4693 daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4694 if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4695 inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4696 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4697 leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4698 curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4699 numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4700 this.maxRows = numRows;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4701 printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4702 for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4703 calender += "<tr>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4704 tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4705 this._get(inst, "calculateWeek")(printDate) + "</td>");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4706 for (dow = 0; dow < 7; dow++) { // create date picker days
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4707 daySettings = (beforeShowDay ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4708 beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4709 otherMonth = (printDate.getMonth() !== drawMonth);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4710 unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4711 (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4712 tbody += "<td class='" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4713 ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4714 (otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4715 ((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4716 (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4717 // or defaultDate is current printedDate and defaultDate is selectedDate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4718 " " + this._dayOverClass : "") + // highlight selected day
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4719 (unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") + // highlight unselectable days
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4720 (otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4721 (printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4722 (printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4723 ((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4724 (unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4725 (otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4726 (unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4727 (printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4728 (printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4729 (otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4730 "' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4731 printDate.setDate(printDate.getDate() + 1);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4732 printDate = this._daylightSavingAdjust(printDate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4733 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4734 calender += tbody + "</tr>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4735 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4736 drawMonth++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4737 if (drawMonth > 11) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4738 drawMonth = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4739 drawYear++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4740 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4741 calender += "</tbody></table>" + (isMultiMonth ? "</div>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4742 ((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4743 group += calender;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4744 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4745 html += group;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4746 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4747 html += buttonPanel;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4748 inst._keyEvent = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4749 return html;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4750 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4751
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4752 /* Generate the month and year header. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4753 _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4754 secondary, monthNames, monthNamesShort) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4755
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4756 var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4757 changeMonth = this._get(inst, "changeMonth"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4758 changeYear = this._get(inst, "changeYear"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4759 showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4760 html = "<div class='ui-datepicker-title'>",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4761 monthHtml = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4762
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4763 // month selection
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4764 if (secondary || !changeMonth) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4765 monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4766 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4767 inMinYear = (minDate && minDate.getFullYear() === drawYear);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4768 inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4769 monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4770 for ( month = 0; month < 12; month++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4771 if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4772 monthHtml += "<option value='" + month + "'" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4773 (month === drawMonth ? " selected='selected'" : "") +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4774 ">" + monthNamesShort[month] + "</option>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4775 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4776 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4777 monthHtml += "</select>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4778 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4779
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4780 if (!showMonthAfterYear) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4781 html += monthHtml + (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4782 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4783
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4784 // year selection
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4785 if ( !inst.yearshtml ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4786 inst.yearshtml = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4787 if (secondary || !changeYear) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4788 html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4789 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4790 // determine range of years to display
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4791 years = this._get(inst, "yearRange").split(":");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4792 thisYear = new Date().getFullYear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4793 determineYear = function(value) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4794 var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4795 (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4796 parseInt(value, 10)));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4797 return (isNaN(year) ? thisYear : year);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4798 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4799 year = determineYear(years[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4800 endYear = Math.max(year, determineYear(years[1] || ""));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4801 year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4802 endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4803 inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4804 for (; year <= endYear; year++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4805 inst.yearshtml += "<option value='" + year + "'" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4806 (year === drawYear ? " selected='selected'" : "") +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4807 ">" + year + "</option>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4808 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4809 inst.yearshtml += "</select>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4810
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4811 html += inst.yearshtml;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4812 inst.yearshtml = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4813 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4814 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4815
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4816 html += this._get(inst, "yearSuffix");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4817 if (showMonthAfterYear) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4818 html += (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "") + monthHtml;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4819 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4820 html += "</div>"; // Close datepicker_header
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4821 return html;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4822 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4823
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4824 /* Adjust one of the date sub-fields. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4825 _adjustInstDate: function(inst, offset, period) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4826 var year = inst.drawYear + (period === "Y" ? offset : 0),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4827 month = inst.drawMonth + (period === "M" ? offset : 0),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4828 day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4829 date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4830
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4831 inst.selectedDay = date.getDate();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4832 inst.drawMonth = inst.selectedMonth = date.getMonth();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4833 inst.drawYear = inst.selectedYear = date.getFullYear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4834 if (period === "M" || period === "Y") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4835 this._notifyChange(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4836 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4837 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4838
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4839 /* Ensure a date is within any min/max bounds. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4840 _restrictMinMax: function(inst, date) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4841 var minDate = this._getMinMaxDate(inst, "min"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4842 maxDate = this._getMinMaxDate(inst, "max"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4843 newDate = (minDate && date < minDate ? minDate : date);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4844 return (maxDate && newDate > maxDate ? maxDate : newDate);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4845 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4846
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4847 /* Notify change of month/year. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4848 _notifyChange: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4849 var onChange = this._get(inst, "onChangeMonthYear");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4850 if (onChange) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4851 onChange.apply((inst.input ? inst.input[0] : null),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4852 [inst.selectedYear, inst.selectedMonth + 1, inst]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4853 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4854 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4855
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4856 /* Determine the number of months to show. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4857 _getNumberOfMonths: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4858 var numMonths = this._get(inst, "numberOfMonths");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4859 return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4860 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4861
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4862 /* Determine the current maximum date - ensure no time components are set. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4863 _getMinMaxDate: function(inst, minMax) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4864 return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4865 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4866
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4867 /* Find the number of days in a given month. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4868 _getDaysInMonth: function(year, month) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4869 return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4870 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4871
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4872 /* Find the day of the week of the first of a month. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4873 _getFirstDayOfMonth: function(year, month) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4874 return new Date(year, month, 1).getDay();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4875 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4876
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4877 /* Determines if we should allow a "next/prev" month display change. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4878 _canAdjustMonth: function(inst, offset, curYear, curMonth) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4879 var numMonths = this._getNumberOfMonths(inst),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4880 date = this._daylightSavingAdjust(new Date(curYear,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4881 curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4882
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4883 if (offset < 0) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4884 date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4885 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4886 return this._isInRange(inst, date);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4887 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4888
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4889 /* Is the given date in the accepted range? */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4890 _isInRange: function(inst, date) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4891 var yearSplit, currentYear,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4892 minDate = this._getMinMaxDate(inst, "min"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4893 maxDate = this._getMinMaxDate(inst, "max"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4894 minYear = null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4895 maxYear = null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4896 years = this._get(inst, "yearRange");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4897 if (years){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4898 yearSplit = years.split(":");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4899 currentYear = new Date().getFullYear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4900 minYear = parseInt(yearSplit[0], 10);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4901 maxYear = parseInt(yearSplit[1], 10);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4902 if ( yearSplit[0].match(/[+\-].*/) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4903 minYear += currentYear;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4904 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4905 if ( yearSplit[1].match(/[+\-].*/) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4906 maxYear += currentYear;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4907 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4908 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4909
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4910 return ((!minDate || date.getTime() >= minDate.getTime()) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4911 (!maxDate || date.getTime() <= maxDate.getTime()) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4912 (!minYear || date.getFullYear() >= minYear) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4913 (!maxYear || date.getFullYear() <= maxYear));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4914 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4915
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4916 /* Provide the configuration settings for formatting/parsing. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4917 _getFormatConfig: function(inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4918 var shortYearCutoff = this._get(inst, "shortYearCutoff");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4919 shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4920 new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4921 return {shortYearCutoff: shortYearCutoff,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4922 dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4923 monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4924 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4925
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4926 /* Format the given date for display. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4927 _formatDate: function(inst, day, month, year) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4928 if (!day) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4929 inst.currentDay = inst.selectedDay;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4930 inst.currentMonth = inst.selectedMonth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4931 inst.currentYear = inst.selectedYear;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4932 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4933 var date = (day ? (typeof day === "object" ? day :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4934 this._daylightSavingAdjust(new Date(year, month, day))) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4935 this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4936 return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4937 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4938 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4939
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4940 /*
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4941 * Bind hover events for datepicker elements.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4942 * Done via delegate so the binding only occurs once in the lifetime of the parent div.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4943 * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4944 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4945 function bindHover(dpDiv) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4946 var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4947 return dpDiv.delegate(selector, "mouseout", function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4948 $(this).removeClass("ui-state-hover");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4949 if (this.className.indexOf("ui-datepicker-prev") !== -1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4950 $(this).removeClass("ui-datepicker-prev-hover");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4951 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4952 if (this.className.indexOf("ui-datepicker-next") !== -1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4953 $(this).removeClass("ui-datepicker-next-hover");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4954 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4955 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4956 .delegate(selector, "mouseover", function(){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4957 if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4958 $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4959 $(this).addClass("ui-state-hover");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4960 if (this.className.indexOf("ui-datepicker-prev") !== -1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4961 $(this).addClass("ui-datepicker-prev-hover");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4962 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4963 if (this.className.indexOf("ui-datepicker-next") !== -1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4964 $(this).addClass("ui-datepicker-next-hover");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4965 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4966 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4967 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4968 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4969
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4970 /* jQuery extend now ignores nulls! */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4971 function extendRemove(target, props) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4972 $.extend(target, props);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4973 for (var name in props) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4974 if (props[name] == null) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4975 target[name] = props[name];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4976 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4977 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4978 return target;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4979 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4980
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4981 /* Invoke the datepicker functionality.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4982 @param options string - a command, optionally followed by additional parameters or
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4983 Object - settings for attaching new datepicker functionality
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4984 @return jQuery object */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4985 $.fn.datepicker = function(options){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4986
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4987 /* Verify an empty collection wasn't passed - Fixes #6976 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4988 if ( !this.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4989 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4990 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4991
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4992 /* Initialise the date picker. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4993 if (!$.datepicker.initialized) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4994 $(document).mousedown($.datepicker._checkExternalClick);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4995 $.datepicker.initialized = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4996 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4997
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4998 /* Append datepicker main container to body if not exist. */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
4999 if ($("#"+$.datepicker._mainDivId).length === 0) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5000 $("body").append($.datepicker.dpDiv);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5001 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5002
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5003 var otherArgs = Array.prototype.slice.call(arguments, 1);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5004 if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5005 return $.datepicker["_" + options + "Datepicker"].
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5006 apply($.datepicker, [this[0]].concat(otherArgs));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5007 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5008 if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5009 return $.datepicker["_" + options + "Datepicker"].
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5010 apply($.datepicker, [this[0]].concat(otherArgs));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5011 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5012 return this.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5013 typeof options === "string" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5014 $.datepicker["_" + options + "Datepicker"].
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5015 apply($.datepicker, [this].concat(otherArgs)) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5016 $.datepicker._attachDatepicker(this, options);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5017 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5018 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5019
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5020 $.datepicker = new Datepicker(); // singleton instance
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5021 $.datepicker.initialized = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5022 $.datepicker.uuid = new Date().getTime();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5023 $.datepicker.version = "1.10.4";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5024
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5025 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5026 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5027
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5028 var sizeRelatedOptions = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5029 buttons: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5030 height: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5031 maxHeight: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5032 maxWidth: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5033 minHeight: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5034 minWidth: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5035 width: true
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5036 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5037 resizableRelatedOptions = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5038 maxHeight: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5039 maxWidth: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5040 minHeight: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5041 minWidth: true
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5042 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5043
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5044 $.widget( "ui.dialog", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5045 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5046 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5047 appendTo: "body",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5048 autoOpen: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5049 buttons: [],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5050 closeOnEscape: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5051 closeText: "close",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5052 dialogClass: "",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5053 draggable: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5054 hide: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5055 height: "auto",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5056 maxHeight: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5057 maxWidth: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5058 minHeight: 150,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5059 minWidth: 150,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5060 modal: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5061 position: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5062 my: "center",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5063 at: "center",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5064 of: window,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5065 collision: "fit",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5066 // Ensure the titlebar is always visible
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5067 using: function( pos ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5068 var topOffset = $( this ).css( pos ).offset().top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5069 if ( topOffset < 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5070 $( this ).css( "top", pos.top - topOffset );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5071 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5072 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5073 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5074 resizable: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5075 show: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5076 title: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5077 width: 300,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5078
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5079 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5080 beforeClose: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5081 close: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5082 drag: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5083 dragStart: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5084 dragStop: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5085 focus: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5086 open: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5087 resize: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5088 resizeStart: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5089 resizeStop: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5090 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5091
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5092 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5093 this.originalCss = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5094 display: this.element[0].style.display,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5095 width: this.element[0].style.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5096 minHeight: this.element[0].style.minHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5097 maxHeight: this.element[0].style.maxHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5098 height: this.element[0].style.height
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5099 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5100 this.originalPosition = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5101 parent: this.element.parent(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5102 index: this.element.parent().children().index( this.element )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5103 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5104 this.originalTitle = this.element.attr("title");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5105 this.options.title = this.options.title || this.originalTitle;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5106
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5107 this._createWrapper();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5108
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5109 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5110 .show()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5111 .removeAttr("title")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5112 .addClass("ui-dialog-content ui-widget-content")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5113 .appendTo( this.uiDialog );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5114
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5115 this._createTitlebar();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5116 this._createButtonPane();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5117
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5118 if ( this.options.draggable && $.fn.draggable ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5119 this._makeDraggable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5120 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5121 if ( this.options.resizable && $.fn.resizable ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5122 this._makeResizable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5123 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5124
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5125 this._isOpen = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5126 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5127
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5128 _init: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5129 if ( this.options.autoOpen ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5130 this.open();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5131 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5132 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5133
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5134 _appendTo: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5135 var element = this.options.appendTo;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5136 if ( element && (element.jquery || element.nodeType) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5137 return $( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5138 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5139 return this.document.find( element || "body" ).eq( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5140 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5141
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5142 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5143 var next,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5144 originalPosition = this.originalPosition;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5145
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5146 this._destroyOverlay();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5147
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5148 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5149 .removeUniqueId()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5150 .removeClass("ui-dialog-content ui-widget-content")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5151 .css( this.originalCss )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5152 // Without detaching first, the following becomes really slow
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5153 .detach();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5154
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5155 this.uiDialog.stop( true, true ).remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5156
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5157 if ( this.originalTitle ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5158 this.element.attr( "title", this.originalTitle );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5159 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5160
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5161 next = originalPosition.parent.children().eq( originalPosition.index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5162 // Don't try to place the dialog next to itself (#8613)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5163 if ( next.length && next[0] !== this.element[0] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5164 next.before( this.element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5165 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5166 originalPosition.parent.append( this.element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5167 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5168 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5169
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5170 widget: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5171 return this.uiDialog;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5172 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5173
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5174 disable: $.noop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5175 enable: $.noop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5176
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5177 close: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5178 var activeElement,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5179 that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5180
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5181 if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5182 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5183 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5184
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5185 this._isOpen = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5186 this._destroyOverlay();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5187
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5188 if ( !this.opener.filter(":focusable").focus().length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5189
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5190 // support: IE9
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5191 // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5192 try {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5193 activeElement = this.document[ 0 ].activeElement;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5194
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5195 // Support: IE9, IE10
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5196 // If the <body> is blurred, IE will switch windows, see #4520
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5197 if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5198
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5199 // Hiding a focused element doesn't trigger blur in WebKit
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5200 // so in case we have nothing to focus on, explicitly blur the active element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5201 // https://bugs.webkit.org/show_bug.cgi?id=47182
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5202 $( activeElement ).blur();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5203 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5204 } catch ( error ) {}
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5205 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5206
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5207 this._hide( this.uiDialog, this.options.hide, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5208 that._trigger( "close", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5209 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5210 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5211
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5212 isOpen: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5213 return this._isOpen;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5214 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5215
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5216 moveToTop: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5217 this._moveToTop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5218 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5219
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5220 _moveToTop: function( event, silent ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5221 var moved = !!this.uiDialog.nextAll(":visible").insertBefore( this.uiDialog ).length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5222 if ( moved && !silent ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5223 this._trigger( "focus", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5224 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5225 return moved;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5226 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5227
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5228 open: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5229 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5230 if ( this._isOpen ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5231 if ( this._moveToTop() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5232 this._focusTabbable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5233 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5234 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5235 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5236
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5237 this._isOpen = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5238 this.opener = $( this.document[0].activeElement );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5239
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5240 this._size();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5241 this._position();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5242 this._createOverlay();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5243 this._moveToTop( null, true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5244 this._show( this.uiDialog, this.options.show, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5245 that._focusTabbable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5246 that._trigger("focus");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5247 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5248
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5249 this._trigger("open");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5250 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5251
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5252 _focusTabbable: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5253 // Set focus to the first match:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5254 // 1. First element inside the dialog matching [autofocus]
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5255 // 2. Tabbable element inside the content element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5256 // 3. Tabbable element inside the buttonpane
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5257 // 4. The close button
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5258 // 5. The dialog itself
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5259 var hasFocus = this.element.find("[autofocus]");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5260 if ( !hasFocus.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5261 hasFocus = this.element.find(":tabbable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5262 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5263 if ( !hasFocus.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5264 hasFocus = this.uiDialogButtonPane.find(":tabbable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5265 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5266 if ( !hasFocus.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5267 hasFocus = this.uiDialogTitlebarClose.filter(":tabbable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5268 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5269 if ( !hasFocus.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5270 hasFocus = this.uiDialog;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5271 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5272 hasFocus.eq( 0 ).focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5273 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5274
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5275 _keepFocus: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5276 function checkFocus() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5277 var activeElement = this.document[0].activeElement,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5278 isActive = this.uiDialog[0] === activeElement ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5279 $.contains( this.uiDialog[0], activeElement );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5280 if ( !isActive ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5281 this._focusTabbable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5282 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5283 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5284 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5285 checkFocus.call( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5286 // support: IE
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5287 // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5288 // so we check again later
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5289 this._delay( checkFocus );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5290 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5291
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5292 _createWrapper: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5293 this.uiDialog = $("<div>")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5294 .addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5295 this.options.dialogClass )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5296 .hide()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5297 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5298 // Setting tabIndex makes the div focusable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5299 tabIndex: -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5300 role: "dialog"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5301 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5302 .appendTo( this._appendTo() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5303
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5304 this._on( this.uiDialog, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5305 keydown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5306 if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5307 event.keyCode === $.ui.keyCode.ESCAPE ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5308 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5309 this.close( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5310 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5311 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5312
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5313 // prevent tabbing out of dialogs
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5314 if ( event.keyCode !== $.ui.keyCode.TAB ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5315 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5316 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5317 var tabbables = this.uiDialog.find(":tabbable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5318 first = tabbables.filter(":first"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5319 last = tabbables.filter(":last");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5320
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5321 if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5322 first.focus( 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5323 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5324 } else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5325 last.focus( 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5326 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5327 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5328 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5329 mousedown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5330 if ( this._moveToTop( event ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5331 this._focusTabbable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5332 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5333 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5334 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5335
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5336 // We assume that any existing aria-describedby attribute means
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5337 // that the dialog content is marked up properly
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5338 // otherwise we brute force the content as the description
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5339 if ( !this.element.find("[aria-describedby]").length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5340 this.uiDialog.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5341 "aria-describedby": this.element.uniqueId().attr("id")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5342 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5343 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5344 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5345
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5346 _createTitlebar: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5347 var uiDialogTitle;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5348
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5349 this.uiDialogTitlebar = $("<div>")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5350 .addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5351 .prependTo( this.uiDialog );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5352 this._on( this.uiDialogTitlebar, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5353 mousedown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5354 // Don't prevent click on close button (#8838)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5355 // Focusing a dialog that is partially scrolled out of view
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5356 // causes the browser to scroll it into view, preventing the click event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5357 if ( !$( event.target ).closest(".ui-dialog-titlebar-close") ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5358 // Dialog isn't getting focus when dragging (#8063)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5359 this.uiDialog.focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5360 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5361 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5362 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5363
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5364 // support: IE
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5365 // Use type="button" to prevent enter keypresses in textboxes from closing the
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5366 // dialog in IE (#9312)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5367 this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5368 .button({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5369 label: this.options.closeText,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5370 icons: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5371 primary: "ui-icon-closethick"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5372 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5373 text: false
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5374 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5375 .addClass("ui-dialog-titlebar-close")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5376 .appendTo( this.uiDialogTitlebar );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5377 this._on( this.uiDialogTitlebarClose, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5378 click: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5379 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5380 this.close( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5381 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5382 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5383
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5384 uiDialogTitle = $("<span>")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5385 .uniqueId()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5386 .addClass("ui-dialog-title")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5387 .prependTo( this.uiDialogTitlebar );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5388 this._title( uiDialogTitle );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5389
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5390 this.uiDialog.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5391 "aria-labelledby": uiDialogTitle.attr("id")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5392 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5393 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5394
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5395 _title: function( title ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5396 if ( !this.options.title ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5397 title.html("&#160;");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5398 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5399 title.text( this.options.title );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5400 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5401
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5402 _createButtonPane: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5403 this.uiDialogButtonPane = $("<div>")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5404 .addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5405
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5406 this.uiButtonSet = $("<div>")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5407 .addClass("ui-dialog-buttonset")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5408 .appendTo( this.uiDialogButtonPane );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5409
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5410 this._createButtons();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5411 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5412
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5413 _createButtons: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5414 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5415 buttons = this.options.buttons;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5416
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5417 // if we already have a button pane, remove it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5418 this.uiDialogButtonPane.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5419 this.uiButtonSet.empty();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5420
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5421 if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5422 this.uiDialog.removeClass("ui-dialog-buttons");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5423 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5424 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5425
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5426 $.each( buttons, function( name, props ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5427 var click, buttonOptions;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5428 props = $.isFunction( props ) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5429 { click: props, text: name } :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5430 props;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5431 // Default to a non-submitting button
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5432 props = $.extend( { type: "button" }, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5433 // Change the context for the click callback to be the main element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5434 click = props.click;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5435 props.click = function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5436 click.apply( that.element[0], arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5437 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5438 buttonOptions = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5439 icons: props.icons,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5440 text: props.showText
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5441 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5442 delete props.icons;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5443 delete props.showText;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5444 $( "<button></button>", props )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5445 .button( buttonOptions )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5446 .appendTo( that.uiButtonSet );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5447 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5448 this.uiDialog.addClass("ui-dialog-buttons");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5449 this.uiDialogButtonPane.appendTo( this.uiDialog );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5450 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5451
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5452 _makeDraggable: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5453 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5454 options = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5455
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5456 function filteredUi( ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5457 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5458 position: ui.position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5459 offset: ui.offset
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5460 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5461 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5462
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5463 this.uiDialog.draggable({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5464 cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5465 handle: ".ui-dialog-titlebar",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5466 containment: "document",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5467 start: function( event, ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5468 $( this ).addClass("ui-dialog-dragging");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5469 that._blockFrames();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5470 that._trigger( "dragStart", event, filteredUi( ui ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5471 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5472 drag: function( event, ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5473 that._trigger( "drag", event, filteredUi( ui ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5474 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5475 stop: function( event, ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5476 options.position = [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5477 ui.position.left - that.document.scrollLeft(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5478 ui.position.top - that.document.scrollTop()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5479 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5480 $( this ).removeClass("ui-dialog-dragging");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5481 that._unblockFrames();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5482 that._trigger( "dragStop", event, filteredUi( ui ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5483 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5484 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5485 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5486
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5487 _makeResizable: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5488 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5489 options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5490 handles = options.resizable,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5491 // .ui-resizable has position: relative defined in the stylesheet
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5492 // but dialogs have to use absolute or fixed positioning
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5493 position = this.uiDialog.css("position"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5494 resizeHandles = typeof handles === "string" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5495 handles :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5496 "n,e,s,w,se,sw,ne,nw";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5497
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5498 function filteredUi( ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5499 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5500 originalPosition: ui.originalPosition,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5501 originalSize: ui.originalSize,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5502 position: ui.position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5503 size: ui.size
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5504 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5505 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5506
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5507 this.uiDialog.resizable({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5508 cancel: ".ui-dialog-content",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5509 containment: "document",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5510 alsoResize: this.element,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5511 maxWidth: options.maxWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5512 maxHeight: options.maxHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5513 minWidth: options.minWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5514 minHeight: this._minHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5515 handles: resizeHandles,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5516 start: function( event, ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5517 $( this ).addClass("ui-dialog-resizing");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5518 that._blockFrames();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5519 that._trigger( "resizeStart", event, filteredUi( ui ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5520 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5521 resize: function( event, ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5522 that._trigger( "resize", event, filteredUi( ui ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5523 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5524 stop: function( event, ui ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5525 options.height = $( this ).height();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5526 options.width = $( this ).width();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5527 $( this ).removeClass("ui-dialog-resizing");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5528 that._unblockFrames();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5529 that._trigger( "resizeStop", event, filteredUi( ui ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5530 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5531 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5532 .css( "position", position );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5533 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5534
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5535 _minHeight: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5536 var options = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5537
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5538 return options.height === "auto" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5539 options.minHeight :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5540 Math.min( options.minHeight, options.height );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5541 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5542
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5543 _position: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5544 // Need to show the dialog to get the actual offset in the position plugin
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5545 var isVisible = this.uiDialog.is(":visible");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5546 if ( !isVisible ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5547 this.uiDialog.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5548 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5549 this.uiDialog.position( this.options.position );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5550 if ( !isVisible ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5551 this.uiDialog.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5552 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5553 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5554
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5555 _setOptions: function( options ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5556 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5557 resize = false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5558 resizableOptions = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5559
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5560 $.each( options, function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5561 that._setOption( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5562
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5563 if ( key in sizeRelatedOptions ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5564 resize = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5565 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5566 if ( key in resizableRelatedOptions ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5567 resizableOptions[ key ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5568 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5569 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5570
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5571 if ( resize ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5572 this._size();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5573 this._position();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5574 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5575 if ( this.uiDialog.is(":data(ui-resizable)") ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5576 this.uiDialog.resizable( "option", resizableOptions );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5577 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5578 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5579
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5580 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5581 var isDraggable, isResizable,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5582 uiDialog = this.uiDialog;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5583
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5584 if ( key === "dialogClass" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5585 uiDialog
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5586 .removeClass( this.options.dialogClass )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5587 .addClass( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5588 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5589
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5590 if ( key === "disabled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5591 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5592 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5593
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5594 this._super( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5595
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5596 if ( key === "appendTo" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5597 this.uiDialog.appendTo( this._appendTo() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5598 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5599
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5600 if ( key === "buttons" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5601 this._createButtons();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5602 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5603
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5604 if ( key === "closeText" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5605 this.uiDialogTitlebarClose.button({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5606 // Ensure that we always pass a string
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5607 label: "" + value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5608 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5609 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5610
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5611 if ( key === "draggable" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5612 isDraggable = uiDialog.is(":data(ui-draggable)");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5613 if ( isDraggable && !value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5614 uiDialog.draggable("destroy");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5615 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5616
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5617 if ( !isDraggable && value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5618 this._makeDraggable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5619 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5620 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5621
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5622 if ( key === "position" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5623 this._position();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5624 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5625
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5626 if ( key === "resizable" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5627 // currently resizable, becoming non-resizable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5628 isResizable = uiDialog.is(":data(ui-resizable)");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5629 if ( isResizable && !value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5630 uiDialog.resizable("destroy");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5631 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5632
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5633 // currently resizable, changing handles
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5634 if ( isResizable && typeof value === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5635 uiDialog.resizable( "option", "handles", value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5636 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5637
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5638 // currently non-resizable, becoming resizable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5639 if ( !isResizable && value !== false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5640 this._makeResizable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5641 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5642 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5643
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5644 if ( key === "title" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5645 this._title( this.uiDialogTitlebar.find(".ui-dialog-title") );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5646 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5647 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5648
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5649 _size: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5650 // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5651 // divs will both have width and height set, so we need to reset them
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5652 var nonContentHeight, minContentHeight, maxContentHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5653 options = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5654
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5655 // Reset content sizing
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5656 this.element.show().css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5657 width: "auto",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5658 minHeight: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5659 maxHeight: "none",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5660 height: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5661 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5662
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5663 if ( options.minWidth > options.width ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5664 options.width = options.minWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5665 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5666
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5667 // reset wrapper sizing
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5668 // determine the height of all the non-content elements
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5669 nonContentHeight = this.uiDialog.css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5670 height: "auto",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5671 width: options.width
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5672 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5673 .outerHeight();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5674 minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5675 maxContentHeight = typeof options.maxHeight === "number" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5676 Math.max( 0, options.maxHeight - nonContentHeight ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5677 "none";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5678
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5679 if ( options.height === "auto" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5680 this.element.css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5681 minHeight: minContentHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5682 maxHeight: maxContentHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5683 height: "auto"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5684 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5685 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5686 this.element.height( Math.max( 0, options.height - nonContentHeight ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5687 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5688
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5689 if (this.uiDialog.is(":data(ui-resizable)") ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5690 this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5691 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5692 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5693
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5694 _blockFrames: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5695 this.iframeBlocks = this.document.find( "iframe" ).map(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5696 var iframe = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5697
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5698 return $( "<div>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5699 .css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5700 position: "absolute",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5701 width: iframe.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5702 height: iframe.outerHeight()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5703 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5704 .appendTo( iframe.parent() )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5705 .offset( iframe.offset() )[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5706 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5707 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5708
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5709 _unblockFrames: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5710 if ( this.iframeBlocks ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5711 this.iframeBlocks.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5712 delete this.iframeBlocks;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5713 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5714 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5715
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5716 _allowInteraction: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5717 if ( $( event.target ).closest(".ui-dialog").length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5718 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5719 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5720
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5721 // TODO: Remove hack when datepicker implements
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5722 // the .ui-front logic (#8989)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5723 return !!$( event.target ).closest(".ui-datepicker").length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5724 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5725
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5726 _createOverlay: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5727 if ( !this.options.modal ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5728 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5729 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5730
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5731 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5732 widgetFullName = this.widgetFullName;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5733 if ( !$.ui.dialog.overlayInstances ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5734 // Prevent use of anchors and inputs.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5735 // We use a delay in case the overlay is created from an
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5736 // event that we're going to be cancelling. (#2804)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5737 this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5738 // Handle .dialog().dialog("close") (#4065)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5739 if ( $.ui.dialog.overlayInstances ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5740 this.document.bind( "focusin.dialog", function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5741 if ( !that._allowInteraction( event ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5742 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5743 $(".ui-dialog:visible:last .ui-dialog-content")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5744 .data( widgetFullName )._focusTabbable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5745 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5746 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5747 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5748 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5749 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5750
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5751 this.overlay = $("<div>")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5752 .addClass("ui-widget-overlay ui-front")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5753 .appendTo( this._appendTo() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5754 this._on( this.overlay, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5755 mousedown: "_keepFocus"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5756 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5757 $.ui.dialog.overlayInstances++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5758 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5759
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5760 _destroyOverlay: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5761 if ( !this.options.modal ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5762 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5763 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5764
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5765 if ( this.overlay ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5766 $.ui.dialog.overlayInstances--;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5767
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5768 if ( !$.ui.dialog.overlayInstances ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5769 this.document.unbind( "focusin.dialog" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5770 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5771 this.overlay.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5772 this.overlay = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5773 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5774 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5775 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5776
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5777 $.ui.dialog.overlayInstances = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5778
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5779 // DEPRECATED
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5780 if ( $.uiBackCompat !== false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5781 // position option with array notation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5782 // just override with old implementation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5783 $.widget( "ui.dialog", $.ui.dialog, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5784 _position: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5785 var position = this.options.position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5786 myAt = [],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5787 offset = [ 0, 0 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5788 isVisible;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5789
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5790 if ( position ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5791 if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5792 myAt = position.split ? position.split(" ") : [ position[0], position[1] ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5793 if ( myAt.length === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5794 myAt[1] = myAt[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5795 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5796
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5797 $.each( [ "left", "top" ], function( i, offsetPosition ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5798 if ( +myAt[ i ] === myAt[ i ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5799 offset[ i ] = myAt[ i ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5800 myAt[ i ] = offsetPosition;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5801 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5802 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5803
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5804 position = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5805 my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5806 myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5807 at: myAt.join(" ")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5808 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5809 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5810
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5811 position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5812 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5813 position = $.ui.dialog.prototype.options.position;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5814 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5815
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5816 // need to show the dialog to get the actual offset in the position plugin
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5817 isVisible = this.uiDialog.is(":visible");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5818 if ( !isVisible ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5819 this.uiDialog.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5820 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5821 this.uiDialog.position( position );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5822 if ( !isVisible ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5823 this.uiDialog.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5824 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5825 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5826 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5827 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5828
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5829 }( jQuery ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5830 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5831
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5832 $.widget("ui.draggable", $.ui.mouse, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5833 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5834 widgetEventPrefix: "drag",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5835 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5836 addClasses: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5837 appendTo: "parent",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5838 axis: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5839 connectToSortable: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5840 containment: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5841 cursor: "auto",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5842 cursorAt: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5843 grid: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5844 handle: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5845 helper: "original",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5846 iframeFix: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5847 opacity: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5848 refreshPositions: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5849 revert: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5850 revertDuration: 500,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5851 scope: "default",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5852 scroll: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5853 scrollSensitivity: 20,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5854 scrollSpeed: 20,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5855 snap: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5856 snapMode: "both",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5857 snapTolerance: 20,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5858 stack: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5859 zIndex: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5860
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5861 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5862 drag: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5863 start: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5864 stop: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5865 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5866 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5867
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5868 if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5869 this.element[0].style.position = "relative";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5870 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5871 if (this.options.addClasses){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5872 this.element.addClass("ui-draggable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5873 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5874 if (this.options.disabled){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5875 this.element.addClass("ui-draggable-disabled");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5876 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5877
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5878 this._mouseInit();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5879
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5880 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5881
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5882 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5883 this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5884 this._mouseDestroy();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5885 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5886
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5887 _mouseCapture: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5888
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5889 var o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5890
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5891 // among others, prevent a drag on a resizable-handle
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5892 if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5893 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5894 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5895
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5896 //Quit if we're not on a valid handle
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5897 this.handle = this._getHandle(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5898 if (!this.handle) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5899 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5900 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5901
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5902 $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5903 $("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5904 .css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5905 width: this.offsetWidth+"px", height: this.offsetHeight+"px",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5906 position: "absolute", opacity: "0.001", zIndex: 1000
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5907 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5908 .css($(this).offset())
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5909 .appendTo("body");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5910 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5911
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5912 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5913
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5914 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5915
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5916 _mouseStart: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5917
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5918 var o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5919
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5920 //Create and append the visible helper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5921 this.helper = this._createHelper(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5922
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5923 this.helper.addClass("ui-draggable-dragging");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5924
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5925 //Cache the helper size
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5926 this._cacheHelperProportions();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5927
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5928 //If ddmanager is used for droppables, set the global draggable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5929 if($.ui.ddmanager) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5930 $.ui.ddmanager.current = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5931 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5932
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5933 /*
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5934 * - Position generation -
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5935 * This block generates everything position related - it's the core of draggables.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5936 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5937
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5938 //Cache the margins of the original element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5939 this._cacheMargins();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5940
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5941 //Store the helper's css position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5942 this.cssPosition = this.helper.css( "position" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5943 this.scrollParent = this.helper.scrollParent();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5944 this.offsetParent = this.helper.offsetParent();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5945 this.offsetParentCssPosition = this.offsetParent.css( "position" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5946
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5947 //The element's absolute position on the page minus margins
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5948 this.offset = this.positionAbs = this.element.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5949 this.offset = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5950 top: this.offset.top - this.margins.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5951 left: this.offset.left - this.margins.left
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5952 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5953
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5954 //Reset scroll cache
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5955 this.offset.scroll = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5956
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5957 $.extend(this.offset, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5958 click: { //Where the click happened, relative to the element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5959 left: event.pageX - this.offset.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5960 top: event.pageY - this.offset.top
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5961 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5962 parent: this._getParentOffset(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5963 relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5964 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5965
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5966 //Generate the original position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5967 this.originalPosition = this.position = this._generatePosition(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5968 this.originalPageX = event.pageX;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5969 this.originalPageY = event.pageY;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5970
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5971 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5972 (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5973
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5974 //Set a containment if given in the options
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5975 this._setContainment();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5976
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5977 //Trigger event + callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5978 if(this._trigger("start", event) === false) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5979 this._clear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5980 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5981 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5982
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5983 //Recache the helper size
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5984 this._cacheHelperProportions();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5985
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5986 //Prepare the droppable offsets
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5987 if ($.ui.ddmanager && !o.dropBehaviour) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5988 $.ui.ddmanager.prepareOffsets(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5989 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5990
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5991
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5992 this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5993
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5994 //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5995 if ( $.ui.ddmanager ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5996 $.ui.ddmanager.dragStart(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5997 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5998
3c160414da2e initial upload
shiltemann
parents:
diff changeset
5999 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6000 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6001
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6002 _mouseDrag: function(event, noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6003 // reset any necessary cached properties (see #5009)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6004 if ( this.offsetParentCssPosition === "fixed" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6005 this.offset.parent = this._getParentOffset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6006 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6007
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6008 //Compute the helpers position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6009 this.position = this._generatePosition(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6010 this.positionAbs = this._convertPositionTo("absolute");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6011
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6012 //Call plugins and callbacks and use the resulting position if something is returned
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6013 if (!noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6014 var ui = this._uiHash();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6015 if(this._trigger("drag", event, ui) === false) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6016 this._mouseUp({});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6017 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6018 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6019 this.position = ui.position;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6020 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6021
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6022 if(!this.options.axis || this.options.axis !== "y") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6023 this.helper[0].style.left = this.position.left+"px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6024 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6025 if(!this.options.axis || this.options.axis !== "x") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6026 this.helper[0].style.top = this.position.top+"px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6027 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6028 if($.ui.ddmanager) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6029 $.ui.ddmanager.drag(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6030 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6031
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6032 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6033 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6034
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6035 _mouseStop: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6036
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6037 //If we are using droppables, inform the manager about the drop
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6038 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6039 dropped = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6040 if ($.ui.ddmanager && !this.options.dropBehaviour) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6041 dropped = $.ui.ddmanager.drop(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6042 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6043
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6044 //if a drop comes from outside (a sortable)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6045 if(this.dropped) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6046 dropped = this.dropped;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6047 this.dropped = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6048 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6049
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6050 //if the original element is no longer in the DOM don't bother to continue (see #8269)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6051 if ( this.options.helper === "original" && !$.contains( this.element[ 0 ].ownerDocument, this.element[ 0 ] ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6052 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6053 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6054
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6055 if((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6056 $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6057 if(that._trigger("stop", event) !== false) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6058 that._clear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6059 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6060 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6061 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6062 if(this._trigger("stop", event) !== false) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6063 this._clear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6064 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6065 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6066
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6067 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6068 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6069
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6070 _mouseUp: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6071 //Remove frame helpers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6072 $("div.ui-draggable-iframeFix").each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6073 this.parentNode.removeChild(this);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6074 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6075
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6076 //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6077 if( $.ui.ddmanager ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6078 $.ui.ddmanager.dragStop(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6079 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6080
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6081 return $.ui.mouse.prototype._mouseUp.call(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6082 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6083
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6084 cancel: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6085
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6086 if(this.helper.is(".ui-draggable-dragging")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6087 this._mouseUp({});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6088 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6089 this._clear();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6090 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6091
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6092 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6093
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6094 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6095
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6096 _getHandle: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6097 return this.options.handle ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6098 !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6099 true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6100 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6101
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6102 _createHelper: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6103
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6104 var o = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6105 helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6106
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6107 if(!helper.parents("body").length) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6108 helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6109 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6110
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6111 if(helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6112 helper.css("position", "absolute");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6113 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6114
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6115 return helper;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6116
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6117 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6118
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6119 _adjustOffsetFromHelper: function(obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6120 if (typeof obj === "string") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6121 obj = obj.split(" ");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6122 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6123 if ($.isArray(obj)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6124 obj = {left: +obj[0], top: +obj[1] || 0};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6125 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6126 if ("left" in obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6127 this.offset.click.left = obj.left + this.margins.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6128 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6129 if ("right" in obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6130 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6131 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6132 if ("top" in obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6133 this.offset.click.top = obj.top + this.margins.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6134 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6135 if ("bottom" in obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6136 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6137 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6138 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6139
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6140 _getParentOffset: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6141
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6142 //Get the offsetParent and cache its position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6143 var po = this.offsetParent.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6144
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6145 // This is a special case where we need to modify a offset calculated on start, since the following happened:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6146 // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6147 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6148 // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6149 if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6150 po.left += this.scrollParent.scrollLeft();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6151 po.top += this.scrollParent.scrollTop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6152 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6153
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6154 //This needs to be actually done for all browsers, since pageX/pageY includes this information
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6155 //Ugly IE fix
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6156 if((this.offsetParent[0] === document.body) ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6157 (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6158 po = { top: 0, left: 0 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6159 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6160
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6161 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6162 top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6163 left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6164 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6165
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6166 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6167
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6168 _getRelativeOffset: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6169
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6170 if(this.cssPosition === "relative") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6171 var p = this.element.position();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6172 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6173 top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6174 left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6175 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6176 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6177 return { top: 0, left: 0 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6178 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6179
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6180 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6181
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6182 _cacheMargins: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6183 this.margins = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6184 left: (parseInt(this.element.css("marginLeft"),10) || 0),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6185 top: (parseInt(this.element.css("marginTop"),10) || 0),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6186 right: (parseInt(this.element.css("marginRight"),10) || 0),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6187 bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6188 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6189 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6190
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6191 _cacheHelperProportions: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6192 this.helperProportions = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6193 width: this.helper.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6194 height: this.helper.outerHeight()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6195 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6196 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6197
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6198 _setContainment: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6199
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6200 var over, c, ce,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6201 o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6202
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6203 if ( !o.containment ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6204 this.containment = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6205 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6206 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6207
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6208 if ( o.containment === "window" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6209 this.containment = [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6210 $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6211 $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6212 $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6213 $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6214 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6215 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6216 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6217
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6218 if ( o.containment === "document") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6219 this.containment = [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6220 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6221 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6222 $( document ).width() - this.helperProportions.width - this.margins.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6223 ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6224 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6225 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6226 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6227
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6228 if ( o.containment.constructor === Array ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6229 this.containment = o.containment;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6230 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6231 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6232
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6233 if ( o.containment === "parent" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6234 o.containment = this.helper[ 0 ].parentNode;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6235 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6236
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6237 c = $( o.containment );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6238 ce = c[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6239
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6240 if( !ce ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6241 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6242 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6243
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6244 over = c.css( "overflow" ) !== "hidden";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6245
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6246 this.containment = [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6247 ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6248 ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ) ,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6249 ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - this.helperProportions.width - this.margins.left - this.margins.right,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6250 ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - this.helperProportions.height - this.margins.top - this.margins.bottom
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6251 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6252 this.relative_container = c;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6253 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6254
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6255 _convertPositionTo: function(d, pos) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6256
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6257 if(!pos) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6258 pos = this.position;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6259 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6260
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6261 var mod = d === "absolute" ? 1 : -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6262 scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6263
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6264 //Cache the scroll
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6265 if (!this.offset.scroll) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6266 this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6267 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6268
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6269 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6270 top: (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6271 pos.top + // The absolute mouse position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6272 this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6273 this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6274 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) * mod )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6275 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6276 left: (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6277 pos.left + // The absolute mouse position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6278 this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6279 this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6280 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) * mod )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6281 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6282 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6283
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6284 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6285
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6286 _generatePosition: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6287
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6288 var containment, co, top, left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6289 o = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6290 scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6291 pageX = event.pageX,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6292 pageY = event.pageY;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6293
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6294 //Cache the scroll
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6295 if (!this.offset.scroll) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6296 this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6297 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6298
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6299 /*
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6300 * - Position constraining -
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6301 * Constrain the position to a mix of grid, containment.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6302 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6303
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6304 // If we are not dragging yet, we won't check for options
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6305 if ( this.originalPosition ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6306 if ( this.containment ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6307 if ( this.relative_container ){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6308 co = this.relative_container.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6309 containment = [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6310 this.containment[ 0 ] + co.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6311 this.containment[ 1 ] + co.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6312 this.containment[ 2 ] + co.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6313 this.containment[ 3 ] + co.top
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6314 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6315 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6316 else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6317 containment = this.containment;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6318 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6319
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6320 if(event.pageX - this.offset.click.left < containment[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6321 pageX = containment[0] + this.offset.click.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6322 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6323 if(event.pageY - this.offset.click.top < containment[1]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6324 pageY = containment[1] + this.offset.click.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6325 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6326 if(event.pageX - this.offset.click.left > containment[2]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6327 pageX = containment[2] + this.offset.click.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6328 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6329 if(event.pageY - this.offset.click.top > containment[3]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6330 pageY = containment[3] + this.offset.click.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6331 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6332 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6333
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6334 if(o.grid) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6335 //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6336 top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6337 pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6338
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6339 left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6340 pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6341 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6342
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6343 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6344
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6345 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6346 top: (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6347 pageY - // The absolute mouse position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6348 this.offset.click.top - // Click offset (relative to the element)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6349 this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6350 this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6351 ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6352 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6353 left: (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6354 pageX - // The absolute mouse position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6355 this.offset.click.left - // Click offset (relative to the element)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6356 this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6357 this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6358 ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6359 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6360 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6361
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6362 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6363
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6364 _clear: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6365 this.helper.removeClass("ui-draggable-dragging");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6366 if(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6367 this.helper.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6368 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6369 this.helper = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6370 this.cancelHelperRemoval = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6371 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6372
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6373 // From now on bulk stuff - mainly helpers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6374
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6375 _trigger: function(type, event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6376 ui = ui || this._uiHash();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6377 $.ui.plugin.call(this, type, [event, ui]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6378 //The absolute position has to be recalculated after plugins
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6379 if(type === "drag") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6380 this.positionAbs = this._convertPositionTo("absolute");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6381 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6382 return $.Widget.prototype._trigger.call(this, type, event, ui);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6383 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6384
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6385 plugins: {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6386
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6387 _uiHash: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6388 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6389 helper: this.helper,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6390 position: this.position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6391 originalPosition: this.originalPosition,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6392 offset: this.positionAbs
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6393 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6394 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6395
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6396 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6397
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6398 $.ui.plugin.add("draggable", "connectToSortable", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6399 start: function(event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6400
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6401 var inst = $(this).data("ui-draggable"), o = inst.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6402 uiSortable = $.extend({}, ui, { item: inst.element });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6403 inst.sortables = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6404 $(o.connectToSortable).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6405 var sortable = $.data(this, "ui-sortable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6406 if (sortable && !sortable.options.disabled) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6407 inst.sortables.push({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6408 instance: sortable,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6409 shouldRevert: sortable.options.revert
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6410 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6411 sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6412 sortable._trigger("activate", event, uiSortable);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6413 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6414 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6415
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6416 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6417 stop: function(event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6418
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6419 //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6420 var inst = $(this).data("ui-draggable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6421 uiSortable = $.extend({}, ui, { item: inst.element });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6422
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6423 $.each(inst.sortables, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6424 if(this.instance.isOver) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6425
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6426 this.instance.isOver = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6427
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6428 inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6429 this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6430
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6431 //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: "valid/invalid"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6432 if(this.shouldRevert) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6433 this.instance.options.revert = this.shouldRevert;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6434 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6435
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6436 //Trigger the stop of the sortable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6437 this.instance._mouseStop(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6438
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6439 this.instance.options.helper = this.instance.options._helper;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6440
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6441 //If the helper has been the original item, restore properties in the sortable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6442 if(inst.options.helper === "original") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6443 this.instance.currentItem.css({ top: "auto", left: "auto" });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6444 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6445
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6446 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6447 this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6448 this.instance._trigger("deactivate", event, uiSortable);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6449 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6450
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6451 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6452
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6453 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6454 drag: function(event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6455
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6456 var inst = $(this).data("ui-draggable"), that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6457
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6458 $.each(inst.sortables, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6459
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6460 var innermostIntersecting = false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6461 thisSortable = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6462
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6463 //Copy over some variables to allow calling the sortable's native _intersectsWith
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6464 this.instance.positionAbs = inst.positionAbs;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6465 this.instance.helperProportions = inst.helperProportions;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6466 this.instance.offset.click = inst.offset.click;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6467
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6468 if(this.instance._intersectsWith(this.instance.containerCache)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6469 innermostIntersecting = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6470 $.each(inst.sortables, function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6471 this.instance.positionAbs = inst.positionAbs;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6472 this.instance.helperProportions = inst.helperProportions;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6473 this.instance.offset.click = inst.offset.click;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6474 if (this !== thisSortable &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6475 this.instance._intersectsWith(this.instance.containerCache) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6476 $.contains(thisSortable.instance.element[0], this.instance.element[0])
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6477 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6478 innermostIntersecting = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6479 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6480 return innermostIntersecting;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6481 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6482 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6483
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6484
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6485 if(innermostIntersecting) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6486 //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6487 if(!this.instance.isOver) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6488
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6489 this.instance.isOver = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6490 //Now we fake the start of dragging for the sortable instance,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6491 //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6492 //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6493 this.instance.currentItem = $(that).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item", true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6494 this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6495 this.instance.options.helper = function() { return ui.helper[0]; };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6496
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6497 event.target = this.instance.currentItem[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6498 this.instance._mouseCapture(event, true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6499 this.instance._mouseStart(event, true, true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6500
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6501 //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6502 this.instance.offset.click.top = inst.offset.click.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6503 this.instance.offset.click.left = inst.offset.click.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6504 this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6505 this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6506
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6507 inst._trigger("toSortable", event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6508 inst.dropped = this.instance.element; //draggable revert needs that
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6509 //hack so receive/update callbacks work (mostly)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6510 inst.currentItem = inst.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6511 this.instance.fromOutside = inst;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6512
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6513 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6514
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6515 //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6516 if(this.instance.currentItem) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6517 this.instance._mouseDrag(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6518 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6519
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6520 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6521
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6522 //If it doesn't intersect with the sortable, and it intersected before,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6523 //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6524 if(this.instance.isOver) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6525
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6526 this.instance.isOver = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6527 this.instance.cancelHelperRemoval = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6528
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6529 //Prevent reverting on this forced stop
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6530 this.instance.options.revert = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6531
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6532 // The out event needs to be triggered independently
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6533 this.instance._trigger("out", event, this.instance._uiHash(this.instance));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6534
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6535 this.instance._mouseStop(event, true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6536 this.instance.options.helper = this.instance.options._helper;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6537
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6538 //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6539 this.instance.currentItem.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6540 if(this.instance.placeholder) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6541 this.instance.placeholder.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6542 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6543
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6544 inst._trigger("fromSortable", event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6545 inst.dropped = false; //draggable revert needs that
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6546 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6547
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6548 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6549
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6550 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6551
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6552 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6553 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6554
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6555 $.ui.plugin.add("draggable", "cursor", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6556 start: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6557 var t = $("body"), o = $(this).data("ui-draggable").options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6558 if (t.css("cursor")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6559 o._cursor = t.css("cursor");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6560 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6561 t.css("cursor", o.cursor);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6562 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6563 stop: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6564 var o = $(this).data("ui-draggable").options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6565 if (o._cursor) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6566 $("body").css("cursor", o._cursor);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6567 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6568 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6569 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6570
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6571 $.ui.plugin.add("draggable", "opacity", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6572 start: function(event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6573 var t = $(ui.helper), o = $(this).data("ui-draggable").options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6574 if(t.css("opacity")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6575 o._opacity = t.css("opacity");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6576 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6577 t.css("opacity", o.opacity);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6578 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6579 stop: function(event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6580 var o = $(this).data("ui-draggable").options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6581 if(o._opacity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6582 $(ui.helper).css("opacity", o._opacity);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6583 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6584 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6585 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6586
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6587 $.ui.plugin.add("draggable", "scroll", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6588 start: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6589 var i = $(this).data("ui-draggable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6590 if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6591 i.overflowOffset = i.scrollParent.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6592 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6593 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6594 drag: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6595
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6596 var i = $(this).data("ui-draggable"), o = i.options, scrolled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6597
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6598 if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6599
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6600 if(!o.axis || o.axis !== "x") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6601 if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6602 i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6603 } else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6604 i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6605 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6606 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6607
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6608 if(!o.axis || o.axis !== "y") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6609 if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6610 i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6611 } else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6612 i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6613 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6614 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6615
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6616 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6617
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6618 if(!o.axis || o.axis !== "x") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6619 if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6620 scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6621 } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6622 scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6623 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6624 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6625
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6626 if(!o.axis || o.axis !== "y") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6627 if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6628 scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6629 } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6630 scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6631 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6632 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6633
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6634 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6635
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6636 if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6637 $.ui.ddmanager.prepareOffsets(i, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6638 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6639
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6640 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6641 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6642
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6643 $.ui.plugin.add("draggable", "snap", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6644 start: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6645
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6646 var i = $(this).data("ui-draggable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6647 o = i.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6648
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6649 i.snapElements = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6650
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6651 $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6652 var $t = $(this),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6653 $o = $t.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6654 if(this !== i.element[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6655 i.snapElements.push({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6656 item: this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6657 width: $t.outerWidth(), height: $t.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6658 top: $o.top, left: $o.left
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6659 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6660 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6661 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6662
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6663 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6664 drag: function(event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6665
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6666 var ts, bs, ls, rs, l, r, t, b, i, first,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6667 inst = $(this).data("ui-draggable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6668 o = inst.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6669 d = o.snapTolerance,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6670 x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6671 y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6672
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6673 for (i = inst.snapElements.length - 1; i >= 0; i--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6674
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6675 l = inst.snapElements[i].left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6676 r = l + inst.snapElements[i].width;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6677 t = inst.snapElements[i].top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6678 b = t + inst.snapElements[i].height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6679
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6680 if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6681 if(inst.snapElements[i].snapping) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6682 (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6683 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6684 inst.snapElements[i].snapping = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6685 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6686 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6687
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6688 if(o.snapMode !== "inner") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6689 ts = Math.abs(t - y2) <= d;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6690 bs = Math.abs(b - y1) <= d;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6691 ls = Math.abs(l - x2) <= d;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6692 rs = Math.abs(r - x1) <= d;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6693 if(ts) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6694 ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6695 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6696 if(bs) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6697 ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6698 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6699 if(ls) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6700 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6701 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6702 if(rs) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6703 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6704 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6705 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6706
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6707 first = (ts || bs || ls || rs);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6708
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6709 if(o.snapMode !== "outer") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6710 ts = Math.abs(t - y1) <= d;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6711 bs = Math.abs(b - y2) <= d;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6712 ls = Math.abs(l - x1) <= d;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6713 rs = Math.abs(r - x2) <= d;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6714 if(ts) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6715 ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6716 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6717 if(bs) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6718 ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6719 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6720 if(ls) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6721 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6722 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6723 if(rs) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6724 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6725 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6726 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6727
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6728 if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6729 (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6730 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6731 inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6732
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6733 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6734
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6735 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6736 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6737
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6738 $.ui.plugin.add("draggable", "stack", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6739 start: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6740 var min,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6741 o = this.data("ui-draggable").options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6742 group = $.makeArray($(o.stack)).sort(function(a,b) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6743 return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6744 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6745
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6746 if (!group.length) { return; }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6747
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6748 min = parseInt($(group[0]).css("zIndex"), 10) || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6749 $(group).each(function(i) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6750 $(this).css("zIndex", min + i);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6751 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6752 this.css("zIndex", (min + group.length));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6753 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6754 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6755
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6756 $.ui.plugin.add("draggable", "zIndex", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6757 start: function(event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6758 var t = $(ui.helper), o = $(this).data("ui-draggable").options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6759 if(t.css("zIndex")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6760 o._zIndex = t.css("zIndex");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6761 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6762 t.css("zIndex", o.zIndex);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6763 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6764 stop: function(event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6765 var o = $(this).data("ui-draggable").options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6766 if(o._zIndex) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6767 $(ui.helper).css("zIndex", o._zIndex);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6768 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6769 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6770 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6771
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6772 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6773 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6774
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6775 function isOverAxis( x, reference, size ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6776 return ( x > reference ) && ( x < ( reference + size ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6777 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6778
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6779 $.widget("ui.droppable", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6780 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6781 widgetEventPrefix: "drop",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6782 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6783 accept: "*",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6784 activeClass: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6785 addClasses: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6786 greedy: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6787 hoverClass: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6788 scope: "default",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6789 tolerance: "intersect",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6790
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6791 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6792 activate: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6793 deactivate: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6794 drop: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6795 out: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6796 over: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6797 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6798 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6799
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6800 var proportions,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6801 o = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6802 accept = o.accept;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6803
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6804 this.isover = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6805 this.isout = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6806
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6807 this.accept = $.isFunction(accept) ? accept : function(d) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6808 return d.is(accept);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6809 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6810
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6811 this.proportions = function( /* valueToWrite */ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6812 if ( arguments.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6813 // Store the droppable's proportions
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6814 proportions = arguments[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6815 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6816 // Retrieve or derive the droppable's proportions
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6817 return proportions ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6818 proportions :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6819 proportions = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6820 width: this.element[ 0 ].offsetWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6821 height: this.element[ 0 ].offsetHeight
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6822 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6823 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6824 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6825
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6826 // Add the reference and positions to the manager
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6827 $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6828 $.ui.ddmanager.droppables[o.scope].push(this);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6829
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6830 (o.addClasses && this.element.addClass("ui-droppable"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6831
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6832 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6833
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6834 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6835 var i = 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6836 drop = $.ui.ddmanager.droppables[this.options.scope];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6837
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6838 for ( ; i < drop.length; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6839 if ( drop[i] === this ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6840 drop.splice(i, 1);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6841 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6842 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6843
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6844 this.element.removeClass("ui-droppable ui-droppable-disabled");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6845 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6846
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6847 _setOption: function(key, value) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6848
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6849 if(key === "accept") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6850 this.accept = $.isFunction(value) ? value : function(d) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6851 return d.is(value);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6852 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6853 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6854 $.Widget.prototype._setOption.apply(this, arguments);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6855 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6856
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6857 _activate: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6858 var draggable = $.ui.ddmanager.current;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6859 if(this.options.activeClass) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6860 this.element.addClass(this.options.activeClass);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6861 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6862 if(draggable){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6863 this._trigger("activate", event, this.ui(draggable));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6864 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6865 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6866
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6867 _deactivate: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6868 var draggable = $.ui.ddmanager.current;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6869 if(this.options.activeClass) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6870 this.element.removeClass(this.options.activeClass);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6871 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6872 if(draggable){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6873 this._trigger("deactivate", event, this.ui(draggable));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6874 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6875 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6876
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6877 _over: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6878
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6879 var draggable = $.ui.ddmanager.current;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6880
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6881 // Bail if draggable and droppable are same element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6882 if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6883 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6884 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6885
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6886 if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6887 if(this.options.hoverClass) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6888 this.element.addClass(this.options.hoverClass);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6889 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6890 this._trigger("over", event, this.ui(draggable));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6891 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6892
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6893 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6894
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6895 _out: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6896
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6897 var draggable = $.ui.ddmanager.current;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6898
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6899 // Bail if draggable and droppable are same element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6900 if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6901 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6902 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6903
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6904 if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6905 if(this.options.hoverClass) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6906 this.element.removeClass(this.options.hoverClass);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6907 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6908 this._trigger("out", event, this.ui(draggable));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6909 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6910
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6911 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6912
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6913 _drop: function(event,custom) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6914
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6915 var draggable = custom || $.ui.ddmanager.current,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6916 childrenIntersection = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6917
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6918 // Bail if draggable and droppable are same element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6919 if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6920 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6921 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6922
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6923 this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6924 var inst = $.data(this, "ui-droppable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6925 if(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6926 inst.options.greedy &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6927 !inst.options.disabled &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6928 inst.options.scope === draggable.options.scope &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6929 inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6930 $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6931 ) { childrenIntersection = true; return false; }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6932 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6933 if(childrenIntersection) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6934 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6935 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6936
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6937 if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6938 if(this.options.activeClass) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6939 this.element.removeClass(this.options.activeClass);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6940 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6941 if(this.options.hoverClass) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6942 this.element.removeClass(this.options.hoverClass);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6943 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6944 this._trigger("drop", event, this.ui(draggable));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6945 return this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6946 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6947
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6948 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6949
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6950 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6951
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6952 ui: function(c) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6953 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6954 draggable: (c.currentItem || c.element),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6955 helper: c.helper,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6956 position: c.position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6957 offset: c.positionAbs
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6958 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6959 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6960
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6961 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6962
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6963 $.ui.intersect = function(draggable, droppable, toleranceMode) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6964
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6965 if (!droppable.offset) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6966 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6967 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6968
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6969 var draggableLeft, draggableTop,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6970 x1 = (draggable.positionAbs || draggable.position.absolute).left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6971 y1 = (draggable.positionAbs || draggable.position.absolute).top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6972 x2 = x1 + draggable.helperProportions.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6973 y2 = y1 + draggable.helperProportions.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6974 l = droppable.offset.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6975 t = droppable.offset.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6976 r = l + droppable.proportions().width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6977 b = t + droppable.proportions().height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6978
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6979 switch (toleranceMode) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6980 case "fit":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6981 return (l <= x1 && x2 <= r && t <= y1 && y2 <= b);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6982 case "intersect":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6983 return (l < x1 + (draggable.helperProportions.width / 2) && // Right Half
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6984 x2 - (draggable.helperProportions.width / 2) < r && // Left Half
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6985 t < y1 + (draggable.helperProportions.height / 2) && // Bottom Half
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6986 y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6987 case "pointer":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6988 draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6989 draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6990 return isOverAxis( draggableTop, t, droppable.proportions().height ) && isOverAxis( draggableLeft, l, droppable.proportions().width );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6991 case "touch":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6992 return (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6993 (y1 >= t && y1 <= b) || // Top edge touching
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6994 (y2 >= t && y2 <= b) || // Bottom edge touching
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6995 (y1 < t && y2 > b) // Surrounded vertically
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6996 ) && (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6997 (x1 >= l && x1 <= r) || // Left edge touching
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6998 (x2 >= l && x2 <= r) || // Right edge touching
3c160414da2e initial upload
shiltemann
parents:
diff changeset
6999 (x1 < l && x2 > r) // Surrounded horizontally
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7000 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7001 default:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7002 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7003 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7004
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7005 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7006
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7007 /*
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7008 This manager tracks offsets of draggables and droppables
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7009 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7010 $.ui.ddmanager = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7011 current: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7012 droppables: { "default": [] },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7013 prepareOffsets: function(t, event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7014
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7015 var i, j,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7016 m = $.ui.ddmanager.droppables[t.options.scope] || [],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7017 type = event ? event.type : null, // workaround for #2317
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7018 list = (t.currentItem || t.element).find(":data(ui-droppable)").addBack();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7019
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7020 droppablesLoop: for (i = 0; i < m.length; i++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7021
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7022 //No disabled and non-accepted
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7023 if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7024 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7025 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7026
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7027 // Filter out elements in the current dragged item
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7028 for (j=0; j < list.length; j++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7029 if(list[j] === m[i].element[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7030 m[i].proportions().height = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7031 continue droppablesLoop;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7032 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7033 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7034
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7035 m[i].visible = m[i].element.css("display") !== "none";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7036 if(!m[i].visible) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7037 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7038 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7039
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7040 //Activate the droppable if used directly from draggables
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7041 if(type === "mousedown") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7042 m[i]._activate.call(m[i], event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7043 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7044
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7045 m[ i ].offset = m[ i ].element.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7046 m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7047
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7048 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7049
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7050 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7051 drop: function(draggable, event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7052
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7053 var dropped = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7054 // Create a copy of the droppables in case the list changes during the drop (#9116)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7055 $.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7056
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7057 if(!this.options) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7058 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7059 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7060 if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7061 dropped = this._drop.call(this, event) || dropped;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7062 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7063
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7064 if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7065 this.isout = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7066 this.isover = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7067 this._deactivate.call(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7068 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7069
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7070 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7071 return dropped;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7072
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7073 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7074 dragStart: function( draggable, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7075 //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7076 draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7077 if( !draggable.options.refreshPositions ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7078 $.ui.ddmanager.prepareOffsets( draggable, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7079 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7080 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7081 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7082 drag: function(draggable, event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7083
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7084 //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7085 if(draggable.options.refreshPositions) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7086 $.ui.ddmanager.prepareOffsets(draggable, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7087 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7088
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7089 //Run through all droppables and check their positions based on specific tolerance options
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7090 $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7091
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7092 if(this.options.disabled || this.greedyChild || !this.visible) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7093 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7094 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7095
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7096 var parentInstance, scope, parent,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7097 intersects = $.ui.intersect(draggable, this, this.options.tolerance),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7098 c = !intersects && this.isover ? "isout" : (intersects && !this.isover ? "isover" : null);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7099 if(!c) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7100 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7101 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7102
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7103 if (this.options.greedy) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7104 // find droppable parents with same scope
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7105 scope = this.options.scope;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7106 parent = this.element.parents(":data(ui-droppable)").filter(function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7107 return $.data(this, "ui-droppable").options.scope === scope;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7108 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7109
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7110 if (parent.length) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7111 parentInstance = $.data(parent[0], "ui-droppable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7112 parentInstance.greedyChild = (c === "isover");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7113 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7114 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7115
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7116 // we just moved into a greedy child
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7117 if (parentInstance && c === "isover") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7118 parentInstance.isover = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7119 parentInstance.isout = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7120 parentInstance._out.call(parentInstance, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7121 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7122
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7123 this[c] = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7124 this[c === "isout" ? "isover" : "isout"] = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7125 this[c === "isover" ? "_over" : "_out"].call(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7126
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7127 // we just moved out of a greedy child
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7128 if (parentInstance && c === "isout") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7129 parentInstance.isout = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7130 parentInstance.isover = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7131 parentInstance._over.call(parentInstance, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7132 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7133 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7134
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7135 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7136 dragStop: function( draggable, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7137 draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7138 //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7139 if( !draggable.options.refreshPositions ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7140 $.ui.ddmanager.prepareOffsets( draggable, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7141 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7142 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7143 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7144
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7145 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7146 (function($, undefined) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7147
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7148 var dataSpace = "ui-effects-";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7149
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7150 $.effects = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7151 effect: {}
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7152 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7153
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7154 /*!
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7155 * jQuery Color Animations v2.1.2
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7156 * https://github.com/jquery/jquery-color
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7157 *
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7158 * Copyright 2013 jQuery Foundation and other contributors
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7159 * Released under the MIT license.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7160 * http://jquery.org/license
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7161 *
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7162 * Date: Wed Jan 16 08:47:09 2013 -0600
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7163 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7164 (function( jQuery, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7165
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7166 var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7167
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7168 // plusequals test for += 100 -= 100
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7169 rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7170 // a set of RE's that can match strings and generate color tuples.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7171 stringParsers = [{
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7172 re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7173 parse: function( execResult ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7174 return [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7175 execResult[ 1 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7176 execResult[ 2 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7177 execResult[ 3 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7178 execResult[ 4 ]
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7179 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7180 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7181 }, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7182 re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7183 parse: function( execResult ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7184 return [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7185 execResult[ 1 ] * 2.55,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7186 execResult[ 2 ] * 2.55,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7187 execResult[ 3 ] * 2.55,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7188 execResult[ 4 ]
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7189 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7190 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7191 }, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7192 // this regex ignores A-F because it's compared against an already lowercased string
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7193 re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7194 parse: function( execResult ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7195 return [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7196 parseInt( execResult[ 1 ], 16 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7197 parseInt( execResult[ 2 ], 16 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7198 parseInt( execResult[ 3 ], 16 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7199 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7200 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7201 }, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7202 // this regex ignores A-F because it's compared against an already lowercased string
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7203 re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7204 parse: function( execResult ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7205 return [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7206 parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7207 parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7208 parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7209 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7210 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7211 }, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7212 re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7213 space: "hsla",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7214 parse: function( execResult ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7215 return [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7216 execResult[ 1 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7217 execResult[ 2 ] / 100,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7218 execResult[ 3 ] / 100,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7219 execResult[ 4 ]
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7220 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7221 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7222 }],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7223
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7224 // jQuery.Color( )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7225 color = jQuery.Color = function( color, green, blue, alpha ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7226 return new jQuery.Color.fn.parse( color, green, blue, alpha );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7227 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7228 spaces = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7229 rgba: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7230 props: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7231 red: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7232 idx: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7233 type: "byte"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7234 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7235 green: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7236 idx: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7237 type: "byte"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7238 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7239 blue: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7240 idx: 2,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7241 type: "byte"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7242 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7243 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7244 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7245
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7246 hsla: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7247 props: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7248 hue: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7249 idx: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7250 type: "degrees"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7251 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7252 saturation: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7253 idx: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7254 type: "percent"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7255 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7256 lightness: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7257 idx: 2,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7258 type: "percent"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7259 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7260 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7261 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7262 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7263 propTypes = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7264 "byte": {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7265 floor: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7266 max: 255
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7267 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7268 "percent": {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7269 max: 1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7270 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7271 "degrees": {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7272 mod: 360,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7273 floor: true
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7274 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7275 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7276 support = color.support = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7277
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7278 // element for support tests
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7279 supportElem = jQuery( "<p>" )[ 0 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7280
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7281 // colors = jQuery.Color.names
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7282 colors,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7283
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7284 // local aliases of functions called often
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7285 each = jQuery.each;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7286
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7287 // determine rgba support immediately
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7288 supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7289 support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7290
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7291 // define cache name and alpha properties
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7292 // for rgba and hsla spaces
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7293 each( spaces, function( spaceName, space ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7294 space.cache = "_" + spaceName;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7295 space.props.alpha = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7296 idx: 3,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7297 type: "percent",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7298 def: 1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7299 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7300 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7301
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7302 function clamp( value, prop, allowEmpty ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7303 var type = propTypes[ prop.type ] || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7304
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7305 if ( value == null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7306 return (allowEmpty || !prop.def) ? null : prop.def;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7307 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7308
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7309 // ~~ is an short way of doing floor for positive numbers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7310 value = type.floor ? ~~value : parseFloat( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7311
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7312 // IE will pass in empty strings as value for alpha,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7313 // which will hit this case
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7314 if ( isNaN( value ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7315 return prop.def;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7316 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7317
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7318 if ( type.mod ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7319 // we add mod before modding to make sure that negatives values
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7320 // get converted properly: -10 -> 350
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7321 return (value + type.mod) % type.mod;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7322 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7323
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7324 // for now all property types without mod have min and max
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7325 return 0 > value ? 0 : type.max < value ? type.max : value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7326 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7327
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7328 function stringParse( string ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7329 var inst = color(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7330 rgba = inst._rgba = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7331
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7332 string = string.toLowerCase();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7333
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7334 each( stringParsers, function( i, parser ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7335 var parsed,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7336 match = parser.re.exec( string ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7337 values = match && parser.parse( match ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7338 spaceName = parser.space || "rgba";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7339
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7340 if ( values ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7341 parsed = inst[ spaceName ]( values );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7342
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7343 // if this was an rgba parse the assignment might happen twice
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7344 // oh well....
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7345 inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7346 rgba = inst._rgba = parsed._rgba;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7347
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7348 // exit each( stringParsers ) here because we matched
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7349 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7350 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7351 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7352
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7353 // Found a stringParser that handled it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7354 if ( rgba.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7355
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7356 // if this came from a parsed string, force "transparent" when alpha is 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7357 // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7358 if ( rgba.join() === "0,0,0,0" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7359 jQuery.extend( rgba, colors.transparent );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7360 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7361 return inst;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7362 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7363
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7364 // named colors
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7365 return colors[ string ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7366 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7367
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7368 color.fn = jQuery.extend( color.prototype, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7369 parse: function( red, green, blue, alpha ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7370 if ( red === undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7371 this._rgba = [ null, null, null, null ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7372 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7373 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7374 if ( red.jquery || red.nodeType ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7375 red = jQuery( red ).css( green );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7376 green = undefined;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7377 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7378
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7379 var inst = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7380 type = jQuery.type( red ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7381 rgba = this._rgba = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7382
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7383 // more than 1 argument specified - assume ( red, green, blue, alpha )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7384 if ( green !== undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7385 red = [ red, green, blue, alpha ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7386 type = "array";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7387 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7388
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7389 if ( type === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7390 return this.parse( stringParse( red ) || colors._default );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7391 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7392
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7393 if ( type === "array" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7394 each( spaces.rgba.props, function( key, prop ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7395 rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7396 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7397 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7398 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7399
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7400 if ( type === "object" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7401 if ( red instanceof color ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7402 each( spaces, function( spaceName, space ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7403 if ( red[ space.cache ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7404 inst[ space.cache ] = red[ space.cache ].slice();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7405 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7406 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7407 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7408 each( spaces, function( spaceName, space ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7409 var cache = space.cache;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7410 each( space.props, function( key, prop ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7411
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7412 // if the cache doesn't exist, and we know how to convert
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7413 if ( !inst[ cache ] && space.to ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7414
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7415 // if the value was null, we don't need to copy it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7416 // if the key was alpha, we don't need to copy it either
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7417 if ( key === "alpha" || red[ key ] == null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7418 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7419 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7420 inst[ cache ] = space.to( inst._rgba );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7421 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7422
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7423 // this is the only case where we allow nulls for ALL properties.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7424 // call clamp with alwaysAllowEmpty
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7425 inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7426 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7427
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7428 // everything defined but alpha?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7429 if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7430 // use the default of 1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7431 inst[ cache ][ 3 ] = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7432 if ( space.from ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7433 inst._rgba = space.from( inst[ cache ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7434 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7435 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7436 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7437 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7438 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7439 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7440 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7441 is: function( compare ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7442 var is = color( compare ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7443 same = true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7444 inst = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7445
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7446 each( spaces, function( _, space ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7447 var localCache,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7448 isCache = is[ space.cache ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7449 if (isCache) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7450 localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7451 each( space.props, function( _, prop ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7452 if ( isCache[ prop.idx ] != null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7453 same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7454 return same;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7455 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7456 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7457 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7458 return same;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7459 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7460 return same;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7461 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7462 _space: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7463 var used = [],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7464 inst = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7465 each( spaces, function( spaceName, space ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7466 if ( inst[ space.cache ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7467 used.push( spaceName );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7468 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7469 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7470 return used.pop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7471 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7472 transition: function( other, distance ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7473 var end = color( other ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7474 spaceName = end._space(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7475 space = spaces[ spaceName ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7476 startColor = this.alpha() === 0 ? color( "transparent" ) : this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7477 start = startColor[ space.cache ] || space.to( startColor._rgba ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7478 result = start.slice();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7479
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7480 end = end[ space.cache ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7481 each( space.props, function( key, prop ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7482 var index = prop.idx,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7483 startValue = start[ index ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7484 endValue = end[ index ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7485 type = propTypes[ prop.type ] || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7486
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7487 // if null, don't override start value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7488 if ( endValue === null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7489 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7490 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7491 // if null - use end
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7492 if ( startValue === null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7493 result[ index ] = endValue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7494 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7495 if ( type.mod ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7496 if ( endValue - startValue > type.mod / 2 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7497 startValue += type.mod;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7498 } else if ( startValue - endValue > type.mod / 2 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7499 startValue -= type.mod;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7500 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7501 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7502 result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7503 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7504 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7505 return this[ spaceName ]( result );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7506 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7507 blend: function( opaque ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7508 // if we are already opaque - return ourself
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7509 if ( this._rgba[ 3 ] === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7510 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7511 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7512
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7513 var rgb = this._rgba.slice(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7514 a = rgb.pop(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7515 blend = color( opaque )._rgba;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7516
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7517 return color( jQuery.map( rgb, function( v, i ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7518 return ( 1 - a ) * blend[ i ] + a * v;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7519 }));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7520 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7521 toRgbaString: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7522 var prefix = "rgba(",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7523 rgba = jQuery.map( this._rgba, function( v, i ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7524 return v == null ? ( i > 2 ? 1 : 0 ) : v;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7525 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7526
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7527 if ( rgba[ 3 ] === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7528 rgba.pop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7529 prefix = "rgb(";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7530 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7531
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7532 return prefix + rgba.join() + ")";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7533 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7534 toHslaString: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7535 var prefix = "hsla(",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7536 hsla = jQuery.map( this.hsla(), function( v, i ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7537 if ( v == null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7538 v = i > 2 ? 1 : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7539 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7540
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7541 // catch 1 and 2
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7542 if ( i && i < 3 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7543 v = Math.round( v * 100 ) + "%";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7544 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7545 return v;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7546 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7547
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7548 if ( hsla[ 3 ] === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7549 hsla.pop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7550 prefix = "hsl(";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7551 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7552 return prefix + hsla.join() + ")";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7553 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7554 toHexString: function( includeAlpha ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7555 var rgba = this._rgba.slice(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7556 alpha = rgba.pop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7557
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7558 if ( includeAlpha ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7559 rgba.push( ~~( alpha * 255 ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7560 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7561
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7562 return "#" + jQuery.map( rgba, function( v ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7563
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7564 // default to 0 when nulls exist
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7565 v = ( v || 0 ).toString( 16 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7566 return v.length === 1 ? "0" + v : v;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7567 }).join("");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7568 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7569 toString: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7570 return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7571 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7572 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7573 color.fn.parse.prototype = color.fn;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7574
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7575 // hsla conversions adapted from:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7576 // https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7577
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7578 function hue2rgb( p, q, h ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7579 h = ( h + 1 ) % 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7580 if ( h * 6 < 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7581 return p + (q - p) * h * 6;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7582 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7583 if ( h * 2 < 1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7584 return q;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7585 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7586 if ( h * 3 < 2 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7587 return p + (q - p) * ((2/3) - h) * 6;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7588 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7589 return p;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7590 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7591
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7592 spaces.hsla.to = function ( rgba ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7593 if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7594 return [ null, null, null, rgba[ 3 ] ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7595 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7596 var r = rgba[ 0 ] / 255,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7597 g = rgba[ 1 ] / 255,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7598 b = rgba[ 2 ] / 255,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7599 a = rgba[ 3 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7600 max = Math.max( r, g, b ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7601 min = Math.min( r, g, b ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7602 diff = max - min,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7603 add = max + min,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7604 l = add * 0.5,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7605 h, s;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7606
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7607 if ( min === max ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7608 h = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7609 } else if ( r === max ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7610 h = ( 60 * ( g - b ) / diff ) + 360;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7611 } else if ( g === max ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7612 h = ( 60 * ( b - r ) / diff ) + 120;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7613 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7614 h = ( 60 * ( r - g ) / diff ) + 240;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7615 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7616
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7617 // chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7618 // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7619 if ( diff === 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7620 s = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7621 } else if ( l <= 0.5 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7622 s = diff / add;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7623 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7624 s = diff / ( 2 - add );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7625 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7626 return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7627 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7628
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7629 spaces.hsla.from = function ( hsla ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7630 if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7631 return [ null, null, null, hsla[ 3 ] ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7632 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7633 var h = hsla[ 0 ] / 360,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7634 s = hsla[ 1 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7635 l = hsla[ 2 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7636 a = hsla[ 3 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7637 q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7638 p = 2 * l - q;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7639
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7640 return [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7641 Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7642 Math.round( hue2rgb( p, q, h ) * 255 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7643 Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7644 a
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7645 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7646 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7647
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7648
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7649 each( spaces, function( spaceName, space ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7650 var props = space.props,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7651 cache = space.cache,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7652 to = space.to,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7653 from = space.from;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7654
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7655 // makes rgba() and hsla()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7656 color.fn[ spaceName ] = function( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7657
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7658 // generate a cache for this space if it doesn't exist
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7659 if ( to && !this[ cache ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7660 this[ cache ] = to( this._rgba );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7661 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7662 if ( value === undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7663 return this[ cache ].slice();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7664 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7665
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7666 var ret,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7667 type = jQuery.type( value ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7668 arr = ( type === "array" || type === "object" ) ? value : arguments,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7669 local = this[ cache ].slice();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7670
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7671 each( props, function( key, prop ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7672 var val = arr[ type === "object" ? key : prop.idx ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7673 if ( val == null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7674 val = local[ prop.idx ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7675 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7676 local[ prop.idx ] = clamp( val, prop );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7677 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7678
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7679 if ( from ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7680 ret = color( from( local ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7681 ret[ cache ] = local;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7682 return ret;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7683 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7684 return color( local );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7685 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7686 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7687
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7688 // makes red() green() blue() alpha() hue() saturation() lightness()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7689 each( props, function( key, prop ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7690 // alpha is included in more than one space
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7691 if ( color.fn[ key ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7692 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7693 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7694 color.fn[ key ] = function( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7695 var vtype = jQuery.type( value ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7696 fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7697 local = this[ fn ](),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7698 cur = local[ prop.idx ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7699 match;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7700
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7701 if ( vtype === "undefined" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7702 return cur;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7703 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7704
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7705 if ( vtype === "function" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7706 value = value.call( this, cur );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7707 vtype = jQuery.type( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7708 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7709 if ( value == null && prop.empty ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7710 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7711 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7712 if ( vtype === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7713 match = rplusequals.exec( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7714 if ( match ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7715 value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7716 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7717 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7718 local[ prop.idx ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7719 return this[ fn ]( local );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7720 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7721 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7722 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7723
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7724 // add cssHook and .fx.step function for each named hook.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7725 // accept a space separated string of properties
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7726 color.hook = function( hook ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7727 var hooks = hook.split( " " );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7728 each( hooks, function( i, hook ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7729 jQuery.cssHooks[ hook ] = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7730 set: function( elem, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7731 var parsed, curElem,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7732 backgroundColor = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7733
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7734 if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7735 value = color( parsed || value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7736 if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7737 curElem = hook === "backgroundColor" ? elem.parentNode : elem;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7738 while (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7739 (backgroundColor === "" || backgroundColor === "transparent") &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7740 curElem && curElem.style
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7741 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7742 try {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7743 backgroundColor = jQuery.css( curElem, "backgroundColor" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7744 curElem = curElem.parentNode;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7745 } catch ( e ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7746 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7747 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7748
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7749 value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7750 backgroundColor :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7751 "_default" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7752 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7753
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7754 value = value.toRgbaString();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7755 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7756 try {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7757 elem.style[ hook ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7758 } catch( e ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7759 // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7760 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7761 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7762 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7763 jQuery.fx.step[ hook ] = function( fx ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7764 if ( !fx.colorInit ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7765 fx.start = color( fx.elem, hook );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7766 fx.end = color( fx.end );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7767 fx.colorInit = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7768 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7769 jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7770 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7771 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7772
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7773 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7774
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7775 color.hook( stepHooks );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7776
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7777 jQuery.cssHooks.borderColor = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7778 expand: function( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7779 var expanded = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7780
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7781 each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7782 expanded[ "border" + part + "Color" ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7783 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7784 return expanded;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7785 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7786 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7787
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7788 // Basic color names only.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7789 // Usage of any of the other color names requires adding yourself or including
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7790 // jquery.color.svg-names.js.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7791 colors = jQuery.Color.names = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7792 // 4.1. Basic color keywords
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7793 aqua: "#00ffff",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7794 black: "#000000",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7795 blue: "#0000ff",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7796 fuchsia: "#ff00ff",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7797 gray: "#808080",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7798 green: "#008000",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7799 lime: "#00ff00",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7800 maroon: "#800000",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7801 navy: "#000080",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7802 olive: "#808000",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7803 purple: "#800080",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7804 red: "#ff0000",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7805 silver: "#c0c0c0",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7806 teal: "#008080",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7807 white: "#ffffff",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7808 yellow: "#ffff00",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7809
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7810 // 4.2.3. "transparent" color keyword
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7811 transparent: [ null, null, null, 0 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7812
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7813 _default: "#ffffff"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7814 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7815
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7816 })( jQuery );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7817
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7818
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7819 /******************************************************************************/
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7820 /****************************** CLASS ANIMATIONS ******************************/
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7821 /******************************************************************************/
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7822 (function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7823
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7824 var classAnimationActions = [ "add", "remove", "toggle" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7825 shorthandStyles = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7826 border: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7827 borderBottom: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7828 borderColor: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7829 borderLeft: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7830 borderRight: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7831 borderTop: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7832 borderWidth: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7833 margin: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7834 padding: 1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7835 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7836
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7837 $.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7838 $.fx.step[ prop ] = function( fx ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7839 if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7840 jQuery.style( fx.elem, prop, fx.end );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7841 fx.setAttr = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7842 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7843 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7844 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7845
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7846 function getElementStyles( elem ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7847 var key, len,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7848 style = elem.ownerDocument.defaultView ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7849 elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7850 elem.currentStyle,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7851 styles = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7852
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7853 if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7854 len = style.length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7855 while ( len-- ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7856 key = style[ len ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7857 if ( typeof style[ key ] === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7858 styles[ $.camelCase( key ) ] = style[ key ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7859 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7860 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7861 // support: Opera, IE <9
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7862 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7863 for ( key in style ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7864 if ( typeof style[ key ] === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7865 styles[ key ] = style[ key ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7866 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7867 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7868 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7869
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7870 return styles;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7871 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7872
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7873
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7874 function styleDifference( oldStyle, newStyle ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7875 var diff = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7876 name, value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7877
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7878 for ( name in newStyle ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7879 value = newStyle[ name ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7880 if ( oldStyle[ name ] !== value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7881 if ( !shorthandStyles[ name ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7882 if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7883 diff[ name ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7884 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7885 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7886 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7887 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7888
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7889 return diff;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7890 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7891
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7892 // support: jQuery <1.8
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7893 if ( !$.fn.addBack ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7894 $.fn.addBack = function( selector ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7895 return this.add( selector == null ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7896 this.prevObject : this.prevObject.filter( selector )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7897 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7898 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7899 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7900
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7901 $.effects.animateClass = function( value, duration, easing, callback ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7902 var o = $.speed( duration, easing, callback );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7903
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7904 return this.queue( function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7905 var animated = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7906 baseClass = animated.attr( "class" ) || "",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7907 applyClassChange,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7908 allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7909
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7910 // map the animated objects to store the original styles.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7911 allAnimations = allAnimations.map(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7912 var el = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7913 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7914 el: el,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7915 start: getElementStyles( this )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7916 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7917 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7918
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7919 // apply class change
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7920 applyClassChange = function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7921 $.each( classAnimationActions, function(i, action) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7922 if ( value[ action ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7923 animated[ action + "Class" ]( value[ action ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7924 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7925 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7926 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7927 applyClassChange();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7928
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7929 // map all animated objects again - calculate new styles and diff
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7930 allAnimations = allAnimations.map(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7931 this.end = getElementStyles( this.el[ 0 ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7932 this.diff = styleDifference( this.start, this.end );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7933 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7934 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7935
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7936 // apply original class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7937 animated.attr( "class", baseClass );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7938
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7939 // map all animated objects again - this time collecting a promise
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7940 allAnimations = allAnimations.map(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7941 var styleInfo = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7942 dfd = $.Deferred(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7943 opts = $.extend({}, o, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7944 queue: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7945 complete: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7946 dfd.resolve( styleInfo );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7947 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7948 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7949
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7950 this.el.animate( this.diff, opts );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7951 return dfd.promise();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7952 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7953
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7954 // once all animations have completed:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7955 $.when.apply( $, allAnimations.get() ).done(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7956
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7957 // set the final class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7958 applyClassChange();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7959
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7960 // for each animated element,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7961 // clear all css properties that were animated
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7962 $.each( arguments, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7963 var el = this.el;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7964 $.each( this.diff, function(key) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7965 el.css( key, "" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7966 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7967 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7968
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7969 // this is guarnteed to be there if you use jQuery.speed()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7970 // it also handles dequeuing the next anim...
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7971 o.complete.call( animated[ 0 ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7972 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7973 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7974 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7975
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7976 $.fn.extend({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7977 addClass: (function( orig ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7978 return function( classNames, speed, easing, callback ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7979 return speed ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7980 $.effects.animateClass.call( this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7981 { add: classNames }, speed, easing, callback ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7982 orig.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7983 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7984 })( $.fn.addClass ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7985
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7986 removeClass: (function( orig ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7987 return function( classNames, speed, easing, callback ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7988 return arguments.length > 1 ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7989 $.effects.animateClass.call( this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7990 { remove: classNames }, speed, easing, callback ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7991 orig.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7992 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7993 })( $.fn.removeClass ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7994
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7995 toggleClass: (function( orig ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7996 return function( classNames, force, speed, easing, callback ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7997 if ( typeof force === "boolean" || force === undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7998 if ( !speed ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
7999 // without speed parameter
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8000 return orig.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8001 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8002 return $.effects.animateClass.call( this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8003 (force ? { add: classNames } : { remove: classNames }),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8004 speed, easing, callback );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8005 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8006 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8007 // without force parameter
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8008 return $.effects.animateClass.call( this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8009 { toggle: classNames }, force, speed, easing );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8010 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8011 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8012 })( $.fn.toggleClass ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8013
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8014 switchClass: function( remove, add, speed, easing, callback) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8015 return $.effects.animateClass.call( this, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8016 add: add,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8017 remove: remove
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8018 }, speed, easing, callback );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8019 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8020 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8021
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8022 })();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8023
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8024 /******************************************************************************/
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8025 /*********************************** EFFECTS **********************************/
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8026 /******************************************************************************/
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8027
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8028 (function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8029
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8030 $.extend( $.effects, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8031 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8032
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8033 // Saves a set of properties in a data storage
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8034 save: function( element, set ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8035 for( var i=0; i < set.length; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8036 if ( set[ i ] !== null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8037 element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8038 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8039 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8040 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8041
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8042 // Restores a set of previously saved properties from a data storage
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8043 restore: function( element, set ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8044 var val, i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8045 for( i=0; i < set.length; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8046 if ( set[ i ] !== null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8047 val = element.data( dataSpace + set[ i ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8048 // support: jQuery 1.6.2
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8049 // http://bugs.jquery.com/ticket/9917
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8050 // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8051 // We can't differentiate between "" and 0 here, so we just assume
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8052 // empty string since it's likely to be a more common value...
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8053 if ( val === undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8054 val = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8055 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8056 element.css( set[ i ], val );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8057 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8058 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8059 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8060
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8061 setMode: function( el, mode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8062 if (mode === "toggle") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8063 mode = el.is( ":hidden" ) ? "show" : "hide";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8064 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8065 return mode;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8066 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8067
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8068 // Translates a [top,left] array into a baseline value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8069 // this should be a little more flexible in the future to handle a string & hash
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8070 getBaseline: function( origin, original ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8071 var y, x;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8072 switch ( origin[ 0 ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8073 case "top": y = 0; break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8074 case "middle": y = 0.5; break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8075 case "bottom": y = 1; break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8076 default: y = origin[ 0 ] / original.height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8077 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8078 switch ( origin[ 1 ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8079 case "left": x = 0; break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8080 case "center": x = 0.5; break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8081 case "right": x = 1; break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8082 default: x = origin[ 1 ] / original.width;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8083 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8084 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8085 x: x,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8086 y: y
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8087 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8088 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8089
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8090 // Wraps the element around a wrapper that copies position properties
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8091 createWrapper: function( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8092
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8093 // if the element is already wrapped, return it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8094 if ( element.parent().is( ".ui-effects-wrapper" )) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8095 return element.parent();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8096 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8097
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8098 // wrap the element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8099 var props = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8100 width: element.outerWidth(true),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8101 height: element.outerHeight(true),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8102 "float": element.css( "float" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8103 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8104 wrapper = $( "<div></div>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8105 .addClass( "ui-effects-wrapper" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8106 .css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8107 fontSize: "100%",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8108 background: "transparent",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8109 border: "none",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8110 margin: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8111 padding: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8112 }),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8113 // Store the size in case width/height are defined in % - Fixes #5245
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8114 size = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8115 width: element.width(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8116 height: element.height()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8117 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8118 active = document.activeElement;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8119
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8120 // support: Firefox
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8121 // Firefox incorrectly exposes anonymous content
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8122 // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8123 try {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8124 active.id;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8125 } catch( e ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8126 active = document.body;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8127 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8128
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8129 element.wrap( wrapper );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8130
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8131 // Fixes #7595 - Elements lose focus when wrapped.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8132 if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8133 $( active ).focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8134 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8135
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8136 wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8137
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8138 // transfer positioning properties to the wrapper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8139 if ( element.css( "position" ) === "static" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8140 wrapper.css({ position: "relative" });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8141 element.css({ position: "relative" });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8142 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8143 $.extend( props, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8144 position: element.css( "position" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8145 zIndex: element.css( "z-index" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8146 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8147 $.each([ "top", "left", "bottom", "right" ], function(i, pos) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8148 props[ pos ] = element.css( pos );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8149 if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8150 props[ pos ] = "auto";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8151 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8152 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8153 element.css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8154 position: "relative",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8155 top: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8156 left: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8157 right: "auto",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8158 bottom: "auto"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8159 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8160 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8161 element.css(size);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8162
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8163 return wrapper.css( props ).show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8164 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8165
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8166 removeWrapper: function( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8167 var active = document.activeElement;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8168
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8169 if ( element.parent().is( ".ui-effects-wrapper" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8170 element.parent().replaceWith( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8171
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8172 // Fixes #7595 - Elements lose focus when wrapped.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8173 if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8174 $( active ).focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8175 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8176 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8177
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8178
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8179 return element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8180 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8181
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8182 setTransition: function( element, list, factor, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8183 value = value || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8184 $.each( list, function( i, x ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8185 var unit = element.cssUnit( x );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8186 if ( unit[ 0 ] > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8187 value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8188 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8189 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8190 return value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8191 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8192 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8193
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8194 // return an effect options object for the given parameters:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8195 function _normalizeArguments( effect, options, speed, callback ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8196
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8197 // allow passing all options as the first parameter
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8198 if ( $.isPlainObject( effect ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8199 options = effect;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8200 effect = effect.effect;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8201 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8202
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8203 // convert to an object
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8204 effect = { effect: effect };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8205
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8206 // catch (effect, null, ...)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8207 if ( options == null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8208 options = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8209 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8210
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8211 // catch (effect, callback)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8212 if ( $.isFunction( options ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8213 callback = options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8214 speed = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8215 options = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8216 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8217
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8218 // catch (effect, speed, ?)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8219 if ( typeof options === "number" || $.fx.speeds[ options ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8220 callback = speed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8221 speed = options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8222 options = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8223 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8224
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8225 // catch (effect, options, callback)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8226 if ( $.isFunction( speed ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8227 callback = speed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8228 speed = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8229 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8230
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8231 // add options to effect
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8232 if ( options ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8233 $.extend( effect, options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8234 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8235
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8236 speed = speed || options.duration;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8237 effect.duration = $.fx.off ? 0 :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8238 typeof speed === "number" ? speed :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8239 speed in $.fx.speeds ? $.fx.speeds[ speed ] :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8240 $.fx.speeds._default;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8241
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8242 effect.complete = callback || options.complete;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8243
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8244 return effect;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8245 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8246
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8247 function standardAnimationOption( option ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8248 // Valid standard speeds (nothing, number, named speed)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8249 if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8250 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8251 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8252
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8253 // Invalid strings - treat as "normal" speed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8254 if ( typeof option === "string" && !$.effects.effect[ option ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8255 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8256 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8257
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8258 // Complete callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8259 if ( $.isFunction( option ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8260 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8261 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8262
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8263 // Options hash (but not naming an effect)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8264 if ( typeof option === "object" && !option.effect ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8265 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8266 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8267
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8268 // Didn't match any standard API
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8269 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8270 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8271
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8272 $.fn.extend({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8273 effect: function( /* effect, options, speed, callback */ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8274 var args = _normalizeArguments.apply( this, arguments ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8275 mode = args.mode,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8276 queue = args.queue,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8277 effectMethod = $.effects.effect[ args.effect ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8278
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8279 if ( $.fx.off || !effectMethod ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8280 // delegate to the original method (e.g., .show()) if possible
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8281 if ( mode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8282 return this[ mode ]( args.duration, args.complete );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8283 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8284 return this.each( function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8285 if ( args.complete ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8286 args.complete.call( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8287 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8288 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8289 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8290 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8291
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8292 function run( next ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8293 var elem = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8294 complete = args.complete,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8295 mode = args.mode;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8296
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8297 function done() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8298 if ( $.isFunction( complete ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8299 complete.call( elem[0] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8300 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8301 if ( $.isFunction( next ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8302 next();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8303 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8304 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8305
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8306 // If the element already has the correct final state, delegate to
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8307 // the core methods so the internal tracking of "olddisplay" works.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8308 if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8309 elem[ mode ]();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8310 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8311 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8312 effectMethod.call( elem[0], args, done );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8313 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8314 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8315
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8316 return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8317 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8318
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8319 show: (function( orig ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8320 return function( option ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8321 if ( standardAnimationOption( option ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8322 return orig.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8323 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8324 var args = _normalizeArguments.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8325 args.mode = "show";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8326 return this.effect.call( this, args );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8327 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8328 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8329 })( $.fn.show ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8330
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8331 hide: (function( orig ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8332 return function( option ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8333 if ( standardAnimationOption( option ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8334 return orig.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8335 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8336 var args = _normalizeArguments.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8337 args.mode = "hide";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8338 return this.effect.call( this, args );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8339 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8340 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8341 })( $.fn.hide ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8342
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8343 toggle: (function( orig ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8344 return function( option ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8345 if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8346 return orig.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8347 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8348 var args = _normalizeArguments.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8349 args.mode = "toggle";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8350 return this.effect.call( this, args );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8351 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8352 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8353 })( $.fn.toggle ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8354
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8355 // helper functions
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8356 cssUnit: function(key) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8357 var style = this.css( key ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8358 val = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8359
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8360 $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8361 if ( style.indexOf( unit ) > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8362 val = [ parseFloat( style ), unit ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8363 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8364 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8365 return val;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8366 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8367 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8368
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8369 })();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8370
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8371 /******************************************************************************/
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8372 /*********************************** EASING ***********************************/
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8373 /******************************************************************************/
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8374
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8375 (function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8376
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8377 // based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8378
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8379 var baseEasings = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8380
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8381 $.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8382 baseEasings[ name ] = function( p ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8383 return Math.pow( p, i + 2 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8384 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8385 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8386
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8387 $.extend( baseEasings, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8388 Sine: function ( p ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8389 return 1 - Math.cos( p * Math.PI / 2 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8390 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8391 Circ: function ( p ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8392 return 1 - Math.sqrt( 1 - p * p );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8393 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8394 Elastic: function( p ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8395 return p === 0 || p === 1 ? p :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8396 -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8397 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8398 Back: function( p ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8399 return p * p * ( 3 * p - 2 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8400 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8401 Bounce: function ( p ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8402 var pow2,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8403 bounce = 4;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8404
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8405 while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8406 return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8407 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8408 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8409
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8410 $.each( baseEasings, function( name, easeIn ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8411 $.easing[ "easeIn" + name ] = easeIn;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8412 $.easing[ "easeOut" + name ] = function( p ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8413 return 1 - easeIn( 1 - p );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8414 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8415 $.easing[ "easeInOut" + name ] = function( p ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8416 return p < 0.5 ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8417 easeIn( p * 2 ) / 2 :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8418 1 - easeIn( p * -2 + 2 ) / 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8419 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8420 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8421
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8422 })();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8423
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8424 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8425 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8426
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8427 var rvertical = /up|down|vertical/,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8428 rpositivemotion = /up|left|vertical|horizontal/;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8429
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8430 $.effects.effect.blind = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8431 // Create element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8432 var el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8433 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8434 mode = $.effects.setMode( el, o.mode || "hide" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8435 direction = o.direction || "up",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8436 vertical = rvertical.test( direction ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8437 ref = vertical ? "height" : "width",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8438 ref2 = vertical ? "top" : "left",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8439 motion = rpositivemotion.test( direction ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8440 animation = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8441 show = mode === "show",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8442 wrapper, distance, margin;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8443
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8444 // if already wrapped, the wrapper's properties are my property. #6245
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8445 if ( el.parent().is( ".ui-effects-wrapper" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8446 $.effects.save( el.parent(), props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8447 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8448 $.effects.save( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8449 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8450 el.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8451 wrapper = $.effects.createWrapper( el ).css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8452 overflow: "hidden"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8453 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8454
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8455 distance = wrapper[ ref ]();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8456 margin = parseFloat( wrapper.css( ref2 ) ) || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8457
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8458 animation[ ref ] = show ? distance : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8459 if ( !motion ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8460 el
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8461 .css( vertical ? "bottom" : "right", 0 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8462 .css( vertical ? "top" : "left", "auto" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8463 .css({ position: "absolute" });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8464
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8465 animation[ ref2 ] = show ? margin : distance + margin;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8466 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8467
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8468 // start at 0 if we are showing
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8469 if ( show ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8470 wrapper.css( ref, 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8471 if ( ! motion ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8472 wrapper.css( ref2, margin + distance );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8473 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8474 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8475
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8476 // Animate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8477 wrapper.animate( animation, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8478 duration: o.duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8479 easing: o.easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8480 queue: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8481 complete: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8482 if ( mode === "hide" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8483 el.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8484 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8485 $.effects.restore( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8486 $.effects.removeWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8487 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8488 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8489 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8490
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8491 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8492
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8493 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8494 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8495
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8496 $.effects.effect.bounce = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8497 var el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8498 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8499
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8500 // defaults:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8501 mode = $.effects.setMode( el, o.mode || "effect" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8502 hide = mode === "hide",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8503 show = mode === "show",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8504 direction = o.direction || "up",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8505 distance = o.distance,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8506 times = o.times || 5,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8507
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8508 // number of internal animations
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8509 anims = times * 2 + ( show || hide ? 1 : 0 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8510 speed = o.duration / anims,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8511 easing = o.easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8512
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8513 // utility:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8514 ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8515 motion = ( direction === "up" || direction === "left" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8516 i,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8517 upAnim,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8518 downAnim,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8519
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8520 // we will need to re-assemble the queue to stack our animations in place
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8521 queue = el.queue(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8522 queuelen = queue.length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8523
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8524 // Avoid touching opacity to prevent clearType and PNG issues in IE
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8525 if ( show || hide ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8526 props.push( "opacity" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8527 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8528
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8529 $.effects.save( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8530 el.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8531 $.effects.createWrapper( el ); // Create Wrapper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8532
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8533 // default distance for the BIGGEST bounce is the outer Distance / 3
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8534 if ( !distance ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8535 distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8536 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8537
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8538 if ( show ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8539 downAnim = { opacity: 1 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8540 downAnim[ ref ] = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8541
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8542 // if we are showing, force opacity 0 and set the initial position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8543 // then do the "first" animation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8544 el.css( "opacity", 0 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8545 .css( ref, motion ? -distance * 2 : distance * 2 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8546 .animate( downAnim, speed, easing );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8547 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8548
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8549 // start at the smallest distance if we are hiding
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8550 if ( hide ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8551 distance = distance / Math.pow( 2, times - 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8552 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8553
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8554 downAnim = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8555 downAnim[ ref ] = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8556 // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8557 for ( i = 0; i < times; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8558 upAnim = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8559 upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8560
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8561 el.animate( upAnim, speed, easing )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8562 .animate( downAnim, speed, easing );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8563
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8564 distance = hide ? distance * 2 : distance / 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8565 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8566
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8567 // Last Bounce when Hiding
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8568 if ( hide ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8569 upAnim = { opacity: 0 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8570 upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8571
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8572 el.animate( upAnim, speed, easing );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8573 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8574
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8575 el.queue(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8576 if ( hide ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8577 el.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8578 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8579 $.effects.restore( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8580 $.effects.removeWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8581 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8582 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8583
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8584 // inject all the animations we just queued to be first in line (after "inprogress")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8585 if ( queuelen > 1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8586 queue.splice.apply( queue,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8587 [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8588 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8589 el.dequeue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8590
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8591 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8592
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8593 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8594 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8595
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8596 $.effects.effect.clip = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8597 // Create element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8598 var el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8599 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8600 mode = $.effects.setMode( el, o.mode || "hide" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8601 show = mode === "show",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8602 direction = o.direction || "vertical",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8603 vert = direction === "vertical",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8604 size = vert ? "height" : "width",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8605 position = vert ? "top" : "left",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8606 animation = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8607 wrapper, animate, distance;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8608
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8609 // Save & Show
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8610 $.effects.save( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8611 el.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8612
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8613 // Create Wrapper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8614 wrapper = $.effects.createWrapper( el ).css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8615 overflow: "hidden"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8616 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8617 animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8618 distance = animate[ size ]();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8619
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8620 // Shift
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8621 if ( show ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8622 animate.css( size, 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8623 animate.css( position, distance / 2 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8624 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8625
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8626 // Create Animation Object:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8627 animation[ size ] = show ? distance : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8628 animation[ position ] = show ? 0 : distance / 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8629
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8630 // Animate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8631 animate.animate( animation, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8632 queue: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8633 duration: o.duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8634 easing: o.easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8635 complete: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8636 if ( !show ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8637 el.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8638 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8639 $.effects.restore( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8640 $.effects.removeWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8641 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8642 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8643 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8644
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8645 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8646
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8647 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8648 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8649
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8650 $.effects.effect.drop = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8651
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8652 var el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8653 props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8654 mode = $.effects.setMode( el, o.mode || "hide" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8655 show = mode === "show",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8656 direction = o.direction || "left",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8657 ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8658 motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8659 animation = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8660 opacity: show ? 1 : 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8661 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8662 distance;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8663
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8664 // Adjust
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8665 $.effects.save( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8666 el.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8667 $.effects.createWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8668
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8669 distance = o.distance || el[ ref === "top" ? "outerHeight": "outerWidth" ]( true ) / 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8670
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8671 if ( show ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8672 el
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8673 .css( "opacity", 0 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8674 .css( ref, motion === "pos" ? -distance : distance );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8675 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8676
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8677 // Animation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8678 animation[ ref ] = ( show ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8679 ( motion === "pos" ? "+=" : "-=" ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8680 ( motion === "pos" ? "-=" : "+=" ) ) +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8681 distance;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8682
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8683 // Animate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8684 el.animate( animation, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8685 queue: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8686 duration: o.duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8687 easing: o.easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8688 complete: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8689 if ( mode === "hide" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8690 el.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8691 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8692 $.effects.restore( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8693 $.effects.removeWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8694 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8695 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8696 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8697 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8698
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8699 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8700 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8701
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8702 $.effects.effect.explode = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8703
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8704 var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8705 cells = rows,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8706 el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8707 mode = $.effects.setMode( el, o.mode || "hide" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8708 show = mode === "show",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8709
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8710 // show and then visibility:hidden the element before calculating offset
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8711 offset = el.show().css( "visibility", "hidden" ).offset(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8712
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8713 // width and height of a piece
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8714 width = Math.ceil( el.outerWidth() / cells ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8715 height = Math.ceil( el.outerHeight() / rows ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8716 pieces = [],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8717
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8718 // loop
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8719 i, j, left, top, mx, my;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8720
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8721 // children animate complete:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8722 function childComplete() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8723 pieces.push( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8724 if ( pieces.length === rows * cells ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8725 animComplete();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8726 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8727 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8728
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8729 // clone the element for each row and cell.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8730 for( i = 0; i < rows ; i++ ) { // ===>
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8731 top = offset.top + i * height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8732 my = i - ( rows - 1 ) / 2 ;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8733
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8734 for( j = 0; j < cells ; j++ ) { // |||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8735 left = offset.left + j * width;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8736 mx = j - ( cells - 1 ) / 2 ;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8737
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8738 // Create a clone of the now hidden main element that will be absolute positioned
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8739 // within a wrapper div off the -left and -top equal to size of our pieces
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8740 el
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8741 .clone()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8742 .appendTo( "body" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8743 .wrap( "<div></div>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8744 .css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8745 position: "absolute",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8746 visibility: "visible",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8747 left: -j * width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8748 top: -i * height
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8749 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8750
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8751 // select the wrapper - make it overflow: hidden and absolute positioned based on
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8752 // where the original was located +left and +top equal to the size of pieces
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8753 .parent()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8754 .addClass( "ui-effects-explode" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8755 .css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8756 position: "absolute",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8757 overflow: "hidden",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8758 width: width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8759 height: height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8760 left: left + ( show ? mx * width : 0 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8761 top: top + ( show ? my * height : 0 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8762 opacity: show ? 0 : 1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8763 }).animate({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8764 left: left + ( show ? 0 : mx * width ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8765 top: top + ( show ? 0 : my * height ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8766 opacity: show ? 1 : 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8767 }, o.duration || 500, o.easing, childComplete );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8768 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8769 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8770
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8771 function animComplete() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8772 el.css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8773 visibility: "visible"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8774 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8775 $( pieces ).remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8776 if ( !show ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8777 el.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8778 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8779 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8780 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8781 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8782
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8783 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8784 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8785
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8786 $.effects.effect.fade = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8787 var el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8788 mode = $.effects.setMode( el, o.mode || "toggle" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8789
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8790 el.animate({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8791 opacity: mode
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8792 }, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8793 queue: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8794 duration: o.duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8795 easing: o.easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8796 complete: done
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8797 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8798 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8799
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8800 })( jQuery );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8801 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8802
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8803 $.effects.effect.fold = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8804
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8805 // Create element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8806 var el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8807 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8808 mode = $.effects.setMode( el, o.mode || "hide" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8809 show = mode === "show",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8810 hide = mode === "hide",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8811 size = o.size || 15,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8812 percent = /([0-9]+)%/.exec( size ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8813 horizFirst = !!o.horizFirst,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8814 widthFirst = show !== horizFirst,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8815 ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8816 duration = o.duration / 2,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8817 wrapper, distance,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8818 animation1 = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8819 animation2 = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8820
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8821 $.effects.save( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8822 el.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8823
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8824 // Create Wrapper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8825 wrapper = $.effects.createWrapper( el ).css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8826 overflow: "hidden"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8827 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8828 distance = widthFirst ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8829 [ wrapper.width(), wrapper.height() ] :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8830 [ wrapper.height(), wrapper.width() ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8831
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8832 if ( percent ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8833 size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8834 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8835 if ( show ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8836 wrapper.css( horizFirst ? {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8837 height: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8838 width: size
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8839 } : {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8840 height: size,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8841 width: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8842 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8843 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8844
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8845 // Animation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8846 animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8847 animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8848
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8849 // Animate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8850 wrapper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8851 .animate( animation1, duration, o.easing )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8852 .animate( animation2, duration, o.easing, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8853 if ( hide ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8854 el.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8855 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8856 $.effects.restore( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8857 $.effects.removeWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8858 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8859 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8860
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8861 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8862
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8863 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8864 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8865
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8866 $.effects.effect.highlight = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8867 var elem = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8868 props = [ "backgroundImage", "backgroundColor", "opacity" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8869 mode = $.effects.setMode( elem, o.mode || "show" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8870 animation = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8871 backgroundColor: elem.css( "backgroundColor" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8872 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8873
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8874 if (mode === "hide") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8875 animation.opacity = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8876 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8877
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8878 $.effects.save( elem, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8879
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8880 elem
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8881 .show()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8882 .css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8883 backgroundImage: "none",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8884 backgroundColor: o.color || "#ffff99"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8885 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8886 .animate( animation, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8887 queue: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8888 duration: o.duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8889 easing: o.easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8890 complete: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8891 if ( mode === "hide" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8892 elem.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8893 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8894 $.effects.restore( elem, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8895 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8896 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8897 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8898 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8899
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8900 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8901 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8902
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8903 $.effects.effect.pulsate = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8904 var elem = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8905 mode = $.effects.setMode( elem, o.mode || "show" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8906 show = mode === "show",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8907 hide = mode === "hide",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8908 showhide = ( show || mode === "hide" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8909
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8910 // showing or hiding leaves of the "last" animation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8911 anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8912 duration = o.duration / anims,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8913 animateTo = 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8914 queue = elem.queue(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8915 queuelen = queue.length,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8916 i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8917
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8918 if ( show || !elem.is(":visible")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8919 elem.css( "opacity", 0 ).show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8920 animateTo = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8921 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8922
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8923 // anims - 1 opacity "toggles"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8924 for ( i = 1; i < anims; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8925 elem.animate({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8926 opacity: animateTo
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8927 }, duration, o.easing );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8928 animateTo = 1 - animateTo;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8929 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8930
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8931 elem.animate({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8932 opacity: animateTo
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8933 }, duration, o.easing);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8934
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8935 elem.queue(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8936 if ( hide ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8937 elem.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8938 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8939 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8940 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8941
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8942 // We just queued up "anims" animations, we need to put them next in the queue
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8943 if ( queuelen > 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8944 queue.splice.apply( queue,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8945 [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8946 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8947 elem.dequeue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8948 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8949
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8950 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8951 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8952
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8953 $.effects.effect.puff = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8954 var elem = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8955 mode = $.effects.setMode( elem, o.mode || "hide" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8956 hide = mode === "hide",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8957 percent = parseInt( o.percent, 10 ) || 150,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8958 factor = percent / 100,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8959 original = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8960 height: elem.height(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8961 width: elem.width(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8962 outerHeight: elem.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8963 outerWidth: elem.outerWidth()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8964 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8965
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8966 $.extend( o, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8967 effect: "scale",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8968 queue: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8969 fade: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8970 mode: mode,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8971 complete: done,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8972 percent: hide ? percent : 100,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8973 from: hide ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8974 original :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8975 {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8976 height: original.height * factor,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8977 width: original.width * factor,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8978 outerHeight: original.outerHeight * factor,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8979 outerWidth: original.outerWidth * factor
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8980 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8981 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8982
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8983 elem.effect( o );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8984 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8985
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8986 $.effects.effect.scale = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8987
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8988 // Create element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8989 var el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8990 options = $.extend( true, {}, o ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8991 mode = $.effects.setMode( el, o.mode || "effect" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8992 percent = parseInt( o.percent, 10 ) ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8993 ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8994 direction = o.direction || "both",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8995 origin = o.origin,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8996 original = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8997 height: el.height(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8998 width: el.width(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
8999 outerHeight: el.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9000 outerWidth: el.outerWidth()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9001 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9002 factor = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9003 y: direction !== "horizontal" ? (percent / 100) : 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9004 x: direction !== "vertical" ? (percent / 100) : 1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9005 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9006
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9007 // We are going to pass this effect to the size effect:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9008 options.effect = "size";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9009 options.queue = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9010 options.complete = done;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9011
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9012 // Set default origin and restore for show/hide
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9013 if ( mode !== "effect" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9014 options.origin = origin || ["middle","center"];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9015 options.restore = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9016 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9017
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9018 options.from = o.from || ( mode === "show" ? {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9019 height: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9020 width: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9021 outerHeight: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9022 outerWidth: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9023 } : original );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9024 options.to = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9025 height: original.height * factor.y,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9026 width: original.width * factor.x,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9027 outerHeight: original.outerHeight * factor.y,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9028 outerWidth: original.outerWidth * factor.x
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9029 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9030
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9031 // Fade option to support puff
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9032 if ( options.fade ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9033 if ( mode === "show" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9034 options.from.opacity = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9035 options.to.opacity = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9036 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9037 if ( mode === "hide" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9038 options.from.opacity = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9039 options.to.opacity = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9040 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9041 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9042
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9043 // Animate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9044 el.effect( options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9045
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9046 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9047
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9048 $.effects.effect.size = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9049
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9050 // Create element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9051 var original, baseline, factor,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9052 el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9053 props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9054
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9055 // Always restore
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9056 props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9057
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9058 // Copy for children
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9059 props2 = [ "width", "height", "overflow" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9060 cProps = [ "fontSize" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9061 vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9062 hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9063
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9064 // Set options
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9065 mode = $.effects.setMode( el, o.mode || "effect" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9066 restore = o.restore || mode !== "effect",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9067 scale = o.scale || "both",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9068 origin = o.origin || [ "middle", "center" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9069 position = el.css( "position" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9070 props = restore ? props0 : props1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9071 zero = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9072 height: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9073 width: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9074 outerHeight: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9075 outerWidth: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9076 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9077
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9078 if ( mode === "show" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9079 el.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9080 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9081 original = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9082 height: el.height(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9083 width: el.width(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9084 outerHeight: el.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9085 outerWidth: el.outerWidth()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9086 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9087
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9088 if ( o.mode === "toggle" && mode === "show" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9089 el.from = o.to || zero;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9090 el.to = o.from || original;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9091 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9092 el.from = o.from || ( mode === "show" ? zero : original );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9093 el.to = o.to || ( mode === "hide" ? zero : original );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9094 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9095
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9096 // Set scaling factor
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9097 factor = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9098 from: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9099 y: el.from.height / original.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9100 x: el.from.width / original.width
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9101 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9102 to: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9103 y: el.to.height / original.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9104 x: el.to.width / original.width
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9105 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9106 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9107
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9108 // Scale the css box
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9109 if ( scale === "box" || scale === "both" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9110
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9111 // Vertical props scaling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9112 if ( factor.from.y !== factor.to.y ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9113 props = props.concat( vProps );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9114 el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9115 el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9116 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9117
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9118 // Horizontal props scaling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9119 if ( factor.from.x !== factor.to.x ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9120 props = props.concat( hProps );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9121 el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9122 el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9123 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9124 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9125
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9126 // Scale the content
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9127 if ( scale === "content" || scale === "both" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9128
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9129 // Vertical props scaling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9130 if ( factor.from.y !== factor.to.y ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9131 props = props.concat( cProps ).concat( props2 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9132 el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9133 el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9134 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9135 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9136
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9137 $.effects.save( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9138 el.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9139 $.effects.createWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9140 el.css( "overflow", "hidden" ).css( el.from );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9141
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9142 // Adjust
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9143 if (origin) { // Calculate baseline shifts
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9144 baseline = $.effects.getBaseline( origin, original );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9145 el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9146 el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9147 el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9148 el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9149 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9150 el.css( el.from ); // set top & left
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9151
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9152 // Animate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9153 if ( scale === "content" || scale === "both" ) { // Scale the children
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9154
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9155 // Add margins/font-size
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9156 vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9157 hProps = hProps.concat([ "marginLeft", "marginRight" ]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9158 props2 = props0.concat(vProps).concat(hProps);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9159
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9160 el.find( "*[width]" ).each( function(){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9161 var child = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9162 c_original = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9163 height: child.height(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9164 width: child.width(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9165 outerHeight: child.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9166 outerWidth: child.outerWidth()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9167 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9168 if (restore) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9169 $.effects.save(child, props2);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9170 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9171
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9172 child.from = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9173 height: c_original.height * factor.from.y,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9174 width: c_original.width * factor.from.x,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9175 outerHeight: c_original.outerHeight * factor.from.y,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9176 outerWidth: c_original.outerWidth * factor.from.x
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9177 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9178 child.to = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9179 height: c_original.height * factor.to.y,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9180 width: c_original.width * factor.to.x,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9181 outerHeight: c_original.height * factor.to.y,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9182 outerWidth: c_original.width * factor.to.x
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9183 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9184
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9185 // Vertical props scaling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9186 if ( factor.from.y !== factor.to.y ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9187 child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9188 child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9189 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9190
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9191 // Horizontal props scaling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9192 if ( factor.from.x !== factor.to.x ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9193 child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9194 child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9195 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9196
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9197 // Animate children
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9198 child.css( child.from );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9199 child.animate( child.to, o.duration, o.easing, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9200
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9201 // Restore children
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9202 if ( restore ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9203 $.effects.restore( child, props2 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9204 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9205 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9206 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9207 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9208
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9209 // Animate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9210 el.animate( el.to, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9211 queue: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9212 duration: o.duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9213 easing: o.easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9214 complete: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9215 if ( el.to.opacity === 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9216 el.css( "opacity", el.from.opacity );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9217 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9218 if( mode === "hide" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9219 el.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9220 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9221 $.effects.restore( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9222 if ( !restore ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9223
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9224 // we need to calculate our new positioning based on the scaling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9225 if ( position === "static" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9226 el.css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9227 position: "relative",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9228 top: el.to.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9229 left: el.to.left
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9230 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9231 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9232 $.each([ "top", "left" ], function( idx, pos ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9233 el.css( pos, function( _, str ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9234 var val = parseInt( str, 10 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9235 toRef = idx ? el.to.left : el.to.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9236
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9237 // if original was "auto", recalculate the new value from wrapper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9238 if ( str === "auto" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9239 return toRef + "px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9240 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9241
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9242 return val + toRef + "px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9243 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9244 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9245 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9246 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9247
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9248 $.effects.removeWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9249 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9250 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9251 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9252
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9253 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9254
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9255 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9256 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9257
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9258 $.effects.effect.shake = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9259
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9260 var el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9261 props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9262 mode = $.effects.setMode( el, o.mode || "effect" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9263 direction = o.direction || "left",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9264 distance = o.distance || 20,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9265 times = o.times || 3,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9266 anims = times * 2 + 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9267 speed = Math.round(o.duration/anims),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9268 ref = (direction === "up" || direction === "down") ? "top" : "left",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9269 positiveMotion = (direction === "up" || direction === "left"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9270 animation = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9271 animation1 = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9272 animation2 = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9273 i,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9274
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9275 // we will need to re-assemble the queue to stack our animations in place
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9276 queue = el.queue(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9277 queuelen = queue.length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9278
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9279 $.effects.save( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9280 el.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9281 $.effects.createWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9282
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9283 // Animation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9284 animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9285 animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9286 animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9287
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9288 // Animate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9289 el.animate( animation, speed, o.easing );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9290
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9291 // Shakes
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9292 for ( i = 1; i < times; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9293 el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9294 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9295 el
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9296 .animate( animation1, speed, o.easing )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9297 .animate( animation, speed / 2, o.easing )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9298 .queue(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9299 if ( mode === "hide" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9300 el.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9301 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9302 $.effects.restore( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9303 $.effects.removeWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9304 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9305 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9306
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9307 // inject all the animations we just queued to be first in line (after "inprogress")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9308 if ( queuelen > 1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9309 queue.splice.apply( queue,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9310 [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9311 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9312 el.dequeue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9313
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9314 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9315
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9316 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9317 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9318
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9319 $.effects.effect.slide = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9320
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9321 // Create element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9322 var el = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9323 props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9324 mode = $.effects.setMode( el, o.mode || "show" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9325 show = mode === "show",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9326 direction = o.direction || "left",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9327 ref = (direction === "up" || direction === "down") ? "top" : "left",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9328 positiveMotion = (direction === "up" || direction === "left"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9329 distance,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9330 animation = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9331
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9332 // Adjust
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9333 $.effects.save( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9334 el.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9335 distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9336
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9337 $.effects.createWrapper( el ).css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9338 overflow: "hidden"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9339 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9340
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9341 if ( show ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9342 el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9343 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9344
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9345 // Animation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9346 animation[ ref ] = ( show ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9347 ( positiveMotion ? "+=" : "-=") :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9348 ( positiveMotion ? "-=" : "+=")) +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9349 distance;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9350
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9351 // Animate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9352 el.animate( animation, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9353 queue: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9354 duration: o.duration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9355 easing: o.easing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9356 complete: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9357 if ( mode === "hide" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9358 el.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9359 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9360 $.effects.restore( el, props );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9361 $.effects.removeWrapper( el );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9362 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9363 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9364 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9365 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9366
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9367 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9368 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9369
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9370 $.effects.effect.transfer = function( o, done ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9371 var elem = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9372 target = $( o.to ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9373 targetFixed = target.css( "position" ) === "fixed",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9374 body = $("body"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9375 fixTop = targetFixed ? body.scrollTop() : 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9376 fixLeft = targetFixed ? body.scrollLeft() : 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9377 endPosition = target.offset(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9378 animation = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9379 top: endPosition.top - fixTop ,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9380 left: endPosition.left - fixLeft ,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9381 height: target.innerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9382 width: target.innerWidth()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9383 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9384 startPosition = elem.offset(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9385 transfer = $( "<div class='ui-effects-transfer'></div>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9386 .appendTo( document.body )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9387 .addClass( o.className )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9388 .css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9389 top: startPosition.top - fixTop ,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9390 left: startPosition.left - fixLeft ,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9391 height: elem.innerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9392 width: elem.innerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9393 position: targetFixed ? "fixed" : "absolute"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9394 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9395 .animate( animation, o.duration, o.easing, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9396 transfer.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9397 done();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9398 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9399 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9400
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9401 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9402 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9403
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9404 $.widget( "ui.menu", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9405 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9406 defaultElement: "<ul>",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9407 delay: 300,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9408 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9409 icons: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9410 submenu: "ui-icon-carat-1-e"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9411 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9412 menus: "ul",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9413 position: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9414 my: "left top",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9415 at: "right top"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9416 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9417 role: "menu",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9418
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9419 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9420 blur: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9421 focus: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9422 select: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9423 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9424
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9425 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9426 this.activeMenu = this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9427 // flag used to prevent firing of the click handler
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9428 // as the event bubbles up through nested menus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9429 this.mouseHandled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9430 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9431 .uniqueId()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9432 .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9433 .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9434 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9435 role: this.options.role,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9436 tabIndex: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9437 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9438 // need to catch all clicks on disabled menu
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9439 // not possible through _on
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9440 .bind( "click" + this.eventNamespace, $.proxy(function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9441 if ( this.options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9442 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9443 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9444 }, this ));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9445
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9446 if ( this.options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9447 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9448 .addClass( "ui-state-disabled" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9449 .attr( "aria-disabled", "true" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9450 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9451
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9452 this._on({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9453 // Prevent focus from sticking to links inside menu after clicking
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9454 // them (focus should always stay on UL during navigation).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9455 "mousedown .ui-menu-item > a": function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9456 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9457 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9458 "click .ui-state-disabled > a": function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9459 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9460 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9461 "click .ui-menu-item:has(a)": function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9462 var target = $( event.target ).closest( ".ui-menu-item" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9463 if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9464 this.select( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9465
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9466 // Only set the mouseHandled flag if the event will bubble, see #9469.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9467 if ( !event.isPropagationStopped() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9468 this.mouseHandled = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9469 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9470
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9471 // Open submenu on click
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9472 if ( target.has( ".ui-menu" ).length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9473 this.expand( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9474 } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9475
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9476 // Redirect focus to the menu
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9477 this.element.trigger( "focus", [ true ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9478
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9479 // If the active item is on the top level, let it stay active.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9480 // Otherwise, blur the active item since it is no longer visible.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9481 if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9482 clearTimeout( this.timer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9483 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9484 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9485 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9486 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9487 "mouseenter .ui-menu-item": function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9488 var target = $( event.currentTarget );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9489 // Remove ui-state-active class from siblings of the newly focused menu item
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9490 // to avoid a jump caused by adjacent elements both having a class with a border
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9491 target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9492 this.focus( event, target );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9493 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9494 mouseleave: "collapseAll",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9495 "mouseleave .ui-menu": "collapseAll",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9496 focus: function( event, keepActiveItem ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9497 // If there's already an active item, keep it active
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9498 // If not, activate the first item
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9499 var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9500
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9501 if ( !keepActiveItem ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9502 this.focus( event, item );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9503 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9504 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9505 blur: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9506 this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9507 if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9508 this.collapseAll( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9509 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9510 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9511 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9512 keydown: "_keydown"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9513 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9514
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9515 this.refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9516
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9517 // Clicks outside of a menu collapse any open menus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9518 this._on( this.document, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9519 click: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9520 if ( !$( event.target ).closest( ".ui-menu" ).length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9521 this.collapseAll( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9522 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9523
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9524 // Reset the mouseHandled flag
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9525 this.mouseHandled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9526 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9527 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9528 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9529
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9530 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9531 // Destroy (sub)menus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9532 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9533 .removeAttr( "aria-activedescendant" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9534 .find( ".ui-menu" ).addBack()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9535 .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9536 .removeAttr( "role" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9537 .removeAttr( "tabIndex" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9538 .removeAttr( "aria-labelledby" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9539 .removeAttr( "aria-expanded" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9540 .removeAttr( "aria-hidden" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9541 .removeAttr( "aria-disabled" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9542 .removeUniqueId()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9543 .show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9544
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9545 // Destroy menu items
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9546 this.element.find( ".ui-menu-item" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9547 .removeClass( "ui-menu-item" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9548 .removeAttr( "role" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9549 .removeAttr( "aria-disabled" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9550 .children( "a" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9551 .removeUniqueId()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9552 .removeClass( "ui-corner-all ui-state-hover" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9553 .removeAttr( "tabIndex" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9554 .removeAttr( "role" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9555 .removeAttr( "aria-haspopup" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9556 .children().each( function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9557 var elem = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9558 if ( elem.data( "ui-menu-submenu-carat" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9559 elem.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9560 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9561 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9562
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9563 // Destroy menu dividers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9564 this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9565 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9566
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9567 _keydown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9568 var match, prev, character, skip, regex,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9569 preventDefault = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9570
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9571 function escape( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9572 return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9573 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9574
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9575 switch ( event.keyCode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9576 case $.ui.keyCode.PAGE_UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9577 this.previousPage( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9578 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9579 case $.ui.keyCode.PAGE_DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9580 this.nextPage( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9581 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9582 case $.ui.keyCode.HOME:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9583 this._move( "first", "first", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9584 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9585 case $.ui.keyCode.END:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9586 this._move( "last", "last", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9587 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9588 case $.ui.keyCode.UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9589 this.previous( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9590 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9591 case $.ui.keyCode.DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9592 this.next( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9593 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9594 case $.ui.keyCode.LEFT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9595 this.collapse( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9596 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9597 case $.ui.keyCode.RIGHT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9598 if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9599 this.expand( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9600 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9601 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9602 case $.ui.keyCode.ENTER:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9603 case $.ui.keyCode.SPACE:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9604 this._activate( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9605 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9606 case $.ui.keyCode.ESCAPE:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9607 this.collapse( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9608 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9609 default:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9610 preventDefault = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9611 prev = this.previousFilter || "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9612 character = String.fromCharCode( event.keyCode );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9613 skip = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9614
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9615 clearTimeout( this.filterTimer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9616
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9617 if ( character === prev ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9618 skip = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9619 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9620 character = prev + character;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9621 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9622
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9623 regex = new RegExp( "^" + escape( character ), "i" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9624 match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9625 return regex.test( $( this ).children( "a" ).text() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9626 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9627 match = skip && match.index( this.active.next() ) !== -1 ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9628 this.active.nextAll( ".ui-menu-item" ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9629 match;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9630
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9631 // If no matches on the current filter, reset to the last character pressed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9632 // to move down the menu to the first item that starts with that character
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9633 if ( !match.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9634 character = String.fromCharCode( event.keyCode );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9635 regex = new RegExp( "^" + escape( character ), "i" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9636 match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9637 return regex.test( $( this ).children( "a" ).text() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9638 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9639 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9640
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9641 if ( match.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9642 this.focus( event, match );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9643 if ( match.length > 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9644 this.previousFilter = character;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9645 this.filterTimer = this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9646 delete this.previousFilter;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9647 }, 1000 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9648 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9649 delete this.previousFilter;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9650 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9651 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9652 delete this.previousFilter;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9653 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9654 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9655
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9656 if ( preventDefault ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9657 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9658 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9659 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9660
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9661 _activate: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9662 if ( !this.active.is( ".ui-state-disabled" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9663 if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9664 this.expand( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9665 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9666 this.select( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9667 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9668 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9669 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9670
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9671 refresh: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9672 var menus,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9673 icon = this.options.icons.submenu,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9674 submenus = this.element.find( this.options.menus );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9675
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9676 this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9677
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9678 // Initialize nested menus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9679 submenus.filter( ":not(.ui-menu)" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9680 .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9681 .hide()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9682 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9683 role: this.options.role,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9684 "aria-hidden": "true",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9685 "aria-expanded": "false"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9686 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9687 .each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9688 var menu = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9689 item = menu.prev( "a" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9690 submenuCarat = $( "<span>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9691 .addClass( "ui-menu-icon ui-icon " + icon )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9692 .data( "ui-menu-submenu-carat", true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9693
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9694 item
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9695 .attr( "aria-haspopup", "true" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9696 .prepend( submenuCarat );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9697 menu.attr( "aria-labelledby", item.attr( "id" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9698 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9699
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9700 menus = submenus.add( this.element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9701
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9702 // Don't refresh list items that are already adapted
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9703 menus.children( ":not(.ui-menu-item):has(a)" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9704 .addClass( "ui-menu-item" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9705 .attr( "role", "presentation" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9706 .children( "a" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9707 .uniqueId()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9708 .addClass( "ui-corner-all" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9709 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9710 tabIndex: -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9711 role: this._itemRole()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9712 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9713
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9714 // Initialize unlinked menu-items containing spaces and/or dashes only as dividers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9715 menus.children( ":not(.ui-menu-item)" ).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9716 var item = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9717 // hyphen, em dash, en dash
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9718 if ( !/[^\-\u2014\u2013\s]/.test( item.text() ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9719 item.addClass( "ui-widget-content ui-menu-divider" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9720 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9721 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9722
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9723 // Add aria-disabled attribute to any disabled menu item
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9724 menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9725
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9726 // If the active item has been removed, blur the menu
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9727 if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9728 this.blur();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9729 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9730 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9731
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9732 _itemRole: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9733 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9734 menu: "menuitem",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9735 listbox: "option"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9736 }[ this.options.role ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9737 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9738
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9739 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9740 if ( key === "icons" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9741 this.element.find( ".ui-menu-icon" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9742 .removeClass( this.options.icons.submenu )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9743 .addClass( value.submenu );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9744 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9745 this._super( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9746 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9747
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9748 focus: function( event, item ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9749 var nested, focused;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9750 this.blur( event, event && event.type === "focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9751
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9752 this._scrollIntoView( item );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9753
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9754 this.active = item.first();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9755 focused = this.active.children( "a" ).addClass( "ui-state-focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9756 // Only update aria-activedescendant if there's a role
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9757 // otherwise we assume focus is managed elsewhere
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9758 if ( this.options.role ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9759 this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9760 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9761
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9762 // Highlight active parent menu item, if any
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9763 this.active
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9764 .parent()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9765 .closest( ".ui-menu-item" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9766 .children( "a:first" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9767 .addClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9768
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9769 if ( event && event.type === "keydown" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9770 this._close();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9771 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9772 this.timer = this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9773 this._close();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9774 }, this.delay );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9775 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9776
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9777 nested = item.children( ".ui-menu" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9778 if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9779 this._startOpening(nested);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9780 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9781 this.activeMenu = item.parent();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9782
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9783 this._trigger( "focus", event, { item: item } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9784 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9785
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9786 _scrollIntoView: function( item ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9787 var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9788 if ( this._hasScroll() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9789 borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9790 paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9791 offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9792 scroll = this.activeMenu.scrollTop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9793 elementHeight = this.activeMenu.height();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9794 itemHeight = item.height();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9795
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9796 if ( offset < 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9797 this.activeMenu.scrollTop( scroll + offset );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9798 } else if ( offset + itemHeight > elementHeight ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9799 this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9800 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9801 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9802 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9803
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9804 blur: function( event, fromFocus ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9805 if ( !fromFocus ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9806 clearTimeout( this.timer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9807 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9808
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9809 if ( !this.active ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9810 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9811 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9812
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9813 this.active.children( "a" ).removeClass( "ui-state-focus" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9814 this.active = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9815
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9816 this._trigger( "blur", event, { item: this.active } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9817 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9818
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9819 _startOpening: function( submenu ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9820 clearTimeout( this.timer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9821
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9822 // Don't open if already open fixes a Firefox bug that caused a .5 pixel
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9823 // shift in the submenu position when mousing over the carat icon
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9824 if ( submenu.attr( "aria-hidden" ) !== "true" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9825 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9826 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9827
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9828 this.timer = this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9829 this._close();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9830 this._open( submenu );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9831 }, this.delay );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9832 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9833
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9834 _open: function( submenu ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9835 var position = $.extend({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9836 of: this.active
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9837 }, this.options.position );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9838
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9839 clearTimeout( this.timer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9840 this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9841 .hide()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9842 .attr( "aria-hidden", "true" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9843
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9844 submenu
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9845 .show()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9846 .removeAttr( "aria-hidden" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9847 .attr( "aria-expanded", "true" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9848 .position( position );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9849 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9850
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9851 collapseAll: function( event, all ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9852 clearTimeout( this.timer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9853 this.timer = this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9854 // If we were passed an event, look for the submenu that contains the event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9855 var currentMenu = all ? this.element :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9856 $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9857
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9858 // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9859 if ( !currentMenu.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9860 currentMenu = this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9861 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9862
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9863 this._close( currentMenu );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9864
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9865 this.blur( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9866 this.activeMenu = currentMenu;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9867 }, this.delay );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9868 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9869
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9870 // With no arguments, closes the currently active menu - if nothing is active
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9871 // it closes all menus. If passed an argument, it will search for menus BELOW
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9872 _close: function( startMenu ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9873 if ( !startMenu ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9874 startMenu = this.active ? this.active.parent() : this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9875 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9876
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9877 startMenu
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9878 .find( ".ui-menu" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9879 .hide()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9880 .attr( "aria-hidden", "true" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9881 .attr( "aria-expanded", "false" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9882 .end()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9883 .find( "a.ui-state-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9884 .removeClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9885 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9886
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9887 collapse: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9888 var newItem = this.active &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9889 this.active.parent().closest( ".ui-menu-item", this.element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9890 if ( newItem && newItem.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9891 this._close();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9892 this.focus( event, newItem );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9893 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9894 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9895
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9896 expand: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9897 var newItem = this.active &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9898 this.active
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9899 .children( ".ui-menu " )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9900 .children( ".ui-menu-item" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9901 .first();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9902
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9903 if ( newItem && newItem.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9904 this._open( newItem.parent() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9905
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9906 // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9907 this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9908 this.focus( event, newItem );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9909 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9910 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9911 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9912
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9913 next: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9914 this._move( "next", "first", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9915 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9916
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9917 previous: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9918 this._move( "prev", "last", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9919 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9920
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9921 isFirstItem: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9922 return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9923 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9924
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9925 isLastItem: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9926 return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9927 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9928
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9929 _move: function( direction, filter, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9930 var next;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9931 if ( this.active ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9932 if ( direction === "first" || direction === "last" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9933 next = this.active
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9934 [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9935 .eq( -1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9936 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9937 next = this.active
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9938 [ direction + "All" ]( ".ui-menu-item" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9939 .eq( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9940 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9941 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9942 if ( !next || !next.length || !this.active ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9943 next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9944 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9945
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9946 this.focus( event, next );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9947 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9948
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9949 nextPage: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9950 var item, base, height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9951
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9952 if ( !this.active ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9953 this.next( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9954 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9955 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9956 if ( this.isLastItem() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9957 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9958 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9959 if ( this._hasScroll() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9960 base = this.active.offset().top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9961 height = this.element.height();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9962 this.active.nextAll( ".ui-menu-item" ).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9963 item = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9964 return item.offset().top - base - height < 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9965 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9966
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9967 this.focus( event, item );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9968 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9969 this.focus( event, this.activeMenu.children( ".ui-menu-item" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9970 [ !this.active ? "first" : "last" ]() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9971 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9972 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9973
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9974 previousPage: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9975 var item, base, height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9976 if ( !this.active ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9977 this.next( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9978 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9979 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9980 if ( this.isFirstItem() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9981 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9982 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9983 if ( this._hasScroll() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9984 base = this.active.offset().top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9985 height = this.element.height();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9986 this.active.prevAll( ".ui-menu-item" ).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9987 item = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9988 return item.offset().top - base + height > 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9989 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9990
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9991 this.focus( event, item );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9992 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9993 this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9994 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9995 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9996
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9997 _hasScroll: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9998 return this.element.outerHeight() < this.element.prop( "scrollHeight" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
9999 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10000
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10001 select: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10002 // TODO: It should never be possible to not have an active item at this
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10003 // point, but the tests don't trigger mouseenter before click.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10004 this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10005 var ui = { item: this.active };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10006 if ( !this.active.has( ".ui-menu" ).length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10007 this.collapseAll( event, true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10008 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10009 this._trigger( "select", event, ui );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10010 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10011 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10012
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10013 }( jQuery ));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10014 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10015
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10016 $.widget( "ui.progressbar", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10017 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10018 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10019 max: 100,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10020 value: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10021
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10022 change: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10023 complete: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10024 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10025
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10026 min: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10027
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10028 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10029 // Constrain initial value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10030 this.oldValue = this.options.value = this._constrainedValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10031
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10032 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10033 .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10034 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10035 // Only set static values, aria-valuenow and aria-valuemax are
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10036 // set inside _refreshValue()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10037 role: "progressbar",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10038 "aria-valuemin": this.min
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10039 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10040
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10041 this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10042 .appendTo( this.element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10043
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10044 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10045 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10046
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10047 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10048 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10049 .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10050 .removeAttr( "role" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10051 .removeAttr( "aria-valuemin" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10052 .removeAttr( "aria-valuemax" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10053 .removeAttr( "aria-valuenow" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10054
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10055 this.valueDiv.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10056 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10057
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10058 value: function( newValue ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10059 if ( newValue === undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10060 return this.options.value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10061 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10062
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10063 this.options.value = this._constrainedValue( newValue );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10064 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10065 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10066
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10067 _constrainedValue: function( newValue ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10068 if ( newValue === undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10069 newValue = this.options.value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10070 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10071
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10072 this.indeterminate = newValue === false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10073
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10074 // sanitize value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10075 if ( typeof newValue !== "number" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10076 newValue = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10077 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10078
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10079 return this.indeterminate ? false :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10080 Math.min( this.options.max, Math.max( this.min, newValue ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10081 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10082
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10083 _setOptions: function( options ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10084 // Ensure "value" option is set after other values (like max)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10085 var value = options.value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10086 delete options.value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10087
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10088 this._super( options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10089
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10090 this.options.value = this._constrainedValue( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10091 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10092 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10093
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10094 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10095 if ( key === "max" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10096 // Don't allow a max less than min
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10097 value = Math.max( this.min, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10098 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10099
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10100 this._super( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10101 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10102
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10103 _percentage: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10104 return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10105 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10106
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10107 _refreshValue: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10108 var value = this.options.value,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10109 percentage = this._percentage();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10110
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10111 this.valueDiv
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10112 .toggle( this.indeterminate || value > this.min )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10113 .toggleClass( "ui-corner-right", value === this.options.max )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10114 .width( percentage.toFixed(0) + "%" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10115
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10116 this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10117
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10118 if ( this.indeterminate ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10119 this.element.removeAttr( "aria-valuenow" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10120 if ( !this.overlayDiv ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10121 this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10122 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10123 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10124 this.element.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10125 "aria-valuemax": this.options.max,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10126 "aria-valuenow": value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10127 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10128 if ( this.overlayDiv ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10129 this.overlayDiv.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10130 this.overlayDiv = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10131 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10132 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10133
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10134 if ( this.oldValue !== value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10135 this.oldValue = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10136 this._trigger( "change" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10137 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10138 if ( value === this.options.max ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10139 this._trigger( "complete" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10140 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10141 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10142 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10143
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10144 })( jQuery );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10145 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10146
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10147 function num(v) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10148 return parseInt(v, 10) || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10149 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10150
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10151 function isNumber(value) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10152 return !isNaN(parseInt(value, 10));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10153 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10154
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10155 $.widget("ui.resizable", $.ui.mouse, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10156 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10157 widgetEventPrefix: "resize",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10158 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10159 alsoResize: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10160 animate: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10161 animateDuration: "slow",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10162 animateEasing: "swing",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10163 aspectRatio: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10164 autoHide: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10165 containment: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10166 ghost: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10167 grid: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10168 handles: "e,s,se",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10169 helper: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10170 maxHeight: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10171 maxWidth: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10172 minHeight: 10,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10173 minWidth: 10,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10174 // See #7960
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10175 zIndex: 90,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10176
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10177 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10178 resize: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10179 start: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10180 stop: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10181 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10182 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10183
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10184 var n, i, handle, axis, hname,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10185 that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10186 o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10187 this.element.addClass("ui-resizable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10188
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10189 $.extend(this, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10190 _aspectRatio: !!(o.aspectRatio),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10191 aspectRatio: o.aspectRatio,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10192 originalElement: this.element,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10193 _proportionallyResizeElements: [],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10194 _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10195 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10196
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10197 //Wrap the element if it cannot hold child nodes
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10198 if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10199
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10200 //Create a wrapper element and set the wrapper to the new current internal element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10201 this.element.wrap(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10202 $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10203 position: this.element.css("position"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10204 width: this.element.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10205 height: this.element.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10206 top: this.element.css("top"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10207 left: this.element.css("left")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10208 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10209 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10210
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10211 //Overwrite the original this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10212 this.element = this.element.parent().data(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10213 "ui-resizable", this.element.data("ui-resizable")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10214 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10215
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10216 this.elementIsWrapper = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10217
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10218 //Move margins to the wrapper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10219 this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10220 this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10221
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10222 //Prevent Safari textarea resize
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10223 this.originalResizeStyle = this.originalElement.css("resize");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10224 this.originalElement.css("resize", "none");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10225
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10226 //Push the actual element to our proportionallyResize internal array
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10227 this._proportionallyResizeElements.push(this.originalElement.css({ position: "static", zoom: 1, display: "block" }));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10228
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10229 // avoid IE jump (hard set the margin)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10230 this.originalElement.css({ margin: this.originalElement.css("margin") });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10231
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10232 // fix handlers offset
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10233 this._proportionallyResize();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10234
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10235 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10236
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10237 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" });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10238 if(this.handles.constructor === String) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10239
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10240 if ( this.handles === "all") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10241 this.handles = "n,e,s,w,se,sw,ne,nw";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10242 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10243
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10244 n = this.handles.split(",");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10245 this.handles = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10246
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10247 for(i = 0; i < n.length; i++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10248
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10249 handle = $.trim(n[i]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10250 hname = "ui-resizable-"+handle;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10251 axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10252
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10253 // Apply zIndex to all handles - see #7960
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10254 axis.css({ zIndex: o.zIndex });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10255
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10256 //TODO : What's going on here?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10257 if ("se" === handle) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10258 axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10259 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10260
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10261 //Insert into internal handles object and append to element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10262 this.handles[handle] = ".ui-resizable-"+handle;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10263 this.element.append(axis);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10264 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10265
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10266 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10267
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10268 this._renderAxis = function(target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10269
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10270 var i, axis, padPos, padWrapper;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10271
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10272 target = target || this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10273
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10274 for(i in this.handles) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10275
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10276 if(this.handles[i].constructor === String) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10277 this.handles[i] = $(this.handles[i], this.element).show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10278 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10279
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10280 //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10281 if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10282
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10283 axis = $(this.handles[i], this.element);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10284
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10285 //Checking the correct pad and border
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10286 padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10287
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10288 //The padding type i have to apply...
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10289 padPos = [ "padding",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10290 /ne|nw|n/.test(i) ? "Top" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10291 /se|sw|s/.test(i) ? "Bottom" :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10292 /^e$/.test(i) ? "Right" : "Left" ].join("");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10293
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10294 target.css(padPos, padWrapper);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10295
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10296 this._proportionallyResize();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10297
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10298 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10299
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10300 //TODO: What's that good for? There's not anything to be executed left
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10301 if(!$(this.handles[i]).length) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10302 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10303 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10304 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10305 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10306
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10307 //TODO: make renderAxis a prototype function
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10308 this._renderAxis(this.element);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10309
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10310 this._handles = $(".ui-resizable-handle", this.element)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10311 .disableSelection();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10312
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10313 //Matching axis name
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10314 this._handles.mouseover(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10315 if (!that.resizing) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10316 if (this.className) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10317 axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10318 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10319 //Axis, default = se
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10320 that.axis = axis && axis[1] ? axis[1] : "se";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10321 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10322 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10323
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10324 //If we want to auto hide the elements
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10325 if (o.autoHide) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10326 this._handles.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10327 $(this.element)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10328 .addClass("ui-resizable-autohide")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10329 .mouseenter(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10330 if (o.disabled) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10331 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10332 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10333 $(this).removeClass("ui-resizable-autohide");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10334 that._handles.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10335 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10336 .mouseleave(function(){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10337 if (o.disabled) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10338 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10339 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10340 if (!that.resizing) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10341 $(this).addClass("ui-resizable-autohide");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10342 that._handles.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10343 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10344 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10345 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10346
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10347 //Initialize the mouse interaction
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10348 this._mouseInit();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10349
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10350 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10351
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10352 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10353
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10354 this._mouseDestroy();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10355
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10356 var wrapper,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10357 _destroy = function(exp) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10358 $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10359 .removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10360 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10361
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10362 //TODO: Unwrap at same DOM position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10363 if (this.elementIsWrapper) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10364 _destroy(this.element);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10365 wrapper = this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10366 this.originalElement.css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10367 position: wrapper.css("position"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10368 width: wrapper.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10369 height: wrapper.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10370 top: wrapper.css("top"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10371 left: wrapper.css("left")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10372 }).insertAfter( wrapper );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10373 wrapper.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10374 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10375
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10376 this.originalElement.css("resize", this.originalResizeStyle);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10377 _destroy(this.originalElement);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10378
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10379 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10380 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10381
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10382 _mouseCapture: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10383 var i, handle,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10384 capture = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10385
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10386 for (i in this.handles) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10387 handle = $(this.handles[i])[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10388 if (handle === event.target || $.contains(handle, event.target)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10389 capture = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10390 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10391 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10392
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10393 return !this.options.disabled && capture;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10394 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10395
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10396 _mouseStart: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10397
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10398 var curleft, curtop, cursor,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10399 o = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10400 iniPos = this.element.position(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10401 el = this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10402
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10403 this.resizing = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10404
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10405 // bugfix for http://dev.jquery.com/ticket/1749
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10406 if ( (/absolute/).test( el.css("position") ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10407 el.css({ position: "absolute", top: el.css("top"), left: el.css("left") });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10408 } else if (el.is(".ui-draggable")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10409 el.css({ position: "absolute", top: iniPos.top, left: iniPos.left });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10410 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10411
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10412 this._renderProxy();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10413
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10414 curleft = num(this.helper.css("left"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10415 curtop = num(this.helper.css("top"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10416
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10417 if (o.containment) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10418 curleft += $(o.containment).scrollLeft() || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10419 curtop += $(o.containment).scrollTop() || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10420 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10421
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10422 //Store needed variables
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10423 this.offset = this.helper.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10424 this.position = { left: curleft, top: curtop };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10425 this.size = this._helper ? { width: this.helper.width(), height: this.helper.height() } : { width: el.width(), height: el.height() };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10426 this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10427 this.originalPosition = { left: curleft, top: curtop };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10428 this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10429 this.originalMousePosition = { left: event.pageX, top: event.pageY };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10430
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10431 //Aspect Ratio
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10432 this.aspectRatio = (typeof o.aspectRatio === "number") ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10433
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10434 cursor = $(".ui-resizable-" + this.axis).css("cursor");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10435 $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10436
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10437 el.addClass("ui-resizable-resizing");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10438 this._propagate("start", event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10439 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10440 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10441
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10442 _mouseDrag: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10443
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10444 //Increase performance, avoid regex
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10445 var data,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10446 el = this.helper, props = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10447 smp = this.originalMousePosition,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10448 a = this.axis,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10449 prevTop = this.position.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10450 prevLeft = this.position.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10451 prevWidth = this.size.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10452 prevHeight = this.size.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10453 dx = (event.pageX-smp.left)||0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10454 dy = (event.pageY-smp.top)||0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10455 trigger = this._change[a];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10456
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10457 if (!trigger) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10458 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10459 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10460
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10461 // Calculate the attrs that will be change
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10462 data = trigger.apply(this, [event, dx, dy]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10463
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10464 // Put this in the mouseDrag handler since the user can start pressing shift while resizing
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10465 this._updateVirtualBoundaries(event.shiftKey);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10466 if (this._aspectRatio || event.shiftKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10467 data = this._updateRatio(data, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10468 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10469
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10470 data = this._respectSize(data, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10471
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10472 this._updateCache(data);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10473
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10474 // plugins callbacks need to be called first
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10475 this._propagate("resize", event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10476
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10477 if (this.position.top !== prevTop) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10478 props.top = this.position.top + "px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10479 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10480 if (this.position.left !== prevLeft) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10481 props.left = this.position.left + "px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10482 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10483 if (this.size.width !== prevWidth) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10484 props.width = this.size.width + "px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10485 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10486 if (this.size.height !== prevHeight) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10487 props.height = this.size.height + "px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10488 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10489 el.css(props);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10490
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10491 if (!this._helper && this._proportionallyResizeElements.length) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10492 this._proportionallyResize();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10493 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10494
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10495 // Call the user callback if the element was resized
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10496 if ( ! $.isEmptyObject(props) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10497 this._trigger("resize", event, this.ui());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10498 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10499
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10500 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10501 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10502
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10503 _mouseStop: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10504
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10505 this.resizing = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10506 var pr, ista, soffseth, soffsetw, s, left, top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10507 o = this.options, that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10508
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10509 if(this._helper) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10510
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10511 pr = this._proportionallyResizeElements;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10512 ista = pr.length && (/textarea/i).test(pr[0].nodeName);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10513 soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10514 soffsetw = ista ? 0 : that.sizeDiff.width;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10515
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10516 s = { width: (that.helper.width() - soffsetw), height: (that.helper.height() - soffseth) };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10517 left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10518 top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10519
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10520 if (!o.animate) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10521 this.element.css($.extend(s, { top: top, left: left }));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10522 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10523
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10524 that.helper.height(that.size.height);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10525 that.helper.width(that.size.width);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10526
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10527 if (this._helper && !o.animate) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10528 this._proportionallyResize();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10529 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10530 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10531
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10532 $("body").css("cursor", "auto");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10533
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10534 this.element.removeClass("ui-resizable-resizing");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10535
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10536 this._propagate("stop", event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10537
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10538 if (this._helper) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10539 this.helper.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10540 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10541
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10542 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10543
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10544 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10545
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10546 _updateVirtualBoundaries: function(forceAspectRatio) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10547 var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10548 o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10549
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10550 b = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10551 minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10552 maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10553 minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10554 maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10555 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10556
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10557 if(this._aspectRatio || forceAspectRatio) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10558 // We want to create an enclosing box whose aspect ration is the requested one
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10559 // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10560 pMinWidth = b.minHeight * this.aspectRatio;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10561 pMinHeight = b.minWidth / this.aspectRatio;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10562 pMaxWidth = b.maxHeight * this.aspectRatio;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10563 pMaxHeight = b.maxWidth / this.aspectRatio;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10564
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10565 if(pMinWidth > b.minWidth) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10566 b.minWidth = pMinWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10567 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10568 if(pMinHeight > b.minHeight) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10569 b.minHeight = pMinHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10570 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10571 if(pMaxWidth < b.maxWidth) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10572 b.maxWidth = pMaxWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10573 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10574 if(pMaxHeight < b.maxHeight) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10575 b.maxHeight = pMaxHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10576 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10577 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10578 this._vBoundaries = b;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10579 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10580
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10581 _updateCache: function(data) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10582 this.offset = this.helper.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10583 if (isNumber(data.left)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10584 this.position.left = data.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10585 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10586 if (isNumber(data.top)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10587 this.position.top = data.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10588 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10589 if (isNumber(data.height)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10590 this.size.height = data.height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10591 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10592 if (isNumber(data.width)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10593 this.size.width = data.width;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10594 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10595 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10596
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10597 _updateRatio: function( data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10598
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10599 var cpos = this.position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10600 csize = this.size,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10601 a = this.axis;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10602
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10603 if (isNumber(data.height)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10604 data.width = (data.height * this.aspectRatio);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10605 } else if (isNumber(data.width)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10606 data.height = (data.width / this.aspectRatio);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10607 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10608
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10609 if (a === "sw") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10610 data.left = cpos.left + (csize.width - data.width);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10611 data.top = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10612 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10613 if (a === "nw") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10614 data.top = cpos.top + (csize.height - data.height);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10615 data.left = cpos.left + (csize.width - data.width);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10616 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10617
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10618 return data;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10619 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10620
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10621 _respectSize: function( data ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10622
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10623 var o = this._vBoundaries,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10624 a = this.axis,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10625 ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10626 isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10627 dw = this.originalPosition.left + this.originalSize.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10628 dh = this.position.top + this.size.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10629 cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10630 if (isminw) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10631 data.width = o.minWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10632 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10633 if (isminh) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10634 data.height = o.minHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10635 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10636 if (ismaxw) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10637 data.width = o.maxWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10638 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10639 if (ismaxh) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10640 data.height = o.maxHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10641 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10642
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10643 if (isminw && cw) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10644 data.left = dw - o.minWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10645 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10646 if (ismaxw && cw) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10647 data.left = dw - o.maxWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10648 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10649 if (isminh && ch) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10650 data.top = dh - o.minHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10651 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10652 if (ismaxh && ch) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10653 data.top = dh - o.maxHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10654 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10655
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10656 // fixing jump error on top/left - bug #2330
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10657 if (!data.width && !data.height && !data.left && data.top) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10658 data.top = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10659 } else if (!data.width && !data.height && !data.top && data.left) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10660 data.left = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10661 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10662
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10663 return data;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10664 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10665
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10666 _proportionallyResize: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10667
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10668 if (!this._proportionallyResizeElements.length) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10669 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10670 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10671
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10672 var i, j, borders, paddings, prel,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10673 element = this.helper || this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10674
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10675 for ( i=0; i < this._proportionallyResizeElements.length; i++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10676
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10677 prel = this._proportionallyResizeElements[i];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10678
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10679 if (!this.borderDif) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10680 this.borderDif = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10681 borders = [prel.css("borderTopWidth"), prel.css("borderRightWidth"), prel.css("borderBottomWidth"), prel.css("borderLeftWidth")];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10682 paddings = [prel.css("paddingTop"), prel.css("paddingRight"), prel.css("paddingBottom"), prel.css("paddingLeft")];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10683
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10684 for ( j = 0; j < borders.length; j++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10685 this.borderDif[ j ] = ( parseInt( borders[ j ], 10 ) || 0 ) + ( parseInt( paddings[ j ], 10 ) || 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10686 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10687 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10688
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10689 prel.css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10690 height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10691 width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10692 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10693
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10694 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10695
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10696 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10697
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10698 _renderProxy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10699
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10700 var el = this.element, o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10701 this.elementOffset = el.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10702
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10703 if(this._helper) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10704
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10705 this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10706
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10707 this.helper.addClass(this._helper).css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10708 width: this.element.outerWidth() - 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10709 height: this.element.outerHeight() - 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10710 position: "absolute",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10711 left: this.elementOffset.left +"px",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10712 top: this.elementOffset.top +"px",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10713 zIndex: ++o.zIndex //TODO: Don't modify option
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10714 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10715
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10716 this.helper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10717 .appendTo("body")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10718 .disableSelection();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10719
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10720 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10721 this.helper = this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10722 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10723
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10724 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10725
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10726 _change: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10727 e: function(event, dx) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10728 return { width: this.originalSize.width + dx };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10729 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10730 w: function(event, dx) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10731 var cs = this.originalSize, sp = this.originalPosition;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10732 return { left: sp.left + dx, width: cs.width - dx };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10733 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10734 n: function(event, dx, dy) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10735 var cs = this.originalSize, sp = this.originalPosition;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10736 return { top: sp.top + dy, height: cs.height - dy };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10737 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10738 s: function(event, dx, dy) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10739 return { height: this.originalSize.height + dy };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10740 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10741 se: function(event, dx, dy) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10742 return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10743 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10744 sw: function(event, dx, dy) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10745 return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10746 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10747 ne: function(event, dx, dy) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10748 return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10749 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10750 nw: function(event, dx, dy) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10751 return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10752 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10753 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10754
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10755 _propagate: function(n, event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10756 $.ui.plugin.call(this, n, [event, this.ui()]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10757 (n !== "resize" && this._trigger(n, event, this.ui()));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10758 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10759
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10760 plugins: {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10761
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10762 ui: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10763 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10764 originalElement: this.originalElement,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10765 element: this.element,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10766 helper: this.helper,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10767 position: this.position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10768 size: this.size,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10769 originalSize: this.originalSize,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10770 originalPosition: this.originalPosition
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10771 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10772 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10773
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10774 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10775
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10776 /*
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10777 * Resizable Extensions
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10778 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10779
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10780 $.ui.plugin.add("resizable", "animate", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10781
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10782 stop: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10783 var that = $(this).data("ui-resizable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10784 o = that.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10785 pr = that._proportionallyResizeElements,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10786 ista = pr.length && (/textarea/i).test(pr[0].nodeName),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10787 soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10788 soffsetw = ista ? 0 : that.sizeDiff.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10789 style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10790 left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10791 top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10792
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10793 that.element.animate(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10794 $.extend(style, top && left ? { top: top, left: left } : {}), {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10795 duration: o.animateDuration,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10796 easing: o.animateEasing,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10797 step: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10798
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10799 var data = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10800 width: parseInt(that.element.css("width"), 10),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10801 height: parseInt(that.element.css("height"), 10),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10802 top: parseInt(that.element.css("top"), 10),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10803 left: parseInt(that.element.css("left"), 10)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10804 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10805
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10806 if (pr && pr.length) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10807 $(pr[0]).css({ width: data.width, height: data.height });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10808 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10809
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10810 // propagating resize, and updating values for each animation step
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10811 that._updateCache(data);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10812 that._propagate("resize", event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10813
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10814 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10815 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10816 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10817 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10818
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10819 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10820
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10821 $.ui.plugin.add("resizable", "containment", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10822
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10823 start: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10824 var element, p, co, ch, cw, width, height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10825 that = $(this).data("ui-resizable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10826 o = that.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10827 el = that.element,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10828 oc = o.containment,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10829 ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10830
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10831 if (!ce) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10832 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10833 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10834
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10835 that.containerElement = $(ce);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10836
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10837 if (/document/.test(oc) || oc === document) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10838 that.containerOffset = { left: 0, top: 0 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10839 that.containerPosition = { left: 0, top: 0 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10840
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10841 that.parentData = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10842 element: $(document), left: 0, top: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10843 width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10844 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10845 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10846
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10847 // i'm a node, so compute top, left, right, bottom
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10848 else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10849 element = $(ce);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10850 p = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10851 $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10852
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10853 that.containerOffset = element.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10854 that.containerPosition = element.position();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10855 that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10856
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10857 co = that.containerOffset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10858 ch = that.containerSize.height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10859 cw = that.containerSize.width;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10860 width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10861 height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10862
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10863 that.parentData = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10864 element: ce, left: co.left, top: co.top, width: width, height: height
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10865 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10866 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10867 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10868
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10869 resize: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10870 var woset, hoset, isParent, isOffsetRelative,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10871 that = $(this).data("ui-resizable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10872 o = that.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10873 co = that.containerOffset, cp = that.position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10874 pRatio = that._aspectRatio || event.shiftKey,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10875 cop = { top:0, left:0 }, ce = that.containerElement;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10876
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10877 if (ce[0] !== document && (/static/).test(ce.css("position"))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10878 cop = co;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10879 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10880
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10881 if (cp.left < (that._helper ? co.left : 0)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10882 that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10883 if (pRatio) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10884 that.size.height = that.size.width / that.aspectRatio;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10885 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10886 that.position.left = o.helper ? co.left : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10887 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10888
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10889 if (cp.top < (that._helper ? co.top : 0)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10890 that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10891 if (pRatio) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10892 that.size.width = that.size.height * that.aspectRatio;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10893 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10894 that.position.top = that._helper ? co.top : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10895 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10896
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10897 that.offset.left = that.parentData.left+that.position.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10898 that.offset.top = that.parentData.top+that.position.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10899
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10900 woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10901 hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10902
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10903 isParent = that.containerElement.get(0) === that.element.parent().get(0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10904 isOffsetRelative = /relative|absolute/.test(that.containerElement.css("position"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10905
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10906 if ( isParent && isOffsetRelative ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10907 woset -= Math.abs( that.parentData.left );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10908 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10909
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10910 if (woset + that.size.width >= that.parentData.width) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10911 that.size.width = that.parentData.width - woset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10912 if (pRatio) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10913 that.size.height = that.size.width / that.aspectRatio;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10914 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10915 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10916
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10917 if (hoset + that.size.height >= that.parentData.height) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10918 that.size.height = that.parentData.height - hoset;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10919 if (pRatio) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10920 that.size.width = that.size.height * that.aspectRatio;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10921 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10922 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10923 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10924
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10925 stop: function(){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10926 var that = $(this).data("ui-resizable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10927 o = that.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10928 co = that.containerOffset,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10929 cop = that.containerPosition,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10930 ce = that.containerElement,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10931 helper = $(that.helper),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10932 ho = helper.offset(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10933 w = helper.outerWidth() - that.sizeDiff.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10934 h = helper.outerHeight() - that.sizeDiff.height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10935
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10936 if (that._helper && !o.animate && (/relative/).test(ce.css("position"))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10937 $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10938 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10939
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10940 if (that._helper && !o.animate && (/static/).test(ce.css("position"))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10941 $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10942 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10943
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10944 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10945 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10946
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10947 $.ui.plugin.add("resizable", "alsoResize", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10948
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10949 start: function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10950 var that = $(this).data("ui-resizable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10951 o = that.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10952 _store = function (exp) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10953 $(exp).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10954 var el = $(this);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10955 el.data("ui-resizable-alsoresize", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10956 width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10957 left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10958 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10959 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10960 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10961
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10962 if (typeof(o.alsoResize) === "object" && !o.alsoResize.parentNode) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10963 if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10964 else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10965 }else{
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10966 _store(o.alsoResize);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10967 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10968 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10969
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10970 resize: function (event, ui) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10971 var that = $(this).data("ui-resizable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10972 o = that.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10973 os = that.originalSize,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10974 op = that.originalPosition,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10975 delta = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10976 height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10977 top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10978 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10979
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10980 _alsoResize = function (exp, c) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10981 $(exp).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10982 var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10983 css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ["width", "height"] : ["width", "height", "top", "left"];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10984
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10985 $.each(css, function (i, prop) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10986 var sum = (start[prop]||0) + (delta[prop]||0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10987 if (sum && sum >= 0) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10988 style[prop] = sum || null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10989 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10990 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10991
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10992 el.css(style);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10993 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10994 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10995
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10996 if (typeof(o.alsoResize) === "object" && !o.alsoResize.nodeType) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10997 $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10998 }else{
3c160414da2e initial upload
shiltemann
parents:
diff changeset
10999 _alsoResize(o.alsoResize);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11000 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11001 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11002
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11003 stop: function () {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11004 $(this).removeData("resizable-alsoresize");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11005 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11006 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11007
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11008 $.ui.plugin.add("resizable", "ghost", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11009
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11010 start: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11011
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11012 var that = $(this).data("ui-resizable"), o = that.options, cs = that.size;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11013
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11014 that.ghost = that.originalElement.clone();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11015 that.ghost
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11016 .css({ opacity: 0.25, display: "block", position: "relative", height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11017 .addClass("ui-resizable-ghost")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11018 .addClass(typeof o.ghost === "string" ? o.ghost : "");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11019
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11020 that.ghost.appendTo(that.helper);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11021
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11022 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11023
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11024 resize: function(){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11025 var that = $(this).data("ui-resizable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11026 if (that.ghost) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11027 that.ghost.css({ position: "relative", height: that.size.height, width: that.size.width });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11028 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11029 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11030
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11031 stop: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11032 var that = $(this).data("ui-resizable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11033 if (that.ghost && that.helper) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11034 that.helper.get(0).removeChild(that.ghost.get(0));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11035 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11036 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11037
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11038 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11039
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11040 $.ui.plugin.add("resizable", "grid", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11041
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11042 resize: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11043 var that = $(this).data("ui-resizable"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11044 o = that.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11045 cs = that.size,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11046 os = that.originalSize,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11047 op = that.originalPosition,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11048 a = that.axis,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11049 grid = typeof o.grid === "number" ? [o.grid, o.grid] : o.grid,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11050 gridX = (grid[0]||1),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11051 gridY = (grid[1]||1),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11052 ox = Math.round((cs.width - os.width) / gridX) * gridX,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11053 oy = Math.round((cs.height - os.height) / gridY) * gridY,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11054 newWidth = os.width + ox,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11055 newHeight = os.height + oy,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11056 isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11057 isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11058 isMinWidth = o.minWidth && (o.minWidth > newWidth),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11059 isMinHeight = o.minHeight && (o.minHeight > newHeight);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11060
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11061 o.grid = grid;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11062
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11063 if (isMinWidth) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11064 newWidth = newWidth + gridX;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11065 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11066 if (isMinHeight) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11067 newHeight = newHeight + gridY;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11068 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11069 if (isMaxWidth) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11070 newWidth = newWidth - gridX;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11071 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11072 if (isMaxHeight) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11073 newHeight = newHeight - gridY;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11074 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11075
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11076 if (/^(se|s|e)$/.test(a)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11077 that.size.width = newWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11078 that.size.height = newHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11079 } else if (/^(ne)$/.test(a)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11080 that.size.width = newWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11081 that.size.height = newHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11082 that.position.top = op.top - oy;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11083 } else if (/^(sw)$/.test(a)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11084 that.size.width = newWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11085 that.size.height = newHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11086 that.position.left = op.left - ox;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11087 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11088 if ( newHeight - gridY > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11089 that.size.height = newHeight;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11090 that.position.top = op.top - oy;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11091 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11092 that.size.height = gridY;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11093 that.position.top = op.top + os.height - gridY;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11094 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11095 if ( newWidth - gridX > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11096 that.size.width = newWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11097 that.position.left = op.left - ox;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11098 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11099 that.size.width = gridX;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11100 that.position.left = op.left + os.width - gridX;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11101 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11102 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11103 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11104
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11105 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11106
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11107 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11108 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11109
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11110 $.widget("ui.selectable", $.ui.mouse, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11111 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11112 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11113 appendTo: "body",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11114 autoRefresh: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11115 distance: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11116 filter: "*",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11117 tolerance: "touch",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11118
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11119 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11120 selected: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11121 selecting: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11122 start: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11123 stop: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11124 unselected: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11125 unselecting: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11126 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11127 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11128 var selectees,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11129 that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11130
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11131 this.element.addClass("ui-selectable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11132
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11133 this.dragged = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11134
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11135 // cache selectee children based on filter
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11136 this.refresh = function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11137 selectees = $(that.options.filter, that.element[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11138 selectees.addClass("ui-selectee");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11139 selectees.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11140 var $this = $(this),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11141 pos = $this.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11142 $.data(this, "selectable-item", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11143 element: this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11144 $element: $this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11145 left: pos.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11146 top: pos.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11147 right: pos.left + $this.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11148 bottom: pos.top + $this.outerHeight(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11149 startselected: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11150 selected: $this.hasClass("ui-selected"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11151 selecting: $this.hasClass("ui-selecting"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11152 unselecting: $this.hasClass("ui-unselecting")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11153 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11154 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11155 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11156 this.refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11157
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11158 this.selectees = selectees.addClass("ui-selectee");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11159
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11160 this._mouseInit();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11161
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11162 this.helper = $("<div class='ui-selectable-helper'></div>");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11163 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11164
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11165 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11166 this.selectees
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11167 .removeClass("ui-selectee")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11168 .removeData("selectable-item");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11169 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11170 .removeClass("ui-selectable ui-selectable-disabled");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11171 this._mouseDestroy();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11172 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11173
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11174 _mouseStart: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11175 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11176 options = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11177
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11178 this.opos = [event.pageX, event.pageY];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11179
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11180 if (this.options.disabled) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11181 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11182 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11183
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11184 this.selectees = $(options.filter, this.element[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11185
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11186 this._trigger("start", event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11187
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11188 $(options.appendTo).append(this.helper);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11189 // position helper (lasso)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11190 this.helper.css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11191 "left": event.pageX,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11192 "top": event.pageY,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11193 "width": 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11194 "height": 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11195 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11196
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11197 if (options.autoRefresh) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11198 this.refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11199 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11200
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11201 this.selectees.filter(".ui-selected").each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11202 var selectee = $.data(this, "selectable-item");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11203 selectee.startselected = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11204 if (!event.metaKey && !event.ctrlKey) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11205 selectee.$element.removeClass("ui-selected");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11206 selectee.selected = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11207 selectee.$element.addClass("ui-unselecting");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11208 selectee.unselecting = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11209 // selectable UNSELECTING callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11210 that._trigger("unselecting", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11211 unselecting: selectee.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11212 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11213 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11214 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11215
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11216 $(event.target).parents().addBack().each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11217 var doSelect,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11218 selectee = $.data(this, "selectable-item");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11219 if (selectee) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11220 doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11221 selectee.$element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11222 .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11223 .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11224 selectee.unselecting = !doSelect;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11225 selectee.selecting = doSelect;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11226 selectee.selected = doSelect;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11227 // selectable (UN)SELECTING callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11228 if (doSelect) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11229 that._trigger("selecting", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11230 selecting: selectee.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11231 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11232 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11233 that._trigger("unselecting", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11234 unselecting: selectee.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11235 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11236 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11237 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11238 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11239 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11240
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11241 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11242
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11243 _mouseDrag: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11244
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11245 this.dragged = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11246
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11247 if (this.options.disabled) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11248 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11249 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11250
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11251 var tmp,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11252 that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11253 options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11254 x1 = this.opos[0],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11255 y1 = this.opos[1],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11256 x2 = event.pageX,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11257 y2 = event.pageY;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11258
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11259 if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11260 if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11261 this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11262
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11263 this.selectees.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11264 var selectee = $.data(this, "selectable-item"),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11265 hit = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11266
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11267 //prevent helper from being selected if appendTo: selectable
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11268 if (!selectee || selectee.element === that.element[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11269 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11270 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11271
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11272 if (options.tolerance === "touch") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11273 hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11274 } else if (options.tolerance === "fit") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11275 hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11276 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11277
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11278 if (hit) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11279 // SELECT
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11280 if (selectee.selected) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11281 selectee.$element.removeClass("ui-selected");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11282 selectee.selected = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11283 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11284 if (selectee.unselecting) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11285 selectee.$element.removeClass("ui-unselecting");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11286 selectee.unselecting = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11287 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11288 if (!selectee.selecting) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11289 selectee.$element.addClass("ui-selecting");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11290 selectee.selecting = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11291 // selectable SELECTING callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11292 that._trigger("selecting", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11293 selecting: selectee.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11294 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11295 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11296 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11297 // UNSELECT
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11298 if (selectee.selecting) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11299 if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11300 selectee.$element.removeClass("ui-selecting");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11301 selectee.selecting = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11302 selectee.$element.addClass("ui-selected");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11303 selectee.selected = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11304 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11305 selectee.$element.removeClass("ui-selecting");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11306 selectee.selecting = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11307 if (selectee.startselected) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11308 selectee.$element.addClass("ui-unselecting");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11309 selectee.unselecting = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11310 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11311 // selectable UNSELECTING callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11312 that._trigger("unselecting", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11313 unselecting: selectee.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11314 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11315 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11316 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11317 if (selectee.selected) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11318 if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11319 selectee.$element.removeClass("ui-selected");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11320 selectee.selected = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11321
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11322 selectee.$element.addClass("ui-unselecting");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11323 selectee.unselecting = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11324 // selectable UNSELECTING callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11325 that._trigger("unselecting", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11326 unselecting: selectee.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11327 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11328 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11329 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11330 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11331 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11332
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11333 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11334 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11335
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11336 _mouseStop: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11337 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11338
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11339 this.dragged = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11340
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11341 $(".ui-unselecting", this.element[0]).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11342 var selectee = $.data(this, "selectable-item");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11343 selectee.$element.removeClass("ui-unselecting");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11344 selectee.unselecting = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11345 selectee.startselected = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11346 that._trigger("unselected", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11347 unselected: selectee.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11348 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11349 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11350 $(".ui-selecting", this.element[0]).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11351 var selectee = $.data(this, "selectable-item");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11352 selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11353 selectee.selecting = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11354 selectee.selected = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11355 selectee.startselected = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11356 that._trigger("selected", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11357 selected: selectee.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11358 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11359 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11360 this._trigger("stop", event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11361
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11362 this.helper.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11363
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11364 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11365 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11366
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11367 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11368
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11369 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11370 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11371
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11372 // number of pages in a slider
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11373 // (how many times can you page up/down to go through the whole range)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11374 var numPages = 5;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11375
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11376 $.widget( "ui.slider", $.ui.mouse, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11377 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11378 widgetEventPrefix: "slide",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11379
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11380 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11381 animate: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11382 distance: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11383 max: 100,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11384 min: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11385 orientation: "horizontal",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11386 range: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11387 step: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11388 value: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11389 values: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11390
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11391 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11392 change: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11393 slide: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11394 start: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11395 stop: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11396 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11397
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11398 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11399 this._keySliding = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11400 this._mouseSliding = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11401 this._animateOff = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11402 this._handleIndex = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11403 this._detectOrientation();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11404 this._mouseInit();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11405
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11406 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11407 .addClass( "ui-slider" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11408 " ui-slider-" + this.orientation +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11409 " ui-widget" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11410 " ui-widget-content" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11411 " ui-corner-all");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11412
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11413 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11414 this._setOption( "disabled", this.options.disabled );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11415
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11416 this._animateOff = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11417 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11418
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11419 _refresh: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11420 this._createRange();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11421 this._createHandles();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11422 this._setupEvents();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11423 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11424 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11425
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11426 _createHandles: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11427 var i, handleCount,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11428 options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11429 existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11430 handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11431 handles = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11432
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11433 handleCount = ( options.values && options.values.length ) || 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11434
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11435 if ( existingHandles.length > handleCount ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11436 existingHandles.slice( handleCount ).remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11437 existingHandles = existingHandles.slice( 0, handleCount );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11438 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11439
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11440 for ( i = existingHandles.length; i < handleCount; i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11441 handles.push( handle );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11442 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11443
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11444 this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11445
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11446 this.handle = this.handles.eq( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11447
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11448 this.handles.each(function( i ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11449 $( this ).data( "ui-slider-handle-index", i );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11450 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11451 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11452
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11453 _createRange: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11454 var options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11455 classes = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11456
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11457 if ( options.range ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11458 if ( options.range === true ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11459 if ( !options.values ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11460 options.values = [ this._valueMin(), this._valueMin() ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11461 } else if ( options.values.length && options.values.length !== 2 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11462 options.values = [ options.values[0], options.values[0] ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11463 } else if ( $.isArray( options.values ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11464 options.values = options.values.slice(0);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11465 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11466 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11467
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11468 if ( !this.range || !this.range.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11469 this.range = $( "<div></div>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11470 .appendTo( this.element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11471
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11472 classes = "ui-slider-range" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11473 // note: this isn't the most fittingly semantic framework class for this element,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11474 // but worked best visually with a variety of themes
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11475 " ui-widget-header ui-corner-all";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11476 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11477 this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11478 // Handle range switching from true to min/max
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11479 .css({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11480 "left": "",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11481 "bottom": ""
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11482 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11483 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11484
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11485 this.range.addClass( classes +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11486 ( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11487 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11488 if ( this.range ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11489 this.range.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11490 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11491 this.range = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11492 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11493 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11494
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11495 _setupEvents: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11496 var elements = this.handles.add( this.range ).filter( "a" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11497 this._off( elements );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11498 this._on( elements, this._handleEvents );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11499 this._hoverable( elements );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11500 this._focusable( elements );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11501 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11502
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11503 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11504 this.handles.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11505 if ( this.range ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11506 this.range.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11507 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11508
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11509 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11510 .removeClass( "ui-slider" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11511 " ui-slider-horizontal" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11512 " ui-slider-vertical" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11513 " ui-widget" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11514 " ui-widget-content" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11515 " ui-corner-all" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11516
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11517 this._mouseDestroy();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11518 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11519
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11520 _mouseCapture: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11521 var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11522 that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11523 o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11524
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11525 if ( o.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11526 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11527 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11528
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11529 this.elementSize = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11530 width: this.element.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11531 height: this.element.outerHeight()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11532 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11533 this.elementOffset = this.element.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11534
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11535 position = { x: event.pageX, y: event.pageY };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11536 normValue = this._normValueFromMouse( position );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11537 distance = this._valueMax() - this._valueMin() + 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11538 this.handles.each(function( i ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11539 var thisDistance = Math.abs( normValue - that.values(i) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11540 if (( distance > thisDistance ) ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11541 ( distance === thisDistance &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11542 (i === that._lastChangedValue || that.values(i) === o.min ))) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11543 distance = thisDistance;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11544 closestHandle = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11545 index = i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11546 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11547 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11548
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11549 allowed = this._start( event, index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11550 if ( allowed === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11551 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11552 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11553 this._mouseSliding = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11554
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11555 this._handleIndex = index;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11556
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11557 closestHandle
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11558 .addClass( "ui-state-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11559 .focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11560
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11561 offset = closestHandle.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11562 mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11563 this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11564 left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11565 top: event.pageY - offset.top -
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11566 ( closestHandle.height() / 2 ) -
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11567 ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11568 ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11569 ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11570 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11571
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11572 if ( !this.handles.hasClass( "ui-state-hover" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11573 this._slide( event, index, normValue );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11574 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11575 this._animateOff = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11576 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11577 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11578
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11579 _mouseStart: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11580 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11581 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11582
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11583 _mouseDrag: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11584 var position = { x: event.pageX, y: event.pageY },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11585 normValue = this._normValueFromMouse( position );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11586
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11587 this._slide( event, this._handleIndex, normValue );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11588
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11589 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11590 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11591
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11592 _mouseStop: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11593 this.handles.removeClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11594 this._mouseSliding = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11595
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11596 this._stop( event, this._handleIndex );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11597 this._change( event, this._handleIndex );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11598
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11599 this._handleIndex = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11600 this._clickOffset = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11601 this._animateOff = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11602
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11603 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11604 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11605
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11606 _detectOrientation: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11607 this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11608 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11609
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11610 _normValueFromMouse: function( position ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11611 var pixelTotal,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11612 pixelMouse,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11613 percentMouse,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11614 valueTotal,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11615 valueMouse;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11616
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11617 if ( this.orientation === "horizontal" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11618 pixelTotal = this.elementSize.width;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11619 pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11620 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11621 pixelTotal = this.elementSize.height;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11622 pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11623 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11624
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11625 percentMouse = ( pixelMouse / pixelTotal );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11626 if ( percentMouse > 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11627 percentMouse = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11628 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11629 if ( percentMouse < 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11630 percentMouse = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11631 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11632 if ( this.orientation === "vertical" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11633 percentMouse = 1 - percentMouse;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11634 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11635
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11636 valueTotal = this._valueMax() - this._valueMin();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11637 valueMouse = this._valueMin() + percentMouse * valueTotal;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11638
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11639 return this._trimAlignValue( valueMouse );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11640 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11641
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11642 _start: function( event, index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11643 var uiHash = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11644 handle: this.handles[ index ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11645 value: this.value()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11646 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11647 if ( this.options.values && this.options.values.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11648 uiHash.value = this.values( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11649 uiHash.values = this.values();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11650 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11651 return this._trigger( "start", event, uiHash );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11652 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11653
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11654 _slide: function( event, index, newVal ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11655 var otherVal,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11656 newValues,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11657 allowed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11658
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11659 if ( this.options.values && this.options.values.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11660 otherVal = this.values( index ? 0 : 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11661
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11662 if ( ( this.options.values.length === 2 && this.options.range === true ) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11663 ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11664 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11665 newVal = otherVal;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11666 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11667
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11668 if ( newVal !== this.values( index ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11669 newValues = this.values();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11670 newValues[ index ] = newVal;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11671 // A slide can be canceled by returning false from the slide callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11672 allowed = this._trigger( "slide", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11673 handle: this.handles[ index ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11674 value: newVal,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11675 values: newValues
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11676 } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11677 otherVal = this.values( index ? 0 : 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11678 if ( allowed !== false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11679 this.values( index, newVal );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11680 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11681 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11682 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11683 if ( newVal !== this.value() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11684 // A slide can be canceled by returning false from the slide callback
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11685 allowed = this._trigger( "slide", event, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11686 handle: this.handles[ index ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11687 value: newVal
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11688 } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11689 if ( allowed !== false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11690 this.value( newVal );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11691 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11692 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11693 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11694 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11695
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11696 _stop: function( event, index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11697 var uiHash = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11698 handle: this.handles[ index ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11699 value: this.value()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11700 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11701 if ( this.options.values && this.options.values.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11702 uiHash.value = this.values( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11703 uiHash.values = this.values();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11704 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11705
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11706 this._trigger( "stop", event, uiHash );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11707 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11708
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11709 _change: function( event, index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11710 if ( !this._keySliding && !this._mouseSliding ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11711 var uiHash = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11712 handle: this.handles[ index ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11713 value: this.value()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11714 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11715 if ( this.options.values && this.options.values.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11716 uiHash.value = this.values( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11717 uiHash.values = this.values();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11718 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11719
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11720 //store the last changed value index for reference when handles overlap
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11721 this._lastChangedValue = index;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11722
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11723 this._trigger( "change", event, uiHash );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11724 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11725 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11726
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11727 value: function( newValue ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11728 if ( arguments.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11729 this.options.value = this._trimAlignValue( newValue );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11730 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11731 this._change( null, 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11732 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11733 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11734
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11735 return this._value();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11736 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11737
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11738 values: function( index, newValue ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11739 var vals,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11740 newValues,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11741 i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11742
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11743 if ( arguments.length > 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11744 this.options.values[ index ] = this._trimAlignValue( newValue );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11745 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11746 this._change( null, index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11747 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11748 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11749
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11750 if ( arguments.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11751 if ( $.isArray( arguments[ 0 ] ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11752 vals = this.options.values;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11753 newValues = arguments[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11754 for ( i = 0; i < vals.length; i += 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11755 vals[ i ] = this._trimAlignValue( newValues[ i ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11756 this._change( null, i );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11757 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11758 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11759 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11760 if ( this.options.values && this.options.values.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11761 return this._values( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11762 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11763 return this.value();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11764 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11765 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11766 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11767 return this._values();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11768 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11769 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11770
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11771 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11772 var i,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11773 valsLength = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11774
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11775 if ( key === "range" && this.options.range === true ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11776 if ( value === "min" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11777 this.options.value = this._values( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11778 this.options.values = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11779 } else if ( value === "max" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11780 this.options.value = this._values( this.options.values.length-1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11781 this.options.values = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11782 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11783 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11784
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11785 if ( $.isArray( this.options.values ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11786 valsLength = this.options.values.length;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11787 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11788
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11789 $.Widget.prototype._setOption.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11790
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11791 switch ( key ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11792 case "orientation":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11793 this._detectOrientation();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11794 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11795 .removeClass( "ui-slider-horizontal ui-slider-vertical" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11796 .addClass( "ui-slider-" + this.orientation );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11797 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11798 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11799 case "value":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11800 this._animateOff = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11801 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11802 this._change( null, 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11803 this._animateOff = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11804 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11805 case "values":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11806 this._animateOff = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11807 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11808 for ( i = 0; i < valsLength; i += 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11809 this._change( null, i );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11810 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11811 this._animateOff = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11812 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11813 case "min":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11814 case "max":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11815 this._animateOff = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11816 this._refreshValue();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11817 this._animateOff = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11818 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11819 case "range":
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11820 this._animateOff = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11821 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11822 this._animateOff = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11823 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11824 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11825 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11826
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11827 //internal value getter
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11828 // _value() returns value trimmed by min and max, aligned by step
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11829 _value: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11830 var val = this.options.value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11831 val = this._trimAlignValue( val );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11832
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11833 return val;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11834 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11835
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11836 //internal values getter
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11837 // _values() returns array of values trimmed by min and max, aligned by step
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11838 // _values( index ) returns single value trimmed by min and max, aligned by step
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11839 _values: function( index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11840 var val,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11841 vals,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11842 i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11843
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11844 if ( arguments.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11845 val = this.options.values[ index ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11846 val = this._trimAlignValue( val );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11847
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11848 return val;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11849 } else if ( this.options.values && this.options.values.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11850 // .slice() creates a copy of the array
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11851 // this copy gets trimmed by min and max and then returned
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11852 vals = this.options.values.slice();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11853 for ( i = 0; i < vals.length; i+= 1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11854 vals[ i ] = this._trimAlignValue( vals[ i ] );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11855 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11856
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11857 return vals;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11858 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11859 return [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11860 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11861 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11862
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11863 // returns the step-aligned value that val is closest to, between (inclusive) min and max
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11864 _trimAlignValue: function( val ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11865 if ( val <= this._valueMin() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11866 return this._valueMin();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11867 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11868 if ( val >= this._valueMax() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11869 return this._valueMax();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11870 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11871 var step = ( this.options.step > 0 ) ? this.options.step : 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11872 valModStep = (val - this._valueMin()) % step,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11873 alignValue = val - valModStep;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11874
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11875 if ( Math.abs(valModStep) * 2 >= step ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11876 alignValue += ( valModStep > 0 ) ? step : ( -step );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11877 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11878
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11879 // Since JavaScript has problems with large floats, round
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11880 // the final value to 5 digits after the decimal point (see #4124)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11881 return parseFloat( alignValue.toFixed(5) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11882 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11883
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11884 _valueMin: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11885 return this.options.min;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11886 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11887
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11888 _valueMax: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11889 return this.options.max;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11890 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11891
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11892 _refreshValue: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11893 var lastValPercent, valPercent, value, valueMin, valueMax,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11894 oRange = this.options.range,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11895 o = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11896 that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11897 animate = ( !this._animateOff ) ? o.animate : false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11898 _set = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11899
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11900 if ( this.options.values && this.options.values.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11901 this.handles.each(function( i ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11902 valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11903 _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11904 $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11905 if ( that.options.range === true ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11906 if ( that.orientation === "horizontal" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11907 if ( i === 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11908 that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11909 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11910 if ( i === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11911 that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11912 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11913 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11914 if ( i === 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11915 that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11916 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11917 if ( i === 1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11918 that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11919 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11920 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11921 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11922 lastValPercent = valPercent;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11923 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11924 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11925 value = this.value();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11926 valueMin = this._valueMin();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11927 valueMax = this._valueMax();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11928 valPercent = ( valueMax !== valueMin ) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11929 ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11930 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11931 _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11932 this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11933
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11934 if ( oRange === "min" && this.orientation === "horizontal" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11935 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11936 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11937 if ( oRange === "max" && this.orientation === "horizontal" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11938 this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11939 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11940 if ( oRange === "min" && this.orientation === "vertical" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11941 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11942 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11943 if ( oRange === "max" && this.orientation === "vertical" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11944 this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11945 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11946 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11947 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11948
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11949 _handleEvents: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11950 keydown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11951 var allowed, curVal, newVal, step,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11952 index = $( event.target ).data( "ui-slider-handle-index" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11953
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11954 switch ( event.keyCode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11955 case $.ui.keyCode.HOME:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11956 case $.ui.keyCode.END:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11957 case $.ui.keyCode.PAGE_UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11958 case $.ui.keyCode.PAGE_DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11959 case $.ui.keyCode.UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11960 case $.ui.keyCode.RIGHT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11961 case $.ui.keyCode.DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11962 case $.ui.keyCode.LEFT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11963 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11964 if ( !this._keySliding ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11965 this._keySliding = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11966 $( event.target ).addClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11967 allowed = this._start( event, index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11968 if ( allowed === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11969 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11970 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11971 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11972 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11973 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11974
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11975 step = this.options.step;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11976 if ( this.options.values && this.options.values.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11977 curVal = newVal = this.values( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11978 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11979 curVal = newVal = this.value();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11980 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11981
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11982 switch ( event.keyCode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11983 case $.ui.keyCode.HOME:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11984 newVal = this._valueMin();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11985 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11986 case $.ui.keyCode.END:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11987 newVal = this._valueMax();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11988 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11989 case $.ui.keyCode.PAGE_UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11990 newVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11991 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11992 case $.ui.keyCode.PAGE_DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11993 newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11994 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11995 case $.ui.keyCode.UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11996 case $.ui.keyCode.RIGHT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11997 if ( curVal === this._valueMax() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11998 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
11999 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12000 newVal = this._trimAlignValue( curVal + step );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12001 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12002 case $.ui.keyCode.DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12003 case $.ui.keyCode.LEFT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12004 if ( curVal === this._valueMin() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12005 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12006 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12007 newVal = this._trimAlignValue( curVal - step );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12008 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12009 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12010
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12011 this._slide( event, index, newVal );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12012 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12013 click: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12014 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12015 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12016 keyup: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12017 var index = $( event.target ).data( "ui-slider-handle-index" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12018
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12019 if ( this._keySliding ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12020 this._keySliding = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12021 this._stop( event, index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12022 this._change( event, index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12023 $( event.target ).removeClass( "ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12024 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12025 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12026 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12027
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12028 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12029
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12030 }(jQuery));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12031 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12032
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12033 function isOverAxis( x, reference, size ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12034 return ( x > reference ) && ( x < ( reference + size ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12035 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12036
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12037 function isFloating(item) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12038 return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12039 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12040
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12041 $.widget("ui.sortable", $.ui.mouse, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12042 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12043 widgetEventPrefix: "sort",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12044 ready: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12045 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12046 appendTo: "parent",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12047 axis: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12048 connectWith: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12049 containment: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12050 cursor: "auto",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12051 cursorAt: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12052 dropOnEmpty: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12053 forcePlaceholderSize: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12054 forceHelperSize: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12055 grid: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12056 handle: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12057 helper: "original",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12058 items: "> *",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12059 opacity: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12060 placeholder: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12061 revert: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12062 scroll: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12063 scrollSensitivity: 20,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12064 scrollSpeed: 20,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12065 scope: "default",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12066 tolerance: "intersect",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12067 zIndex: 1000,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12068
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12069 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12070 activate: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12071 beforeStop: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12072 change: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12073 deactivate: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12074 out: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12075 over: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12076 receive: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12077 remove: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12078 sort: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12079 start: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12080 stop: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12081 update: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12082 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12083 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12084
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12085 var o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12086 this.containerCache = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12087 this.element.addClass("ui-sortable");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12088
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12089 //Get the items
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12090 this.refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12091
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12092 //Let's determine if the items are being displayed horizontally
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12093 this.floating = this.items.length ? o.axis === "x" || isFloating(this.items[0].item) : false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12094
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12095 //Let's determine the parent's offset
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12096 this.offset = this.element.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12097
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12098 //Initialize mouse events for interaction
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12099 this._mouseInit();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12100
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12101 //We're ready to go
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12102 this.ready = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12103
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12104 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12105
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12106 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12107 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12108 .removeClass("ui-sortable ui-sortable-disabled");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12109 this._mouseDestroy();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12110
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12111 for ( var i = this.items.length - 1; i >= 0; i-- ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12112 this.items[i].item.removeData(this.widgetName + "-item");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12113 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12114
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12115 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12116 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12117
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12118 _setOption: function(key, value){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12119 if ( key === "disabled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12120 this.options[ key ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12121
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12122 this.widget().toggleClass( "ui-sortable-disabled", !!value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12123 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12124 // Don't call widget base _setOption for disable as it adds ui-state-disabled class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12125 $.Widget.prototype._setOption.apply(this, arguments);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12126 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12127 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12128
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12129 _mouseCapture: function(event, overrideHandle) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12130 var currentItem = null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12131 validHandle = false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12132 that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12133
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12134 if (this.reverting) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12135 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12136 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12137
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12138 if(this.options.disabled || this.options.type === "static") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12139 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12140 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12141
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12142 //We have to refresh the items data once first
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12143 this._refreshItems(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12144
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12145 //Find out if the clicked node (or one of its parents) is a actual item in this.items
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12146 $(event.target).parents().each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12147 if($.data(this, that.widgetName + "-item") === that) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12148 currentItem = $(this);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12149 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12150 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12151 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12152 if($.data(event.target, that.widgetName + "-item") === that) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12153 currentItem = $(event.target);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12154 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12155
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12156 if(!currentItem) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12157 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12158 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12159 if(this.options.handle && !overrideHandle) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12160 $(this.options.handle, currentItem).find("*").addBack().each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12161 if(this === event.target) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12162 validHandle = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12163 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12164 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12165 if(!validHandle) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12166 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12167 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12168 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12169
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12170 this.currentItem = currentItem;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12171 this._removeCurrentsFromItems();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12172 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12173
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12174 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12175
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12176 _mouseStart: function(event, overrideHandle, noActivation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12177
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12178 var i, body,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12179 o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12180
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12181 this.currentContainer = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12182
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12183 //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12184 this.refreshPositions();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12185
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12186 //Create and append the visible helper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12187 this.helper = this._createHelper(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12188
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12189 //Cache the helper size
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12190 this._cacheHelperProportions();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12191
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12192 /*
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12193 * - Position generation -
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12194 * This block generates everything position related - it's the core of draggables.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12195 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12196
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12197 //Cache the margins of the original element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12198 this._cacheMargins();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12199
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12200 //Get the next scrolling parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12201 this.scrollParent = this.helper.scrollParent();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12202
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12203 //The element's absolute position on the page minus margins
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12204 this.offset = this.currentItem.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12205 this.offset = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12206 top: this.offset.top - this.margins.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12207 left: this.offset.left - this.margins.left
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12208 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12209
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12210 $.extend(this.offset, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12211 click: { //Where the click happened, relative to the element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12212 left: event.pageX - this.offset.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12213 top: event.pageY - this.offset.top
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12214 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12215 parent: this._getParentOffset(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12216 relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12217 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12218
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12219 // Only after we got the offset, we can change the helper's position to absolute
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12220 // TODO: Still need to figure out a way to make relative sorting possible
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12221 this.helper.css("position", "absolute");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12222 this.cssPosition = this.helper.css("position");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12223
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12224 //Generate the original position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12225 this.originalPosition = this._generatePosition(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12226 this.originalPageX = event.pageX;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12227 this.originalPageY = event.pageY;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12228
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12229 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12230 (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12231
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12232 //Cache the former DOM position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12233 this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12234
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12235 //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
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12236 if(this.helper[0] !== this.currentItem[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12237 this.currentItem.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12238 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12239
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12240 //Create the placeholder
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12241 this._createPlaceholder();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12242
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12243 //Set a containment if given in the options
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12244 if(o.containment) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12245 this._setContainment();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12246 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12247
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12248 if( o.cursor && o.cursor !== "auto" ) { // cursor option
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12249 body = this.document.find( "body" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12250
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12251 // support: IE
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12252 this.storedCursor = body.css( "cursor" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12253 body.css( "cursor", o.cursor );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12254
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12255 this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12256 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12257
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12258 if(o.opacity) { // opacity option
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12259 if (this.helper.css("opacity")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12260 this._storedOpacity = this.helper.css("opacity");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12261 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12262 this.helper.css("opacity", o.opacity);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12263 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12264
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12265 if(o.zIndex) { // zIndex option
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12266 if (this.helper.css("zIndex")) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12267 this._storedZIndex = this.helper.css("zIndex");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12268 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12269 this.helper.css("zIndex", o.zIndex);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12270 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12271
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12272 //Prepare scrolling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12273 if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12274 this.overflowOffset = this.scrollParent.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12275 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12276
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12277 //Call callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12278 this._trigger("start", event, this._uiHash());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12279
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12280 //Recache the helper size
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12281 if(!this._preserveHelperProportions) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12282 this._cacheHelperProportions();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12283 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12284
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12285
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12286 //Post "activate" events to possible containers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12287 if( !noActivation ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12288 for ( i = this.containers.length - 1; i >= 0; i-- ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12289 this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12290 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12291 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12292
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12293 //Prepare possible droppables
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12294 if($.ui.ddmanager) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12295 $.ui.ddmanager.current = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12296 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12297
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12298 if ($.ui.ddmanager && !o.dropBehaviour) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12299 $.ui.ddmanager.prepareOffsets(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12300 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12301
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12302 this.dragging = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12303
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12304 this.helper.addClass("ui-sortable-helper");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12305 this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12306 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12307
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12308 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12309
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12310 _mouseDrag: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12311 var i, item, itemElement, intersection,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12312 o = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12313 scrolled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12314
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12315 //Compute the helpers position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12316 this.position = this._generatePosition(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12317 this.positionAbs = this._convertPositionTo("absolute");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12318
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12319 if (!this.lastPositionAbs) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12320 this.lastPositionAbs = this.positionAbs;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12321 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12322
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12323 //Do scrolling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12324 if(this.options.scroll) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12325 if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12326
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12327 if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12328 this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12329 } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12330 this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12331 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12332
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12333 if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12334 this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12335 } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12336 this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12337 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12338
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12339 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12340
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12341 if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12342 scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12343 } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12344 scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12345 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12346
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12347 if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12348 scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12349 } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12350 scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12351 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12352
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12353 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12354
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12355 if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12356 $.ui.ddmanager.prepareOffsets(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12357 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12358 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12359
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12360 //Regenerate the absolute position used for position checks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12361 this.positionAbs = this._convertPositionTo("absolute");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12362
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12363 //Set the helper position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12364 if(!this.options.axis || this.options.axis !== "y") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12365 this.helper[0].style.left = this.position.left+"px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12366 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12367 if(!this.options.axis || this.options.axis !== "x") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12368 this.helper[0].style.top = this.position.top+"px";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12369 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12370
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12371 //Rearrange
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12372 for (i = this.items.length - 1; i >= 0; i--) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12373
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12374 //Cache variables and intersection, continue if no intersection
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12375 item = this.items[i];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12376 itemElement = item.item[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12377 intersection = this._intersectsWithPointer(item);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12378 if (!intersection) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12379 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12380 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12381
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12382 // Only put the placeholder inside the current Container, skip all
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12383 // items from other containers. This works because when moving
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12384 // an item from one container to another the
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12385 // currentContainer is switched before the placeholder is moved.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12386 //
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12387 // Without this, moving items in "sub-sortables" can cause
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12388 // the placeholder to jitter beetween the outer and inner container.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12389 if (item.instance !== this.currentContainer) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12390 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12391 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12392
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12393 // cannot intersect with itself
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12394 // no useless actions that have been done before
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12395 // no action if the item moved is the parent of the item checked
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12396 if (itemElement !== this.currentItem[0] &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12397 this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12398 !$.contains(this.placeholder[0], itemElement) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12399 (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12400 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12401
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12402 this.direction = intersection === 1 ? "down" : "up";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12403
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12404 if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12405 this._rearrange(event, item);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12406 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12407 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12408 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12409
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12410 this._trigger("change", event, this._uiHash());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12411 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12412 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12413 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12414
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12415 //Post events to containers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12416 this._contactContainers(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12417
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12418 //Interconnect with droppables
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12419 if($.ui.ddmanager) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12420 $.ui.ddmanager.drag(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12421 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12422
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12423 //Call callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12424 this._trigger("sort", event, this._uiHash());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12425
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12426 this.lastPositionAbs = this.positionAbs;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12427 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12428
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12429 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12430
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12431 _mouseStop: function(event, noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12432
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12433 if(!event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12434 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12435 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12436
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12437 //If we are using droppables, inform the manager about the drop
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12438 if ($.ui.ddmanager && !this.options.dropBehaviour) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12439 $.ui.ddmanager.drop(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12440 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12441
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12442 if(this.options.revert) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12443 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12444 cur = this.placeholder.offset(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12445 axis = this.options.axis,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12446 animation = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12447
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12448 if ( !axis || axis === "x" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12449 animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12450 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12451 if ( !axis || axis === "y" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12452 animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12453 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12454 this.reverting = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12455 $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12456 that._clear(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12457 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12458 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12459 this._clear(event, noPropagation);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12460 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12461
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12462 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12463
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12464 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12465
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12466 cancel: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12467
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12468 if(this.dragging) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12469
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12470 this._mouseUp({ target: null });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12471
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12472 if(this.options.helper === "original") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12473 this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12474 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12475 this.currentItem.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12476 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12477
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12478 //Post deactivating events to containers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12479 for (var i = this.containers.length - 1; i >= 0; i--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12480 this.containers[i]._trigger("deactivate", null, this._uiHash(this));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12481 if(this.containers[i].containerCache.over) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12482 this.containers[i]._trigger("out", null, this._uiHash(this));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12483 this.containers[i].containerCache.over = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12484 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12485 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12486
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12487 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12488
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12489 if (this.placeholder) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12490 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12491 if(this.placeholder[0].parentNode) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12492 this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12493 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12494 if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12495 this.helper.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12496 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12497
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12498 $.extend(this, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12499 helper: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12500 dragging: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12501 reverting: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12502 _noFinalSort: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12503 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12504
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12505 if(this.domPosition.prev) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12506 $(this.domPosition.prev).after(this.currentItem);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12507 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12508 $(this.domPosition.parent).prepend(this.currentItem);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12509 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12510 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12511
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12512 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12513
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12514 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12515
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12516 serialize: function(o) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12517
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12518 var items = this._getItemsAsjQuery(o && o.connected),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12519 str = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12520 o = o || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12521
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12522 $(items).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12523 var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12524 if (res) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12525 str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12526 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12527 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12528
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12529 if(!str.length && o.key) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12530 str.push(o.key + "=");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12531 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12532
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12533 return str.join("&");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12534
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12535 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12536
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12537 toArray: function(o) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12538
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12539 var items = this._getItemsAsjQuery(o && o.connected),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12540 ret = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12541
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12542 o = o || {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12543
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12544 items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12545 return ret;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12546
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12547 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12548
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12549 /* Be careful with the following core functions */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12550 _intersectsWith: function(item) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12551
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12552 var x1 = this.positionAbs.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12553 x2 = x1 + this.helperProportions.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12554 y1 = this.positionAbs.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12555 y2 = y1 + this.helperProportions.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12556 l = item.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12557 r = l + item.width,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12558 t = item.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12559 b = t + item.height,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12560 dyClick = this.offset.click.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12561 dxClick = this.offset.click.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12562 isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12563 isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12564 isOverElement = isOverElementHeight && isOverElementWidth;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12565
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12566 if ( this.options.tolerance === "pointer" ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12567 this.options.forcePointerForContainers ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12568 (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12569 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12570 return isOverElement;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12571 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12572
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12573 return (l < x1 + (this.helperProportions.width / 2) && // Right Half
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12574 x2 - (this.helperProportions.width / 2) < r && // Left Half
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12575 t < y1 + (this.helperProportions.height / 2) && // Bottom Half
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12576 y2 - (this.helperProportions.height / 2) < b ); // Top Half
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12577
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12578 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12579 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12580
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12581 _intersectsWithPointer: function(item) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12582
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12583 var isOverElementHeight = (this.options.axis === "x") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12584 isOverElementWidth = (this.options.axis === "y") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12585 isOverElement = isOverElementHeight && isOverElementWidth,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12586 verticalDirection = this._getDragVerticalDirection(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12587 horizontalDirection = this._getDragHorizontalDirection();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12588
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12589 if (!isOverElement) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12590 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12591 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12592
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12593 return this.floating ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12594 ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12595 : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12596
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12597 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12598
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12599 _intersectsWithSides: function(item) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12600
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12601 var isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12602 isOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12603 verticalDirection = this._getDragVerticalDirection(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12604 horizontalDirection = this._getDragHorizontalDirection();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12605
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12606 if (this.floating && horizontalDirection) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12607 return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12608 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12609 return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12610 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12611
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12612 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12613
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12614 _getDragVerticalDirection: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12615 var delta = this.positionAbs.top - this.lastPositionAbs.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12616 return delta !== 0 && (delta > 0 ? "down" : "up");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12617 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12618
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12619 _getDragHorizontalDirection: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12620 var delta = this.positionAbs.left - this.lastPositionAbs.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12621 return delta !== 0 && (delta > 0 ? "right" : "left");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12622 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12623
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12624 refresh: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12625 this._refreshItems(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12626 this.refreshPositions();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12627 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12628 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12629
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12630 _connectWith: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12631 var options = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12632 return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12633 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12634
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12635 _getItemsAsjQuery: function(connected) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12636
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12637 var i, j, cur, inst,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12638 items = [],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12639 queries = [],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12640 connectWith = this._connectWith();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12641
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12642 if(connectWith && connected) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12643 for (i = connectWith.length - 1; i >= 0; i--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12644 cur = $(connectWith[i]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12645 for ( j = cur.length - 1; j >= 0; j--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12646 inst = $.data(cur[j], this.widgetFullName);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12647 if(inst && inst !== this && !inst.options.disabled) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12648 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]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12649 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12650 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12651 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12652 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12653
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12654 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]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12655
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12656 function addItems() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12657 items.push( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12658 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12659 for (i = queries.length - 1; i >= 0; i--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12660 queries[i][0].each( addItems );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12661 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12662
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12663 return $(items);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12664
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12665 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12666
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12667 _removeCurrentsFromItems: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12668
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12669 var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12670
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12671 this.items = $.grep(this.items, function (item) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12672 for (var j=0; j < list.length; j++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12673 if(list[j] === item.item[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12674 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12675 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12676 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12677 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12678 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12679
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12680 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12681
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12682 _refreshItems: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12683
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12684 this.items = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12685 this.containers = [this];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12686
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12687 var i, j, cur, inst, targetData, _queries, item, queriesLength,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12688 items = this.items,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12689 queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12690 connectWith = this._connectWith();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12691
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12692 if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12693 for (i = connectWith.length - 1; i >= 0; i--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12694 cur = $(connectWith[i]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12695 for (j = cur.length - 1; j >= 0; j--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12696 inst = $.data(cur[j], this.widgetFullName);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12697 if(inst && inst !== this && !inst.options.disabled) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12698 queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12699 this.containers.push(inst);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12700 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12701 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12702 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12703 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12704
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12705 for (i = queries.length - 1; i >= 0; i--) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12706 targetData = queries[i][1];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12707 _queries = queries[i][0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12708
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12709 for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12710 item = $(_queries[j]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12711
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12712 item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12713
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12714 items.push({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12715 item: item,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12716 instance: targetData,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12717 width: 0, height: 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12718 left: 0, top: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12719 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12720 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12721 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12722
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12723 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12724
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12725 refreshPositions: function(fast) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12726
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12727 //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12728 if(this.offsetParent && this.helper) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12729 this.offset.parent = this._getParentOffset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12730 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12731
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12732 var i, item, t, p;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12733
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12734 for (i = this.items.length - 1; i >= 0; i--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12735 item = this.items[i];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12736
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12737 //We ignore calculating positions of all connected containers when we're not over them
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12738 if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12739 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12740 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12741
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12742 t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12743
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12744 if (!fast) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12745 item.width = t.outerWidth();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12746 item.height = t.outerHeight();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12747 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12748
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12749 p = t.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12750 item.left = p.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12751 item.top = p.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12752 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12753
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12754 if(this.options.custom && this.options.custom.refreshContainers) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12755 this.options.custom.refreshContainers.call(this);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12756 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12757 for (i = this.containers.length - 1; i >= 0; i--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12758 p = this.containers[i].element.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12759 this.containers[i].containerCache.left = p.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12760 this.containers[i].containerCache.top = p.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12761 this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12762 this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12763 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12764 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12765
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12766 return this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12767 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12768
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12769 _createPlaceholder: function(that) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12770 that = that || this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12771 var className,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12772 o = that.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12773
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12774 if(!o.placeholder || o.placeholder.constructor === String) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12775 className = o.placeholder;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12776 o.placeholder = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12777 element: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12778
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12779 var nodeName = that.currentItem[0].nodeName.toLowerCase(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12780 element = $( "<" + nodeName + ">", that.document[0] )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12781 .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12782 .removeClass("ui-sortable-helper");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12783
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12784 if ( nodeName === "tr" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12785 that.currentItem.children().each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12786 $( "<td>&#160;</td>", that.document[0] )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12787 .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12788 .appendTo( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12789 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12790 } else if ( nodeName === "img" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12791 element.attr( "src", that.currentItem.attr( "src" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12792 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12793
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12794 if ( !className ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12795 element.css( "visibility", "hidden" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12796 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12797
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12798 return element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12799 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12800 update: function(container, p) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12801
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12802 // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12803 // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12804 if(className && !o.forcePlaceholderSize) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12805 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12806 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12807
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12808 //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
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12809 if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12810 if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12811 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12812 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12813 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12814
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12815 //Create the placeholder
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12816 that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12817
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12818 //Append it after the actual current item
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12819 that.currentItem.after(that.placeholder);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12820
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12821 //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12822 o.placeholder.update(that, that.placeholder);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12823
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12824 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12825
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12826 _contactContainers: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12827 var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12828 innermostContainer = null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12829 innermostIndex = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12830
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12831 // get innermost container that intersects with item
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12832 for (i = this.containers.length - 1; i >= 0; i--) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12833
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12834 // never consider a container that's located within the item itself
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12835 if($.contains(this.currentItem[0], this.containers[i].element[0])) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12836 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12837 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12838
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12839 if(this._intersectsWith(this.containers[i].containerCache)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12840
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12841 // if we've already found a container and it's more "inner" than this, then continue
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12842 if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12843 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12844 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12845
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12846 innermostContainer = this.containers[i];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12847 innermostIndex = i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12848
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12849 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12850 // container doesn't intersect. trigger "out" event if necessary
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12851 if(this.containers[i].containerCache.over) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12852 this.containers[i]._trigger("out", event, this._uiHash(this));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12853 this.containers[i].containerCache.over = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12854 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12855 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12856
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12857 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12858
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12859 // if no intersecting containers found, return
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12860 if(!innermostContainer) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12861 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12862 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12863
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12864 // move the item into the container if it's not there already
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12865 if(this.containers.length === 1) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12866 if (!this.containers[innermostIndex].containerCache.over) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12867 this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12868 this.containers[innermostIndex].containerCache.over = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12869 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12870 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12871
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12872 //When entering a new container, we will find the item with the least distance and append our item near it
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12873 dist = 10000;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12874 itemWithLeastDistance = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12875 floating = innermostContainer.floating || isFloating(this.currentItem);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12876 posProperty = floating ? "left" : "top";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12877 sizeProperty = floating ? "width" : "height";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12878 base = this.positionAbs[posProperty] + this.offset.click[posProperty];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12879 for (j = this.items.length - 1; j >= 0; j--) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12880 if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12881 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12882 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12883 if(this.items[j].item[0] === this.currentItem[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12884 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12885 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12886 if (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12887 continue;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12888 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12889 cur = this.items[j].item.offset()[posProperty];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12890 nearBottom = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12891 if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12892 nearBottom = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12893 cur += this.items[j][sizeProperty];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12894 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12895
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12896 if(Math.abs(cur - base) < dist) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12897 dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12898 this.direction = nearBottom ? "up": "down";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12899 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12900 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12901
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12902 //Check if dropOnEmpty is enabled
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12903 if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12904 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12905 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12906
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12907 if(this.currentContainer === this.containers[innermostIndex]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12908 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12909 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12910
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12911 itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12912 this._trigger("change", event, this._uiHash());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12913 this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12914 this.currentContainer = this.containers[innermostIndex];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12915
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12916 //Update the placeholder
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12917 this.options.placeholder.update(this.currentContainer, this.placeholder);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12918
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12919 this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12920 this.containers[innermostIndex].containerCache.over = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12921 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12922
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12923
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12924 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12925
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12926 _createHelper: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12927
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12928 var o = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12929 helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12930
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12931 //Add the helper to the DOM if that didn't happen already
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12932 if(!helper.parents("body").length) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12933 $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12934 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12935
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12936 if(helper[0] === this.currentItem[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12937 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") };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12938 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12939
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12940 if(!helper[0].style.width || o.forceHelperSize) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12941 helper.width(this.currentItem.width());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12942 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12943 if(!helper[0].style.height || o.forceHelperSize) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12944 helper.height(this.currentItem.height());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12945 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12946
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12947 return helper;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12948
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12949 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12950
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12951 _adjustOffsetFromHelper: function(obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12952 if (typeof obj === "string") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12953 obj = obj.split(" ");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12954 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12955 if ($.isArray(obj)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12956 obj = {left: +obj[0], top: +obj[1] || 0};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12957 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12958 if ("left" in obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12959 this.offset.click.left = obj.left + this.margins.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12960 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12961 if ("right" in obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12962 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12963 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12964 if ("top" in obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12965 this.offset.click.top = obj.top + this.margins.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12966 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12967 if ("bottom" in obj) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12968 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12969 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12970 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12971
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12972 _getParentOffset: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12973
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12974
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12975 //Get the offsetParent and cache its position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12976 this.offsetParent = this.helper.offsetParent();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12977 var po = this.offsetParent.offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12978
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12979 // This is a special case where we need to modify a offset calculated on start, since the following happened:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12980 // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12981 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12982 // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12983 if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12984 po.left += this.scrollParent.scrollLeft();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12985 po.top += this.scrollParent.scrollTop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12986 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12987
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12988 // This needs to be actually done for all browsers, since pageX/pageY includes this information
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12989 // with an ugly IE fix
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12990 if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12991 po = { top: 0, left: 0 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12992 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12993
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12994 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12995 top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12996 left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12997 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12998
3c160414da2e initial upload
shiltemann
parents:
diff changeset
12999 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13000
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13001 _getRelativeOffset: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13002
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13003 if(this.cssPosition === "relative") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13004 var p = this.currentItem.position();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13005 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13006 top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13007 left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13008 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13009 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13010 return { top: 0, left: 0 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13011 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13012
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13013 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13014
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13015 _cacheMargins: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13016 this.margins = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13017 left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13018 top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13019 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13020 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13021
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13022 _cacheHelperProportions: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13023 this.helperProportions = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13024 width: this.helper.outerWidth(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13025 height: this.helper.outerHeight()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13026 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13027 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13028
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13029 _setContainment: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13030
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13031 var ce, co, over,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13032 o = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13033 if(o.containment === "parent") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13034 o.containment = this.helper[0].parentNode;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13035 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13036 if(o.containment === "document" || o.containment === "window") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13037 this.containment = [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13038 0 - this.offset.relative.left - this.offset.parent.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13039 0 - this.offset.relative.top - this.offset.parent.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13040 $(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13041 ($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13042 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13043 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13044
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13045 if(!(/^(document|window|parent)$/).test(o.containment)) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13046 ce = $(o.containment)[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13047 co = $(o.containment).offset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13048 over = ($(ce).css("overflow") !== "hidden");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13049
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13050 this.containment = [
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13051 co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13052 co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13053 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,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13054 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
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13055 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13056 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13057
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13058 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13059
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13060 _convertPositionTo: function(d, pos) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13061
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13062 if(!pos) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13063 pos = this.position;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13064 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13065 var mod = d === "absolute" ? 1 : -1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13066 scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13067 scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13068
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13069 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13070 top: (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13071 pos.top + // The absolute mouse position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13072 this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13073 this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13074 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13075 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13076 left: (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13077 pos.left + // The absolute mouse position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13078 this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13079 this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13080 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13081 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13082 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13083
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13084 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13085
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13086 _generatePosition: function(event) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13087
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13088 var top, left,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13089 o = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13090 pageX = event.pageX,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13091 pageY = event.pageY,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13092 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);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13093
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13094 // This is another very weird special case that only happens for relative elements:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13095 // 1. If the css position is relative
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13096 // 2. and the scroll parent is the document or similar to the offset parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13097 // we have to refresh the relative offset during the scroll so there are no jumps
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13098 if(this.cssPosition === "relative" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13099 this.offset.relative = this._getRelativeOffset();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13100 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13101
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13102 /*
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13103 * - Position constraining -
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13104 * Constrain the position to a mix of grid, containment.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13105 */
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13106
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13107 if(this.originalPosition) { //If we are not dragging yet, we won't check for options
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13108
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13109 if(this.containment) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13110 if(event.pageX - this.offset.click.left < this.containment[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13111 pageX = this.containment[0] + this.offset.click.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13112 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13113 if(event.pageY - this.offset.click.top < this.containment[1]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13114 pageY = this.containment[1] + this.offset.click.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13115 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13116 if(event.pageX - this.offset.click.left > this.containment[2]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13117 pageX = this.containment[2] + this.offset.click.left;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13118 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13119 if(event.pageY - this.offset.click.top > this.containment[3]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13120 pageY = this.containment[3] + this.offset.click.top;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13121 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13122 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13123
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13124 if(o.grid) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13125 top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13126 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;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13127
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13128 left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13129 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;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13130 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13131
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13132 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13133
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13134 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13135 top: (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13136 pageY - // The absolute mouse position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13137 this.offset.click.top - // Click offset (relative to the element)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13138 this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13139 this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13140 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13141 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13142 left: (
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13143 pageX - // The absolute mouse position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13144 this.offset.click.left - // Click offset (relative to the element)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13145 this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13146 this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13147 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13148 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13149 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13150
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13151 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13152
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13153 _rearrange: function(event, i, a, hardRefresh) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13154
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13155 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));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13156
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13157 //Various things done here to improve the performance:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13158 // 1. we create a setTimeout, that calls refreshPositions
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13159 // 2. on the instance, we have a counter variable, that get's higher after every append
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13160 // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13161 // 4. this lets only the last addition to the timeout stack through
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13162 this.counter = this.counter ? ++this.counter : 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13163 var counter = this.counter;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13164
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13165 this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13166 if(counter === this.counter) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13167 this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13168 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13169 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13170
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13171 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13172
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13173 _clear: function(event, noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13174
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13175 this.reverting = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13176 // We delay all events that have to be triggered to after the point where the placeholder has been removed and
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13177 // everything else normalized again
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13178 var i,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13179 delayedTriggers = [];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13180
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13181 // We first have to update the dom position of the actual currentItem
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13182 // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13183 if(!this._noFinalSort && this.currentItem.parent().length) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13184 this.placeholder.before(this.currentItem);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13185 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13186 this._noFinalSort = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13187
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13188 if(this.helper[0] === this.currentItem[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13189 for(i in this._storedCSS) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13190 if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13191 this._storedCSS[i] = "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13192 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13193 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13194 this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13195 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13196 this.currentItem.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13197 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13198
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13199 if(this.fromOutside && !noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13200 delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13201 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13202 if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13203 delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13204 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13205
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13206 // Check if the items Container has Changed and trigger appropriate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13207 // events.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13208 if (this !== this.currentContainer) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13209 if(!noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13210 delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13211 delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13212 delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13213 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13214 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13215
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13216
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13217 //Post events to containers
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13218 function delayEvent( type, instance, container ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13219 return function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13220 container._trigger( type, event, instance._uiHash( instance ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13221 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13222 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13223 for (i = this.containers.length - 1; i >= 0; i--){
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13224 if (!noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13225 delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13226 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13227 if(this.containers[i].containerCache.over) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13228 delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13229 this.containers[i].containerCache.over = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13230 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13231 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13232
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13233 //Do what was originally in plugins
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13234 if ( this.storedCursor ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13235 this.document.find( "body" ).css( "cursor", this.storedCursor );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13236 this.storedStylesheet.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13237 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13238 if(this._storedOpacity) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13239 this.helper.css("opacity", this._storedOpacity);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13240 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13241 if(this._storedZIndex) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13242 this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13243 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13244
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13245 this.dragging = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13246 if(this.cancelHelperRemoval) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13247 if(!noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13248 this._trigger("beforeStop", event, this._uiHash());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13249 for (i=0; i < delayedTriggers.length; i++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13250 delayedTriggers[i].call(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13251 } //Trigger all delayed events
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13252 this._trigger("stop", event, this._uiHash());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13253 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13254
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13255 this.fromOutside = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13256 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13257 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13258
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13259 if(!noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13260 this._trigger("beforeStop", event, this._uiHash());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13261 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13262
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13263 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13264 this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13265
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13266 if(this.helper[0] !== this.currentItem[0]) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13267 this.helper.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13268 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13269 this.helper = null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13270
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13271 if(!noPropagation) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13272 for (i=0; i < delayedTriggers.length; i++) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13273 delayedTriggers[i].call(this, event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13274 } //Trigger all delayed events
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13275 this._trigger("stop", event, this._uiHash());
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13276 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13277
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13278 this.fromOutside = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13279 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13280
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13281 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13282
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13283 _trigger: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13284 if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13285 this.cancel();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13286 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13287 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13288
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13289 _uiHash: function(_inst) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13290 var inst = _inst || this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13291 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13292 helper: inst.helper,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13293 placeholder: inst.placeholder || $([]),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13294 position: inst.position,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13295 originalPosition: inst.originalPosition,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13296 offset: inst.positionAbs,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13297 item: inst.currentItem,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13298 sender: _inst ? _inst.element : null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13299 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13300 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13301
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13302 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13303
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13304 })(jQuery);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13305 (function( $ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13306
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13307 function modifier( fn ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13308 return function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13309 var previous = this.element.val();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13310 fn.apply( this, arguments );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13311 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13312 if ( previous !== this.element.val() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13313 this._trigger( "change" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13314 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13315 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13316 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13317
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13318 $.widget( "ui.spinner", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13319 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13320 defaultElement: "<input>",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13321 widgetEventPrefix: "spin",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13322 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13323 culture: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13324 icons: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13325 down: "ui-icon-triangle-1-s",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13326 up: "ui-icon-triangle-1-n"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13327 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13328 incremental: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13329 max: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13330 min: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13331 numberFormat: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13332 page: 10,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13333 step: 1,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13334
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13335 change: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13336 spin: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13337 start: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13338 stop: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13339 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13340
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13341 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13342 // handle string values that need to be parsed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13343 this._setOption( "max", this.options.max );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13344 this._setOption( "min", this.options.min );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13345 this._setOption( "step", this.options.step );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13346
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13347 // Only format if there is a value, prevents the field from being marked
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13348 // as invalid in Firefox, see #9573.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13349 if ( this.value() !== "" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13350 // Format the value, but don't constrain.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13351 this._value( this.element.val(), true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13352 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13353
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13354 this._draw();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13355 this._on( this._events );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13356 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13357
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13358 // turning off autocomplete prevents the browser from remembering the
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13359 // value when navigating through history, so we re-enable autocomplete
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13360 // if the page is unloaded before the widget is destroyed. #7790
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13361 this._on( this.window, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13362 beforeunload: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13363 this.element.removeAttr( "autocomplete" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13364 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13365 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13366 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13367
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13368 _getCreateOptions: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13369 var options = {},
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13370 element = this.element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13371
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13372 $.each( [ "min", "max", "step" ], function( i, option ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13373 var value = element.attr( option );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13374 if ( value !== undefined && value.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13375 options[ option ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13376 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13377 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13378
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13379 return options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13380 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13381
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13382 _events: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13383 keydown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13384 if ( this._start( event ) && this._keydown( event ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13385 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13386 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13387 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13388 keyup: "_stop",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13389 focus: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13390 this.previous = this.element.val();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13391 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13392 blur: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13393 if ( this.cancelBlur ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13394 delete this.cancelBlur;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13395 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13396 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13397
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13398 this._stop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13399 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13400 if ( this.previous !== this.element.val() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13401 this._trigger( "change", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13402 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13403 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13404 mousewheel: function( event, delta ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13405 if ( !delta ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13406 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13407 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13408 if ( !this.spinning && !this._start( event ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13409 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13410 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13411
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13412 this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13413 clearTimeout( this.mousewheelTimer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13414 this.mousewheelTimer = this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13415 if ( this.spinning ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13416 this._stop( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13417 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13418 }, 100 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13419 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13420 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13421 "mousedown .ui-spinner-button": function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13422 var previous;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13423
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13424 // We never want the buttons to have focus; whenever the user is
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13425 // interacting with the spinner, the focus should be on the input.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13426 // If the input is focused then this.previous is properly set from
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13427 // when the input first received focus. If the input is not focused
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13428 // then we need to set this.previous based on the value before spinning.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13429 previous = this.element[0] === this.document[0].activeElement ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13430 this.previous : this.element.val();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13431 function checkFocus() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13432 var isActive = this.element[0] === this.document[0].activeElement;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13433 if ( !isActive ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13434 this.element.focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13435 this.previous = previous;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13436 // support: IE
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13437 // IE sets focus asynchronously, so we need to check if focus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13438 // moved off of the input because the user clicked on the button.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13439 this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13440 this.previous = previous;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13441 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13442 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13443 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13444
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13445 // ensure focus is on (or stays on) the text field
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13446 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13447 checkFocus.call( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13448
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13449 // support: IE
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13450 // IE doesn't prevent moving focus even with event.preventDefault()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13451 // so we set a flag to know when we should ignore the blur event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13452 // and check (again) if focus moved off of the input.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13453 this.cancelBlur = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13454 this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13455 delete this.cancelBlur;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13456 checkFocus.call( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13457 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13458
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13459 if ( this._start( event ) === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13460 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13461 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13462
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13463 this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13464 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13465 "mouseup .ui-spinner-button": "_stop",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13466 "mouseenter .ui-spinner-button": function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13467 // button will add ui-state-active if mouse was down while mouseleave and kept down
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13468 if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13469 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13470 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13471
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13472 if ( this._start( event ) === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13473 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13474 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13475 this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13476 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13477 // TODO: do we really want to consider this a stop?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13478 // shouldn't we just stop the repeater and wait until mouseup before
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13479 // we trigger the stop event?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13480 "mouseleave .ui-spinner-button": "_stop"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13481 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13482
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13483 _draw: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13484 var uiSpinner = this.uiSpinner = this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13485 .addClass( "ui-spinner-input" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13486 .attr( "autocomplete", "off" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13487 .wrap( this._uiSpinnerHtml() )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13488 .parent()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13489 // add buttons
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13490 .append( this._buttonHtml() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13491
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13492 this.element.attr( "role", "spinbutton" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13493
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13494 // button bindings
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13495 this.buttons = uiSpinner.find( ".ui-spinner-button" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13496 .attr( "tabIndex", -1 )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13497 .button()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13498 .removeClass( "ui-corner-all" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13499
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13500 // IE 6 doesn't understand height: 50% for the buttons
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13501 // unless the wrapper has an explicit height
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13502 if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13503 uiSpinner.height() > 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13504 uiSpinner.height( uiSpinner.height() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13505 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13506
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13507 // disable spinner if element was already disabled
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13508 if ( this.options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13509 this.disable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13510 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13511 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13512
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13513 _keydown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13514 var options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13515 keyCode = $.ui.keyCode;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13516
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13517 switch ( event.keyCode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13518 case keyCode.UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13519 this._repeat( null, 1, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13520 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13521 case keyCode.DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13522 this._repeat( null, -1, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13523 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13524 case keyCode.PAGE_UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13525 this._repeat( null, options.page, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13526 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13527 case keyCode.PAGE_DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13528 this._repeat( null, -options.page, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13529 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13530 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13531
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13532 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13533 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13534
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13535 _uiSpinnerHtml: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13536 return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13537 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13538
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13539 _buttonHtml: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13540 return "" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13541 "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13542 "<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13543 "</a>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13544 "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13545 "<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13546 "</a>";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13547 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13548
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13549 _start: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13550 if ( !this.spinning && this._trigger( "start", event ) === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13551 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13552 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13553
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13554 if ( !this.counter ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13555 this.counter = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13556 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13557 this.spinning = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13558 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13559 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13560
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13561 _repeat: function( i, steps, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13562 i = i || 500;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13563
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13564 clearTimeout( this.timer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13565 this.timer = this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13566 this._repeat( 40, steps, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13567 }, i );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13568
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13569 this._spin( steps * this.options.step, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13570 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13571
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13572 _spin: function( step, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13573 var value = this.value() || 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13574
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13575 if ( !this.counter ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13576 this.counter = 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13577 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13578
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13579 value = this._adjustValue( value + step * this._increment( this.counter ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13580
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13581 if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13582 this._value( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13583 this.counter++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13584 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13585 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13586
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13587 _increment: function( i ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13588 var incremental = this.options.incremental;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13589
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13590 if ( incremental ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13591 return $.isFunction( incremental ) ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13592 incremental( i ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13593 Math.floor( i*i*i/50000 - i*i/500 + 17*i/200 + 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13594 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13595
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13596 return 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13597 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13598
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13599 _precision: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13600 var precision = this._precisionOf( this.options.step );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13601 if ( this.options.min !== null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13602 precision = Math.max( precision, this._precisionOf( this.options.min ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13603 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13604 return precision;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13605 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13606
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13607 _precisionOf: function( num ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13608 var str = num.toString(),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13609 decimal = str.indexOf( "." );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13610 return decimal === -1 ? 0 : str.length - decimal - 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13611 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13612
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13613 _adjustValue: function( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13614 var base, aboveMin,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13615 options = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13616
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13617 // make sure we're at a valid step
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13618 // - find out where we are relative to the base (min or 0)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13619 base = options.min !== null ? options.min : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13620 aboveMin = value - base;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13621 // - round to the nearest step
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13622 aboveMin = Math.round(aboveMin / options.step) * options.step;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13623 // - rounding is based on 0, so adjust back to our base
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13624 value = base + aboveMin;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13625
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13626 // fix precision from bad JS floating point math
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13627 value = parseFloat( value.toFixed( this._precision() ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13628
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13629 // clamp the value
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13630 if ( options.max !== null && value > options.max) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13631 return options.max;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13632 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13633 if ( options.min !== null && value < options.min ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13634 return options.min;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13635 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13636
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13637 return value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13638 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13639
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13640 _stop: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13641 if ( !this.spinning ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13642 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13643 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13644
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13645 clearTimeout( this.timer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13646 clearTimeout( this.mousewheelTimer );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13647 this.counter = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13648 this.spinning = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13649 this._trigger( "stop", event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13650 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13651
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13652 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13653 if ( key === "culture" || key === "numberFormat" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13654 var prevValue = this._parse( this.element.val() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13655 this.options[ key ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13656 this.element.val( this._format( prevValue ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13657 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13658 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13659
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13660 if ( key === "max" || key === "min" || key === "step" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13661 if ( typeof value === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13662 value = this._parse( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13663 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13664 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13665 if ( key === "icons" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13666 this.buttons.first().find( ".ui-icon" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13667 .removeClass( this.options.icons.up )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13668 .addClass( value.up );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13669 this.buttons.last().find( ".ui-icon" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13670 .removeClass( this.options.icons.down )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13671 .addClass( value.down );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13672 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13673
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13674 this._super( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13675
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13676 if ( key === "disabled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13677 if ( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13678 this.element.prop( "disabled", true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13679 this.buttons.button( "disable" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13680 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13681 this.element.prop( "disabled", false );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13682 this.buttons.button( "enable" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13683 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13684 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13685 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13686
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13687 _setOptions: modifier(function( options ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13688 this._super( options );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13689 this._value( this.element.val() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13690 }),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13691
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13692 _parse: function( val ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13693 if ( typeof val === "string" && val !== "" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13694 val = window.Globalize && this.options.numberFormat ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13695 Globalize.parseFloat( val, 10, this.options.culture ) : +val;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13696 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13697 return val === "" || isNaN( val ) ? null : val;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13698 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13699
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13700 _format: function( value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13701 if ( value === "" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13702 return "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13703 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13704 return window.Globalize && this.options.numberFormat ?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13705 Globalize.format( value, this.options.numberFormat, this.options.culture ) :
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13706 value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13707 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13708
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13709 _refresh: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13710 this.element.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13711 "aria-valuemin": this.options.min,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13712 "aria-valuemax": this.options.max,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13713 // TODO: what should we do with values that can't be parsed?
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13714 "aria-valuenow": this._parse( this.element.val() )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13715 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13716 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13717
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13718 // update the value without triggering change
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13719 _value: function( value, allowAny ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13720 var parsed;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13721 if ( value !== "" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13722 parsed = this._parse( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13723 if ( parsed !== null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13724 if ( !allowAny ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13725 parsed = this._adjustValue( parsed );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13726 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13727 value = this._format( parsed );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13728 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13729 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13730 this.element.val( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13731 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13732 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13733
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13734 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13735 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13736 .removeClass( "ui-spinner-input" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13737 .prop( "disabled", false )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13738 .removeAttr( "autocomplete" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13739 .removeAttr( "role" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13740 .removeAttr( "aria-valuemin" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13741 .removeAttr( "aria-valuemax" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13742 .removeAttr( "aria-valuenow" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13743 this.uiSpinner.replaceWith( this.element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13744 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13745
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13746 stepUp: modifier(function( steps ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13747 this._stepUp( steps );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13748 }),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13749 _stepUp: function( steps ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13750 if ( this._start() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13751 this._spin( (steps || 1) * this.options.step );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13752 this._stop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13753 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13754 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13755
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13756 stepDown: modifier(function( steps ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13757 this._stepDown( steps );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13758 }),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13759 _stepDown: function( steps ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13760 if ( this._start() ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13761 this._spin( (steps || 1) * -this.options.step );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13762 this._stop();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13763 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13764 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13765
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13766 pageUp: modifier(function( pages ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13767 this._stepUp( (pages || 1) * this.options.page );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13768 }),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13769
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13770 pageDown: modifier(function( pages ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13771 this._stepDown( (pages || 1) * this.options.page );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13772 }),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13773
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13774 value: function( newVal ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13775 if ( !arguments.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13776 return this._parse( this.element.val() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13777 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13778 modifier( this._value ).call( this, newVal );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13779 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13780
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13781 widget: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13782 return this.uiSpinner;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13783 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13784 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13785
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13786 }( jQuery ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13787 (function( $, undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13788
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13789 var tabId = 0,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13790 rhash = /#.*$/;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13791
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13792 function getNextTabId() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13793 return ++tabId;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13794 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13795
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13796 function isLocal( anchor ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13797 // support: IE7
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13798 // IE7 doesn't normalize the href property when set via script (#9317)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13799 anchor = anchor.cloneNode( false );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13800
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13801 return anchor.hash.length > 1 &&
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13802 decodeURIComponent( anchor.href.replace( rhash, "" ) ) ===
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13803 decodeURIComponent( location.href.replace( rhash, "" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13804 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13805
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13806 $.widget( "ui.tabs", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13807 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13808 delay: 300,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13809 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13810 active: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13811 collapsible: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13812 event: "click",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13813 heightStyle: "content",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13814 hide: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13815 show: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13816
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13817 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13818 activate: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13819 beforeActivate: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13820 beforeLoad: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13821 load: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13822 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13823
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13824 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13825 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13826 options = this.options;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13827
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13828 this.running = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13829
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13830 this.element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13831 .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13832 .toggleClass( "ui-tabs-collapsible", options.collapsible )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13833 // Prevent users from focusing disabled tabs via click
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13834 .delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13835 if ( $( this ).is( ".ui-state-disabled" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13836 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13837 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13838 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13839 // support: IE <9
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13840 // Preventing the default action in mousedown doesn't prevent IE
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13841 // from focusing the element, so if the anchor gets focused, blur.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13842 // We don't have to worry about focusing the previously focused
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13843 // element since clicking on a non-focusable element should focus
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13844 // the body anyway.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13845 .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13846 if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13847 this.blur();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13848 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13849 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13850
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13851 this._processTabs();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13852 options.active = this._initialActive();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13853
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13854 // Take disabling tabs via class attribute from HTML
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13855 // into account and update option properly.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13856 if ( $.isArray( options.disabled ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13857 options.disabled = $.unique( options.disabled.concat(
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13858 $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13859 return that.tabs.index( li );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13860 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13861 ) ).sort();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13862 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13863
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13864 // check for length avoids error when initializing empty list
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13865 if ( this.options.active !== false && this.anchors.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13866 this.active = this._findActive( options.active );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13867 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13868 this.active = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13869 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13870
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13871 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13872
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13873 if ( this.active.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13874 this.load( options.active );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13875 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13876 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13877
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13878 _initialActive: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13879 var active = this.options.active,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13880 collapsible = this.options.collapsible,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13881 locationHash = location.hash.substring( 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13882
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13883 if ( active === null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13884 // check the fragment identifier in the URL
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13885 if ( locationHash ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13886 this.tabs.each(function( i, tab ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13887 if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13888 active = i;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13889 return false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13890 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13891 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13892 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13893
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13894 // check for a tab marked active via a class
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13895 if ( active === null ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13896 active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13897 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13898
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13899 // no active tab, set to false
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13900 if ( active === null || active === -1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13901 active = this.tabs.length ? 0 : false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13902 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13903 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13904
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13905 // handle numbers: negative, out of range
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13906 if ( active !== false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13907 active = this.tabs.index( this.tabs.eq( active ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13908 if ( active === -1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13909 active = collapsible ? false : 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13910 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13911 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13912
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13913 // don't allow collapsible: false and active: false
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13914 if ( !collapsible && active === false && this.anchors.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13915 active = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13916 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13917
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13918 return active;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13919 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13920
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13921 _getCreateEventData: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13922 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13923 tab: this.active,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13924 panel: !this.active.length ? $() : this._getPanelForTab( this.active )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13925 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13926 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13927
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13928 _tabKeydown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13929 var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13930 selectedIndex = this.tabs.index( focusedTab ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13931 goingForward = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13932
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13933 if ( this._handlePageNav( event ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13934 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13935 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13936
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13937 switch ( event.keyCode ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13938 case $.ui.keyCode.RIGHT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13939 case $.ui.keyCode.DOWN:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13940 selectedIndex++;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13941 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13942 case $.ui.keyCode.UP:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13943 case $.ui.keyCode.LEFT:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13944 goingForward = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13945 selectedIndex--;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13946 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13947 case $.ui.keyCode.END:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13948 selectedIndex = this.anchors.length - 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13949 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13950 case $.ui.keyCode.HOME:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13951 selectedIndex = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13952 break;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13953 case $.ui.keyCode.SPACE:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13954 // Activate only, no collapsing
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13955 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13956 clearTimeout( this.activating );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13957 this._activate( selectedIndex );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13958 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13959 case $.ui.keyCode.ENTER:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13960 // Toggle (cancel delayed activation, allow collapsing)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13961 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13962 clearTimeout( this.activating );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13963 // Determine if we should collapse or activate
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13964 this._activate( selectedIndex === this.options.active ? false : selectedIndex );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13965 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13966 default:
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13967 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13968 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13969
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13970 // Focus the appropriate tab, based on which key was pressed
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13971 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13972 clearTimeout( this.activating );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13973 selectedIndex = this._focusNextTab( selectedIndex, goingForward );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13974
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13975 // Navigating with control key will prevent automatic activation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13976 if ( !event.ctrlKey ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13977 // Update aria-selected immediately so that AT think the tab is already selected.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13978 // Otherwise AT may confuse the user by stating that they need to activate the tab,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13979 // but the tab will already be activated by the time the announcement finishes.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13980 focusedTab.attr( "aria-selected", "false" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13981 this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13982
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13983 this.activating = this._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13984 this.option( "active", selectedIndex );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13985 }, this.delay );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13986 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13987 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13988
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13989 _panelKeydown: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13990 if ( this._handlePageNav( event ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13991 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13992 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13993
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13994 // Ctrl+up moves focus to the current tab
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13995 if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13996 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13997 this.active.focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13998 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
13999 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14000
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14001 // Alt+page up/down moves focus to the previous/next tab (and activates)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14002 _handlePageNav: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14003 if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14004 this._activate( this._focusNextTab( this.options.active - 1, false ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14005 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14006 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14007 if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14008 this._activate( this._focusNextTab( this.options.active + 1, true ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14009 return true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14010 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14011 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14012
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14013 _findNextTab: function( index, goingForward ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14014 var lastTabIndex = this.tabs.length - 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14015
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14016 function constrain() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14017 if ( index > lastTabIndex ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14018 index = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14019 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14020 if ( index < 0 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14021 index = lastTabIndex;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14022 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14023 return index;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14024 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14025
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14026 while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14027 index = goingForward ? index + 1 : index - 1;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14028 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14029
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14030 return index;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14031 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14032
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14033 _focusNextTab: function( index, goingForward ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14034 index = this._findNextTab( index, goingForward );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14035 this.tabs.eq( index ).focus();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14036 return index;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14037 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14038
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14039 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14040 if ( key === "active" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14041 // _activate() will handle invalid values and update this.options
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14042 this._activate( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14043 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14044 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14045
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14046 if ( key === "disabled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14047 // don't use the widget factory's disabled handling
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14048 this._setupDisabled( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14049 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14050 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14051
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14052 this._super( key, value);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14053
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14054 if ( key === "collapsible" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14055 this.element.toggleClass( "ui-tabs-collapsible", value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14056 // Setting collapsible: false while collapsed; open first panel
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14057 if ( !value && this.options.active === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14058 this._activate( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14059 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14060 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14061
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14062 if ( key === "event" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14063 this._setupEvents( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14064 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14065
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14066 if ( key === "heightStyle" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14067 this._setupHeightStyle( value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14068 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14069 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14070
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14071 _tabId: function( tab ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14072 return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14073 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14074
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14075 _sanitizeSelector: function( hash ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14076 return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14077 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14078
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14079 refresh: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14080 var options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14081 lis = this.tablist.children( ":has(a[href])" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14082
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14083 // get disabled tabs from class attribute from HTML
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14084 // this will get converted to a boolean if needed in _refresh()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14085 options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14086 return lis.index( tab );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14087 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14088
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14089 this._processTabs();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14090
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14091 // was collapsed or no tabs
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14092 if ( options.active === false || !this.anchors.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14093 options.active = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14094 this.active = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14095 // was active, but active tab is gone
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14096 } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14097 // all remaining tabs are disabled
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14098 if ( this.tabs.length === options.disabled.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14099 options.active = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14100 this.active = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14101 // activate previous tab
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14102 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14103 this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14104 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14105 // was active, active tab still exists
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14106 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14107 // make sure active index is correct
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14108 options.active = this.tabs.index( this.active );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14109 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14110
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14111 this._refresh();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14112 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14113
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14114 _refresh: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14115 this._setupDisabled( this.options.disabled );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14116 this._setupEvents( this.options.event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14117 this._setupHeightStyle( this.options.heightStyle );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14118
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14119 this.tabs.not( this.active ).attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14120 "aria-selected": "false",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14121 tabIndex: -1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14122 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14123 this.panels.not( this._getPanelForTab( this.active ) )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14124 .hide()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14125 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14126 "aria-expanded": "false",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14127 "aria-hidden": "true"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14128 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14129
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14130 // Make sure one tab is in the tab order
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14131 if ( !this.active.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14132 this.tabs.eq( 0 ).attr( "tabIndex", 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14133 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14134 this.active
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14135 .addClass( "ui-tabs-active ui-state-active" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14136 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14137 "aria-selected": "true",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14138 tabIndex: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14139 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14140 this._getPanelForTab( this.active )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14141 .show()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14142 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14143 "aria-expanded": "true",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14144 "aria-hidden": "false"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14145 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14146 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14147 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14148
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14149 _processTabs: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14150 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14151
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14152 this.tablist = this._getList()
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14153 .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14154 .attr( "role", "tablist" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14155
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14156 this.tabs = this.tablist.find( "> li:has(a[href])" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14157 .addClass( "ui-state-default ui-corner-top" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14158 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14159 role: "tab",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14160 tabIndex: -1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14161 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14162
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14163 this.anchors = this.tabs.map(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14164 return $( "a", this )[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14165 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14166 .addClass( "ui-tabs-anchor" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14167 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14168 role: "presentation",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14169 tabIndex: -1
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14170 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14171
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14172 this.panels = $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14173
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14174 this.anchors.each(function( i, anchor ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14175 var selector, panel, panelId,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14176 anchorId = $( anchor ).uniqueId().attr( "id" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14177 tab = $( anchor ).closest( "li" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14178 originalAriaControls = tab.attr( "aria-controls" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14179
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14180 // inline tab
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14181 if ( isLocal( anchor ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14182 selector = anchor.hash;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14183 panel = that.element.find( that._sanitizeSelector( selector ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14184 // remote tab
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14185 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14186 panelId = that._tabId( tab );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14187 selector = "#" + panelId;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14188 panel = that.element.find( selector );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14189 if ( !panel.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14190 panel = that._createPanel( panelId );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14191 panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14192 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14193 panel.attr( "aria-live", "polite" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14194 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14195
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14196 if ( panel.length) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14197 that.panels = that.panels.add( panel );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14198 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14199 if ( originalAriaControls ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14200 tab.data( "ui-tabs-aria-controls", originalAriaControls );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14201 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14202 tab.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14203 "aria-controls": selector.substring( 1 ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14204 "aria-labelledby": anchorId
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14205 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14206 panel.attr( "aria-labelledby", anchorId );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14207 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14208
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14209 this.panels
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14210 .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14211 .attr( "role", "tabpanel" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14212 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14213
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14214 // allow overriding how to find the list for rare usage scenarios (#7715)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14215 _getList: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14216 return this.tablist || this.element.find( "ol,ul" ).eq( 0 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14217 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14218
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14219 _createPanel: function( id ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14220 return $( "<div>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14221 .attr( "id", id )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14222 .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14223 .data( "ui-tabs-destroy", true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14224 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14225
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14226 _setupDisabled: function( disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14227 if ( $.isArray( disabled ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14228 if ( !disabled.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14229 disabled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14230 } else if ( disabled.length === this.anchors.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14231 disabled = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14232 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14233 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14234
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14235 // disable tabs
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14236 for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14237 if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14238 $( li )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14239 .addClass( "ui-state-disabled" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14240 .attr( "aria-disabled", "true" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14241 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14242 $( li )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14243 .removeClass( "ui-state-disabled" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14244 .removeAttr( "aria-disabled" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14245 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14246 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14247
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14248 this.options.disabled = disabled;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14249 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14250
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14251 _setupEvents: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14252 var events = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14253 click: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14254 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14255 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14256 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14257 if ( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14258 $.each( event.split(" "), function( index, eventName ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14259 events[ eventName ] = "_eventHandler";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14260 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14261 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14262
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14263 this._off( this.anchors.add( this.tabs ).add( this.panels ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14264 this._on( this.anchors, events );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14265 this._on( this.tabs, { keydown: "_tabKeydown" } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14266 this._on( this.panels, { keydown: "_panelKeydown" } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14267
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14268 this._focusable( this.tabs );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14269 this._hoverable( this.tabs );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14270 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14271
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14272 _setupHeightStyle: function( heightStyle ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14273 var maxHeight,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14274 parent = this.element.parent();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14275
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14276 if ( heightStyle === "fill" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14277 maxHeight = parent.height();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14278 maxHeight -= this.element.outerHeight() - this.element.height();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14279
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14280 this.element.siblings( ":visible" ).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14281 var elem = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14282 position = elem.css( "position" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14283
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14284 if ( position === "absolute" || position === "fixed" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14285 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14286 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14287 maxHeight -= elem.outerHeight( true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14288 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14289
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14290 this.element.children().not( this.panels ).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14291 maxHeight -= $( this ).outerHeight( true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14292 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14293
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14294 this.panels.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14295 $( this ).height( Math.max( 0, maxHeight -
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14296 $( this ).innerHeight() + $( this ).height() ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14297 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14298 .css( "overflow", "auto" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14299 } else if ( heightStyle === "auto" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14300 maxHeight = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14301 this.panels.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14302 maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14303 }).height( maxHeight );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14304 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14305 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14306
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14307 _eventHandler: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14308 var options = this.options,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14309 active = this.active,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14310 anchor = $( event.currentTarget ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14311 tab = anchor.closest( "li" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14312 clickedIsActive = tab[ 0 ] === active[ 0 ],
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14313 collapsing = clickedIsActive && options.collapsible,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14314 toShow = collapsing ? $() : this._getPanelForTab( tab ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14315 toHide = !active.length ? $() : this._getPanelForTab( active ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14316 eventData = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14317 oldTab: active,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14318 oldPanel: toHide,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14319 newTab: collapsing ? $() : tab,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14320 newPanel: toShow
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14321 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14322
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14323 event.preventDefault();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14324
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14325 if ( tab.hasClass( "ui-state-disabled" ) ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14326 // tab is already loading
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14327 tab.hasClass( "ui-tabs-loading" ) ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14328 // can't switch durning an animation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14329 this.running ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14330 // click on active header, but not collapsible
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14331 ( clickedIsActive && !options.collapsible ) ||
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14332 // allow canceling activation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14333 ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14334 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14335 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14336
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14337 options.active = collapsing ? false : this.tabs.index( tab );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14338
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14339 this.active = clickedIsActive ? $() : tab;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14340 if ( this.xhr ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14341 this.xhr.abort();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14342 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14343
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14344 if ( !toHide.length && !toShow.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14345 $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14346 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14347
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14348 if ( toShow.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14349 this.load( this.tabs.index( tab ), event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14350 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14351 this._toggle( event, eventData );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14352 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14353
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14354 // handles show/hide for selecting tabs
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14355 _toggle: function( event, eventData ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14356 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14357 toShow = eventData.newPanel,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14358 toHide = eventData.oldPanel;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14359
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14360 this.running = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14361
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14362 function complete() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14363 that.running = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14364 that._trigger( "activate", event, eventData );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14365 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14366
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14367 function show() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14368 eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14369
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14370 if ( toShow.length && that.options.show ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14371 that._show( toShow, that.options.show, complete );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14372 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14373 toShow.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14374 complete();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14375 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14376 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14377
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14378 // start out by hiding, then showing, then completing
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14379 if ( toHide.length && this.options.hide ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14380 this._hide( toHide, this.options.hide, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14381 eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14382 show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14383 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14384 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14385 eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14386 toHide.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14387 show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14388 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14389
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14390 toHide.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14391 "aria-expanded": "false",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14392 "aria-hidden": "true"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14393 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14394 eventData.oldTab.attr( "aria-selected", "false" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14395 // If we're switching tabs, remove the old tab from the tab order.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14396 // If we're opening from collapsed state, remove the previous tab from the tab order.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14397 // If we're collapsing, then keep the collapsing tab in the tab order.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14398 if ( toShow.length && toHide.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14399 eventData.oldTab.attr( "tabIndex", -1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14400 } else if ( toShow.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14401 this.tabs.filter(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14402 return $( this ).attr( "tabIndex" ) === 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14403 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14404 .attr( "tabIndex", -1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14405 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14406
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14407 toShow.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14408 "aria-expanded": "true",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14409 "aria-hidden": "false"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14410 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14411 eventData.newTab.attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14412 "aria-selected": "true",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14413 tabIndex: 0
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14414 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14415 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14416
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14417 _activate: function( index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14418 var anchor,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14419 active = this._findActive( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14420
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14421 // trying to activate the already active panel
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14422 if ( active[ 0 ] === this.active[ 0 ] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14423 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14424 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14425
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14426 // trying to collapse, simulate a click on the current active header
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14427 if ( !active.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14428 active = this.active;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14429 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14430
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14431 anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14432 this._eventHandler({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14433 target: anchor,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14434 currentTarget: anchor,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14435 preventDefault: $.noop
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14436 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14437 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14438
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14439 _findActive: function( index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14440 return index === false ? $() : this.tabs.eq( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14441 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14442
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14443 _getIndex: function( index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14444 // meta-function to give users option to provide a href string instead of a numerical index.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14445 if ( typeof index === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14446 index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14447 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14448
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14449 return index;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14450 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14451
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14452 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14453 if ( this.xhr ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14454 this.xhr.abort();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14455 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14456
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14457 this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14458
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14459 this.tablist
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14460 .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14461 .removeAttr( "role" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14462
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14463 this.anchors
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14464 .removeClass( "ui-tabs-anchor" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14465 .removeAttr( "role" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14466 .removeAttr( "tabIndex" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14467 .removeUniqueId();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14468
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14469 this.tabs.add( this.panels ).each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14470 if ( $.data( this, "ui-tabs-destroy" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14471 $( this ).remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14472 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14473 $( this )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14474 .removeClass( "ui-state-default ui-state-active ui-state-disabled " +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14475 "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14476 .removeAttr( "tabIndex" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14477 .removeAttr( "aria-live" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14478 .removeAttr( "aria-busy" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14479 .removeAttr( "aria-selected" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14480 .removeAttr( "aria-labelledby" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14481 .removeAttr( "aria-hidden" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14482 .removeAttr( "aria-expanded" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14483 .removeAttr( "role" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14484 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14485 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14486
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14487 this.tabs.each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14488 var li = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14489 prev = li.data( "ui-tabs-aria-controls" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14490 if ( prev ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14491 li
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14492 .attr( "aria-controls", prev )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14493 .removeData( "ui-tabs-aria-controls" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14494 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14495 li.removeAttr( "aria-controls" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14496 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14497 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14498
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14499 this.panels.show();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14500
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14501 if ( this.options.heightStyle !== "content" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14502 this.panels.css( "height", "" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14503 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14504 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14505
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14506 enable: function( index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14507 var disabled = this.options.disabled;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14508 if ( disabled === false ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14509 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14510 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14511
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14512 if ( index === undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14513 disabled = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14514 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14515 index = this._getIndex( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14516 if ( $.isArray( disabled ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14517 disabled = $.map( disabled, function( num ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14518 return num !== index ? num : null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14519 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14520 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14521 disabled = $.map( this.tabs, function( li, num ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14522 return num !== index ? num : null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14523 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14524 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14525 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14526 this._setupDisabled( disabled );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14527 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14528
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14529 disable: function( index ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14530 var disabled = this.options.disabled;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14531 if ( disabled === true ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14532 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14533 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14534
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14535 if ( index === undefined ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14536 disabled = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14537 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14538 index = this._getIndex( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14539 if ( $.inArray( index, disabled ) !== -1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14540 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14541 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14542 if ( $.isArray( disabled ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14543 disabled = $.merge( [ index ], disabled ).sort();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14544 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14545 disabled = [ index ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14546 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14547 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14548 this._setupDisabled( disabled );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14549 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14550
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14551 load: function( index, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14552 index = this._getIndex( index );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14553 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14554 tab = this.tabs.eq( index ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14555 anchor = tab.find( ".ui-tabs-anchor" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14556 panel = this._getPanelForTab( tab ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14557 eventData = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14558 tab: tab,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14559 panel: panel
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14560 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14561
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14562 // not remote
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14563 if ( isLocal( anchor[ 0 ] ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14564 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14565 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14566
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14567 this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14568
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14569 // support: jQuery <1.8
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14570 // jQuery <1.8 returns false if the request is canceled in beforeSend,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14571 // but as of 1.8, $.ajax() always returns a jqXHR object.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14572 if ( this.xhr && this.xhr.statusText !== "canceled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14573 tab.addClass( "ui-tabs-loading" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14574 panel.attr( "aria-busy", "true" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14575
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14576 this.xhr
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14577 .success(function( response ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14578 // support: jQuery <1.8
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14579 // http://bugs.jquery.com/ticket/11778
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14580 setTimeout(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14581 panel.html( response );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14582 that._trigger( "load", event, eventData );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14583 }, 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14584 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14585 .complete(function( jqXHR, status ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14586 // support: jQuery <1.8
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14587 // http://bugs.jquery.com/ticket/11778
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14588 setTimeout(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14589 if ( status === "abort" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14590 that.panels.stop( false, true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14591 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14592
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14593 tab.removeClass( "ui-tabs-loading" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14594 panel.removeAttr( "aria-busy" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14595
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14596 if ( jqXHR === that.xhr ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14597 delete that.xhr;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14598 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14599 }, 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14600 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14601 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14602 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14603
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14604 _ajaxSettings: function( anchor, event, eventData ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14605 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14606 return {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14607 url: anchor.attr( "href" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14608 beforeSend: function( jqXHR, settings ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14609 return that._trigger( "beforeLoad", event,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14610 $.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14611 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14612 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14613 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14614
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14615 _getPanelForTab: function( tab ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14616 var id = $( tab ).attr( "aria-controls" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14617 return this.element.find( this._sanitizeSelector( "#" + id ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14618 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14619 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14620
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14621 })( jQuery );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14622 (function( $ ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14623
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14624 var increments = 0;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14625
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14626 function addDescribedBy( elem, id ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14627 var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14628 describedby.push( id );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14629 elem
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14630 .data( "ui-tooltip-id", id )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14631 .attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14632 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14633
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14634 function removeDescribedBy( elem ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14635 var id = elem.data( "ui-tooltip-id" ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14636 describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14637 index = $.inArray( id, describedby );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14638 if ( index !== -1 ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14639 describedby.splice( index, 1 );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14640 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14641
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14642 elem.removeData( "ui-tooltip-id" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14643 describedby = $.trim( describedby.join( " " ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14644 if ( describedby ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14645 elem.attr( "aria-describedby", describedby );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14646 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14647 elem.removeAttr( "aria-describedby" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14648 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14649 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14650
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14651 $.widget( "ui.tooltip", {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14652 version: "1.10.4",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14653 options: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14654 content: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14655 // support: IE<9, Opera in jQuery <1.7
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14656 // .text() can't accept undefined, so coerce to a string
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14657 var title = $( this ).attr( "title" ) || "";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14658 // Escape title, since we're going from an attribute to raw HTML
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14659 return $( "<a>" ).text( title ).html();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14660 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14661 hide: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14662 // Disabled elements have inconsistent behavior across browsers (#8661)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14663 items: "[title]:not([disabled])",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14664 position: {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14665 my: "left top+15",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14666 at: "left bottom",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14667 collision: "flipfit flip"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14668 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14669 show: true,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14670 tooltipClass: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14671 track: false,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14672
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14673 // callbacks
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14674 close: null,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14675 open: null
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14676 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14677
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14678 _create: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14679 this._on({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14680 mouseover: "open",
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14681 focusin: "open"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14682 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14683
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14684 // IDs of generated tooltips, needed for destroy
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14685 this.tooltips = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14686 // IDs of parent tooltips where we removed the title attribute
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14687 this.parents = {};
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14688
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14689 if ( this.options.disabled ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14690 this._disable();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14691 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14692 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14693
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14694 _setOption: function( key, value ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14695 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14696
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14697 if ( key === "disabled" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14698 this[ value ? "_disable" : "_enable" ]();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14699 this.options[ key ] = value;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14700 // disable element style changes
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14701 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14702 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14703
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14704 this._super( key, value );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14705
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14706 if ( key === "content" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14707 $.each( this.tooltips, function( id, element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14708 that._updateContent( element );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14709 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14710 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14711 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14712
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14713 _disable: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14714 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14715
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14716 // close open tooltips
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14717 $.each( this.tooltips, function( id, element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14718 var event = $.Event( "blur" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14719 event.target = event.currentTarget = element[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14720 that.close( event, true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14721 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14722
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14723 // remove title attributes to prevent native tooltips
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14724 this.element.find( this.options.items ).addBack().each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14725 var element = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14726 if ( element.is( "[title]" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14727 element
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14728 .data( "ui-tooltip-title", element.attr( "title" ) )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14729 .attr( "title", "" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14730 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14731 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14732 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14733
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14734 _enable: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14735 // restore title attributes
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14736 this.element.find( this.options.items ).addBack().each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14737 var element = $( this );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14738 if ( element.data( "ui-tooltip-title" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14739 element.attr( "title", element.data( "ui-tooltip-title" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14740 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14741 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14742 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14743
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14744 open: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14745 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14746 target = $( event ? event.target : this.element )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14747 // we need closest here due to mouseover bubbling,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14748 // but always pointing at the same event target
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14749 .closest( this.options.items );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14750
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14751 // No element to show a tooltip for or the tooltip is already open
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14752 if ( !target.length || target.data( "ui-tooltip-id" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14753 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14754 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14755
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14756 if ( target.attr( "title" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14757 target.data( "ui-tooltip-title", target.attr( "title" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14758 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14759
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14760 target.data( "ui-tooltip-open", true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14761
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14762 // kill parent tooltips, custom or native, for hover
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14763 if ( event && event.type === "mouseover" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14764 target.parents().each(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14765 var parent = $( this ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14766 blurEvent;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14767 if ( parent.data( "ui-tooltip-open" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14768 blurEvent = $.Event( "blur" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14769 blurEvent.target = blurEvent.currentTarget = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14770 that.close( blurEvent, true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14771 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14772 if ( parent.attr( "title" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14773 parent.uniqueId();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14774 that.parents[ this.id ] = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14775 element: this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14776 title: parent.attr( "title" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14777 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14778 parent.attr( "title", "" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14779 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14780 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14781 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14782
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14783 this._updateContent( target, event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14784 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14785
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14786 _updateContent: function( target, event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14787 var content,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14788 contentOption = this.options.content,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14789 that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14790 eventType = event ? event.type : null;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14791
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14792 if ( typeof contentOption === "string" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14793 return this._open( event, target, contentOption );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14794 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14795
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14796 content = contentOption.call( target[0], function( response ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14797 // ignore async response if tooltip was closed already
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14798 if ( !target.data( "ui-tooltip-open" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14799 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14800 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14801 // IE may instantly serve a cached response for ajax requests
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14802 // delay this call to _open so the other call to _open runs first
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14803 that._delay(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14804 // jQuery creates a special event for focusin when it doesn't
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14805 // exist natively. To improve performance, the native event
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14806 // object is reused and the type is changed. Therefore, we can't
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14807 // rely on the type being correct after the event finished
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14808 // bubbling, so we set it back to the previous value. (#8740)
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14809 if ( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14810 event.type = eventType;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14811 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14812 this._open( event, target, response );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14813 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14814 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14815 if ( content ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14816 this._open( event, target, content );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14817 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14818 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14819
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14820 _open: function( event, target, content ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14821 var tooltip, events, delayedShow,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14822 positionOption = $.extend( {}, this.options.position );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14823
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14824 if ( !content ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14825 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14826 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14827
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14828 // Content can be updated multiple times. If the tooltip already
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14829 // exists, then just update the content and bail.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14830 tooltip = this._find( target );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14831 if ( tooltip.length ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14832 tooltip.find( ".ui-tooltip-content" ).html( content );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14833 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14834 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14835
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14836 // if we have a title, clear it to prevent the native tooltip
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14837 // we have to check first to avoid defining a title if none exists
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14838 // (we don't want to cause an element to start matching [title])
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14839 //
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14840 // We use removeAttr only for key events, to allow IE to export the correct
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14841 // accessible attributes. For mouse events, set to empty string to avoid
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14842 // native tooltip showing up (happens only when removing inside mouseover).
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14843 if ( target.is( "[title]" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14844 if ( event && event.type === "mouseover" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14845 target.attr( "title", "" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14846 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14847 target.removeAttr( "title" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14848 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14849 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14850
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14851 tooltip = this._tooltip( target );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14852 addDescribedBy( target, tooltip.attr( "id" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14853 tooltip.find( ".ui-tooltip-content" ).html( content );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14854
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14855 function position( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14856 positionOption.of = event;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14857 if ( tooltip.is( ":hidden" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14858 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14859 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14860 tooltip.position( positionOption );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14861 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14862 if ( this.options.track && event && /^mouse/.test( event.type ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14863 this._on( this.document, {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14864 mousemove: position
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14865 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14866 // trigger once to override element-relative positioning
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14867 position( event );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14868 } else {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14869 tooltip.position( $.extend({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14870 of: target
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14871 }, this.options.position ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14872 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14873
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14874 tooltip.hide();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14875
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14876 this._show( tooltip, this.options.show );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14877 // Handle tracking tooltips that are shown with a delay (#8644). As soon
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14878 // as the tooltip is visible, position the tooltip using the most recent
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14879 // event.
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14880 if ( this.options.show && this.options.show.delay ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14881 delayedShow = this.delayedShow = setInterval(function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14882 if ( tooltip.is( ":visible" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14883 position( positionOption.of );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14884 clearInterval( delayedShow );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14885 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14886 }, $.fx.interval );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14887 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14888
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14889 this._trigger( "open", event, { tooltip: tooltip } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14890
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14891 events = {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14892 keyup: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14893 if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14894 var fakeEvent = $.Event(event);
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14895 fakeEvent.currentTarget = target[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14896 this.close( fakeEvent, true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14897 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14898 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14899 remove: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14900 this._removeTooltip( tooltip );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14901 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14902 };
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14903 if ( !event || event.type === "mouseover" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14904 events.mouseleave = "close";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14905 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14906 if ( !event || event.type === "focusin" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14907 events.focusout = "close";
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14908 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14909 this._on( true, target, events );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14910 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14911
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14912 close: function( event ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14913 var that = this,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14914 target = $( event ? event.currentTarget : this.element ),
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14915 tooltip = this._find( target );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14916
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14917 // disabling closes the tooltip, so we need to track when we're closing
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14918 // to avoid an infinite loop in case the tooltip becomes disabled on close
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14919 if ( this.closing ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14920 return;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14921 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14922
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14923 // Clear the interval for delayed tracking tooltips
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14924 clearInterval( this.delayedShow );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14925
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14926 // only set title if we had one before (see comment in _open())
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14927 if ( target.data( "ui-tooltip-title" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14928 target.attr( "title", target.data( "ui-tooltip-title" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14929 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14930
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14931 removeDescribedBy( target );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14932
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14933 tooltip.stop( true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14934 this._hide( tooltip, this.options.hide, function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14935 that._removeTooltip( $( this ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14936 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14937
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14938 target.removeData( "ui-tooltip-open" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14939 this._off( target, "mouseleave focusout keyup" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14940 // Remove 'remove' binding only on delegated targets
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14941 if ( target[0] !== this.element[0] ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14942 this._off( target, "remove" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14943 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14944 this._off( this.document, "mousemove" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14945
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14946 if ( event && event.type === "mouseleave" ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14947 $.each( this.parents, function( id, parent ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14948 $( parent.element ).attr( "title", parent.title );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14949 delete that.parents[ id ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14950 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14951 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14952
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14953 this.closing = true;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14954 this._trigger( "close", event, { tooltip: tooltip } );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14955 this.closing = false;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14956 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14957
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14958 _tooltip: function( element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14959 var id = "ui-tooltip-" + increments++,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14960 tooltip = $( "<div>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14961 .attr({
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14962 id: id,
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14963 role: "tooltip"
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14964 })
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14965 .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14966 ( this.options.tooltipClass || "" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14967 $( "<div>" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14968 .addClass( "ui-tooltip-content" )
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14969 .appendTo( tooltip );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14970 tooltip.appendTo( this.document[0].body );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14971 this.tooltips[ id ] = element;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14972 return tooltip;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14973 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14974
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14975 _find: function( target ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14976 var id = target.data( "ui-tooltip-id" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14977 return id ? $( "#" + id ) : $();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14978 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14979
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14980 _removeTooltip: function( tooltip ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14981 tooltip.remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14982 delete this.tooltips[ tooltip.attr( "id" ) ];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14983 },
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14984
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14985 _destroy: function() {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14986 var that = this;
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14987
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14988 // close open tooltips
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14989 $.each( this.tooltips, function( id, element ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14990 // Delegate to close method to handle common cleanup
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14991 var event = $.Event( "blur" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14992 event.target = event.currentTarget = element[0];
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14993 that.close( event, true );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14994
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14995 // Remove immediately; destroying an open tooltip doesn't use the
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14996 // hide animation
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14997 $( "#" + id ).remove();
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14998
3c160414da2e initial upload
shiltemann
parents:
diff changeset
14999 // Restore the title
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15000 if ( element.data( "ui-tooltip-title" ) ) {
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15001 element.attr( "title", element.data( "ui-tooltip-title" ) );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15002 element.removeData( "ui-tooltip-title" );
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15003 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15004 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15005 }
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15006 });
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15007
3c160414da2e initial upload
shiltemann
parents:
diff changeset
15008 }( jQuery ) );