1 /* automatically generated from prototype/prototype.js, do not edit ! */
2 @"/* Prototype JavaScript framework, version 1.3.1\n"
3 @" * (c) 2005 Sam Stephenson <sam@conio.net>\n"
5 @" * THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff\n"
6 @" * against the source tree, available from the Prototype darcs repository. \n"
8 @" * Prototype is freely distributable under the terms of an MIT-style license.\n"
10 @" * For details, see the Prototype web site: http://prototype.conio.net/\n"
12 @"/*--------------------------------------------------------------------------*/\n"
13 @"var Prototype = {\n"
14 @" Version: '1.3.1',\n"
15 @" emptyFunction: function() {}\n"
18 @" create: function() {\n"
19 @" return function() { \n"
20 @" this.initialize.apply(this, arguments);\n"
24 @"var Abstract = new Object();\n"
25 @"Object.extend = function(destination, source) {\n"
26 @" for (property in source) {\n"
27 @" destination[property] = source[property];\n"
29 @" return destination;\n"
31 @"Object.prototype.extend = function(object) {\n"
32 @" return Object.extend.apply(this, [this, object]);\n"
34 @"Function.prototype.bind = function(object) {\n"
35 @" var __method = this;\n"
36 @" return function() {\n"
37 @" __method.apply(object, arguments);\n"
40 @"Function.prototype.bindAsEventListener = function(object) {\n"
41 @" var __method = this;\n"
42 @" return function(event) {\n"
43 @" __method.call(object, event || window.event);\n"
46 @"Number.prototype.toColorPart = function() {\n"
47 @" var digits = this.toString(16);\n"
48 @" if (this < 16) return '0' + digits;\n"
52 @" these: function() {\n"
53 @" var returnValue;\n"
54 @" for (var i = 0; i < arguments.length; i++) {\n"
55 @" var lambda = arguments[i];\n"
57 @" returnValue = lambda();\n"
61 @" return returnValue;\n"
64 @"/*--------------------------------------------------------------------------*/\n"
65 @"var PeriodicalExecuter = Class.create();\n"
66 @"PeriodicalExecuter.prototype = {\n"
67 @" initialize: function(callback, frequency) {\n"
68 @" this.callback = callback;\n"
69 @" this.frequency = frequency;\n"
70 @" this.currentlyExecuting = false;\n"
71 @" this.registerCallback();\n"
73 @" registerCallback: function() {\n"
74 @" setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\n"
76 @" onTimerEvent: function() {\n"
77 @" if (!this.currentlyExecuting) {\n"
79 @" this.currentlyExecuting = true;\n"
80 @" this.callback(); \n"
82 @" this.currentlyExecuting = false;\n"
87 @"/*--------------------------------------------------------------------------*/\n"
89 @" var elements = new Array();\n"
90 @" for (var i = 0; i < arguments.length; i++) {\n"
91 @" var element = arguments[i];\n"
92 @" if (typeof element == 'string')\n"
93 @" element = document.getElementById(element);\n"
94 @" if (arguments.length == 1) \n"
96 @" elements.push(element);\n"
98 @" return elements;\n"
100 @"if (!Array.prototype.push) {\n"
101 @" Array.prototype.push = function() {\n"
102 @" var startLength = this.length;\n"
103 @" for (var i = 0; i < arguments.length; i++)\n"
104 @" this[startLength + i] = arguments[i];\n"
105 @" return this.length;\n"
108 @"if (!Function.prototype.apply) {\n"
109 @" // Based on code from http://www.youngpup.net/\n"
110 @" Function.prototype.apply = function(object, parameters) {\n"
111 @" var parameterStrings = new Array();\n"
112 @" if (!object) object = window;\n"
113 @" if (!parameters) parameters = new Array();\n"
115 @" for (var i = 0; i < parameters.length; i++)\n"
116 @" parameterStrings[i] = 'parameters[' + i + ']';\n"
118 @" object.__apply__ = this;\n"
119 @" var result = eval('object.__apply__(' + \n"
120 @" parameterStrings[i].join(', ') + ')');\n"
121 @" object.__apply__ = null;\n"
126 @"String.prototype.extend({\n"
127 @" stripTags: function() {\n"
128 @" return this.replace(/<\\/?[^>]+>/gi, '');\n"
130 @" escapeHTML: function() {\n"
131 @" var div = document.createElement('div');\n"
132 @" var text = document.createTextNode(this);\n"
133 @" div.appendChild(text);\n"
134 @" return div.innerHTML;\n"
136 @" unescapeHTML: function() {\n"
137 @" var div = document.createElement('div');\n"
138 @" div.innerHTML = this.stripTags();\n"
139 @" return div.childNodes[0].nodeValue;\n"
143 @" getTransport: function() {\n"
144 @" return Try.these(\n"
145 @" function() {return new ActiveXObject('Msxml2.XMLHTTP')},\n"
146 @" function() {return new ActiveXObject('Microsoft.XMLHTTP')},\n"
147 @" function() {return new XMLHttpRequest()}\n"
151 @"Ajax.Base = function() {};\n"
152 @"Ajax.Base.prototype = {\n"
153 @" setOptions: function(options) {\n"
154 @" this.options = {\n"
155 @" method: 'post',\n"
156 @" asynchronous: true,\n"
158 @" }.extend(options || {});\n"
160 @" responseIsSuccess: function() {\n"
161 @" return this.transport.status == undefined\n"
162 @" || this.transport.status == 0 \n"
163 @" || (this.transport.status >= 200 && this.transport.status < 300);\n"
165 @" responseIsFailure: function() {\n"
166 @" return !this.responseIsSuccess();\n"
169 @"Ajax.Request = Class.create();\n"
170 @"Ajax.Request.Events = \n"
171 @" ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];\n"
172 @"Ajax.Request.prototype = (new Ajax.Base()).extend({\n"
173 @" initialize: function(url, options) {\n"
174 @" this.transport = Ajax.getTransport();\n"
175 @" this.setOptions(options);\n"
176 @" this.request(url);\n"
178 @" request: function(url) {\n"
179 @" var parameters = this.options.parameters || '';\n"
180 @" if (parameters.length > 0) parameters += '&_=';\n"
182 @" if (this.options.method == 'get')\n"
183 @" url += '?' + parameters;\n"
184 @" this.transport.open(this.options.method, url,\n"
185 @" this.options.asynchronous);\n"
186 @" if (this.options.asynchronous) {\n"
187 @" this.transport.onreadystatechange = this.onStateChange.bind(this);\n"
188 @" setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);\n"
190 @" this.setRequestHeaders();\n"
191 @" var body = this.options.postBody ? this.options.postBody : parameters;\n"
192 @" this.transport.send(this.options.method == 'post' ? body : null);\n"
196 @" setRequestHeaders: function() {\n"
197 @" var requestHeaders = \n"
198 @" ['X-Requested-With', 'XMLHttpRequest',\n"
199 @" 'X-Prototype-Version', Prototype.Version];\n"
200 @" if (this.options.method == 'post') {\n"
201 @" requestHeaders.push('Content-type', \n"
202 @" 'application/x-www-form-urlencoded');\n"
203 @" /* Force \"Connection: close\" for Mozilla browsers to work around\n"
204 @" * a bug where XMLHttpReqeuest sends an incorrect Content-length\n"
205 @" * header. See Mozilla Bugzilla #246651. \n"
207 @" if (this.transport.overrideMimeType)\n"
208 @" requestHeaders.push('Connection', 'close');\n"
210 @" if (this.options.requestHeaders)\n"
211 @" requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);\n"
212 @" for (var i = 0; i < requestHeaders.length; i += 2)\n"
213 @" this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);\n"
215 @" onStateChange: function() {\n"
216 @" var readyState = this.transport.readyState;\n"
217 @" if (readyState != 1)\n"
218 @" this.respondToReadyState(this.transport.readyState);\n"
220 @" respondToReadyState: function(readyState) {\n"
221 @" var event = Ajax.Request.Events[readyState];\n"
222 @" if (event == 'Complete')\n"
223 @" (this.options['on' + this.transport.status]\n"
224 @" || this.options['on' + this.responseIsSuccess() ? 'Success' : 'Failure']\n"
225 @" || Prototype.emptyFunction)(this.transport);\n"
226 @" (this.options['on' + event] || Prototype.emptyFunction)(this.transport);\n"
227 @" /* Avoid memory leak in MSIE: clean up the oncomplete event handler */\n"
228 @" if (event == 'Complete')\n"
229 @" this.transport.onreadystatechange = Prototype.emptyFunction;\n"
232 @"Ajax.Updater = Class.create();\n"
233 @"Ajax.Updater.ScriptFragment = '(?:<script.*?>)((\\n|.)*?)(?:<\\/script>)';\n"
234 @"Ajax.Updater.prototype.extend(Ajax.Request.prototype).extend({\n"
235 @" initialize: function(container, url, options) {\n"
236 @" this.containers = {\n"
237 @" success: container.success ? $(container.success) : $(container),\n"
238 @" failure: container.failure ? $(container.failure) :\n"
239 @" (container.success ? null : $(container))\n"
241 @" this.transport = Ajax.getTransport();\n"
242 @" this.setOptions(options);\n"
243 @" var onComplete = this.options.onComplete || Prototype.emptyFunction;\n"
244 @" this.options.onComplete = (function() {\n"
245 @" this.updateContent();\n"
246 @" onComplete(this.transport);\n"
248 @" this.request(url);\n"
250 @" updateContent: function() {\n"
251 @" var receiver = this.responseIsSuccess() ?\n"
252 @" this.containers.success : this.containers.failure;\n"
253 @" var match = new RegExp(Ajax.Updater.ScriptFragment, 'img');\n"
254 @" var response = this.transport.responseText.replace(match, '');\n"
255 @" var scripts = this.transport.responseText.match(match);\n"
256 @" if (receiver) {\n"
257 @" if (this.options.insertion) {\n"
258 @" new this.options.insertion(receiver, response);\n"
260 @" receiver.innerHTML = response;\n"
263 @" if (this.responseIsSuccess()) {\n"
264 @" if (this.onComplete)\n"
265 @" setTimeout((function() {this.onComplete(\n"
266 @" this.transport)}).bind(this), 10);\n"
268 @" if (this.options.evalScripts && scripts) {\n"
269 @" match = new RegExp(Ajax.Updater.ScriptFragment, 'im');\n"
270 @" setTimeout((function() {\n"
271 @" for (var i = 0; i < scripts.length; i++)\n"
272 @" eval(scripts[i].match(match)[1]);\n"
273 @" }).bind(this), 10);\n"
277 @"Ajax.PeriodicalUpdater = Class.create();\n"
278 @"Ajax.PeriodicalUpdater.prototype = (new Ajax.Base()).extend({\n"
279 @" initialize: function(container, url, options) {\n"
280 @" this.setOptions(options);\n"
281 @" this.onComplete = this.options.onComplete;\n"
282 @" this.frequency = (this.options.frequency || 2);\n"
283 @" this.decay = 1;\n"
284 @" this.updater = {};\n"
285 @" this.container = container;\n"
286 @" this.url = url;\n"
289 @" start: function() {\n"
290 @" this.options.onComplete = this.updateComplete.bind(this);\n"
291 @" this.onTimerEvent();\n"
293 @" stop: function() {\n"
294 @" this.updater.onComplete = undefined;\n"
295 @" clearTimeout(this.timer);\n"
296 @" (this.onComplete || Ajax.emptyFunction).apply(this, arguments);\n"
298 @" updateComplete: function(request) {\n"
299 @" if (this.options.decay) {\n"
300 @" this.decay = (request.responseText == this.lastText ? \n"
301 @" this.decay * this.options.decay : 1);\n"
302 @" this.lastText = request.responseText;\n"
304 @" this.timer = setTimeout(this.onTimerEvent.bind(this), \n"
305 @" this.decay * this.frequency * 1000);\n"
307 @" onTimerEvent: function() {\n"
308 @" this.updater = new Ajax.Updater(this.container, this.url, this.options);\n"
311 @"document.getElementsByClassName = function(className) {\n"
312 @" var children = document.getElementsByTagName('*') || document.all;\n"
313 @" var elements = new Array();\n"
315 @" for (var i = 0; i < children.length; i++) {\n"
316 @" var child = children[i];\n"
317 @" var classNames = child.className.split(' ');\n"
318 @" for (var j = 0; j < classNames.length; j++) {\n"
319 @" if (classNames[j] == className) {\n"
320 @" elements.push(child);\n"
326 @" return elements;\n"
328 @"/*--------------------------------------------------------------------------*/\n"
329 @"if (!window.Element) {\n"
330 @" var Element = new Object();\n"
332 @"Object.extend(Element, {\n"
333 @" toggle: function() {\n"
334 @" for (var i = 0; i < arguments.length; i++) {\n"
335 @" var element = $(arguments[i]);\n"
336 @" element.style.display = \n"
337 @" (element.style.display == 'none' ? '' : 'none');\n"
340 @" hide: function() {\n"
341 @" for (var i = 0; i < arguments.length; i++) {\n"
342 @" var element = $(arguments[i]);\n"
343 @" element.style.display = 'none';\n"
346 @" show: function() {\n"
347 @" for (var i = 0; i < arguments.length; i++) {\n"
348 @" var element = $(arguments[i]);\n"
349 @" element.style.display = '';\n"
352 @" remove: function(element) {\n"
353 @" element = $(element);\n"
354 @" element.parentNode.removeChild(element);\n"
357 @" getHeight: function(element) {\n"
358 @" element = $(element);\n"
359 @" return element.offsetHeight; \n"
361 @" hasClassName: function(element, className) {\n"
362 @" element = $(element);\n"
365 @" var a = element.className.split(' ');\n"
366 @" for (var i = 0; i < a.length; i++) {\n"
367 @" if (a[i] == className)\n"
372 @" addClassName: function(element, className) {\n"
373 @" element = $(element);\n"
374 @" Element.removeClassName(element, className);\n"
375 @" element.className += ' ' + className;\n"
377 @" removeClassName: function(element, className) {\n"
378 @" element = $(element);\n"
381 @" var newClassName = '';\n"
382 @" var a = element.className.split(' ');\n"
383 @" for (var i = 0; i < a.length; i++) {\n"
384 @" if (a[i] != className) {\n"
386 @" newClassName += ' ';\n"
387 @" newClassName += a[i];\n"
390 @" element.className = newClassName;\n"
393 @" // removes whitespace-only text node children\n"
394 @" cleanWhitespace: function(element) {\n"
395 @" var element = $(element);\n"
396 @" for (var i = 0; i < element.childNodes.length; i++) {\n"
397 @" var node = element.childNodes[i];\n"
398 @" if (node.nodeType == 3 && !/\\S/.test(node.nodeValue)) \n"
399 @" Element.remove(node);\n"
403 @"var Toggle = new Object();\n"
404 @"Toggle.display = Element.toggle;\n"
405 @"/*--------------------------------------------------------------------------*/\n"
406 @"Abstract.Insertion = function(adjacency) {\n"
407 @" this.adjacency = adjacency;\n"
409 @"Abstract.Insertion.prototype = {\n"
410 @" initialize: function(element, content) {\n"
411 @" this.element = $(element);\n"
412 @" this.content = content;\n"
414 @" if (this.adjacency && this.element.insertAdjacentHTML) {\n"
415 @" this.element.insertAdjacentHTML(this.adjacency, this.content);\n"
417 @" this.range = this.element.ownerDocument.createRange();\n"
418 @" if (this.initializeRange) this.initializeRange();\n"
419 @" this.fragment = this.range.createContextualFragment(this.content);\n"
420 @" this.insertContent();\n"
424 @"var Insertion = new Object();\n"
425 @"Insertion.Before = Class.create();\n"
426 @"Insertion.Before.prototype = (new Abstract.Insertion('beforeBegin')).extend({\n"
427 @" initializeRange: function() {\n"
428 @" this.range.setStartBefore(this.element);\n"
431 @" insertContent: function() {\n"
432 @" this.element.parentNode.insertBefore(this.fragment, this.element);\n"
435 @"Insertion.Top = Class.create();\n"
436 @"Insertion.Top.prototype = (new Abstract.Insertion('afterBegin')).extend({\n"
437 @" initializeRange: function() {\n"
438 @" this.range.selectNodeContents(this.element);\n"
439 @" this.range.collapse(true);\n"
442 @" insertContent: function() { \n"
443 @" this.element.insertBefore(this.fragment, this.element.firstChild);\n"
446 @"Insertion.Bottom = Class.create();\n"
447 @"Insertion.Bottom.prototype = (new Abstract.Insertion('beforeEnd')).extend({\n"
448 @" initializeRange: function() {\n"
449 @" this.range.selectNodeContents(this.element);\n"
450 @" this.range.collapse(this.element);\n"
453 @" insertContent: function() {\n"
454 @" this.element.appendChild(this.fragment);\n"
457 @"Insertion.After = Class.create();\n"
458 @"Insertion.After.prototype = (new Abstract.Insertion('afterEnd')).extend({\n"
459 @" initializeRange: function() {\n"
460 @" this.range.setStartAfter(this.element);\n"
463 @" insertContent: function() {\n"
464 @" this.element.parentNode.insertBefore(this.fragment, \n"
465 @" this.element.nextSibling);\n"
469 @" clear: function() {\n"
470 @" for (var i = 0; i < arguments.length; i++)\n"
471 @" $(arguments[i]).value = '';\n"
473 @" focus: function(element) {\n"
474 @" $(element).focus();\n"
477 @" present: function() {\n"
478 @" for (var i = 0; i < arguments.length; i++)\n"
479 @" if ($(arguments[i]).value == '') return false;\n"
483 @" select: function(element) {\n"
484 @" $(element).select();\n"
487 @" activate: function(element) {\n"
488 @" $(element).focus();\n"
489 @" $(element).select();\n"
492 @"/*--------------------------------------------------------------------------*/\n"
494 @" serialize: function(form) {\n"
495 @" var elements = Form.getElements($(form));\n"
496 @" var queryComponents = new Array();\n"
498 @" for (var i = 0; i < elements.length; i++) {\n"
499 @" var queryComponent = Form.Element.serialize(elements[i]);\n"
500 @" if (queryComponent)\n"
501 @" queryComponents.push(queryComponent);\n"
504 @" return queryComponents.join('&');\n"
507 @" getElements: function(form) {\n"
508 @" var form = $(form);\n"
509 @" var elements = new Array();\n"
510 @" for (tagName in Form.Element.Serializers) {\n"
511 @" var tagElements = form.getElementsByTagName(tagName);\n"
512 @" for (var j = 0; j < tagElements.length; j++)\n"
513 @" elements.push(tagElements[j]);\n"
515 @" return elements;\n"
518 @" getInputs: function(form, typeName, name) {\n"
519 @" var form = $(form);\n"
520 @" var inputs = form.getElementsByTagName('input');\n"
522 @" if (!typeName && !name)\n"
525 @" var matchingInputs = new Array();\n"
526 @" for (var i = 0; i < inputs.length; i++) {\n"
527 @" var input = inputs[i];\n"
528 @" if ((typeName && input.type != typeName) ||\n"
529 @" (name && input.name != name)) \n"
531 @" matchingInputs.push(input);\n"
533 @" return matchingInputs;\n"
535 @" disable: function(form) {\n"
536 @" var elements = Form.getElements(form);\n"
537 @" for (var i = 0; i < elements.length; i++) {\n"
538 @" var element = elements[i];\n"
539 @" element.blur();\n"
540 @" element.disabled = 'true';\n"
543 @" enable: function(form) {\n"
544 @" var elements = Form.getElements(form);\n"
545 @" for (var i = 0; i < elements.length; i++) {\n"
546 @" var element = elements[i];\n"
547 @" element.disabled = '';\n"
550 @" focusFirstElement: function(form) {\n"
551 @" var form = $(form);\n"
552 @" var elements = Form.getElements(form);\n"
553 @" for (var i = 0; i < elements.length; i++) {\n"
554 @" var element = elements[i];\n"
555 @" if (element.type != 'hidden' && !element.disabled) {\n"
556 @" Field.activate(element);\n"
561 @" reset: function(form) {\n"
562 @" $(form).reset();\n"
565 @"Form.Element = {\n"
566 @" serialize: function(element) {\n"
567 @" var element = $(element);\n"
568 @" var method = element.tagName.toLowerCase();\n"
569 @" var parameter = Form.Element.Serializers[method](element);\n"
572 @" return encodeURIComponent(parameter[0]) + '=' + \n"
573 @" encodeURIComponent(parameter[1]); \n"
576 @" getValue: function(element) {\n"
577 @" var element = $(element);\n"
578 @" var method = element.tagName.toLowerCase();\n"
579 @" var parameter = Form.Element.Serializers[method](element);\n"
581 @" if (parameter) \n"
582 @" return parameter[1];\n"
585 @"Form.Element.Serializers = {\n"
586 @" input: function(element) {\n"
587 @" switch (element.type.toLowerCase()) {\n"
590 @" case 'password':\n"
592 @" return Form.Element.Serializers.textarea(element);\n"
593 @" case 'checkbox': \n"
595 @" return Form.Element.Serializers.inputSelector(element);\n"
599 @" inputSelector: function(element) {\n"
600 @" if (element.checked)\n"
601 @" return [element.name, element.value];\n"
603 @" textarea: function(element) {\n"
604 @" return [element.name, element.value];\n"
606 @" select: function(element) {\n"
607 @" var value = '';\n"
608 @" if (element.type == 'select-one') {\n"
609 @" var index = element.selectedIndex;\n"
610 @" if (index >= 0)\n"
611 @" value = element.options[index].value || element.options[index].text;\n"
613 @" value = new Array();\n"
614 @" for (var i = 0; i < element.length; i++) {\n"
615 @" var opt = element.options[i];\n"
616 @" if (opt.selected)\n"
617 @" value.push(opt.value || opt.text);\n"
620 @" return [element.name, value];\n"
623 @"/*--------------------------------------------------------------------------*/\n"
624 @"var $F = Form.Element.getValue;\n"
625 @"/*--------------------------------------------------------------------------*/\n"
626 @"Abstract.TimedObserver = function() {}\n"
627 @"Abstract.TimedObserver.prototype = {\n"
628 @" initialize: function(element, frequency, callback) {\n"
629 @" this.frequency = frequency;\n"
630 @" this.element = $(element);\n"
631 @" this.callback = callback;\n"
633 @" this.lastValue = this.getValue();\n"
634 @" this.registerCallback();\n"
637 @" registerCallback: function() {\n"
638 @" setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\n"
641 @" onTimerEvent: function() {\n"
642 @" var value = this.getValue();\n"
643 @" if (this.lastValue != value) {\n"
644 @" this.callback(this.element, value);\n"
645 @" this.lastValue = value;\n"
649 @"Form.Element.Observer = Class.create();\n"
650 @"Form.Element.Observer.prototype = (new Abstract.TimedObserver()).extend({\n"
651 @" getValue: function() {\n"
652 @" return Form.Element.getValue(this.element);\n"
655 @"Form.Observer = Class.create();\n"
656 @"Form.Observer.prototype = (new Abstract.TimedObserver()).extend({\n"
657 @" getValue: function() {\n"
658 @" return Form.serialize(this.element);\n"
661 @"/*--------------------------------------------------------------------------*/\n"
662 @"Abstract.EventObserver = function() {}\n"
663 @"Abstract.EventObserver.prototype = {\n"
664 @" initialize: function(element, callback) {\n"
665 @" this.element = $(element);\n"
666 @" this.callback = callback;\n"
668 @" this.lastValue = this.getValue();\n"
669 @" if (this.element.tagName.toLowerCase() == 'form')\n"
670 @" this.registerFormCallbacks();\n"
672 @" this.registerCallback(this.element);\n"
675 @" onElementEvent: function() {\n"
676 @" var value = this.getValue();\n"
677 @" if (this.lastValue != value) {\n"
678 @" this.callback(this.element, value);\n"
679 @" this.lastValue = value;\n"
683 @" registerFormCallbacks: function() {\n"
684 @" var elements = Form.getElements(this.element);\n"
685 @" for (var i = 0; i < elements.length; i++)\n"
686 @" this.registerCallback(elements[i]);\n"
689 @" registerCallback: function(element) {\n"
690 @" if (element.type) {\n"
691 @" switch (element.type.toLowerCase()) {\n"
692 @" case 'checkbox': \n"
694 @" element.target = this;\n"
695 @" element.prev_onclick = element.onclick || Prototype.emptyFunction;\n"
696 @" element.onclick = function() {\n"
697 @" this.prev_onclick(); \n"
698 @" this.target.onElementEvent();\n"
701 @" case 'password':\n"
703 @" case 'textarea':\n"
704 @" case 'select-one':\n"
705 @" case 'select-multiple':\n"
706 @" element.target = this;\n"
707 @" element.prev_onchange = element.onchange || Prototype.emptyFunction;\n"
708 @" element.onchange = function() {\n"
709 @" this.prev_onchange(); \n"
710 @" this.target.onElementEvent();\n"
717 @"Form.Element.EventObserver = Class.create();\n"
718 @"Form.Element.EventObserver.prototype = (new Abstract.EventObserver()).extend({\n"
719 @" getValue: function() {\n"
720 @" return Form.Element.getValue(this.element);\n"
723 @"Form.EventObserver = Class.create();\n"
724 @"Form.EventObserver.prototype = (new Abstract.EventObserver()).extend({\n"
725 @" getValue: function() {\n"
726 @" return Form.serialize(this.element);\n"
729 @"if (!window.Event) {\n"
730 @" var Event = new Object();\n"
732 @"Object.extend(Event, {\n"
733 @" KEY_BACKSPACE: 8,\n"
735 @" KEY_RETURN: 13,\n"
741 @" KEY_DELETE: 46,\n"
742 @" element: function(event) {\n"
743 @" return event.target || event.srcElement;\n"
745 @" isLeftClick: function(event) {\n"
746 @" return (((event.which) && (event.which == 1)) ||\n"
747 @" ((event.button) && (event.button == 1)));\n"
749 @" pointerX: function(event) {\n"
750 @" return event.pageX || (event.clientX + \n"
751 @" (document.documentElement.scrollLeft || document.body.scrollLeft));\n"
753 @" pointerY: function(event) {\n"
754 @" return event.pageY || (event.clientY + \n"
755 @" (document.documentElement.scrollTop || document.body.scrollTop));\n"
757 @" stop: function(event) {\n"
758 @" if (event.preventDefault) { \n"
759 @" event.preventDefault(); \n"
760 @" event.stopPropagation(); \n"
762 @" event.returnValue = false;\n"
765 @" // find the first node with the given tagName, starting from the\n"
766 @" // node the event was triggered on; traverses the DOM upwards\n"
767 @" findElement: function(event, tagName) {\n"
768 @" var element = Event.element(event);\n"
769 @" while (element.parentNode && (!element.tagName ||\n"
770 @" (element.tagName.toUpperCase() != tagName.toUpperCase())))\n"
771 @" element = element.parentNode;\n"
772 @" return element;\n"
774 @" observers: false,\n"
776 @" _observeAndCache: function(element, name, observer, useCapture) {\n"
777 @" if (!this.observers) this.observers = [];\n"
778 @" if (element.addEventListener) {\n"
779 @" this.observers.push([element, name, observer, useCapture]);\n"
780 @" element.addEventListener(name, observer, useCapture);\n"
781 @" } else if (element.attachEvent) {\n"
782 @" this.observers.push([element, name, observer, useCapture]);\n"
783 @" element.attachEvent('on' + name, observer);\n"
787 @" unloadCache: function() {\n"
788 @" if (!Event.observers) return;\n"
789 @" for (var i = 0; i < Event.observers.length; i++) {\n"
790 @" Event.stopObserving.apply(this, Event.observers[i]);\n"
791 @" Event.observers[i][0] = null;\n"
793 @" Event.observers = false;\n"
795 @" observe: function(element, name, observer, useCapture) {\n"
796 @" var element = $(element);\n"
797 @" useCapture = useCapture || false;\n"
799 @" if (name == 'keypress' &&\n"
800 @" ((navigator.appVersion.indexOf('AppleWebKit') > 0) \n"
801 @" || element.attachEvent))\n"
802 @" name = 'keydown';\n"
804 @" this._observeAndCache(element, name, observer, useCapture);\n"
806 @" stopObserving: function(element, name, observer, useCapture) {\n"
807 @" var element = $(element);\n"
808 @" useCapture = useCapture || false;\n"
810 @" if (name == 'keypress' &&\n"
811 @" ((navigator.appVersion.indexOf('AppleWebKit') > 0) \n"
812 @" || element.detachEvent))\n"
813 @" name = 'keydown';\n"
815 @" if (element.removeEventListener) {\n"
816 @" element.removeEventListener(name, observer, useCapture);\n"
817 @" } else if (element.detachEvent) {\n"
818 @" element.detachEvent('on' + name, observer);\n"
822 @"/* prevent memory leaks in IE */\n"
823 @"Event.observe(window, 'unload', Event.unloadCache, false);\n"
824 @"var Position = {\n"
825 @" // set to true if needed, warning: firefox performance problems\n"
826 @" // NOT neeeded for page scrolling, only if draggable contained in\n"
827 @" // scrollable elements\n"
828 @" includeScrollOffsets: false, \n"
829 @" // must be called before calling withinIncludingScrolloffset, every time the\n"
830 @" // page is scrolled\n"
831 @" prepare: function() {\n"
832 @" this.deltaX = window.pageXOffset \n"
833 @" || document.documentElement.scrollLeft \n"
834 @" || document.body.scrollLeft \n"
836 @" this.deltaY = window.pageYOffset \n"
837 @" || document.documentElement.scrollTop \n"
838 @" || document.body.scrollTop \n"
841 @" realOffset: function(element) {\n"
842 @" var valueT = 0, valueL = 0;\n"
844 @" valueT += element.scrollTop || 0;\n"
845 @" valueL += element.scrollLeft || 0; \n"
846 @" element = element.parentNode;\n"
847 @" } while (element);\n"
848 @" return [valueL, valueT];\n"
850 @" cumulativeOffset: function(element) {\n"
851 @" var valueT = 0, valueL = 0;\n"
853 @" valueT += element.offsetTop || 0;\n"
854 @" valueL += element.offsetLeft || 0;\n"
855 @" element = element.offsetParent;\n"
856 @" } while (element);\n"
857 @" return [valueL, valueT];\n"
859 @" // caches x/y coordinate pair to use with overlap\n"
860 @" within: function(element, x, y) {\n"
861 @" if (this.includeScrollOffsets)\n"
862 @" return this.withinIncludingScrolloffsets(element, x, y);\n"
863 @" this.xcomp = x;\n"
864 @" this.ycomp = y;\n"
865 @" this.offset = this.cumulativeOffset(element);\n"
866 @" return (y >= this.offset[1] &&\n"
867 @" y < this.offset[1] + element.offsetHeight &&\n"
868 @" x >= this.offset[0] && \n"
869 @" x < this.offset[0] + element.offsetWidth);\n"
871 @" withinIncludingScrolloffsets: function(element, x, y) {\n"
872 @" var offsetcache = this.realOffset(element);\n"
873 @" this.xcomp = x + offsetcache[0] - this.deltaX;\n"
874 @" this.ycomp = y + offsetcache[1] - this.deltaY;\n"
875 @" this.offset = this.cumulativeOffset(element);\n"
876 @" return (this.ycomp >= this.offset[1] &&\n"
877 @" this.ycomp < this.offset[1] + element.offsetHeight &&\n"
878 @" this.xcomp >= this.offset[0] && \n"
879 @" this.xcomp < this.offset[0] + element.offsetWidth);\n"
881 @" // within must be called directly before\n"
882 @" overlap: function(mode, element) { \n"
883 @" if (!mode) return 0; \n"
884 @" if (mode == 'vertical') \n"
885 @" return ((this.offset[1] + element.offsetHeight) - this.ycomp) / \n"
886 @" element.offsetHeight;\n"
887 @" if (mode == 'horizontal')\n"
888 @" return ((this.offset[0] + element.offsetWidth) - this.xcomp) / \n"
889 @" element.offsetWidth;\n"
891 @" clone: function(source, target) {\n"
892 @" source = $(source);\n"
893 @" target = $(target);\n"
894 @" target.style.position = 'absolute';\n"
895 @" var offsets = this.cumulativeOffset(source);\n"
896 @" target.style.top = offsets[1] + 'px';\n"
897 @" target.style.left = offsets[0] + 'px';\n"
898 @" target.style.width = source.offsetWidth + 'px';\n"
899 @" target.style.height = source.offsetHeight + 'px';\n"