Author: abelevich
Date: 2009-01-22 09:28:38 -0500 (Thu, 22 Jan 2009)
New Revision: 12369
Removed:
trunk/sandbox/samples/maven-rd-plugin-sample/src/main/webapp/scripts/custom-dependencies.js
Log:
Deleted:
trunk/sandbox/samples/maven-rd-plugin-sample/src/main/webapp/scripts/custom-dependencies.js
===================================================================
---
trunk/sandbox/samples/maven-rd-plugin-sample/src/main/webapp/scripts/custom-dependencies.js 2009-01-22
14:26:55 UTC (rev 12368)
+++
trunk/sandbox/samples/maven-rd-plugin-sample/src/main/webapp/scripts/custom-dependencies.js 2009-01-22
14:28:38 UTC (rev 12369)
@@ -1,10121 +0,0 @@
-//=========================== before =====================
-/* Prototype JavaScript framework, version 1.6.0.3
- * (c) 2005-2008 Sam Stephenson
- *
- * Prototype is freely distributable under the terms of an MIT-style license.
- * For details, see the Prototype web site:
http://www.prototypejs.org/
- *
- *--------------------------------------------------------------------------*/
-
-var Prototype = {
- Version: '1.6.0.3',
-
- Browser: {
- IE: !!(window.attachEvent &&
- navigator.userAgent.indexOf('Opera') === -1),
- Opera: navigator.userAgent.indexOf('Opera') > -1,
- WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
- Gecko: navigator.userAgent.indexOf('Gecko') > -1 &&
- navigator.userAgent.indexOf('KHTML') === -1,
- MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
- },
-
- BrowserFeatures: {
- XPath: !!document.evaluate,
- SelectorsAPI: !!document.querySelector,
- ElementExtensions: !!window.HTMLElement,
- SpecificElementExtensions:
- document.createElement('div')['__proto__'] &&
- document.createElement('div')['__proto__'] !==
- document.createElement('form')['__proto__']
- },
-
- ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
- JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
-
- emptyFunction: function() { },
- K: function(x) { return x }
-};
-
-if (Prototype.Browser.MobileSafari)
- Prototype.BrowserFeatures.SpecificElementExtensions = false;
-
-
-/* Based on Alex Arnell's inheritance implementation. */
-var Class = {
- create: function() {
- var parent = null, properties = $A(arguments);
- if (Object.isFunction(properties[0]))
- parent = properties.shift();
-
- function klass() {
- this.initialize.apply(this, arguments);
- }
-
- Object.extend(klass, Class.Methods);
- klass.superclass = parent;
- klass.subclasses = [];
-
- if (parent) {
- var subclass = function() { };
- subclass.prototype = parent.prototype;
- klass.prototype = new subclass;
- parent.subclasses.push(klass);
- }
-
- for (var i = 0; i < properties.length; i++)
- klass.addMethods(properties[i]);
-
- if (!klass.prototype.initialize)
- klass.prototype.initialize = Prototype.emptyFunction;
-
- klass.prototype.constructor = klass;
-
- return klass;
- }
-};
-
-Class.Methods = {
- addMethods: function(source) {
- var ancestor = this.superclass && this.superclass.prototype;
- var properties = Object.keys(source);
-
- if (!Object.keys({ toString: true }).length)
- properties.push("toString", "valueOf");
-
- for (var i = 0, length = properties.length; i < length; i++) {
- var property = properties[i], value = source[property];
- if (ancestor && Object.isFunction(value) &&
- value.argumentNames().first() == "$super") {
- var method = value;
- value = (function(m) {
- return function() { return ancestor[m].apply(this, arguments) };
- })(property).wrap(method);
-
- value.valueOf = method.valueOf.bind(method);
- value.toString = method.toString.bind(method);
- }
- this.prototype[property] = value;
- }
-
- return this;
- }
-};
-
-var Abstract = { };
-
-Object.extend = function(destination, source) {
- for (var property in source)
- destination[property] = source[property];
- return destination;
-};
-
-Object.extend(Object, {
- inspect: function(object) {
- try {
- if (Object.isUndefined(object)) return 'undefined';
- if (object === null) return 'null';
- return object.inspect ? object.inspect() : String(object);
- } catch (e) {
- if (e instanceof RangeError) return '...';
- throw e;
- }
- },
-
- toJSON: function(object) {
- var type = typeof object;
- switch (type) {
- case 'undefined':
- case 'function':
- case 'unknown': return;
- case 'boolean': return object.toString();
- }
-
- if (object === null) return 'null';
- if (object.toJSON) return object.toJSON();
- if (Object.isElement(object)) return;
-
- var results = [];
- for (var property in object) {
- var value = Object.toJSON(object[property]);
- if (!Object.isUndefined(value))
- results.push(property.toJSON() + ': ' + value);
- }
-
- return '{' + results.join(', ') + '}';
- },
-
- toQueryString: function(object) {
- return $H(object).toQueryString();
- },
-
- toHTML: function(object) {
- return object && object.toHTML ? object.toHTML() : String.interpret(object);
- },
-
- keys: function(object) {
- var keys = [];
- for (var property in object)
- keys.push(property);
- return keys;
- },
-
- values: function(object) {
- var values = [];
- for (var property in object)
- values.push(object[property]);
- return values;
- },
-
- clone: function(object) {
- return Object.extend({ }, object);
- },
-
- isElement: function(object) {
- return !!(object && object.nodeType == 1);
- },
-
- isArray: function(object) {
- return object != null && typeof object == "object" &&
- 'splice' in object && 'join' in object;
- },
-
- isHash: function(object) {
- return object instanceof Hash;
- },
-
- isFunction: function(object) {
- return typeof object == "function";
- },
-
- isString: function(object) {
- return typeof object == "string";
- },
-
- isNumber: function(object) {
- return typeof object == "number";
- },
-
- isUndefined: function(object) {
- return typeof object == "undefined";
- }
-});
-
-Object.extend(Function.prototype, {
- argumentNames: function() {
- var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
- .replace(/\s+/g, '').split(',');
- return names.length == 1 && !names[0] ? [] : names;
- },
-
- bind: function() {
- if (arguments.length < 2 && Object.isUndefined(arguments[0])) return
this;
- var __method = this, args = $A(arguments), object = args.shift();
- return function() {
- return __method.apply(object, args.concat($A(arguments)));
- }
- },
-
- bindAsEventListener: function() {
- var __method = this, args = $A(arguments), object = args.shift();
- return function(event) {
- return __method.apply(object, [event || window.event].concat(args));
- }
- },
-
- curry: function() {
- if (!arguments.length) return this;
- var __method = this, args = $A(arguments);
- return function() {
- return __method.apply(this, args.concat($A(arguments)));
- }
- },
-
- delay: function() {
- var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
- return window.setTimeout(function() {
- return __method.apply(__method, args);
- }, timeout);
- },
-
- defer: function() {
- var args = [0.01].concat($A(arguments));
- return this.delay.apply(this, args);
- },
-
- wrap: function(wrapper) {
- var __method = this;
- return function() {
- return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
- }
- },
-
- methodize: function() {
- if (this._methodized) return this._methodized;
- var __method = this;
- return this._methodized = function() {
- return __method.apply(null, [this].concat($A(arguments)));
- };
- }
-});
-
-Date.prototype.toJSON = function() {
- return '"' + this.getUTCFullYear() + '-' +
- (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
- this.getUTCDate().toPaddedString(2) + 'T' +
- this.getUTCHours().toPaddedString(2) + ':' +
- this.getUTCMinutes().toPaddedString(2) + ':' +
- this.getUTCSeconds().toPaddedString(2) + 'Z"';
-};
-
-var Try = {
- these: function() {
- var returnValue;
-
- for (var i = 0, length = arguments.length; i < length; i++) {
- var lambda = arguments[i];
- try {
- returnValue = lambda();
- break;
- } catch (e) { }
- }
-
- return returnValue;
- }
-};
-
-RegExp.prototype.match = RegExp.prototype.test;
-
-RegExp.escape = function(str) {
- return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
-};
-
-/*--------------------------------------------------------------------------*/
-
-var PeriodicalExecuter = Class.create({
- initialize: function(callback, frequency) {
- this.callback = callback;
- this.frequency = frequency;
- this.currentlyExecuting = false;
-
- this.registerCallback();
- },
-
- registerCallback: function() {
- this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
- },
-
- execute: function() {
- this.callback(this);
- },
-
- stop: function() {
- if (!this.timer) return;
- clearInterval(this.timer);
- this.timer = null;
- },
-
- onTimerEvent: function() {
- if (!this.currentlyExecuting) {
- try {
- this.currentlyExecuting = true;
- this.execute();
- } finally {
- this.currentlyExecuting = false;
- }
- }
- }
-});
-Object.extend(String, {
- interpret: function(value) {
- return value == null ? '' : String(value);
- },
- specialChar: {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '\\': '\\\\'
- }
-});
-
-Object.extend(String.prototype, {
- gsub: function(pattern, replacement) {
- var result = '', source = this, match;
- replacement = arguments.callee.prepareReplacement(replacement);
-
- while (source.length > 0) {
- if (match = source.match(pattern)) {
- result += source.slice(0, match.index);
- result += String.interpret(replacement(match));
- source = source.slice(match.index + match[0].length);
- } else {
- result += source, source = '';
- }
- }
- return result;
- },
-
- sub: function(pattern, replacement, count) {
- replacement = this.gsub.prepareReplacement(replacement);
- count = Object.isUndefined(count) ? 1 : count;
-
- return this.gsub(pattern, function(match) {
- if (--count < 0) return match[0];
- return replacement(match);
- });
- },
-
- scan: function(pattern, iterator) {
- this.gsub(pattern, iterator);
- return String(this);
- },
-
- truncate: function(length, truncation) {
- length = length || 30;
- truncation = Object.isUndefined(truncation) ? '...' : truncation;
- return this.length > length ?
- this.slice(0, length - truncation.length) + truncation : String(this);
- },
-
- strip: function() {
- return this.replace(/^\s+/, '').replace(/\s+$/, '');
- },
-
- stripTags: function() {
- return this.replace(/<\/?[^>]+>/gi, '');
- },
-
- stripScripts: function() {
- return this.replace(new RegExp(Prototype.ScriptFragment, 'img'),
'');
- },
-
- extractScripts: function() {
- var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
- var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
- return (this.match(matchAll) || []).map(function(scriptTag) {
- var result = (scriptTag.match(matchOne) || ['', ''])[1];
- result =
result.replace(/</,"<").replace(/\s*<!--[^\r\n]*/,
"");
- return result;
- });
- },
-
- evalScripts: function() {
- return this.extractScripts().map(function(script) { return eval(script) });
- },
-
- escapeHTML: function() {
- var self = arguments.callee;
- self.text.data = this;
- return self.div.innerHTML;
- },
-
- unescapeHTML: function() {
- var div = new Element('div');
- div.innerHTML = this.stripTags();
- return div.childNodes[0] ? (div.childNodes.length > 1 ?
- $A(div.childNodes).inject('', function(memo, node) { return
memo+node.nodeValue }) :
- div.childNodes[0].nodeValue) : '';
- },
-
- toQueryParams: function(separator) {
- var match = this.strip().match(/([^?#]*)(#.*)?$/);
- if (!match) return { };
-
- return match[1].split(separator || '&').inject({ }, function(hash, pair)
{
- if ((pair = pair.split('='))[0]) {
- var key = decodeURIComponent(pair.shift());
- var value = pair.length > 1 ? pair.join('=') : pair[0];
- if (value != undefined) value = decodeURIComponent(value);
-
- if (key in hash) {
- if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
- hash[key].push(value);
- }
- else hash[key] = value;
- }
- return hash;
- });
- },
-
- toArray: function() {
- return this.split('');
- },
-
- succ: function() {
- return this.slice(0, this.length - 1) +
- String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
- },
-
- times: function(count) {
- return count < 1 ? '' : new Array(count + 1).join(this);
- },
-
- camelize: function() {
- var parts = this.split('-'), len = parts.length;
- if (len == 1) return parts[0];
-
- var camelized = this.charAt(0) == '-'
- ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
- : parts[0];
-
- for (var i = 1; i < len; i++)
- camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
-
- return camelized;
- },
-
- capitalize: function() {
- return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
- },
-
- underscore: function() {
- return this.gsub(/::/,
'/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
- },
-
- dasherize: function() {
- return this.gsub(/_/,'-');
- },
-
- inspect: function(useDoubleQuotes) {
- var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
- var character = String.specialChar[match[0]];
- return character ? character : '\\u00' +
match[0].charCodeAt().toPaddedString(2, 16);
- });
- if (useDoubleQuotes) return '"' + escapedString.replace(/"/g,
'\\"') + '"';
- return "'" + escapedString.replace(/'/g, '\\\'') +
"'";
- },
-
- toJSON: function() {
- return this.inspect(true);
- },
-
- unfilterJSON: function(filter) {
- return this.sub(filter || Prototype.JSONFilter, '#{1}');
- },
-
- isJSON: function() {
- var str = this;
- if (str.blank()) return false;
- str = this.replace(/\\./g, '(a)').replace(/"[^"\\\n\r]*"/g,
'');
- return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
- },
-
- evalJSON: function(sanitize) {
- var json = this.unfilterJSON();
- try {
- if (!sanitize || json.isJSON()) return eval('(' + json + ')');
- } catch (e) { }
- throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
- },
-
- include: function(pattern) {
- return this.indexOf(pattern) > -1;
- },
-
- startsWith: function(pattern) {
- return this.indexOf(pattern) === 0;
- },
-
- endsWith: function(pattern) {
- var d = this.length - pattern.length;
- return d >= 0 && this.lastIndexOf(pattern) === d;
- },
-
- empty: function() {
- return this == '';
- },
-
- blank: function() {
- return /^\s*$/.test(this);
- },
-
- interpolate: function(object, pattern) {
- return new Template(this, pattern).evaluate(object);
- }
-});
-
-if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
- escapeHTML: function() {
- return
this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
- },
- unescapeHTML: function() {
- return
this.stripTags().replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
- }
-});
-
-String.prototype.gsub.prepareReplacement = function(replacement) {
- if (Object.isFunction(replacement)) return replacement;
- var template = new Template(replacement);
- return function(match) { return template.evaluate(match) };
-};
-
-String.prototype.parseQuery = String.prototype.toQueryParams;
-
-Object.extend(String.prototype.escapeHTML, {
- div: document.createElement('div'),
- text: document.createTextNode('')
-});
-
-String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);
-
-var Template = Class.create({
- initialize: function(template, pattern) {
- this.template = template.toString();
- this.pattern = pattern || Template.Pattern;
- },
-
- evaluate: function(object) {
- if (Object.isFunction(object.toTemplateReplacements))
- object = object.toTemplateReplacements();
-
- return this.template.gsub(this.pattern, function(match) {
- if (object == null) return '';
-
- var before = match[1] || '';
- if (before == '\\') return match[2];
-
- var ctx = object, expr = match[3];
- var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
- match = pattern.exec(expr);
- if (match == null) return before;
-
- while (match != null) {
- var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]',
']') : match[1];
- ctx = ctx[comp];
- if (null == ctx || '' == match[3]) break;
- expr = expr.substring('[' == match[3] ? match[1].length :
match[0].length);
- match = pattern.exec(expr);
- }
-
- return before + String.interpret(ctx);
- });
- }
-});
-Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
-
-var $break = { };
-
-var Enumerable = {
- each: function(iterator, context) {
- var index = 0;
- try {
- this._each(function(value) {
- iterator.call(context, value, index++);
- });
- } catch (e) {
- if (e != $break) throw e;
- }
- return this;
- },
-
- eachSlice: function(number, iterator, context) {
- var index = -number, slices = [], array = this.toArray();
- if (number < 1) return array;
- while ((index += number) < array.length)
- slices.push(array.slice(index, index+number));
- return slices.collect(iterator, context);
- },
-
- all: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var result = true;
- this.each(function(value, index) {
- result = result && !!iterator.call(context, value, index);
- if (!result) throw $break;
- });
- return result;
- },
-
- any: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var result = false;
- this.each(function(value, index) {
- if (result = !!iterator.call(context, value, index))
- throw $break;
- });
- return result;
- },
-
- collect: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var results = [];
- this.each(function(value, index) {
- results.push(iterator.call(context, value, index));
- });
- return results;
- },
-
- detect: function(iterator, context) {
- var result;
- this.each(function(value, index) {
- if (iterator.call(context, value, index)) {
- result = value;
- throw $break;
- }
- });
- return result;
- },
-
- findAll: function(iterator, context) {
- var results = [];
- this.each(function(value, index) {
- if (iterator.call(context, value, index))
- results.push(value);
- });
- return results;
- },
-
- grep: function(filter, iterator, context) {
- iterator = iterator || Prototype.K;
- var results = [];
-
- if (Object.isString(filter))
- filter = new RegExp(filter);
-
- this.each(function(value, index) {
- if (filter.match(value))
- results.push(iterator.call(context, value, index));
- });
- return results;
- },
-
- include: function(object) {
- if (Object.isFunction(this.indexOf))
- if (this.indexOf(object) != -1) return true;
-
- var found = false;
- this.each(function(value) {
- if (value == object) {
- found = true;
- throw $break;
- }
- });
- return found;
- },
-
- inGroupsOf: function(number, fillWith) {
- fillWith = Object.isUndefined(fillWith) ? null : fillWith;
- return this.eachSlice(number, function(slice) {
- while(slice.length < number) slice.push(fillWith);
- return slice;
- });
- },
-
- inject: function(memo, iterator, context) {
- this.each(function(value, index) {
- memo = iterator.call(context, memo, value, index);
- });
- return memo;
- },
-
- invoke: function(method) {
- var args = $A(arguments).slice(1);
- return this.map(function(value) {
- return value[method].apply(value, args);
- });
- },
-
- max: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var result;
- this.each(function(value, index) {
- value = iterator.call(context, value, index);
- if (result == null || value >= result)
- result = value;
- });
- return result;
- },
-
- min: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var result;
- this.each(function(value, index) {
- value = iterator.call(context, value, index);
- if (result == null || value < result)
- result = value;
- });
- return result;
- },
-
- partition: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var trues = [], falses = [];
- this.each(function(value, index) {
- (iterator.call(context, value, index) ?
- trues : falses).push(value);
- });
- return [trues, falses];
- },
-
- pluck: function(property) {
- var results = [];
- this.each(function(value) {
- results.push(value[property]);
- });
- return results;
- },
-
- reject: function(iterator, context) {
- var results = [];
- this.each(function(value, index) {
- if (!iterator.call(context, value, index))
- results.push(value);
- });
- return results;
- },
-
- sortBy: function(iterator, context) {
- return this.map(function(value, index) {
- return {
- value: value,
- criteria: iterator.call(context, value, index)
- };
- }).sort(function(left, right) {
- var a = left.criteria, b = right.criteria;
- return a < b ? -1 : a > b ? 1 : 0;
- }).pluck('value');
- },
-
- toArray: function() {
- return this.map();
- },
-
- zip: function() {
- var iterator = Prototype.K, args = $A(arguments);
- if (Object.isFunction(args.last()))
- iterator = args.pop();
-
- var collections = [this].concat(args).map($A);
- return this.map(function(value, index) {
- return iterator(collections.pluck(index));
- });
- },
-
- size: function() {
- return this.toArray().length;
- },
-
- inspect: function() {
- return '#<Enumerable:' + this.toArray().inspect() + '>';
- }
-};
-
-Object.extend(Enumerable, {
- map: Enumerable.collect,
- find: Enumerable.detect,
- select: Enumerable.findAll,
- filter: Enumerable.findAll,
- member: Enumerable.include,
- entries: Enumerable.toArray,
- every: Enumerable.all,
- some: Enumerable.any
-});
-function $A(iterable) {
- if (!iterable) return [];
- if (iterable.toArray) return iterable.toArray();
- var length = iterable.length || 0, results = new Array(length);
- while (length--) results[length] = iterable[length];
- return results;
-}
-
-if (Prototype.Browser.WebKit) {
- $A = function(iterable) {
- if (!iterable) return [];
- // In Safari, only use the `toArray` method if it's not a NodeList.
- // A NodeList is a function, has an function `item` property, and a numeric
- // `length` property. Adapted from Google Doctype.
- if (!(typeof iterable === 'function' && typeof iterable.length ===
- 'number' && typeof iterable.item === 'function')
&& iterable.toArray)
- return iterable.toArray();
- var length = iterable.length || 0, results = new Array(length);
- while (length--) results[length] = iterable[length];
- return results;
- };
-}
-
-Array.from = $A;
-
-Object.extend(Array.prototype, Enumerable);
-
-if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
-
-Object.extend(Array.prototype, {
- _each: function(iterator) {
- for (var i = 0, length = this.length; i < length; i++)
- iterator(this[i]);
- },
-
- clear: function() {
- this.length = 0;
- return this;
- },
-
- first: function() {
- return this[0];
- },
-
- last: function() {
- return this[this.length - 1];
- },
-
- compact: function() {
- return this.select(function(value) {
- return value != null;
- });
- },
-
- flatten: function() {
- return this.inject([], function(array, value) {
- return array.concat(Object.isArray(value) ?
- value.flatten() : [value]);
- });
- },
-
- without: function() {
- var values = $A(arguments);
- return this.select(function(value) {
- return !values.include(value);
- });
- },
-
- reverse: function(inline) {
- return (inline !== false ? this : this.toArray())._reverse();
- },
-
- reduce: function() {
- return this.length > 1 ? this : this[0];
- },
-
- uniq: function(sorted) {
- return this.inject([], function(array, value, index) {
- if (0 == index || (sorted ? array.last() != value : !array.include(value)))
- array.push(value);
- return array;
- });
- },
-
- intersect: function(array) {
- return this.uniq().findAll(function(item) {
- return array.detect(function(value) { return item === value });
- });
- },
-
- clone: function() {
- return [].concat(this);
- },
-
- size: function() {
- return this.length;
- },
-
- inspect: function() {
- return '[' + this.map(Object.inspect).join(', ') + ']';
- },
-
- toJSON: function() {
- var results = [];
- this.each(function(object) {
- var value = Object.toJSON(object);
- if (!Object.isUndefined(value)) results.push(value);
- });
- return '[' + results.join(', ') + ']';
- }
-});
-
-// use native browser JS 1.6 implementation if available
-if (Object.isFunction(Array.prototype.forEach))
- Array.prototype._each = Array.prototype.forEach;
-
-if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
- i || (i = 0);
- var length = this.length;
- if (i < 0) i = length + i;
- for (; i < length; i++)
- if (this[i] === item) return i;
- return -1;
-};
-
-if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
- i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
- var n = this.slice(0, i).reverse().indexOf(item);
- return (n < 0) ? n : i - n - 1;
-};
-
-Array.prototype.toArray = Array.prototype.clone;
-
-function $w(string) {
- if (!Object.isString(string)) return [];
- string = string.strip();
- return string ? string.split(/\s+/) : [];
-}
-
-if (Prototype.Browser.Opera){
- Array.prototype.concat = function() {
- var array = [];
- for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
- for (var i = 0, length = arguments.length; i < length; i++) {
- if (Object.isArray(arguments[i])) {
- for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
- array.push(arguments[i][j]);
- } else {
- array.push(arguments[i]);
- }
- }
- return array;
- };
-}
-Object.extend(Number.prototype, {
- toColorPart: function() {
- return this.toPaddedString(2, 16);
- },
-
- succ: function() {
- return this + 1;
- },
-
- times: function(iterator, context) {
- $R(0, this, true).each(iterator, context);
- return this;
- },
-
- toPaddedString: function(length, radix) {
- var string = this.toString(radix || 10);
- return '0'.times(length - string.length) + string;
- },
-
- toJSON: function() {
- return isFinite(this) ? this.toString() : 'null';
- }
-});
-
-$w('abs round ceil floor').each(function(method){
- Number.prototype[method] = Math[method].methodize();
-});
-function $H(object) {
- return new Hash(object);
-};
-
-var Hash = Class.create(Enumerable, (function() {
-
- function toQueryPair(key, value) {
- if (Object.isUndefined(value)) return key;
- return key + '=' + encodeURIComponent(String.interpret(value));
- }
-
- return {
- initialize: function(object) {
- this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
- },
-
- _each: function(iterator) {
- for (var key in this._object) {
- var value = this._object[key], pair = [key, value];
- pair.key = key;
- pair.value = value;
- iterator(pair);
- }
- },
-
- set: function(key, value) {
- return this._object[key] = value;
- },
-
- get: function(key) {
- // simulating poorly supported hasOwnProperty
- if (this._object[key] !== Object.prototype[key])
- return this._object[key];
- },
-
- unset: function(key) {
- var value = this._object[key];
- delete this._object[key];
- return value;
- },
-
- toObject: function() {
- return Object.clone(this._object);
- },
-
- keys: function() {
- return this.pluck('key');
- },
-
- values: function() {
- return this.pluck('value');
- },
-
- index: function(value) {
- var match = this.detect(function(pair) {
- return pair.value === value;
- });
- return match && match.key;
- },
-
- merge: function(object) {
- return this.clone().update(object);
- },
-
- update: function(object) {
- return new Hash(object).inject(this, function(result, pair) {
- result.set(pair.key, pair.value);
- return result;
- });
- },
-
- toQueryString: function() {
- return this.inject([], function(results, pair) {
- var key = encodeURIComponent(pair.key), values = pair.value;
-
- if (values && typeof values == 'object') {
- if (Object.isArray(values))
- return results.concat(values.map(toQueryPair.curry(key)));
- } else results.push(toQueryPair(key, values));
- return results;
- }).join('&');
- },
-
- inspect: function() {
- return '#<Hash:{' + this.map(function(pair) {
- return pair.map(Object.inspect).join(': ');
- }).join(', ') + '}>';
- },
-
- toJSON: function() {
- return Object.toJSON(this.toObject());
- },
-
- clone: function() {
- return new Hash(this);
- }
- }
-})());
-
-Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
-Hash.from = $H;
-var ObjectRange = Class.create(Enumerable, {
- initialize: function(start, end, exclusive) {
- this.start = start;
- this.end = end;
- this.exclusive = exclusive;
- },
-
- _each: function(iterator) {
- var value = this.start;
- while (this.include(value)) {
- iterator(value);
- value = value.succ();
- }
- },
-
- include: function(value) {
- if (value < this.start)
- return false;
- if (this.exclusive)
- return value < this.end;
- return value <= this.end;
- }
-});
-
-var $R = function(start, end, exclusive) {
- return new ObjectRange(start, end, exclusive);
-};
-
-var Ajax = {
- getTransport: function() {
- return Try.these(
- function() {return new XMLHttpRequest()},
- function() {return new ActiveXObject('Msxml2.XMLHTTP')},
- function() {return new ActiveXObject('Microsoft.XMLHTTP')}
- ) || false;
- },
-
- activeRequestCount: 0
-};
-
-Ajax.Responders = {
- responders: [],
-
- _each: function(iterator) {
- this.responders._each(iterator);
- },
-
- register: function(responder) {
- if (!this.include(responder))
- this.responders.push(responder);
- },
-
- unregister: function(responder) {
- this.responders = this.responders.without(responder);
- },
-
- dispatch: function(callback, request, transport, json) {
- this.each(function(responder) {
- if (Object.isFunction(responder[callback])) {
- try {
- responder[callback].apply(responder, [request, transport, json]);
- } catch (e) { }
- }
- });
- }
-};
-
-Object.extend(Ajax.Responders, Enumerable);
-
-Ajax.Responders.register({
- onCreate: function() { Ajax.activeRequestCount++ },
- onComplete: function() { Ajax.activeRequestCount-- }
-});
-
-Ajax.Base = Class.create({
- initialize: function(options) {
- this.options = {
- method: 'post',
- asynchronous: true,
- contentType: 'application/x-www-form-urlencoded',
- encoding: 'UTF-8',
- parameters: '',
- evalJSON: true,
- evalJS: true
- };
- Object.extend(this.options, options || { });
-
- this.options.method = this.options.method.toLowerCase();
-
- if (Object.isString(this.options.parameters))
- this.options.parameters = this.options.parameters.toQueryParams();
- else if (Object.isHash(this.options.parameters))
- this.options.parameters = this.options.parameters.toObject();
- }
-});
-
-Ajax.Request = Class.create(Ajax.Base, {
- _complete: false,
-
- initialize: function($super, url, options) {
- $super(options);
- this.transport = Ajax.getTransport();
- this.request(url);
- },
-
- request: function(url) {
- this.url = url;
- this.method = this.options.method;
- var params = Object.clone(this.options.parameters);
-
- if (!['get', 'post'].include(this.method)) {
- // simulate other verbs over post
- params['_method'] = this.method;
- this.method = 'post';
- }
-
- this.parameters = params;
-
- if (params = Object.toQueryString(params)) {
- // when GET, append parameters to URL
- if (this.method == 'get')
- this.url += (this.url.include('?') ? '&' : '?') +
params;
- else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
- params += '&_=';
- }
-
- try {
- var response = new Ajax.Response(this);
- if (this.options.onCreate) this.options.onCreate(response);
- Ajax.Responders.dispatch('onCreate', this, response);
-
- this.transport.open(this.method.toUpperCase(), this.url,
- this.options.asynchronous);
-
- if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
-
- this.transport.onreadystatechange = this.onStateChange.bind(this);
- this.setRequestHeaders();
-
- this.body = this.method == 'post' ? (this.options.postBody || params) :
null;
- this.transport.send(this.body);
-
- /* Force Firefox to handle ready state 4 for synchronous requests */
- if (!this.options.asynchronous && this.transport.overrideMimeType)
- this.onStateChange();
-
- }
- catch (e) {
- this.dispatchException(e);
- }
- },
-
- onStateChange: function() {
- var readyState = this.transport.readyState;
- if (readyState > 1 && !((readyState == 4) && this._complete))
- this.respondToReadyState(this.transport.readyState);
- },
-
- setRequestHeaders: function() {
- var headers = {
- 'X-Requested-With': 'XMLHttpRequest',
- 'X-Prototype-Version': Prototype.Version,
- 'Accept': 'text/javascript, text/html, application/xml, text/xml,
*/*'
- };
-
- if (this.method == 'post') {
- headers['Content-type'] = this.options.contentType +
- (this.options.encoding ? '; charset=' + this.options.encoding :
'');
-
- /* Force "Connection: close" for older Mozilla browsers to work
- * around a bug where XMLHttpRequest sends an incorrect
- * Content-length header. See Mozilla Bugzilla #246651.
- */
- if (this.transport.overrideMimeType &&
- (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
- headers['Connection'] = 'close';
- }
-
- // user-defined headers
- if (typeof this.options.requestHeaders == 'object') {
- var extras = this.options.requestHeaders;
-
- if (Object.isFunction(extras.push))
- for (var i = 0, length = extras.length; i < length; i += 2)
- headers[extras[i]] = extras[i+1];
- else
- $H(extras).each(function(pair) { headers[pair.key] = pair.value });
- }
-
- for (var name in headers)
- this.transport.setRequestHeader(name, headers[name]);
- },
-
- success: function() {
- var status = this.getStatus();
- return !status || (status >= 200 && status < 300);
- },
-
- getStatus: function() {
- try {
- return this.transport.status || 0;
- } catch (e) { return 0 }
- },
-
- respondToReadyState: function(readyState) {
- var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
-
- if (state == 'Complete') {
- try {
- this._complete = true;
- (this.options['on' + response.status]
- || this.options['on' + (this.success() ? 'Success' :
'Failure')]
- || Prototype.emptyFunction)(response, response.headerJSON);
- } catch (e) {
- this.dispatchException(e);
- }
-
- var contentType = response.getHeader('Content-type');
- if (this.options.evalJS == 'force'
- || (this.options.evalJS && this.isSameOrigin() && contentType
- &&
contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
- this.evalResponse();
- }
-
- try {
- (this.options['on' + state] || Prototype.emptyFunction)(response,
response.headerJSON);
- Ajax.Responders.dispatch('on' + state, this, response,
response.headerJSON);
- } catch (e) {
- this.dispatchException(e);
- }
-
- if (state == 'Complete') {
- // avoid memory leak in MSIE: clean up
- this.transport.onreadystatechange = Prototype.emptyFunction;
- }
- },
-
- isSameOrigin: function() {
- var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
- return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
- protocol: location.protocol,
- domain: document.domain,
- port: location.port ? ':' + location.port : ''
- }));
- },
-
- getHeader: function(name) {
- try {
- return this.transport.getResponseHeader(name) || null;
- } catch (e) { return null }
- },
-
- evalResponse: function() {
- try {
- return eval((this.transport.responseText || '').unfilterJSON());
- } catch (e) {
- this.dispatchException(e);
- }
- },
-
- dispatchException: function(exception) {
- (this.options.onException || Prototype.emptyFunction)(this, exception);
- Ajax.Responders.dispatch('onException', this, exception);
- }
-});
-
-Ajax.Request.Events =
- ['Uninitialized', 'Loading', 'Loaded', 'Interactive',
'Complete'];
-
-Ajax.Response = Class.create({
- initialize: function(request){
- this.request = request;
- var transport = this.transport = request.transport,
- readyState = this.readyState = transport.readyState;
-
- if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
- this.status = this.getStatus();
- this.statusText = this.getStatusText();
- this.responseText = String.interpret(transport.responseText);
- this.headerJSON = this._getHeaderJSON();
- }
-
- if(readyState == 4) {
- var xml = transport.responseXML;
- this.responseXML = Object.isUndefined(xml) ? null : xml;
- this.responseJSON = this._getResponseJSON();
- }
- },
-
- status: 0,
- statusText: '',
-
- getStatus: Ajax.Request.prototype.getStatus,
-
- getStatusText: function() {
- try {
- return this.transport.statusText || '';
- } catch (e) { return '' }
- },
-
- getHeader: Ajax.Request.prototype.getHeader,
-
- getAllHeaders: function() {
- try {
- return this.getAllResponseHeaders();
- } catch (e) { return null }
- },
-
- getResponseHeader: function(name) {
- return this.transport.getResponseHeader(name);
- },
-
- getAllResponseHeaders: function() {
- return this.transport.getAllResponseHeaders();
- },
-
- _getHeaderJSON: function() {
- var json = this.getHeader('X-JSON');
- if (!json) return null;
- json = decodeURIComponent(escape(json));
- try {
- return json.evalJSON(this.request.options.sanitizeJSON ||
- !this.request.isSameOrigin());
- } catch (e) {
- this.request.dispatchException(e);
- }
- },
-
- _getResponseJSON: function() {
- var options = this.request.options;
- if (!options.evalJSON || (options.evalJSON != 'force' &&
- !(this.getHeader('Content-type') ||
'').include('application/json')) ||
- this.responseText.blank())
- return null;
- try {
- return this.responseText.evalJSON(options.sanitizeJSON ||
- !this.request.isSameOrigin());
- } catch (e) {
- this.request.dispatchException(e);
- }
- }
-});
-
-Ajax.Updater = Class.create(Ajax.Request, {
- initialize: function($super, container, url, options) {
- this.container = {
- success: (container.success || container),
- failure: (container.failure || (container.success ? null : container))
- };
-
- options = Object.clone(options);
- var onComplete = options.onComplete;
- options.onComplete = (function(response, json) {
- this.updateContent(response.responseText);
- if (Object.isFunction(onComplete)) onComplete(response, json);
- }).bind(this);
-
- $super(url, options);
- },
-
- updateContent: function(responseText) {
- var receiver = this.container[this.success() ? 'success' :
'failure'],
- options = this.options;
-
- if (!options.evalScripts) responseText = responseText.stripScripts();
-
- if (receiver = $(receiver)) {
- if (options.insertion) {
- if (Object.isString(options.insertion)) {
- var insertion = { }; insertion[options.insertion] = responseText;
- receiver.insert(insertion);
- }
- else options.insertion(receiver, responseText);
- }
- else receiver.update(responseText);
- }
- }
-});
-
-Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
- initialize: function($super, container, url, options) {
- $super(options);
- this.onComplete = this.options.onComplete;
-
- this.frequency = (this.options.frequency || 2);
- this.decay = (this.options.decay || 1);
-
- this.updater = { };
- this.container = container;
- this.url = url;
-
- this.start();
- },
-
- start: function() {
- this.options.onComplete = this.updateComplete.bind(this);
- this.onTimerEvent();
- },
-
- stop: function() {
- this.updater.options.onComplete = undefined;
- clearTimeout(this.timer);
- (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
- },
-
- updateComplete: function(response) {
- if (this.options.decay) {
- this.decay = (response.responseText == this.lastText ?
- this.decay * this.options.decay : 1);
-
- this.lastText = response.responseText;
- }
- this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
- },
-
- onTimerEvent: function() {
- this.updater = new Ajax.Updater(this.container, this.url, this.options);
- }
-});
-function $(element) {
- if (arguments.length > 1) {
- for (var i = 0, elements = [], length = arguments.length; i < length; i++)
- elements.push($(arguments[i]));
- return elements;
- }
- if (Object.isString(element))
- element = document.getElementById(element);
- return Element.extend(element);
-}
-
-if (Prototype.BrowserFeatures.XPath) {
- document._getElementsByXPath = function(expression, parentElement) {
- var results = [];
- var query = document.evaluate(expression, $(parentElement) || document,
- null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for (var i = 0, length = query.snapshotLength; i < length; i++)
- results.push(Element.extend(query.snapshotItem(i)));
- return results;
- };
-}
-
-/*--------------------------------------------------------------------------*/
-
-if (!window.Node) var Node = { };
-
-if (!Node.ELEMENT_NODE) {
- // DOM level 2 ECMAScript Language Binding
- Object.extend(Node, {
- ELEMENT_NODE: 1,
- ATTRIBUTE_NODE: 2,
- TEXT_NODE: 3,
- CDATA_SECTION_NODE: 4,
- ENTITY_REFERENCE_NODE: 5,
- ENTITY_NODE: 6,
- PROCESSING_INSTRUCTION_NODE: 7,
- COMMENT_NODE: 8,
- DOCUMENT_NODE: 9,
- DOCUMENT_TYPE_NODE: 10,
- DOCUMENT_FRAGMENT_NODE: 11,
- NOTATION_NODE: 12
- });
-}
-
-(function() {
- var element = this.Element;
- this.Element = function(tagName, attributes) {
- attributes = attributes || { };
- tagName = tagName.toLowerCase();
- var cache = Element.cache;
- if (Prototype.Browser.IE && attributes.name) {
- tagName = '<' + tagName + ' name="' + attributes.name +
'">';
- delete attributes.name;
- return Element.writeAttribute(document.createElement(tagName), attributes);
- }
- if (!cache[tagName]) cache[tagName] =
Element.extend(document.createElement(tagName));
- return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
- };
- Object.extend(this.Element, element || { });
- if (element) this.Element.prototype = element.prototype;
-}).call(window);
-
-Element.cache = { };
-
-Element.Methods = {
- visible: function(element) {
- return $(element).style.display != 'none';
- },
-
- toggle: function(element) {
- element = $(element);
- Element[Element.visible(element) ? 'hide' : 'show'](element);
- return element;
- },
-
- hide: function(element) {
- element = $(element);
- element.style.display = 'none';
- return element;
- },
-
- show: function(element) {
- element = $(element);
- element.style.display = '';
- return element;
- },
-
- remove: function(element) {
- element = $(element);
- element.parentNode.removeChild(element);
- return element;
- },
-
- update: function(element, content) {
- element = $(element);
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) return element.update().insert(content);
- content = Object.toHTML(content);
- element.innerHTML = content.stripScripts();
- content.evalScripts.bind(content).defer();
- return element;
- },
-
- replace: function(element, content) {
- element = $(element);
- if (content && content.toElement) content = content.toElement();
- else if (!Object.isElement(content)) {
- content = Object.toHTML(content);
- var range = element.ownerDocument.createRange();
- range.selectNode(element);
- content.evalScripts.bind(content).defer();
- content = range.createContextualFragment(content.stripScripts());
- }
- element.parentNode.replaceChild(content, element);
- return element;
- },
-
- insert: function(element, insertions) {
- element = $(element);
-
- if (Object.isString(insertions) || Object.isNumber(insertions) ||
- Object.isElement(insertions) || (insertions && (insertions.toElement ||
insertions.toHTML)))
- insertions = {bottom:insertions};
-
- var content, insert, tagName, childNodes;
-
- for (var position in insertions) {
- content = insertions[position];
- position = position.toLowerCase();
- insert = Element._insertionTranslations[position];
-
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) {
- insert(element, content);
- continue;
- }
-
- content = Object.toHTML(content);
-
- tagName = ((position == 'before' || position == 'after')
- ? element.parentNode : element).tagName.toUpperCase();
-
- childNodes = Element._getContentFromAnonymousElement(tagName,
content.stripScripts());
-
- if (position == 'top' || position == 'after')
childNodes.reverse();
- childNodes.each(insert.curry(element));
-
- content.evalScripts.bind(content).defer();
- }
-
- return element;
- },
-
- wrap: function(element, wrapper, attributes) {
- element = $(element);
- if (Object.isElement(wrapper))
- $(wrapper).writeAttribute(attributes || { });
- else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
- else wrapper = new Element('div', wrapper);
- if (element.parentNode)
- element.parentNode.replaceChild(wrapper, element);
- wrapper.appendChild(element);
- return wrapper;
- },
-
- inspect: function(element) {
- element = $(element);
- var result = '<' + element.tagName.toLowerCase();
- $H({'id': 'id', 'className':
'class'}).each(function(pair) {
- var property = pair.first(), attribute = pair.last();
- var value = (element[property] || '').toString();
- if (value) result += ' ' + attribute + '=' + value.inspect(true);
- });
- return result + '>';
- },
-
- recursivelyCollect: function(element, property) {
- element = $(element);
- var elements = [];
- while (element = element[property])
- if (element.nodeType == 1)
- elements.push(Element.extend(element));
- return elements;
- },
-
- ancestors: function(element) {
- return $(element).recursivelyCollect('parentNode');
- },
-
- descendants: function(element) {
- return $(element).select("*");
- },
-
- firstDescendant: function(element) {
- element = $(element).firstChild;
- while (element && element.nodeType != 1) element = element.nextSibling;
- return $(element);
- },
-
- immediateDescendants: function(element) {
- if (!(element = $(element).firstChild)) return [];
- while (element && element.nodeType != 1) element = element.nextSibling;
- if (element) return [element].concat($(element).nextSiblings());
- return [];
- },
-
- previousSiblings: function(element) {
- return $(element).recursivelyCollect('previousSibling');
- },
-
- nextSiblings: function(element) {
- return $(element).recursivelyCollect('nextSibling');
- },
-
- siblings: function(element) {
- element = $(element);
- return element.previousSiblings().reverse().concat(element.nextSiblings());
- },
-
- match: function(element, selector) {
- if (Object.isString(selector))
- selector = new Selector(selector);
- return selector.match($(element));
- },
-
- up: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return $(element.parentNode);
- var ancestors = element.ancestors();
- return Object.isNumber(expression) ? ancestors[expression] :
- Selector.findElement(ancestors, expression, index);
- },
-
- down: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return element.firstDescendant();
- return Object.isNumber(expression) ? element.descendants()[expression] :
- Element.select(element, expression)[index || 0];
- },
-
- previous: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return
$(Selector.handlers.previousElementSibling(element));
- var previousSiblings = element.previousSiblings();
- return Object.isNumber(expression) ? previousSiblings[expression] :
- Selector.findElement(previousSiblings, expression, index);
- },
-
- next: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
- var nextSiblings = element.nextSiblings();
- return Object.isNumber(expression) ? nextSiblings[expression] :
- Selector.findElement(nextSiblings, expression, index);
- },
-
- select: function() {
- var args = $A(arguments), element = $(args.shift());
- return Selector.findChildElements(element, args);
- },
-
- adjacent: function() {
- var args = $A(arguments), element = $(args.shift());
- return Selector.findChildElements(element.parentNode, args).without(element);
- },
-
- identify: function(element) {
- element = $(element);
- var id = element.readAttribute('id'), self = arguments.callee;
- if (id) return id;
- do { id = 'anonymous_element_' + self.counter++ } while ($(id));
- element.writeAttribute('id', id);
- return id;
- },
-
- readAttribute: function(element, name) {
- element = $(element);
- if (Prototype.Browser.IE) {
- var t = Element._attributeTranslations.read;
- if (t.values[name]) return t.values[name](element, name);
- if (t.names[name]) name = t.names[name];
- if (name.include(':')) {
- return (!element.attributes || !element.attributes[name]) ? null :
- element.attributes[name].value;
- }
- }
- return element.getAttribute(name);
- },
-
- writeAttribute: function(element, name, value) {
- element = $(element);
- var attributes = { }, t = Element._attributeTranslations.write;
-
- if (typeof name == 'object') attributes = name;
- else attributes[name] = Object.isUndefined(value) ? true : value;
-
- for (var attr in attributes) {
- name = t.names[attr] || attr;
- value = attributes[attr];
- if (t.values[attr]) name = t.values[attr](element, value);
- if (value === false || value === null)
- element.removeAttribute(name);
- else if (value === true)
- element.setAttribute(name, name);
- else element.setAttribute(name, value);
- }
- return element;
- },
-
- getHeight: function(element) {
- return $(element).getDimensions().height;
- },
-
- getWidth: function(element) {
- return $(element).getDimensions().width;
- },
-
- classNames: function(element) {
- return new Element.ClassNames(element);
- },
-
- hasClassName: function(element, className) {
- if (!(element = $(element))) return;
- var elementClassName = element.className;
- return (elementClassName.length > 0 && (elementClassName == className ||
- new RegExp("(^|\\s)" + className +
"(\\s|$)").test(elementClassName)));
- },
-
- addClassName: function(element, className) {
- if (!(element = $(element))) return;
- if (!element.hasClassName(className))
- element.className += (element.className ? ' ' : '') + className;
- return element;
- },
-
- removeClassName: function(element, className) {
- if (!(element = $(element))) return;
- element.className = element.className.replace(
- new RegExp("(^|\\s+)" + className + "(\\s+|$)"), '
').strip();
- return element;
- },
-
- toggleClassName: function(element, className) {
- if (!(element = $(element))) return;
- return element[element.hasClassName(className) ?
- 'removeClassName' : 'addClassName'](className);
- },
-
- // removes whitespace-only text node children
- cleanWhitespace: function(element) {
- element = $(element);
- var node = element.firstChild;
- while (node) {
- var nextNode = node.nextSibling;
- if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
- element.removeChild(node);
- node = nextNode;
- }
- return element;
- },
-
- empty: function(element) {
- return $(element).innerHTML.blank();
- },
-
- descendantOf: function(element, ancestor) {
- element = $(element), ancestor = $(ancestor);
-
- if (element.compareDocumentPosition)
- return (element.compareDocumentPosition(ancestor) & 8) === 8;
-
- if (ancestor.contains)
- return ancestor.contains(element) && ancestor !== element;
-
- while (element = element.parentNode)
- if (element == ancestor) return true;
-
- return false;
- },
-
- scrollTo: function(element) {
- element = $(element);
- var pos = element.cumulativeOffset();
- window.scrollTo(pos[0], pos[1]);
- return element;
- },
-
- getStyle: function(element, style) {
- element = $(element);
- style = style == 'float' ? 'cssFloat' : style.camelize();
- var value = element.style[style];
- if (!value || value == 'auto') {
- var css = document.defaultView.getComputedStyle(element, null);
- value = css ? css[style] : null;
- }
- if (style == 'opacity') return value ? parseFloat(value) : 1.0;
- return value == 'auto' ? null : value;
- },
-
- getOpacity: function(element) {
- return $(element).getStyle('opacity');
- },
-
- setStyle: function(element, styles) {
- element = $(element);
- var elementStyle = element.style, match;
- if (Object.isString(styles)) {
- element.style.cssText += ';' + styles;
- return styles.include('opacity') ?
- element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
- }
- for (var property in styles)
- if (property == 'opacity') element.setOpacity(styles[property]);
- else
- elementStyle[(property == 'float' || property == 'cssFloat') ?
- (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' :
'styleFloat') :
- property] = styles[property];
-
- return element;
- },
-
- setOpacity: function(element, value) {
- element = $(element);
- element.style.opacity = (value == 1 || value === '') ? '' :
- (value < 0.00001) ? 0 : value;
- return element;
- },
-
- getDimensions: function(element) {
- element = $(element);
- var display = element.getStyle('display');
- if (display != 'none' && display != null) // Safari bug
- return {width: element.offsetWidth, height: element.offsetHeight};
-
- // All *Width and *Height properties give 0 on elements with display none,
- // so enable the element temporarily
- var els = element.style;
- var originalVisibility = els.visibility;
- var originalPosition = els.position;
- var originalDisplay = els.display;
- els.visibility = 'hidden';
- els.position = 'absolute';
- els.display = 'block';
- var originalWidth = element.clientWidth;
- var originalHeight = element.clientHeight;
- els.display = originalDisplay;
- els.position = originalPosition;
- els.visibility = originalVisibility;
- return {width: originalWidth, height: originalHeight};
- },
-
- makePositioned: function(element) {
- element = $(element);
- var pos = Element.getStyle(element, 'position');
- if (pos == 'static' || !pos) {
- element._madePositioned = true;
- element.style.position = 'relative';
- // Opera returns the offset relative to the positioning context, when an
- // element is position relative but top and left have not been defined
- if (Prototype.Browser.Opera) {
- element.style.top = 0;
- element.style.left = 0;
- }
- }
- return element;
- },
-
- undoPositioned: function(element) {
- element = $(element);
- if (element._madePositioned) {
- element._madePositioned = undefined;
- element.style.position =
- element.style.top =
- element.style.left =
- element.style.bottom =
- element.style.right = '';
- }
- return element;
- },
-
- makeClipping: function(element) {
- element = $(element);
- if (element._overflow) return element;
- element._overflow = Element.getStyle(element, 'overflow') || 'auto';
- if (element._overflow !== 'hidden')
- element.style.overflow = 'hidden';
- return element;
- },
-
- undoClipping: function(element) {
- element = $(element);
- if (!element._overflow) return element;
- element.style.overflow = element._overflow == 'auto' ? '' :
element._overflow;
- element._overflow = null;
- return element;
- },
-
- cumulativeOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- } while (element);
- return Element._returnOffset(valueL, valueT);
- },
-
- positionedOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- if (element) {
- if (element.tagName.toUpperCase() == 'BODY') break;
- var p = Element.getStyle(element, 'position');
- if (p !== 'static') break;
- }
- } while (element);
- return Element._returnOffset(valueL, valueT);
- },
-
- absolutize: function(element) {
- element = $(element);
- if (element.getStyle('position') == 'absolute') return element;
- // Position.prepare(); // To be done manually by Scripty when it needs it.
-
- var offsets = element.positionedOffset();
- var top = offsets[1];
- var left = offsets[0];
- var width = element.clientWidth;
- var height = element.clientHeight;
-
- element._originalLeft = left - parseFloat(element.style.left || 0);
- element._originalTop = top - parseFloat(element.style.top || 0);
- element._originalWidth = element.style.width;
- element._originalHeight = element.style.height;
-
- element.style.position = 'absolute';
- element.style.top = top + 'px';
- element.style.left = left + 'px';
- element.style.width = width + 'px';
- element.style.height = height + 'px';
- return element;
- },
-
- relativize: function(element) {
- element = $(element);
- if (element.getStyle('position') == 'relative') return element;
- // Position.prepare(); // To be done manually by Scripty when it needs it.
-
- element.style.position = 'relative';
- var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
- var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
-
- element.style.top = top + 'px';
- element.style.left = left + 'px';
- element.style.height = element._originalHeight;
- element.style.width = element._originalWidth;
- return element;
- },
-
- cumulativeScrollOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.scrollTop || 0;
- valueL += element.scrollLeft || 0;
- element = element.parentNode;
- } while (element);
- return Element._returnOffset(valueL, valueT);
- },
-
- getOffsetParent: function(element) {
- if (element.offsetParent) return $(element.offsetParent);
- if (element == document.body) return $(element);
-
- while ((element = element.parentNode) && element != document.body
- && Object.isElement(element)/* changed by Nick -
http://dev.rubyonrails.org/ticket/11007 */)
- if (Element.getStyle(element, 'position') != 'static')
- return $(element);
-
- return $(document.body);
- },
-
- viewportOffset: function(forElement) {
- var valueT = 0, valueL = 0;
-
- var element = forElement;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
-
- // Safari fix
- if (element.offsetParent == document.body &&
- Element.getStyle(element, 'position') == 'absolute') break;
-
- } while (element = element.offsetParent);
-
- element = forElement;
- do {
- if (!Prototype.Browser.Opera || (element.tagName &&
(element.tagName.toUpperCase() == 'BODY'))) {
- valueT -= element.scrollTop || 0;
- valueL -= element.scrollLeft || 0;
- }
- } while (element = element.parentNode);
-
- return Element._returnOffset(valueL, valueT);
- },
-
- clonePosition: function(element, source) {
- var options = Object.extend({
- setLeft: true,
- setTop: true,
- setWidth: true,
- setHeight: true,
- offsetTop: 0,
- offsetLeft: 0
- }, arguments[2] || { });
-
- // find page position of source
- source = $(source);
- var p = source.viewportOffset();
-
- // find coordinate system to use
- element = $(element);
- var delta = [0, 0];
- var parent = null;
- // delta [0,0] will do fine with position: fixed elements,
- // position:absolute needs offsetParent deltas
- if (Element.getStyle(element, 'position') == 'absolute') {
- parent = element.getOffsetParent();
- delta = parent.viewportOffset();
- }
-
- // correct by body offsets (fixes Safari)
- if (parent == document.body) {
- delta[0] -= document.body.offsetLeft;
- delta[1] -= document.body.offsetTop;
- }
-
- // set position
- if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) +
'px';
- if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) +
'px';
- if (options.setWidth) element.style.width = source.offsetWidth + 'px';
- if (options.setHeight) element.style.height = source.offsetHeight + 'px';
- return element;
- }
-};
-
-Element.Methods.identify.counter = 1;
-
-Object.extend(Element.Methods, {
- getElementsBySelector: Element.Methods.select,
- childElements: Element.Methods.immediateDescendants
-});
-
-Element._attributeTranslations = {
- write: {
- names: {
- className: 'class',
- htmlFor: 'for'
- },
- values: { }
- }
-};
-
-if (Prototype.Browser.Opera) {
- Element.Methods.getStyle = Element.Methods.getStyle.wrap(
- function(proceed, element, style) {
- switch (style) {
- case 'left': case 'top': case 'right': case
'bottom':
- if (proceed(element, 'position') === 'static') return null;
- case 'height': case 'width':
- // returns '0px' for hidden elements; we want it to return null
- if (!Element.visible(element)) return null;
-
- // returns the border-box dimensions rather than the content-box
- // dimensions, so we subtract padding and borders from the value
- var dim = parseInt(proceed(element, style), 10);
-
- if (dim !== element['offset' + style.capitalize()])
- return dim + 'px';
-
- var properties;
- if (style === 'height') {
- properties = ['border-top-width', 'padding-top',
- 'padding-bottom', 'border-bottom-width'];
- }
- else {
- properties = ['border-left-width', 'padding-left',
- 'padding-right', 'border-right-width'];
- }
- return properties.inject(dim, function(memo, property) {
- var val = proceed(element, property);
- return val === null ? memo : memo - parseInt(val, 10);
- }) + 'px';
- default: return proceed(element, style);
- }
- }
- );
-
- Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
- function(proceed, element, attribute) {
- if (attribute === 'title') return element.title;
- return proceed(element, attribute);
- }
- );
-}
-
-else if (Prototype.Browser.IE) {
- // IE doesn't report offsets correctly for static elements, so we change them
- // to "relative" to get the values, then change them back.
- Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
- function(proceed, element) {
- element = $(element);
- // IE throws an error if element is not in document
- try { element.offsetParent }
- catch(e) { return $(document.body) }
- var position = element.getStyle('position');
- if (position !== 'static') return proceed(element);
- element.setStyle({ position: 'relative' });
- var value = proceed(element);
- element.setStyle({ position: position });
- return value;
- }
- );
-
- $w('positionedOffset viewportOffset').each(function(method) {
- Element.Methods[method] = Element.Methods[method].wrap(
- function(proceed, element) {
- element = $(element);
- try { element.offsetParent }
- catch(e) { return Element._returnOffset(0,0) }
- var position = element.getStyle('position');
- if (position !== 'static') return proceed(element);
- // Trigger hasLayout on the offset parent so that IE6 reports
- // accurate offsetTop and offsetLeft values for position: fixed.
- var offsetParent = element.getOffsetParent();
- if (offsetParent && offsetParent.getStyle('position') ===
'fixed')
- offsetParent.setStyle({ zoom: 1 });
- element.setStyle({ position: 'relative' });
- var value = proceed(element);
- element.setStyle({ position: position });
- return value;
- }
- );
- });
-
- Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
- function(proceed, element) {
- try { element.offsetParent }
- catch(e) { return Element._returnOffset(0,0) }
- return proceed(element);
- }
- );
-
- Element.Methods.getStyle = function(element, style) {
- element = $(element);
- style = (style == 'float' || style == 'cssFloat') ?
'styleFloat' : style.camelize();
- var value = element.style[style];
- if (!value && element.currentStyle) value = element.currentStyle[style];
-
- if (style == 'opacity') {
- if (value = (element.getStyle('filter') ||
'').match(/alpha\(opacity=(.*)\)/))
- if (value[1]) return parseFloat(value[1]) / 100;
- return 1.0;
- }
-
- if (value == 'auto') {
- if ((style == 'width' || style == 'height') &&
(element.getStyle('display') != 'none'))
- return element['offset' + style.capitalize()] + 'px';
- return null;
- }
- return value;
- };
-
- Element.Methods.setOpacity = function(element, value) {
- function stripAlpha(filter){
- return filter.replace(/alpha\([^\)]*\)/gi,'');
- }
- element = $(element);
- var currentStyle = element.currentStyle;
- if ((currentStyle && !currentStyle.hasLayout) ||
- (!currentStyle && element.style.zoom == 'normal'))
- element.style.zoom = 1;
-
- var filter = element.getStyle('filter'), style = element.style;
- if (value == 1 || value === '') {
- (filter = stripAlpha(filter)) ?
- style.filter = filter : style.removeAttribute('filter');
- return element;
- } else if (value < 0.00001) value = 0;
- style.filter = stripAlpha(filter) +
- 'alpha(opacity=' + (value * 100) + ')';
- return element;
- };
-
- Element._attributeTranslations = {
- read: {
- names: {
- 'class': 'className',
- 'for': 'htmlFor'
- },
- values: {
- _getAttr: function(element, attribute) {
- return element.getAttribute(attribute, 2);
- },
- _getAttrNode: function(element, attribute) {
- var node = element.getAttributeNode(attribute);
- return node ? node.value : "";
- },
- _getEv: function(element, attribute) {
- attribute = element.getAttribute(attribute);
- return attribute ? attribute.toString().slice(23, -2) : null;
- },
- _flag: function(element, attribute) {
- return $(element).hasAttribute(attribute) ? attribute : null;
- },
- style: function(element) {
- return element.style.cssText.toLowerCase();
- },
- title: function(element) {
- return element.title;
- }
- }
- }
- };
-
- Element._attributeTranslations.write = {
- names: Object.extend({
- cellpadding: 'cellPadding',
- cellspacing: 'cellSpacing'
- }, Element._attributeTranslations.read.names),
- values: {
- checked: function(element, value) {
- element.checked = !!value;
- },
-
- style: function(element, value) {
- element.style.cssText = value ? value : '';
- }
- }
- };
-
- Element._attributeTranslations.has = {};
-
- $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
- 'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
- Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
- Element._attributeTranslations.has[attr.toLowerCase()] = attr;
- });
-
- (function(v) {
- Object.extend(v, {
- href: v._getAttr,
- src: v._getAttr,
- type: v._getAttr,
- action: v._getAttrNode,
- disabled: v._flag,
- checked: v._flag,
- readonly: v._flag,
- multiple: v._flag,
- onload: v._getEv,
- onunload: v._getEv,
- onclick: v._getEv,
- ondblclick: v._getEv,
- onmousedown: v._getEv,
- onmouseup: v._getEv,
- onmouseover: v._getEv,
- onmousemove: v._getEv,
- onmouseout: v._getEv,
- onfocus: v._getEv,
- onblur: v._getEv,
- onkeypress: v._getEv,
- onkeydown: v._getEv,
- onkeyup: v._getEv,
- onsubmit: v._getEv,
- onreset: v._getEv,
- onselect: v._getEv,
- onchange: v._getEv
- });
- })(Element._attributeTranslations.read.values);
-}
-
-else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
- Element.Methods.setOpacity = function(element, value) {
- element = $(element);
- element.style.opacity = (value == 1) ? 0.999999 :
- (value === '') ? '' : (value < 0.00001) ? 0 : value;
- return element;
- };
-}
-
-else if (Prototype.Browser.WebKit) {
- Element.Methods.setOpacity = function(element, value) {
- element = $(element);
- element.style.opacity = (value == 1 || value === '') ? '' :
- (value < 0.00001) ? 0 : value;
-
- if (value == 1)
- if(element.tagName.toUpperCase() == 'IMG' && element.width) {
- element.width++; element.width--;
- } else try {
- var n = document.createTextNode(' ');
- element.appendChild(n);
- element.removeChild(n);
- } catch (e) { }
-
- return element;
- };
-
- // Safari returns margins on body which is incorrect if the child is absolutely
- // positioned. For performance reasons, redefine Element#cumulativeOffset for
- // KHTML/WebKit only.
- Element.Methods.cumulativeOffset = function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- if (element.offsetParent == document.body)
- if (Element.getStyle(element, 'position') == 'absolute') break;
-
- element = element.offsetParent;
- } while (element);
-
- return Element._returnOffset(valueL, valueT);
- };
-}
-
-if (Prototype.Browser.IE || Prototype.Browser.Opera) {
- // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
- Element.Methods.update = function(element, content) {
- element = $(element);
-
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) return element.update().insert(content);
-
- content = Object.toHTML(content);
- var tagName = element.tagName.toUpperCase();
-
- if (tagName in Element._insertionTranslations.tags) {
- $A(element.childNodes).each(function(node) { element.removeChild(node) });
- Element._getContentFromAnonymousElement(tagName, content.stripScripts())
- .each(function(node) { element.appendChild(node) });
- }
- else element.innerHTML = content.stripScripts();
-
- content.evalScripts.bind(content).defer();
- return element;
- };
-}
-
-if ('outerHTML' in document.createElement('div')) {
- Element.Methods.replace = function(element, content) {
- element = $(element);
-
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) {
- element.parentNode.replaceChild(content, element);
- return element;
- }
-
- content = Object.toHTML(content);
- var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
-
- if (Element._insertionTranslations.tags[tagName]) {
- var nextSibling = element.next();
- var fragments = Element._getContentFromAnonymousElement(tagName,
content.stripScripts());
- parent.removeChild(element);
- if (nextSibling)
- fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
- else
- fragments.each(function(node) { parent.appendChild(node) });
- }
- else element.outerHTML = content.stripScripts();
-
- content.evalScripts.bind(content).defer();
- return element;
- };
-}
-
-Element._returnOffset = function(l, t) {
- var result = [l, t];
- result.left = l;
- result.top = t;
- return result;
-};
-
-Element._getContentFromAnonymousElement = function(tagName, html) {
- var div = new Element('div'), t =
Element._insertionTranslations.tags[tagName];
- if (t) {
- div.innerHTML = t[0] + html + t[1];
- t[2].times(function() { div = div.firstChild });
- } else div.innerHTML = html;
- return $A(div.childNodes);
-};
-
-Element._insertionTranslations = {
- before: function(element, node) {
- element.parentNode.insertBefore(node, element);
- },
- top: function(element, node) {
- element.insertBefore(node, element.firstChild);
- },
- bottom: function(element, node) {
- element.appendChild(node);
- },
- after: function(element, node) {
- element.parentNode.insertBefore(node, element.nextSibling);
- },
- tags: {
- TABLE: ['<table>', '</table>',
1],
- TBODY: ['<table><tbody>',
'</tbody></table>', 2],
- TR: ['<table><tbody><tr>',
'</tr></tbody></table>', 3],
- TD: ['<table><tbody><tr><td>',
'</td></tr></tbody></table>', 4],
- SELECT: ['<select>', '</select>',
1]
- }
-};
-
-(function() {
- Object.extend(this.tags, {
- THEAD: this.tags.TBODY,
- TFOOT: this.tags.TBODY,
- TH: this.tags.TD
- });
-}).call(Element._insertionTranslations);
-
-Element.Methods.Simulated = {
- hasAttribute: function(element, attribute) {
- attribute = Element._attributeTranslations.has[attribute] || attribute;
- var node = $(element).getAttributeNode(attribute);
- return !!(node && node.specified);
- }
-};
-
-Element.Methods.ByTag = { };
-
-Object.extend(Element, Element.Methods);
-
-if (!Prototype.BrowserFeatures.ElementExtensions &&
- document.createElement('div')['__proto__']) {
- window.HTMLElement = { };
- window.HTMLElement.prototype =
document.createElement('div')['__proto__'];
- Prototype.BrowserFeatures.ElementExtensions = true;
-}
-
-Element.extend = (function() {
- if (Prototype.BrowserFeatures.SpecificElementExtensions)
- return Prototype.K;
-
- var Methods = { }, ByTag = Element.Methods.ByTag;
-
- var extend = Object.extend(function(element) {
- if (!element || element._extendedByPrototype ||
- element.nodeType != 1 || element == window) return element;
-
- var methods = Object.clone(Methods),
- tagName = element.tagName.toUpperCase(), property, value;
-
- // extend methods for specific tags
- if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
-
- for (property in methods) {
- value = methods[property];
- if (Object.isFunction(value) && !(property in element))
- element[property] = value.methodize();
- }
-
- element._extendedByPrototype = Prototype.emptyFunction;
- return element;
-
- }, {
- refresh: function() {
- // extend methods for all tags (Safari doesn't need this)
- if (!Prototype.BrowserFeatures.ElementExtensions) {
- Object.extend(Methods, Element.Methods);
- Object.extend(Methods, Element.Methods.Simulated);
- }
- }
- });
-
- extend.refresh();
- return extend;
-})();
-
-Element.hasAttribute = function(element, attribute) {
- if (element.hasAttribute) return element.hasAttribute(attribute);
- return Element.Methods.Simulated.hasAttribute(element, attribute);
-};
-
-Element.addMethods = function(methods) {
- var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
-
- if (!methods) {
- Object.extend(Form, Form.Methods);
- Object.extend(Form.Element, Form.Element.Methods);
- Object.extend(Element.Methods.ByTag, {
- "FORM": Object.clone(Form.Methods),
- "INPUT": Object.clone(Form.Element.Methods),
- "SELECT": Object.clone(Form.Element.Methods),
- "TEXTAREA": Object.clone(Form.Element.Methods)
- });
- }
-
- if (arguments.length == 2) {
- var tagName = methods;
- methods = arguments[1];
- }
-
- if (!tagName) Object.extend(Element.Methods, methods || { });
- else {
- if (Object.isArray(tagName)) tagName.each(extend);
- else extend(tagName);
- }
-
- function extend(tagName) {
- tagName = tagName.toUpperCase();
- if (!Element.Methods.ByTag[tagName])
- Element.Methods.ByTag[tagName] = { };
- Object.extend(Element.Methods.ByTag[tagName], methods);
- }
-
- function copy(methods, destination, onlyIfAbsent) {
- onlyIfAbsent = onlyIfAbsent || false;
- for (var property in methods) {
- var value = methods[property];
- if (!Object.isFunction(value)) continue;
- if (!onlyIfAbsent || !(property in destination))
- destination[property] = value.methodize();
- }
- }
-
- function findDOMClass(tagName) {
- var klass;
- var trans = {
- "OPTGROUP": "OptGroup", "TEXTAREA":
"TextArea", "P": "Paragraph",
- "FIELDSET": "FieldSet", "UL": "UList",
"OL": "OList", "DL": "DList",
- "DIR": "Directory", "H1": "Heading",
"H2": "Heading", "H3": "Heading",
- "H4": "Heading", "H5": "Heading",
"H6": "Heading", "Q": "Quote",
- "INS": "Mod", "DEL": "Mod", "A":
"Anchor", "IMG": "Image", "CAPTION":
- "TableCaption", "COL": "TableCol",
"COLGROUP": "TableCol", "THEAD":
- "TableSection", "TFOOT": "TableSection",
"TBODY": "TableSection", "TR":
- "TableRow", "TH": "TableCell", "TD":
"TableCell", "FRAMESET":
- "FrameSet", "IFRAME": "IFrame"
- };
- if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
- if (window[klass]) return window[klass];
- klass = 'HTML' + tagName + 'Element';
- if (window[klass]) return window[klass];
- klass = 'HTML' + tagName.capitalize() + 'Element';
- if (window[klass]) return window[klass];
-
- window[klass] = { };
- window[klass].prototype = document.createElement(tagName)['__proto__'];
- return window[klass];
- }
-
- if (F.ElementExtensions) {
- copy(Element.Methods, HTMLElement.prototype);
- copy(Element.Methods.Simulated, HTMLElement.prototype, true);
- }
-
- if (F.SpecificElementExtensions) {
- for (var tag in Element.Methods.ByTag) {
- var klass = findDOMClass(tag);
- if (Object.isUndefined(klass)) continue;
- copy(T[tag], klass.prototype);
- }
- }
-
- Object.extend(Element, Element.Methods);
- delete Element.ByTag;
-
- if (Element.extend.refresh) Element.extend.refresh();
- Element.cache = { };
-};
-
-document.viewport = {
- getDimensions: function() {
- var dimensions = { }, B = Prototype.Browser;
- $w('width height').each(function(d) {
- var D = d.capitalize();
- if (B.WebKit && !document.evaluate) {
- // Safari <3.0 needs self.innerWidth/Height
- dimensions[d] = self['inner' + D];
- } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) {
- // Opera <9.5 needs document.body.clientWidth/Height
- dimensions[d] = document.body['client' + D]
- } else {
- dimensions[d] = document.documentElement['client' + D];
- }
- });
- return dimensions;
- },
-
- getWidth: function() {
- return this.getDimensions().width;
- },
-
- getHeight: function() {
- return this.getDimensions().height;
- },
-
- getScrollOffsets: function() {
- return Element._returnOffset(
- window.pageXOffset || document.documentElement.scrollLeft ||
document.body.scrollLeft,
- window.pageYOffset || document.documentElement.scrollTop ||
document.body.scrollTop);
- }
-};
-/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
- * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
- * license. Please see
http://www.yui-ext.com/ for more information. */
-
-var Selector = Class.create({
- initialize: function(expression) {
- this.expression = expression.strip();
-
- if (this.shouldUseSelectorsAPI()) {
- this.mode = 'selectorsAPI';
- } else if (this.shouldUseXPath()) {
- this.mode = 'xpath';
- this.compileXPathMatcher();
- } else {
- this.mode = "normal";
- this.compileMatcher();
- }
-
- },
-
- shouldUseXPath: function() {
- if (!Prototype.BrowserFeatures.XPath) return false;
-
- var e = this.expression;
-
- // Safari 3 chokes on :*-of-type and :empty
- if (Prototype.Browser.WebKit &&
- (e.include("-of-type") || e.include(":empty")))
- return false;
-
- // XPath can't do namespaced attributes, nor can it read
- // the "checked" property from DOM nodes
- if ((/(\[[\w-]*?:|:checked)/).test(e))
- return false;
-
- return true;
- },
-
- shouldUseSelectorsAPI: function() {
- if (!Prototype.BrowserFeatures.SelectorsAPI) return false;
-
- if (!Selector._div) Selector._div = new Element('div');
-
- // Make sure the browser treats the selector as valid. Test on an
- // isolated element to minimize cost of this check.
- try {
- Selector._div.querySelector(this.expression);
- } catch(e) {
- return false;
- }
-
- return true;
- },
-
- compileMatcher: function() {
- var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
- c = Selector.criteria, le, p, m;
-
- if (Selector._cache[e]) {
- this.matcher = Selector._cache[e];
- return;
- }
-
- this.matcher = ["this.matcher = function(root) {",
- "var r = root, h = Selector.handlers, c = false, n;"];
-
- while (e && le != e && (/\S/).test(e)) {
- le = e;
- for (var i in ps) {
- p = ps[i];
- if (m = e.match(p)) {
- this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
- new Template(c[i]).evaluate(m));
- e = e.replace(m[0], '');
- break;
- }
- }
- }
-
- this.matcher.push("return h.unique(n);\n}");
- eval(this.matcher.join('\n'));
- Selector._cache[this.expression] = this.matcher;
- },
-
- compileXPathMatcher: function() {
- var e = this.expression, ps = Selector.patterns,
- x = Selector.xpath, le, m;
-
- if (Selector._cache[e]) {
- this.xpath = Selector._cache[e]; return;
- }
-
- this.matcher = ['.//*'];
- while (e && le != e && (/\S/).test(e)) {
- le = e;
- for (var i in ps) {
- if (m = e.match(ps[i])) {
- this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
- new Template(x[i]).evaluate(m));
- e = e.replace(m[0], '');
- break;
- }
- }
- }
-
- this.xpath = this.matcher.join('');
- Selector._cache[this.expression] = this.xpath;
- },
-
- findElements: function(root) {
- root = root || document;
- var e = this.expression, results;
-
- switch (this.mode) {
- case 'selectorsAPI':
- // querySelectorAll queries document-wide, then filters to descendants
- // of the context element. That's not what we want.
- // Add an explicit context to the selector if necessary.
- if (root !== document) {
- var oldId = root.id, id = $(root).identify();
-
- //
https://jira.jboss.org/jira/browse/RF-5416
- e = "#" + id.replace(/:/g, '\\:') + " " + e
- //e = "#" + id + " " + e;
- }
-
- results = $A(root.querySelectorAll(e)).map(Element.extend);
- root.id = oldId;
-
- return results;
- case 'xpath':
- return document._getElementsByXPath(this.xpath, root);
- default:
- return this.matcher(root);
- }
- },
-
- match: function(element) {
- this.tokens = [];
-
- var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
- var le, p, m;
-
- while (e && le !== e && (/\S/).test(e)) {
- le = e;
- for (var i in ps) {
- p = ps[i];
- if (m = e.match(p)) {
- // use the Selector.assertions methods unless the selector
- // is too complex.
- if (as[i]) {
- this.tokens.push([i, Object.clone(m)]);
- e = e.replace(m[0], '');
- } else {
- // reluctantly do a document-wide search
- // and look for a match in the array
- return this.findElements(document).include(element);
- }
- }
- }
- }
-
- var match = true, name, matches;
- for (var i = 0, token; token = this.tokens[i]; i++) {
- name = token[0], matches = token[1];
- if (!Selector.assertions[name](element, matches)) {
- match = false; break;
- }
- }
-
- return match;
- },
-
- toString: function() {
- return this.expression;
- },
-
- inspect: function() {
- return "#<Selector:" + this.expression.inspect() + ">";
- }
-});
-
-Object.extend(Selector, {
- _cache: { },
-
- xpath: {
- descendant: "//*",
- child: "/*",
- adjacent: "/following-sibling::*[1]",
- laterSibling: '/following-sibling::*',
- tagName: function(m) {
- if (m[1] == '*') return '';
- return "[local-name()='" + m[1].toLowerCase() +
- "' or local-name()='" + m[1].toUpperCase() +
"']";
- },
- className: "[contains(concat(' ', @class, ' '), ' #{1}
')]",
- id: "[@id='#{1}']",
- attrPresence: function(m) {
- m[1] = m[1].toLowerCase();
- return new Template("[(a)#{1}]").evaluate(m);
- },
- attr: function(m) {
- m[1] = m[1].toLowerCase();
- m[3] = m[5] || m[6];
- return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
- },
- pseudo: function(m) {
- var h = Selector.xpath.pseudos[m[1]];
- if (!h) return '';
- if (Object.isFunction(h)) return h(m);
- return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
- },
- operators: {
- '=': "[@#{1}='#{3}']",
- '!=': "[@#{1}!='#{3}']",
- '^=': "[starts-with(@#{1}, '#{3}')]",
- '$=': "[substring(@#{1}, (string-length(@#{1}) -
string-length('#{3}') + 1))='#{3}']",
- '*=': "[contains(@#{1}, '#{3}')]",
- '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3}
')]",
- '|=': "[contains(concat('-', @#{1}, '-'),
'-#{3}-')]"
- },
- pseudos: {
- 'first-child': '[not(preceding-sibling::*)]',
- 'last-child': '[not(following-sibling::*)]',
- 'only-child': '[not(preceding-sibling::* or
following-sibling::*)]',
- 'empty': "[count(*) = 0 and (count(text()) = 0)]",
- 'checked': "[@checked]",
- 'disabled': "[(@disabled) and (@type!='hidden')]",
- 'enabled': "[not(@disabled) and (@type!='hidden')]",
- 'not': function(m) {
- var e = m[6], p = Selector.patterns,
- x = Selector.xpath, le, v;
-
- var exclusion = [];
- while (e && le != e && (/\S/).test(e)) {
- le = e;
- for (var i in p) {
- if (m = e.match(p[i])) {
- v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
- exclusion.push("(" + v.substring(1, v.length - 1) +
")");
- e = e.replace(m[0], '');
- break;
- }
- }
- }
- return "[not(" + exclusion.join(" and ") + ")]";
- },
- 'nth-child': function(m) {
- return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1)
", m);
- },
- 'nth-last-child': function(m) {
- return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1)
", m);
- },
- 'nth-of-type': function(m) {
- return Selector.xpath.pseudos.nth("position() ", m);
- },
- 'nth-last-of-type': function(m) {
- return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
- },
- 'first-of-type': function(m) {
- m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
- },
- 'last-of-type': function(m) {
- m[6] = "1"; return
Selector.xpath.pseudos['nth-last-of-type'](m);
- },
- 'only-of-type': function(m) {
- var p = Selector.xpath.pseudos; return p['first-of-type'](m) +
p['last-of-type'](m);
- },
- nth: function(fragment, m) {
- var mm, formula = m[6], predicate;
- if (formula == 'even') formula = '2n+0';
- if (formula == 'odd') formula = '2n+1';
- if (mm = formula.match(/^(\d+)$/)) // digit only
- return '[' + fragment + "= " + mm[1] + ']';
- if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
- if (mm[1] == "-") mm[1] = -1;
- var a = mm[1] ? Number(mm[1]) : 1;
- var b = mm[2] ? Number(mm[2]) : 0;
- predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
- "((#{fragment} - #{b}) div #{a} >= 0)]";
- return new Template(predicate).evaluate({
- fragment: fragment, a: a, b: b });
- }
- }
- }
- },
-
- criteria: {
- tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
- className: 'n = h.className(n, r, "#{1}", c); c = false;',
- id: 'n = h.id(n, r, "#{1}", c); c = false;',
- attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
- attr: function(m) {
- m[3] = (m[5] || m[6]);
- return new Template('n = h.attr(n, r, "#{1}", "#{3}",
"#{2}", c); c = false;').evaluate(m);
- },
- pseudo: function(m) {
- if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
- return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c);
c = false;').evaluate(m);
- },
- descendant: 'c = "descendant";',
- child: 'c = "child";',
- adjacent: 'c = "adjacent";',
- laterSibling: 'c = "laterSibling";'
- },
-
- patterns: {
- // combinators must be listed first
- // (and descendant needs to be last combinator)
- laterSibling: /^\s*~\s*/,
- child: /^\s*>\s*/,
- adjacent: /^\s*\+\s*/,
- descendant: /^\s/,
-
- // selectors follow
- tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
- id: /^#([\w\-\*]+)(\b|$)/,
- className: /^\.([\w\-\*]+)(\b|$)/,
- pseudo:
-/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
- attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/,
- attr:
/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
- },
-
- // for Selector.match and Element#match
- assertions: {
- tagName: function(element, matches) {
- return matches[1].toUpperCase() == element.tagName.toUpperCase();
- },
-
- className: function(element, matches) {
- return Element.hasClassName(element, matches[1]);
- },
-
- id: function(element, matches) {
- return element.id === matches[1];
- },
-
- attrPresence: function(element, matches) {
- return Element.hasAttribute(element, matches[1]);
- },
-
- attr: function(element, matches) {
- var nodeValue = Element.readAttribute(element, matches[1]);
- return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] ||
matches[6]);
- }
- },
-
- handlers: {
- // UTILITY FUNCTIONS
- // joins two collections
- concat: function(a, b) {
- for (var i = 0, node; node = b[i]; i++)
- a.push(node);
- return a;
- },
-
- // marks an array of nodes for counting
- mark: function(nodes) {
- var _true = Prototype.emptyFunction;
- for (var i = 0, node; node = nodes[i]; i++)
- node._countedByPrototype = _true;
- return nodes;
- },
-
- unmark: function(nodes) {
- for (var i = 0, node; node = nodes[i]; i++)
- node._countedByPrototype = undefined;
- return nodes;
- },
-
- // mark each child node with its position (for nth calls)
- // "ofType" flag indicates whether we're indexing for nth-of-type
- // rather than nth-child
- index: function(parentNode, reverse, ofType) {
- parentNode._countedByPrototype = Prototype.emptyFunction;
- if (reverse) {
- for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0;
i--) {
- var node = nodes[i];
- if (node.nodeType == 1 && (!ofType || node._countedByPrototype))
node.nodeIndex = j++;
- }
- } else {
- for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
- if (node.nodeType == 1 && (!ofType || node._countedByPrototype))
node.nodeIndex = j++;
- }
- },
-
- // filters out duplicates and extends all nodes
- unique: function(nodes) {
- if (nodes.length == 0) return nodes;
- var results = [], n;
- for (var i = 0, l = nodes.length; i < l; i++)
- if (!(n = nodes[i])._countedByPrototype) {
- n._countedByPrototype = Prototype.emptyFunction;
- results.push(Element.extend(n));
- }
- return Selector.handlers.unmark(results);
- },
-
- // COMBINATOR FUNCTIONS
- descendant: function(nodes) {
- var h = Selector.handlers;
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- h.concat(results, node.getElementsByTagName('*'));
- return results;
- },
-
- child: function(nodes) {
- var h = Selector.handlers;
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- for (var j = 0, child; child = node.childNodes[j]; j++)
- if (child.nodeType == 1 && child.tagName != '!')
results.push(child);
- }
- return results;
- },
-
- adjacent: function(nodes) {
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- var next = this.nextElementSibling(node);
- if (next) results.push(next);
- }
- return results;
- },
-
- laterSibling: function(nodes) {
- var h = Selector.handlers;
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- h.concat(results, Element.nextSiblings(node));
- return results;
- },
-
- nextElementSibling: function(node) {
- while (node = node.nextSibling)
- if (node.nodeType == 1) return node;
- return null;
- },
-
- previousElementSibling: function(node) {
- while (node = node.previousSibling)
- if (node.nodeType == 1) return node;
- return null;
- },
-
- // TOKEN FUNCTIONS
- tagName: function(nodes, root, tagName, combinator) {
- var uTagName = tagName.toUpperCase();
- var results = [], h = Selector.handlers;
- if (nodes) {
- if (combinator) {
- // fastlane for ordinary descendant combinators
- if (combinator == "descendant") {
- for (var i = 0, node; node = nodes[i]; i++)
- h.concat(results, node.getElementsByTagName(tagName));
- return results;
- } else nodes = this[combinator](nodes);
- if (tagName == "*") return nodes;
- }
- for (var i = 0, node; node = nodes[i]; i++)
- if (node.tagName.toUpperCase() === uTagName) results.push(node);
- return results;
- } else return root.getElementsByTagName(tagName);
- },
-
- id: function(nodes, root, id, combinator) {
- var targetNode = $(id), h = Selector.handlers;
- if (!targetNode) return [];
- if (!nodes && root == document) return [targetNode];
- if (nodes) {
- if (combinator) {
- if (combinator == 'child') {
- for (var i = 0, node; node = nodes[i]; i++)
- if (targetNode.parentNode == node) return [targetNode];
- } else if (combinator == 'descendant') {
- for (var i = 0, node; node = nodes[i]; i++)
- if (Element.descendantOf(targetNode, node)) return [targetNode];
- } else if (combinator == 'adjacent') {
- for (var i = 0, node; node = nodes[i]; i++)
- if (Selector.handlers.previousElementSibling(targetNode) == node)
- return [targetNode];
- } else nodes = h[combinator](nodes);
- }
- for (var i = 0, node; node = nodes[i]; i++)
- if (node == targetNode) return [targetNode];
- return [];
- }
- return (targetNode && Element.descendantOf(targetNode, root)) ?
[targetNode] : [];
- },
-
- className: function(nodes, root, className, combinator) {
- if (nodes && combinator) nodes = this[combinator](nodes);
- return Selector.handlers.byClassName(nodes, root, className);
- },
-
- byClassName: function(nodes, root, className) {
- if (!nodes) nodes = Selector.handlers.descendant([root]);
- var needle = ' ' + className + ' ';
- for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
- nodeClassName = node.className;
- if (nodeClassName.length == 0) continue;
- if (nodeClassName == className || (' ' + nodeClassName + '
').include(needle))
- results.push(node);
- }
- return results;
- },
-
- attrPresence: function(nodes, root, attr, combinator) {
- if (!nodes) nodes = root.getElementsByTagName("*");
- if (nodes && combinator) nodes = this[combinator](nodes);
- var results = [];
- for (var i = 0, node; node = nodes[i]; i++)
- if (Element.hasAttribute(node, attr)) results.push(node);
- return results;
- },
-
- attr: function(nodes, root, attr, value, operator, combinator) {
- if (!nodes) nodes = root.getElementsByTagName("*");
- if (nodes && combinator) nodes = this[combinator](nodes);
- var handler = Selector.operators[operator], results = [];
- for (var i = 0, node; node = nodes[i]; i++) {
- var nodeValue = Element.readAttribute(node, attr);
- if (nodeValue === null) continue;
- if (handler(nodeValue, value)) results.push(node);
- }
- return results;
- },
-
- pseudo: function(nodes, name, value, root, combinator) {
- if (nodes && combinator) nodes = this[combinator](nodes);
- if (!nodes) nodes = root.getElementsByTagName("*");
- return Selector.pseudos[name](nodes, value, root);
- }
- },
-
- pseudos: {
- 'first-child': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- if (Selector.handlers.previousElementSibling(node)) continue;
- results.push(node);
- }
- return results;
- },
- 'last-child': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- if (Selector.handlers.nextElementSibling(node)) continue;
- results.push(node);
- }
- return results;
- },
- 'only-child': function(nodes, value, root) {
- var h = Selector.handlers;
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
- results.push(node);
- return results;
- },
- 'nth-child': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, formula, root);
- },
- 'nth-last-child': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, formula, root, true);
- },
- 'nth-of-type': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, formula, root, false, true);
- },
- 'nth-last-of-type': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, formula, root, true, true);
- },
- 'first-of-type': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, "1", root, false, true);
- },
- 'last-of-type': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, "1", root, true, true);
- },
- 'only-of-type': function(nodes, formula, root) {
- var p = Selector.pseudos;
- return p['last-of-type'](p['first-of-type'](nodes, formula, root),
formula, root);
- },
-
- // handles the an+b logic
- getIndices: function(a, b, total) {
- if (a == 0) return b > 0 ? [b] : [];
- return $R(1, total).inject([], function(memo, i) {
- if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
- return memo;
- });
- },
-
- // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
- nth: function(nodes, formula, root, reverse, ofType) {
- if (nodes.length == 0) return [];
- if (formula == 'even') formula = '2n+0';
- if (formula == 'odd') formula = '2n+1';
- var h = Selector.handlers, results = [], indexed = [], m;
- h.mark(nodes);
- for (var i = 0, node; node = nodes[i]; i++) {
- if (!node.parentNode._countedByPrototype) {
- h.index(node.parentNode, reverse, ofType);
- indexed.push(node.parentNode);
- }
- }
- if (formula.match(/^\d+$/)) { // just a number
- formula = Number(formula);
- for (var i = 0, node; node = nodes[i]; i++)
- if (node.nodeIndex == formula) results.push(node);
- } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
- if (m[1] == "-") m[1] = -1;
- var a = m[1] ? Number(m[1]) : 1;
- var b = m[2] ? Number(m[2]) : 0;
- var indices = Selector.pseudos.getIndices(a, b, nodes.length);
- for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
- for (var j = 0; j < l; j++)
- if (node.nodeIndex == indices[j]) results.push(node);
- }
- }
- h.unmark(nodes);
- h.unmark(indexed);
- return results;
- },
-
- 'empty': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- // IE treats comments as element nodes
- if (node.tagName == '!' || node.firstChild) continue;
- results.push(node);
- }
- return results;
- },
-
- 'not': function(nodes, selector, root) {
- var h = Selector.handlers, selectorType, m;
- var exclusions = new Selector(selector).findElements(root);
- h.mark(exclusions);
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (!node._countedByPrototype) results.push(node);
- h.unmark(exclusions);
- return results;
- },
-
- 'enabled': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (!node.disabled && (!node.type || node.type !== 'hidden'))
- results.push(node);
- return results;
- },
-
- 'disabled': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (node.disabled) results.push(node);
- return results;
- },
-
- 'checked': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (node.checked) results.push(node);
- return results;
- }
- },
-
- operators: {
- '=': function(nv, v) { return nv == v; },
- '!=': function(nv, v) { return nv != v; },
- '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
- '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
- '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
- '$=': function(nv, v) { return nv.endsWith(v); },
- '*=': function(nv, v) { return nv.include(v); },
- '~=': function(nv, v) { return (' ' + nv + ' ').include('
' + v + ' '); },
- '|=': function(nv, v) { return ('-' + (nv ||
"").toUpperCase() +
- '-').include('-' + (v || "").toUpperCase() + '-');
}
- },
-
- split: function(expression) {
- var expressions = [];
- expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
- expressions.push(m[1].strip());
- });
- return expressions;
- },
-
- matchElements: function(elements, expression) {
- var matches = $$(expression), h = Selector.handlers;
- h.mark(matches);
- for (var i = 0, results = [], element; element = elements[i]; i++)
- if (element._countedByPrototype) results.push(element);
- h.unmark(matches);
- return results;
- },
-
- findElement: function(elements, expression, index) {
- if (Object.isNumber(expression)) {
- index = expression; expression = false;
- }
- return Selector.matchElements(elements, expression || '*')[index || 0];
- },
-
- findChildElements: function(element, expressions) {
- expressions = Selector.split(expressions.join(','));
- var results = [], h = Selector.handlers;
- for (var i = 0, l = expressions.length, selector; i < l; i++) {
- selector = new Selector(expressions[i].strip());
- h.concat(results, selector.findElements(element));
- }
- return (l > 1) ? h.unique(results) : results;
- }
-});
-
-if (Prototype.Browser.IE) {
- Object.extend(Selector.handlers, {
- // IE returns comment nodes on getElementsByTagName("*").
- // Filter them out.
- concat: function(a, b) {
- for (var i = 0, node; node = b[i]; i++)
- if (node.tagName !== "!") a.push(node);
- return a;
- },
-
- // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
- unmark: function(nodes) {
- for (var i = 0, node; node = nodes[i]; i++)
- node.removeAttribute('_countedByPrototype');
- return nodes;
- }
- });
-}
-
-function $$() {
- return Selector.findChildElements(document, $A(arguments));
-}
-var Form = {
- reset: function(form) {
- $(form).reset();
- return form;
- },
-
- serializeElements: function(elements, options) {
- if (typeof options != 'object') options = { hash: !!options };
- else if (Object.isUndefined(options.hash)) options.hash = true;
- var key, value, submitted = false, submit = options.submit;
-
- var data = elements.inject({ }, function(result, element) {
- if (!element.disabled && element.name) {
- key = element.name; value = $(element).getValue();
- if (value != null && element.type != 'file' &&
(element.type != 'submit' || (!submitted &&
- submit !== false && (!submit || key == submit) && (submitted
= true)))) {
- if (key in result) {
- // a key is already present; construct an array of values
- if (!Object.isArray(result[key])) result[key] = [result[key]];
- result[key].push(value);
- }
- else result[key] = value;
- }
- }
- return result;
- });
-
- return options.hash ? data : Object.toQueryString(data);
- }
-};
-
-Form.Methods = {
- serialize: function(form, options) {
- return Form.serializeElements(Form.getElements(form), options);
- },
-
- getElements: function(form) {
- return $A($(form).getElementsByTagName('*')).inject([],
- function(elements, child) {
- if (Form.Element.Serializers[child.tagName.toLowerCase()])
- elements.push(Element.extend(child));
- return elements;
- }
- );
- },
-
- getInputs: function(form, typeName, name) {
- form = $(form);
- var inputs = form.getElementsByTagName('input');
-
- if (!typeName && !name) return $A(inputs).map(Element.extend);
-
- for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
- var input = inputs[i];
- if ((typeName && input.type != typeName) || (name && input.name !=
name))
- continue;
- matchingInputs.push(Element.extend(input));
- }
-
- return matchingInputs;
- },
-
- disable: function(form) {
- form = $(form);
- Form.getElements(form).invoke('disable');
- return form;
- },
-
- enable: function(form) {
- form = $(form);
- Form.getElements(form).invoke('enable');
- return form;
- },
-
- findFirstElement: function(form) {
- var elements = $(form).getElements().findAll(function(element) {
- return 'hidden' != element.type && !element.disabled;
- });
- var firstByIndex = elements.findAll(function(element) {
- return element.hasAttribute('tabIndex') && element.tabIndex >=
0;
- }).sortBy(function(element) { return element.tabIndex }).first();
-
- return firstByIndex ? firstByIndex : elements.find(function(element) {
- return ['input', 'select',
'textarea'].include(element.tagName.toLowerCase());
- });
- },
-
- focusFirstElement: function(form) {
- form = $(form);
- form.findFirstElement().activate();
- return form;
- },
-
- request: function(form, options) {
- form = $(form), options = Object.clone(options || { });
-
- var params = options.parameters, action = form.readAttribute('action') ||
'';
- if (action.blank()) action = window.location.href;
- options.parameters = form.serialize(true);
-
- if (params) {
- if (Object.isString(params)) params = params.toQueryParams();
- Object.extend(options.parameters, params);
- }
-
- if (form.hasAttribute('method') && !options.method)
- options.method = form.method;
-
- return new Ajax.Request(action, options);
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element = {
- focus: function(element) {
- $(element).focus();
- return element;
- },
-
- select: function(element) {
- $(element).select();
- return element;
- }
-};
-
-Form.Element.Methods = {
- serialize: function(element) {
- element = $(element);
- if (!element.disabled && element.name) {
- var value = element.getValue();
- if (value != undefined) {
- var pair = { };
- pair[element.name] = value;
- return Object.toQueryString(pair);
- }
- }
- return '';
- },
-
- getValue: function(element) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- return Form.Element.Serializers[method](element);
- },
-
- setValue: function(element, value) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- Form.Element.Serializers[method](element, value);
- return element;
- },
-
- clear: function(element) {
- $(element).value = '';
- return element;
- },
-
- present: function(element) {
- return $(element).value != '';
- },
-
- activate: function(element) {
- element = $(element);
- try {
- element.focus();
- if (element.select && (element.tagName.toLowerCase() != 'input' ||
- !['button', 'reset', 'submit'].include(element.type)))
- element.select();
- } catch (e) { }
- return element;
- },
-
- disable: function(element) {
- element = $(element);
- element.disabled = true;
- return element;
- },
-
- enable: function(element) {
- element = $(element);
- element.disabled = false;
- return element;
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-var Field = Form.Element;
-var $F = Form.Element.Methods.getValue;
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element.Serializers = {
- input: function(element, value) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- return Form.Element.Serializers.inputSelector(element, value);
- default:
- return Form.Element.Serializers.textarea(element, value);
- }
- },
-
- inputSelector: function(element, value) {
- if (Object.isUndefined(value)) return element.checked ? element.value : null;
- else element.checked = !!value;
- },
-
- textarea: function(element, value) {
- if (Object.isUndefined(value)) return element.value;
- else element.value = value;
- },
-
- select: function(element, value) {
- if (Object.isUndefined(value))
- return this[element.type == 'select-one' ?
- 'selectOne' : 'selectMany'](element);
- else {
- var opt, currentValue, single = !Object.isArray(value);
- for (var i = 0, length = element.length; i < length; i++) {
- opt = element.options[i];
- currentValue = this.optionValue(opt);
- if (single) {
- if (currentValue == value) {
- opt.selected = true;
- return;
- }
- }
- else opt.selected = value.include(currentValue);
- }
- }
- },
-
- selectOne: function(element) {
- var index = element.selectedIndex;
- return index >= 0 ? this.optionValue(element.options[index]) : null;
- },
-
- selectMany: function(element) {
- var values, length = element.length;
- if (!length) return null;
-
- for (var i = 0, values = []; i < length; i++) {
- var opt = element.options[i];
- if (opt.selected) values.push(this.optionValue(opt));
- }
- return values;
- },
-
- optionValue: function(opt) {
- // extend element because hasAttribute may not be native
- return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
- initialize: function($super, element, frequency, callback) {
- $super(callback, frequency);
- this.element = $(element);
- this.lastValue = this.getValue();
- },
-
- execute: function() {
- var value = this.getValue();
- if (Object.isString(this.lastValue) && Object.isString(value) ?
- this.lastValue != value : String(this.lastValue) != String(value)) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- }
-});
-
-Form.Element.Observer = Class.create(Abstract.TimedObserver, {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.Observer = Class.create(Abstract.TimedObserver, {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.EventObserver = Class.create({
- initialize: function(element, callback) {
- this.element = $(element);
- this.callback = callback;
-
- this.lastValue = this.getValue();
- if (this.element.tagName.toLowerCase() == 'form')
- this.registerFormCallbacks();
- else
- this.registerCallback(this.element);
- },
-
- onElementEvent: function() {
- var value = this.getValue();
- if (this.lastValue != value) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- },
-
- registerFormCallbacks: function() {
- Form.getElements(this.element).each(this.registerCallback, this);
- },
-
- registerCallback: function(element) {
- if (element.type) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- Event.observe(element, 'click', this.onElementEvent.bind(this));
- break;
- default:
- Event.observe(element, 'change', this.onElementEvent.bind(this));
- break;
- }
- }
- }
-});
-
-Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.EventObserver = Class.create(Abstract.EventObserver, {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-if (!window.Event) var Event = { };
-
-Object.extend(Event, {
- KEY_BACKSPACE: 8,
- KEY_TAB: 9,
- KEY_RETURN: 13,
- KEY_ESC: 27,
- KEY_LEFT: 37,
- KEY_UP: 38,
- KEY_RIGHT: 39,
- KEY_DOWN: 40,
- KEY_DELETE: 46,
- KEY_HOME: 36,
- KEY_END: 35,
- KEY_PAGEUP: 33,
- KEY_PAGEDOWN: 34,
- KEY_INSERT: 45,
-
- cache: { },
-
- relatedTarget: function(event) {
- var element;
- switch(event.type) {
- case 'mouseover': element = event.fromElement; break;
- case 'mouseout': element = event.toElement; break;
- default: return null;
- }
- return Element.extend(element);
- }
-});
-
-Event.Methods = (function() {
- var isButton;
-
- if (Prototype.Browser.IE) {
- var buttonMap = { 0: 1, 1: 4, 2: 2 };
- isButton = function(event, code) {
- return event.button == buttonMap[code];
- };
-
- } else if (Prototype.Browser.WebKit) {
- isButton = function(event, code) {
- switch (code) {
- case 0: return event.which == 1 && !event.metaKey;
- case 1: return event.which == 1 && event.metaKey;
- default: return false;
- }
- };
-
- } else {
- isButton = function(event, code) {
- return event.which ? (event.which === code + 1) : (event.button === code);
- };
- }
-
- return {
- isLeftClick: function(event) { return isButton(event, 0) },
- isMiddleClick: function(event) { return isButton(event, 1) },
- isRightClick: function(event) { return isButton(event, 2) },
-
- element: function(event) {
- event = Event.extend(event);
-
- var node = event.target,
- type = event.type,
- currentTarget = event.currentTarget;
-
- if (currentTarget && currentTarget.tagName) {
- // Firefox screws up the "click" event when moving between radio
buttons
- // via arrow keys. It also screws up the "load" and "error"
events on images,
- // reporting the document as the target instead of the original image.
- if (type === 'load' || type === 'error' ||
- (type === 'click' && currentTarget.tagName.toLowerCase() ===
'input'
- && currentTarget.type === 'radio'))
- node = currentTarget;
- }
- if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
- return Element.extend(node);
- },
-
- findElement: function(event, expression) {
- var element = Event.element(event);
- if (!expression) return element;
- var elements = [element].concat(element.ancestors());
- return Selector.findElement(elements, expression, 0);
- },
-
- pointer: function(event) {
- var docElement = document.documentElement,
- body = document.body || { scrollLeft: 0, scrollTop: 0 };
- return {
- x: event.pageX || (event.clientX +
- (docElement.scrollLeft || body.scrollLeft) -
- (docElement.clientLeft || 0)),
- y: event.pageY || (event.clientY +
- (docElement.scrollTop || body.scrollTop) -
- (docElement.clientTop || 0))
- };
- },
-
- pointerX: function(event) { return Event.pointer(event).x },
- pointerY: function(event) { return Event.pointer(event).y },
-
- stop: function(event) {
- Event.extend(event);
- event.preventDefault();
- event.stopPropagation();
- event.stopped = true;
- }
- };
-})();
-
-Event.extend = (function() {
- var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
- m[name] = Event.Methods[name].methodize();
- return m;
- });
-
- if (Prototype.Browser.IE) {
- Object.extend(methods, {
- stopPropagation: function() { this.cancelBubble = true },
- preventDefault: function() { this.returnValue = false },
- inspect: function() { return "[object Event]" }
- });
-
- return function(event) {
- if (!event) return false;
- if (event._extendedByPrototype) return event;
-
- event._extendedByPrototype = Prototype.emptyFunction;
- var pointer = Event.pointer(event);
- Object.extend(event, {
- target: event.srcElement,
- relatedTarget: Event.relatedTarget(event),
- pageX: pointer.x,
- pageY: pointer.y
- });
- return Object.extend(event, methods);
- };
-
- } else {
- Event.prototype = Event.prototype ||
document.createEvent("HTMLEvents")['__proto__'];
- Object.extend(Event.prototype, methods);
- return Prototype.K;
- }
-})();
-
-Object.extend(Event, (function() {
- var cache = Event.cache;
-
- function getEventID(element) {
- if (element._prototypeEventID) return element._prototypeEventID[0];
- arguments.callee.id = arguments.callee.id || 1;
- return element._prototypeEventID = [++arguments.callee.id];
- }
-
- function getDOMEventName(eventName) {
- if (eventName && eventName.include(':')) return
"dataavailable";
- return eventName;
- }
-
- function getCacheForID(id) {
- return cache[id] = cache[id] || { };
- }
-
- function getWrappersForEventName(id, eventName) {
- var c = getCacheForID(id);
- return c[eventName] = c[eventName] || [];
- }
-
- function createWrapper(element, eventName, handler) {
- var id = getEventID(element);
- var c = getWrappersForEventName(id, eventName);
- if (c.pluck("handler").include(handler)) return false;
-
- var wrapper = function(event) {
- if (!Event || !Event.extend ||
- (event.eventName && event.eventName != eventName))
- return false;
-
- Event.extend(event);
- handler.call(element, event);
- };
-
- wrapper.handler = handler;
- c.push(wrapper);
- return wrapper;
- }
-
- function findWrapper(id, eventName, handler) {
- var c = getWrappersForEventName(id, eventName);
- return c.find(function(wrapper) { return wrapper.handler == handler });
- }
-
- function destroyWrapper(id, eventName, handler) {
- var c = getCacheForID(id);
- if (!c[eventName]) return false;
- c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
- }
-
- //commented by Nick for RichFaces
- /*
- function destroyCache() {
- for (var id in cache)
- for (var eventName in cache[id])
- cache[id][eventName] = null;
- }
-
-
- // Internet Explorer needs to remove event handlers on page unload
- // in order to avoid memory leaks.
- if (window.attachEvent) {
- window.attachEvent("onunload", destroyCache);
- }
- */
- //commented
-
- // Safari has a dummy event handler on page unload so that it won't
- // use its bfcache. Safari <= 3.1 has an issue with restoring the
"document"
- // object when page is returned to via the back button using its bfcache.
- if (Prototype.Browser.WebKit) {
- window.addEventListener('unload', Prototype.emptyFunction, false);
- }
-
- return {
- //added by Nick for RichFaces
- getDOMEventName: getDOMEventName,
- //added
-
- observe: function(element, eventName, handler) {
- element = $(element);
- var name = getDOMEventName(eventName);
-
- var wrapper = createWrapper(element, eventName, handler);
- if (!wrapper) return element;
-
- if (element.addEventListener) {
- element.addEventListener(name, wrapper, false);
- } else {
- element.attachEvent("on" + name, wrapper);
- }
-
- return element;
- },
-
- stopObserving: function(element, eventName, handler) {
- element = $(element);
- var id = getEventID(element), name = getDOMEventName(eventName);
-
- if (!handler && eventName) {
- getWrappersForEventName(id, eventName).each(function(wrapper) {
- element.stopObserving(eventName, wrapper.handler);
- });
- return element;
-
- } else if (!eventName) {
- Object.keys(getCacheForID(id)).each(function(eventName) {
- element.stopObserving(eventName);
- });
- return element;
- }
-
- var wrapper = findWrapper(id, eventName, handler);
- if (!wrapper) return element;
-
- if (element.removeEventListener) {
- element.removeEventListener(name, wrapper, false);
- } else {
- element.detachEvent("on" + name, wrapper);
- }
-
- destroyWrapper(id, eventName, handler);
-
- return element;
- },
-
- fire: function(element, eventName, memo) {
- element = $(element);
- if (element == document && document.createEvent &&
!element.dispatchEvent)
- element = document.documentElement;
-
- var event;
- if (document.createEvent) {
- event = document.createEvent("HTMLEvents");
- event.initEvent("dataavailable", true, true);
- } else {
- event = document.createEventObject();
- event.eventType = "ondataavailable";
- }
-
- event.eventName = eventName;
- event.memo = memo || { };
-
- if (document.createEvent) {
- element.dispatchEvent(event);
- } else {
- element.fireEvent(event.eventType, event);
- }
-
- return Event.extend(event);
- }
- };
-})());
-
-Object.extend(Event, Event.Methods);
-
-Element.addMethods({
- fire: Event.fire,
- observe: Event.observe,
- stopObserving: Event.stopObserving
-});
-
-Object.extend(document, {
- fire: Element.Methods.fire.methodize(),
- observe: Element.Methods.observe.methodize(),
- stopObserving: Element.Methods.stopObserving.methodize(),
- loaded: false
-});
-
-(function() {
- /* Support for the DOMContentLoaded event is based on work by Dan Webb,
- Matthias Miller, Dean Edwards and John Resig. */
-
- var timer;
-
- function fireContentLoadedEvent() {
- if (document.loaded) return;
- if (timer) window.clearInterval(timer);
- document.fire("dom:loaded");
- document.loaded = true;
- }
-
- if (document.addEventListener) {
- if (Prototype.Browser.WebKit) {
- timer = window.setInterval(function() {
- if (/loaded|complete/.test(document.readyState))
- fireContentLoadedEvent();
- }, 0);
-
- Event.observe(window, "load", fireContentLoadedEvent);
-
- } else {
- document.addEventListener("DOMContentLoaded",
- fireContentLoadedEvent, false);
- }
-
- } else {
- // added by Pavel Yaschenko //
http://jira.jboss.com/jira/browse/RF-3879
-
- // for 1.6.0.3
- if (document.loaded) return;
-
- if (document.readyState != "complete") { // added by Pavel Yaschenko
- document.write("<script id=__onDOMContentLoaded defer
src=//:><\/script>");
- $("__onDOMContentLoaded").onreadystatechange = function() {
- if (this.readyState == "complete") {
- this.onreadystatechange = null;
- fireContentLoadedEvent();
- }
- };
- } // added by Pavel Yaschenko
- }
-})();
-/*------------------------------- DEPRECATED -------------------------------*/
-
-Hash.toQueryString = Object.toQueryString;
-
-var Toggle = { display: Element.toggle };
-
-Element.Methods.childOf = Element.Methods.descendantOf;
-
-var Insertion = {
- Before: function(element, content) {
- return Element.insert(element, {before:content});
- },
-
- Top: function(element, content) {
- return Element.insert(element, {top:content});
- },
-
- Bottom: function(element, content) {
- return Element.insert(element, {bottom:content});
- },
-
- After: function(element, content) {
- return Element.insert(element, {after:content});
- }
-};
-
-var $continue = new Error('"throw $continue" is deprecated, use
"return" instead');
-
-// This should be moved to script.aculo.us; notice the deprecated methods
-// further below, that map to the newer Element methods.
-var Position = {
- // set to true if needed, warning: firefox performance problems
- // NOT neeeded for page scrolling, only if draggable contained in
- // scrollable elements
- includeScrollOffsets: false,
-
- // must be called before calling withinIncludingScrolloffset, every time the
- // page is scrolled
- prepare: function() {
- this.deltaX = window.pageXOffset
- || document.documentElement.scrollLeft
- || document.body.scrollLeft
- || 0;
- this.deltaY = window.pageYOffset
- || document.documentElement.scrollTop
- || document.body.scrollTop
- || 0;
- },
-
- // caches x/y coordinate pair to use with overlap
- within: function(element, x, y) {
- if (this.includeScrollOffsets)
- return this.withinIncludingScrolloffsets(element, x, y);
- this.xcomp = x;
- this.ycomp = y;
- this.offset = Element.cumulativeOffset(element);
-
- return (y >= this.offset[1] &&
- y < this.offset[1] + element.offsetHeight &&
- x >= this.offset[0] &&
- x < this.offset[0] + element.offsetWidth);
- },
-
- withinIncludingScrolloffsets: function(element, x, y) {
- var offsetcache = Element.cumulativeScrollOffset(element);
-
- this.xcomp = x + offsetcache[0] - this.deltaX;
- this.ycomp = y + offsetcache[1] - this.deltaY;
- this.offset = Element.cumulativeOffset(element);
-
- return (this.ycomp >= this.offset[1] &&
- this.ycomp < this.offset[1] + element.offsetHeight &&
- this.xcomp >= this.offset[0] &&
- this.xcomp < this.offset[0] + element.offsetWidth);
- },
-
- // within must be called directly before
- overlap: function(mode, element) {
- if (!mode) return 0;
- if (mode == 'vertical')
- return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
- element.offsetHeight;
- if (mode == 'horizontal')
- return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
- element.offsetWidth;
- },
-
- // Deprecation layer -- use newer Element methods now (1.5.2).
-
- cumulativeOffset: Element.Methods.cumulativeOffset,
-
- positionedOffset: Element.Methods.positionedOffset,
-
- absolutize: function(element) {
- Position.prepare();
- return Element.absolutize(element);
- },
-
- relativize: function(element) {
- Position.prepare();
- return Element.relativize(element);
- },
-
- realOffset: Element.Methods.cumulativeScrollOffset,
-
- offsetParent: Element.Methods.getOffsetParent,
-
- page: Element.Methods.viewportOffset,
-
- clone: function(source, target, options) {
- options = options || { };
- return Element.clonePosition(target, source, options);
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-if (!document.getElementsByClassName) document.getElementsByClassName =
function(instanceMethods){
- function iter(name) {
- return name.blank() ? null : "[contains(concat(' ', @class, '
'), ' " + name + " ')]";
- }
-
- instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
- function(element, className) {
- className = className.toString().strip();
- var cond = /\s/.test(className) ? $w(className).map(iter).join('') :
iter(className);
- return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
- } : function(element, className) {
- className = className.toString().strip();
- var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
- if (!classNames && !className) return elements;
-
- var nodes = $(element).getElementsByTagName('*');
- className = ' ' + className + ' ';
-
- for (var i = 0, child, cn; child = nodes[i]; i++) {
- if (child.className && (cn = ' ' + child.className + ' ')
&& (cn.include(className) ||
- (classNames && classNames.all(function(name) {
- return !name.toString().blank() && cn.include(' ' + name +
' ');
- }))))
- elements.push(Element.extend(child));
- }
- return elements;
- };
-
- return function(className, parentElement) {
- return $(parentElement || document.body).getElementsByClassName(className);
- };
-}(Element.Methods);
-
-/*--------------------------------------------------------------------------*/
-
-Element.ClassNames = Class.create();
-Element.ClassNames.prototype = {
- initialize: function(element) {
- this.element = $(element);
- },
-
- _each: function(iterator) {
- this.element.className.split(/\s+/).select(function(name) {
- return name.length > 0;
- })._each(iterator);
- },
-
- set: function(className) {
- this.element.className = className;
- },
-
- add: function(classNameToAdd) {
- if (this.include(classNameToAdd)) return;
- this.set($A(this).concat(classNameToAdd).join(' '));
- },
-
- remove: function(classNameToRemove) {
- if (!this.include(classNameToRemove)) return;
- this.set($A(this).without(classNameToRemove).join(' '));
- },
-
- toString: function() {
- return $A(this).join(' ');
- }
-};
-
-Object.extend(Element.ClassNames.prototype, Enumerable);
-
-/*--------------------------------------------------------------------------*/
-
-Element.addMethods();
-//memory-leaks sanitizing code
-if (!window.RichFaces) {
- window.RichFaces = {};
-}
-
-if (!window.RichFaces.Memory) {
- window.RichFaces.Memory = {
-
- nodeCleaners: {},
- componentCleaners: {},
-
- addCleaner: function (name, cleaner) {
- this.nodeCleaners[name] = cleaner;
- },
-
- addComponentCleaner: function (name, cleaner, checker) {
- this.componentCleaners[name] = {cleaner: cleaner, checker: checker};
- },
-
- applyCleaners: function (node, isAjax, componentNodes) {
- for (var name in this.nodeCleaners) {
- this.nodeCleaners[name](node, isAjax);
- }
- for (var name in this.componentCleaners) {
- if (this.componentCleaners[name].checker(node, isAjax))
- componentNodes.push(node);
- }
- },
-
- _clean: function (oldNode, isAjax, componentNodes) {
- if (oldNode) {
- this.applyCleaners(oldNode, isAjax, componentNodes);
-
- //node.all is quicker than recursive traversing
- //window doesn't have "all" attribute
- var all = oldNode.all;
-
- if (all) {
- var counter = 0;
- var length = all.length;
-
- for (var counter = 0; counter < length; counter++ ) {
- this.applyCleaners(all[counter], isAjax, componentNodes);
- }
- } else {
- var node = oldNode.firstChild;
- while (node) {
- this._clean(node, isAjax, componentNodes);
- node = node.nextSibling;
- }
- }
- }
- },
-
- _cleanComponentNodes: function (oldNodes, isAjax) {
- for (var i=0; i<oldNodes.length; i++) {
- var node = oldNodes[i];
- for (var name in this.componentCleaners) {
- this.componentCleaners[name].cleaner(node, isAjax);
- }
- }
- },
-
- clean: function (oldNode, isAjax) {
- var componentNodes = [];
- this._clean(oldNode, isAjax, componentNodes);
- this._cleanComponentNodes(componentNodes, isAjax);
- componentNodes = null;
- }
- };
-
- window.RichFaces.Memory.addComponentCleaner("richfaces", function(node,
isAjax) {
- var component = node.component;
- if (component) {
- var destructorName = component["rich:destructor"];
- //destructor name is required to be back-compatible
- if (destructorName) {
- var destructor = component[destructorName];
- if (destructor) {
- destructor.call(component, isAjax);
- }
- }
- }
- }, function(node, isAjax) {
- return (node.component && node.component["rich:destructor"]);
- });
-
- if (window.attachEvent) {
- window.attachEvent("onunload", function() {
- var memory = window.RichFaces.Memory;
- memory.clean(document);
- memory.clean(window);
- });
- }
-}
-
-//
-/**
-* MyFaces compatibility issue
-**/
-Function.prototype.indexOf = function(){
- return -1;
-}
-
-/**
-* Clear children
-**/
-
-Element.clearChildren = function(element) {
- element = $(element);
- while(element.firstChild) {
- element.removeChild(element.firstChild);
- }
- return element;
-};
-/**
- * Detect if element is child of another one
- * @param {DomNode} node
- * @param {DomNode} supposedParent
- */
-Element.isChildOf = function(node, supposedParent){
- while(node && supposedParent !=node) {
- node = node.parentNode;
- }
-
- return supposedParent == node;
-};
-
-if (typeof Node == "undefined") {
- Node = {
- ELEMENT_NODE: 1,
- ATTRIBUTE_NODE: 2,
- TEXT_NODE: 3,
- CDATA_SECTION_NODE: 4,
- ENTITY_REFERENCE_NODE: 5,
- ENTITY_NODE: 6,
- PROCESSING_INSTRUCTION_NODE: 7,
- COMMENT_NODE: 8,
- DOCUMENT_NODE: 9,
- DOCUMENT_TYPE_NODE: 10,
- DOCUMENT_FRAGMENT_NODE: 11,
- NOTATION_NODE: 12
- };
-};
-
-Element.isUninitialized = function(element) {
- if (element) {
- if (element.nodeType == Node.ELEMENT_NODE) {
-
- if (!element.parentNode || element.document && element.document.readyState ==
"uninitialized") {
- return true;
- } else
- {
- return !Element.descendantOf(element, document.documentElement);
- }
-
- return false;
- }
- }
-};
-
-if (window.RichFaces && window.RichFaces.Memory) {
- window.RichFaces.Memory.addCleaner("prototype", function(node, isAjax) {
- var eventID = node._prototypeEventID ? node._prototypeEventID[0] : undefined;
- if (eventID) {
- var cache = Event.cache[eventID];
-
- for (var eventName in cache) {
- var wrappers = cache[eventName];
- var domEventName = Event.getDOMEventName(eventName);
-
- wrappers.each(function(wrapper) {
- if (node.removeEventListener) {
- node.removeEventListener(domEventName, wrapper, false);
- } else {
- node.detachEvent("on" + domEventName, wrapper);
- }
- });
-
- cache[eventName] = null;
- }
-
- delete Event.cache[eventID];
- }
- });
-}
-
-//
-
-/*
- * Prolog for created Ajax4Jsf library
- */
-if (!window.A4J) { window.A4J= {};}
-
-//if(window.A4J.AJAX && window.A4J.AJAX.XMLHttpRequest) return;
-/*
- * ====================================================================
- * About Sarissa:
http://dev.abiss.gr/sarissa
- * ====================================================================
- * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML
APIs.
- * The library supports Gecko based browsers like Mozilla and Firefox,
- * Internet Explorer (5.5+ with MSXML3.0+), Konqueror, Safari and Opera
- * @author: Copyright 2004-2007 Emmanouil Batsis, mailto: mbatsis at users full stop
sourceforge full stop net
- * ====================================================================
- * Licence
- * ====================================================================
- * Sarissa is free software distributed under the GNU GPL version 2 (see <a
href="gpl.txt">gpl.txt</a>) or higher,
- * GNU LGPL version 2.1 (see <a href="lgpl.txt">lgpl.txt</a>) or
higher and Apache Software License 2.0 or higher
- * (see <a href="asl.txt">asl.txt</a>). This means you can choose
one of the three and use that if you like. If
- * you make modifications under the ASL, i would appreciate it if you submitted those.
- * In case your copy of Sarissa does not include the license texts, you may find
- * them online in various formats at <a
href="http://www.gnu.org">http://www.gnu.org</a> and
- * <a href="http://www.apache.org">http://www.apache.org</a>.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
- * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- * WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE
- * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-/**
- * <p>Sarissa is a utility class. Provides "static" methods for
DOMDocument,
- * DOM Node serialization to XML strings and other utility goodies.</p>
- * @constructor
- * @static
- */
-function Sarissa(){}
-Sarissa.VERSION = "0.9.9.3";
-Sarissa.PARSED_OK = "Document contains no parsing errors";
-Sarissa.PARSED_EMPTY = "Document is empty";
-Sarissa.PARSED_UNKNOWN_ERROR = "Not well-formed or other error";
-Sarissa.IS_ENABLED_TRANSFORM_NODE = false;
-Sarissa.REMOTE_CALL_FLAG = "gr.abiss.sarissa.REMOTE_CALL_FLAG";
-/** @private */
-Sarissa._sarissa_iNsCounter = 0;
-/** @private */
-Sarissa._SARISSA_IEPREFIX4XSLPARAM = "";
-/** @private */
-Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;
-/** @private */
-Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT = Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION
&& document.implementation.createDocument;
-/** @private */
-Sarissa._SARISSA_HAS_DOM_FEATURE = Sarissa._SARISSA_HAS_DOM_IMPLEMENTATION &&
document.implementation.hasFeature;
-/** @private */
-Sarissa._SARISSA_IS_MOZ = Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT &&
Sarissa._SARISSA_HAS_DOM_FEATURE;
-/** @private */
-Sarissa._SARISSA_IS_SAFARI =
navigator.userAgent.toLowerCase().indexOf("safari") != -1 ||
navigator.userAgent.toLowerCase().indexOf("konqueror") != -1;
-/** @private */
-Sarissa._SARISSA_IS_SAFARI_OLD = Sarissa._SARISSA_IS_SAFARI &&
(parseInt((navigator.userAgent.match(/AppleWebKit\/(\d+)/)||{})[1], 10) < 420);
-/** @private */
-Sarissa._SARISSA_IS_IE = document.all && window.ActiveXObject &&
navigator.userAgent.toLowerCase().indexOf("msie") > -1 &&
navigator.userAgent.toLowerCase().indexOf("opera") == -1;
-/** @private */
-Sarissa._SARISSA_IS_OPERA = navigator.userAgent.toLowerCase().indexOf("opera")
!= -1;
-if(!window.Node || !Node.ELEMENT_NODE){
- Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4,
ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE:
8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE:
12};
-}
-
-//This breaks for(x in o) loops in the old Safari
-if(Sarissa._SARISSA_IS_SAFARI_OLD){
- HTMLHtmlElement = document.createElement("html").constructor;
- Node = HTMLElement = {};
- HTMLElement.prototype = HTMLHtmlElement.__proto__.__proto__;
- HTMLDocument = Document = document.constructor;
- var x = new DOMParser();
- XMLDocument = x.constructor;
- Element = x.parseFromString("<Single />",
"text/xml").documentElement.constructor;
- x = null;
-}
-if(typeof XMLDocument == "undefined" && typeof Document
!="undefined"){ XMLDocument = Document; }
-
-// IE initialization
-if(Sarissa._SARISSA_IS_IE){
- // for XSLT parameter names, prefix needed by IE
- Sarissa._SARISSA_IEPREFIX4XSLPARAM = "xsl:";
- // used to store the most recent ProgID available out of the above
- var _SARISSA_DOM_PROGID = "";
- var _SARISSA_XMLHTTP_PROGID = "";
- var _SARISSA_DOM_XMLWRITER = "";
- /**
- * Called when the sarissa.js file is parsed, to pick most recent
- * ProgIDs for IE, then gets destroyed.
- * @memberOf Sarissa
- * @private
- * @param idList an array of MSXML PROGIDs from which the most recent will be picked
for a given object
- * @param enabledList an array of arrays where each array has two items; the index of
the PROGID for which a certain feature is enabled
- */
- Sarissa.pickRecentProgID = function (idList){
- // found progID flag
- var bFound = false, e;
- var o2Store;
- for(var i=0; i < idList.length && !bFound; i++){
- try{
- var oDoc = new ActiveXObject(idList[i]);
- o2Store = idList[i];
- bFound = true;
- }catch (objException){
- // trap; try next progID
- e = objException;
- }
- }
- if (!bFound) {
- throw "Could not retrieve a valid progID of Class: " +
idList[idList.length-1]+". (original exception: "+e+")";
- }
- idList = null;
- return o2Store;
- };
- // pick best available MSXML progIDs
- _SARISSA_DOM_PROGID = null;
- _SARISSA_THREADEDDOM_PROGID = null;
- _SARISSA_XSLTEMPLATE_PROGID = null;
- _SARISSA_XMLHTTP_PROGID = null;
- // commenting the condition out; we need to redefine XMLHttpRequest
- // anyway as IE7 hardcodes it to MSXML3.0 causing version problems
- // between different activex controls
- //if(!window.XMLHttpRequest){
- /**
- * Emulate XMLHttpRequest
- * @constructor
- */
- XMLHttpRequest = function() {
- if(!_SARISSA_XMLHTTP_PROGID){
- _SARISSA_XMLHTTP_PROGID =
Sarissa.pickRecentProgID(["Msxml2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]);
- }
- return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);
- };
- //}
- // we dont need this anymore
- //============================================
- // Factory methods (IE)
- //============================================
- // see non-IE version
- Sarissa.getDomDocument = function(sUri, sName){
- if(!_SARISSA_DOM_PROGID){
- _SARISSA_DOM_PROGID =
Sarissa.pickRecentProgID(["Msxml2.DOMDocument.6.0",
"Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument",
"MSXML.DOMDocument", "Microsoft.XMLDOM"]);
- }
- var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
- // if a root tag name was provided, we need to load it in the DOM object
- if (sName){
- // create an artifical namespace prefix
- // or reuse existing prefix if applicable
- var prefix = "";
- if(sUri){
- if(sName.indexOf(":") > 1){
- prefix = sName.substring(0, sName.indexOf(":"));
- sName = sName.substring(sName.indexOf(":")+1);
- }else{
- prefix = "a" + (Sarissa._sarissa_iNsCounter++);
- }
- }
- // use namespaces if a namespace URI exists
- if(sUri){
- oDoc.loadXML('<' + prefix+':'+sName + "
xmlns:" + prefix + "=\"" + sUri + "\"" + "
/>");
- } else {
- oDoc.loadXML('<' + sName + " />");
- }
- }
- return oDoc;
- };
- // see non-IE version
- Sarissa.getParseErrorText = function (oDoc) {
- var parseErrorText = Sarissa.PARSED_OK;
- if(oDoc && oDoc.parseError && oDoc.parseError.errorCode
&& oDoc.parseError.errorCode != 0){
- parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason +
- "\nLocation: " + oDoc.parseError.url +
- "\nLine Number " + oDoc.parseError.line + ", Column "
+
- oDoc.parseError.linepos +
- ":\n" + oDoc.parseError.srcText +
- "\n";
- for(var i = 0; i < oDoc.parseError.linepos;i++){
- parseErrorText += "-";
- }
- parseErrorText += "^\n";
- }
- else if(oDoc.documentElement === null){
- parseErrorText = Sarissa.PARSED_EMPTY;
- }
- return parseErrorText;
- };
- // see non-IE version
- Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
- oDoc.setProperty("SelectionLanguage", "XPath");
- oDoc.setProperty("SelectionNamespaces", sNsSet);
- };
- /**
- * A class that reuses the same XSLT stylesheet for multiple transforms.
- * @constructor
- */
- XSLTProcessor = function(){
- if(!_SARISSA_XSLTEMPLATE_PROGID){
- _SARISSA_XSLTEMPLATE_PROGID =
Sarissa.pickRecentProgID(["Msxml2.XSLTemplate.6.0",
"MSXML2.XSLTemplate.3.0"]);
- }
- this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);
- this.processor = null;
- };
- /**
- * Imports the given XSLT DOM and compiles it to a reusable transform
- * <b>Note:</b> If the stylesheet was loaded from a URL and contains
xsl:import or xsl:include elements,it will be reloaded to resolve those
- * @argument xslDoc The XSLT DOMDocument to import
- */
- XSLTProcessor.prototype.importStylesheet = function(xslDoc){
- if(!_SARISSA_THREADEDDOM_PROGID){
- _SARISSA_THREADEDDOM_PROGID =
Sarissa.pickRecentProgID(["MSXML2.FreeThreadedDOMDocument.6.0",
"MSXML2.FreeThreadedDOMDocument.3.0"]);
- }
- xslDoc.setProperty("SelectionLanguage", "XPath");
- xslDoc.setProperty("SelectionNamespaces",
"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
- // convert stylesheet to free threaded
- var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID);
- // make included/imported stylesheets work if exist and xsl was originally loaded
from url
- try{
- converted.resolveExternals = true;
- converted.setProperty("AllowDocumentFunction", true);
- }
- catch(e){
- // Ignore. "AllowDocumentFunction" is only supported in MSXML 3.0
SP4 and later.
- }
- if(xslDoc.url && xslDoc.selectSingleNode("//xsl:*[local-name() =
'import' or local-name() = 'include']") != null){
- converted.async = false;
- converted.load(xslDoc.url);
- }
- else {
- converted.loadXML(xslDoc.xml);
- }
- converted.setProperty("SelectionNamespaces",
"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
- var output = converted.selectSingleNode("//xsl:output");
- //this.outputMethod = output ? output.getAttribute("method") :
"html";
- if(output) {
- this.outputMethod = output.getAttribute("method");
- }
- else {
- delete this.outputMethod;
- }
- this.template.stylesheet = converted;
- this.processor = this.template.createProcessor();
- // for getParameter and clearParameters
- this.paramsSet = [];
- };
-
- /**
- * Transform the given XML DOM and return the transformation result as a new DOM
document
- * @argument sourceDoc The XML DOMDocument to transform
- * @return The transformation result as a DOM Document
- */
- XSLTProcessor.prototype.transformToDocument = function(sourceDoc){
- // fix for bug 1549749
- var outDoc;
- if(_SARISSA_THREADEDDOM_PROGID){
- this.processor.input=sourceDoc;
- outDoc=new ActiveXObject(_SARISSA_DOM_PROGID);
- this.processor.output=outDoc;
- this.processor.transform();
- return outDoc;
- }
- else{
- if(!_SARISSA_DOM_XMLWRITER){
- _SARISSA_DOM_XMLWRITER =
Sarissa.pickRecentProgID(["Msxml2.MXXMLWriter.6.0",
"Msxml2.MXXMLWriter.3.0", "MSXML2.MXXMLWriter",
"MSXML.MXXMLWriter", "Microsoft.XMLDOM"]);
- }
- this.processor.input = sourceDoc;
- outDoc = new ActiveXObject(_SARISSA_DOM_XMLWRITER);
- this.processor.output = outDoc;
- this.processor.transform();
- var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
- oDoc.loadXML(outDoc.output+"");
- return oDoc;
- }
- };
-
- /**
- * Transform the given XML DOM and return the transformation result as a new DOM
fragment.
- * <b>Note</b>: The xsl:output method must match the nature of the owner
document (XML/HTML).
- * @argument sourceDoc The XML DOMDocument to transform
- * @argument ownerDoc The owner of the result fragment
- * @return The transformation result as a DOM Document
- */
- XSLTProcessor.prototype.transformToFragment = function (sourceDoc, ownerDoc) {
- this.processor.input = sourceDoc;
- this.processor.transform();
- var s = this.processor.output;
- var f = ownerDoc.createDocumentFragment();
- var container;
- if (this.outputMethod == 'text') {
- f.appendChild(ownerDoc.createTextNode(s));
- } else if (ownerDoc.body && ownerDoc.body.innerHTML) {
- container = ownerDoc.createElement('div');
- container.innerHTML = s;
- while (container.hasChildNodes()) {
- f.appendChild(container.firstChild);
- }
- }
- else {
- var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
- if (s.substring(0, 5) == '<?xml') {
- s = s.substring(s.indexOf('?>') + 2);
- }
- var xml = ''.concat('<my>', s, '</my>');
- oDoc.loadXML(xml);
- container = oDoc.documentElement;
- while (container.hasChildNodes()) {
- f.appendChild(container.firstChild);
- }
- }
- return f;
- };
-
- /**
- * Set global XSLT parameter of the imported stylesheet
- * @argument nsURI The parameter namespace URI
- * @argument name The parameter base name
- * @argument value The new parameter value
- */
- XSLTProcessor.prototype.setParameter = function(nsURI, name, value){
- // make value a zero length string if null to allow clearing
- value = value ? value : "";
- // nsURI is optional but cannot be null
- if(nsURI){
- this.processor.addParameter(name, value, nsURI);
- }else{
- this.processor.addParameter(name, value);
- }
- // update updated params for getParameter
- nsURI = "" + (nsURI || "");
- if(!this.paramsSet[nsURI]){
- this.paramsSet[nsURI] = [];
- }
- this.paramsSet[nsURI][name] = value;
- };
- /**
- * Gets a parameter if previously set by setParameter. Returns null
- * otherwise
- * @argument name The parameter base name
- * @argument value The new parameter value
- * @return The parameter value if reviously set by setParameter, null otherwise
- */
- XSLTProcessor.prototype.getParameter = function(nsURI, name){
- nsURI = "" + (nsURI || "");
- if(this.paramsSet[nsURI] && this.paramsSet[nsURI][name]){
- return this.paramsSet[nsURI][name];
- }else{
- return null;
- }
- };
-
- /**
- * Clear parameters (set them to default values as defined in the stylesheet itself)
- */
- XSLTProcessor.prototype.clearParameters = function(){
- for(var nsURI in this.paramsSet){
- for(var name in this.paramsSet[nsURI]){
- if(nsURI!=""){
- this.processor.addParameter(name, "", nsURI);
- }else{
- this.processor.addParameter(name, "");
- }
- }
- }
- this.paramsSet = [];
- };
-}else{ /* end IE initialization, try to deal with real browsers now ;-) */
- if(Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT){
- /**
- * <p>Ensures the document was loaded correctly, otherwise sets the
- * parseError to -1 to indicate something went wrong. Internal use</p>
- * @private
- */
- Sarissa.__handleLoad__ = function(oDoc){
- Sarissa.__setReadyState__(oDoc, 4);
- };
- /**
- * <p>Attached by an event handler to the load event. Internal
use.</p>
- * @private
- */
- _sarissa_XMLDocument_onload = function(){
- Sarissa.__handleLoad__(this);
- };
- /**
- * <p>Sets the readyState property of the given DOM Document object.
- * Internal use.</p>
- * @memberOf Sarissa
- * @private
- * @argument oDoc the DOM Document object to fire the
- * readystatechange event
- * @argument iReadyState the number to change the readystate property to
- */
- Sarissa.__setReadyState__ = function(oDoc, iReadyState){
- oDoc.readyState = iReadyState;
- oDoc.readystate = iReadyState;
- if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange
== "function") {
- oDoc.onreadystatechange();
- }
- };
-
- Sarissa.getDomDocument = function(sUri, sName){
- var oDoc = document.implementation.createDocument(sUri?sUri:null,
sName?sName:null, null);
- if(!oDoc.onreadystatechange){
-
- /**
- * <p>Emulate IE's onreadystatechange attribute</p>
- */
- oDoc.onreadystatechange = null;
- }
- if(!oDoc.readyState){
- /**
- * <p>Emulates IE's readyState property, which always gives an
integer from 0 to 4:</p>
- * <ul><li>1 == LOADING,</li>
- * <li>2 == LOADED,</li>
- * <li>3 == INTERACTIVE,</li>
- * <li>4 == COMPLETED</li></ul>
- */
- oDoc.readyState = 0;
- }
- oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);
- return oDoc;
- };
- if(window.XMLDocument){
- // do nothing
- }// TODO: check if the new document has content before trying to copynodes, check
for error handling in DOM 3 LS
- else if(Sarissa._SARISSA_HAS_DOM_FEATURE && window.Document &&
!Document.prototype.load && document.implementation.hasFeature('LS',
'3.0')){
- //Opera 9 may get the XPath branch which gives creates XMLDocument, therefore it
doesn't reach here which is good
- /**
- * <p>Factory method to obtain a new DOM Document object</p>
- * @memberOf Sarissa
- * @argument sUri the namespace of the root node (if any)
- * @argument sUri the local name of the root node (if any)
- * @returns a new DOM Document
- */
- Sarissa.getDomDocument = function(sUri, sName){
- var oDoc = document.implementation.createDocument(sUri?sUri:null,
sName?sName:null, null);
- return oDoc;
- };
- }
- else {
- Sarissa.getDomDocument = function(sUri, sName){
- var oDoc = document.implementation.createDocument(sUri?sUri:null,
sName?sName:null, null);
- // looks like safari does not create the root element for some unknown
reason
- if(oDoc && (sUri || sName) && !oDoc.documentElement){
- oDoc.appendChild(oDoc.createElementNS(sUri, sName));
- }
- return oDoc;
- };
- }
- }//if(Sarissa._SARISSA_HAS_DOM_CREATE_DOCUMENT)
-}
-//==========================================
-// Common stuff
-//==========================================
-if(!window.DOMParser){
- if(Sarissa._SARISSA_IS_SAFARI){
- /*
- * DOMParser is a utility class, used to construct DOMDocuments from XML strings
- * @constructor
- */
- DOMParser = function() { };
- /**
- * Construct a new DOM Document from the given XMLstring
- * @param sXml the given XML string
- * @param contentType the content type of the document the given string represents
(one of text/xml, application/xml, application/xhtml+xml).
- * @return a new DOM Document from the given XML string
- */
- DOMParser.prototype.parseFromString = function(sXml, contentType){
- var xmlhttp = new XMLHttpRequest();
- xmlhttp.open("GET", "data:text/xml;charset=utf-8," +
encodeURIComponent(sXml), false);
- xmlhttp.send(null);
- return xmlhttp.responseXML;
- };
- }else if(Sarissa.getDomDocument && Sarissa.getDomDocument() &&
Sarissa.getDomDocument(null, "bar").xml){
- DOMParser = function() { };
- DOMParser.prototype.parseFromString = function(sXml, contentType){
- var doc = Sarissa.getDomDocument();
- doc.loadXML(sXml);
- return doc;
- };
- }
-}
-
-if((typeof(document.importNode) == "undefined") &&
Sarissa._SARISSA_IS_IE){
- try{
- /**
- * Implementation of importNode for the context window document in IE.
- * If <code>oNode</code> is a TextNode,
<code>bChildren</code> is ignored.
- * @param oNode the Node to import
- * @param bChildren whether to include the children of oNode
- * @returns the imported node for further use
- */
- document.importNode = function(oNode, bChildren){
- var tmp;
- if (oNode.nodeName=='#text') {
- return document.createTextNode(oNode.data);
- }
- else {
- var tbody = false;
- if(oNode.nodeName == "tbody" && oNode.parentNode){
- oNode = oNode.parentNode;
- tbody = true;
- }
- else if(oNode.nodeName == "tbody" || oNode.nodeName ==
"tr"){
- tmp = document.createElement("tr");
- }
- else if(oNode.nodeName == "td"){
- tmp = document.createElement("tr");
- }
- else if(oNode.nodeName == "option"){
- tmp = document.createElement("select");
- }
- if(!tmp){
- tmp = document.createElement("div");
- }
- if(bChildren){
- tmp.innerHTML = oNode.xml ? oNode.xml : oNode.outerHTML;
- }else{
- tmp.innerHTML = oNode.xml ? oNode.cloneNode(false).xml :
oNode.cloneNode(false).outerHTML;
- }
- if (tbody) {
- return tmp.firstChild.tBodies[0];
- } else {
- return tmp.getElementsByTagName("*")[0];
- }
- }
- };
- }catch(e){ }
-}
-if(!Sarissa.getParseErrorText){
- /**
- * <p>Returns a human readable description of the parsing error. Usefull
- * for debugging. Tip: append the returned error string in a <pre>
- * element if you want to render it.</p>
- * <p>Many thanks to Christian Stocker for the initial patch.</p>
- * @memberOf Sarissa
- * @argument oDoc The target DOM document
- * @returns The parsing error description of the target Document in
- * human readable form (preformated text)
- */
- Sarissa.getParseErrorText = function (oDoc){
- var parseErrorText = Sarissa.PARSED_OK;
- if(!oDoc.documentElement){
- parseErrorText = Sarissa.PARSED_EMPTY;
- } else if(oDoc.documentElement.tagName == "parsererror"){
- parseErrorText = oDoc.documentElement.firstChild.data;
- parseErrorText += "\n" +
oDoc.documentElement.firstChild.nextSibling.firstChild.data;
- } else if(oDoc.getElementsByTagName("parsererror").length > 0){
- var parsererror = oDoc.getElementsByTagName("parsererror")[0];
- parseErrorText = Sarissa.getText(parsererror, true)+"\n";
- } else if(oDoc.parseError && oDoc.parseError.errorCode != 0){
- parseErrorText = Sarissa.PARSED_UNKNOWN_ERROR;
- }
- return parseErrorText;
- };
-}
-/**
- * Get a string with the concatenated values of all string nodes under the given node
- * @memberOf Sarissa
- * @argument oNode the given DOM node
- * @argument deep whether to recursively scan the children nodes of the given node for
text as well. Default is <code>false</code>
- */
-Sarissa.getText = function(oNode, deep){
- var s = "";
- var nodes = oNode.childNodes;
- for(var i=0; i < nodes.length; i++){
- var node = nodes[i];
- var nodeType = node.nodeType;
- if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){
- s += node.data;
- } else if(deep === true && (nodeType == Node.ELEMENT_NODE || nodeType ==
Node.DOCUMENT_NODE || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){
- s += Sarissa.getText(node, true);
- }
- }
- return s;
-};
-if(!window.XMLSerializer && Sarissa.getDomDocument &&
Sarissa.getDomDocument("","foo", null).xml){
- /**
- * Utility class to serialize DOM Node objects to XML strings
- * @constructor
- */
- XMLSerializer = function(){};
- /**
- * Serialize the given DOM Node to an XML string
- * @param oNode the DOM Node to serialize
- */
- XMLSerializer.prototype.serializeToString = function(oNode) {
- return oNode.xml;
- };
-}
-
-/**
- * Strips tags from the given markup string. If the given string is
- * <code>undefined</code>, <code>null</code> or empty, it is
returned as is.
- * @memberOf Sarissa
- */
-Sarissa.stripTags = function (s) {
- return s?s.replace(/<[^>]+>/g,""):s;
-};
-/**
- * <p>Deletes all child nodes of the given node</p>
- * @memberOf Sarissa
- * @argument oNode the Node to empty
- */
-Sarissa.clearChildNodes = function(oNode) {
- // need to check for firstChild due to opera 8 bug with hasChildNodes
- while(oNode.firstChild) {
- oNode.removeChild(oNode.firstChild);
- }
-};
-/**
- * <p> Copies the childNodes of nodeFrom to nodeTo</p>
- * <p> <b>Note:</b> The second object's original content is deleted
before
- * the copy operation, unless you supply a true third parameter</p>
- * @memberOf Sarissa
- * @argument nodeFrom the Node to copy the childNodes from
- * @argument nodeTo the Node to copy the childNodes to
- * @argument bPreserveExisting whether to preserve the original content of nodeTo,
default is false
- */
-Sarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
- if(Sarissa._SARISSA_IS_SAFARI && nodeTo.nodeType == Node.DOCUMENT_NODE){ //
SAFARI_OLD ??
- nodeTo = nodeTo.documentElement; //Apparently there's a bug in safari where you
can't appendChild to a document node
- }
-
- if((!nodeFrom) || (!nodeTo)){
- throw "Both source and destination nodes must be provided";
- }
- if(!bPreserveExisting){
- Sarissa.clearChildNodes(nodeTo);
- }
- var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo :
nodeTo.ownerDocument;
- var nodes = nodeFrom.childNodes;
- var i;
- if(typeof(ownerDoc.importNode) != "undefined") {
- for(i=0;i < nodes.length;i++) {
- nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
- }
- } else {
- for(i=0;i < nodes.length;i++) {
- nodeTo.appendChild(nodes[i].cloneNode(true));
- }
- }
-};
-
-/**
- * <p> Moves the childNodes of nodeFrom to nodeTo</p>
- * <p> <b>Note:</b> The second object's original content is deleted
before
- * the move operation, unless you supply a true third parameter</p>
- * @memberOf Sarissa
- * @argument nodeFrom the Node to copy the childNodes from
- * @argument nodeTo the Node to copy the childNodes to
- * @argument bPreserveExisting whether to preserve the original content of nodeTo,
default is
- */
-Sarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
- if((!nodeFrom) || (!nodeTo)){
- throw "Both source and destination nodes must be provided";
- }
- if(!bPreserveExisting){
- Sarissa.clearChildNodes(nodeTo);
- }
- var nodes = nodeFrom.childNodes;
- // if within the same doc, just move, else copy and delete
- if(nodeFrom.ownerDocument == nodeTo.ownerDocument){
- while(nodeFrom.firstChild){
- nodeTo.appendChild(nodeFrom.firstChild);
- }
- } else {
- var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo :
nodeTo.ownerDocument;
- var i;
- if(typeof(ownerDoc.importNode) != "undefined") {
- for(i=0;i < nodes.length;i++) {
- nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
- }
- }else{
- for(i=0;i < nodes.length;i++) {
- nodeTo.appendChild(nodes[i].cloneNode(true));
- }
- }
- Sarissa.clearChildNodes(nodeFrom);
- }
-};
-
-/**
- * <p>Serialize any <strong>non</strong> DOM object to an XML string.
All properties are serialized using the property name
- * as the XML element name. Array elements are rendered as
<code>array-item</code> elements,
- * using their index/key as the value of the <code>key</code>
attribute.</p>
- * @memberOf Sarissa
- * @argument anyObject the object to serialize
- * @argument objectName a name for that object
- * @return the XML serialization of the given object as a string
- */
-Sarissa.xmlize = function(anyObject, objectName, indentSpace){
- indentSpace = indentSpace?indentSpace:'';
- var s = indentSpace + '<' + objectName + '>';
- var isLeaf = false;
- if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject
instanceof String || anyObject instanceof Boolean || anyObject instanceof Date){
- s += Sarissa.escape(""+anyObject);
- isLeaf = true;
- }else{
- s += "\n";
- var isArrayItem = anyObject instanceof Array;
- for(var name in anyObject){
- s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item
key=\""+name+"\"":name), indentSpace + " ");
- }
- s += indentSpace;
- }
- return (s += (objectName.indexOf('
')!=-1?"</array-item>\n":"</" + objectName +
">\n"));
-};
-
-/**
- * Escape the given string chacters that correspond to the five predefined XML entities
- * @memberOf Sarissa
- * @param sXml the string to escape
- */
-Sarissa.escape = function(sXml){
- return sXml.replace(/&/g, "&").replace(/</g,
"<").replace(/>/g, ">").replace(/"/g,
""").replace(/'/g, "'");
-};
-
-/**
- * Unescape the given string. This turns the occurences of the predefined XML
- * entities to become the characters they represent correspond to the five predefined XML
entities
- * @memberOf Sarissa
- * @param sXml the string to unescape
- */
-Sarissa.unescape = function(sXml){
- return
sXml.replace(/'/g,"'").replace(/"/g,"\"").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&");
-};
-
-/** @private */
-Sarissa.updateCursor = function(oTargetElement, sValue) {
- if(oTargetElement && oTargetElement.style &&
oTargetElement.style.cursor != undefined ){
- oTargetElement.style.cursor = sValue;
- }
-};
-
-/**
- * Asynchronously update an element with response of a GET request on the given URL.
Passing a configured XSLT
- * processor will result in transforming and updating oNode before using it to update
oTargetElement.
- * You can also pass a callback function to be executed when the update is finished. The
function will be called as
- * <code>functionName(oNode, oTargetElement);</code>
- * @memberOf Sarissa
- * @param sFromUrl the URL to make the request to
- * @param oTargetElement the element to update
- * @param xsltproc (optional) the transformer to use on the returned
- * content before updating the target element with it
- * @param callback (optional) a Function object to execute once the update is finished
successfuly, called as <code>callback(sFromUrl, oTargetElement)</code>.
- * In case an exception is thrown during execution, the callback is called as
called as <code>callback(sFromUrl, oTargetElement, oException)</code>
- * @param skipCache (optional) whether to skip any cache
- */
-Sarissa.updateContentFromURI = function(sFromUrl, oTargetElement, xsltproc, callback,
skipCache) {
- try{
- Sarissa.updateCursor(oTargetElement, "wait");
- var xmlhttp = new XMLHttpRequest();
- xmlhttp.open("GET", sFromUrl, true);
- xmlhttp.onreadystatechange = function() {
- if (xmlhttp.readyState == 4) {
- try{
- var oDomDoc = xmlhttp.responseXML;
- if(oDomDoc && Sarissa.getParseErrorText(oDomDoc) ==
Sarissa.PARSED_OK){
- Sarissa.updateContentFromNode(xmlhttp.responseXML, oTargetElement,
xsltproc);
- callback(sFromUrl, oTargetElement);
- }
- else{
- throw Sarissa.getParseErrorText(oDomDoc);
- }
- }
- catch(e){
- if(callback){
- callback(sFromUrl, oTargetElement, e);
- }
- else{
- throw e;
- }
- }
- }
- };
- if (skipCache) {
- var oldage = "Sat, 1 Jan 2000 00:00:00 GMT";
- xmlhttp.setRequestHeader("If-Modified-Since", oldage);
- }
- xmlhttp.send("");
- }
- catch(e){
- Sarissa.updateCursor(oTargetElement, "auto");
- if(callback){
- callback(sFromUrl, oTargetElement, e);
- }
- else{
- throw e;
- }
- }
-};
-
-/**
- * Update an element's content with the given DOM node. Passing a configured XSLT
- * processor will result in transforming and updating oNode before using it to update
oTargetElement.
- * You can also pass a callback function to be executed when the update is finished. The
function will be called as
- * <code>functionName(oNode, oTargetElement);</code>
- * @memberOf Sarissa
- * @param oNode the URL to make the request to
- * @param oTargetElement the element to update
- * @param xsltproc (optional) the transformer to use on the given
- * DOM node before updating the target element with it
- */
-Sarissa.updateContentFromNode = function(oNode, oTargetElement, xsltproc) {
- try {
- Sarissa.updateCursor(oTargetElement, "wait");
- Sarissa.clearChildNodes(oTargetElement);
- // check for parsing errors
- var ownerDoc = oNode.nodeType == Node.DOCUMENT_NODE?oNode:oNode.ownerDocument;
- if(ownerDoc.parseError && ownerDoc.parseError.errorCode != 0) {
- var pre = document.createElement("pre");
-
pre.appendChild(document.createTextNode(Sarissa.getParseErrorText(ownerDoc)));
- oTargetElement.appendChild(pre);
- }
- else {
- // transform if appropriate
- if(xsltproc) {
- oNode = xsltproc.transformToDocument(oNode);
- }
- // be smart, maybe the user wants to display the source instead
- if(oTargetElement.tagName.toLowerCase() == "textarea" ||
oTargetElement.tagName.toLowerCase() == "input") {
- oTargetElement.value = new XMLSerializer().serializeToString(oNode);
- }
- else {
- // ok that was not smart; it was paranoid. Keep up the good work by
trying to use DOM instead of innerHTML
- if(oNode.nodeType == Node.DOCUMENT_NODE ||
oNode.ownerDocument.documentElement == oNode) {
- oTargetElement.innerHTML = new
XMLSerializer().serializeToString(oNode);
- }
- else{
-
oTargetElement.appendChild(oTargetElement.ownerDocument.importNode(oNode, true));
- }
- }
- }
- }
- catch(e) {
- throw e;
- }
- finally{
- Sarissa.updateCursor(oTargetElement, "auto");
- }
-};
-
-
-/**
- * Creates an HTTP URL query string from the given HTML form data
- * @memberOf Sarissa
- */
-Sarissa.formToQueryString = function(oForm){
- var qs = "";
- for(var i = 0;i < oForm.elements.length;i++) {
- var oField = oForm.elements[i];
- var sFieldName = oField.getAttribute("name") ?
oField.getAttribute("name") : oField.getAttribute("id");
- // ensure we got a proper name/id and that the field is not disabled
- if(sFieldName &&
- ((!oField.disabled) || oField.type == "hidden")) {
- switch(oField.type) {
- case "hidden":
- case "text":
- case "textarea":
- case "password":
- qs += sFieldName + "=" + encodeURIComponent(oField.value) +
"&";
- break;
- case "select-one":
- qs += sFieldName + "=" +
encodeURIComponent(oField.options[oField.selectedIndex].value) + "&";
- break;
- case "select-multiple":
- for (var j = 0; j < oField.length; j++) {
- var optElem = oField.options[j];
- if (optElem.selected === true) {
- qs += sFieldName + "[]" + "=" +
encodeURIComponent(optElem.value) + "&";
- }
- }
- break;
- case "checkbox":
- case "radio":
- if(oField.checked) {
- qs += sFieldName + "=" +
encodeURIComponent(oField.value) + "&";
- }
- break;
- }
- }
- }
- // return after removing last '&'
- return qs.substr(0, qs.length - 1);
-};
-
-
-/**
- * Asynchronously update an element with response of an XMLHttpRequest-based emulation of
a form submission. <p>The form <code>action</code> and
- * <code>method</code> attributess will be followed. Passing a configured
XSLT processor will result in
- * transforming and updating the server response before using it to update the target
element.
- * You can also pass a callback function to be executed when the update is finished. The
function will be called as
- * <code>functionName(oNode, oTargetElement);</code></p>
- * <p>Here is an example of using this in a form element:</p>
- * <pre name="code" class="xml">
- * <div id="targetId"> this content will be
updated</div>
- * <form action="/my/form/handler" method="post"
- * onbeforesubmit="return Sarissa.updateContentFromForm(this,
document.getElementById('targetId'));"><pre>
- * <p>If JavaScript is supported, the form will not be submitted. Instead, Sarissa
will
- * scan the form and make an appropriate AJAX request, also adding a parameter
- * to signal to the server that this is an AJAX call. The parameter is
- * constructed as <code>Sarissa.REMOTE_CALL_FLAG = "=true"</code>
so you can change the name in your webpage
- * simply by assigning another value to Sarissa.REMOTE_CALL_FLAG. If JavaScript is not
supported
- * the form will be submitted normally.
- * @memberOf Sarissa
- * @param oForm the form submition to emulate
- * @param oTargetElement the element to update
- * @param xsltproc (optional) the transformer to use on the returned
- * content before updating the target element with it
- * @param callback (optional) a Function object to execute once the update is finished
successfuly, called as <code>callback(oNode, oTargetElement)</code>.
- * In case an exception occurs during excecution and a callback function was
provided, the exception is cought and the callback is called as
- * <code>callback(oForm, oTargetElement, exception)</code>
- */
-Sarissa.updateContentFromForm = function(oForm, oTargetElement, xsltproc, callback) {
- try{
- Sarissa.updateCursor(oTargetElement, "wait");
- // build parameters from form fields
- var params = Sarissa.formToQueryString(oForm) + "&" +
Sarissa.REMOTE_CALL_FLAG + "=true";
- var xmlhttp = new XMLHttpRequest();
- var bUseGet = oForm.getAttribute("method") &&
oForm.getAttribute("method").toLowerCase() == "get";
- if(bUseGet) {
- xmlhttp.open("GET",
oForm.getAttribute("action")+"?"+params, true);
- }
- else{
- xmlhttp.open('POST', oForm.getAttribute("action"), true);
- xmlhttp.setRequestHeader("Content-type",
"application/x-www-form-urlencoded");
- xmlhttp.setRequestHeader("Content-length", params.length);
- xmlhttp.setRequestHeader("Connection", "close");
- }
- xmlhttp.onreadystatechange = function() {
- try{
- if (xmlhttp.readyState == 4) {
- var oDomDoc = xmlhttp.responseXML;
- if(oDomDoc && Sarissa.getParseErrorText(oDomDoc) ==
Sarissa.PARSED_OK){
- Sarissa.updateContentFromNode(xmlhttp.responseXML, oTargetElement,
xsltproc);
- callback(oForm, oTargetElement);
- }
- else{
- throw Sarissa.getParseErrorText(oDomDoc);
- }
- }
- }
- catch(e){
- if(callback){
- callback(oForm, oTargetElement, e);
- }
- else{
- throw e;
- }
- }
- };
- xmlhttp.send(bUseGet?"":params);
- }
- catch(e){
- Sarissa.updateCursor(oTargetElement, "auto");
- if(callback){
- callback(oForm, oTargetElement, e);
- }
- else{
- throw e;
- }
- }
- return false;
-};
-
-// EOF
-// Global Variables
-// var timeout = null;
-
-// TODO - use sarissa for standard XMLHttpRequest Support.
-
-
-// AJAX-JSF AJAX-like library, for communicate with view Tree on server side.
-
-// Modified by Alexander J. Smirnov to use as JSF AJAX-like components.
-
-A4J.AJAX = {};
-
-/**
- * XMLHttp transport class - incapsulate most of client-specifiv functions for call
server requests.
- */
-A4J.AJAX.XMLHttpRequest = function(query){
- this._query = query;
-
- // Store document element, to check page replacement.
- this._documentElement = window.document.documentElement;
- };
-
-A4J.AJAX.XMLHttpRequest.prototype = {
- _query : null,
- _timeout : 0,
- _timeoutID : null,
- onready : null,
- _parsingStatus : Sarissa.PARSED_EMPTY,
- _errorMessage : "XML Response object not set",
- _contentType : null,
- _onerror : function(req,status,message) {
- // Status not 200 - error !
- // window.alert(message);
- if(status !=599 && req.getResponseText()){
- A4J.AJAX.replacePage(req);
- }
- },
- onfinish : null,
- options : {},
- domEvt : null,
- form : null,
- _request : null,
- _aborted : false,
- _documentElement : null,
- setRequestTimeout : function(timeout){
- this._timeout = timeout;
- },
- /**
- * Send request to server with parameters from query ( POST or GET depend on client type
)
- */
- send : function(){
- this._request = new XMLHttpRequest();
- var _this = this;
- this._request.onreadystatechange = function(){
- if(window.document.documentElement != _this._documentElement){
- LOG.warn("Page for current request have been unloaded - abort
processing" );
- _this.abort();
- return;
- };
- if(_this._aborted){
- return;
- };
- LOG.debug("Reqest state : "+_this._request.readyState );
- if (_this._request.readyState == 4 ) {
- LOG.debug("Reqest end with state 4");
- if(_this._timeoutID){
- window.clearTimeout(_this._timeoutID);
- }
- var requestStatus;
- var requestStatusText;
- try{
- requestStatus = _this._request.status;
- requestStatusText = _this._request.statusText;
- } catch(e){
- LOG.error("request don't have status code - network problem,
"+e.message);
- requestStatus = 599;
- requestStatusText = "Network error";
- }
- if(requestStatus == 200){
- try {
- LOG.debug("Response with content-type: "+
_this.getResponseHeader('Content-Type'));
- LOG.debug("Full response content: ", _this.getResponseText());
- } catch(e) {
- // IE Can throw exception for any responses
- }
- // Prepare XML, if exist.
- if(_this._request.responseXML ){
- _this._parsingStatus =
Sarissa.getParseErrorText(_this._request.responseXML);
- if(_this._parsingStatus == Sarissa.PARSED_OK &&
Sarissa.setXpathNamespaces ){
-
Sarissa.setXpathNamespaces(_this._request.responseXML,"xmlns='ht...;
- }
- }
- if(_this.onready){
- _this.onready(_this);
- }
-
- } else {
- _this._errorMessage = "Reqest error, status : "+requestStatus
+" " + requestStatusText ;
- LOG.error(_this._errorMessage);
- if(typeof(_this._onerror) == "function"){
- _this._onerror(_this,requestStatus,_this._errorMessage);
- }
- if (_this.onfinish)
- {
- _this.onfinish(_this);
- }
- }
-
- _this = undefined;
- }
- }; //this._onReady;
- try{
- LOG.debug("Start XmlHttpRequest");
- this._request.open('POST', this._query.getActionUrl("") , true);
- // Query use utf-8 encoding for prepare urlencode data, force request content-type
and charset.
- var contentType = "application/x-www-form-urlencoded; charset=UTF-8";
- this._request.setRequestHeader( "Content-Type", contentType);
- } catch(e){
- // Opera 7-8 - force get
- LOG.debug("XmlHttpRequest not support setRequestHeader - use GET instead of
POST");
- this._request.open('GET',
this._query.getActionUrl("")+"?"+this._query.getQueryString() ,
true);
- }
- // send data.
- this._request.send(this._query.getQueryString());
- if(this._timeout > 0){
- this._timeoutID = window.setTimeout(function(){
- LOG.warn("request stopped due to timeout");
- if(!_this._aborted){
- A4J.AJAX.status(_this.containerId,_this.options.status,false);
- if(typeof(A4J.AJAX.onAbort) == "function"){
- A4J.AJAX.onAbort(_this);
- }
- }
- _this._aborted=true;
- _this._request.abort();
- if(_this._onerror){
- _this._errorMessage = "Request timeout";
- _this._onerror(_this,500,_this._errorMessage);
- }
- if(_this.onfinish){
- _this.onfinish(_this);
- }
- _this._request=undefined;
- _this = undefined;
- },this._timeout);
- }
- },
-
- abort: function(){
- if(!this._aborted){
- A4J.AJAX.status(this.containerId,this.options.status,false);
- if(typeof(A4J.AJAX.onAbort) == "function"){
- A4J.AJAX.onAbort(this);
- }
- }
- this._aborted=true;
- if(this._request){
- try{
-// this._request.abort();
- if(this._timeoutID){
- window.clearTimeout(this._timeoutID);
- }
- } catch (e){
- LOG.warn("Exception for abort current request "+e.Message);
- }
- }
- },
- getResponseText : function(){
- try {
- return this._request.responseText;
- } catch(e){
- return null;
- }
- },
- getError : function(){
- return this._errorMessage;
- },
- getParserStatus : function(){
- return this._parsingStatus;
- },
- getContentType : function(){
- if(!this._contentType){
- var contentType = this.getResponseHeader('Content-Type');
- if(contentType){
- var i = contentType.indexOf(';');
- if( i >= 0 ){
- this._contentType = contentType.substring(0,i);
- } else {
- this._contentType = contentType;
- }
- } else {
- this._contentType="text/html";
- }
- }
- return this._contentType;
- },
- getResponseHeader : function(name){
- var result;
- // Different behavior - for non-existing headers, Firefox throws exception,
- // IE return "" ,
- try{
- result = this._request.getResponseHeader(name);
- if(result === ""){
- result = undefined;
- }
- } catch(e) {
- }
- if(!result){
- // Header not exist or Opera <=8.0 error. Try to find <meta > tag with same
name.
- LOG.debug("Header "+name+" not found, search in <meta>");
- if(this._parsingStatus == Sarissa.PARSED_OK){
- var metas = this.getElementsByTagName("meta");
- for(var i = 0; i < metas.length;i++){
- var meta = metas[i];
- LOG.debug("Find <meta
name='"+meta.getAttribute('name')+"'
content='"+meta.getAttribute('content')+"'>");
- if(meta.getAttribute("name") == name){
- result = meta.getAttribute("content");
- break;
- }
- }
- }
-
- }
- return result;
- },
- /**
- * get elements with elementname in responseXML or, if present - in element.
- */
- getElementsByTagName : function(elementname,element){
- if(!element){
- element = this._request.responseXML;
- }
- LOG.debug("search for elements by name '"+elementname+"'
"+" in element "+element.nodeName);
- var elements;
- try
- {
- elements = element.selectNodes(".//*[local-name()=\""+
- elementname +"\"]");
- }
- catch (ex) {
- try {
- elements = element.getElementsByTagName(elementname);
- } catch(nf){
- LOG.debug("getElementsByTagName found no elements, "+nf.Message);
- }
- }
-// return document.getElementsByTagName(tagName);
-// elements =
element.getElementsByTagNameNS("http://www.w3.org/1999/xhtml",e...;
-// LOG.debug("getElementsByTagNameNS found "+elements.length);
- return elements;
- },
- /**
- * Find element in response by ID. Since in IE response not validated, use
selectSingleNode instead.
- */
- getElementById : function(id){
- // first attempt - .getElementById.
- var oDoc = this._request.responseXML;
- if(oDoc){
- if(typeof(oDoc.getElementById) != 'undefined') {
- LOG.debug("call getElementById for id= "+id);
- return oDoc.getElementById(id);
- }
- else if(typeof(oDoc.selectSingleNode) != "undefined") {
- LOG.debug("call selectSingleNode for id= "+id);
- return oDoc.selectSingleNode("//*[@id='"+id+"']"); /*
XPATH istead of ID */
- }
- // nodeFromID not worked since XML validation disabled by
- // default for MS
- else if(typeof(oDoc.nodeFromID) != "undefined") {
- LOG.debug("call nodeFromID for id= "+id);
- return oDoc.nodeFromID(id);
- }
- LOG.error("No functions for getElementById found ");
- } else {
- LOG.debug("No parsed XML document in response");
- }
- return null;
-
- },
-
- getJSON : function(id){
- var data;
- var dataElement = this.getElementById(id);
- if(dataElement){
- try {
- data = Sarissa.getText(dataElement,true);
- data = window.eval('('+data+')');
- } catch(e){
- LOG.error("Error on parsing JSON data "+e.message,data);
- }
- }
- return data;
- },
-
- _evaluateScript: function(node) {
- var includeComments = !A4J.AJAX.isXhtmlScriptMode();
- var newscript = A4J.AJAX.getText(node, includeComments) ; // TODO - Mozilla disable
innerHTML in XML page ..."";
-
- try {
- LOG.debug("Evaluate script replaced area in document: ", newscript);
- if (window.execScript) {
- window.execScript( newscript );
- } else {
- window.eval(newscript);
- }
- LOG.debug("Script evaluation succeeded");
- } catch(e){
- LOG.error("ERROR Evaluate script: Error name: " + e.name +
e.message?". Error message: "+e.message:"");
- }
- },
-
- evaluateQueueScript: function() {
- var queueScript = this.getElementById('org.ajax4jsf.queue_script');
- if (queueScript) {
- this._evaluateScript(queueScript);
- }
- },
-
- evalScripts : function(node, isLast){
- var newscripts = this.getElementsByTagName("script",node);
- LOG.debug("Scripts in updated part count : " + newscripts.length);
- if( newscripts.length > 0 ){
- var _this = this;
- window.setTimeout(function() {
- for (var i = 0; i < newscripts.length; i++){
- _this._evaluateScript(newscripts[i]);
- }
- newscripts = null;
- if (isLast)
- {
- _this.doFinish();
- }
- _this = undefined;
- }, 0);
- } else
- {
- if (isLast)
- {
- this.doFinish();
- }
- }
- },
-
- /**
- * Update DOM element with given ID by element with same ID in parsed responseXML
- */
- updatePagePart : function(id, isLast){
- var newnode = this.getElementById(id);
- if( ! newnode )
- {
- LOG.error("New node for ID "+id+" is not present in response");
- if (isLast)
- {
- this.doFinish();
- }
- return;
- }
- var oldnode = window.document.getElementById(id);
- if ( oldnode ) {
-
- // Remove unload prototype events for a removed elements.
- if (window.RichFaces && window.RichFaces.Memory) {
- window.RichFaces.Memory.clean(oldnode, true);
- }
-
- var anchor = oldnode.parentNode;
- if(!window.opera && oldnode.outerHTML && !oldnode.tagName.match(
/(tbody|thead|tfoot|tr|th|td)/i ) ){
- LOG.debug("Replace content of node by outerHTML()");
- try {
- oldnode.innerHTML = "";
- } catch(e){
- LOG.error("Error to clear node content by innerHTML
"+e.message);
- Sarissa.clearChildNodes(oldnode);
- }
- oldnode.outerHTML = new XMLSerializer().serializeToString(newnode);
- } else {
- // need to check for firstChild due to opera 8 bug with hasChildNodes
- Sarissa.clearChildNodes(oldnode);
- var importednode = window.document.importNode(newnode, true);
- //importednode.innerHTML = importednode.innerHTML;
- LOG.debug("Replace content of node by replaceChild()");
- anchor.replaceChild(importednode,oldnode);
- }
-
- // re-execute all script fragments in imported subtree...
- // TODO - opera 8 run scripts at replace content stage.
- if(!A4J.AJAX._scriptEvaluated){
- this.evalScripts(newnode, isLast);
- }
- LOG.debug("Update part of page for Id: "+id + "
successful");
- } else {
- LOG.warn("Node for replace by response with id "+id+" not found in
document");
- if (!A4J.AJAX._scriptEvaluated && isLast)
- {
- this.doFinish();
- }
- }
-
- if (A4J.AJAX._scriptEvaluated && isLast)
- {
- this.doFinish();
- }
-
- },
-
- doFinish: function() {
- if(this.onfinish){
- this.onfinish(this);
- }
- },
-
- appendNewHeadElements : function(callback){
- // Append scripts and styles to head, if not presented in page before.
- var includes =
this._appendNewElements("script","src",null,null,["type","language","charset"]);
-
- var _this = this;
- includes.concat(
this._appendNewElements("link","href","class",["component","user"],["type","rev","media"],{"class":
"className"},
- function (element, script) {
- //IE requires to re-set rel or href after insertion to initialize correctly
- //see
http://jira.jboss.com/jira/browse/RF-1627#action_12394642
- _this._copyAttribute(element,script,"rel");
- }
- ));
-
- if ( includes.length == 0) {
- callback();
- return;
- }
-
- A4J.AJAX.headElementsCounter = includes.length;
-
- var onReadyStateChange = function () {
- if (this.readyState == 'loaded' || this.readyState == 'complete') {
- this.onreadystatechange = null;
- this.onload = null;
- callback();
- }
- };
- var onLoad = function () {
- this.onreadystatechange = null;
- this.onload = null;
- callback();
- };
- for (var i = 0; i<includes.length; i++)
- {
- includes[i].onreadystatechange = onReadyStateChange;
- includes[i].onload = onLoad;
- }
- },
-
- _appendNewElements : function(tag,href,role,roles,attributes,mappings,callback){
- var head =
document.getElementsByTagName("head")[0]||document.documentElement;
- var newscripts = this.getElementsByTagName(tag);
- var oldscripts = document.getElementsByTagName(tag);
- var mappedRole = (mappings && mappings[role]) || role;
- var elements = [];
-
- var roleAnchors = {};
- if (roles) {
- var i = 0;
-
- for(var j = 0; j < oldscripts.length; j++){
- var oldscript = oldscripts[j];
- var scriptRole = oldscript[mappedRole];
-
- for ( ; i < roles.length && roles[i] != scriptRole; i++) {
- roleAnchors[roles[i]] = oldscript;
- }
-
- if (i == roles.length) {
- break;
- }
- }
- }
-
- for(var i=0 ; i<newscripts.length;i++){
- var element = newscripts[i];
- var src = element.getAttribute(href);
- var elementRole;
-
- if (roles) {
- elementRole = element.getAttribute(role);
- }
-
- if(src){
- var exist = false;
- LOG.debug("<"+tag+"> in response with
src="+src);
- for(var j = 0 ; j < oldscripts.length; j++){
- if(this._noSessionHref(src) ==
this._noSessionHref(oldscripts[j].getAttribute(href))){
- LOG.debug("Such element exist in document");
-
- if (role) {
- var oldRole = oldscripts[j][mappedRole];
- if ((!elementRole ^ !oldRole) || (elementRole && oldRole
&& elementRole != oldRole)) {
- LOG.warn("Roles are different");
- }
- }
-
- exist = true;
- break;
- }
- }
- if(!exist){
- // var script = window.document.importNode(element,true); //
- var script = document.createElement(tag);
- script.setAttribute(href,src);
- for(var j = 0 ; j < attributes.length; j++){
- this._copyAttribute(element,script,attributes[j]);
- }
-
- if (elementRole) {
- script[mappedRole] = elementRole;
- }
-
- LOG.debug("append element to document");
-
- for ( var j = 0; j < A4J.AJAX._headTransformers.length; j++) {
- A4J.AJAX._headTransformers[j](script);
- }
-
- var anchor = roleAnchors[elementRole];
- if (anchor && anchor.parentNode) {
- anchor.parentNode.insertBefore(script, anchor);
- } else {
- head.appendChild(script);
- }
-
- if (callback) {
- callback(element,script);
- }
- if (tag!="link" ||
script.type.toLowerCase()=="text/javascript") elements.push(script);
- }
- }
- }
- return elements;
- },
-
- _noSessionHref : function(href){
- var cref = href;
- if(href){
- var sessionid = href.lastIndexOf(";jsessionid=");
- if(sessionid>0){
- cref = href.substring(0,sessionid);
- var params = href.lastIndexOf("?");
- if(params>sessionid){
- cref=cref+href.substring(params);
- }
- }
- }
- return cref;
- },
-
- _copyAttribute : function(src,dst,attr){
- var value = src.getAttribute(attr);
- if(value){
- dst.setAttribute(attr,value);
- }
- }
-
-};
-
-//Listeners should be notified
-A4J.AJAX.Listener = function(onafterajax){
- this.onafterajax = onafterajax;
-};
-
-A4J.AJAX.AjaxListener = function(type, callback){
- this[type] = callback;
-};
-
-A4J.AJAX._listeners= [];
-A4J.AJAX.AddListener = function(listener){
- A4J.AJAX._listeners.push(listener);
-};
-A4J.AJAX.removeListeners = function(listener){
- A4J.AJAX._listeners = [];
-};
-A4J.AJAX.removeListener = function(listener){
- for (var i=A4J.AJAX._listeners.length-1;i>=0;i--){
- if (A4J.AJAX._listeners[i] == listener){
- A4J.AJAX._listeners.splice(i,1);
- }
- }
-};
-
-
-//head element transformers
-A4J.AJAX.HeadElementTransformer = function(elt){
- this.elt = elt;
-};
-
-A4J.AJAX._headTransformers = [];
-A4J.AJAX.AddHeadElementTransformer = function(listener){
- A4J.AJAX._headTransformers.push(listener);
-};
-
-A4J.AJAX.SetZeroRequestDelay = function(options) {
- if (typeof options.requestDelay == "undefined") {
- options.requestDelay = 0;
- }
-};
-
-// pollers timerId's
-A4J.AJAX._pollers = {};
-/*
- *
- *
- */
-A4J.AJAX.Poll = function( containerId, form, options ) {
- A4J.AJAX.StopPoll(options.pollId);
- if(!options.onerror){
- options.onerror = function(req,status,message){
- if(typeof(A4J.AJAX.onError)== "function"){
- A4J.AJAX.onError(req,status,message);
- }
- // For error, re-submit request.
- A4J.AJAX.Poll(containerId,form,options);
- };
- }
-
- if (!options.onqueuerequestdrop) {
- options.onqueuerequestdrop = function() {
- A4J.AJAX.Poll(containerId,form,options);
- };
- }
-
- A4J.AJAX.SetZeroRequestDelay(options);
-
- A4J.AJAX._pollers[options.pollId] = window.setTimeout(function(){
- A4J.AJAX._pollers[options.pollId]=undefined;
- if((typeof(options.onsubmit) == 'function') &&
(options.onsubmit()==false)){
- // Onsubmit disable current poll, start next interval.
- A4J.AJAX.Poll(containerId,form,options);
- } else {
- A4J.AJAX.Submit(containerId,form,null,options);
- }
- },options.pollinterval);
-};
-
-A4J.AJAX.StopPoll = function( Id ) {
- if(A4J.AJAX._pollers[Id]){
- window.clearTimeout(A4J.AJAX._pollers[Id]);
- A4J.AJAX._pollers[Id] = undefined;
- }
-};
-
-/*
- *
- *
- */
-A4J.AJAX.Push = function( containerId, form, options ) {
- A4J.AJAX.StopPush(options.pushId);
- options.onerror = function(){
- // For error, re-submit request.
- A4J.AJAX.Push(containerId,form,options);
- };
-
- options.onqueuerequestdrop = function() {
- LOG.debug("Push main request dropped from queue");
- };
-
- A4J.AJAX._pollers[options.pushId] = window.setTimeout(function(){
- var request = new XMLHttpRequest();
- request.onreadystatechange = function(){
- if (request.readyState == 4 ) {
- try {
- if(request.status == 200){
-
if(request.getResponseHeader("Ajax-Push-Status")=="READY"){
- A4J.AJAX.SetZeroRequestDelay(options);
- A4J.AJAX.Submit(containerId,form||options.dummyForm,null,options);
- }
- }
- } catch(e){
- // Network error.
- }
- // Clear variables.
- request=null;
- A4J.AJAX._pollers[options.pushId] = null;
- // Re-send request.
- A4J.AJAX.Push( containerId, form, options );
- }
- }
- A4J.AJAX.SendPush( request,options );
- },options.pushinterval);
-};
-
-A4J.AJAX.SendPush = function( request,options ) {
- var url = options.pushUrl || options.actionUrl;
- request.open('HEAD', url , true);
- request.setRequestHeader( "Ajax-Push-Key", options.pushId);
- if(options.timeout){
- request.setRequestHeader( "Timeout", options.timeout);
- }
- request.send(null);
-}
-
-A4J.AJAX.StopPush = function( Id ) {
- if(A4J.AJAX._pollers[Id]){
- window.clearTimeout(A4J.AJAX._pollers[Id]);
- A4J.AJAX._pollers[Id] = null;
- }
-};
-
-
-
-A4J.AJAX.CloneObject = function( obj, noFunctions ) {
- var cloned = {};
- for( var n in obj ){
- if(noFunctions && typeof(evt[prop]) == 'function'){
- continue;
- }
- cloned[n]=obj[n];
- }
- return cloned;
-}
-
-
-A4J.AJAX.SubmitForm = function( containerId, form, options ) {
- var opt = A4J.AJAX.CloneObject(options);
- // Setup active control if form submitted by button.
- if(A4J._formInput){
- LOG.debug("Form submitted by button "+A4J._formInput.id);
- opt.control = A4J._formInput;
- A4J._formInput = null;
- opt.submitByForm=true;
- }
- A4J.AJAX.Submit(containerId,form,null,opt);
-}
-
-/**
- * This method should be deprecated and maybe even removed?
- */
-A4J.AJAX.SubmiteventsQueue = function( eventsQueue ) {
- eventsQueue.submit();
-};
-
-A4J.AJAX.CloneEvent = function(evt) {
- var domEvt;
- evt = evt || window.event || null;
- if(evt){
- // Create copy of event object, since most of properties undefined outside of event
capture.
- try {
- domEvt = A4J.AJAX.CloneObject(evt,false);
- } catch(e){
- LOG.warn("Exception on clone event "+e.name +":"+e.message);
- }
- LOG.debug("Have Event "+domEvt+" with properties: target:
"+domEvt.target+", srcElement: "+domEvt.srcElement+", type:
"+domEvt.type);
- }
-
- return domEvt;
-};
-
-A4J.AJAX.PrepareQuery = function(containerId, formId, domEvt, options) {
- // Process listeners.
- for(var li = 0; li < A4J.AJAX._listeners.length; li++){
- var listener = A4J.AJAX._listeners[li];
- if(listener.onbeforeajax){
- listener.onbeforeajax(formId,domEvt,options);
- }
- }
- // First - run onsubmit event for client-side validation.
- LOG.debug("Query preparation for form '" + formId + "'
requested");
-// var form = A4J.AJAX.locateForm(event);
- var form = window.document.getElementById(formId);
- if( (!form || form.nodeName.toUpperCase() != "FORM") && domEvt ) {
- var srcElement = domEvt.target||domEvt.srcElement||null;
- if(srcElement){
- form = A4J.AJAX.locateForm(srcElement);
- };
- };
- // TODO - test for null of form object
- if(!options.submitByForm && form && form.onsubmit) {
- LOG.debug("Form have onsubmit function, call it" );
- if( form.onsubmit() == false ){
- return false;
- };
- };
- var tosend = new A4J.Query(containerId, form);
- tosend.appendFormControls(options.single, options.control);
- //appending options.control moved to appendFormControls
- //if(options.control){
- // tosend.appendControl(options.control,true);
- //};
- if(options.parameters){
- tosend.appendParameters(options.parameters);
- };
- if(options.actionUrl){
- tosend.setActionUrl(options.actionUrl);
- };
-
- return tosend;
-};
-
-A4J.AJAX.SubmitQuery = function (query, options, domEvt) {
- // build xxxHttpRequest. by Sarissa / JSHttpRequest class always defined.
- var req = new A4J.AJAX.XMLHttpRequest(query);
-
- var form = query._form;
- var containerId = query._containerId;
-
- req.options = options;
- req.containerId = containerId;
- req.domEvt = domEvt;
- req.form = form;
-
- if(options.timeout){
- req.setRequestTimeout(options.timeout);
- };
-
- // Event handler for process response result.
- req.onready = A4J.AJAX.processResponse;
-
- if(options.onerror){
- req._onerror = options.onerror;
- } else if(typeof(A4J.AJAX.onError)== "function"){
- req._onerror = A4J.AJAX.onError;
- }
-
- var _queueonerror = options.queueonerror;
- if (_queueonerror) {
- var _onerror = req._onerror;
- if (_onerror) {
- req._onerror = function() {
- _queueonerror.apply(this, arguments);
- _onerror.apply(this, arguments);
- };
- } else {
- req._onerror = _queueonerror;
- }
- }
-
- req.onfinish = A4J.AJAX.finishRequest;
-
- LOG.debug("NEW AJAX REQUEST !!! with form: " + (form.id || form.name ||
form));
-
- A4J.AJAX.status(containerId,options.status,true);
- req.send();
-
- return req;
-};
-
-//Submit or put in queue request. It not full queues - framework perform waiting only one
request to same queue, new events simple replace last.
-//If request for same queue already performed, replace with current parameters.
-A4J.AJAX.Submit = function( containerId, formId, event , options ) {
- var domEvt = A4J.AJAX.CloneEvent(event);
- var query = A4J.AJAX.PrepareQuery(containerId, formId, domEvt, options);
- if (query) {
- var queue = A4J.AJAX.EventQueue.getOrCreateQueue(options, formId);
-
- if (queue) {
- queue.push(query, options, domEvt);
- } else {
- A4J.AJAX.SubmitQuery(query, options, domEvt);
- }
- }
-
- return false;
-};
-
-
- // Main request submitting functions.
- // parameters :
- // form - HtmlForm object for submit.
- // control - form element, called request, or, clientID for JSF view.
- // affected - Array of ID's for DOM Objects, updated after request. Override
- // list of updated areas in response.
- // statusID - DOM id request status tags.
- // oncomplete - function for call after complete request.
-A4J.AJAX.SubmitRequest = function( containerId, formId, event, options ) {
- var domEvt = A4J.AJAX.CloneEvent(event);
- var query = A4J.AJAX.PrepareQuery(containerId, formId, domEvt, options);
- if (query) {
- A4J.AJAX.SubmitQuery(query, options, domEvt);
- }
-
- return false;
-};
-
-A4J.AJAX.processResponseAfterUpdateHeadElements = function (req, ids)
-{
- req.evaluateQueueScript();
-
- for ( var k =0; k < ids.length ; k++ ) {
- var id = ids[k];
- LOG.debug("Update page part from call parameter for ID " + id);
- req.updatePagePart(id, k==ids.length-1);
- };
-}
-
-A4J.AJAX.headElementsCounter = 0;
-
-A4J.AJAX.processResponse = function(req) {
- A4J.AJAX.TestScriptEvaluation();
- var options = req.options;
- var ajaxResponse = req.getResponseHeader('Ajax-Response');
- // If view is expired, check user-defined handler.
- var expiredMsg = req.getResponseHeader('Ajax-Expired');
- if(expiredMsg && typeof(A4J.AJAX.onExpired) == 'function' ){
- var loc = A4J.AJAX.onExpired(window.location,expiredMsg);
- if(loc){
- window.location = loc;
- return;
- }
- }
- if( ajaxResponse != "true"){
- // NO Ajax header - new page.
- LOG.warn("No ajax response header ");
- var loc = req.getResponseHeader("Location");
- try{
- if(ajaxResponse == 'redirect' && loc){
- window.location = loc;
- } else if(ajaxResponse == "reload"){
- window.location.reload(true);
- } else {
- A4J.AJAX.replacePage(req);
- }
- } catch(e){
- LOG.error("Error redirect to new location ");
- }
- } else {
- if(req.getParserStatus() == Sarissa.PARSED_OK){
-
- // perform beforeupdate if exists
- if(options.onbeforedomupdate || options.queueonbeforedomupdate){
- var event = req.domEvt;
- var data = req.getJSON('_ajax:data');
-
- LOG.debug( "Call local onbeforedomupdate function before replacing
elemements" );
-
- if (options.onbeforedomupdate) {
- options.onbeforedomupdate(req, event, data);
- }
-
- if (options.queueonbeforedomupdate) {
- options.queueonbeforedomupdate(req, event, data);
- }
- }
-
- var idsFromResponse = req.getResponseHeader("Ajax-Update-Ids");
- var ids;
-
- var callback = function () {
- if (A4J.AJAX.headElementsCounter!=0) {
- LOG.debug("Script "+A4J.AJAX.headElementsCounter+" was
loaded");
- --A4J.AJAX.headElementsCounter;
- }
- if (A4J.AJAX.headElementsCounter==0) {
- A4J.AJAX.processResponseAfterUpdateHeadElements(req, ids);
- }
- };
-
- // 3 strategy for replace :
- // if setted affected parameters - replace its
- if( options.affected ) {
- ids = options.affected;
- req.appendNewHeadElements(callback);
- // if resopnce contains element with ID "ajax:update" get id's from
- // child text element . like :
- // <div id="ajax:update" style="display none" >
- // <span>_id1:1234</span>
- // .........
- // </div>
- //
- } else if( idsFromResponse && idsFromResponse != "" ) {
- LOG.debug("Update page by list of rendered areas from response " +
idsFromResponse );
- // Append scripts and styles to head, if not presented in page before.
- ids = idsFromResponse.split(",");
- req.appendNewHeadElements(callback);
- } else {
- // if none of above - error ?
- // A4J.AJAX.replace(form.id,A4J.AJAX.findElement(form.id,xmlDoc));
- LOG.warn("No information in response about elements to replace");
- req.doFinish();
- }
- // Replace client-side hidden inputs for JSF View state.
- var idsSpan = req.getElementById("ajax-view-state");
- LOG.debug("Hidden JSF state fields: "+idsSpan);
- if(idsSpan != null){
- // For a portal case, replace content in the current window only.
- var namespace = options.parameters['org.ajax4jsf.portlet.NAMESPACE'];
- LOG.debug("Namespace for hidden view-state input fields is
"+namespace);
- var anchor =
namespace?window.document.getElementById(namespace):window.document;
- var inputs = anchor.getElementsByTagName("input");
- try {
- var newinputs = req.getElementsByTagName("input",idsSpan);
- A4J.AJAX.replaceViewState(inputs,newinputs);
- } catch(e){
- LOG.warn("No elements 'input' in response");
- }
- // For any cases, new state can be in uppercase element
- try {
- var newinputs = req.getElementsByTagName("INPUT",idsSpan);
- A4J.AJAX.replaceViewState(inputs,newinputs);
- } catch(e){
- LOG.warn("No elements 'INPUT' in response");
- }
- }
-
- // Process listeners.
- for(var li = 0; li < A4J.AJAX._listeners.length; li++){
- var listener = A4J.AJAX._listeners[li];
- if(listener.onafterajax){
- // Evaluate data as JSON String.
- var data = req.getJSON('_ajax:data');
- listener.onafterajax(req,req.domEvt,data);
- }
- }
- // Set focus, if nessesary.
- var focusId = req.getJSON("_A4J.AJAX.focus");
- if(focusId){
- LOG.debug("focus must be set to control "+focusId);
- var focusElement=false;
- if(req.form){
- // Attempt to get form control for name. By Richfaces naming convensions,
- // complex component must set clientId as DOM id for a root element ,
- // and as input element name.
- focusElement = req.form.elements[focusId];
- }
- if(!focusElement){
- // If not found as control element, search in DOM.
- LOG.debug("No control element "+focusId+" in submitted
form");
- focusElement = document.getElementById(focusId);
- }
- if(focusElement){
- LOG.debug("Set focus to control ");
- focusElement.focus();
- if (focusElement.select) focusElement.select();
- } else {
- LOG.warn("Element for set focus not found");
- }
- } else {
- LOG.debug("No focus information in response");
- }
- } else {
- // No response XML
- LOG.error( "Error parsing XML" );
- LOG.error("Parse Error: " + req.getParserStatus());
- }
- }
- };
-
-
-A4J.AJAX.replacePage = function(req){
- if(!req.getResponseText()){
- LOG.warn("No content in response for replace current page");
- return;
- }
- LOG.debug("replace all page content with response");
- var isIE = Sarissa._SARISSA_IS_IE;
- // maksimkaszynski
- //Prevent "Permission denied in IE7"
- //Reset calling principal
- var oldDocOpen = window.document.open;
- if (isIE) {
- LOG.debug("setup custom document.open method");
- window.document.open = function() {
- oldDocOpen.apply(this, arguments);
- }
- }
- // /maksimkaszynski
- window.setTimeout(function() {
- var isDocOpen=false;
- try {
- window.document.open(req.getContentType(),true);
- LOG.debug("window.document has opened for writing");
- isDocOpen=true;
- window.document.write(req.getResponseText());
- LOG.debug("window.document has been writed");
- window.document.close();
- LOG.debug("window.document has been closed for writing");
- if(isIE){
- // For Ie , scripts on page not activated.
- window.location.reload(false);
- }
- } catch(e) {
- LOG.debug("exception during write page content "+e.Message);
- if(isDocOpen){
- window.document.close();
- }
- // Firefox/Mozilla in XHTML case don't support document.write()
- // Use dom manipulation instead.
- var oDomDoc = (new DOMParser()).parseFromString(req.getResponseText(),
"text/xml");
- if(Sarissa.getParseErrorText(oDomDoc) == Sarissa.PARSED_OK){
- LOG.debug("response has parsed as DOM documnet.");
- Sarissa.clearChildNodes(window.document.documentElement);
- var docNodes = oDomDoc.documentElement.childNodes;
- for(var i = 0;i<docNodes.length;i++){
- if(docNodes[i].nodeType == 1){
- LOG.debug("append new node in document");
- var node = window.document.importNode(docNodes[i], true);
- window.document.documentElement.appendChild(node);
- }
- }
- //TODO - unloading cached observers?
- //if (window.RichFaces && window.RichFaces.Memory) {
- // window.RichFaces.Memory.clean(oldnode);
- //}
- } else {
- LOG.error("Error parsing
response",Sarissa.getParseErrorText(oDomDoc));
- }
- // TODO - scripts reloading ?
- } finally {
- window.document.open = oldDocOpen;
- }
- LOG.debug("page content has been replaced");
- },0);
-}
-
-
-A4J.AJAX.replaceViewState = function(inputs,newinputs){
- LOG.debug("Replace value for inputs: "+inputs.length + " by
new values: "+ newinputs.length);
- if( (newinputs.length > 0) && (inputs.length > 0) ){
- for(var i = 0 ; i < newinputs.length; i++){
- var newinput = newinputs[i];
- LOG.debug("Input in response:
"+newinput.getAttribute("name"));
- for(var j = 0 ; j < inputs.length; j++){
- var input = inputs[j];
- if(input.name == newinput.getAttribute("name")){
- LOG.debug("Found same input on page with type: "+input.type);
- input.value = newinput.getAttribute("value");
- }
- }
- }
- }
-
-};
-/**
- *
- */
-A4J.AJAX.finishRequest = function(request){
- var options = request.options;
-
- // we can set listener for complete request - for example,
- // it can shedule next request for update page.
- var oncomp = request.getElementById('org.ajax4jsf.oncomplete');
- if(oncomp) {
- LOG.debug( "Call request oncomplete function after processing updates"
);
- window.setTimeout(function(){
- var event = request.domEvt;
- var data = request.getJSON('_ajax:data');
-
- try {
- var target = null;
- if (event) {
- target = event.target ? event.target : event.srcElement;
- }
-
- var newscript = Sarissa.getText(oncomp,true);
- var oncomplete = new
Function("request","event","data",newscript);
- oncomplete.call(target,request,event,data);
-
- if (options.queueoncomplete) {
- options.queueoncomplete.call(target, request, event, data);
- }
-
- } catch (e) {
- LOG.error('Error evaluate oncomplete function '+e.Message);
- }
-
- // mark status object ( if any ) for complete request ;
- A4J.AJAX.status(request.containerId,options.status,false);},
- 0);
- } else if (options.oncomplete || options.queueoncomplete){
- LOG.debug( "Call local oncomplete function after processing updates" );
- window.setTimeout(function(){
- var event = request.domEvt;
- var data = request.getJSON('_ajax:data');
-
- if (options.oncomplete) {
- options.oncomplete(request, event, data);
- }
-
- if (options.queueoncomplete) {
- options.queueoncomplete(request, event, data);
- }
-
- // mark status object ( if any ) for complete request ;
- A4J.AJAX.status(request.containerId,options.status,false);},
- 0);
-
- } else {
- LOG.debug( "Processing updates finished, no oncomplete function to
call" );
-
- setTimeout(function() {
- // mark status object ( if any ) for complete request ;
- A4J.AJAX.status(request.containerId,options.status,false);
- }, 0)
- }
-
- if (request.shouldNotifyQueue && request.queue) {
- request.queue.pop();
- }
- };
-
-A4J.AJAX.getCursorPos = function(inp){
-
- if(inp.selectionEnd != null)
- return inp.selectionEnd;
-
- // IE specific code
- var range = document.selection.createRange();
- var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
- if (!isCollapsed)
- range.collapse(false);
- var b = range.getBookmark();
- return b.charCodeAt(2) - 2;
- }
-
- // Locate enclosing form for object.
-A4J.AJAX.locateForm = function(obj){
-
- var parent = obj;
- while(parent && parent.nodeName.toLowerCase() != 'form'){
- parent = parent.parentNode;
- };
- return parent;
-
- };
-
-A4J.AJAX.getElementById = function(id,options){
- var namespace = options['org.ajax4jsf.portlet.NAMESPACE'];
- var anchor = namespace?window.document.getElementById(namespace):window.document;
- var element;
- if(anchor){
- element = anchor.getElementById(id);
- } else {
- LOG.error("No root element for portlet namespace "+namespace+" on
page");
- }
- return element;
-}
-
- // hash for requests count for all ID's
-A4J.AJAX._requestsCounts = {};
- // Change status object on start/stop request.
- // on start, document object with targetID+".start" make visible,
- // document object with targetID+".stop" make invisible.
- // on stop - inverse.
-A4J.AJAX.status = function(regionID,targetID,start){
- try {
- var elem;
- targetID = targetID || regionID +":status";
-
A4J.AJAX._requestsCounts[targetID]=(A4J.AJAX._requestsCounts[targetID]||0)+(start?1:-1);
- if(A4J.AJAX._requestsCounts[targetID]>0){
- elem = document.getElementById(targetID+".stop");
- if(elem){elem.style.display="none";}
- elem = document.getElementById(targetID+".start");
- if(elem){
- elem.style.display="";
- if(typeof(elem.onstart) == 'function'){
- elem.onstart();
- }
- }
- }else{
- elem = document.getElementById(targetID+".start");
- if(elem){elem.style.display="none";}
- elem = document.getElementById(targetID+".stop");
- if(elem){
- elem.style.display="";
- if(typeof(elem.onstop) == 'function'){
- elem.onstop();
- }
- }
- }
- } catch(e){
- LOG.error("Exception on status change: ");
- }
-};
-
-
-
-
-// Class for build query string.
-A4J.Query = function(containerId, form){
- // For detect AJAX Request.
- this._query = {AJAXREQUEST : containerId};
- this._oldSubmit = null ;
- this._form = form;
- this._containerId = containerId;
- this._actionUrl = ( this._form.action)?this._form.action:this._form;
- };
-
-A4J.Query.prototype = {
- _form : null,
- _actionUrl : null,
- _ext : "",
- _query : {},
- _oldSubmit : null,
- // init at loading time - script can change location at run time ? ...
- _pageBase : window.location.protocol+"//"+window.location.host,
- // hash for control elements query string functions
-
- hidden : function(control){
- this._value_query(control);
- // TODO - configurable mask for hidden command scripts.
- if( (control.name.length > 4) &&
(control.name.lastIndexOf("_idcl") == (control.name.length-5)) ){
- control.value="";
- // MYfaces version ...
- } else if( (control.name.length > 12) &&
(control.name.lastIndexOf("_link_hidden_") == (control.name.length-13)) ){
- control.value="";
- }
- },
-
- text : function(control){
- this._value_query(control);
- },
-
- textarea : function(control){
- this._value_query(control);
- },
-
- 'select-one' : function(control){
- // If none options selected, don't include parameter.
- if (control.selectedIndex != -1) {
- this._value_query(control);
- }
-// for( var i =0; i< control.childNodes.length; i++ ){
-// var child=control.childNodes[i];
-// if( child.selected ){
-// this._value_query(control);
-// break;
-// }
-// }
- },
-
- password : function(control){
- this._value_query(control);
- },
-
- file : function(control){
- this._value_query(control);
- },
-
- radio : function(control){
- this._radio_query(control);
- },
-
- checkbox : function(control){
- this._check_query(control);
- },
-
-
- 'select-multiple' : function(control){
- var cname = control.name;
- var options = control.options;
- for( var i=0 ;i< control.length;i++ ){
- var option = options[i];
- this._addOption(cname, option);
- }
- },
-
- _addOption : function(cname,option){
- if ( option.selected ){
- if( ! this._query[cname] ){
- this._query[cname]=[];
- }
- this._query[cname][this._query[cname].length]=option.value;
- }
-
- },
-// command inputs
-
- image : function( control, action ){
- if(action) this._value_query(control);
- },
- button : function( control, action ){
- if(action) this._value_query(control);
- },
-
- submit : function( control, action ){
- if(action) {
- this._value_query(control);
- }
- },
-
- // Anchor link pseudo-control.
- link : function(control, action ){
- if(action) {
- this._value_query(control);
- if(control.parameters){
- this.appendParameters(control.parameters);
- }
- }
- },
-
- // same as link, but have additional field - control, for input submit.
- input : function(control, action ){
- if(action) {
- this.link(control, action );
- // append original control.
- if( control.control ) {
- this.appendControl(control.control,action);
- }
- }
- },
-
- // Append one control to query.
- appendControl : function(control,action){
- if( this[control.type] ) {
- this[control.type](control,action);
- } else {
- this._appendById(control.id||control);
- }
-
- },
-
- // Append all non-hidden controls from form to query.
- appendFormControls : function(hiddenOnly, actionControl){
- try {
- var elems = this._form.elements;
- if(elems){
- var k = 0;
- for ( k=0;k<elems.length;k++ ) {
- var element=elems[k];
-
- //skip actionControl, we're going to add it later
- if (element == actionControl) {
- continue;
- }
-
- try {
- if( !hiddenOnly || element.type == "hidden") {
- this.appendControl(element,false) ;
- }
- } catch( ee ) {
- LOG.error("exception in building query ( append form control ) " +
ee );
- }
- }
- }
- } catch(e) {
- LOG.warn("Error with append form controls to query "+e)
- }
-
- if (actionControl) {
- this.appendControl(actionControl, true);
- }
- },
-
- // append map of parameters to query.
- appendParameters : function(parameters){
- for( k in parameters ){
- if(typeof Object.prototype[k] == 'undefined'){
- LOG.debug( "parameter " + k + " with value
"+parameters[k]);
- this.appendParameter(k,parameters[k]);
- }
- }
- },
-
- setActionUrl : function(actionUrl){
- this._actionUrl = actionUrl;
- },
-// Return action URL ( append extention, if present )
- getActionUrl : function( ext ) {
- var actionUrl = this._actionUrl ;
- var ask = actionUrl.indexOf('?');
- // create absolute reference - for Firefox XMLHttpRequest base url can vary
- if( actionUrl.substring(0,1) == '/' ) {
- actionUrl = this._pageBase+actionUrl;
- }
- if ( ! ext ) ext = this._ext ;
- if( ask >=0 )
- {
- return actionUrl.substring(0,ask) + ext + actionUrl.substring(ask);
- }
- else return actionUrl + ext;
- },
-
-
-// Build query string for send to server.
- getQueryString : function() {
- var qs = "";
- var iname ;
- for ( var k in this._query ){
- if(typeof Object.prototype[k] == 'undefined'){
- iname = this._query[k];
- if( iname instanceof Object ){
- for ( var l=0; l< iname.length; l++ ) {
- qs += this._encode(k) + "=" + this._encode(iname[l]) +
"&";
- }
- } else {
- qs += this._encode(k) + "=" + this._encode(iname) + "&";
- }
- }
- }
- LOG.debug("QueryString: "+qs);
- return qs;
- },
- // private methods
-
- _appendById : function( id ) {
- this.appendParameter(this._form.id + "_link_hidden_", id);
- // JSF-ri version ...
- // this._query[this._form.id + "_idcl"]=id;
- },
-
-
- _value_query : function(control){
- if (control.name) {
- LOG.debug("Append "+control.type+" control
"+control.name+" with value ["+control.value+"] and value attribute
["+control.getAttribute('value')+"]");
- if(null != control.value){
- this.appendParameter(control.name, control.value);
- }
- } else {
- LOG.debug("Ignored "+control.type+" no-name control with value
["+control.value+"] and value attribute
["+control.getAttribute('value')+"]");
- }
- },
-
- _check_query : function(control){
- if( control.checked ) {
- this.appendParameter(control.name, control.value?control.value:"on");
- }
- },
-
- _radio_query : function(control) {
- if( control.checked ) {
- this.appendParameter(control.name, control.value?control.value:"");
- }
- },
-
- // Append parameter to query. if name exist, append to array of parameters
- appendParameter: function(cname,value){
- if( ! this._query[cname] ){
- this._query[cname]=value;
- return;
- } else if( !(this._query[cname] instanceof Object) ){
- this._query[cname] = [this._query[cname]];
- }
- this._query[cname][this._query[cname].length]=value;
- },
-
- // Encode data string for request string
- _encode : function(string) {
- try {
- return encodeURIComponent(string);
- } catch(e) {
- var str = escape(string);
- // escape don't encode +. but form replace ' ' in fields by
'+'
- return str.split('+').join('%2B');
- }
- }
-
-
- }
-
-
-A4J.AJAX.getText = function(oNode, includeComment) {
- var s = "";
- var nodes = oNode.childNodes;
- for(var i=0; i < nodes.length; i++){
- var node = nodes[i];
- var nodeType = node.nodeType;
-
- if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE ||
- (includeComment && nodeType == Node.COMMENT_NODE)){
-
- s += node.data;
- } else if(nodeType == Node.ELEMENT_NODE || nodeType == Node.DOCUMENT_NODE ||
nodeType == Node.DOCUMENT_FRAGMENT_NODE){
- s += arguments.callee(node, includeComment);
- }
- }
- return s;
-}
-
-A4J.AJAX.isXhtmlScriptMode = function() {
- if (!this._xhtmlScriptMode) {
- var elt = document.createElement("div");
- elt.innerHTML = "<script
type='text/javascript'><!--\r\n/**/\r\n//--></script>";
-
- var commentFound = false;
- var s = elt.firstChild;
-
- while (s) {
- if (s.nodeType == Node.ELEMENT_NODE) {
- var c = s.firstChild;
-
- while (c) {
- if (c.nodeType == Node.COMMENT_NODE) {
- commentFound = true;
- break;
- }
-
- c = c.nextSibling;
- }
-
- break;
- }
-
- s = s.nextSibling;
- }
-
- if (commentFound) {
- this._xhtmlScriptMode = 2;
- } else {
- this._xhtmlScriptMode = 1;
- }
- }
-
- return this._xhtmlScriptMode > 1;
-}
-
-//Test for re-evaluate Scripts in updated part. Opera & Safari do it.
-A4J.AJAX._scriptEvaluated=false;
-A4J.AJAX.TestScriptEvaluation = function () {
-if ((!document.all || window.opera) && !A4J.AJAX._scriptTested){
- try{
- // Simulate same calls as on XmlHttp
- var oDomDoc = Sarissa.getDomDocument();
- var _span = document.createElement("span");
- document.body.appendChild(_span);
- // If script evaluated with used replace method, variable will be set to true
- var xmlString = "<html
xmlns='http://www.w3.org/1999/xhtml'><sc"+"ript&g...;
- oDomDoc = (new DOMParser()).parseFromString(xmlString, "text/xml");
- var _script=oDomDoc.getElementsByTagName("script")[0];
- if(!window.opera && _span.outerHTML){
- _span.outerHTML = new XMLSerializer().serializeToString(_script);
- } else {
- var importednode ;
- importednode = window.document.importNode(_script, true);
- document.body.replaceChild(importednode,_span);
- }
-
- } catch(e){ /* Mozilla in XHTML mode not have innerHTML */ };
-}
-A4J.AJAX._scriptTested = true;
-}
-A4J.AJAX._eventQueues = {};
-
-//queue constructor
-A4J.AJAX.EventQueue = function() {
- var DROP_NEW = 'dropNew';
- var DROP_NEXT = 'dropNext';
- var FIRE_NEW = 'fireNew';
- var FIRE_NEXT = 'fireNext';
-
- var extend = function(target, source) {
- for (var property in source) {
- target[property] = source[property];
- }
- };
-
- var extendOptions = function(options) {
- var opts = {};
-
- for (var name in options) {
- opts[name] = options[name];
- }
-
- for (var name in this.requestOptions) {
- if (typeof opts[name] == 'undefined') {
- opts[name] = this.requestOptions[name];
- }
- }
-
- return opts;
- };
-
- var QueueEntry = function() {
- var ctor = function(queue, query, options, event) {
- this.queue = queue;
- this.query = query;
- this.options = options;
- this.event = event;
-
- this.similarityGroupingId = this.options.similarityGroupingId;
- this.eventsCount = 1;
- };
-
- extend(ctor.prototype, {
-
- isIgnoreDupResponses: function() {
- return this.options.ignoreDupResponses;
- },
-
- getSimilarityGroupingId: function() {
- return this.similarityGroupingId;
- },
-
- setSimilarityGroupingId: function(id) {
- this.similarityGroupingId = id;
- },
-
- submit: function() {
- this.query.appendParameter("AJAX:EVENTS_COUNT", this.eventsCount);
- this.request = A4J.AJAX.SubmitQuery(this.query, this.options, this.event)
-
- var queue = this.queue; // TODO: move to next line
- this.request.queue = queue;
-
- return this.request;
- },
-
- abort: function() {
- if (this.request) {
- //tell request not to notify queue after its processing finished
- //request.queue = undefined
- //is not ok for this case because user might want to obtain queue in any event
handler
- this.request.shouldNotifyQueue = false;
- this.request.abort();
- this.request = undefined;
- }
- },
-
- ondrop: function() {
- var callback = this.options.onqueuerequestdrop;
- if (callback) {
- callback.call(this.queue, this.query, this.options, this.event);
- }
- },
-
- onRequestDelayPassed: function() {
- this.readyToSubmit = true;
- this.queue.submitFirst();
- },
-
- startTimer: function() {
- var delay = this.options.requestDelay;
-
- LOG.debug("Queue will wait " + (delay || 0) + "ms before
submit");
-
- if (delay) {
- var _this = this;
- this.timer = setTimeout(function() {
- try {
- _this.onRequestDelayPassed();
- } finally {
- _this.timer = undefined;
- _this = undefined;
- }
- }, delay);
- } else {
- this.onRequestDelayPassed();
- }
- },
-
- stopTimer: function() {
- if (this.timer) {
- clearTimeout(this.timer);
- this.timer = undefined;
- }
- },
-
- clearEntry: function() {
- this.stopTimer();
- if (this.request) {
- this.request.shouldNotifyQueue = false;
- this.request = undefined;
- }
- },
-
- getEventsCount: function() {
- return this.eventsCount;
- },
-
- setEventsCount: function(newCount) {
- this.eventsCount = newCount;
- },
-
- getEventArguments: function() {
- return [this.query, this.options, this.event];
- }
- });
-
- return ctor;
- }();
-
- var Queue = function(name, queueOptions, requestOptions) {
- this.items = new Array();
-
- this.name = name;
- this.queueOptions = queueOptions || {};
- this.requestOptions = requestOptions || {};
- };
-
- extend(Queue.prototype, {
-
- submitFirst: function() {
- var firstItem = this.items[0];
- if (firstItem) {
- if (!firstItem.request) {
- if (firstItem.readyToSubmit) {
- LOG.debug("Queue '" + this.name + "' will submit request
NOW");
-
- var req = firstItem.submit();
-
- //see entry.abort() method for more details about this assignment
- req.shouldNotifyQueue = true;
-
- if (this.requestOptions.queueonsubmit) {
- this.requestOptions.queueonsubmit.call(this, req);
- }
- } else {
- LOG.debug("First item is not ready to be submitted yet");
- }
- }
- } else {
- LOG.debug("Queue is empty now");
- }
- },
-
- getSize: function() {
- return this.items.length;
- },
-
- getMaximumSize: function() {
- return this.queueOptions.size;
- },
-
- getSizeExceededBehavior: function() {
- var policy = this.queueOptions.sizeExceededBehavior;
- if (!policy) {
- policy = DROP_NEXT;
- }
-
- return policy;
- },
-
- queue: function(entry) {
- this.items.push(entry);
-
- if (this.queueOptions.onrequestqueue) {
- LOG.debug("Call onrequestqueue handler");
- this.queueOptions.onrequestqueue.apply(this, entry.getEventArguments());
- }
- },
-
- dequeue: function() {
- var entry = this.items.shift();
-
- if (this.queueOptions.onrequestdequeue) {
- LOG.debug("Call onrequestdequeue handler");
- this.queueOptions.onrequestdequeue.apply(this, entry.getEventArguments());
- }
- },
-
- push: function(query, opts, event) {
- var options = extendOptions.call(this, opts);
-
- var entry = new QueueEntry(this, query, options, event);
- var similarityGroupingId = entry.getSimilarityGroupingId();
-
- var lastIdx = this.items.length - 1;
- var last = this.items[lastIdx];
- var handled = false;
-
- if (last) {
- if (last.getSimilarityGroupingId() == similarityGroupingId) {
- LOG.debug("Similar request currently in queue '" + this.name +
"'");
-
- if (last.request) {
- LOG.debug("Request has already beeen sent to server");
- if (entry.isIgnoreDupResponses()) {
- LOG.debug("Duplicate responses ignore requested, queue will abort current
request");
-
- last.abort();
-
- LOG.debug("Current request in queue '" + this.name + "' has
been aborted");
-
- //remove last (that is actually first) from queue - will be safer to do that in
LinkedList
- this.dequeue();
- }
- } else {
- LOG.debug("Combine similar requests and reset timer");
-
- handled = true;
- last.stopTimer();
- entry.setEventsCount(last.getEventsCount() + 1);
-
- this.items[lastIdx] = entry;
- entry.startTimer();
- }
- } else {
- LOG.debug("Last queue entry is not the last anymore. Stopping requestDelay
timer and marking entry as ready for submission")
-
- last.stopTimer();
- last.setSimilarityGroupingId(undefined);
- last.readyToSubmit = true;
- }
- }
-
- if (!handled) {
- if (this.queueOptions.size == this.items.length) {
- LOG.debug("Queue '" + this.name + "' is currently
full")
-
- var b = this.getSizeExceededBehavior();
-
- var nextIdx = 0;
- while (this.items[nextIdx] && this.items[nextIdx].request) {
- nextIdx++;
- }
-
- if (this.queueOptions.onsizeexceeded) {
- this.queueOptions.onsizeexceeded.apply(this, entry.getEventArguments());
- }
- // TODO: create one function that will be implement this functionality // function
(behaviorFlag, entry): should return handled flag
- if (b == DROP_NEW) {
- LOG.debug("Queue '" + this.name + "' is going to drop new
item");
-
- entry.ondrop();
-
- handled = true;
- } else if (b == DROP_NEXT) {
- LOG.debug("Queue '" + this.name + "' is going to drop
[" + nextIdx + "] item that is the next one");
-
- var nextEntry = this.items.splice(nextIdx, 1)[0];
- if (nextEntry) {
- LOG.debug("Item dropped from queue");
-
- nextEntry.stopTimer();
-
- nextEntry.ondrop();
- } else {
- LOG.debug("There's no such item, will handle new request instead");
-
- entry.ondrop();
-
- handled = true;
- }
- } else if (b == FIRE_NEW) {
- LOG.debug("Queue '" + this.name + "' will submit new
request");
-
- entry.submit();
- handled = true;
- } else if (b == FIRE_NEXT) {
- LOG.debug("Queue '" + this.name + "' is going to drop and
fire immediately [" + nextIdx + "] item that is the next one");
-
- var nextEntry = this.items.splice(nextIdx, 1)[0];
- if (nextEntry) {
- LOG.debug("Item dropped from queue");
- nextEntry.stopTimer();
- nextEntry.submit();
- } else {
- LOG.debug("There's no such item, will handle new request instead");
- entry.submit();
- handled = true;
- }
- }
- }
-
- this.submitFirst();
- }
-
- if (!handled) {
- this.queue(entry);
-
- LOG.debug("New request added to queue '" + this.name + "'.
Queue similarityGroupingId changed to " + similarityGroupingId);
-
- entry.startTimer();
- }
- },
-
- pop: function() {
- LOG.debug("After request: queue '" + this.name + "'");
-
- this.dequeue();
-
- LOG.debug("There are " + this.items.length + " requests more in this
queue");
-
- this.submitFirst();
- },
-
- clear: function() {
- var length = this.items.length;
- for ( var i = 0; i < this.items.length; i++) {
- this.items[i].clearEntry();
- }
-
- this.items.splice(0, length);
- }
- });
-
- return Queue;
-}();
-
-A4J.AJAX.EventQueue.DEFAULT_QUEUE_NAME = "org.richfaces.queue.global";
-
-A4J.AJAX.EventQueue.getQueue = function(name) {
- return A4J.AJAX._eventQueues[name];
-};
-
-A4J.AJAX.EventQueue.getQueues = function() {
- return A4J.AJAX._eventQueues;
-};
-
-A4J.AJAX.EventQueue.addQueue = function(queue) {
- var name = queue.name;
-
- if (A4J.AJAX._eventQueues[name]) {
- throw "Queue already registered";
- } else {
- LOG.debug("Adding queue '" + name + "' to queues
registry");
- A4J.AJAX._eventQueues[name] = queue;
- }
-};
-
-A4J.AJAX.EventQueue.removeQueue = function(name) {
- var queue = A4J.AJAX._eventQueues[name];
-
- if (queue) {
- queue.clear();
- }
-
- delete A4J.AJAX._eventQueues[name];
-};
-
-A4J.AJAX.EventQueue.getOrCreateQueue = function(){
- var qualifyName = function(name, prefix) {
- if (prefix) {
- return prefix + ":" + name;
- } else {
- return name;
- }
- };
-
- var qualifyNamespace = function(name, prefix) {
- if (prefix) {
- return prefix + name;
- } else {
- return name;
- }
- };
-
- return function(options, formId) {
- var queueName = options.eventsQueue;
- var namespace = options.namespace;
-
- var formQueueName;
- var viewQueueName;
- var implicitQueueName;
-
- if (queueName) {
- LOG.debug("Look up queue with name '" + queueName + "'");
-
- formQueueName = qualifyName(queueName, formId);
- viewQueueName = qualifyNamespace(queueName, namespace);
-
- implicitQueueName = viewQueueName;
- } else {
- LOG.debug("Look up queue with default name");
-
- formQueueName = formId;
- viewQueueName = qualifyNamespace(A4J.AJAX.EventQueue.DEFAULT_QUEUE_NAME, namespace);
-
- implicitQueueName = options.implicitEventsQueue;
- }
-
- var queue = A4J.AJAX._eventQueues[formQueueName];
- if (!queue) {
- queue = A4J.AJAX._eventQueues[viewQueueName];
- if (!queue) {
- if (implicitQueueName) {
- queue = A4J.AJAX._eventQueues[implicitQueueName];
- if (!queue) {
- LOG.debug("Creating new transient queue '" + implicitQueueName +
"' with default settings");
- queue = new A4J.AJAX.EventQueue(implicitQueueName);
- queue._transient = true;
-
- A4J.AJAX.EventQueue.addQueue(queue);
- } else {
- LOG.debug("Found transient queue '" + implicitQueueName +
"'");
- }
- }
- } else {
- LOG.debug("Found view queue '" + viewQueueName + "'");
- }
- } else {
- LOG.debug("Found form queue '" + formQueueName + "'");
- }
-
- return queue;
- }
-}();
-
-(function () {
- var observer = function() {
- var queues = A4J.AJAX.EventQueue.getQueues();
- for (var queueName in queues) {
- var queue = queues[queueName];
- queue.clear();
- }
- };
-
- if (window.addEventListener) {
- window.addEventListener("unload", observer, false);
- } else {
- window.attachEvent("onunload", observer);
- }
-})();
-
-/**
- * Provide client side logging capabilities to AJAX applications.
- *
- * @author <a href="mailto:thespiegs@users.sourceforge.net">Eric
Spiegelberg</a>
- * @see <a
href="http://sourceforge.net/projects/log4ajax">Log4Ajax<...
- */
-if (!window.LOG) {
- window.LOG = {};
-}
-
-LOG.Level = function(name, priority, color){
- this.name = name;
- this.priority = priority;
- if(color){
- this.color = color;
- }
-}
-
-LOG.OFF = new LOG.Level("off", 1000);
-LOG.FATAL = new LOG.Level("fatal", 900, "red");
-LOG.ERROR = new LOG.Level("error", 800, "red");
-LOG.WARN = new LOG.Level("warn", 500, "yellow");
-LOG.INFO = new LOG.Level("info", 400, "blue");
-LOG.DEBUG = new LOG.Level("debug", 300, "darkblue");
-LOG.ALL = new LOG.Level("all", 100);
-LOG.A4J_DEBUG = new LOG.Level("a4j_debug", 0, "green");
-
-LOG.LEVEL = LOG.OFF;
-
-LOG._window = null;
-LOG.transmitToServer = true;
-LOG.consoleDivId = "logConsole";
-LOG.styles = {
-a4j_debug: "green",
-debug : "darkblue",
-info : "blue",
-warn : "yellow",
-error : "red",
-fatal : "red"
-};
-
-LOG.a4j_debug = function(msg,pre)
-{
- LOG._log(msg, LOG.A4J_DEBUG ,pre);
-}
-
-LOG.debug = function(msg,pre)
-{
- LOG._log(msg, LOG.DEBUG ,pre);
-}
-
-LOG.info = function(msg,pre)
-{
- LOG._log(msg, LOG.INFO ,pre);
-}
-
-LOG.warn = function(msg,pre)
-{
- LOG._log(msg, LOG.WARN ,pre);
-}
-
-LOG.error = function(msg,pre)
-{
- LOG._log(msg, LOG.ERROR ,pre);
-}
-
-LOG.fatal = function(msg,pre)
-{
- LOG._log(msg, LOG.FATAL ,pre);
-}
-
-LOG.registerPopup = function(hotkey,name,width,height,level){
- if(!LOG._onkeydown){
- LOG._onkeydown = document.onkeydown;
- }
- var key = hotkey.toUpperCase();
- document.onkeydown = function(e){
- if (window.event){ e = window.event;};
- if (String.fromCharCode(e.keyCode) == key & e.shiftKey & e.ctrlKey){
- LOG.LEVEL = level;
- LOG.openWindow(name,'width='+width+',height='+height+',toolbar=no,scrollbars=yes,location=no,statusbar=no,menubar=no,resizable=yes,left
= '+((screen.width - width) / 2)+',top ='+((screen.height - height) / 2));
- } else {
- if(LOG._onkeydown) LOG._onkeydown(e);
- };
- }
-}
-
-LOG.clear = function() {
- if(LOG._window && LOG._window.document){
- consoleDiv = LOG._window.document.body;
- } else {
- consoleDiv = window.document.getElementById(LOG.consoleDivId);
- }
-
- consoleDiv.innerHTML = '<button
onclick="LOG.clear()">Clear</button><br />';
-}
-
-LOG.openWindow = function(name,features){
- if(LOG._window){
- LOG._window.focus();
- } else {
- LOG._window = window.open("",name,features);
-
- LOG._window.LOG = LOG;
- LOG.clear();
-
- var _LOG = LOG;
- LOG._window.onunload = function(){
- _LOG._window.LOG = null;
- _LOG._window = null;
- _LOG.LEVEL = _LOG.OFF;
- _LOG=undefined;
- }
- }
-}
-
-LOG._log = function(msg, logLevel,pre)
-{
- if(logLevel.priority >= LOG.LEVEL.priority){
- LOG._logToConsole(msg, logLevel,pre);
-
- if (LOG.transmitToServer)
- {
- LOG._logToServer(msg, logLevel);
- }
- }
-}
-
-LOG._time = function(){
- var currentTime = new Date();
- var hours = currentTime.getHours();
- var minutes = currentTime.getMinutes();
- if (minutes < 10){
- minutes = "0" + minutes;
- }
- var seconds = currentTime.getSeconds();
- if (seconds < 10){
- seconds = "0" + seconds;
- }
- var millisec = currentTime.getTime()%1000;
- if(millisec<100){
- millisec = "0"+millisec;
- }
- if(millisec<10){
- millisec = "0"+millisec;
- }
- return hours+":"+minutes+":"+seconds+","+millisec;
-}
-
-LOG._logToConsole = function(msg, logLevel,preformat)
-{
- var consoleDiv ;
- var doc;
- if(LOG._window && LOG._window.document){
- doc = LOG._window.document;
- consoleDiv = LOG._window.document.body;
- } else {
- doc = window.document;
- consoleDiv = window.document.getElementById(LOG.consoleDivId);
- }
- if (consoleDiv)
- {
- var span = doc.createElement("span");
- span.style.color=logLevel.color;
- span.appendChild(doc.createTextNode(logLevel.name+"["+LOG._time()+"]:
"));
- var div = doc.createElement("div");
- var textnode = doc.createTextNode(msg);
- div.appendChild(span);
- div.appendChild(textnode);
- // preformatted - for example, html
- if(preformat){
- var pre = doc.createElement("span");
- textnode = doc.createTextNode(preformat);
- pre.appendChild(textnode);
- div.appendChild(pre);
- }
- consoleDiv.appendChild(div);
-/*
- consoleDiv.innerHTML = "<span style='" + LOG.styles[logLevel] +
"'>" +
- logLevel + "</span>: " + msg + "<br/>" +
- consoleDiv.innerHTML;*/
- }
- else
- {
- // If the consoleDiv is not available, you could create a
- // new div or open a new window.
- }
-}
-
-LOG._logToServer = function(msg, logLevel)
-{
- var data = logLevel.name.substring(0, 1) + msg;
- // TODO - use sarissa-enabled request.
- // Use request.js to make an AJAX transmission to the server
-// Http.get({
-// url: "log",
-// method: "POST",
-// body: data,
-// callback: LOG._requestCallBack
-// });
-}
-
-LOG._requestCallBack = function()
-{
- // Handle callback functionality here; if appropriate
-}
-/*
-* final trail for ajax jsf library
-*/
-// }
-//memory-leaks sanitizing code
-if (!window.RichFaces) {
- window.RichFaces = {};
-}
-
-if (!window.RichFaces.Memory) {
- window.RichFaces.Memory = {
-
- nodeCleaners: {},
- componentCleaners: {},
-
- addCleaner: function (name, cleaner) {
- this.nodeCleaners[name] = cleaner;
- },
-
- addComponentCleaner: function (name, cleaner, checker) {
- this.componentCleaners[name] = {cleaner: cleaner, checker: checker};
- },
-
- applyCleaners: function (node, isAjax, componentNodes) {
- for (var name in this.nodeCleaners) {
- this.nodeCleaners[name](node, isAjax);
- }
- for (var name in this.componentCleaners) {
- if (this.componentCleaners[name].checker(node, isAjax))
- componentNodes.push(node);
- }
- },
-
- _clean: function (oldNode, isAjax, componentNodes) {
- if (oldNode) {
- this.applyCleaners(oldNode, isAjax, componentNodes);
-
- //node.all is quicker than recursive traversing
- //window doesn't have "all" attribute
- var all = oldNode.all;
-
- if (all) {
- var counter = 0;
- var length = all.length;
-
- for (var counter = 0; counter < length; counter++ ) {
- this.applyCleaners(all[counter], isAjax, componentNodes);
- }
- } else {
- var node = oldNode.firstChild;
- while (node) {
- this._clean(node, isAjax, componentNodes);
- node = node.nextSibling;
- }
- }
- }
- },
-
- _cleanComponentNodes: function (oldNodes, isAjax) {
- for (var i=0; i<oldNodes.length; i++) {
- var node = oldNodes[i];
- for (var name in this.componentCleaners) {
- this.componentCleaners[name].cleaner(node, isAjax);
- }
- }
- },
-
- clean: function (oldNode, isAjax) {
- var componentNodes = [];
- this._clean(oldNode, isAjax, componentNodes);
- this._cleanComponentNodes(componentNodes, isAjax);
- componentNodes = null;
- }
- };
-
- window.RichFaces.Memory.addComponentCleaner("richfaces", function(node,
isAjax) {
- var component = node.component;
- if (component) {
- var destructorName = component["rich:destructor"];
- //destructor name is required to be back-compatible
- if (destructorName) {
- var destructor = component[destructorName];
- if (destructor) {
- destructor.call(component, isAjax);
- }
- }
- }
- }, function(node, isAjax) {
- return (node.component && node.component["rich:destructor"]);
- });
-
- if (window.attachEvent) {
- window.attachEvent("onunload", function() {
- var memory = window.RichFaces.Memory;
- memory.clean(document);
- memory.clean(window);
- });
- }
-}
-
-//
-
-if (!window.RichFaces) window.RichFaces = {};
-
-
-
-RichFaces.SortController = function() {
- var controlsByTable = {};
-
- return {
- registerControl : function(control) {
- var tableId = control.tableId;
- var sortExpression = control.sortExpression;
- var controlId = control.id;
- var columnId = control.columnId;
-
- var byTable = controlsByTable[tableId];
- if (!byTable) {
- byTable = {columns: {}, expressions : {}};
- controlsByTable[tableId] = byTable;
- }
- var byExpression;
- if (sortExpression) {
- byExpression = byTable.expressions[sortExpression];
- if (!byExpression) {
- byExpression = {};
- byTable.expressions[sortExpression] = byExpression;
- }
- } else if (columnId) {
- byExpression = byTable.columns[columnId];
- if (!byExpression) {
- byExpression = {};
- byTable.columns[columnId] = byExpression;
- }
- }
- if(byExpression) {
- var byId = byExpression[controlId];
- if (byId) {
- //TODO: delete controls already registered??
- } else {
- byExpression[controlId] = control;
- }
- }
- },
-
- controlsByTable : function(tableId) {
- var map = controlsByTable[tableId] || {expressions: {}, columns :{}};
- var result = [];
- ['expressions', 'columns'].each(
- function(part) {
- var parts = map[part];
- if (parts) {
- $H(parts).values().each(
- function(x) {
- result = result.concat($H(x).values());
- }
- );
- }
-
- }
- );
- return result.uniq();
- },
- controls : function(tableId, sortExpression, columnId) {
- var map = controlsByTable[tableId] || {expressions: {}, columns :{}};
- var array;
- if (typeof sortExpression != 'undefined') {
- array = $H(map.expressions[sortExpression]).values();
- }
- if (typeof columnId != 'undefined') {
- var a = $H(map.columns[columnId]).values();
- if (array) {
- array = array.concat(a).uniq();
- } else {
- array = a;
- }
- }
- return array;
-
- }
- };
-}();
-
-
-RichFaces.SortControl = Class.create({
- initialize : function(id, tableId, sortExpression, columnId) {
- this.id = id;
- this.tableId = tableId;
- this.columnId = columnId;
- this.sortExpression = sortExpression;
- this.prepareEvents();
- //TODO:Set cursor via clazz
- //element.setStyle({cursor: "pointer"});
-
- RichFaces.SortController.registerControl(this);
-
- },
-
- prepareEvents : function() {
- this.onclick = this.invoke.bindAsEventListener(this);
- var element = this.getElement();
- element.observe("click", this.onclick);
- },
- getElement : function () {
- return $($(this.id)/*.parentNode*/);
- },
- displaySortedAscending : function() {
- this.getElement()
- .removeClassName("rich-sort-desc")
- .addClassName("rich-sort-asc");
- },
- displaySortedDescending : function() {
- this.getElement()
- .removeClassName("rich-sort-asc")
- .addClassName("rich-sort-desc");
- },
- displayNotSortedAtAll : function() {
- this.getElement()
- .removeClassName("rich-sort-desc")
- .removeClassName("rich-sort-asc");
- },
- invoke : function(event) {
- var sortExpression;
-
- if (this.sortExpression) {
- sortExpression = this.sortExpression;
- } else {
- var cell = Event.findElement(event, "th,td");
- if (cell) {
- sortExpression = cell.cellIndex;
- }
- }
- if (typeof sortExpression != 'undefined') {
- $(this.tableId).component.changeSorting(new RichFaces.SortOrder([new
RichFaces.SortField(sortExpression)]), this.columnId);
- }
- }
-});
-
-RichFaces.SortOrder = Class.create({
- initialize : function(fields) {
- this.fieldz = fields || [];
- },
- fields : function() {
- return this.fieldz;
- }
-});
-
-
-
-
-RichFaces.SortField = function(sortExpression, asc) {
- this.sortExpression = sortExpression;
- this.asc = asc;
-};
-
-RichFaces.SortMode = Class.create({
- merge : function(oldSortOrder, newSortOrder) {
- return oldSortOrder;
- }
-});
-
-/**
- * Basically toggle any existing
- */
-RichFaces.SortMode.Single = Class.create(RichFaces.SortMode, {
- merge : function(oldSortOrder, newSortOrder) {
- var newFields = newSortOrder.fields();
- var oldFields = oldSortOrder.fields();
- var expr;
- var asc;
- if (oldFields.length > 0) {
- expr = oldFields[0].sortExpression;
- asc = oldFields[0].asc;
- }
- if (newFields.length > 0) {
- var xpr = newFields[0].sortExpression;
- if (xpr == expr) {
- asc = !asc;
- } else {
- expr = xpr;
- asc = true;
- }
- }
- oldSortOrder = new RichFaces.SortOrder([new RichFaces.SortField(expr, asc)]);
- return oldSortOrder;
- }
-});
-
-
-RichFaces.DataTable = Class.create({
- initialize : function(id, options) {
- var table = $(id);
- table.component = this;
-
- this.sortMode = options.sortMode || new RichFaces.SortMode();
- this.id = id;
- this.sortOrder = options.sortOrder || new RichFaces.SortOrder();
- this._compare = this.compare.bind(this);
- },
- /**
- * Call this method to sort the table
- * @param sortOrder - new sortOrder
- * @param force if true, new sortOrder will completely replace previous one, otherwise
sortOrders are merged using sortMode
- */
- changeSorting : function(sortOrder, columnId, force){
- if (force) {
- this.sortOrder = sortOrder;
- } else {
- this.sortOrder = this.sortMode.merge(this.sortOrder, sortOrder);
- }
- this.sort();
- var tableId = this.id;
-
- var cbt = $A(RichFaces.SortController.controlsByTable(tableId));
- cbt.each(
- function(control) {
- control.displayNotSortedAtAll();
- }
- );
- $A(this.sortOrder.fields()).each(
- function(field) {
- var ctrls =
- RichFaces.SortController.controls(tableId, field.sortExpression, columnId);
- $A(ctrls).each(function(control) {
- if (field.asc) {
- control.displaySortedAscending();
- } else {
- control.displaySortedDescending();
- }
- });
- }
- );
- },
-
- sort : function() {
- var table = $(this.id);
- var tbody = table.tBodies[0];
- if (tbody) {
- var newTbody = tbody.cloneNode(false);
- var newCollection = $A(tbody.rows).clone();
- newCollection.sort(this._compare);
- for(var i = 0; i < newCollection.length; i++) {
- newTbody.appendChild(newCollection[i]);
- }
- tbody.parentNode.replaceChild(newTbody, tbody);
- }
-
- },
- compare : function(row1, row2) {
- var fields = this.sortOrder.fields();
- var result = 0;
- for(var i = 0; i < fields.length && result == 0; i++) {
- var field = fields[i];
- var expression = field.sortExpression;
- if (typeof (expression) == 'function') {
- result = expression(row1, row2);
- } else if (typeof (expression) == 'number') {
- var c1 = row1.cells[expression];
- var c2 = row2.cells[expression];
- if (c1) {
- c1 = c1.innerHTML.stripTags();
-
- }
- if (c2) {
- c2 = c2.innerHTML.stripTags();
- }
-
- result = ((c1 == c2) ? 0 : ((c1 < c2) ? -1 : 1));
- }
-
- if (field.asc == false) {
- result = -result;
- }
-
- }
- return result;
-
-
- }
-});
-RichFaces.SortControl.Server = Class.create(RichFaces.SortControl, {
- invoke : function(event) {
- $(this.id + 's').click();
- }
-});
-RichFaces.SortControl.Ajax = Class.create(RichFaces.SortControl, {
- initialize: function(id, f) {
- this.id = id;
- this.f = f;
- this.prepareEvents();
- },
- invoke : function(event) {
- this.f(event);
- }
-});
-
-RichFaces.blurFilterInput = function(event) {
- if (event.keyCode == Event.KEY_RETURN && Event.element(event)) {
- Event.element(event).blur();
- return false;
- }
-};
-
-if (!window.Richfaces) {
- window.Richfaces = {};
-}
-
-Richfaces.mergeStyles = function(userStyles,commonStyles) {
- var i;
- for(i in userStyles) {
- if (typeof userStyles[i] == "object") {
- this.mergeStyles(userStyles[i],commonStyles[i]);
- } else {
- commonStyles[i] += " " + userStyles[i];
- }
- }
- return commonStyles;
-};
-
-Richfaces.getComputedStyle = function(eltId, propertyName) {
- var elt = $(eltId);
-
- if (elt.nodeType != Node.ELEMENT_NODE) {
- return "";
- }
-
- if (elt.currentStyle) {
- return elt.currentStyle[propertyName];
- }
-
- if (document.defaultView && document.defaultView.getComputedStyle) {
-
- var styles = document.defaultView.getComputedStyle(elt, null);
- if (styles) {
- return styles.getPropertyValue(propertyName);
- }
-
- }
-
- return "";
-};
-
-Richfaces.getComputedStyleSize = function(eltId, propertyName) {
- var value = Richfaces.getComputedStyle(eltId, propertyName);
-
- if (value) {
- value = value.strip();
- value = value.replace(/px$/, "");
-
- return parseFloat(value);
- }
-
- return 0;
-};
-
-Richfaces.getWindowSize = function() {
- var myWidth = 0, myHeight = 0;
- if( typeof( window.innerWidth ) == 'number' ) {
- myWidth = window.innerWidth;
- myHeight = window.innerHeight;
- } else if( document.documentElement && ( document.documentElement.clientWidth
|| document.documentElement.clientHeight ) ) {
- myWidth = document.documentElement.clientWidth;
- myHeight = document.documentElement.clientHeight;
- } else if( document.body && ( document.body.clientWidth ||
document.body.clientHeight ) ) {
- myWidth = document.body.clientWidth;
- myHeight = document.body.clientHeight;
- }
- return {"width":myWidth,"height":myHeight};
-};
-
-Richfaces.removePX = function(str) {
- var pxIndex = str.indexOf("px")
- if ( pxIndex == -1 ) return str;
- return str.substr(0,pxIndex);
-};
-
-Richfaces.visitTree = function(root, callback) {
- var node = root;
- if (!node) {
- node = document;
- }
-
- callback.call(this, node);
-
- var child = node.firstChild;
- while (child) {
- Richfaces.visitTree(child, callback);
- child = child.nextSibling;
- }
-};
-
-Richfaces.getNSAttribute = function (name, element) {
- if (element.getAttributeNS) {
- var attr =
element.getAttributeNS('http://richfaces.ajax4jsf.org/rich';, name);
- if (attr) {
- return attr;
- }
- }
-
- var attributes = element.attributes;
- var attrName = "rich:" + name;
- var attr = attributes[attrName];
- if (attr) {
- return attr.nodeValue;
- }
-
-// for (var i = 0; i < attributes.length; i++) {
-// attr = attributes[i];
-// if (attr && attrName == attr.nodeName) {
-// return attr.nodeValue;
-// }
-// }
-
- return null;
-};
-
-Richfaces.VARIABLE_NAME_PATTERN = /^\s*[_,A-Z,a-z][\w,_\.]*\s*$/;
-
-Richfaces.getObjectValue = function (str, object) {
- var a=str.split(".");
- var value=object[a[0]];
- var c=1;
- while (value && c<a.length) value = value[a[c++]];
- return (value ? value : "");
-}
-
-Richfaces.evalMacro = function(template, object)
-{
- var value="";
- // variable evaluation
- if (Richfaces.VARIABLE_NAME_PATTERN.test(template))
- {
- if (template.indexOf('.')==-1) {
- value = object[template];
- if (!value) value=window[template];
- }
- // object's variable evaluation
- else {
- value = Richfaces.getObjectValue(template, object);
- if (!value) value=Richfaces.getObjectValue(template, window);
- }
- if (value && typeof value=='function') value = value(object);
- if (!value) value="";
- }
- //js string evaluation
- else {
- try {
- if (Richfaces.browser.isObjectEval) {
- value = object.eval(template);
- }
- else with (object) {
- value = eval(template) ;
- }
-
- if (typeof value == 'function') {
- value = value(object);
- }
- } catch (e) { LOG.warn("Exception: "+e.Message + "\n[" + template +
"]"); }
- }
- return value;
-}
-Richfaces.evalSimpleMacro = function(template, object)
-{
- var value = object[template];
- if (!value) {value=window[template]; if (!value) value="";}
- return value;
-}
-
-Richfaces.getComponent = function(componentType, element)
-{
- var attribute="richfacesComponent";
- var type = "richfaces:"+componentType;
- while (element.parentNode) {
- if (element[attribute] && element[attribute]==type)
- return element.component;
- else
- element = element.parentNode;
- }
-}
-
-Richfaces.browser= {
- isIE: (!window.opera && /MSIE/.test(navigator.userAgent)),
- isIE6: (!window.opera && /MSIE\s*[6][\d,\.]+;/.test(navigator.userAgent)),
- isSafari: /Safari/.test(navigator.userAgent),
- isOpera: !!window.opera,
- isObjectEval: (Richfaces.eval!=undefined),
- isFF3: (!window.opera && /Firefox\s*[\/]3[\.]/.test(navigator.userAgent))
-};
-
-Richfaces.eval = function(template, object) {
- var value = '';
-
- try {
- with (object) {
- value = eval(template) ;
- }
- } catch (e) {
- LOG.warn('Exception: ' + e.message + '\n[' + template + ']');
- }
-
- return value;
-};
-
-Richfaces.interpolate = function (placeholders, context) {
-
- for(var k in context) {
- var v = context[k];
- var regexp = new RegExp("\\{" + k + "\\}", "g");
- placeholders = placeholders.replace(regexp, v);
- }
-
- return placeholders;
-
-};
-
-if (!Richfaces.position) Richfaces.Position={};
-
-Richfaces.Position.setElementPosition = function(element, baseElement, jointPoint,
direction, offset)
-{
- // parameters:
- // jointPoint: {x:,y:} or
('top-left','top-right','bottom'-left,'bottom-right')
- // direction:
('top-left','top-right','bottom'-left,'bottom-right',
'auto')
- // offset: {x:,y:}
-
- var elementDim = Richfaces.Position.getOffsetDimensions(element);
- var baseElementDim = Richfaces.Position.getOffsetDimensions(baseElement);
-
- var windowRect = Richfaces.Position.getWindowViewport();
-
- var baseOffset = Position.cumulativeOffset(baseElement);
-
- // jointPoint
- var ox=baseOffset[0];
- var oy=baseOffset[1];
- var re = /^(top|bottom)-(left|right)$/;
- var match;
-
- if (typeof jointPoint=='object') {ox = jointPoint.x; oy = jointPoint.y}
- else if ( jointPoint && (match=jointPoint.toLowerCase().match(re))!=null )
- {
- if (match[2]=='right') ox+=baseElementDim.width;
- if (match[1]=='bottom') oy+=baseElementDim.height;
- } else
- {
- // ??? auto
- }
-
- // direction
- if (direction && (match=direction.toLowerCase().match(re))!=null )
- {
- var d = direction.toLowerCase().split('-');
- if (match[2]=='left') { ox-=elementDim.width + offset.x; } else ox +=
offset.x;
- if (match[1]=='top') { oy-=elementDim.height + offset.y; } else oy +=
offset.y
- } else
- {
- // auto
- var theBest = {square:0};
- // jointPoint: bottom-right, direction: bottom-left
- var rect = {right: baseOffset[0] + baseElementDim.width, top: baseOffset[1] +
baseElementDim.height};
- rect.left = rect.right - elementDim.width;
- rect.bottom = rect.top + elementDim.height;
- ox = rect.left; oy = rect.top;
- var s = Richfaces.Position.checkCollision(rect, windowRect);
- if (s!=0)
- {
- if (ox>=0 && oy>=0 && theBest.square<s) theBest = {x:ox,
y:oy, square:s};
- // jointPoint: top-right, direction: top-left
- rect = {right: baseOffset[0] + baseElementDim.width, bottom: baseOffset[1]};
- rect.left = rect.right - elementDim.width;
- rect.top = rect.bottom - elementDim.height;
- ox = rect.left; oy = rect.top;
- s = Richfaces.Position.checkCollision(rect, windowRect);
- if (s!=0)
- {
- if (ox>=0 && oy>=0 && theBest.square<s) theBest = {x:ox,
y:oy, square:s};
- // jointPoint: bottom-left, direction: bottom-right
- rect = {left: baseOffset[0], top: baseOffset[1] + baseElementDim.height};
- rect.right = rect.left + elementDim.width;
- rect.bottom = rect.top + elementDim.height;
- ox = rect.left; oy = rect.top;
- s = Richfaces.Position.checkCollision(rect, windowRect);
- if (s!=0)
- {
- if (ox>=0 && oy>=0 && theBest.square<s) theBest = {x:ox,
y:oy, square:s};
- // jointPoint: top-left, direction: top-right
- rect = {left: baseOffset[0], bottom: baseOffset[1]};
- rect.right = rect.left + elementDim.width;
- rect.top = rect.bottom - elementDim.height;
- ox = rect.left; oy = rect.top;
- s = Richfaces.Position.checkCollision(rect, windowRect);
- if (s!=0)
- {
- // the best way selection
- if (ox<0 || oy<0 || theBest.square>s) {ox=theBest.x; oy=theBest.y}
- }
- }
- }
-
- }
- }
-
- element.style.left = ox + 'px';
- element.style.top = oy + 'px';
-};
-
-Richfaces.Position.getOffsetDimensions = function(element) {
- // from prototype 1.5.0 // Pavel Yascenko
- element = $(element);
- var display = $(element).getStyle('display');
- if (display != 'none' && display != null) // Safari bug
- return {width: element.offsetWidth, height: element.offsetHeight};
-
- // All *Width and *Height properties give 0 on elements with display none,
- // so enable the element temporarily
- var els = element.style;
- var originalVisibility = els.visibility;
- var originalPosition = els.position;
- var originalDisplay = els.display;
- els.visibility = 'hidden';
- els.position = 'absolute';
- els.display = 'block';
- var originalWidth = element.offsetWidth; // was element.clientWidth // Pavel
Yascenko
- var originalHeight = element.offsetHeight; // was element.clientHeight // Pavel
Yascenko
- els.display = originalDisplay;
- els.position = originalPosition;
- els.visibility = originalVisibility;
- return {width: originalWidth, height: originalHeight};
-};
-
-Richfaces.Position.checkCollision = function(elementRect, windowRect, windowOffset)
-{
- if (elementRect.left >= windowRect.left &&
- elementRect.top >= windowRect.top &&
- elementRect.right <= windowRect.right &&
- elementRect.bottom <= windowRect.bottom)
- return 0;
-
- var rect = {left: (elementRect.left>windowRect.left ? elementRect.left :
windowRect.left),
- top: (elementRect.top>windowRect.top ? elementRect.top : windowRect.top),
- right: (elementRect.right<windowRect.right ? elementRect.right :
windowRect.right),
- bottom: (elementRect.bottom<windowRect.bottom ? elementRect.bottom :
windowRect.bottom)};
- return (rect.right-rect.left)* (rect.bottom-rect.top);
-};
-
-
-Richfaces.Position.getWindowDimensions = function() {
- var w = self.innerWidth
- || document.documentElement.clientWidth
- || document.body.clientWidth
- || 0;
- var h = self.innerHeight
- || document.documentElement.clientHeight
- || document.body.clientHeight
- || 0;
- return {width:w, height: h};
-};
-
-Richfaces.Position.getWindowScrollOffset = function() {
- var dx = window.pageXOffset
- || document.documentElement.scrollLeft
- || document.body.scrollLeft
- || 0;
- var dy = window.pageYOffset
- || document.documentElement.scrollTop
- || document.body.scrollTop
- || 0;
- return {left:dx, top: dy};
-};
-
-Richfaces.Position.getWindowViewport = function() {
- var windowDim = Richfaces.Position.getWindowDimensions();
- var windowOffset = Richfaces.Position.getWindowScrollOffset();
- return {left:windowOffset.left, top:windowOffset.top, right:
windowDim.width+windowOffset.left, bottom: windowDim.height+windowOffset.top};
-};
-
-Richfaces.firstDescendant = function(node) {
- var n = node.firstChild;
- while (n && n.nodeType != 1) {
- n = n.nextSibling;
- }
-
- return n;
-};
-
-Richfaces.lastDescendant = function(node) {
- var n = node.lastChild;
- while (n && n.nodeType != 1) {
- n = n.previousSibling;
- }
-
- return n;
-};
-
-Richfaces.next = function(node) {
- var n = node;
- do {
- n = n.nextSibling;
- } while (n && n.nodeType != 1);
-
- return n;
-};
-
-Richfaces.previous = function(node) {
- var n = node;
- do {
- n = n.previousSibling;
- } while (n && n.nodeType != 1);
-
- return n;
-};
-
-Richfaces.removeNode = function(node) {
- if (node) {
- var parentNode = node.parentNode;
- if (parentNode) {
- parentNode.removeChild(node);
- }
- }
-};
-
-Richfaces.readAttribute = function(element, name) {
- var result = null;
-
- var node = element.getAttributeNode(name);
- if (node) {
- result = node.nodeValue;
- }
-
- return result;
-};
-
-Richfaces.writeAttribute = function(element, name, value) {
- var node = element.getAttributeNode(name);
-
- if (value !== null) {
- if (node) {
- node.nodeValue = value;
- } else {
- node = document.createAttribute(name);
- node.nodeValue = value;
- element.setAttributeNode(node);
- }
- } else {
- if (node) {
- element.removeAttributeNode(node);
- }
- }
-};
-
-Richfaces.mergeObjects = function() {
- var target = arguments[0];
- if (target) {
- for (var i = 1; i < arguments.length; i++) {
- var source = arguments[i];
- if (source) {
- for (var name in source) {
- if (!target[name]) {
- target[name] = source[name];
- }
- }
- }
- }
- }
-};
-
-Richfaces.invokeEvent = function(eventFunc, element, eventName, memo) {
- var result;
- if (eventFunc) {
- element = $(element);
- if (element == document && document.createEvent &&
!element.dispatchEvent)
- element = document.documentElement;
-
- var event;
- if (document.createEvent) {
- event = document.createEvent("HTMLEvents");
- event.initEvent("dataavailable", true, true);
- } else {
- event = document.createEventObject();
- event.eventType = "ondataavailable";
- }
-
- event.eventName = eventName;
- event.rich = {component:this};
- event.memo = memo || { };
- try {
- result = eventFunc.call(element,event);
- }
- catch (e) { LOG.warn("Exception: "+e.Message + "\n[on"+eventName +
"]"); }
- }
- if (result!=false) result = true;
- return result;
-};
-if (!window.RichShuttleUtils) {
- window.RichShuttleUtils = {};
-}
-
-RichShuttleUtils.execOnLoad = function(func, condition, timeout) {
-
- if (condition()) {
- func();
- } else {
- window.setTimeout(
- function() {
- RichShuttleUtils.execOnLoad(func, condition, timeout);
- },
- timeout
- );
- }
-};
-RichShuttleUtils.Condition = {
- ElementPresent : function(el) {
- return function () {
- //var el = $(element);
- return el && el.offsetHeight > 0;
- };
- }
-};
-
-Array.prototype.remove = function(object) {
- var index = this.indexOf(object, 0, this.length);
- if (index == -1) return;
- if (index == 0) {
- this.shift();
- } else {
- this.splice(index, 1);
- }
-};
-if (!window.Richfaces) { window.Richfaces = {}; }
-
-Richfaces.getExternalClass = function(classes, index) {
- if (classes) {
- var len = classes.length;
- while (index >= len) {
- index -= len;
- }
- return (classes[index]) ? classes[index] : "";
- }
- return "";
-}
-
-Richfaces.SelectItem = Class.create();
-
-Richfaces.SelectItem.findElement = function(elt, id) {
- var e = elt;
-
- if (e) {
- if (e.id == id) {
- return e;
- }
-
- e = e.firstChild;
- while (e) {
- var result = arguments.callee(e, id);
-
- if (result) {
- return result;
- }
-
- e = e.nextSibling;
- }
- }
-
- return null;
-};
-
-Richfaces.SelectItem.prototype = {
- initialize : function(label, id, node) {
- this._label = label;
- this._node = node;
-
- this._node.item = this;
- this._id = id;
-
- //XXX 2 optimize
- this.input = Richfaces.SelectItem.findElement(node, node.id + "StateInput");
-
- this.selected = /^s/.test(this.input.value);
- this.active = /^s?a/.test(this.input.value);
- },
-
- destroy: function() {
- this._node.item = null;
- },
-
- doActive : function(rowStoredClass, cellStoredClasses) {
- var classes = this.CLASSES;
- var row = this._node;
- var rowClass = classes.ROW.ACTIVE;
- var cellClass = classes.CELL.ACTIVE;
- if (this.isSelected()) {
- rowClass = classes.ROW.SELECTED + " " + classes.ROW.ACTIVE;
- cellClass = classes.CELL.SELECTED + " " + classes.CELL.ACTIVE;
- }
- this.changeClass(row, rowClass, cellClass, rowStoredClass, cellStoredClasses);
-
- this.active = true;
-
- this.saveState();
- },
-
- doSelect : function(rowStoredClass, cellStoredClasses) {
- var row = this._node;
- var classes = this.CLASSES;
-
- this.changeClass(row, classes.ROW.SELECTED, classes.CELL.SELECTED, rowStoredClass,
cellStoredClasses);
-
- this.selected = true;
-
- this.saveState();
- },
-
- doNormal : function(rowStoredClass, cellStoredClasses) {
- var row = this._node;
- var classes = this.CLASSES;
-
- this.changeClass(row, classes.ROW.NORMAL, classes.CELL.NORMAL, rowStoredClass,
cellStoredClasses);
-
- this.active = false;
- this.selected = false;
-
- this.saveState();
- },
-
- isSelected : function() {
- return this.selected;
- },
-
- isActive : function() {
- return this.active;
- },
-
- changeClass : function(row, rowClassName, cellClassName, rowStoredClass,
cellStoredClasses) {
- row.className = rowStoredClass + " " + rowClassName;
- var cells = row.cells;
- for (var i = 0; i < cells.length; i++) {
- var cell = cells[i];
- cell.className = Richfaces.getExternalClass(cellStoredClasses, cell.cellIndex) +
" " + cellClassName;
- }
- },
-
- /*addClass : function(row, classNameRow, classNameCell) {
- if (row.addClassName) {
- row.addClassName(classNameRow);
- } else {
- Element.addClassName(row, classNameRow);
- }
-
- var cells = row.cells;
- for (var i = 0; i < cells.length; i++) {
- var cell = cells[i];
- if (cell.addClassName) {
- cell.addClassName(classNameCell);
- } else {
- Element.addClassName(cell, classNameCell);
- }
- }
- },
-
- removeClass : function(row, classNameRow, classNameCell) {
- if (row.removeClassName) {
- row.removeClassName(classNameRow);
- } else {
- Element.removeClassName(row, classNameRow);
- }
- var cells = row.cells;
- for (var i = 0; i < cells.length; i++) {
- var cell = cells[i];
-
- if (cell.removeClassName) {
- cell.removeClassName(classNameCell);
- } else {
- Element.removeClassName(cell, classNameCell);
- }
- }
- },*/
-
- saveState: function() {
- var regex = /^s?a?/;
-
- if (this.selected && this.active) {
- this.input.value = this.input.value.replace(regex, 'sa');
- } else if (this.selected) {
- this.input.value = this.input.value.replace(regex, 's');
- } else if (this.active) {
- this.input.value = this.input.value.replace(regex, 'a');
- } else {
- this.input.value = this.input.value.replace(regex, '');
- }
- }
-}
-
-LayoutManager = function(headerId, contentId) {
- this.headerTable = $(headerId);
- this.contentTable = $(contentId);
- this.headerDiv = (this.headerTable) ? this.headerTable.parentNode : null;
- this.contentDiv = this.contentTable.parentNode;
-
- Event.observe(this.contentDiv, "scroll",
this.scrollHandler.bindAsEventListener(this));
-
-}
-
-LayoutManager.SCROLL_WIDTH = 17;
-
-LayoutManager.STYLE_CONTENTTD_BORDER = 1;
-LayoutManager.STYLE_CONTENTTD_PADDING = 4;
-
-LayoutManager.prototype.widthSynchronization = function() {
- if (Prototype.Browser.IE && this.contentDiv && this.contentTable
&& this.getScrollWidth()) {
- //IE displays unnecessary horizontal scroll
- //when vertical scroll's displayed
- if (this.contentTable.offsetWidth && ((this.contentTable.offsetWidth <=
this.contentDiv.clientWidth))) {
- this.contentTable.style.width = this.contentDiv.clientWidth + "px";
- if (this.headerTable) {
- this.headerTable.style.width = this.contentDiv.offsetWidth + "px";
- }
- this.contentDiv.style.overflowX = 'hidden';
- }
- } else {
- this.contentTable.style.width = "100%";
- }
-
- var rows = this.contentTable.tBodies[0].rows;
- if (rows && rows[0]) {
- //table can be empty
- var contentCells = rows[0].cells;
- if (!this.headerTable || !this.headerTable.tHead)
- return ;
- var headerCells = this.headerTable.tHead.rows[0].cells;
- var width;
- for (var i = 0; i < contentCells.length; i++) {
- var curCell = contentCells[i];
- var headCell = headerCells[i];
-
- width = LayoutManager.calculateWidth(curCell, headCell).colWidth;
- if (i == contentCells.length - 1) {
- width = width + this.getScrollWidth();
- }
- headCell.firstChild.style.width = width + "px";
- headCell.style.width = width + "px";
- }
- } else {
- if (this.headerTable && this.headerTable.tHead) {
- this.headerTable.style.width = "100%";
- }
- }
-}
-
-LayoutManager.prototype.getScrollWidth = function() {
- if (this.contentDiv.clientWidth != 0) {
- return this.contentDiv.offsetWidth - this.contentDiv.clientWidth;
- }
- return 0;
-}
-
-LayoutManager.prototype.scrollHandler = function() {
- if (this.headerDiv) {
- this.headerDiv.scrollLeft = this.contentDiv.scrollLeft;
- }
-}
-
-LayoutManager.getHeaderWidth = function(visibleBox, realBox) {
- return realBox.offsetWidth + (visibleBox.offsetWidth - visibleBox.clientWidth);
-}
-
-LayoutManager.isIE = function() {
- return (/MSIE/.test(navigator.userAgent) && !window.opera);
-}
-
-LayoutManager.getElemXY = function(elem) {
- var x = elem.offsetLeft;
- var y = elem.offsetTop;
-
- for (var parent = elem.offsetParent; parent; parent = parent.offsetParent) {
- x += parent.offsetLeft;
- y += parent.offsetTop;
- }
- return {left: x, top: y};
-}
-
-LayoutManager.calculateWidth = function(srcElem, tgtElem) {
- var srcElemBorderWidth = LayoutManager.getBorderWidth(srcElem, "lr");
- var srcElemPaddingWidth = LayoutManager.getPaddingWidth(srcElem, "lr");
- var srcElemMarginWidth = LayoutManager.getMarginWidth(srcElem, "lr");
-
- var tgtElemBorderWidth = LayoutManager.getBorderWidth(tgtElem, "lr");
- var tgtElemPaddingWidth = LayoutManager.getPaddingWidth(tgtElem, "lr");
- var tgtElemMarginWidth = LayoutManager.getMarginWidth(tgtElem, "lr");
- var srcWidth = srcElem.offsetWidth - srcElemBorderWidth - srcElemPaddingWidth -
srcElemMarginWidth;
- var colWidth = srcWidth + (srcElemBorderWidth - tgtElemBorderWidth)
- + (srcElemPaddingWidth - tgtElemPaddingWidth)
- + (srcElemMarginWidth - tgtElemMarginWidth);
- colWidth = (colWidth > 0) ? colWidth : 0;
- return {srcWidth : srcWidth, colWidth : colWidth};
-}
-
-LayoutManager.getBorderWidth = function(el, side) {
- return LayoutManager.getStyles(el, side, LayoutManager.borders);
-}
-
-LayoutManager.getPaddingWidth = function(el, side) {
- return LayoutManager.getStyles(el, side, LayoutManager.paddings);
-}
-
-LayoutManager.getMarginWidth = function(el, side) {
- return LayoutManager.getStyles(el, side, LayoutManager.margins);
-}
-
-LayoutManager.getStyles = function(el, sides, styles) {
- var val = 0;
- for(var i = 0, len = sides.length; i < len; i++){
- //if (el.getStyle) {
- var w = parseInt(Element.getStyle(el, styles[sides.charAt(i)]), 10);
- if(!isNaN(w)) val += w;
- //}
- }
- return val;
-}
-
-LayoutManager.borders = {l: 'border-left-width', r: 'border-right-width',
t: 'border-top-width', b: 'border-bottom-width'},
-LayoutManager.paddings = {l: 'padding-left', r: 'padding-right', t:
'padding-top', b: 'padding-bottom'},
-LayoutManager.margins = {l: 'margin-left', r: 'margin-right', t:
'margin-top', b: 'margin-bottom'}
-
-if(!window.Richfaces) window.Richfaces = {};
-
-Richfaces.Control = Class.create();
-
-Richfaces.Control.eventStub = function() {
- return false;
-}
-
-Richfaces.Control.onfocus = function(element) {
- element.hasFocus = true;
-}
-
-Richfaces.Control.onblur = function(element) {
- element.hasFocus = undefined;
-}
-
-Richfaces.Control.prototype.initialize = function(eNode, dNode, isShown, isEnabled,
action) {
- this.disabledNode = dNode;
- this.disabledNode.onselectstart = Richfaces.Control.eventStub;
-
- this.enabledNode = eNode
- this.enabledNode.onselectstart = Richfaces.Control.eventStub;
-
- this.isShown = isShown;
- this.isEnabled = isEnabled;
- this.action = action;
- //this.isEnabled ? this.doEnable() : this.doDisable();
- //this.isShown ? this.doShow() : this.doHide();
-}
-
-/*Control.CLASSES = {
- first : {hidden : "ol_button_border ol_control_hidden", shown :
"ol_button_border ol_control_shown"},
- down : {hidden : "ol_button_border ol_control_hidden", shown :
"ol_button_border ol_control_shown"},
- up : {hidden : "ol_button_border ol_control_hidden", shown :
"ol_button_border ol_control_shown"},
- last : {hidden : "ol_button_border ol_control_hidden", shown :
"ol_button_border ol_control_shown"}
-};*/
-
-Richfaces.Control.prototype.doShow = function() {
- this.isShown = true;
- if (this.isEnabled) {
- this.doHideNode(this.disabledNode);
- this.doShowNode(this.enabledNode);
- } else {
- this.doHideNode(this.enabledNode);
- this.doShowNode(this.disabledNode);
- }
-}
-
-Richfaces.Control.prototype.doHide = function() {
- this.isShown = false;
- this.doHideNode(this.disabledNode);
- this.doHideNode(this.enabledNode);
-}
-
-Richfaces.Control.prototype.doEnable = function() {
- this.isEnabled = true;
- this.doHideNode(this.disabledNode);
- this.doShowNode(this.enabledNode);
-}
-
-Richfaces.Control.prototype.doDisable = function() {
- this.isEnabled = false;
-
- var nodes = this.enabledNode.select("a[id='" + this.enabledNode.id +
"link']");
-
- var newFocusNode = undefined;
-
- if (nodes && nodes[0]) {
- var link = nodes[0];
- if (link.hasFocus) {
- var disNodes = this.disabledNode.select("a[id='" + this.disabledNode.id
+ "link']");
- if (disNodes && disNodes[0]) {
- newFocusNode = disNodes[0];
- }
- }
- }
-
- this.doHideNode(this.enabledNode);
- this.doShowNode(this.disabledNode);
- if (newFocusNode && newFocusNode.focus) {
- //For IE
- newFocusNode.disabled = false;
- newFocusNode.focus();
- //For IE
- newFocusNode.disabled = true;
- }
-}
-
-Richfaces.Control.prototype.doHideNode = function(node) {
- //node.className = Richfaces.Control.CLASSES[this.action].hidden;
- node.hide();
-}
-
-Richfaces.Control.prototype.doShowNode = function(node) {
- //node.className = Richfaces.Control.CLASSES[this.action].shown;
- node.show();
-}
-
-
-
-if(!window.Richfaces) window.Richfaces = {};
-Richfaces.disableSelectionText = function(e) {
- e = window.event||e;
- if (e.srcElement) {
- if (e.srcElement.tagName) {
- var tagName = e.srcElement.tagName.toUpperCase();
-
- if (tagName != "INPUT" && tagName != "TEXTAREA" /* any
items more? */) {
- return false;
- }
- }
- }
-};
-
-
-Richfaces.ListBase = Class.create();
-
-Richfaces.ListBase.compare = function(obj1, obj2) {
- return ((obj1 == obj2) ? 0 : ((obj1 < obj2) ? -1 : 1));
-}
-
-Richfaces.ListBase.ORDERING_LIST_CLASSES = {
- normal : "rich-ordering-list-items",
- disabled : "rich-ordering-list-disabled",
- active : "rich-ordering-list-active"
-}
-
-Richfaces.ListBase.ASC = "acs";
-Richfaces.ListBase.DESC = "desc";
-
-Richfaces.ListBase.CONTROL_SET = ["A", "INPUT", "TEXTAREA",
"SELECT", "OPTION", "BUTTON"];
-
-Richfaces.ListBase.prototype = {
- initialize : function(containerId, contentTableId, headerTableId, focusKeeperId,
- onclickControlId, controlClass, columnsClasses, rowClasses) {
- this["rich:destructor"] = "destroy";
- this.selectedItems = new Array();
-
- //this.layoutManager = layoutManager;
- this.container = $(containerId);
- this.shuttleTable = $(contentTableId);
- this.shuttleTable.onselectstart = Richfaces.disableSelectionText;
- this.focusKeeper = $(focusKeeperId);
- this.focusKeeper.focused = false;
- //this.setFocus();
- this.focusKeeper.observe("keydown", (function(e)
{this.onkeydownHandler(window.event || e)}).bindAsEventListener(this));
- this.focusKeeper.observe("blur", function (e)
{this.focusListener(e);}.bindAsEventListener(this));
- this.focusKeeper.observe("focus", function (e)
{this.onfocusHandler(e);}.bindAsEventListener(this));
-
- this.shuttleTbody = this.shuttleTable.tBodies[0];
-
- this.activeItem = null;
- this.pseudoActiveItem = null; //it services for items selection by Shift+click
- this.items = null;
-
- //FIX
- this.rowClasses = rowClasses;
- this.columnsClasses = columnsClasses;
-
- this.controlClass = controlClass;
- this.retrieveShuttleItems(containerId, controlClass);
- this.counter;
- this.shuttle = null;
- this.sortOrder = Richfaces.ListBase.ASC;
- this.clckHandler = function(e) {this.onclickHandler(window.event ||
e)}.bindAsEventListener(this);
- this.shuttleTable.observe("click", this.clckHandler);
-
- this.layoutManager = new LayoutManager(headerTableId, contentTableId);
-//---
http://jira.jboss.com/jira/browse/RF-3830 FF3 & Safari only!
- this.tableElement = document.getElementById(contentTableId);
- var rows = this.tableElement.tBodies[0].rows;
- if (rows && rows[0]) {
- this.firstTrElement = rows[0];
- if (this.firstTrElement.addEventListener && (Richfaces.browser.isFF3 ||
Richfaces.browser.isSafari)) {
- this.imagesOnLoad = this.imageLoadListener.bind(this);
- this.firstTrElement.addEventListener('load',this.imagesOnLoad, true);
- }
- }
-//---
- var synch = function()
{this.layoutManager.widthSynchronization()}.bindAsEventListener(this);
- RichShuttleUtils.execOnLoad(
- synch, RichShuttleUtils.Condition.ElementPresent(this.container), 100
- );
- },
-
- imageLoadListener: function (evt){
- this.layoutManager.widthSynchronization();
- if (this.firstTrElement.removeEventListener && (Richfaces.browser.isFF3 ||
Richfaces.browser.isSafari)) {
- this.firstTrElement.removeEventListener('load',this.imagesOnLoad, true);
- }
- },
-
- destroy: function() {
- this.shuttleTable.onselectstart = null;
- var items = this.shuttleItems;
- for (var i = 0; i < items.length; i++) {
- items[i].destroy();
- }
-
- },
-
- setActiveItem : function(newActiveItem) {
- this.pseudoActiveItem = newActiveItem;
- this.activeItem = newActiveItem;
- },
-
- retrieveShuttleItems : function(containerId, controlClass) {
- var rows = this.shuttleTbody.rows;
- this.shuttleItems = new Array();
- var id;
-
- for (var i = 0; i < rows.length; i++) {
- var row = rows[i];
- id = row.id.split(containerId + ":")[1];
- var item = new controlClass(null, (id || i), row);
- if (item.isSelected()) {
- this.selectedItems.push(row);
- }
- if (item.isActive()) {
- this.setActiveItem(row);
- }
- this.shuttleItems[i] = item;
- }
- },
-
- getExtremeItem : function(position) { //FIXME
- var extremeItem = this.selectedItems[0];
- var currentItem;
-
- for (var i = 1; i < this.selectedItems.length; i++) {
- currentItem = this.selectedItems[i];
- if (position == "first") {
- if (currentItem.rowIndex < extremeItem.rowIndex) {
- extremeItem = currentItem;
- }
- } else {
- if (currentItem.rowIndex > extremeItem.rowIndex) {
- extremeItem = currentItem;
- }
- }
- }
- return extremeItem;
- },
-
- getEventTargetRow : function(event) {
- var activeElem;
- if (event.target) {
- //activeElem = event.rangeParent.parentNode;
- activeElem = event.target;
- } else {
- activeElem = event.srcElement;
- }
-
- if (activeElem == null) {
- return;
- }
-
- if (activeElem.tagName &&
Richfaces.ListBase.CONTROL_SET.indexOf(activeElem.tagName.toUpperCase()) != -1) {
- return;
- }
-
- while (activeElem.tagName.toLowerCase() != "tr") {
- activeElem = activeElem.parentNode;
- if (!activeElem.tagName) {
- return; //for IE
- }
- }
- return activeElem;
- },
-
- onfocusHandler: function (event) {
- if (!this.activeItem && this.shuttleItems.length != 0) {
- this.setActiveItem(this.shuttleItems[0]._node);
- }
-
- if (this.activeItem) {
- this.activeItem.item.doActive(this.getExtRowClass(this.activeItem.rowIndex),
this.columnsClasses);
- }
- },
-
- onclickHandler : function(event) {
- if (event.srcElement && (event.srcElement.tagName.toLowerCase() ==
"tbody")) {
- return;
- }
- var activeElem = this.getEventTargetRow(event);
- if (activeElem != null) {
-
- if (event.ctrlKey) {
- this.addSelectedItem(activeElem);
- this.setActiveItem(activeElem);
- } else if (event.shiftKey) {
- if (!this.pseudoActiveItem) {
- this.selectionItem(activeElem);
- this.setActiveItem(activeElem);
- } else {
- this.selectItemGroup(activeElem);
- this.activeItem = activeElem; //given event works with pseudoActiveItem
- }
- } else {
- this.selectionItem(activeElem);
- this.setActiveItem(activeElem);
- }
-
-
- this.setFocus();
- }
- },
-
- onkeydownHandler : function(event) {
- var action = null;
- switch (event.keyCode) {
- case 38 : //up arrow
- action = 'up';
- this.moveActiveItem(action, event);
- Event.stop(event);
- break;
- case 40 : //down arrow
- action = 'down';
- this.moveActiveItem(action, event);
- Event.stop(event);
- break;
- case 65 : // Ctrl + A
- if (event.ctrlKey) {
- this.selectAll();
- }
- this.activeItem.item.doActive(this.getExtRowClass(this.activeItem.rowIndex),
this.columnsClasses);
- Event.stop(event);
- break;
- }
- },
-
- moveActiveItem : function(action, event) {
- var item = this.activeItem;
- var rows = this.shuttleTbody.rows;
- if ((action == 'up') && (item.rowIndex > 0)) {
- this.changeActiveItems(rows[item.rowIndex - 1], item);
- } else if ((action == 'down') && (item.rowIndex <
this.shuttleItems.length - 1)) {
- this.changeActiveItems(rows[item.rowIndex + 1], item);
- }
-
- this.autoScrolling(action, event);
-
- },
-
- changeActiveItems : function(newItem, item) {
- item.item.doNormal();
- this.resetMarked();
-
- newItem.item.doSelect(this.getExtRowClass(newItem.rowIndex), this.columnsClasses);
- newItem.item.doActive(this.getExtRowClass(newItem.rowIndex), this.columnsClasses);
- this.setActiveItem(newItem);
- this.selectedItems.push(newItem);
- },
-
- selectAll : function() {
- this.resetMarked();
- var startIndex = 0;
- var endIndex = this.shuttleItems.length - 1;
- this.selectItemRange(startIndex, endIndex);
- },
-
- /**
- * Click handler
- */
- selectionItem : function(activeItem) {
- var markedShuttleItem = activeItem;
-
- this.resetMarked();
- if (activeItem.item.isSelected()) {
- activeItem.item.doNormal(this.getExtRowClass(activeItem.rowIndex),
this.columnsClasses);
- } else {
- activeItem.item.doSelect(this.getExtRowClass(activeItem.rowIndex),
this.columnsClasses);
- this.selectedItems[0] = markedShuttleItem; //TODO: delete
- }
- },
-
- /**
- * CTRL+Click handler
- */
- addSelectedItem : function(activeItem) {
- var markedShuttleItem = activeItem;
-
- if (activeItem.item.isSelected()) {
- this.selectedItems.remove(markedShuttleItem); //TODO :delete
- activeItem.item.doNormal(this.getExtRowClass(activeItem.rowIndex),
this.columnsClasses);
- } else {
- activeItem.item.doSelect(this.getExtRowClass(activeItem.rowIndex),
this.columnsClasses);
- this.selectedItems.push(markedShuttleItem); //TODO :delete
- }
-
- if ((this.activeItem != null) && (this.activeItem.rowIndex !=
activeItem.rowIndex)) {
- //reset activity of an element
- if (this.activeItem.item.isSelected()) {
- this.activeItem.item.doSelect(this.getExtRowClass(this.activeItem.rowIndex),
this.columnsClasses);
- } else {
- this.activeItem.item.doNormal(this.getExtRowClass(this.activeItem.rowIndex),
this.columnsClasses);
- }
- }
- },
-
- /**
- * Shift+Click handler
- */
- selectItemGroup : function(currentItem) {
- //FIXME
- var activeItemIndex = this.pseudoActiveItem.rowIndex;
- var startIndex;
- var endIndex;
-
- if (currentItem.rowIndex > activeItemIndex) {
- startIndex = activeItemIndex;
- endIndex = currentItem.rowIndex;
- } else {
- startIndex = currentItem.rowIndex;
- endIndex = activeItemIndex;
- }
-
- this.resetMarked();
-
- this.selectItemRange(startIndex, endIndex);
- },
-
- selectItemRange : function(startIndex, endIndex) {
- var rows = this.shuttleTbody.rows;
- for (var i = startIndex; i <= endIndex; i++) {
- rows[i].item.doSelect(this.getExtRowClass(rows[i].rowIndex), this.columnsClasses);
- this.selectedItems.push(rows[i]);
- }
- },
-
- resetMarked : function() {
- var rows = this.selectedItems;
- var length = rows.length;
- for (var i = 0; i < length; i++) {
- var shuttleItem = rows[i];
- shuttleItem.item.doNormal(this.getExtRowClass(shuttleItem.rowIndex),
this.columnsClasses);
- }
- this.selectedItems.length = 0;
-
- //need to reset active item
- },
-
- getSelectItemByNode : function(selectItemNode) {
- for (var i = 0; i < this.shuttleItems.length; i++) {
- var item = this.shuttleItems[i];
- if (selectItemNode.rowIndex == item._node.rowIndex) {
- return item;
- }
- }
- return null;
- },
-
- autoScrolling : function(action, event) {
- this.selectedItems.sort(this.compareByRowIndex);
- var increment;
- var scrollTop = this.shuttleTable.parentNode.scrollTop;
-
- var shuttleTop = LayoutManager.getElemXY(this.shuttleTable.parentNode).top;
-
- if (action == 'up' || action == 'first') {
- var targetItemTop = LayoutManager.getElemXY(this.selectedItems[0]).top;
- increment = (targetItemTop - scrollTop) - shuttleTop;
- if (increment < 0) {
- this.shuttleTable.parentNode.scrollTop += increment;
- }
- } else if (action == 'down' || action == 'last') {
- var item = this.selectedItems[this.selectedItems.length - 1];
- var targetItemBottom =
LayoutManager.getElemXY(this.selectedItems[this.selectedItems.length - 1]).top +
item.offsetHeight;
- var increment = (targetItemBottom - scrollTop) - (shuttleTop +
this.shuttleTable.parentNode.clientHeight);
- if (increment > 0) {
- this.shuttleTable.parentNode.scrollTop += increment;
- }
- }
- if (event) Event.stop(event);
- },
-
- setFocus : function() {
- this.focusKeeper.focus();
- this.focusKeeper.focused = true;
- },
-
- focusListener : function(e) {
- e = e || window.event;
- this.focusKeeper.focused = false;
-
- if (this.activeItem) {
- if (this.activeItem.item.isSelected()) {
- this.activeItem.item.doSelect(this.getExtRowClass(this.activeItem.rowIndex),
this.columnsClasses);
- } else {
- this.activeItem.item.doNormal(this.getExtRowClass(this.activeItem.rowIndex),
this.columnsClasses);
- }
- }
- },
-
- compareByLabel : function(obj1, obj2) {
- obj1 = obj1._label;
- obj2 = obj2._label;
- return Richfaces.ListBase.compare(obj1, obj2);
- },
-
- compareByRowIndex : function(obj1, obj2) {
- obj1 = obj1.rowIndex;
- obj2 = obj2.rowIndex;
- return Richfaces.ListBase.compare(obj1, obj2);
- },
-
- isListActive : function() {
- if ((this.activeItem != null || this.selectedItems.length != 0) &&
this.focusKeeper.focused) {
- return true;
- }
- return false;
- },
-
- getExtRowClass : function(index) {
- return Richfaces.getExternalClass(this.rowClasses, index);
- },
-
- getSelection : function() {
- var result = [];
- for (var i = 0; i < this.selectedItems.length; i++) {
- result[i] = this.selectedItems[i].item;
- }
- return result;
- },
-
- getItems : function() {
- return this.shuttleTbody.rows;
- }
-}
-if(!window.Richfaces) window.Richfaces = {};
-
-Richfaces.OrderingListSelectItem = Class.create(Richfaces.SelectItem);
-Richfaces.OrderingListSelectItem.prototype.CLASSES = {
- ROW : {
- ACTIVE : "rich-ordering-list-row-active",
- SELECTED : "rich-ordering-list-row-selected",
- DISABLED : "rich-ordering-list-row-disabled",
- NORMAL : "rich-ordering-list-row"
- },
- CELL : {
- ACTIVE : "rich-ordering-list-cell-active",
- SELECTED : "rich-ordering-list-cell-selected",
- DISABLED : "rich-ordering-list-cell-disabled",
- NORMAL : "rich-ordering-list-cell",
- BEGIN: " rich-ordering-list-cell-first",
- END: " rich-ordering-list-cell-last"
- }
-},
-
-
-Richfaces.OrderingList = Class.create(Richfaces.ListBase, {
- initialize: function($super, containerId, contentTableId, headerTableId, focusKeeperId,
ids, onclickControlId, events, controlClass, columnsClasses, rowClasses) {
- $super(containerId, contentTableId, headerTableId, focusKeeperId, onclickControlId,
controlClass, columnsClasses, rowClasses);
-
- this.container.component = this;
-
- this.events = events;
- this.controlList = new Array();
- this.initControlList(containerId, ids);
-
- for (var e in this.events) {
- if (e && this.events[e]) {
- this.container.observe("rich:" + e.toString(), this.events[e]);
- }
- }
- },
-
- destroy: function($super) {
- $super();
-
- this.container.component = null;
- },
-
- initControlList : function(containerId, ids) {
- for (var i = 0; i < ids.length; i++) {
- var id = ids[i];
- var node = $(containerId + id[0]);
- var disNode = $(containerId + id[1]);
- if (node && disNode) {
- node.observe('click',
Richfaces.OrderingList.HANDLERS[id[0]].bindAsEventListener(this));
- this.controlList[i] = new Richfaces.Control(node, disNode, false, false, id[0]);
- }
- }
- },
-
- controlListManager : function() {
- this.selectedItems.sort(this.compareByRowIndex);
- var control;
- //FIXME
- this.controlsProcessing(["first", "last", "down",
"up"], "enable");
- if ((this.shuttleItems.length == 0) || (this.selectedItems.length == 0)) {
- this.controlsProcessing(["first", "last", "down",
"up"], "disable");
- } else {
- if (this.selectedItems[0].rowIndex == 0)
- this.controlsProcessing(["first", "up"], "disable");
- if (this.selectedItems[this.selectedItems.length - 1].rowIndex ==
(this.shuttleItems.length - 1))
- this.controlsProcessing(["down", "last"], "disable");
- }
- },
-
- controlsProcessing : function(disabledControls , action) {
- for (var i = 0; i < this.controlList.length; i++) {
- control = this.controlList[i];
- if (control != null) {
- if (disabledControls != null && disabledControls.indexOf(control.action) !=
-1) {
- if (action == "disable") {
- control.doDisable();
- } else {
- control.doEnable();
- }
- }
- }
- }
- },
-
- onclickHandler : function($super, event) {
- $super(event);
- this.controlListManager();
- },
-
- moveActiveItem : function($super, action, event) {
- $super(action, event);
- this.controlListManager();
- },
-
- moveSelectedItems : function(action, event) {
- if (this.selectedItems.length > 0) {
-
- if (Richfaces.invokeEvent(this.events.onorderchange, this.container,
"rich:onorderchange", {items: this.shuttleItems})) {
- event = window.event||event;
- var rows = this.shuttleTbody.rows;
- var item;
-
- this.selectedItems.sort(this.compareByRowIndex);
-
- if ((action == 'up') &&
this.getExtremeItem("first").previousSibling) {
- for (var i = 0; i < this.selectedItems.length; i++) {
- item = this.selectedItems[i];
- item.parentNode.insertBefore(item, item.previousSibling);
- }
- } else if ((action == 'down') &&
this.getExtremeItem("last").nextSibling) {
- for (var i = this.selectedItems.length - 1; i > -1; i--) {
- item = this.selectedItems[i];
- item.parentNode.insertBefore(item.nextSibling, item);
- }
- } else if (action == 'first') {
- var incr = this.selectedItems[0].rowIndex;
- for (var i = 0; i < this.selectedItems.length; i++) {
- item = this.selectedItems[i];
- item.parentNode.insertBefore(item, rows[item.rowIndex - incr]);
- }
- } else if (action == 'last') {
- var length = this.shuttleItems.length;
- var incr = length - this.selectedItems[this.selectedItems.length - 1].rowIndex;
- for (var i = this.selectedItems.length - 1; i > -1; i--) {
- item = this.selectedItems[i];
- if (item.rowIndex + incr > length - 1) {
- item.parentNode.insertBefore(item, null);
- } else {
- item.parentNode.insertBefore(item, rows[item.rowIndex + incr]);
- }
- }
- }
-
- this.shuttleItems = new Array();
- for (var i = 0; i < rows.length; i++) {
- this.shuttleItems.push(rows[i].item);
- }
- if (action != null)
- this.autoScrolling(action, event);
-
- this.container.fire("rich:onorderchanged", {items: this.shuttleItems});
- this.controlListManager();
- }
- }
- },
-
- onkeydownHandler : function(event) {
- var action = null;
- switch (event.keyCode) {
- case 34 : action = 'last';
- this.moveSelectedItems(action ,event);
- Event.stop(event);
- break; //page down
- case 33 : action = 'first';
- this.moveSelectedItems(action, event);
- Event.stop(event);
- break; //page up
- case 38 : //up arrow
- action = 'up';
- if (event.ctrlKey) {
- this.moveSelectedItems(action, event);
- } else {
- this.moveActiveItem(action, event);
- }
- Event.stop(event);
- break;
- case 40 : //down arrow
- action = 'down';
- if (event.ctrlKey) {
- this.moveSelectedItems(action ,event);
- } else {
- this.moveActiveItem(action, event);
- }
- Event.stop(event);
- break;
- case 65 : // Ctrl + A
- if (event.ctrlKey) {
- this.selectAll();
- }
- this.activeItem.item.doActive(this.getExtRowClass(this.activeItem.rowIndex),
this.columnsClasses);
- this.controlListManager();
- Event.stop(event);
- break;
- }
- },
-
- top : function(e) {
- this.container.fire("rich:ontopclick", {items: this.shuttleItems, selection:
this.getSelection()});
- this.moveSelectedItems("first", e);
- },
-
- bottom : function(e) {
- this.container.fire("rich:onbottomclick", {items: this.shuttleItems,
selection: this.getSelection()});
- this.moveSelectedItems("last", e);
- },
-
- up : function(e) {
- this.container.fire("rich:onupclick", {items: this.shuttleItems, selection:
this.getSelection()});
- this.moveSelectedItems("up", e);
- },
-
- down : function(e) {
- this.container.fire("rich:ondownclick", {items: this.shuttleItems, selection:
this.getSelection()});
- this.moveSelectedItems("down", e);
- }
-
-});
-
-Richfaces.OrderingList.ACTIVITY_MARKER = "a";
-Richfaces.OrderingList.SELECTION_MARKER = "s";
-Richfaces.OrderingList.ITEM_SEPARATOR = ",";
-
-Richfaces.OrderingList.HANDLERS = {
- first: function (e) { this.top(e); return false; },
- last: function (e) { this.bottom(e); return false; },
- up: function (e) { this.up(e); return false; },
- down: function (e) { this.down(e); return false; }
-};
-if(!window.Richfaces) window.Richfaces = {};
-
-Richfaces.ListShuttle = Class.create();
-
-Richfaces.ListShuttle.Source = Class.create(Richfaces.ListBase);
-Richfaces.ListShuttle.Target = Class.create(Richfaces.OrderingList);
-
-Richfaces.ListShuttle.Source.SelectItem = Class.create(Richfaces.SelectItem);
-Richfaces.ListShuttle.Source.SelectItem.prototype.CLASSES = {
- ROW : {
- ACTIVE : "rich-shuttle-source-row-active",
- SELECTED : "rich-shuttle-source-row-selected",
- DISABLED : "rich-shuttle-source-row-disabled",
- NORMAL : "rich-shuttle-source-row"
- },
- CELL : {
- ACTIVE : "rich-shuttle-source-cell-active",
- SELECTED : "rich-shuttle-source-cell-selected",
- DISABLED : "rich-shuttle-source-cell-disabled",
- NORMAL : "rich-shuttle-source-cell",
- BEGIN: " rich-shuttle-source-cell-first",
- END: " rich-shuttle-source-cell-last"
- }
-}
-
-Richfaces.ListShuttle.Target.SelectItem = Class.create(Richfaces.SelectItem);
-Richfaces.ListShuttle.Target.SelectItem.prototype.CLASSES = {
- ROW : {
- ACTIVE : "rich-shuttle-target-row-active",
- SELECTED : "rich-shuttle-target-row-selected",
- DISABLED : "rich-shuttle-target-row-disabled",
- NORMAL : "rich-shuttle-target-row"
- },
- CELL : {
- ACTIVE : "rich-shuttle-target-cell-active",
- SELECTED : "rich-shuttle-target-cell-selected",
- DISABLED : "rich-shuttle-target-cell-disabled",
- NORMAL : "rich-shuttle-target-cell",
- BEGIN: " rich-shuttle-target-cell-first",
- END: " rich-shuttle-target-cell-last"
- }
-}
-
-Richfaces.ListShuttle.prototype = {
- initialize: function(targetList, sourceList, clientId, controlIds, switchByClick,
events) {
- this.containerId = clientId;
- this["rich:destructor"] = "destroy";
-
- this.container = $(this.containerId);
- this.container.component = this;
-
- this.targetList = targetList;
- this.sourceList = sourceList;
-
- this.events = events;
-
- this.isFocused = false;
- this.wasMouseDown = false;
- this.skipBlurEvent = false;
-
- this.targetLayoutManager = targetList.layoutManager;
- this.sourceLayoutManager = sourceList.layoutManager;
-
- //for focus\blur custom events
- this.container.observe("focus", function (e)
{this.focusOrBlurHandlerLS(e);}.bindAsEventListener(this));
- this.container.observe("keypress", function (e)
{this.focusOrBlurHandlerLS(e);}.bindAsEventListener(this));
- this.container.observe("keydown", function (e)
{this.focusOrBlurHandlerLS(e);}.bindAsEventListener(this));
- this.container.observe("mousedown", function (e)
{this.focusOrBlurHandlerLS(e);}.bindAsEventListener(this));
- this.container.observe("click", function (e)
{this.focusOrBlurHandlerLS(e);}.bindAsEventListener(this));
- this.container.observe("blur", function (e)
{this.focusOrBlurHandlerLS(e);}.bindAsEventListener(this));
-
- if (switchByClick == "true") {
- this.targetList.shuttleTable.observe("click", function(e)
{this.moveItemByClick(window.event||e, this.targetList,
this.sourceList)}.bindAsEventListener(this));
- this.sourceList.shuttleTable.observe("click", function(e)
{this.moveItemByClick(window.event||e, this.sourceList,
this.targetList)}.bindAsEventListener(this));
- Event.stopObserving(this.sourceList.shuttleTable, "click",
this.sourceList.clckHandler);
- Event.stopObserving(this.targetList.shuttleTable, "click",
this.targetList.clckHandler);
- } else {
- this.targetList.shuttleTable.observe("dblclick", function(e)
{this.moveItemByClick(window.event||e, this.targetList,
this.sourceList)}.bindAsEventListener(this));
- this.sourceList.shuttleTable.observe("dblclick", function(e)
{this.moveItemByClick(window.event||e, this.sourceList,
this.targetList)}.bindAsEventListener(this));
-
- sourceList._onclickHandler = sourceList.onclickHandler;
- sourceList.onclickHandler = function(e) { this.onclickHandler(e, sourceList);
}.bindAsEventListener(this);
- targetList._onclickHandler = targetList.onclickHandler;
- targetList.onclickHandler = function(e) { this.onclickHandler(e, targetList);
}.bindAsEventListener(this);
- }
-
- sourceList._onkeydownHandler = sourceList.onkeydownHandler;
- sourceList.onkeydownHandler = function(e) { this.onkeydownHandler(e, sourceList);
}.bindAsEventListener(this);
- targetList._onkeydownHandler = targetList.onkeydownHandler;
- targetList.onkeydownHandler = function(e) { this.onkeydownHandler(e, targetList);
}.bindAsEventListener(this);
-
- this.controlList = new Array();
- this.initControlList(clientId, controlIds);
-
- for (var e in this.events) {
- if (e && this.events[e]) {
- this.container.observe("rich:" + e.toString(), this.events[e]);
- }
- }
- },
-
- destroy: function() {
- this.container.component = null;
- this.targetList.destroy();
- this.sourceList.destroy();
- },
-
- initControlList : function(clientId, ids) {
- for (var i = 0; i < ids.length; i++) {
- var id = ids[i];
- var node = $(clientId + id[0]);
- var disNode = $(clientId + id[1]);
- if (node && disNode) {
- node.observe("click",
Richfaces.ListShuttle.HANDLERS[id[0]].bindAsEventListener(this));
- this.controlList[i] = new Richfaces.Control(node, disNode, false, false, id[0]);
- }
- }
- //this.controlListManager();
- },
-
- controlListManager : function() {
- //this.controlsProcessing();
- this.controlsProcessing(["copy", "copyAll", "removeAll"
,"remove"], "enable");
- if (this.sourceList.shuttleItems.length < 1)
- this.controlsProcessing(["copy", "copyAll"],
"disable");
- if (this.sourceList.selectedItems.length < 1)
- this.controlsProcessing(["copy"] , "disable");
- if (this.targetList.shuttleItems.length < 1)
- this.controlsProcessing(["removeAll" ,"remove"],
"disable");
- if (this.targetList.selectedItems.length < 1) {
- this.controlsProcessing(["remove"], "disable");
- }
- },
-
- onclickHandler : function(event, component) {
- component._onclickHandler(event);
- this.controlListManager();
- //Event.stop(event); //bug: RF-2097
- },
-
- onkeydownHandler : function(event, component) {
- component._onkeydownHandler(event);
- this.controlListManager();
- },
-
- controlsProcessing : function(disabledControls , action) {
- for (var i = 0; i < this.controlList.length; i++) {
- control = this.controlList[i];
- if (control != null) {
- if (disabledControls != null && disabledControls.indexOf(control.action) !=
-1) {
- if (action == "disable") {
- control.doDisable();
- } else {
- control.doEnable();
- }
- }
- }
- }
- },
-
- moveItems : function(sourceComponent, targetComponent, items) {
- if (Richfaces.invokeEvent(this.events.onlistchange, this.container,
"rich:onlistchange", {sourceItems: sourceComponent.shuttleItems, targetItems:
targetComponent.shuttleItems})) {
- if (items.length > 0) {
- var length = items.length;
- for (var i = 0; items.length > 0;) {
- var item = items[i];
- this.moveItem(sourceComponent, targetComponent, item);
- }
- this.controlListManager();
- if (this.targetList.controlListManager) {
- this.targetList.controlListManager();
- }
-
- this.targetLayoutManager.widthSynchronization();
- this.sourceLayoutManager.widthSynchronization();
-
- this.container.fire("rich:onlistchanged", {sourceItems:
sourceComponent.shuttleItems, targetItems: targetComponent.shuttleItems});
- }
- }
- },
-
- moveItem : function(sourceComponent, targetComponent, item) {
- if (!item) {
- return;
- }
- if (!(item instanceof Richfaces.SelectItem)) {
- item = sourceComponent.getSelectItemByNode(item);
- }
- if (!LayoutManager.isIE() && (targetComponent.shuttleTbody.rows.length == 0))
{
- var newItem = null;
- if (item instanceof Richfaces.ListShuttle.Target.SelectItem) {
- newItem = new this.targetList.controlClass(item._label, item._id,
item._node.cloneNode(true));
- } else {
- newItem = new this.sourceList.controlClass(item._label, item._id,
item._node.cloneNode(true));
- }
- this.tableUpdate(targetComponent);
- this.addItem(targetComponent, newItem);
-
- this.removeItem(sourceComponent, item);
- sourceComponent.shuttleTable.deleteRow(item._node.rowIndex);
- } else {
- this.addItem(targetComponent, item);
- this.removeItem(sourceComponent, item);
- }
- },
-
- removeItem : function(component, item) {
- var items = component.shuttleItems;
- component.selectedItems.remove(item._node);
- items.remove(item);
- if (item == component.activeItem) {
- component.activeItem == null;
- }
- },
-
- addItem : function(component, item) {
- item.doNormal(Richfaces.getExternalClass(item.rowIndex), component.columnsClasses);
-
- component.shuttleTbody.insertBefore(item._node, null);
- component.shuttleItems.push(item);
- },
-
- tableUpdate : function(component) {
- var table = component.shuttleTable;
- var tbody = table.tBodies[0];
- var newTbody = tbody.cloneNode(false);
- table.removeChild(tbody);
- table.appendChild(newTbody);
- component.shuttleTbody = table.tBodies[0];
- },
-
- moveItemByClick : function(event, sourceComponent, targetComponent, layoutManager) {
- if (Richfaces.invokeEvent(this.events.onlistchange, this.container,
"rich:onlistchange", {sourceItems: sourceComponent.shuttleItems, targetItems:
targetComponent.shuttleItems})) {
- var item = this.sourceList.getEventTargetRow(event);
- this.moveItem(sourceComponent, targetComponent, item);
-
- this.controlListManager();
- if (this.targetList.controlListManager) {
- this.targetList.controlListManager();
- }
-
- this.targetLayoutManager.widthSynchronization();
- this.sourceLayoutManager.widthSynchronization();
-
- this.container.fire("rich:onlistchanged", {sourceItems:
sourceComponent.shuttleItems, targetItems: targetComponent.shuttleItems});
- }
- },
-
- copyAll : function() {
- this.container.fire("rich:oncopyallclick", {sourceItems:
this.sourceList.shuttleItems, targetItems: this.targetList.shuttleItems, selection:
this.sourceList.getSelection()});
- this.moveItems(this.sourceList, this.targetList, this.sourceList.shuttleItems);
- },
-
- copy : function() {
- this.container.fire("rich:oncopyclick", {sourceItems:
this.sourceList.shuttleItems, targetItems: this.targetList.shuttleItems, selection:
this.sourceList.getSelection()});
- this.moveItems(this.sourceList, this.targetList, this.sourceList.selectedItems);
- },
-
- removeAll : function() {
- this.container.fire("rich:onremoveallclick", {sourceItems:
this.sourceList.shuttleItems, targetItems: this.targetList.shuttleItems, selection:
this.targetList.getSelection()});
- this.moveItems(this.targetList, this.sourceList, this.targetList.shuttleItems);
- },
-
- remove : function() {
- this.container.fire("rich:onremoveclick", {sourceItems:
this.sourceList.shuttleItems, targetItems: this.targetList.shuttleItems, selection:
this.targetList.getSelection()});
- this.moveItems(this.targetList, this.sourceList, this.targetList.selectedItems);
- },
-
- up : function() {
- this.targetList.up();
- },
-
- down : function() {
- this.targetList.down();
- },
-
- top : function() {
- this.targetList.top();
- },
-
- bottom : function() {
- this.targetList.bottom();
- },
-
- focusOrBlurHandlerLS : function(e) {
- var componentID = e.target.id;
- if (e.type == "keydown") {
- var code = e.which;
- this.skipBlurEvent = false;
- this.wasKeyDown = true;
- if (Event.KEY_TAB == code) {
- if (e.shiftKey) {
- if ((componentID == this.sourceList.focusKeeper.id) && this.isFocused) {
- //blur:shift+tab keys were pressed
- this.fireOnblurEvent();
- } else {
- this.skipBlurEvent = true;
- }
- } else {
- if ((componentID == this.targetList.focusKeeper.id) && this.isFocused) {
- //blur:tab key was pressed
- this.fireOnblurEvent();
-
- } else {
- this.skipBlurEvent = true;
- }
- }
- }
- } else if (e.type == "mousedown") {
- this.skipBlurEvent = false;
- this.wasMouseDown = true;
- if (!this.isFocused) {
- this.fireOnfocusEvent();
- }
- } else if (e.type == "click") {
- this.wasMouseDown = false;
- } else if (e.type == "keypress") {
- this.wasKeyDown = false;
- } else if (e.type == "focus") {
- if (componentID == this.sourceList.focusKeeper.id && !this.wasMouseDown
&& !this.isFocused) {
- //focus:tab key was pressed
- this.fireOnfocusEvent();
- } else if (componentID == this.targetList.focusKeeper.id && !this.wasMouseDown
&& !this.isFocused) {
- //focus:shift+tab keys were pressed
- this.fireOnfocusEvent();
- }
- } else if (e.type == "blur") {
- //onblur event
- if (!this.wasMouseDown && !this.wasKeyDown && this.isFocused
&& !this.skipBlurEvent) {
- //blur:click component outside
- this.fireOnblurEvent();
- }
- }
- },
-
- fireOnfocusEvent : function() {
- //LOG.warn("fireOnfocusEvent|");
- this.isFocused = true;
- this.container.fire("rich:onfocus", {});
- },
-
- fireOnblurEvent : function() {
- //LOG.warn("fireOnblurEvent|");
- this.isFocused = false;
- this.container.fire("rich:onblur", {});
- }
-};
-
-Richfaces.ListShuttle.HANDLERS = {
- copy: function (e) { this.copy(); return false; },
- copyAll: function (e) { this.copyAll(); return false; },
- remove: function (e) { this.remove(); return false; },
- removeAll: function (e) { this.removeAll(); return false; }
-};
-// ============================= after ==========================