d1c43729a5a6ee52f72cd45cece1a8394475d393
[atutor.git] / mods / photo_album / fluid / component-templates / js / jquery.ui-1.0 / ui.slider.js
1 (function($) {\r
2 \r
3         \r
4         //Web Forms 2.0\r
5         window.webforms = 1;\r
6         if(window['webforms']) {\r
7                 $(document).ready(function() {\r
8                         \r
9                         $("input").each(function() {\r
10                                 if(this.getAttribute("type") == "range") {\r
11                                         var cur = $(this);\r
12                                         var slider = $("<div class='ui-slider'></div>").css({ width: cur.innerWidth()+"px", height: cur.innerHeight()+"px" }).insertAfter(cur);\r
13                                         var handle = $("<div class='ui-slider-handle'></div>").appendTo(slider);\r
14 \r
15 \r
16                                         slider.css({\r
17                                                 "position": cur.css("position") == "absolute" ? "absolute" : "relative",\r
18                                                 "left": cur.css("left"),\r
19                                                 "right": cur.css("right"),\r
20                                                 "zIndex": cur.css("zIndex"),\r
21                                                 "float": cur.css("float"),\r
22                                                 "clear": cur.css("clear")\r
23                                         });\r
24                                         cur.css({ position: "absolute", opacity: 0, top: "-1000px", left: "-1000px" });\r
25                                         \r
26                                         slider.slider({\r
27                                                 maxValue: cur.attr("max"),\r
28                                                 minValue: cur.attr("min"),\r
29                                                 startValue: this.getAttribute("value"),\r
30                                                 stepping: cur.attr("step"),\r
31                                                 change: function(e, ui) { cur[0].value = ui.value; cur[0].setAttribute("value", ui.value); },\r
32                                         });\r
33                                         \r
34                                         slider = slider.sliderInstance();\r
35                                         \r
36                                         cur.bind("keydown", function(e) {\r
37                                                 var o = slider.interaction.options;\r
38                                                 switch(e.keyCode) {\r
39                                                         case 37:\r
40                                                                 slider.moveTo(slider.interaction.curValue+o.minValue-(o.stepping || 1));\r
41                                                                 break;\r
42                                                         case 39:\r
43                                                                 slider.moveTo(slider.interaction.curValue+o.minValue+(o.stepping || 1));\r
44                                                                 break;  \r
45                                                 }\r
46                                                 if(e.keyCode != 9) return false;\r
47                                         });\r
48                                         \r
49                                 };      \r
50                         });\r
51                                 \r
52                 });\r
53         }\r
54 \r
55         //Make nodes selectable by expression\r
56         $.extend($.expr[':'], { slider: "(' '+a.className+' ').indexOf(' ui-slider ')" });\r
57         \r
58         $.fn.slider = function(o) {\r
59                 return this.each(function() {\r
60                         new $.ui.slider(this, o);\r
61                 });\r
62         }\r
63         \r
64         //Macros for external methods that support chaining\r
65         var methods = "destroy,enable,disable,moveTo".split(",");\r
66         for(var i=0;i<methods.length;i++) {\r
67                 var cur = methods[i], f;\r
68                 eval('f = function() { var a = arguments; return this.each(function() { if(jQuery(this).is(".ui-slider")) jQuery.data(this, "ui-slider")["'+cur+'"](a); }); }');\r
69                 $.fn["slider"+cur.substr(0,1).toUpperCase()+cur.substr(1)] = f;\r
70         };\r
71         \r
72         //get instance method\r
73         $.fn.sliderInstance = function() {\r
74                 if($(this[0]).is(".ui-slider")) return $.data(this[0], "ui-slider");\r
75                 return false;\r
76         };\r
77         \r
78         $.ui.slider = function(el, o) {\r
79                 \r
80                 var options = {};\r
81                 o = o || {};\r
82                 $.extend(options, o);\r
83                 $.extend(options, {\r
84                         axis: o.axis || (el.offsetWidth < el.offsetHeight ? 'vertical' : 'horizontal'),\r
85                         maxValue: parseInt(o.maxValue) || 100,\r
86                         minValue: parseInt(o.minValue) || 0,\r
87                         startValue: parseInt(o.startValue) || 0,\r
88                         _start: function(h, p, c, t, e) {\r
89                                 self.start.apply(t, [self, e]); // Trigger the start callback                           \r
90                         },\r
91                         _beforeStop: function(h, p, c, t, e) {\r
92                                 self.stop.apply(t, [self, e]); // Trigger the start callback\r
93                         },\r
94                         _drag: function(h, p, c, t, e) {\r
95                                 self.drag.apply(t, [self, e]); // Trigger the start callback\r
96                         },\r
97                         startCondition: function() {\r
98                                 return !self.disabled;\r
99                         }                       \r
100                 });\r
101 \r
102                 var self = this;\r
103                 var o = options;\r
104                 $.data(el, "ui-slider", this);\r
105                 o.stepping = parseInt(o.stepping) || (o.steps ? o.maxValue/o.steps : 0);\r
106                 o.realValue = (o.maxValue - o.minValue);\r
107 \r
108 \r
109                 this.handle = options.handle ? $(options.handle, el) : $('.ui-slider-handle', el);\r
110                 if(this.handle.length == 1) {\r
111                         this.interaction = new $.ui.mouseInteraction(this.handle[0], options);\r
112                         this.multipleHandles = false;\r
113                 } else {\r
114                         this.interactions = [];\r
115                         this.handle.each(function() {\r
116                                 self.interactions.push(new $.ui.mouseInteraction(this, options));\r
117                         });\r
118                         this.multipleHandles = true;\r
119                 }\r
120                 \r
121                 this.element = el;\r
122                 $(this.element).addClass("ui-slider");\r
123                 \r
124                 \r
125                 if(o.axis == 'horizontal') {\r
126                         this.parentSize = $(this.element).outerWidth() - this.handle.outerWidth();\r
127                         this.prop = 'left';\r
128                 }\r
129                 \r
130                 if(o.axis == 'vertical') {\r
131                         this.parentSize = $(this.element).outerHeight() - this.handle.outerHeight();\r
132                         this.prop = 'top';\r
133                 }\r
134                 \r
135                 if(!this.multipleHandles) {\r
136                         $(el).bind('click', function(e) { self.click.apply(self, [e]); });\r
137                         if(!isNaN(o.startValue)) this.moveTo(o.startValue,options.realValue, null, false);\r
138                 }\r
139                 \r
140         }\r
141         \r
142         $.extend($.ui.slider.prototype, {\r
143                 currentTarget: null,\r
144                 lastTarget: null,\r
145                 destroy: function() {\r
146                         $(this.element).removeClass("ui-slider").removeClass("ui-slider-disabled");\r
147                         this.interaction.destroy();\r
148                 },\r
149                 enable: function() {\r
150                         $(this.element).removeClass("ui-slider-disabled");\r
151                         this.disabled = false;\r
152                 },\r
153                 disable: function() {\r
154                         $(this.element).addClass("ui-slider-disabled");\r
155                         this.disabled = true;\r
156                 },\r
157                 nonvalidRange: function(self) {\r
158 \r
159                         for(var i=0;i<this.interactions.length;i++) {\r
160                                 if(self == this.interactions[i]) {\r
161                                         if(this.interactions[i-1]) {\r
162                                                 if(this.interactions[i-1].curValue > this.interactions[i].curValue) return this.interactions[i-1].curValue;\r
163                                         }\r
164                                         \r
165                                         if(this.interactions[i+1]) {\r
166                                                 if(this.interactions[i+1].curValue < this.interactions[i].curValue) return this.interactions[i+1].curValue;\r
167                                         }\r
168                                 }\r
169                         }\r
170                         \r
171                         return false;\r
172                         \r
173                 },\r
174                 prepareCallbackObj: function(self,m) {\r
175                         \r
176                         var cur = this;\r
177                         var func = function() {\r
178                                 var retVal = [];\r
179                                 for(var i=0;i<cur.interactions.length;i++) {\r
180                                         retVal.push((cur.interactions[i].curValue || 0)+self.options.minValue);\r
181                                 }\r
182                                 return retVal;\r
183                         };\r
184                         \r
185                         return {\r
186                                 handle: self.helper,\r
187                                 pixel: m,\r
188                                 value: self.curValue+self.options.minValue,\r
189                                 values: this.multipleHandles ? func() : self.curValue+self.options.minValue,\r
190                                 slider: self    \r
191                         }                       \r
192                 },\r
193                 click: function(e) {\r
194                         var o = this.interaction.options;\r
195                         var pointer = [e.pageX,e.pageY];\r
196                         var offset = $(this.interaction.element).offsetParent().offset({ border: false });\r
197                         if(this.interaction.element == e.target || this.disabled) return;\r
198                         \r
199                         this.interaction.pickValue = this.interaction.curValue;\r
200                         this.drag.apply(this.interaction, [this, e, [pointer[0]-offset.left-this.handle[0].offsetWidth/2,pointer[1]-offset.top-this.handle[0].offsetHeight/2]]);\r
201                         \r
202                         if(this.interaction.pickValue != this.interaction.curValue)\r
203                                 $(this.element).triggerHandler("slidechange", [e, this.prepareCallbackObj(this.interaction)], o.change);\r
204                                 \r
205                 },\r
206                 start: function(that, e) {\r
207                         \r
208                         var o = this.options;\r
209                         $(that.element).triggerHandler("slidestart", [e, that.prepareCallbackObj(this)], o.start);\r
210                         this.pickValue = this.curValue;\r
211                         \r
212                         return false;\r
213                                                 \r
214                 },\r
215                 stop: function(that, e) {                       \r
216                         \r
217                         var o = this.options;\r
218                         $(that.element).triggerHandler("slidestop", [e, that.prepareCallbackObj(this)], o.stop);\r
219                         if(this.pickValue != this.curValue) $(that.element).triggerHandler("slidechange", [e, that.prepareCallbackObj(this)], o.change);\r
220 \r
221                         return false;\r
222                         \r
223                 },\r
224                 drag: function(that, e, pos) {\r
225 \r
226                         var o = this.options;\r
227                         this.pos = pos || [this.pos[0]-this.element.offsetWidth/2, this.pos[1]-this.element.offsetHeight/2];\r
228                         \r
229                         if(o.axis == 'horizontal') var m = this.pos[0];\r
230                         if(o.axis == 'vertical')   var m = this.pos[1];\r
231                         \r
232                         \r
233                         var p = that.parentSize;\r
234                         var prop = that.prop;\r
235 \r
236                         if(m < 0) m = 0;\r
237                         if(m > p) m = p;\r
238 \r
239                         this.curValue = (Math.round((m/p)*o.realValue));\r
240                         if(o.stepping) {\r
241                                 this.curValue = Math.round(this.curValue/o.stepping)*o.stepping;\r
242                                 m = ((this.curValue)/o.realValue) * p;\r
243                         }\r
244                         \r
245                         if(that.interactions) {\r
246                                 nonvalidRange = that.nonvalidRange(this);\r
247                                 if(nonvalidRange) {\r
248                                         this.curValue = nonvalidRange;\r
249                                         m = ((this.curValue)/o.realValue) * p;\r
250                                 }\r
251                         }\r
252                         \r
253                         $(this.element).css(prop, m+'px');\r
254                         $(that.element).triggerHandler("slide", [e, that.prepareCallbackObj(this,m)], o.slide);\r
255                         return false;\r
256                         \r
257                 },\r
258                 moveTo: function(value,scale,changeslide,p) {   // renamed from goto to moveTo as goto is reserved javascript word\r
259                         \r
260                         if(this.multipleHandles) return false; //TODO: Multiple handle moveTo function\r
261                         \r
262                         var o = this.interaction.options;\r
263                         var offset = $(this.interaction.element).offsetParent().offset({ border: false });\r
264                         this.interaction.pickValue = this.interaction.curValue;\r
265                         value = value-o.minValue;\r
266                         \r
267                         var modifier = scale || o.realValue;\r
268                         \r
269                         var p = this.parentSize;\r
270                         var prop = this.prop;\r
271                         \r
272                         m = Math.round(((value)/modifier) * p);\r
273 \r
274                         if(m < 0) m = 0;\r
275                         if(m > p) m = p;\r
276                         \r
277                         this.interaction.curValue = (Math.round((m/p)*o.realValue));\r
278                         if(o.stepping) {\r
279                                 this.interaction.curValue = Math.round(this.interaction.curValue/o.stepping)*o.stepping;\r
280                                 m = ((this.interaction.curValue)/o.realValue) * p;\r
281                         }\r
282 \r
283                         $(this.interaction.element).css(prop, m+'px');\r
284                         \r
285                         if(!changeslide && this.interaction.pickValue != this.interaction.curValue && !p)\r
286                                 $(this.element).triggerHandler("slidechange", [e, this.prepareCallbackObj(this.interaction)], o.change);\r
287                         \r
288                         if(changeslide)\r
289                                 $(this.element).triggerHandler("slide", [e, this.prepareCallbackObj(this.interaction)], o.slide);\r
290 \r
291                 }\r
292         });\r
293 \r
294 })($);\r