http://2014hs.igem.org/wiki/index.php?title=Team:Lethbridge_Canada/js_prototype&feed=atom&action=history
Team:Lethbridge Canada/js prototype - Revision history
2024-03-28T18:27:09Z
Revision history for this page on the wiki
MediaWiki 1.16.5
http://2014hs.igem.org/wiki/index.php?title=Team:Lethbridge_Canada/js_prototype&diff=22626&oldid=prev
Dinula98: Created page with "/* Prototype JavaScript framework, version 1.4.0 * (c) 2005 Sam Stephenson <sam@conio.net> * * THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff * a..."
2014-06-20T13:46:57Z
<p>Created page with "/* Prototype JavaScript framework, version 1.4.0 * (c) 2005 Sam Stephenson <sam@conio.net> * * THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff * a..."</p>
<p><b>New page</b></p><div>/* Prototype JavaScript framework, version 1.4.0<br />
* (c) 2005 Sam Stephenson <sam@conio.net><br />
*<br />
* THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff<br />
* against the source tree, available from the Prototype darcs repository.<br />
*<br />
* Prototype is freely distributable under the terms of an MIT-style license.<br />
*<br />
* For details, see the Prototype web site: http://prototype.conio.net/<br />
*<br />
/*--------------------------------------------------------------------------*/<br />
<br />
var Prototype = {<br />
Version: '1.4.0',<br />
ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',<br />
<br />
emptyFunction: function() {},<br />
K: function(x) {return x}<br />
}<br />
<br />
var Class = {<br />
create: function() {<br />
return function() {<br />
this.initialize.apply(this, arguments);<br />
}<br />
}<br />
}<br />
<br />
var Abstract = new Object();<br />
<br />
Object.extend = function(destination, source) {<br />
for (property in source) {<br />
destination[property] = source[property];<br />
}<br />
return destination;<br />
}<br />
<br />
Object.inspect = function(object) {<br />
try {<br />
if (object == undefined) return 'undefined';<br />
if (object == null) return 'null';<br />
return object.inspect ? object.inspect() : object.toString();<br />
} catch (e) {<br />
if (e instanceof RangeError) return '...';<br />
throw e;<br />
}<br />
}<br />
<br />
Function.prototype.bind = function() {<br />
var __method = this, args = $A(arguments), object = args.shift();<br />
return function() {<br />
return __method.apply(object, args.concat($A(arguments)));<br />
}<br />
}<br />
<br />
Function.prototype.bindAsEventListener = function(object) {<br />
var __method = this;<br />
return function(event) {<br />
return __method.call(object, event || window.event);<br />
}<br />
}<br />
<br />
Object.extend(Number.prototype, {<br />
toColorPart: function() {<br />
var digits = this.toString(16);<br />
if (this < 16) return '0' + digits;<br />
return digits;<br />
},<br />
<br />
succ: function() {<br />
return this + 1;<br />
},<br />
<br />
times: function(iterator) {<br />
$R(0, this, true).each(iterator);<br />
return this;<br />
}<br />
});<br />
<br />
var Try = {<br />
these: function() {<br />
var returnValue;<br />
<br />
for (var i = 0; i < arguments.length; i++) {<br />
var lambda = arguments[i];<br />
try {<br />
returnValue = lambda();<br />
break;<br />
} catch (e) {}<br />
}<br />
<br />
return returnValue;<br />
}<br />
}<br />
<br />
/*--------------------------------------------------------------------------*/<br />
<br />
var PeriodicalExecuter = Class.create();<br />
PeriodicalExecuter.prototype = {<br />
initialize: function(callback, frequency) {<br />
this.callback = callback;<br />
this.frequency = frequency;<br />
this.currentlyExecuting = false;<br />
<br />
this.registerCallback();<br />
},<br />
<br />
registerCallback: function() {<br />
setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);<br />
},<br />
<br />
onTimerEvent: function() {<br />
if (!this.currentlyExecuting) {<br />
try {<br />
this.currentlyExecuting = true;<br />
this.callback();<br />
} finally {<br />
this.currentlyExecuting = false;<br />
}<br />
}<br />
}<br />
}<br />
<br />
/*--------------------------------------------------------------------------*/<br />
<br />
function $() {<br />
var elements = new Array();<br />
<br />
for (var i = 0; i < arguments.length; i++) {<br />
var element = arguments[i];<br />
if (typeof element == 'string')<br />
element = document.getElementById(element);<br />
<br />
if (arguments.length == 1)<br />
return element;<br />
<br />
elements.push(element);<br />
}<br />
<br />
return elements;<br />
}<br />
Object.extend(String.prototype, {<br />
stripTags: function() {<br />
return this.replace(/<\/?[^>]+>/gi, '');<br />
},<br />
<br />
stripScripts: function() {<br />
return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');<br />
},<br />
<br />
extractScripts: function() {<br />
var matchAll = new RegExp(Prototype.ScriptFragment, 'img');<br />
var matchOne = new RegExp(Prototype.ScriptFragment, 'im');<br />
return (this.match(matchAll) || []).map(function(scriptTag) {<br />
return (scriptTag.match(matchOne) || ['', ''])[1];<br />
});<br />
},<br />
<br />
evalScripts: function() {<br />
return this.extractScripts().map(eval);<br />
},<br />
<br />
escapeHTML: function() {<br />
var div = document.createElement('div');<br />
var text = document.createTextNode(this);<br />
div.appendChild(text);<br />
return div.innerHTML;<br />
},<br />
<br />
unescapeHTML: function() {<br />
var div = document.createElement('div');<br />
div.innerHTML = this.stripTags();<br />
return div.childNodes[0] ? div.childNodes[0].nodeValue : '';<br />
},<br />
<br />
toQueryParams: function() {<br />
var pairs = this.match(/^\??(.*)$/)[1].split('&');<br />
return pairs.inject({}, function(params, pairString) {<br />
var pair = pairString.split('=');<br />
params[pair[0]] = pair[1];<br />
return params;<br />
});<br />
},<br />
<br />
toArray: function() {<br />
return this.split('');<br />
},<br />
<br />
camelize: function() {<br />
var oStringList = this.split('-');<br />
if (oStringList.length == 1) return oStringList[0];<br />
<br />
var camelizedString = this.indexOf('-') == 0<br />
? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)<br />
: oStringList[0];<br />
<br />
for (var i = 1, len = oStringList.length; i < len; i++) {<br />
var s = oStringList[i];<br />
camelizedString += s.charAt(0).toUpperCase() + s.substring(1);<br />
}<br />
<br />
return camelizedString;<br />
},<br />
<br />
inspect: function() {<br />
return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'";<br />
}<br />
});<br />
<br />
String.prototype.parseQuery = String.prototype.toQueryParams;<br />
<br />
var $break = new Object();<br />
var $continue = new Object();<br />
<br />
var Enumerable = {<br />
each: function(iterator) {<br />
var index = 0;<br />
try {<br />
this._each(function(value) {<br />
try {<br />
iterator(value, index++);<br />
} catch (e) {<br />
if (e != $continue) throw e;<br />
}<br />
});<br />
} catch (e) {<br />
if (e != $break) throw e;<br />
}<br />
},<br />
<br />
all: function(iterator) {<br />
var result = true;<br />
this.each(function(value, index) {<br />
result = result && !!(iterator || Prototype.K)(value, index);<br />
if (!result) throw $break;<br />
});<br />
return result;<br />
},<br />
<br />
any: function(iterator) {<br />
var result = true;<br />
this.each(function(value, index) {<br />
if (result = !!(iterator || Prototype.K)(value, index))<br />
throw $break;<br />
});<br />
return result;<br />
},<br />
<br />
collect: function(iterator) {<br />
var results = [];<br />
this.each(function(value, index) {<br />
results.push(iterator(value, index));<br />
});<br />
return results;<br />
},<br />
<br />
detect: function (iterator) {<br />
var result;<br />
this.each(function(value, index) {<br />
if (iterator(value, index)) {<br />
result = value;<br />
throw $break;<br />
}<br />
});<br />
return result;<br />
},<br />
<br />
findAll: function(iterator) {<br />
var results = [];<br />
this.each(function(value, index) {<br />
if (iterator(value, index))<br />
results.push(value);<br />
});<br />
return results;<br />
},<br />
<br />
grep: function(pattern, iterator) {<br />
var results = [];<br />
this.each(function(value, index) {<br />
var stringValue = value.toString();<br />
if (stringValue.match(pattern))<br />
results.push((iterator || Prototype.K)(value, index));<br />
})<br />
return results;<br />
},<br />
<br />
include: function(object) {<br />
var found = false;<br />
this.each(function(value) {<br />
if (value == object) {<br />
found = true;<br />
throw $break;<br />
}<br />
});<br />
return found;<br />
},<br />
<br />
inject: function(memo, iterator) {<br />
this.each(function(value, index) {<br />
memo = iterator(memo, value, index);<br />
});<br />
return memo;<br />
},<br />
<br />
invoke: function(method) {<br />
var args = $A(arguments).slice(1);<br />
return this.collect(function(value) {<br />
return value[method].apply(value, args);<br />
});<br />
},<br />
<br />
max: function(iterator) {<br />
var result;<br />
this.each(function(value, index) {<br />
value = (iterator || Prototype.K)(value, index);<br />
if (value >= (result || value))<br />
result = value;<br />
});<br />
return result;<br />
},<br />
<br />
min: function(iterator) {<br />
var result;<br />
this.each(function(value, index) {<br />
value = (iterator || Prototype.K)(value, index);<br />
if (value <= (result || value))<br />
result = value;<br />
});<br />
return result;<br />
},<br />
<br />
partition: function(iterator) {<br />
var trues = [], falses = [];<br />
this.each(function(value, index) {<br />
((iterator || Prototype.K)(value, index) ?<br />
trues : falses).push(value);<br />
});<br />
return [trues, falses];<br />
},<br />
<br />
pluck: function(property) {<br />
var results = [];<br />
this.each(function(value, index) {<br />
results.push(value[property]);<br />
});<br />
return results;<br />
},<br />
<br />
reject: function(iterator) {<br />
var results = [];<br />
this.each(function(value, index) {<br />
if (!iterator(value, index))<br />
results.push(value);<br />
});<br />
return results;<br />
},<br />
<br />
sortBy: function(iterator) {<br />
return this.collect(function(value, index) {<br />
return {value: value, criteria: iterator(value, index)};<br />
}).sort(function(left, right) {<br />
var a = left.criteria, b = right.criteria;<br />
return a < b ? -1 : a > b ? 1 : 0;<br />
}).pluck('value');<br />
},<br />
<br />
toArray: function() {<br />
return this.collect(Prototype.K);<br />
},<br />
<br />
zip: function() {<br />
var iterator = Prototype.K, args = $A(arguments);<br />
if (typeof args.last() == 'function')<br />
iterator = args.pop();<br />
<br />
var collections = [this].concat(args).map($A);<br />
return this.map(function(value, index) {<br />
iterator(value = collections.pluck(index));<br />
return value;<br />
});<br />
},<br />
<br />
inspect: function() {<br />
return '#<Enumerable:' + this.toArray().inspect() + '>';<br />
}<br />
}<br />
<br />
Object.extend(Enumerable, {<br />
map: Enumerable.collect,<br />
find: Enumerable.detect,<br />
select: Enumerable.findAll,<br />
member: Enumerable.include,<br />
entries: Enumerable.toArray<br />
});<br />
var $A = Array.from = function(iterable) {<br />
if (!iterable) return [];<br />
if (iterable.toArray) {<br />
return iterable.toArray();<br />
} else {<br />
var results = [];<br />
for (var i = 0; i < iterable.length; i++)<br />
results.push(iterable[i]);<br />
return results;<br />
}<br />
}<br />
<br />
Object.extend(Array.prototype, Enumerable);<br />
<br />
Array.prototype._reverse = Array.prototype.reverse;<br />
<br />
Object.extend(Array.prototype, {<br />
_each: function(iterator) {<br />
for (var i = 0; i < this.length; i++)<br />
iterator(this[i]);<br />
},<br />
<br />
clear: function() {<br />
this.length = 0;<br />
return this;<br />
},<br />
<br />
first: function() {<br />
return this[0];<br />
},<br />
<br />
last: function() {<br />
return this[this.length - 1];<br />
},<br />
<br />
compact: function() {<br />
return this.select(function(value) {<br />
return value != undefined || value != null;<br />
});<br />
},<br />
<br />
flatten: function() {<br />
return this.inject([], function(array, value) {<br />
return array.concat(value.constructor == Array ?<br />
value.flatten() : [value]);<br />
});<br />
},<br />
<br />
without: function() {<br />
var values = $A(arguments);<br />
return this.select(function(value) {<br />
return !values.include(value);<br />
});<br />
},<br />
<br />
indexOf: function(object) {<br />
for (var i = 0; i < this.length; i++)<br />
if (this[i] == object) return i;<br />
return -1;<br />
},<br />
<br />
reverse: function(inline) {<br />
return (inline !== false ? this : this.toArray())._reverse();<br />
},<br />
<br />
shift: function() {<br />
var result = this[0];<br />
for (var i = 0; i < this.length - 1; i++)<br />
this[i] = this[i + 1];<br />
this.length--;<br />
return result;<br />
},<br />
<br />
inspect: function() {<br />
return '[' + this.map(Object.inspect).join(', ') + ']';<br />
}<br />
});<br />
var Hash = {<br />
_each: function(iterator) {<br />
for (key in this) {<br />
var value = this[key];<br />
if (typeof value == 'function') continue;<br />
<br />
var pair = [key, value];<br />
pair.key = key;<br />
pair.value = value;<br />
iterator(pair);<br />
}<br />
},<br />
<br />
keys: function() {<br />
return this.pluck('key');<br />
},<br />
<br />
values: function() {<br />
return this.pluck('value');<br />
},<br />
<br />
merge: function(hash) {<br />
return $H(hash).inject($H(this), function(mergedHash, pair) {<br />
mergedHash[pair.key] = pair.value;<br />
return mergedHash;<br />
});<br />
},<br />
<br />
toQueryString: function() {<br />
return this.map(function(pair) {<br />
return pair.map(encodeURIComponent).join('=');<br />
}).join('&');<br />
},<br />
<br />
inspect: function() {<br />
return '#<Hash:{' + this.map(function(pair) {<br />
return pair.map(Object.inspect).join(': ');<br />
}).join(', ') + '}>';<br />
}<br />
}<br />
<br />
function $H(object) {<br />
var hash = Object.extend({}, object || {});<br />
Object.extend(hash, Enumerable);<br />
Object.extend(hash, Hash);<br />
return hash;<br />
}<br />
ObjectRange = Class.create();<br />
Object.extend(ObjectRange.prototype, Enumerable);<br />
Object.extend(ObjectRange.prototype, {<br />
initialize: function(start, end, exclusive) {<br />
this.start = start;<br />
this.end = end;<br />
this.exclusive = exclusive;<br />
},<br />
<br />
_each: function(iterator) {<br />
var value = this.start;<br />
do {<br />
iterator(value);<br />
value = value.succ();<br />
} while (this.include(value));<br />
},<br />
<br />
include: function(value) {<br />
if (value < this.start)<br />
return false;<br />
if (this.exclusive)<br />
return value < this.end;<br />
return value <= this.end;<br />
}<br />
});<br />
<br />
var $R = function(start, end, exclusive) {<br />
return new ObjectRange(start, end, exclusive);<br />
}<br />
<br />
var Ajax = {<br />
getTransport: function() {<br />
return Try.these(<br />
function() {return new ActiveXObject('Msxml2.XMLHTTP')},<br />
function() {return new ActiveXObject('Microsoft.XMLHTTP')},<br />
function() {return new XMLHttpRequest()}<br />
) || false;<br />
},<br />
<br />
activeRequestCount: 0<br />
}<br />
<br />
Ajax.Responders = {<br />
responders: [],<br />
<br />
_each: function(iterator) {<br />
this.responders._each(iterator);<br />
},<br />
<br />
register: function(responderToAdd) {<br />
if (!this.include(responderToAdd))<br />
this.responders.push(responderToAdd);<br />
},<br />
<br />
unregister: function(responderToRemove) {<br />
this.responders = this.responders.without(responderToRemove);<br />
},<br />
<br />
dispatch: function(callback, request, transport, json) {<br />
this.each(function(responder) {<br />
if (responder[callback] && typeof responder[callback] == 'function') {<br />
try {<br />
responder[callback].apply(responder, [request, transport, json]);<br />
} catch (e) {}<br />
}<br />
});<br />
}<br />
};<br />
<br />
Object.extend(Ajax.Responders, Enumerable);<br />
<br />
Ajax.Responders.register({<br />
onCreate: function() {<br />
Ajax.activeRequestCount++;<br />
},<br />
<br />
onComplete: function() {<br />
Ajax.activeRequestCount--;<br />
}<br />
});<br />
<br />
Ajax.Base = function() {};<br />
Ajax.Base.prototype = {<br />
setOptions: function(options) {<br />
this.options = {<br />
method: 'post',<br />
asynchronous: true,<br />
parameters: ''<br />
}<br />
Object.extend(this.options, options || {});<br />
},<br />
<br />
responseIsSuccess: function() {<br />
return this.transport.status == undefined<br />
|| this.transport.status == 0<br />
|| (this.transport.status >= 200 && this.transport.status < 300);<br />
},<br />
<br />
responseIsFailure: function() {<br />
return !this.responseIsSuccess();<br />
}<br />
}<br />
<br />
Ajax.Request = Class.create();<br />
Ajax.Request.Events =<br />
['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];<br />
<br />
Ajax.Request.prototype = Object.extend(new Ajax.Base(), {<br />
initialize: function(url, options) {<br />
this.transport = Ajax.getTransport();<br />
this.setOptions(options);<br />
this.request(url);<br />
},<br />
<br />
request: function(url) {<br />
var parameters = this.options.parameters || '';<br />
if (parameters.length > 0) parameters += '&_=';<br />
<br />
try {<br />
this.url = url;<br />
if (this.options.method == 'get' && parameters.length > 0)<br />
this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;<br />
<br />
Ajax.Responders.dispatch('onCreate', this, this.transport);<br />
<br />
this.transport.open(this.options.method, this.url,<br />
this.options.asynchronous);<br />
<br />
if (this.options.asynchronous) {<br />
this.transport.onreadystatechange = this.onStateChange.bind(this);<br />
setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);<br />
}<br />
<br />
this.setRequestHeaders();<br />
<br />
var body = this.options.postBody ? this.options.postBody : parameters;<br />
this.transport.send(this.options.method == 'post' ? body : null);<br />
<br />
} catch (e) {<br />
this.dispatchException(e);<br />
}<br />
},<br />
<br />
setRequestHeaders: function() {<br />
var requestHeaders =<br />
['X-Requested-With', 'XMLHttpRequest',<br />
'X-Prototype-Version', Prototype.Version];<br />
<br />
if (this.options.method == 'post') {<br />
requestHeaders.push('Content-type',<br />
'application/x-www-form-urlencoded');<br />
<br />
/* Force "Connection: close" for Mozilla browsers to work around<br />
* a bug where XMLHttpReqeuest sends an incorrect Content-length<br />
* header. See Mozilla Bugzilla #246651.<br />
*/<br />
if (this.transport.overrideMimeType)<br />
requestHeaders.push('Connection', 'close');<br />
}<br />
<br />
if (this.options.requestHeaders)<br />
requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);<br />
<br />
for (var i = 0; i < requestHeaders.length; i += 2)<br />
this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);<br />
},<br />
<br />
onStateChange: function() {<br />
var readyState = this.transport.readyState;<br />
if (readyState != 1)<br />
this.respondToReadyState(this.transport.readyState);<br />
},<br />
<br />
header: function(name) {<br />
try {<br />
return this.transport.getResponseHeader(name);<br />
} catch (e) {}<br />
},<br />
<br />
evalJSON: function() {<br />
try {<br />
return eval(this.header('X-JSON'));<br />
} catch (e) {}<br />
},<br />
<br />
evalResponse: function() {<br />
try {<br />
return eval(this.transport.responseText);<br />
} catch (e) {<br />
this.dispatchException(e);<br />
}<br />
},<br />
<br />
respondToReadyState: function(readyState) {<br />
var event = Ajax.Request.Events[readyState];<br />
var transport = this.transport, json = this.evalJSON();<br />
<br />
if (event == 'Complete') {<br />
try {<br />
(this.options['on' + this.transport.status]<br />
|| this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]<br />
|| Prototype.emptyFunction)(transport, json);<br />
} catch (e) {<br />
this.dispatchException(e);<br />
}<br />
<br />
if ((this.header('Content-type') || '').match(/^text\/javascript/i))<br />
this.evalResponse();<br />
}<br />
<br />
try {<br />
(this.options['on' + event] || Prototype.emptyFunction)(transport, json);<br />
Ajax.Responders.dispatch('on' + event, this, transport, json);<br />
} catch (e) {<br />
this.dispatchException(e);<br />
}<br />
<br />
/* Avoid memory leak in MSIE: clean up the oncomplete event handler */<br />
if (event == 'Complete')<br />
this.transport.onreadystatechange = Prototype.emptyFunction;<br />
},<br />
<br />
dispatchException: function(exception) {<br />
(this.options.onException || Prototype.emptyFunction)(this, exception);<br />
Ajax.Responders.dispatch('onException', this, exception);<br />
}<br />
});<br />
<br />
Ajax.Updater = Class.create();<br />
<br />
Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {<br />
initialize: function(container, url, options) {<br />
this.containers = {<br />
success: container.success ? $(container.success) : $(container),<br />
failure: container.failure ? $(container.failure) :<br />
(container.success ? null : $(container))<br />
}<br />
<br />
this.transport = Ajax.getTransport();<br />
this.setOptions(options);<br />
<br />
var onComplete = this.options.onComplete || Prototype.emptyFunction;<br />
this.options.onComplete = (function(transport, object) {<br />
this.updateContent();<br />
onComplete(transport, object);<br />
}).bind(this);<br />
<br />
this.request(url);<br />
},<br />
<br />
updateContent: function() {<br />
var receiver = this.responseIsSuccess() ?<br />
this.containers.success : this.containers.failure;<br />
var response = this.transport.responseText;<br />
<br />
if (!this.options.evalScripts)<br />
response = response.stripScripts();<br />
<br />
if (receiver) {<br />
if (this.options.insertion) {<br />
new this.options.insertion(receiver, response);<br />
} else {<br />
Element.update(receiver, response);<br />
}<br />
}<br />
<br />
if (this.responseIsSuccess()) {<br />
if (this.onComplete)<br />
setTimeout(this.onComplete.bind(this), 10);<br />
}<br />
}<br />
});<br />
<br />
Ajax.PeriodicalUpdater = Class.create();<br />
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {<br />
initialize: function(container, url, options) {<br />
this.setOptions(options);<br />
this.onComplete = this.options.onComplete;<br />
<br />
this.frequency = (this.options.frequency || 2);<br />
this.decay = (this.options.decay || 1);<br />
<br />
this.updater = {};<br />
this.container = container;<br />
this.url = url;<br />
<br />
this.start();<br />
},<br />
<br />
start: function() {<br />
this.options.onComplete = this.updateComplete.bind(this);<br />
this.onTimerEvent();<br />
},<br />
<br />
stop: function() {<br />
this.updater.onComplete = undefined;<br />
clearTimeout(this.timer);<br />
(this.onComplete || Prototype.emptyFunction).apply(this, arguments);<br />
},<br />
<br />
updateComplete: function(request) {<br />
if (this.options.decay) {<br />
this.decay = (request.responseText == this.lastText ?<br />
this.decay * this.options.decay : 1);<br />
<br />
this.lastText = request.responseText;<br />
}<br />
this.timer = setTimeout(this.onTimerEvent.bind(this),<br />
this.decay * this.frequency * 1000);<br />
},<br />
<br />
onTimerEvent: function() {<br />
this.updater = new Ajax.Updater(this.container, this.url, this.options);<br />
}<br />
});<br />
document.getElementsByClassName = function(className, parentElement) {<br />
var children = ($(parentElement) || document.body).getElementsByTagName('*');<br />
return $A(children).inject([], function(elements, child) {<br />
if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))<br />
elements.push(child);<br />
return elements;<br />
});<br />
}<br />
<br />
/*--------------------------------------------------------------------------*/<br />
<br />
if (!window.Element) {<br />
var Element = new Object();<br />
}<br />
<br />
Object.extend(Element, {<br />
visible: function(element) {<br />
return $(element).style.display != 'none';<br />
},<br />
<br />
toggle: function() {<br />
for (var i = 0; i < arguments.length; i++) {<br />
var element = $(arguments[i]);<br />
Element[Element.visible(element) ? 'hide' : 'show'](element);<br />
}<br />
},<br />
<br />
hide: function() {<br />
for (var i = 0; i < arguments.length; i++) {<br />
var element = $(arguments[i]);<br />
element.style.display = 'none';<br />
}<br />
},<br />
<br />
show: function() {<br />
for (var i = 0; i < arguments.length; i++) {<br />
var element = $(arguments[i]);<br />
element.style.display = '';<br />
}<br />
},<br />
<br />
remove: function(element) {<br />
element = $(element);<br />
element.parentNode.removeChild(element);<br />
},<br />
<br />
update: function(element, html) {<br />
$(element).innerHTML = html.stripScripts();<br />
setTimeout(function() {html.evalScripts()}, 10);<br />
},<br />
<br />
getHeight: function(element) {<br />
element = $(element);<br />
return element.offsetHeight;<br />
},<br />
<br />
classNames: function(element) {<br />
return new Element.ClassNames(element);<br />
},<br />
<br />
hasClassName: function(element, className) {<br />
if (!(element = $(element))) return;<br />
return Element.classNames(element).include(className);<br />
},<br />
<br />
addClassName: function(element, className) {<br />
if (!(element = $(element))) return;<br />
return Element.classNames(element).add(className);<br />
},<br />
<br />
removeClassName: function(element, className) {<br />
if (!(element = $(element))) return;<br />
return Element.classNames(element).remove(className);<br />
},<br />
<br />
// removes whitespace-only text node children<br />
cleanWhitespace: function(element) {<br />
element = $(element);<br />
for (var i = 0; i < element.childNodes.length; i++) {<br />
var node = element.childNodes[i];<br />
if (node.nodeType == 3 && !/\S/.test(node.nodeValue))<br />
Element.remove(node);<br />
}<br />
},<br />
<br />
empty: function(element) {<br />
return $(element).innerHTML.match(/^\s*$/);<br />
},<br />
<br />
scrollTo: function(element) {<br />
element = $(element);<br />
var x = element.x ? element.x : element.offsetLeft,<br />
y = element.y ? element.y : element.offsetTop;<br />
window.scrollTo(x, y);<br />
},<br />
<br />
getStyle: function(element, style) {<br />
element = $(element);<br />
var value = element.style[style.camelize()];<br />
if (!value) {<br />
if (document.defaultView && document.defaultView.getComputedStyle) {<br />
var css = document.defaultView.getComputedStyle(element, null);<br />
value = css ? css.getPropertyValue(style) : null;<br />
} else if (element.currentStyle) {<br />
value = element.currentStyle[style.camelize()];<br />
}<br />
}<br />
<br />
if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))<br />
if (Element.getStyle(element, 'position') == 'static') value = 'auto';<br />
<br />
return value == 'auto' ? null : value;<br />
},<br />
<br />
setStyle: function(element, style) {<br />
element = $(element);<br />
for (name in style)<br />
element.style[name.camelize()] = style[name];<br />
},<br />
<br />
getDimensions: function(element) {<br />
element = $(element);<br />
if (Element.getStyle(element, 'display') != 'none')<br />
return {width: element.offsetWidth, height: element.offsetHeight};<br />
<br />
// All *Width and *Height properties give 0 on elements with display none,<br />
// so enable the element temporarily<br />
var els = element.style;<br />
var originalVisibility = els.visibility;<br />
var originalPosition = els.position;<br />
els.visibility = 'hidden';<br />
els.position = 'absolute';<br />
els.display = '';<br />
var originalWidth = element.clientWidth;<br />
var originalHeight = element.clientHeight;<br />
els.display = 'none';<br />
els.position = originalPosition;<br />
els.visibility = originalVisibility;<br />
return {width: originalWidth, height: originalHeight};<br />
},<br />
<br />
makePositioned: function(element) {<br />
element = $(element);<br />
var pos = Element.getStyle(element, 'position');<br />
if (pos == 'static' || !pos) {<br />
element._madePositioned = true;<br />
element.style.position = 'relative';<br />
// Opera returns the offset relative to the positioning context, when an<br />
// element is position relative but top and left have not been defined<br />
if (window.opera) {<br />
element.style.top = 0;<br />
element.style.left = 0;<br />
}<br />
}<br />
},<br />
<br />
undoPositioned: function(element) {<br />
element = $(element);<br />
if (element._madePositioned) {<br />
element._madePositioned = undefined;<br />
element.style.position =<br />
element.style.top =<br />
element.style.left =<br />
element.style.bottom =<br />
element.style.right = '';<br />
}<br />
},<br />
<br />
makeClipping: function(element) {<br />
element = $(element);<br />
if (element._overflow) return;<br />
element._overflow = element.style.overflow;<br />
if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')<br />
element.style.overflow = 'hidden';<br />
},<br />
<br />
undoClipping: function(element) {<br />
element = $(element);<br />
if (element._overflow) return;<br />
element.style.overflow = element._overflow;<br />
element._overflow = undefined;<br />
}<br />
});<br />
<br />
var Toggle = new Object();<br />
Toggle.display = Element.toggle;<br />
<br />
/*--------------------------------------------------------------------------*/<br />
<br />
Abstract.Insertion = function(adjacency) {<br />
this.adjacency = adjacency;<br />
}<br />
<br />
Abstract.Insertion.prototype = {<br />
initialize: function(element, content) {<br />
this.element = $(element);<br />
this.content = content.stripScripts();<br />
<br />
if (this.adjacency && this.element.insertAdjacentHTML) {<br />
try {<br />
this.element.insertAdjacentHTML(this.adjacency, this.content);<br />
} catch (e) {<br />
if (this.element.tagName.toLowerCase() == 'tbody') {<br />
this.insertContent(this.contentFromAnonymousTable());<br />
} else {<br />
throw e;<br />
}<br />
}<br />
} else {<br />
this.range = this.element.ownerDocument.createRange();<br />
if (this.initializeRange) this.initializeRange();<br />
this.insertContent([this.range.createContextualFragment(this.content)]);<br />
}<br />
<br />
setTimeout(function() {content.evalScripts()}, 10);<br />
},<br />
<br />
contentFromAnonymousTable: function() {<br />
var div = document.createElement('div');<br />
div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';<br />
return $A(div.childNodes[0].childNodes[0].childNodes);<br />
}<br />
}<br />
<br />
var Insertion = new Object();<br />
<br />
Insertion.Before = Class.create();<br />
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {<br />
initializeRange: function() {<br />
this.range.setStartBefore(this.element);<br />
},<br />
<br />
insertContent: function(fragments) {<br />
fragments.each((function(fragment) {<br />
this.element.parentNode.insertBefore(fragment, this.element);<br />
}).bind(this));<br />
}<br />
});<br />
<br />
Insertion.Top = Class.create();<br />
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {<br />
initializeRange: function() {<br />
this.range.selectNodeContents(this.element);<br />
this.range.collapse(true);<br />
},<br />
<br />
insertContent: function(fragments) {<br />
fragments.reverse(false).each((function(fragment) {<br />
this.element.insertBefore(fragment, this.element.firstChild);<br />
}).bind(this));<br />
}<br />
});<br />
<br />
Insertion.Bottom = Class.create();<br />
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {<br />
initializeRange: function() {<br />
this.range.selectNodeContents(this.element);<br />
this.range.collapse(this.element);<br />
},<br />
<br />
insertContent: function(fragments) {<br />
fragments.each((function(fragment) {<br />
this.element.appendChild(fragment);<br />
}).bind(this));<br />
}<br />
});<br />
<br />
Insertion.After = Class.create();<br />
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {<br />
initializeRange: function() {<br />
this.range.setStartAfter(this.element);<br />
},<br />
<br />
insertContent: function(fragments) {<br />
fragments.each((function(fragment) {<br />
this.element.parentNode.insertBefore(fragment,<br />
this.element.nextSibling);<br />
}).bind(this));<br />
}<br />
});<br />
<br />
/*--------------------------------------------------------------------------*/<br />
<br />
Element.ClassNames = Class.create();<br />
Element.ClassNames.prototype = {<br />
initialize: function(element) {<br />
this.element = $(element);<br />
},<br />
<br />
_each: function(iterator) {<br />
this.element.className.split(/\s+/).select(function(name) {<br />
return name.length > 0;<br />
})._each(iterator);<br />
},<br />
<br />
set: function(className) {<br />
this.element.className = className;<br />
},<br />
<br />
add: function(classNameToAdd) {<br />
if (this.include(classNameToAdd)) return;<br />
this.set(this.toArray().concat(classNameToAdd).join(' '));<br />
},<br />
<br />
remove: function(classNameToRemove) {<br />
if (!this.include(classNameToRemove)) return;<br />
this.set(this.select(function(className) {<br />
return className != classNameToRemove;<br />
}).join(' '));<br />
},<br />
<br />
toString: function() {<br />
return this.toArray().join(' ');<br />
}<br />
}<br />
<br />
Object.extend(Element.ClassNames.prototype, Enumerable);<br />
var Field = {<br />
clear: function() {<br />
for (var i = 0; i < arguments.length; i++)<br />
$(arguments[i]).value = '';<br />
},<br />
<br />
focus: function(element) {<br />
$(element).focus();<br />
},<br />
<br />
present: function() {<br />
for (var i = 0; i < arguments.length; i++)<br />
if ($(arguments[i]).value == '') return false;<br />
return true;<br />
},<br />
<br />
select: function(element) {<br />
$(element).select();<br />
},<br />
<br />
activate: function(element) {<br />
element = $(element);<br />
element.focus();<br />
if (element.select)<br />
element.select();<br />
}<br />
}<br />
<br />
/*--------------------------------------------------------------------------*/<br />
<br />
var Form = {<br />
serialize: function(form) {<br />
var elements = Form.getElements($(form));<br />
var queryComponents = new Array();<br />
<br />
for (var i = 0; i < elements.length; i++) {<br />
var queryComponent = Form.Element.serialize(elements[i]);<br />
if (queryComponent)<br />
queryComponents.push(queryComponent);<br />
}<br />
<br />
return queryComponents.join('&');<br />
},<br />
<br />
getElements: function(form) {<br />
form = $(form);<br />
var elements = new Array();<br />
<br />
for (tagName in Form.Element.Serializers) {<br />
var tagElements = form.getElementsByTagName(tagName);<br />
for (var j = 0; j < tagElements.length; j++)<br />
elements.push(tagElements[j]);<br />
}<br />
return elements;<br />
},<br />
<br />
getInputs: function(form, typeName, name) {<br />
form = $(form);<br />
var inputs = form.getElementsByTagName('input');<br />
<br />
if (!typeName && !name)<br />
return inputs;<br />
<br />
var matchingInputs = new Array();<br />
for (var i = 0; i < inputs.length; i++) {<br />
var input = inputs[i];<br />
if ((typeName && input.type != typeName) ||<br />
(name && input.name != name))<br />
continue;<br />
matchingInputs.push(input);<br />
}<br />
<br />
return matchingInputs;<br />
},<br />
<br />
disable: function(form) {<br />
var elements = Form.getElements(form);<br />
for (var i = 0; i < elements.length; i++) {<br />
var element = elements[i];<br />
element.blur();<br />
element.disabled = 'true';<br />
}<br />
},<br />
<br />
enable: function(form) {<br />
var elements = Form.getElements(form);<br />
for (var i = 0; i < elements.length; i++) {<br />
var element = elements[i];<br />
element.disabled = '';<br />
}<br />
},<br />
<br />
findFirstElement: function(form) {<br />
return Form.getElements(form).find(function(element) {<br />
return element.type != 'hidden' && !element.disabled &&<br />
['input', 'select', 'textarea'].include(element.tagName.toLowerCase());<br />
});<br />
},<br />
<br />
focusFirstElement: function(form) {<br />
Field.activate(Form.findFirstElement(form));<br />
},<br />
<br />
reset: function(form) {<br />
$(form).reset();<br />
}<br />
}<br />
<br />
Form.Element = {<br />
serialize: function(element) {<br />
element = $(element);<br />
var method = element.tagName.toLowerCase();<br />
var parameter = Form.Element.Serializers[method](element);<br />
<br />
if (parameter) {<br />
var key = encodeURIComponent(parameter[0]);<br />
if (key.length == 0) return;<br />
<br />
if (parameter[1].constructor != Array)<br />
parameter[1] = [parameter[1]];<br />
<br />
return parameter[1].map(function(value) {<br />
return key + '=' + encodeURIComponent(value);<br />
}).join('&');<br />
}<br />
},<br />
<br />
getValue: function(element) {<br />
element = $(element);<br />
var method = element.tagName.toLowerCase();<br />
var parameter = Form.Element.Serializers[method](element);<br />
<br />
if (parameter)<br />
return parameter[1];<br />
}<br />
}<br />
<br />
Form.Element.Serializers = {<br />
input: function(element) {<br />
switch (element.type.toLowerCase()) {<br />
case 'submit':<br />
case 'hidden':<br />
case 'password':<br />
case 'text':<br />
return Form.Element.Serializers.textarea(element);<br />
case 'checkbox':<br />
case 'radio':<br />
return Form.Element.Serializers.inputSelector(element);<br />
}<br />
return false;<br />
},<br />
<br />
inputSelector: function(element) {<br />
if (element.checked)<br />
return [element.name, element.value];<br />
},<br />
<br />
textarea: function(element) {<br />
return [element.name, element.value];<br />
},<br />
<br />
select: function(element) {<br />
return Form.Element.Serializers[element.type == 'select-one' ?<br />
'selectOne' : 'selectMany'](element);<br />
},<br />
<br />
selectOne: function(element) {<br />
var value = '', opt, index = element.selectedIndex;<br />
if (index >= 0) {<br />
opt = element.options[index];<br />
value = opt.value;<br />
if (!value && !('value' in opt))<br />
value = opt.text;<br />
}<br />
return [element.name, value];<br />
},<br />
<br />
selectMany: function(element) {<br />
var value = new Array();<br />
for (var i = 0; i < element.length; i++) {<br />
var opt = element.options[i];<br />
if (opt.selected) {<br />
var optValue = opt.value;<br />
if (!optValue && !('value' in opt))<br />
optValue = opt.text;<br />
value.push(optValue);<br />
}<br />
}<br />
return [element.name, value];<br />
}<br />
}<br />
<br />
/*--------------------------------------------------------------------------*/<br />
<br />
var $F = Form.Element.getValue;<br />
<br />
/*--------------------------------------------------------------------------*/<br />
<br />
Abstract.TimedObserver = function() {}<br />
Abstract.TimedObserver.prototype = {<br />
initialize: function(element, frequency, callback) {<br />
this.frequency = frequency;<br />
this.element = $(element);<br />
this.callback = callback;<br />
<br />
this.lastValue = this.getValue();<br />
this.registerCallback();<br />
},<br />
<br />
registerCallback: function() {<br />
setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);<br />
},<br />
<br />
onTimerEvent: function() {<br />
var value = this.getValue();<br />
if (this.lastValue != value) {<br />
this.callback(this.element, value);<br />
this.lastValue = value;<br />
}<br />
}<br />
}<br />
<br />
Form.Element.Observer = Class.create();<br />
Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {<br />
getValue: function() {<br />
return Form.Element.getValue(this.element);<br />
}<br />
});<br />
<br />
Form.Observer = Class.create();<br />
Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {<br />
getValue: function() {<br />
return Form.serialize(this.element);<br />
}<br />
});<br />
<br />
/*--------------------------------------------------------------------------*/<br />
<br />
Abstract.EventObserver = function() {}<br />
Abstract.EventObserver.prototype = {<br />
initialize: function(element, callback) {<br />
this.element = $(element);<br />
this.callback = callback;<br />
<br />
this.lastValue = this.getValue();<br />
if (this.element.tagName.toLowerCase() == 'form')<br />
this.registerFormCallbacks();<br />
else<br />
this.registerCallback(this.element);<br />
},<br />
<br />
onElementEvent: function() {<br />
var value = this.getValue();<br />
if (this.lastValue != value) {<br />
this.callback(this.element, value);<br />
this.lastValue = value;<br />
}<br />
},<br />
<br />
registerFormCallbacks: function() {<br />
var elements = Form.getElements(this.element);<br />
for (var i = 0; i < elements.length; i++)<br />
this.registerCallback(elements[i]);<br />
},<br />
<br />
registerCallback: function(element) {<br />
if (element.type) {<br />
switch (element.type.toLowerCase()) {<br />
case 'checkbox':<br />
case 'radio':<br />
Event.observe(element, 'click', this.onElementEvent.bind(this));<br />
break;<br />
case 'password':<br />
case 'text':<br />
case 'textarea':<br />
case 'select-one':<br />
case 'select-multiple':<br />
Event.observe(element, 'change', this.onElementEvent.bind(this));<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
<br />
Form.Element.EventObserver = Class.create();<br />
Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {<br />
getValue: function() {<br />
return Form.Element.getValue(this.element);<br />
}<br />
});<br />
<br />
Form.EventObserver = Class.create();<br />
Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {<br />
getValue: function() {<br />
return Form.serialize(this.element);<br />
}<br />
});<br />
if (!window.Event) {<br />
var Event = new Object();<br />
}<br />
<br />
Object.extend(Event, {<br />
KEY_BACKSPACE: 8,<br />
KEY_TAB: 9,<br />
KEY_RETURN: 13,<br />
KEY_ESC: 27,<br />
KEY_LEFT: 37,<br />
KEY_UP: 38,<br />
KEY_RIGHT: 39,<br />
KEY_DOWN: 40,<br />
KEY_DELETE: 46,<br />
<br />
element: function(event) {<br />
return event.target || event.srcElement;<br />
},<br />
<br />
isLeftClick: function(event) {<br />
return (((event.which) && (event.which == 1)) ||<br />
((event.button) && (event.button == 1)));<br />
},<br />
<br />
pointerX: function(event) {<br />
return event.pageX || (event.clientX +<br />
(document.documentElement.scrollLeft || document.body.scrollLeft));<br />
},<br />
<br />
pointerY: function(event) {<br />
return event.pageY || (event.clientY +<br />
(document.documentElement.scrollTop || document.body.scrollTop));<br />
},<br />
<br />
stop: function(event) {<br />
if (event.preventDefault) {<br />
event.preventDefault();<br />
event.stopPropagation();<br />
} else {<br />
event.returnValue = false;<br />
event.cancelBubble = true;<br />
}<br />
},<br />
<br />
// find the first node with the given tagName, starting from the<br />
// node the event was triggered on; traverses the DOM upwards<br />
findElement: function(event, tagName) {<br />
var element = Event.element(event);<br />
while (element.parentNode && (!element.tagName ||<br />
(element.tagName.toUpperCase() != tagName.toUpperCase())))<br />
element = element.parentNode;<br />
return element;<br />
},<br />
<br />
observers: false,<br />
<br />
_observeAndCache: function(element, name, observer, useCapture) {<br />
if (!this.observers) this.observers = [];<br />
if (element.addEventListener) {<br />
this.observers.push([element, name, observer, useCapture]);<br />
element.addEventListener(name, observer, useCapture);<br />
} else if (element.attachEvent) {<br />
this.observers.push([element, name, observer, useCapture]);<br />
element.attachEvent('on' + name, observer);<br />
}<br />
},<br />
<br />
unloadCache: function() {<br />
if (!Event.observers) return;<br />
for (var i = 0; i < Event.observers.length; i++) {<br />
Event.stopObserving.apply(this, Event.observers[i]);<br />
Event.observers[i][0] = null;<br />
}<br />
Event.observers = false;<br />
},<br />
<br />
observe: function(element, name, observer, useCapture) {<br />
var element = $(element);<br />
useCapture = useCapture || false;<br />
<br />
if (name == 'keypress' &&<br />
(navigator.appVersion.match(/Konqueror|Safari|KHTML/)<br />
|| element.attachEvent))<br />
name = 'keydown';<br />
<br />
this._observeAndCache(element, name, observer, useCapture);<br />
},<br />
<br />
stopObserving: function(element, name, observer, useCapture) {<br />
var element = $(element);<br />
useCapture = useCapture || false;<br />
<br />
if (name == 'keypress' &&<br />
(navigator.appVersion.match(/Konqueror|Safari|KHTML/)<br />
|| element.detachEvent))<br />
name = 'keydown';<br />
<br />
if (element.removeEventListener) {<br />
element.removeEventListener(name, observer, useCapture);<br />
} else if (element.detachEvent) {<br />
element.detachEvent('on' + name, observer);<br />
}<br />
}<br />
});<br />
<br />
/* prevent memory leaks in IE */<br />
Event.observe(window, 'unload', Event.unloadCache, false);<br />
var Position = {<br />
// set to true if needed, warning: firefox performance problems<br />
// NOT neeeded for page scrolling, only if draggable contained in<br />
// scrollable elements<br />
includeScrollOffsets: false,<br />
<br />
// must be called before calling withinIncludingScrolloffset, every time the<br />
// page is scrolled<br />
prepare: function() {<br />
this.deltaX = window.pageXOffset<br />
|| document.documentElement.scrollLeft<br />
|| document.body.scrollLeft<br />
|| 0;<br />
this.deltaY = window.pageYOffset<br />
|| document.documentElement.scrollTop<br />
|| document.body.scrollTop<br />
|| 0;<br />
},<br />
<br />
realOffset: function(element) {<br />
var valueT = 0, valueL = 0;<br />
do {<br />
valueT += element.scrollTop || 0;<br />
valueL += element.scrollLeft || 0;<br />
element = element.parentNode;<br />
} while (element);<br />
return [valueL, valueT];<br />
},<br />
<br />
cumulativeOffset: function(element) {<br />
var valueT = 0, valueL = 0;<br />
do {<br />
valueT += element.offsetTop || 0;<br />
valueL += element.offsetLeft || 0;<br />
element = element.offsetParent;<br />
} while (element);<br />
return [valueL, valueT];<br />
},<br />
<br />
positionedOffset: function(element) {<br />
var valueT = 0, valueL = 0;<br />
do {<br />
valueT += element.offsetTop || 0;<br />
valueL += element.offsetLeft || 0;<br />
element = element.offsetParent;<br />
if (element) {<br />
p = Element.getStyle(element, 'position');<br />
if (p == 'relative' || p == 'absolute') break;<br />
}<br />
} while (element);<br />
return [valueL, valueT];<br />
},<br />
<br />
offsetParent: function(element) {<br />
if (element.offsetParent) return element.offsetParent;<br />
if (element == document.body) return element;<br />
<br />
while ((element = element.parentNode) && element != document.body)<br />
if (Element.getStyle(element, 'position') != 'static')<br />
return element;<br />
<br />
return document.body;<br />
},<br />
<br />
// caches x/y coordinate pair to use with overlap<br />
within: function(element, x, y) {<br />
if (this.includeScrollOffsets)<br />
return this.withinIncludingScrolloffsets(element, x, y);<br />
this.xcomp = x;<br />
this.ycomp = y;<br />
this.offset = this.cumulativeOffset(element);<br />
<br />
return (y >= this.offset[1] &&<br />
y < this.offset[1] + element.offsetHeight &&<br />
x >= this.offset[0] &&<br />
x < this.offset[0] + element.offsetWidth);<br />
},<br />
<br />
withinIncludingScrolloffsets: function(element, x, y) {<br />
var offsetcache = this.realOffset(element);<br />
<br />
this.xcomp = x + offsetcache[0] - this.deltaX;<br />
this.ycomp = y + offsetcache[1] - this.deltaY;<br />
this.offset = this.cumulativeOffset(element);<br />
<br />
return (this.ycomp >= this.offset[1] &&<br />
this.ycomp < this.offset[1] + element.offsetHeight &&<br />
this.xcomp >= this.offset[0] &&<br />
this.xcomp < this.offset[0] + element.offsetWidth);<br />
},<br />
<br />
// within must be called directly before<br />
overlap: function(mode, element) {<br />
if (!mode) return 0;<br />
if (mode == 'vertical')<br />
return ((this.offset[1] + element.offsetHeight) - this.ycomp) /<br />
element.offsetHeight;<br />
if (mode == 'horizontal')<br />
return ((this.offset[0] + element.offsetWidth) - this.xcomp) /<br />
element.offsetWidth;<br />
},<br />
<br />
clone: function(source, target) {<br />
source = $(source);<br />
target = $(target);<br />
target.style.position = 'absolute';<br />
var offsets = this.cumulativeOffset(source);<br />
target.style.top = offsets[1] + 'px';<br />
target.style.left = offsets[0] + 'px';<br />
target.style.width = source.offsetWidth + 'px';<br />
target.style.height = source.offsetHeight + 'px';<br />
},<br />
<br />
page: function(forElement) {<br />
var valueT = 0, valueL = 0;<br />
<br />
var element = forElement;<br />
do {<br />
valueT += element.offsetTop || 0;<br />
valueL += element.offsetLeft || 0;<br />
<br />
// Safari fix<br />
if (element.offsetParent==document.body)<br />
if (Element.getStyle(element,'position')=='absolute') break;<br />
<br />
} while (element = element.offsetParent);<br />
<br />
element = forElement;<br />
do {<br />
valueT -= element.scrollTop || 0;<br />
valueL -= element.scrollLeft || 0;<br />
} while (element = element.parentNode);<br />
<br />
return [valueL, valueT];<br />
},<br />
<br />
clone: function(source, target) {<br />
var options = Object.extend({<br />
setLeft: true,<br />
setTop: true,<br />
setWidth: true,<br />
setHeight: true,<br />
offsetTop: 0,<br />
offsetLeft: 0<br />
}, arguments[2] || {})<br />
<br />
// find page position of source<br />
source = $(source);<br />
var p = Position.page(source);<br />
<br />
// find coordinate system to use<br />
target = $(target);<br />
var delta = [0, 0];<br />
var parent = null;<br />
// delta [0,0] will do fine with position: fixed elements,<br />
// position:absolute needs offsetParent deltas<br />
if (Element.getStyle(target,'position') == 'absolute') {<br />
parent = Position.offsetParent(target);<br />
delta = Position.page(parent);<br />
}<br />
<br />
// correct by body offsets (fixes Safari)<br />
if (parent == document.body) {<br />
delta[0] -= document.body.offsetLeft;<br />
delta[1] -= document.body.offsetTop;<br />
}<br />
<br />
// set position<br />
if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';<br />
if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';<br />
if(options.setWidth) target.style.width = source.offsetWidth + 'px';<br />
if(options.setHeight) target.style.height = source.offsetHeight + 'px';<br />
},<br />
<br />
absolutize: function(element) {<br />
element = $(element);<br />
if (element.style.position == 'absolute') return;<br />
Position.prepare();<br />
<br />
var offsets = Position.positionedOffset(element);<br />
var top = offsets[1];<br />
var left = offsets[0];<br />
var width = element.clientWidth;<br />
var height = element.clientHeight;<br />
<br />
element._originalLeft = left - parseFloat(element.style.left || 0);<br />
element._originalTop = top - parseFloat(element.style.top || 0);<br />
element._originalWidth = element.style.width;<br />
element._originalHeight = element.style.height;<br />
<br />
element.style.position = 'absolute';<br />
element.style.top = top + 'px';;<br />
element.style.left = left + 'px';;<br />
element.style.width = width + 'px';;<br />
element.style.height = height + 'px';;<br />
},<br />
<br />
relativize: function(element) {<br />
element = $(element);<br />
if (element.style.position == 'relative') return;<br />
Position.prepare();<br />
<br />
element.style.position = 'relative';<br />
var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);<br />
var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);<br />
<br />
element.style.top = top + 'px';<br />
element.style.left = left + 'px';<br />
element.style.height = element._originalHeight;<br />
element.style.width = element._originalWidth;<br />
}<br />
}<br />
<br />
// Safari returns margins on body which is incorrect if the child is absolutely<br />
// positioned. For performance reasons, redefine Position.cumulativeOffset for<br />
// KHTML/WebKit only.<br />
if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {<br />
Position.cumulativeOffset = function(element) {<br />
var valueT = 0, valueL = 0;<br />
do {<br />
valueT += element.offsetTop || 0;<br />
valueL += element.offsetLeft || 0;<br />
if (element.offsetParent == document.body)<br />
if (Element.getStyle(element, 'position') == 'absolute') break;<br />
<br />
element = element.offsetParent;<br />
} while (element);<br />
<br />
return [valueL, valueT];<br />
}<br />
}</div>
Dinula98