0
-/* Prototype JavaScript framework, version 1.5.0_rc2
0
+/* Prototype JavaScript framework, version 1.5.0
0
* (c) 2005-2007 Sam Stephenson
0
* Prototype is freely distributable under the terms of an MIT-style license.
0
/*--------------------------------------------------------------------------*/
0
XPath: !!document.evaluate
0
@@ -629,11 +629,43 @@ if(window.opera){
0
+var Hash = function(obj) {
0
+ Object.extend(this, obj || {});
0
+ toQueryString: function(obj) {
0
+ this.prototype._each.call(obj, function(pair) {
0
+ if (!pair.key) return;
0
+ if (pair.value && pair.value.constructor == Array) {
0
+ var values = pair.value.compact();
0
+ if (values.length < 2) pair.value = values.reduce();
0
+ key = encodeURIComponent(pair.key);
0
+ values.each(function(value) {
0
+ value = value != undefined ? encodeURIComponent(value) : '';
0
+ parts.push(key + '=' + encodeURIComponent(value));
0
+ if (pair.value == undefined) pair[1] = '';
0
+ parts.push(pair.map(encodeURIComponent).join('='));
0
+ return parts.join('&');
0
+Object.extend(Hash.prototype, Enumerable);
0
+Object.extend(Hash.prototype, {
0
_each: function(iterator) {
0
for (var key in this) {
0
- if (typeof value == 'function') continue;
0
+ if (value && value == Hash.prototype[key]) continue;
0
var pair = [key, value];
0
@@ -657,26 +689,24 @@ var Hash = {
0
- toQueryString: function() {
0
- return this.map(function(pair) {
0
- if (!pair.key) return null;
0
- if (pair.value && pair.value.constructor == Array) {
0
- pair.value = pair.value.compact();
0
- if (pair.value.length < 2) {
0
- pair.value = pair.value.reduce();
0
- var key = encodeURIComponent(pair.key);
0
- return pair.value.map(function(value) {
0
- return key + '=' + encodeURIComponent(value);
0
+ for(var i = 0, length = arguments.length; i < length; i++) {
0
+ var value = this[arguments[i]];
0
+ if (value !== undefined){
0
+ if (result === undefined) result = value;
0
+ if (result.constructor != Array) result = [result];
0
+ delete this[arguments[i]];
0
- if (pair.value == undefined) pair[1] = '';
0
- return pair.map(encodeURIComponent).join('=');
0
+ toQueryString: function() {
0
+ return Hash.toQueryString(this);
0
@@ -684,14 +714,12 @@ var Hash = {
0
return pair.map(Object.inspect).join(': ');
0
- var hash = Object.extend({}, object || {});
0
- Object.extend(hash, Enumerable);
0
- Object.extend(hash, Hash);
0
+ if (object && object.constructor == Hash) return object;
0
+ return new Hash(object);
0
ObjectRange = Class.create();
0
Object.extend(ObjectRange.prototype, Enumerable);
0
Object.extend(ObjectRange.prototype, {
0
@@ -785,8 +813,8 @@ Ajax.Base.prototype = {
0
Object.extend(this.options, options || {});
0
this.options.method = this.options.method.toLowerCase();
0
- this.options.parameters = $H(typeof this.options.parameters == 'string' ?
0
- this.options.parameters.toQueryParams() : this.options.parameters);
0
+ if (typeof this.options.parameters == 'string')
0
+ this.options.parameters = this.options.parameters.toQueryParams();
0
@@ -804,26 +832,26 @@ Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
0
request: function(url) {
0
- var params = this.options.parameters;
0
- if (params.any()) params['_'] = '';
0
+ var params = this.options.parameters, method = this.options.method;
0
- if (!['get', 'post'].include(this.options.method)) {
0
+ if (!['get', 'post'].include(method)) {
0
// simulate other verbs over post
0
- params['_method'] = this.options.method;
0
- this.options.method = 'post';
0
+ params['_method'] = method;
0
+ params = Hash.toQueryString(params);
0
+ if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
0
// when GET, append parameters to URL
0
- if (this.options.method == 'get' && params.any())
0
- this.url += (this.url.indexOf('?') >= 0 ? '&' : '?') +
0
- params.toQueryString();
0
+ if (method == 'get' && params)
0
+ this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
0
Ajax.Responders.dispatch('onCreate', this, this.transport);
0
- this.transport.open(this.options.method.toUpperCase(), this.url,
0
+ this.transport.open(method.toUpperCase(), this.url,
0
this.options.asynchronous);
0
if (this.options.asynchronous)
0
@@ -832,8 +860,7 @@ Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
0
this.transport.onreadystatechange = this.onStateChange.bind(this);
0
this.setRequestHeaders();
0
- var body = this.options.method == 'post' ?
0
- (this.options.postBody || params.toQueryString()) : null;
0
+ var body = method == 'post' ? (this.options.postBody || params) : null;
0
this.transport.send(body);
0
@@ -1054,7 +1081,7 @@ if (Prototype.BrowserFeatures.XPath) {
0
for (var i = 0, length = query.snapshotLength; i < length; i++)
0
results.push(query.snapshotItem(i));
0
document.getElementsByClassName = function(className, parentElement) {
0
@@ -1071,7 +1098,7 @@ document.getElementsByClassName = function(className, parentElement) {
0
/*--------------------------------------------------------------------------*/
0
@@ -1100,7 +1127,7 @@ Element.extend = function(element) {
0
element._extended = true;
0
Element.extend.cache = {
0
findOrStore: function(value) {
0
@@ -1108,7 +1135,7 @@ Element.extend.cache = {
0
return value.apply(null, [this].concat($A(arguments)));
0
visible: function(element) {
0
@@ -1146,6 +1173,7 @@ Element.Methods = {
0
replace: function(element, html) {
0
+ html = typeof html == 'undefined' ? '' : html.toString();
0
if (element.outerHTML) {
0
element.outerHTML = html.stripScripts();
0
@@ -1238,11 +1266,23 @@ Element.Methods = {
0
readAttribute: function(element, name) {
0
- return $(element).getAttribute(name);
0
+ if (document.all && !window.opera) {
0
+ var t = Element._attributeTranslations;
0
+ if (t.values[name]) return t.values[name](element, name);
0
+ if (t.names[name]) name = t.names[name];
0
+ var attribute = element.attributes[name];
0
+ if(attribute) return attribute.nodeValue;
0
+ return element.getAttribute(name);
0
getHeight: function(element) {
0
- return $(element).offsetHeight;
0
+ return $(element).getDimensions().height;
0
+ getWidth: function(element) {
0
+ return $(element).getDimensions().width;
0
classNames: function(element) {
0
@@ -1304,7 +1344,7 @@ Element.Methods = {
0
return $(element).innerHTML.match(/^\s*$/);
0
- childOf: function(element, ancestor) {
0
+ descendantOf: function(element, ancestor) {
0
element = $(element), ancestor = $(ancestor);
0
while (element = element.parentNode)
0
if (element == ancestor) return true;
0
@@ -1320,15 +1360,16 @@ Element.Methods = {
0
getStyle: function(element, style) {
0
- var camelizedStyle = (style == 'float' ?
0
- (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat') : style).camelize();
0
- var value = element.style[camelizedStyle];
0
+ if (['float','cssFloat'].include(style))
0
+ style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
0
+ style = style.camelize();
0
+ var value = element.style[style];
0
if (document.defaultView && document.defaultView.getComputedStyle) {
0
var css = document.defaultView.getComputedStyle(element, null);
0
- value = css ? css[camelizedStyle] : null;
0
+ value = css ? css[style] : null;
0
} else if (element.currentStyle) {
0
- value = element.currentStyle[camelizedStyle];
0
+ value = element.currentStyle[style];
0
@@ -1356,13 +1397,16 @@ Element.Methods = {
0
!/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
0
if(/MSIE/.test(navigator.userAgent) && !window.opera)
0
element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
0
+ } else if(value == '') {
0
+ if(/MSIE/.test(navigator.userAgent) && !window.opera)
0
+ element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
0
if(value < 0.00001) value = 0;
0
if(/MSIE/.test(navigator.userAgent) && !window.opera)
0
element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
0
'alpha(opacity='+value*100+')';
0
- } else if(name == 'float') name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
0
+ } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
0
element.style[name.camelize()] = value;
0
@@ -1370,7 +1414,8 @@ Element.Methods = {
0
getDimensions: function(element) {
0
- if (Element.getStyle(element, 'display') != 'none')
0
+ var display = $(element).getStyle('display');
0
+ if (display != 'none' && display != null) // Safari bug
0
return {width: element.offsetWidth, height: element.offsetHeight};
0
// All *Width and *Height properties give 0 on elements with display none,
0
@@ -1378,12 +1423,13 @@ Element.Methods = {
0
var els = element.style;
0
var originalVisibility = els.visibility;
0
var originalPosition = els.position;
0
+ var originalDisplay = els.display;
0
els.visibility = 'hidden';
0
els.position = 'absolute';
0
+ els.display = 'block';
0
var originalWidth = element.clientWidth;
0
var originalHeight = element.clientHeight;
0
+ els.display = originalDisplay;
0
els.position = originalPosition;
0
els.visibility = originalVisibility;
0
return {width: originalWidth, height: originalHeight};
0
@@ -1434,16 +1480,63 @@ Element.Methods = {
0
element._overflow = null;
0
+Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
0
+Element._attributeTranslations = {};
0
+Element._attributeTranslations.names = {
0
+ accesskey: "accessKey",
0
+ maxlength: "maxLength",
0
+Element._attributeTranslations.values = {
0
+ _getAttr: function(element, attribute) {
0
+ return element.getAttribute(attribute, 2);
0
+ _flag: function(element, attribute) {
0
+ return $(element).hasAttribute(attribute) ? attribute : null;
0
+ style: function(element) {
0
+ return element.style.cssText.toLowerCase();
0
+ title: function(element) {
0
+ var node = element.getAttributeNode('title');
0
+ return node.specified ? node.nodeValue : null;
0
+Object.extend(Element._attributeTranslations.values, {
0
+ href: Element._attributeTranslations.values._getAttr,
0
+ src: Element._attributeTranslations.values._getAttr,
0
+ disabled: Element._attributeTranslations.values._flag,
0
+ checked: Element._attributeTranslations.values._flag,
0
+ readonly: Element._attributeTranslations.values._flag,
0
+ multiple: Element._attributeTranslations.values._flag
0
Element.Methods.Simulated = {
0
hasAttribute: function(element, attribute) {
0
+ var t = Element._attributeTranslations;
0
+ attribute = t.names[attribute] || attribute;
0
return $(element).getAttributeNode(attribute).specified;
0
// IE is missing .innerHTML support for TABLE-related elements
0
+if (document.all && !window.opera){
0
Element.Methods.update = function(element, html) {
0
html = typeof html == 'undefined' ? '' : html.toString();
0
@@ -1477,7 +1570,7 @@ if(document.all){
0
setTimeout(function() {html.evalScripts()}, 10);
0
Object.extend(Element, Element.Methods);
0
@@ -1644,7 +1737,7 @@ Element.ClassNames.prototype = {
0
return $A(this).join(' ');
0
Object.extend(Element.ClassNames.prototype, Enumerable);
0
var Selector = Class.create();
0
@@ -1691,15 +1784,15 @@ Selector.prototype = {
0
conditions.push('true');
0
if (clause = params.id)
0
- conditions.push('element.getAttribute("id") == ' + clause.inspect());
0
+ conditions.push('element.readAttribute("id") == ' + clause.inspect());
0
if (clause = params.tagName)
0
conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
0
if ((clause = params.classNames).length > 0)
0
for (var i = 0, length = clause.length; i < length; i++)
0
- conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');
0
+ conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
0
if (clause = params.attributes) {
0
clause.each(function(attribute) {
0
- var value = 'element.getAttribute(' + attribute.name.inspect() + ')';
0
+ var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
0
var splitValueBy = function(delimiter) {
0
return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
0
@@ -1712,7 +1805,7 @@ Selector.prototype = {
0
case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break;
0
- case undefined: conditions.push(value + ' != null'); break;
0
+ case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
0
default: throw 'Unknown operator ' + attribute.operator + ' in selector';
0
@@ -1723,6 +1816,7 @@ Selector.prototype = {
0
compileMatcher: function() {
0
this.match = new Function('element', 'if (!element.tagName) return false; \
0
+ element = $(element); \
0
return ' + this.buildMatchExpression());
0
@@ -1762,7 +1856,7 @@ Object.extend(Selector, {
0
findChildElements: function(element, expressions) {
0
return expressions.map(function(expression) {
0
- return expression.strip().split(/\s+/).inject([null], function(results, expr) {
0
+ return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
0
var selector = new Selector(expr);
0
return results.inject([], function(elements, result) {
0
return elements.concat(selector.findElements(result || element));
0
@@ -1781,18 +1875,28 @@ var Form = {
0
- serializeElements: function(elements) {
0
- return elements.inject([], function(queryComponents, element) {
0
- var queryComponent = Form.Element.serialize(element);
0
- if (queryComponent) queryComponents.push(queryComponent);
0
- return queryComponents;
0
+ serializeElements: function(elements, getHash) {
0
+ var data = elements.inject({}, function(result, element) {
0
+ if (!element.disabled && element.name) {
0
+ var key = element.name, value = $(element).getValue();
0
+ if (value != undefined) {
0
+ if (result[key].constructor != Array) result[key] = [result[key]];
0
+ result[key].push(value);
0
+ else result[key] = value;
0
+ return getHash ? data : Hash.toQueryString(data);
0
- serialize: function(form) {
0
- return Form.serializeElements(Form.getElements(form));
0
+ serialize: function(form, getHash) {
0
+ return Form.serializeElements(Form.getElements(form), getHash);
0
getElements: function(form) {
0
@@ -1807,15 +1911,13 @@ Form.Methods = {
0
getInputs: function(form, typeName, name) {
0
- var inputs = form.getElementsByTagName('input'), matchingInputs = [];
0
+ var inputs = form.getElementsByTagName('input');
0
- if (!typeName && !name)
0
- return $A(inputs).map(Element.extend);
0
+ if (!typeName && !name) return $A(inputs).map(Element.extend);
0
- for (var i = 0, length = inputs.length; i < length; i++) {
0
+ for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
0
- if ((typeName && input.type != typeName) ||
0
- (name && input.name != name))
0
+ if ((typeName && input.type != typeName) || (name && input.name != name))
0
matchingInputs.push(Element.extend(input));
0
@@ -1873,30 +1975,21 @@ Form.Element = {
0
Form.Element.Methods = {
0
serialize: function(element) {
0
- if (element.disabled) return '';
0
- var method = element.tagName.toLowerCase();
0
- var parameter = Form.Element.Serializers[method](element);
0
- var key = encodeURIComponent(parameter[0]);
0
- if (key.length == 0) return;
0
- if (parameter[1].constructor != Array)
0
- parameter[1] = [parameter[1]];
0
- return parameter[1].map(function(value) {
0
- return key + '=' + encodeURIComponent(value);
0
+ if (!element.disabled && element.name) {
0
+ var value = element.getValue();
0
+ if (value != undefined) {
0
+ pair[element.name] = value;
0
+ return Hash.toQueryString(pair);
0
getValue: function(element) {
0
var method = element.tagName.toLowerCase();
0
- var parameter = Form.Element.Serializers[method](element);
0
+ return Form.Element.Serializers[method](element);
0
clear: function(element) {
0
@@ -1933,6 +2026,7 @@ Form.Element.Methods = {
0
Object.extend(Form.Element, Form.Element.Methods);
0
var Field = Form.Element;
0
+var $F = Form.Element.getValue;
0
/*--------------------------------------------------------------------------*/
0
@@ -1945,51 +2039,45 @@ Form.Element.Serializers = {
0
return Form.Element.Serializers.textarea(element);
0
inputSelector: function(element) {
0
- return [element.name, element.value];
0
+ return element.checked ? element.value : null;
0
textarea: function(element) {
0
- return [element.name, element.value];
0
select: function(element) {
0
- return Form.Element.Serializers[element.type == 'select-one' ?
0
+ return this[element.type == 'select-one' ?
0
'selectOne' : 'selectMany'](element);
0
selectOne: function(element) {
0
- var value = '', opt, index = element.selectedIndex;
0
- opt = Element.extend(element.options[index]);
0
- // Uses the new potential extension if hasAttribute isn't native.
0
- value = opt.hasAttribute('value') ? opt.value : opt.text;
0
- return [element.name, value];
0
+ var index = element.selectedIndex;
0
+ return index >= 0 ? this.optionValue(element.options[index]) : null;
0
selectMany: function(element) {
0
- for (var i = 0, length = element.length; i < length; i++) {
0
- var opt = Element.extend(element.options[i]);