1 /* Prototype JavaScript framework, version 1.3.1
2 * (c) 2005 Sam Stephenson <sam@conio.net>
4 * THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff
5 * against the source tree, available from the Prototype darcs repository.
7 * Prototype is freely distributable under the terms of an MIT-style license.
9 * For details, see the Prototype web site: http://prototype.conio.net/
11 /*--------------------------------------------------------------------------*/
15 emptyFunction: function() {}
21 this.initialize
.apply(this, arguments
);
26 var Abstract
= new Object();
28 Object
.extend = function(destination
, source
) {
29 for (property
in source
) {
30 destination
[property
] = source
[property
];
35 Object
.prototype.extend = function(object
) {
36 return Object
.extend
.apply(this, [this, object
]);
39 Function
.prototype.bind = function(object
) {
42 __method
.apply(object
, arguments
);
46 Function
.prototype.bindAsEventListener = function(object
) {
48 return function(event
) {
49 __method
.call(object
, event
|| window
.event
);
53 Number
.prototype.toColorPart = function() {
54 var digits
= this.toString(16);
55 if (this < 16) return '0' + digits
;
63 for (var i
= 0; i
< arguments
.length
; i
++) {
64 var lambda
= arguments
[i
];
66 returnValue
= lambda();
75 /*--------------------------------------------------------------------------*/
77 var PeriodicalExecuter
= Class
.create();
78 PeriodicalExecuter
.prototype = {
79 initialize: function(callback
, frequency
) {
80 this.callback
= callback
;
81 this.frequency
= frequency
;
82 this.currentlyExecuting
= false;
84 this.registerCallback();
87 registerCallback: function() {
88 setInterval(this.onTimerEvent
.bind(this), this.frequency
* 1000);
91 onTimerEvent: function() {
92 if (!this.currentlyExecuting
) {
94 this.currentlyExecuting
= true;
97 this.currentlyExecuting
= false;
103 /*--------------------------------------------------------------------------*/
106 var elements
= new Array();
108 for (var i
= 0; i
< arguments
.length
; i
++) {
109 var element
= arguments
[i
];
110 if (typeof element
== 'string')
111 element
= document
.getElementById(element
);
113 if (arguments
.length
== 1)
116 elements
.push(element
);
122 if (!Array
.prototype.push
) {
123 Array
.prototype.push = function() {
124 var startLength
= this.length
;
125 for (var i
= 0; i
< arguments
.length
; i
++)
126 this[startLength
+ i
] = arguments
[i
];
131 if (!Function
.prototype.apply
) {
132 // Based on code from http://www.youngpup.net/
133 Function
.prototype.apply = function(object
, parameters
) {
134 var parameterStrings
= new Array();
135 if (!object
) object
= window
;
136 if (!parameters
) parameters
= new Array();
138 for (var i
= 0; i
< parameters
.length
; i
++)
139 parameterStrings
[i
] = 'parameters[' + i
+ ']';
141 object
.__apply__
= this;
142 var result
= eval('object.__apply__(' +
143 parameterStrings
.join(', ') + ')');
144 object
.__apply__
= null;
150 String
.prototype.extend({
151 stripTags: function() {
152 return this.replace(/<\/?[^>]+>/gi, '');
155 escapeHTML: function() {
156 var div
= document
.createElement('div');
157 var text
= document
.createTextNode(this);
158 div
.appendChild(text
);
159 return div
.innerHTML
;
162 unescapeHTML: function() {
163 var div
= document
.createElement('div');
164 div
.innerHTML
= this.stripTags();
165 return div
.childNodes
[0].nodeValue
;
170 getTransport: function() {
172 function() {return new ActiveXObject('Msxml2.XMLHTTP')},
173 function() {return new ActiveXObject('Microsoft.XMLHTTP')},
174 function() {return new XMLHttpRequest()}
179 Ajax
.Base = function() {};
180 Ajax
.Base
.prototype = {
181 setOptions: function(options
) {
186 }.extend(options
|| {});
189 responseIsSuccess: function() {
190 return this.transport
.status
== undefined
191 || this.transport
.status
== 0
192 || (this.transport
.status
>= 200 && this.transport
.status
< 300);
195 responseIsFailure: function() {
196 return !this.responseIsSuccess();
200 Ajax
.Request
= Class
.create();
201 Ajax
.Request
.Events
=
202 ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
204 Ajax
.Request
.prototype = (new Ajax
.Base()).extend({
205 initialize: function(url
, options
) {
206 this.transport
= Ajax
.getTransport();
207 this.setOptions(options
);
211 request: function(url
) {
212 var parameters
= this.options
.parameters
|| '';
213 if (parameters
.length
> 0) parameters
+= '&_=';
216 if (this.options
.method
== 'get')
217 url
+= '?' + parameters
;
219 this.transport
.open(this.options
.method
, url
,
220 this.options
.asynchronous
);
222 if (this.options
.asynchronous
) {
223 this.transport
.onreadystatechange
= this.onStateChange
.bind(this);
224 setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
227 this.setRequestHeaders();
229 var body
= this.options
.postBody
? this.options
.postBody
: parameters
;
230 this.transport
.send(this.options
.method
== 'post' ? body
: null);
236 setRequestHeaders: function() {
238 ['X-Requested-With', 'XMLHttpRequest',
239 'X-Prototype-Version', Prototype
.Version
];
241 if (this.options
.method
== 'post') {
242 requestHeaders
.push('Content-type',
243 'application/x-www-form-urlencoded');
245 /* Force "Connection: close" for Mozilla browsers to work around
246 * a bug where XMLHttpReqeuest sends an incorrect Content-length
247 * header. See Mozilla Bugzilla #246651.
249 if (this.transport
.overrideMimeType
)
250 requestHeaders
.push('Connection', 'close');
253 if (this.options
.requestHeaders
)
254 requestHeaders
.push
.apply(requestHeaders
, this.options
.requestHeaders
);
256 for (var i
= 0; i
< requestHeaders
.length
; i
+= 2)
257 this.transport
.setRequestHeader(requestHeaders
[i
], requestHeaders
[i
+1]);
260 onStateChange: function() {
261 var readyState
= this.transport
.readyState
;
263 this.respondToReadyState(this.transport
.readyState
);
266 respondToReadyState: function(readyState
) {
267 var event
= Ajax
.Request
.Events
[readyState
];
269 if (event
== 'Complete')
270 (this.options
['on' + this.transport
.status
]
271 || this.options
['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
272 || Prototype
.emptyFunction
)(this.transport
);
274 (this.options
['on' + event
] || Prototype
.emptyFunction
)(this.transport
);
276 /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
277 if (event
== 'Complete')
278 this.transport
.onreadystatechange
= Prototype
.emptyFunction
;
282 Ajax
.Updater
= Class
.create();
283 Ajax
.Updater
.ScriptFragment
= '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';
285 Ajax
.Updater
.prototype.extend(Ajax
.Request
.prototype).extend({
286 initialize: function(container
, url
, options
) {
288 success
: container
.success
? $(container
.success
) : $(container
),
289 failure
: container
.failure
? $(container
.failure
) :
290 (container
.success
? null : $(container
))
293 this.transport
= Ajax
.getTransport();
294 this.setOptions(options
);
296 var onComplete
= this.options
.onComplete
|| Prototype
.emptyFunction
;
297 this.options
.onComplete
= (function() {
298 this.updateContent();
299 onComplete(this.transport
);
305 updateContent: function() {
306 var receiver
= this.responseIsSuccess() ?
307 this.containers
.success
: this.containers
.failure
;
309 var match
= new RegExp(Ajax
.Updater
.ScriptFragment
, 'img');
310 var response
= this.transport
.responseText
.replace(match
, '');
311 var scripts
= this.transport
.responseText
.match(match
);
314 if (this.options
.insertion
) {
315 new this.options
.insertion(receiver
, response
);
317 receiver
.innerHTML
= response
;
321 if (this.responseIsSuccess()) {
323 setTimeout((function() {this.onComplete(
324 this.transport
)}).bind(this), 10);
327 if (this.options
.evalScripts
&& scripts
) {
328 match
= new RegExp(Ajax
.Updater
.ScriptFragment
, 'im');
329 setTimeout((function() {
330 for (var i
= 0; i
< scripts
.length
; i
++)
331 eval(scripts
[i
].match(match
)[1]);
337 Ajax
.PeriodicalUpdater
= Class
.create();
338 Ajax
.PeriodicalUpdater
.prototype = (new Ajax
.Base()).extend({
339 initialize: function(container
, url
, options
) {
340 this.setOptions(options
);
341 this.onComplete
= this.options
.onComplete
;
343 this.frequency
= (this.options
.frequency
|| 2);
347 this.container
= container
;
354 this.options
.onComplete
= this.updateComplete
.bind(this);
359 this.updater
.onComplete
= undefined;
360 clearTimeout(this.timer
);
361 (this.onComplete
|| Ajax
.emptyFunction
).apply(this, arguments
);
364 updateComplete: function(request
) {
365 if (this.options
.decay
) {
366 this.decay
= (request
.responseText
== this.lastText
?
367 this.decay
* this.options
.decay
: 1);
369 this.lastText
= request
.responseText
;
371 this.timer
= setTimeout(this.onTimerEvent
.bind(this),
372 this.decay
* this.frequency
* 1000);
375 onTimerEvent: function() {
376 this.updater
= new Ajax
.Updater(this.container
, this.url
, this.options
);
380 document
.getElementsByClassName = function(className
) {
381 var children
= document
.getElementsByTagName('*') || document
.all
;
382 var elements
= new Array();
384 for (var i
= 0; i
< children
.length
; i
++) {
385 var child
= children
[i
];
386 var classNames
= child
.className
.split(' ');
387 for (var j
= 0; j
< classNames
.length
; j
++) {
388 if (classNames
[j
] == className
) {
389 elements
.push(child
);
398 /*--------------------------------------------------------------------------*/
400 if (!window
.Element
) {
401 var Element
= new Object();
404 Object
.extend(Element
, {
406 for (var i
= 0; i
< arguments
.length
; i
++) {
407 var element
= $(arguments
[i
]);
408 element
.style
.display
=
409 (element
.style
.display
== 'none' ? '' : 'none');
414 for (var i
= 0; i
< arguments
.length
; i
++) {
415 var element
= $(arguments
[i
]);
416 element
.style
.display
= 'none';
421 for (var i
= 0; i
< arguments
.length
; i
++) {
422 var element
= $(arguments
[i
]);
423 element
.style
.display
= '';
427 remove: function(element
) {
428 element
= $(element
);
429 element
.parentNode
.removeChild(element
);
432 getHeight: function(element
) {
433 element
= $(element
);
434 return element
.offsetHeight
;
437 hasClassName: function(element
, className
) {
438 element
= $(element
);
441 var a
= element
.className
.split(' ');
442 for (var i
= 0; i
< a
.length
; i
++) {
443 if (a
[i
] == className
)
449 addClassName: function(element
, className
) {
450 element
= $(element
);
451 Element
.removeClassName(element
, className
);
452 element
.className
+= ' ' + className
;
455 removeClassName: function(element
, className
) {
456 element
= $(element
);
459 var newClassName
= '';
460 var a
= element
.className
.split(' ');
461 for (var i
= 0; i
< a
.length
; i
++) {
462 if (a
[i
] != className
) {
465 newClassName
+= a
[i
];
468 element
.className
= newClassName
;
471 // removes whitespace-only text node children
472 cleanWhitespace: function(element
) {
473 var element
= $(element
);
474 for (var i
= 0; i
< element
.childNodes
.length
; i
++) {
475 var node
= element
.childNodes
[i
];
476 if (node
.nodeType
== 3 && !/\S/.test(node
.nodeValue
))
477 Element
.remove(node
);
482 var Toggle
= new Object();
483 Toggle
.display
= Element
.toggle
;
485 /*--------------------------------------------------------------------------*/
487 Abstract
.Insertion = function(adjacency
) {
488 this.adjacency
= adjacency
;
491 Abstract
.Insertion
.prototype = {
492 initialize: function(element
, content
) {
493 this.element
= $(element
);
494 this.content
= content
;
496 if (this.adjacency
&& this.element
.insertAdjacentHTML
) {
497 this.element
.insertAdjacentHTML(this.adjacency
, this.content
);
499 this.range
= this.element
.ownerDocument
.createRange();
500 if (this.initializeRange
) this.initializeRange();
501 this.fragment
= this.range
.createContextualFragment(this.content
);
502 this.insertContent();
507 var Insertion
= new Object();
509 Insertion
.Before
= Class
.create();
510 Insertion
.Before
.prototype = (new Abstract
.Insertion('beforeBegin')).extend({
511 initializeRange: function() {
512 this.range
.setStartBefore(this.element
);
515 insertContent: function() {
516 this.element
.parentNode
.insertBefore(this.fragment
, this.element
);
520 Insertion
.Top
= Class
.create();
521 Insertion
.Top
.prototype = (new Abstract
.Insertion('afterBegin')).extend({
522 initializeRange: function() {
523 this.range
.selectNodeContents(this.element
);
524 this.range
.collapse(true);
527 insertContent: function() {
528 this.element
.insertBefore(this.fragment
, this.element
.firstChild
);
532 Insertion
.Bottom
= Class
.create();
533 Insertion
.Bottom
.prototype = (new Abstract
.Insertion('beforeEnd')).extend({
534 initializeRange: function() {
535 this.range
.selectNodeContents(this.element
);
536 this.range
.collapse(this.element
);
539 insertContent: function() {
540 this.element
.appendChild(this.fragment
);
544 Insertion
.After
= Class
.create();
545 Insertion
.After
.prototype = (new Abstract
.Insertion('afterEnd')).extend({
546 initializeRange: function() {
547 this.range
.setStartAfter(this.element
);
550 insertContent: function() {
551 this.element
.parentNode
.insertBefore(this.fragment
,
552 this.element
.nextSibling
);
558 for (var i
= 0; i
< arguments
.length
; i
++)
559 $(arguments
[i
]).value
= '';
562 focus: function(element
) {
566 present: function() {
567 for (var i
= 0; i
< arguments
.length
; i
++)
568 if ($(arguments
[i
]).value
== '') return false;
572 select: function(element
) {
576 activate: function(element
) {
582 /*--------------------------------------------------------------------------*/
585 serialize: function(form
) {
586 var elements
= Form
.getElements($(form
));
587 var queryComponents
= new Array();
589 for (var i
= 0; i
< elements
.length
; i
++) {
590 var queryComponent
= Form
.Element
.serialize(elements
[i
]);
592 queryComponents
.push(queryComponent
);
595 return queryComponents
.join('&');
598 getElements: function(form
) {
600 var elements
= new Array();
602 for (tagName
in Form
.Element
.Serializers
) {
603 var tagElements
= form
.getElementsByTagName(tagName
);
604 for (var j
= 0; j
< tagElements
.length
; j
++)
605 elements
.push(tagElements
[j
]);
610 getInputs: function(form
, typeName
, name
) {
612 var inputs
= form
.getElementsByTagName('input');
614 if (!typeName
&& !name
)
617 var matchingInputs
= new Array();
618 for (var i
= 0; i
< inputs
.length
; i
++) {
619 var input
= inputs
[i
];
620 if ((typeName
&& input
.type
!= typeName
) ||
621 (name
&& input
.name
!= name
))
623 matchingInputs
.push(input
);
626 return matchingInputs
;
629 disable: function(form
) {
630 var elements
= Form
.getElements(form
);
631 for (var i
= 0; i
< elements
.length
; i
++) {
632 var element
= elements
[i
];
634 element
.disabled
= 'true';
638 enable: function(form
) {
639 var elements
= Form
.getElements(form
);
640 for (var i
= 0; i
< elements
.length
; i
++) {
641 var element
= elements
[i
];
642 element
.disabled
= '';
646 focusFirstElement: function(form
) {
648 var elements
= Form
.getElements(form
);
649 for (var i
= 0; i
< elements
.length
; i
++) {
650 var element
= elements
[i
];
651 if (element
.type
!= 'hidden' && !element
.disabled
) {
652 Field
.activate(element
);
658 reset: function(form
) {
664 serialize: function(element
) {
665 var element
= $(element
);
666 var method
= element
.tagName
.toLowerCase();
667 var parameter
= Form
.Element
.Serializers
[method
](element
);
670 return encodeURIComponent(parameter
[0]) + '=' +
671 encodeURIComponent(parameter
[1]);
674 getValue: function(element
) {
675 var element
= $(element
);
676 var method
= element
.tagName
.toLowerCase();
677 var parameter
= Form
.Element
.Serializers
[method
](element
);
684 Form
.Element
.Serializers
= {
685 input: function(element
) {
686 switch (element
.type
.toLowerCase()) {
691 return Form
.Element
.Serializers
.textarea(element
);
694 return Form
.Element
.Serializers
.inputSelector(element
);
699 inputSelector: function(element
) {
701 return [element
.name
, element
.value
];
704 textarea: function(element
) {
705 return [element
.name
, element
.value
];
708 select: function(element
) {
710 if (element
.type
== 'select-one') {
711 var index
= element
.selectedIndex
;
713 value
= element
.options
[index
].value
|| element
.options
[index
].text
;
716 for (var i
= 0; i
< element
.length
; i
++) {
717 var opt
= element
.options
[i
];
719 value
.push(opt
.value
|| opt
.text
);
722 return [element
.name
, value
];
726 /*--------------------------------------------------------------------------*/
728 var $F
= Form
.Element
.getValue
;
730 /*--------------------------------------------------------------------------*/
732 Abstract
.TimedObserver = function() {}
733 Abstract
.TimedObserver
.prototype = {
734 initialize: function(element
, frequency
, callback
) {
735 this.frequency
= frequency
;
736 this.element
= $(element
);
737 this.callback
= callback
;
739 this.lastValue
= this.getValue();
740 this.registerCallback();
743 registerCallback: function() {
744 setInterval(this.onTimerEvent
.bind(this), this.frequency
* 1000);
747 onTimerEvent: function() {
748 var value
= this.getValue();
749 if (this.lastValue
!= value
) {
750 this.callback(this.element
, value
);
751 this.lastValue
= value
;
756 Form
.Element
.Observer
= Class
.create();
757 Form
.Element
.Observer
.prototype = (new Abstract
.TimedObserver()).extend({
758 getValue: function() {
759 return Form
.Element
.getValue(this.element
);
763 Form
.Observer
= Class
.create();
764 Form
.Observer
.prototype = (new Abstract
.TimedObserver()).extend({
765 getValue: function() {
766 return Form
.serialize(this.element
);
770 /*--------------------------------------------------------------------------*/
772 Abstract
.EventObserver = function() {}
773 Abstract
.EventObserver
.prototype = {
774 initialize: function(element
, callback
) {
775 this.element
= $(element
);
776 this.callback
= callback
;
778 this.lastValue
= this.getValue();
779 if (this.element
.tagName
.toLowerCase() == 'form')
780 this.registerFormCallbacks();
782 this.registerCallback(this.element
);
785 onElementEvent: function() {
786 var value
= this.getValue();
787 if (this.lastValue
!= value
) {
788 this.callback(this.element
, value
);
789 this.lastValue
= value
;
793 registerFormCallbacks: function() {
794 var elements
= Form
.getElements(this.element
);
795 for (var i
= 0; i
< elements
.length
; i
++)
796 this.registerCallback(elements
[i
]);
799 registerCallback: function(element
) {
801 switch (element
.type
.toLowerCase()) {
804 element
.target
= this;
805 element
.prev_onclick
= element
.onclick
|| Prototype
.emptyFunction
;
806 element
.onclick = function() {
808 this.target
.onElementEvent();
815 case 'select-multiple':
816 element
.target
= this;
817 element
.prev_onchange
= element
.onchange
|| Prototype
.emptyFunction
;
818 element
.onchange = function() {
819 this.prev_onchange();
820 this.target
.onElementEvent();
828 Form
.Element
.EventObserver
= Class
.create();
829 Form
.Element
.EventObserver
.prototype = (new Abstract
.EventObserver()).extend({
830 getValue: function() {
831 return Form
.Element
.getValue(this.element
);
835 Form
.EventObserver
= Class
.create();
836 Form
.EventObserver
.prototype = (new Abstract
.EventObserver()).extend({
837 getValue: function() {
838 return Form
.serialize(this.element
);
844 var Event
= new Object();
847 Object
.extend(Event
, {
858 element: function(event
) {
859 return event
.target
|| event
.srcElement
;
862 isLeftClick: function(event
) {
863 return (((event
.which
) && (event
.which
== 1)) ||
864 ((event
.button
) && (event
.button
== 1)));
867 pointerX: function(event
) {
868 return event
.pageX
|| (event
.clientX
+
869 (document
.documentElement
.scrollLeft
|| document
.body
.scrollLeft
));
872 pointerY: function(event
) {
873 return event
.pageY
|| (event
.clientY
+
874 (document
.documentElement
.scrollTop
|| document
.body
.scrollTop
));
877 stop: function(event
) {
878 if (event
.preventDefault
) {
879 event
.preventDefault();
880 event
.stopPropagation();
882 event
.returnValue
= false;
886 // find the first node with the given tagName, starting from the
887 // node the event was triggered on; traverses the DOM upwards
888 findElement: function(event
, tagName
) {
889 var element
= Event
.element(event
);
890 while (element
.parentNode
&& (!element
.tagName
||
891 (element
.tagName
.toUpperCase() != tagName
.toUpperCase())))
892 element
= element
.parentNode
;
898 _observeAndCache: function(element
, name
, observer
, useCapture
) {
899 if (!this.observers
) this.observers
= [];
900 if (element
.addEventListener
) {
901 this.observers
.push([element
, name
, observer
, useCapture
]);
902 element
.addEventListener(name
, observer
, useCapture
);
903 } else if (element
.attachEvent
) {
904 this.observers
.push([element
, name
, observer
, useCapture
]);
905 element
.attachEvent('on' + name
, observer
);
909 unloadCache: function() {
910 if (!Event
.observers
) return;
911 for (var i
= 0; i
< Event
.observers
.length
; i
++) {
912 Event
.stopObserving
.apply(this, Event
.observers
[i
]);
913 Event
.observers
[i
][0] = null;
915 Event
.observers
= false;
918 observe: function(element
, name
, observer
, useCapture
) {
919 var element
= $(element
);
920 useCapture
= useCapture
|| false;
922 if (name
== 'keypress' &&
923 ((navigator
.appVersion
.indexOf('AppleWebKit') > 0)
924 || element
.attachEvent
))
927 this._observeAndCache(element
, name
, observer
, useCapture
);
930 stopObserving: function(element
, name
, observer
, useCapture
) {
931 var element
= $(element
);
932 useCapture
= useCapture
|| false;
934 if (name
== 'keypress' &&
935 ((navigator
.appVersion
.indexOf('AppleWebKit') > 0)
936 || element
.detachEvent
))
939 if (element
.removeEventListener
) {
940 element
.removeEventListener(name
, observer
, useCapture
);
941 } else if (element
.detachEvent
) {
942 element
.detachEvent('on' + name
, observer
);
947 /* prevent memory leaks in IE */
948 Event
.observe(window
, 'unload', Event
.unloadCache
, false);
952 // set to true if needed, warning: firefox performance problems
953 // NOT neeeded for page scrolling, only if draggable contained in
954 // scrollable elements
955 includeScrollOffsets
: false,
957 // must be called before calling withinIncludingScrolloffset, every time the
959 prepare: function() {
960 this.deltaX
= window
.pageXOffset
961 || document
.documentElement
.scrollLeft
962 || document
.body
.scrollLeft
964 this.deltaY
= window
.pageYOffset
965 || document
.documentElement
.scrollTop
966 || document
.body
.scrollTop
970 realOffset: function(element
) {
971 var valueT
= 0, valueL
= 0;
973 valueT
+= element
.scrollTop
|| 0;
974 valueL
+= element
.scrollLeft
|| 0;
975 element
= element
.parentNode
;
977 return [valueL
, valueT
];
980 cumulativeOffset: function(element
) {
981 var valueT
= 0, valueL
= 0;
983 valueT
+= element
.offsetTop
|| 0;
984 valueL
+= element
.offsetLeft
|| 0;
985 element
= element
.offsetParent
;
987 return [valueL
, valueT
];
990 // caches x/y coordinate pair to use with overlap
991 within: function(element
, x
, y
) {
992 if (this.includeScrollOffsets
)
993 return this.withinIncludingScrolloffsets(element
, x
, y
);
996 this.offset
= this.cumulativeOffset(element
);
998 return (y
>= this.offset
[1] &&
999 y
< this.offset
[1] + element
.offsetHeight
&&
1000 x
>= this.offset
[0] &&
1001 x
< this.offset
[0] + element
.offsetWidth
);
1004 withinIncludingScrolloffsets: function(element
, x
, y
) {
1005 var offsetcache
= this.realOffset(element
);
1007 this.xcomp
= x
+ offsetcache
[0] - this.deltaX
;
1008 this.ycomp
= y
+ offsetcache
[1] - this.deltaY
;
1009 this.offset
= this.cumulativeOffset(element
);
1011 return (this.ycomp
>= this.offset
[1] &&
1012 this.ycomp
< this.offset
[1] + element
.offsetHeight
&&
1013 this.xcomp
>= this.offset
[0] &&
1014 this.xcomp
< this.offset
[0] + element
.offsetWidth
);
1017 // within must be called directly before
1018 overlap: function(mode
, element
) {
1019 if (!mode
) return 0;
1020 if (mode
== 'vertical')
1021 return ((this.offset
[1] + element
.offsetHeight
) - this.ycomp
) /
1022 element
.offsetHeight
;
1023 if (mode
== 'horizontal')
1024 return ((this.offset
[0] + element
.offsetWidth
) - this.xcomp
) /
1025 element
.offsetWidth
;
1028 clone: function(source
, target
) {
1031 target
.style
.position
= 'absolute';
1032 var offsets
= this.cumulativeOffset(source
);
1033 target
.style
.top
= offsets
[1] + 'px';
1034 target
.style
.left
= offsets
[0] + 'px';
1035 target
.style
.width
= source
.offsetWidth
+ 'px';
1036 target
.style
.height
= source
.offsetHeight
+ 'px';