PageRenderTime 105ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 2ms

/Website/js/head.js

#
JavaScript | 4444 lines | 4421 code | 0 blank | 23 comment | 1228 complexity | b1d6ec79fffed808ef87f9f20bf6fbc7 MD5 | raw file
  1. theObjects = document.getElementsByTagName("object");for (var i = 0; i < theObjects.length; i++) {
  2. theObjects[i].outerHTML = theObjects[i].outerHTML;}
  3. /* Prototype JavaScript framework, version 1.6.0.1
  4. * (c) 2005-2007 Sam Stephenson
  5. *
  6. * Prototype is freely distributable under the terms of an MIT-style license.
  7. * For details, see the Prototype web site: http://www.prototypejs.org/
  8. *
  9. *--------------------------------------------------------------------------*/
  10. var Prototype = {
  11. Version: '1.6.0.1',
  12. Browser: {
  13. IE: !!(window.attachEvent && !window.opera),
  14. Opera: !!window.opera,
  15. WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
  16. Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
  17. MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
  18. },
  19. BrowserFeatures: {
  20. XPath: !!document.evaluate,
  21. ElementExtensions: !!window.HTMLElement,
  22. SpecificElementExtensions:
  23. document.createElement('div').__proto__ &&
  24. document.createElement('div').__proto__ !==
  25. document.createElement('form').__proto__
  26. },
  27. ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
  28. JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
  29. emptyFunction: function() { },
  30. K: function(x) { return x }
  31. };if (Prototype.Browser.MobileSafari)
  32. Prototype.BrowserFeatures.SpecificElementExtensions = false;/* Based on Alex Arnell's inheritance implementation. */
  33. var Class = {
  34. create: function() {
  35. var parent = null, properties = $A(arguments);if (Object.isFunction(properties[0]))
  36. parent = properties.shift();function klass() {
  37. this.initialize.apply(this, arguments);}
  38. Object.extend(klass, Class.Methods);klass.superclass = parent;klass.subclasses = [];if (parent) {
  39. var subclass = function() { };subclass.prototype = parent.prototype;klass.prototype = new subclass;parent.subclasses.push(klass);}
  40. for (var i = 0; i < properties.length; i++)
  41. klass.addMethods(properties[i]);if (!klass.prototype.initialize)
  42. klass.prototype.initialize = Prototype.emptyFunction;klass.prototype.constructor = klass;return klass;}
  43. };Class.Methods = {
  44. addMethods: function(source) {
  45. var ancestor = this.superclass && this.superclass.prototype;var properties = Object.keys(source);if (!Object.keys({ toString: true }).length)
  46. properties.push("toString", "valueOf");for (var i = 0, length = properties.length; i < length; i++) {
  47. var property = properties[i], value = source[property];if (ancestor && Object.isFunction(value) &&
  48. value.argumentNames().first() == "$super") {
  49. var method = value, value = Object.extend((function(m) {
  50. return function() { return ancestor[m].apply(this, arguments) };})(property).wrap(method), {
  51. valueOf: function() { return method },
  52. toString: function() { return method.toString() }
  53. });}
  54. this.prototype[property] = value;}
  55. return this;}
  56. };var Abstract = { };Object.extend = function(destination, source) {
  57. for (var property in source)
  58. destination[property] = source[property];return destination;};Object.extend(Object, {
  59. inspect: function(object) {
  60. try {
  61. if (Object.isUndefined(object)) return 'undefined';if (object === null) return 'null';return object.inspect ? object.inspect() : object.toString();} catch (e) {
  62. if (e instanceof RangeError) return '...';throw e;}
  63. },
  64. toJSON: function(object) {
  65. var type = typeof object;switch (type) {
  66. case 'undefined':
  67. case 'function':
  68. case 'unknown': return;case 'boolean': return object.toString();}
  69. if (object === null) return 'null';if (object.toJSON) return object.toJSON();if (Object.isElement(object)) return;var results = [];for (var property in object) {
  70. var value = Object.toJSON(object[property]);if (!Object.isUndefined(value))
  71. results.push(property.toJSON() + ': ' + value);}
  72. return '{' + results.join(', ') + '}';},
  73. toQueryString: function(object) {
  74. return $H(object).toQueryString();},
  75. toHTML: function(object) {
  76. return object && object.toHTML ? object.toHTML() : String.interpret(object);},
  77. keys: function(object) {
  78. var keys = [];for (var property in object)
  79. keys.push(property);return keys;},
  80. values: function(object) {
  81. var values = [];for (var property in object)
  82. values.push(object[property]);return values;},
  83. clone: function(object) {
  84. return Object.extend({ }, object);},
  85. isElement: function(object) {
  86. return object && object.nodeType == 1;},
  87. isArray: function(object) {
  88. return object && object.constructor === Array;},
  89. isHash: function(object) {
  90. return object instanceof Hash;},
  91. isFunction: function(object) {
  92. return typeof object == "function";},
  93. isString: function(object) {
  94. return typeof object == "string";},
  95. isNumber: function(object) {
  96. return typeof object == "number";},
  97. isUndefined: function(object) {
  98. return typeof object == "undefined";}
  99. });Object.extend(Function.prototype, {
  100. argumentNames: function() {
  101. var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");return names.length == 1 && !names[0] ? [] : names;},
  102. bind: function() {
  103. if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;var __method = this, args = $A(arguments), object = args.shift();return function() {
  104. return __method.apply(object, args.concat($A(arguments)));}
  105. },
  106. bindAsEventListener: function() {
  107. var __method = this, args = $A(arguments), object = args.shift();return function(event) {
  108. return __method.apply(object, [event || window.event].concat(args));}
  109. },
  110. curry: function() {
  111. if (!arguments.length) return this;var __method = this, args = $A(arguments);return function() {
  112. return __method.apply(this, args.concat($A(arguments)));}
  113. },
  114. delay: function() {
  115. var __method = this, args = $A(arguments), timeout = args.shift() * 1000;return window.setTimeout(function() {
  116. return __method.apply(__method, args);}, timeout);},
  117. wrap: function(wrapper) {
  118. var __method = this;return function() {
  119. return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));}
  120. },
  121. methodize: function() {
  122. if (this._methodized) return this._methodized;var __method = this;return this._methodized = function() {
  123. return __method.apply(null, [this].concat($A(arguments)));};}
  124. });Function.prototype.defer = Function.prototype.delay.curry(0.01);Date.prototype.toJSON = function() {
  125. return '"' + this.getUTCFullYear() + '-' +
  126. (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
  127. this.getUTCDate().toPaddedString(2) + 'T' +
  128. this.getUTCHours().toPaddedString(2) + ':' +
  129. this.getUTCMinutes().toPaddedString(2) + ':' +
  130. this.getUTCSeconds().toPaddedString(2) + 'Z"';};var Try = {
  131. these: function() {
  132. var returnValue;for (var i = 0, length = arguments.length; i < length; i++) {
  133. var lambda = arguments[i];try {
  134. returnValue = lambda();break;} catch (e) { }
  135. }
  136. return returnValue;}
  137. };RegExp.prototype.match = RegExp.prototype.test;RegExp.escape = function(str) {
  138. return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');};/*--------------------------------------------------------------------------*/
  139. var PeriodicalExecuter = Class.create({
  140. initialize: function(callback, frequency) {
  141. this.callback = callback;this.frequency = frequency;this.currentlyExecuting = false;this.registerCallback();},
  142. registerCallback: function() {
  143. this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);},
  144. execute: function() {
  145. this.callback(this);},
  146. stop: function() {
  147. if (!this.timer) return;clearInterval(this.timer);this.timer = null;},
  148. onTimerEvent: function() {
  149. if (!this.currentlyExecuting) {
  150. try {
  151. this.currentlyExecuting = true;this.execute();} finally {
  152. this.currentlyExecuting = false;}
  153. }
  154. }
  155. });Object.extend(String, {
  156. interpret: function(value) {
  157. return value == null ? '' : String(value);},
  158. specialChar: {
  159. '\b': '\\b',
  160. '\t': '\\t',
  161. '\n': '\\n',
  162. '\f': '\\f',
  163. '\r': '\\r',
  164. '\\': '\\\\'
  165. }
  166. });Object.extend(String.prototype, {
  167. gsub: function(pattern, replacement) {
  168. var result = '', source = this, match;replacement = arguments.callee.prepareReplacement(replacement);while (source.length > 0) {
  169. if (match = source.match(pattern)) {
  170. result += source.slice(0, match.index);result += String.interpret(replacement(match));source = source.slice(match.index + match[0].length);} else {
  171. result += source, source = '';}
  172. }
  173. return result;},
  174. sub: function(pattern, replacement, count) {
  175. replacement = this.gsub.prepareReplacement(replacement);count = Object.isUndefined(count) ? 1 : count;return this.gsub(pattern, function(match) {
  176. if (--count < 0) return match[0];return replacement(match);});},
  177. scan: function(pattern, iterator) {
  178. this.gsub(pattern, iterator);return String(this);},
  179. truncate: function(length, truncation) {
  180. length = length || 30;truncation = Object.isUndefined(truncation) ? '...' : truncation;return this.length > length ?
  181. this.slice(0, length - truncation.length) + truncation : String(this);},
  182. strip: function() {
  183. return this.replace(/^\s+/, '').replace(/\s+$/, '');},
  184. stripTags: function() {
  185. return this.replace(/<\/?[^>]+>/gi, '');},
  186. stripScripts: function() {
  187. return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');},
  188. extractScripts: function() {
  189. var matchAll = new RegExp(Prototype.ScriptFragment, 'img');var matchOne = new RegExp(Prototype.ScriptFragment, 'im');return (this.match(matchAll) || []).map(function(scriptTag) {
  190. return (scriptTag.match(matchOne) || ['', ''])[1];});},
  191. evalScripts: function() {
  192. return this.extractScripts().map(function(script) { return eval(script) });},
  193. escapeHTML: function() {
  194. var self = arguments.callee;self.text.data = this;return self.div.innerHTML;},
  195. unescapeHTML: function() {
  196. var div = new Element('div');div.innerHTML = this.stripTags();return div.childNodes[0] ? (div.childNodes.length > 1 ?
  197. $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
  198. div.childNodes[0].nodeValue) : '';},
  199. toQueryParams: function(separator) {
  200. var match = this.strip().match(/([^?#]*)(#.*)?$/);if (!match) return { };return match[1].split(separator || '&').inject({ }, function(hash, pair) {
  201. if ((pair = pair.split('='))[0]) {
  202. var key = decodeURIComponent(pair.shift());var value = pair.length > 1 ? pair.join('=') : pair[0];if (value != undefined) value = decodeURIComponent(value);if (key in hash) {
  203. if (!Object.isArray(hash[key])) hash[key] = [hash[key]];hash[key].push(value);}
  204. else hash[key] = value;}
  205. return hash;});},
  206. toArray: function() {
  207. return this.split('');},
  208. succ: function() {
  209. return this.slice(0, this.length - 1) +
  210. String.fromCharCode(this.charCodeAt(this.length - 1) + 1);},
  211. times: function(count) {
  212. return count < 1 ? '' : new Array(count + 1).join(this);},
  213. camelize: function() {
  214. var parts = this.split('-'), len = parts.length;if (len == 1) return parts[0];var camelized = this.charAt(0) == '-'
  215. ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
  216. : parts[0];for (var i = 1; i < len; i++)
  217. camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);return camelized;},
  218. capitalize: function() {
  219. return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();},
  220. underscore: function() {
  221. return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();},
  222. dasherize: function() {
  223. return this.gsub(/_/,'-');},
  224. inspect: function(useDoubleQuotes) {
  225. var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
  226. 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, '\\\'') + "'";},
  227. toJSON: function() {
  228. return this.inspect(true);},
  229. unfilterJSON: function(filter) {
  230. return this.sub(filter || Prototype.JSONFilter, '#{1}');},
  231. isJSON: function() {
  232. var str = this;if (str.blank()) return false;str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);},
  233. evalJSON: function(sanitize) {
  234. var json = this.unfilterJSON();try {
  235. if (!sanitize || json.isJSON()) return eval('(' + json + ')');} catch (e) { }
  236. throw new SyntaxError('Badly formed JSON string: ' + this.inspect());},
  237. include: function(pattern) {
  238. return this.indexOf(pattern) > -1;},
  239. startsWith: function(pattern) {
  240. return this.indexOf(pattern) === 0;},
  241. endsWith: function(pattern) {
  242. var d = this.length - pattern.length;return d >= 0 && this.lastIndexOf(pattern) === d;},
  243. empty: function() {
  244. return this == '';},
  245. blank: function() {
  246. return /^\s*$/.test(this);},
  247. interpolate: function(object, pattern) {
  248. return new Template(this, pattern).evaluate(object);}
  249. });if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
  250. escapeHTML: function() {
  251. return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');},
  252. unescapeHTML: function() {
  253. return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');}
  254. });String.prototype.gsub.prepareReplacement = function(replacement) {
  255. 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, {
  256. div: document.createElement('div'),
  257. text: document.createTextNode('')
  258. });with (String.prototype.escapeHTML) div.appendChild(text);var Template = Class.create({
  259. initialize: function(template, pattern) {
  260. this.template = template.toString();this.pattern = pattern || Template.Pattern;},
  261. evaluate: function(object) {
  262. if (Object.isFunction(object.toTemplateReplacements))
  263. object = object.toTemplateReplacements();return this.template.gsub(this.pattern, function(match) {
  264. 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) {
  265. 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);}
  266. return before + String.interpret(ctx);}.bind(this));}
  267. });Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;var $break = { };var Enumerable = {
  268. each: function(iterator, context) {
  269. var index = 0;iterator = iterator.bind(context);try {
  270. this._each(function(value) {
  271. iterator(value, index++);});} catch (e) {
  272. if (e != $break) throw e;}
  273. return this;},
  274. eachSlice: function(number, iterator, context) {
  275. iterator = iterator ? iterator.bind(context) : Prototype.K;var index = -number, slices = [], array = this.toArray();while ((index += number) < array.length)
  276. slices.push(array.slice(index, index+number));return slices.collect(iterator, context);},
  277. all: function(iterator, context) {
  278. iterator = iterator ? iterator.bind(context) : Prototype.K;var result = true;this.each(function(value, index) {
  279. result = result && !!iterator(value, index);if (!result) throw $break;});return result;},
  280. any: function(iterator, context) {
  281. iterator = iterator ? iterator.bind(context) : Prototype.K;var result = false;this.each(function(value, index) {
  282. if (result = !!iterator(value, index))
  283. throw $break;});return result;},
  284. collect: function(iterator, context) {
  285. iterator = iterator ? iterator.bind(context) : Prototype.K;var results = [];this.each(function(value, index) {
  286. results.push(iterator(value, index));});return results;},
  287. detect: function(iterator, context) {
  288. iterator = iterator.bind(context);var result;this.each(function(value, index) {
  289. if (iterator(value, index)) {
  290. result = value;throw $break;}
  291. });return result;},
  292. findAll: function(iterator, context) {
  293. iterator = iterator.bind(context);var results = [];this.each(function(value, index) {
  294. if (iterator(value, index))
  295. results.push(value);});return results;},
  296. grep: function(filter, iterator, context) {
  297. iterator = iterator ? iterator.bind(context) : Prototype.K;var results = [];if (Object.isString(filter))
  298. filter = new RegExp(filter);this.each(function(value, index) {
  299. if (filter.match(value))
  300. results.push(iterator(value, index));});return results;},
  301. include: function(object) {
  302. if (Object.isFunction(this.indexOf))
  303. if (this.indexOf(object) != -1) return true;var found = false;this.each(function(value) {
  304. if (value == object) {
  305. found = true;throw $break;}
  306. });return found;},
  307. inGroupsOf: function(number, fillWith) {
  308. fillWith = Object.isUndefined(fillWith) ? null : fillWith;return this.eachSlice(number, function(slice) {
  309. while(slice.length < number) slice.push(fillWith);return slice;});},
  310. inject: function(memo, iterator, context) {
  311. iterator = iterator.bind(context);this.each(function(value, index) {
  312. memo = iterator(memo, value, index);});return memo;},
  313. invoke: function(method) {
  314. var args = $A(arguments).slice(1);return this.map(function(value) {
  315. return value[method].apply(value, args);});},
  316. max: function(iterator, context) {
  317. iterator = iterator ? iterator.bind(context) : Prototype.K;var result;this.each(function(value, index) {
  318. value = iterator(value, index);if (result == null || value >= result)
  319. result = value;});return result;},
  320. min: function(iterator, context) {
  321. iterator = iterator ? iterator.bind(context) : Prototype.K;var result;this.each(function(value, index) {
  322. value = iterator(value, index);if (result == null || value < result)
  323. result = value;});return result;},
  324. partition: function(iterator, context) {
  325. iterator = iterator ? iterator.bind(context) : Prototype.K;var trues = [], falses = [];this.each(function(value, index) {
  326. (iterator(value, index) ?
  327. trues : falses).push(value);});return [trues, falses];},
  328. pluck: function(property) {
  329. var results = [];this.each(function(value) {
  330. results.push(value[property]);});return results;},
  331. reject: function(iterator, context) {
  332. iterator = iterator.bind(context);var results = [];this.each(function(value, index) {
  333. if (!iterator(value, index))
  334. results.push(value);});return results;},
  335. sortBy: function(iterator, context) {
  336. iterator = iterator.bind(context);return this.map(function(value, index) {
  337. return {value: value, criteria: iterator(value, index)};}).sort(function(left, right) {
  338. var a = left.criteria, b = right.criteria;return a < b ? -1 : a > b ? 1 : 0;}).pluck('value');},
  339. toArray: function() {
  340. return this.map();},
  341. zip: function() {
  342. var iterator = Prototype.K, args = $A(arguments);if (Object.isFunction(args.last()))
  343. iterator = args.pop();var collections = [this].concat(args).map($A);return this.map(function(value, index) {
  344. return iterator(collections.pluck(index));});},
  345. size: function() {
  346. return this.toArray().length;},
  347. inspect: function() {
  348. return '#<Enumerable:' + this.toArray().inspect() + '>';}
  349. };Object.extend(Enumerable, {
  350. map: Enumerable.collect,
  351. find: Enumerable.detect,
  352. select: Enumerable.findAll,
  353. filter: Enumerable.findAll,
  354. member: Enumerable.include,
  355. entries: Enumerable.toArray,
  356. every: Enumerable.all,
  357. some: Enumerable.any
  358. });function $A(iterable) {
  359. 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;}
  360. if (Prototype.Browser.WebKit) {
  361. function $A(iterable) {
  362. if (!iterable) return [];if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
  363. iterable.toArray) return iterable.toArray();var length = iterable.length || 0, results = new Array(length);while (length--) results[length] = iterable[length];return results;}
  364. }
  365. Array.from = $A;Object.extend(Array.prototype, Enumerable);if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;Object.extend(Array.prototype, {
  366. _each: function(iterator) {
  367. for (var i = 0, length = this.length; i < length; i++)
  368. iterator(this[i]);},
  369. clear: function() {
  370. this.length = 0;return this;},
  371. first: function() {
  372. return this[0];},
  373. last: function() {
  374. return this[this.length - 1];},
  375. compact: function() {
  376. return this.select(function(value) {
  377. return value != null;});},
  378. flatten: function() {
  379. return this.inject([], function(array, value) {
  380. return array.concat(Object.isArray(value) ?
  381. value.flatten() : [value]);});},
  382. without: function() {
  383. var values = $A(arguments);return this.select(function(value) {
  384. return !values.include(value);});},
  385. reverse: function(inline) {
  386. return (inline !== false ? this : this.toArray())._reverse();},
  387. reduce: function() {
  388. return this.length > 1 ? this : this[0];},
  389. uniq: function(sorted) {
  390. return this.inject([], function(array, value, index) {
  391. if (0 == index || (sorted ? array.last() != value : !array.include(value)))
  392. array.push(value);return array;});},
  393. intersect: function(array) {
  394. return this.uniq().findAll(function(item) {
  395. return array.detect(function(value) { return item === value });});},
  396. clone: function() {
  397. return [].concat(this);},
  398. size: function() {
  399. return this.length;},
  400. inspect: function() {
  401. return '[' + this.map(Object.inspect).join(', ') + ']';},
  402. toJSON: function() {
  403. var results = [];this.each(function(object) {
  404. var value = Object.toJSON(object);if (!Object.isUndefined(value)) results.push(value);});return '[' + results.join(', ') + ']';}
  405. });if (Object.isFunction(Array.prototype.forEach))
  406. Array.prototype._each = Array.prototype.forEach;if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
  407. i || (i = 0);var length = this.length;if (i < 0) i = length + i;for (; i < length; i++)
  408. if (this[i] === item) return i;return -1;};if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
  409. 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) {
  410. if (!Object.isString(string)) return [];string = string.strip();return string ? string.split(/\s+/) : [];}
  411. if (Prototype.Browser.Opera){
  412. Array.prototype.concat = function() {
  413. 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++) {
  414. if (Object.isArray(arguments[i])) {
  415. for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
  416. array.push(arguments[i][j]);} else {
  417. array.push(arguments[i]);}
  418. }
  419. return array;};}
  420. Object.extend(Number.prototype, {
  421. toColorPart: function() {
  422. return this.toPaddedString(2, 16);},
  423. succ: function() {
  424. return this + 1;},
  425. times: function(iterator) {
  426. $R(0, this, true).each(iterator);return this;},
  427. toPaddedString: function(length, radix) {
  428. var string = this.toString(radix || 10);return '0'.times(length - string.length) + string;},
  429. toJSON: function() {
  430. return isFinite(this) ? this.toString() : 'null';}
  431. });$w('abs round ceil floor').each(function(method){
  432. Number.prototype[method] = Math[method].methodize();});function $H(object) {
  433. return new Hash(object);};var Hash = Class.create(Enumerable, (function() {
  434. function toQueryPair(key, value) {
  435. if (Object.isUndefined(value)) return key;return key + '=' + encodeURIComponent(String.interpret(value));}
  436. return {
  437. initialize: function(object) {
  438. this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);},
  439. _each: function(iterator) {
  440. for (var key in this._object) {
  441. var value = this._object[key], pair = [key, value];pair.key = key;pair.value = value;iterator(pair);}
  442. },
  443. set: function(key, value) {
  444. return this._object[key] = value;},
  445. get: function(key) {
  446. return this._object[key];},
  447. unset: function(key) {
  448. var value = this._object[key];delete this._object[key];return value;},
  449. toObject: function() {
  450. return Object.clone(this._object);},
  451. keys: function() {
  452. return this.pluck('key');},
  453. values: function() {
  454. return this.pluck('value');},
  455. index: function(value) {
  456. var match = this.detect(function(pair) {
  457. return pair.value === value;});return match && match.key;},
  458. merge: function(object) {
  459. return this.clone().update(object);},
  460. update: function(object) {
  461. return new Hash(object).inject(this, function(result, pair) {
  462. result.set(pair.key, pair.value);return result;});},
  463. toQueryString: function() {
  464. return this.map(function(pair) {
  465. var key = encodeURIComponent(pair.key), values = pair.value;if (values && typeof values == 'object') {
  466. if (Object.isArray(values))
  467. return values.map(toQueryPair.curry(key)).join('&');}
  468. return toQueryPair(key, values);}).join('&');},
  469. inspect: function() {
  470. return '#<Hash:{' + this.map(function(pair) {
  471. return pair.map(Object.inspect).join(': ');}).join(', ') + '}>';},
  472. toJSON: function() {
  473. return Object.toJSON(this.toObject());},
  474. clone: function() {
  475. return new Hash(this);}
  476. }
  477. })());Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;Hash.from = $H;var ObjectRange = Class.create(Enumerable, {
  478. initialize: function(start, end, exclusive) {
  479. this.start = start;this.end = end;this.exclusive = exclusive;},
  480. _each: function(iterator) {
  481. var value = this.start;while (this.include(value)) {
  482. iterator(value);value = value.succ();}
  483. },
  484. include: function(value) {
  485. if (value < this.start)
  486. return false;if (this.exclusive)
  487. return value < this.end;return value <= this.end;}
  488. });var $R = function(start, end, exclusive) {
  489. return new ObjectRange(start, end, exclusive);};var Ajax = {
  490. getTransport: function() {
  491. return Try.these(
  492. function() {return new XMLHttpRequest()},
  493. function() {return new ActiveXObject('Msxml2.XMLHTTP')},
  494. function() {return new ActiveXObject('Microsoft.XMLHTTP')}
  495. ) || false;},
  496. activeRequestCount: 0
  497. };Ajax.Responders = {
  498. responders: [],
  499. _each: function(iterator) {
  500. this.responders._each(iterator);},
  501. register: function(responder) {
  502. if (!this.include(responder))
  503. this.responders.push(responder);},
  504. unregister: function(responder) {
  505. this.responders = this.responders.without(responder);},
  506. dispatch: function(callback, request, transport, json) {
  507. this.each(function(responder) {
  508. if (Object.isFunction(responder[callback])) {
  509. try {
  510. responder[callback].apply(responder, [request, transport, json]);} catch (e) { }
  511. }
  512. });}
  513. };Object.extend(Ajax.Responders, Enumerable);Ajax.Responders.register({
  514. onCreate: function() { Ajax.activeRequestCount++ },
  515. onComplete: function() { Ajax.activeRequestCount-- }
  516. });Ajax.Base = Class.create({
  517. initialize: function(options) {
  518. this.options = {
  519. method: 'post',
  520. asynchronous: true,
  521. contentType: 'application/x-www-form-urlencoded',
  522. encoding: 'UTF-8',
  523. parameters: '',
  524. evalJSON: true,
  525. evalJS: true
  526. };Object.extend(this.options, options || { });this.options.method = this.options.method.toLowerCase();if (Object.isString(this.options.parameters))
  527. this.options.parameters = this.options.parameters.toQueryParams();else if (Object.isHash(this.options.parameters))
  528. this.options.parameters = this.options.parameters.toObject();}
  529. });Ajax.Request = Class.create(Ajax.Base, {
  530. _complete: false,
  531. initialize: function($super, url, options) {
  532. $super(options);this.transport = Ajax.getTransport();this.request(url);},
  533. request: function(url) {
  534. this.url = url;this.method = this.options.method;var params = Object.clone(this.options.parameters);if (!['get', 'post'].include(this.method)) {
  535. params['_method'] = this.method;this.method = 'post';}
  536. this.parameters = params;if (params = Object.toQueryString(params)) {
  537. if (this.method == 'get')
  538. this.url += (this.url.include('?') ? '&' : '?') + params;else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
  539. params += '&_=';}
  540. try {
  541. 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,
  542. 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 */
  543. if (!this.options.asynchronous && this.transport.overrideMimeType)
  544. this.onStateChange();}
  545. catch (e) {
  546. this.dispatchException(e);}
  547. },
  548. onStateChange: function() {
  549. var readyState = this.transport.readyState;if (readyState > 1 && !((readyState == 4) && this._complete))
  550. this.respondToReadyState(this.transport.readyState);},
  551. setRequestHeaders: function() {
  552. var headers = {
  553. 'X-Requested-With': 'XMLHttpRequest',
  554. 'X-Prototype-Version': Prototype.Version,
  555. 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
  556. };if (this.method == 'post') {
  557. headers['Content-type'] = this.options.contentType +
  558. (this.options.encoding ? '; charset=' + this.options.encoding : '');/* Force "Connection: close" for older Mozilla browsers to work
  559. * around a bug where XMLHttpRequest sends an incorrect
  560. * Content-length header. See Mozilla Bugzilla #246651.
  561. */
  562. if (this.transport.overrideMimeType &&
  563. (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
  564. headers['Connection'] = 'close';}
  565. if (typeof this.options.requestHeaders == 'object') {
  566. var extras = this.options.requestHeaders;if (Object.isFunction(extras.push))
  567. for (var i = 0, length = extras.length; i < length; i += 2)
  568. headers[extras[i]] = extras[i+1];else
  569. $H(extras).each(function(pair) { headers[pair.key] = pair.value });}
  570. for (var name in headers)
  571. this.transport.setRequestHeader(name, headers[name]);},
  572. success: function() {
  573. var status = this.getStatus();return !status || (status >= 200 && status < 300);},
  574. getStatus: function() {
  575. try {
  576. return this.transport.status || 0;} catch (e) { return 0 }
  577. },
  578. respondToReadyState: function(readyState) {
  579. var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);if (state == 'Complete') {
  580. try {
  581. this._complete = true;(this.options['on' + response.status]
  582. || this.options['on' + (this.success() ? 'Success' : 'Failure')]
  583. || Prototype.emptyFunction)(response, response.headerJSON);} catch (e) {
  584. this.dispatchException(e);}
  585. var contentType = response.getHeader('Content-type');if (this.options.evalJS == 'force'
  586. || (this.options.evalJS && contentType
  587. && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
  588. this.evalResponse();}
  589. try {
  590. (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);} catch (e) {
  591. this.dispatchException(e);}
  592. if (state == 'Complete') {
  593. this.transport.onreadystatechange = Prototype.emptyFunction;}
  594. },
  595. getHeader: function(name) {
  596. try {
  597. return this.transport.getResponseHeader(name) || null;} catch (e) { return null }
  598. },
  599. evalResponse: function() {
  600. try {
  601. return eval((this.transport.responseText || '').unfilterJSON());} catch (e) {
  602. this.dispatchException(e);}
  603. },
  604. dispatchException: function(exception) {
  605. (this.options.onException || Prototype.emptyFunction)(this, exception);Ajax.Responders.dispatch('onException', this, exception);}
  606. });Ajax.Request.Events =
  607. ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];Ajax.Response = Class.create({
  608. initialize: function(request){
  609. this.request = request;var transport = this.transport = request.transport,
  610. readyState = this.readyState = transport.readyState;if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
  611. this.status = this.getStatus();this.statusText = this.getStatusText();this.responseText = String.interpret(transport.responseText);this.headerJSON = this._getHeaderJSON();}
  612. if(readyState == 4) {
  613. var xml = transport.responseXML;this.responseXML = Object.isUndefined(xml) ? null : xml;this.responseJSON = this._getResponseJSON();}
  614. },
  615. status: 0,
  616. statusText: '',
  617. getStatus: Ajax.Request.prototype.getStatus,
  618. getStatusText: function() {
  619. try {
  620. return this.transport.statusText || '';} catch (e) { return '' }
  621. },
  622. getHeader: Ajax.Request.prototype.getHeader,
  623. getAllHeaders: function() {
  624. try {
  625. return this.getAllResponseHeaders();} catch (e) { return null }
  626. },
  627. getResponseHeader: function(name) {
  628. return this.transport.getResponseHeader(name);},
  629. getAllResponseHeaders: function() {
  630. return this.transport.getAllResponseHeaders();},
  631. _getHeaderJSON: function() {
  632. var json = this.getHeader('X-JSON');if (!json) return null;json = decodeURIComponent(escape(json));try {
  633. return json.evalJSON(this.request.options.sanitizeJSON);} catch (e) {
  634. this.request.dispatchException(e);}
  635. },
  636. _getResponseJSON: function() {
  637. var options = this.request.options;if (!options.evalJSON || (options.evalJSON != 'force' &&
  638. !(this.getHeader('Content-type') || '').include('application/json')) ||
  639. this.responseText.blank())
  640. return null;try {
  641. return this.responseText.evalJSON(options.sanitizeJSON);} catch (e) {
  642. this.request.dispatchException(e);}
  643. }
  644. });Ajax.Updater = Class.create(Ajax.Request, {
  645. initialize: function($super, container, url, options) {
  646. this.container = {
  647. success: (container.success || container),
  648. failure: (container.failure || (container.success ? null : container))
  649. };options = Object.clone(options);var onComplete = options.onComplete;options.onComplete = (function(response, json) {
  650. this.updateContent(response.responseText);if (Object.isFunction(onComplete)) onComplete(response, json);}).bind(this);$super(url, options);},
  651. updateContent: function(responseText) {
  652. var receiver = this.container[this.success() ? 'success' : 'failure'],
  653. options = this.options;if (!options.evalScripts) responseText = responseText.stripScripts();if (receiver = $(receiver)) {
  654. if (options.insertion) {
  655. if (Object.isString(options.insertion)) {
  656. var insertion = { }; insertion[options.insertion] = responseText;receiver.insert(insertion);}
  657. else options.insertion(receiver, responseText);}
  658. else receiver.update(responseText);}
  659. }
  660. });Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
  661. initialize: function($super, container, url, options) {
  662. $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();},
  663. start: function() {
  664. this.options.onComplete = this.updateComplete.bind(this);this.onTimerEvent();},
  665. stop: function() {
  666. this.updater.options.onComplete = undefined;clearTimeout(this.timer);(this.onComplete || Prototype.emptyFunction).apply(this, arguments);},
  667. updateComplete: function(response) {
  668. if (this.options.decay) {
  669. this.decay = (response.responseText == this.lastText ?
  670. this.decay * this.options.decay : 1);this.lastText = response.responseText;}
  671. this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);},
  672. onTimerEvent: function() {
  673. this.updater = new Ajax.Updater(this.container, this.url, this.options);}
  674. });function $(element) {
  675. if (arguments.length > 1) {
  676. for (var i = 0, elements = [], length = arguments.length; i < length; i++)
  677. elements.push($(arguments[i]));return elements;}
  678. if (Object.isString(element))
  679. element = document.getElementById(element);return Element.extend(element);}
  680. if (Prototype.BrowserFeatures.XPath) {
  681. document._getElementsByXPath = function(expression, parentElement) {
  682. var results = [];var query = document.evaluate(expression, $(parentElement) || document,
  683. null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);for (var i = 0, length = query.snapshotLength; i < length; i++)
  684. results.push(Element.extend(query.snapshotItem(i)));return results;};}
  685. /*--------------------------------------------------------------------------*/
  686. if (!window.Node) var Node = { };if (!Node.ELEMENT_NODE) {
  687. Object.extend(Node, {
  688. ELEMENT_NODE: 1,
  689. ATTRIBUTE_NODE: 2,
  690. TEXT_NODE: 3,
  691. CDATA_SECTION_NODE: 4,
  692. ENTITY_REFERENCE_NODE: 5,
  693. ENTITY_NODE: 6,
  694. PROCESSING_INSTRUCTION_NODE: 7,
  695. COMMENT_NODE: 8,
  696. DOCUMENT_NODE: 9,
  697. DOCUMENT_TYPE_NODE: 10,
  698. DOCUMENT_FRAGMENT_NODE: 11,
  699. NOTATION_NODE: 12
  700. });}
  701. (function() {
  702. var element = this.Element;this.Element = function(tagName, attributes) {
  703. attributes = attributes || { };tagName = tagName.toLowerCase();var cache = Element.cache;if (Prototype.Browser.IE && attributes.name) {
  704. tagName = '<' + tagName + ' name="' + attributes.name + '">';delete attributes.name;return Element.writeAttribute(document.createElement(tagName), attributes);}
  705. if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);};Object.extend(this.Element, element || { });}).call(window);Element.cache = { };Element.Methods = {
  706. visible: function(element) {
  707. return $(element).style.display != 'none';},
  708. toggle: function(element) {
  709. element = $(element);Element[Element.visible(element) ? 'hide' : 'show'](element);return element;},
  710. hide: function(element) {
  711. $(element).style.display = 'none';return element;},
  712. show: function(element) {
  713. $(element).style.display = '';return element;},
  714. remove: function(element) {
  715. element = $(element);element.parentNode.removeChild(element);return element;},
  716. update: function(element, content) {
  717. 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;},
  718. replace: function(element, content) {
  719. element = $(element);if (content && content.toElement) content = content.toElement();else if (!Object.isElement(content)) {
  720. content = Object.toHTML(content);var range = element.ownerDocument.createRange();range.selectNode(element);content.evalScripts.bind(content).defer();content = range.createContextualFragment(content.stripScripts());}
  721. element.parentNode.replaceChild(content, element);return element;},
  722. insert: function(element, insertions) {
  723. element = $(element);if (Object.isString(insertions) || Object.isNumber(insertions) ||
  724. Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
  725. insertions = {bottom:insertions};var content, insert, tagName, childNodes;for (position in insertions) {
  726. content = insertions[position];position = position.toLowerCase();insert = Element._insertionTranslations[position];if (content && content.toElement) content = content.toElement();if (Object.isElement(content)) {
  727. insert(element, content);continue;}
  728. content = Object.toHTML(content);tagName = ((position == 'before' || position == 'after')
  729. ? 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();}
  730. return element;},
  731. wrap: function(element, wrapper, attributes) {
  732. element = $(element);if (Object.isElement(wrapper))
  733. $(wrapper).writeAttribute(attributes || { });else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);else wrapper = new Element('div', wrapper);if (element.parentNode)
  734. element.parentNode.replaceChild(wrapper, element);wrapper.appendChild(element);return wrapper;},
  735. inspect: function(element) {
  736. element = $(element);var result = '<' + element.tagName.toLowerCase();$H({'id': 'id', 'className': 'class'}).each(function(pair) {
  737. var property = pair.first(), attribute = pair.last();var value = (element[property] || '').toString();if (value) result += ' ' + attribute + '=' + value.inspect(true);});return result + '>';},
  738. recursivelyCollect: function(element, property) {
  739. element = $(element);var elements = [];while (element = element[property])
  740. if (element.nodeType == 1)
  741. elements.push(Element.extend(element));return elements;},
  742. ancestors: function(element) {
  743. return $(element).recursivelyCollect('parentNode');},
  744. descendants: function(element) {
  745. return $(element).getElementsBySelector("*");},
  746. firstDescendant: function(element) {
  747. element = $(element).firstChild;while (element && element.nodeType != 1) element = element.nextSibling;return $(element);},
  748. immediateDescendants: function(element) {
  749. if (!(element = $(element).firstChild)) return [];while (element && element.nodeType != 1) element = element.nextSibling;if (element) return [element].concat($(element).nextSiblings());return [];},
  750. previousSiblings: function(element) {
  751. return $(element).recursivelyCollect('previousSibling');},
  752. nextSiblings: function(element) {
  753. return $(element).recursivelyCollect('nextSibling');},
  754. siblings: function(element) {
  755. element = $(element);return element.previousSiblings().reverse().concat(element.nextSiblings());},
  756. match: function(element, selector) {
  757. if (Object.isString(selector))
  758. selector = new Selector(selector);return selector.match($(element));},
  759. up: function(element, expression, index) {
  760. element = $(element);if (arguments.length == 1) return $(element.parentNode);var ancestors = element.ancestors();return Object.isNumber(expression) ? ancestors[expression] :
  761. Selector.findElement(ancestors, expression, index);},
  762. down: function(element, expression, index) {
  763. element = $(element);if (arguments.length == 1) return element.firstDescendant();return Object.isNumber(expression) ? element.descendants()[expression] :
  764. element.select(expression)[index || 0];},
  765. previous: function(element, expression, index) {
  766. element = $(element);if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));var previousSiblings = element.previousSiblings();return Object.isNumber(expression) ? previousSiblings[expression] :
  767. Selector.findElement(previousSiblings, expression, index);},
  768. next: function(element, expression, index) {
  769. element = $(element);if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));var nextSiblings = element.nextSiblings();return Object.isNumber(expression) ? nextSiblings[expression] :
  770. Selector.findElement(nextSiblings, expression, index);},
  771. select: function() {
  772. var args = $A(arguments), element = $(args.shift());return Selector.findChildElements(element, args);},
  773. adjacent: function() {
  774. var args = $A(arguments), element = $(args.shift());return Selector.findChildElements(element.parentNode, args).without(element);},
  775. identify: function(element) {
  776. 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;},
  777. readAttribute: function(element, name) {
  778. element = $(element);if (Prototype.Browser.IE) {
  779. 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(':')) {
  780. return (!element.attributes || !element.attributes[name]) ? null :
  781. element.attributes[name].value;}
  782. }
  783. return element.getAttribute(name);},
  784. writeAttribute: function(element, name, value) {
  785. 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) {
  786. name = t.names[attr] || attr;value = attributes[attr];if (t.values[attr]) name = t.values[attr](element, value);if (value === false || value === null)
  787. element.removeAttribute(name);else if (value === true)
  788. element.setAttribute(name, name);else element.setAttribute(name, value);}
  789. return element;},
  790. getHeight: function(element) {
  791. return $(element).getDimensions().height;},
  792. getWidth: function(element) {
  793. return $(element).getDimensions().width;},
  794. classNames: function(element) {
  795. return new Element.ClassNames(element);},
  796. hasClassName: function(element, className) {
  797. if (!(element = $(element))) return;var elementClassName = element.className;return (elementClassName.length > 0 && (elementClassName == className ||
  798. new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));},
  799. addClassName: function(element, className) {
  800. if (!(element = $(element))) return;if (!element.hasClassName(className))
  801. element.className += (element.className ? ' ' : '') + className;return element;},
  802. removeClassName: function(element, className) {
  803. if (!(element = $(element))) return;element.className = element.className.replace(
  804. new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();return element;},
  805. toggleClassName: function(element, className) {
  806. if (!(element = $(element))) return;return element[element.hasClassName(className) ?
  807. 'removeClassName' : 'addClassName'](className);},
  808. cleanWhitespace: function(element) {
  809. element = $(element);var node = element.firstChild;while (node) {
  810. var nextNode = node.nextSibling;if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
  811. element.removeChild(node);node = nextNode;}
  812. return element;},
  813. empty: function(element) {
  814. return $(element).innerHTML.blank();},
  815. descendantOf: function(element, ancestor) {
  816. element = $(element), ancestor = $(ancestor);var originalAncestor = ancestor;if (element.compareDocumentPosition)
  817. return (element.compareDocumentPosition(ancestor) & 8) === 8;if (element.sourceIndex && !Prototype.Browser.Opera) {
  818. var e = element.sourceIndex, a = ancestor.sourceIndex,
  819. nextAncestor = ancestor.nextSibling;if (!nextAncestor) {
  820. do { ancestor = ancestor.parentNode; }
  821. while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);}
  822. if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);}
  823. while (element = element.parentNode)
  824. if (element == originalAncestor) return true;return false;},
  825. scrollTo: function(element) {
  826. element = $(element);var pos = element.cumulativeOffset();window.scrollTo(pos[0], pos[1]);return element;},
  827. getStyle: function(element, style) {
  828. element = $(element);style = style == 'float' ? 'cssFloat' : style.camelize();var value = element.style[style];if (!value) {
  829. var css = document.defaultView.getComputedStyle(element, null);value = css ? css[style] : null;}
  830. if (style == 'opacity') return value ? parseFloat(value) : 1.0;return value == 'auto' ? null : value;},
  831. getOpacity: function(element) {
  832. return $(element).getStyle('opacity');},
  833. setStyle: function(element, styles) {
  834. element = $(element);var elementStyle = element.style, match;if (Object.isString(styles)) {
  835. element.style.cssText += ';' + styles;return styles.include('opacity') ?
  836. element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;}
  837. for (var property in styles)
  838. if (property == 'opacity') element.setOpacity(styles[property]);else
  839. elementStyle[(property == 'float' || property == 'cssFloat') ?
  840. (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
  841. property] = styles[property];return element;},
  842. setOpacity: function(element, value) {
  843. element = $(element);element.style.opacity = (value == 1 || value === '') ? '' :
  844. (value < 0.00001) ? 0 : value;return element;},
  845. getDimensions: function(element) {
  846. element = $(element);var display = $(element).getStyle('display');if (display != 'none' && display != null) // Safari bug
  847. return {width: element.offsetWidth, height: element.offsetHeight};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};},
  848. makePositioned: function(element) {
  849. element = $(element);var pos = Element.getStyle(element, 'position');if (pos == 'static' || !pos) {
  850. element._madePositioned = true;element.style.position = 'relative';if (window.opera) {
  851. element.style.top = 0;element.style.left = 0;}
  852. }
  853. return element;},
  854. undoPositioned: function(element) {
  855. element = $(element);if (element._madePositioned) {
  856. element._madePositioned = undefined;element.style.position =
  857. element.style.top =
  858. element.style.left =
  859. element.style.bottom =
  860. element.style.right = '';}
  861. return element;},
  862. makeClipping: function(element) {
  863. element = $(element);if (element._overflow) return element;element._overflow = Element.getStyle(element, 'overflow') || 'auto';if (element._overflow !== 'hidden')
  864. element.style.overflow = 'hidden';return element;},
  865. undoClipping: function(element) {
  866. element = $(element);if (!element._overflow) return element;element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;element._overflow = null;return element;},
  867. cumulativeOffset: function(element) {
  868. var valueT = 0, valueL = 0;do {
  869. valueT += element.offsetTop || 0;valueL += element.offsetLeft || 0;element = element.offsetParent;} while (element);return Element._returnOffset(valueL, valueT);},
  870. positionedOffset: function(element) {
  871. var valueT = 0, valueL = 0;do {
  872. valueT += element.offsetTop || 0;valueL += element.offsetLeft || 0;element = element.offsetParent;if (element) {
  873. if (element.tagName == 'BODY') break;var p = Element.getStyle(element, 'position');if (p == 'relative' || p == 'absolute') break;}
  874. } while (element);return Element._returnOffset(valueL, valueT);},
  875. absolutize: function(element) {
  876. element = $(element);if (element.getStyle('position') == 'absolute') return;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;},
  877. relativize: function(element) {
  878. element = $(element);if (element.getStyle('position') == 'relative') return;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;},
  879. cumulativeScrollOffset: function(element) {
  880. var valueT = 0, valueL = 0;do {
  881. valueT += element.scrollTop || 0;valueL += element.scrollLeft || 0;element = element.parentNode;} while (element);return Element._returnOffset(valueL, valueT);},
  882. getOffsetParent: function(element) {
  883. if (element.offsetParent) return $(element.offsetParent);if (element == document.body) return $(element);while ((element = element.parentNode) && element != document.body)
  884. if (Element.getStyle(element, 'position') != 'static')
  885. return $(element);return $(document.body);},
  886. viewportOffset: function(forElement) {
  887. var valueT = 0, valueL = 0;var element = forElement;do {
  888. valueT += element.offsetTop || 0;valueL += element.offsetLeft || 0;if (element.offsetParent == document.body &&
  889. Element.getStyle(element, 'position') == 'absolute') break;} while (element = element.offsetParent);element = forElement;do {
  890. if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
  891. valueT -= element.scrollTop || 0;valueL -= element.scrollLeft || 0;}
  892. } while (element = element.parentNode);return Element._returnOffset(valueL, valueT);},
  893. clonePosition: function(element, source) {
  894. var options = Object.extend({
  895. setLeft: true,
  896. setTop: true,
  897. setWidth: true,
  898. setHeight: true,
  899. offsetTop: 0,
  900. offsetLeft: 0
  901. }, arguments[2] || { });source = $(source);var p = source.viewportOffset();element = $(element);var delta = [0, 0];var parent = null;if (Element.getStyle(element, 'position') == 'absolute') {
  902. parent = element.getOffsetParent();delta = parent.viewportOffset();}
  903. if (parent == document.body) {
  904. delta[0] -= document.body.offsetLeft;delta[1] -= document.body.offsetTop;}
  905. 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;}
  906. };Element.Methods.identify.counter = 1;Object.extend(Element.Methods, {
  907. getElementsBySelector: Element.Methods.select,
  908. childElements: Element.Methods.immediateDescendants
  909. });Element._attributeTranslations = {
  910. write: {
  911. names: {
  912. className: 'class',
  913. htmlFor: 'for'
  914. },
  915. values: { }
  916. }
  917. };if (Prototype.Browser.Opera) {
  918. Element.Methods.getStyle = Element.Methods.getStyle.wrap(
  919. function(proceed, element, style) {
  920. switch (style) {
  921. case 'left': case 'top': case 'right': case 'bottom':
  922. if (proceed(element, 'position') === 'static') return null;case 'height': case 'width':
  923. if (!Element.visible(element)) return null;var dim = parseInt(proceed(element, style), 10);if (dim !== element['offset' + style.capitalize()])
  924. return dim + 'px';var properties;if (style === 'height') {
  925. properties = ['border-top-width', 'padding-top',
  926. 'padding-bottom', 'border-bottom-width'];}
  927. else {
  928. properties = ['border-left-width', 'padding-left',
  929. 'padding-right', 'border-right-width'];}
  930. return properties.inject(dim, function(memo, property) {
  931. var val = proceed(element, property);return val === null ? memo : memo - parseInt(val, 10);}) + 'px';default: return proceed(element, style);}
  932. }
  933. );Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
  934. function(proceed, element, attribute) {
  935. if (attribute === 'title') return element.title;return proceed(element, attribute);}
  936. );}
  937. else if (Prototype.Browser.IE) {
  938. $w('positionedOffset getOffsetParent viewportOffset').each(function(method) {
  939. Element.Methods[method] = Element.Methods[method].wrap(
  940. function(proceed, element) {
  941. element = $(element);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;}
  942. );});Element.Methods.getStyle = function(element, style) {
  943. 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') {
  944. if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
  945. if (value[1]) return parseFloat(value[1]) / 100;return 1.0;}
  946. if (value == 'auto') {
  947. if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
  948. return element['offset' + style.capitalize()] + 'px';return null;}
  949. return value;};Element.Methods.setOpacity = function(element, value) {
  950. function stripAlpha(filter){
  951. return filter.replace(/alpha\([^\)]*\)/gi,'');}
  952. element = $(element);var currentStyle = element.currentStyle;if ((currentStyle && !currentStyle.hasLayout) ||
  953. (!currentStyle && element.style.zoom == 'normal'))
  954. element.style.zoom = 1;var filter = element.getStyle('filter'), style = element.style;if (value == 1 || value === '') {
  955. (filter = stripAlpha(filter)) ?
  956. style.filter = filter : style.removeAttribute('filter');return element;} else if (value < 0.00001) value = 0;style.filter = stripAlpha(filter) +
  957. 'alpha(opacity=' + (value * 100) + ')';return element;};Element._attributeTranslations = {
  958. read: {
  959. names: {
  960. 'class': 'className',
  961. 'for': 'htmlFor'
  962. },
  963. values: {
  964. _getAttr: function(element, attribute) {
  965. return element.getAttribute(attribute, 2);},
  966. _getAttrNode: function(element, attribute) {
  967. var node = element.getAttributeNode(attribute);return node ? node.value : "";},
  968. _getEv: function(element, attribute) {
  969. attribute = element.getAttribute(attribute);return attribute ? attribute.toString().slice(23, -2) : null;},
  970. _flag: function(element, attribute) {
  971. return $(element).hasAttribute(attribute) ? attribute : null;},
  972. style: function(element) {
  973. return element.style.cssText.toLowerCase();},
  974. title: function(element) {
  975. return element.title;}
  976. }
  977. }
  978. };Element._attributeTranslations.write = {
  979. names: Object.clone(Element._attributeTranslations.read.names),
  980. values: {
  981. checked: function(element, value) {
  982. element.checked = !!value;},
  983. style: function(element, value) {
  984. element.style.cssText = value ? value : '';}
  985. }
  986. };Element._attributeTranslations.has = {};$w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
  987. 'encType maxLength readOnly longDesc').each(function(attr) {
  988. Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;Element._attributeTranslations.has[attr.toLowerCase()] = attr;});(function(v) {
  989. Object.extend(v, {
  990. href: v._getAttr,
  991. src: v._getAttr,
  992. type: v._getAttr,
  993. action: v._getAttrNode,
  994. disabled: v._flag,
  995. checked: v._flag,
  996. readonly: v._flag,
  997. multiple: v._flag,
  998. onload: v._getEv,
  999. onunload: v._getEv,
  1000. onclick: v._getEv,
  1001. ondblclick: v._getEv,
  1002. onmousedown: v._getEv,
  1003. onmouseup: v._getEv,
  1004. onmouseover: v._getEv,
  1005. onmousemove: v._getEv,
  1006. onmouseout: v._getEv,
  1007. onfocus: v._getEv,
  1008. onblur: v._getEv,
  1009. onkeypress: v._getEv,
  1010. onkeydown: v._getEv,
  1011. onkeyup: v._getEv,
  1012. onsubmit: v._getEv,
  1013. onreset: v._getEv,
  1014. onselect: v._getEv,
  1015. onchange: v._getEv
  1016. });})(Element._attributeTranslations.read.values);}
  1017. else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
  1018. Element.Methods.setOpacity = function(element, value) {
  1019. element = $(element);element.style.opacity = (value == 1) ? 0.999999 :
  1020. (value === '') ? '' : (value < 0.00001) ? 0 : value;return element;};}
  1021. else if (Prototype.Browser.WebKit) {
  1022. Element.Methods.setOpacity = function(element, value) {
  1023. element = $(element);element.style.opacity = (value == 1 || value === '') ? '' :
  1024. (value < 0.00001) ? 0 : value;if (value == 1)
  1025. if(element.tagName == 'IMG' && element.width) {
  1026. element.width++; element.width--;} else try {
  1027. var n = document.createTextNode(' ');element.appendChild(n);element.removeChild(n);} catch (e) { }
  1028. return element;};Element.Methods.cumulativeOffset = function(element) {
  1029. var valueT = 0, valueL = 0;do {
  1030. valueT += element.offsetTop || 0;valueL += element.offsetLeft || 0;if (element.offsetParent == document.body)
  1031. if (Element.getStyle(element, 'position') == 'absolute') break;element = element.offsetParent;} while (element);return Element._returnOffset(valueL, valueT);};}
  1032. if (Prototype.Browser.IE || Prototype.Browser.Opera) {
  1033. Element.Methods.update = function(element, content) {
  1034. 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) {
  1035. $A(element.childNodes).each(function(node) { element.removeChild(node) });Element._getContentFromAnonymousElement(tagName, content.stripScripts())
  1036. .each(function(node) { element.appendChild(node) });}
  1037. else element.innerHTML = content.stripScripts();content.evalScripts.bind(content).defer();return element;};}
  1038. if (document.createElement('div').outerHTML) {
  1039. Element.Methods.replace = function(element, content) {
  1040. element = $(element);if (content && content.toElement) content = content.toElement();if (Object.isElement(content)) {
  1041. element.parentNode.replaceChild(content, element);return element;}
  1042. content = Object.toHTML(content);var parent = element.parentNode, tagName = parent.tagName.toUpperCase();if (Element._insertionTranslations.tags[tagName]) {
  1043. var nextSibling = element.next();var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());parent.removeChild(element);if (nextSibling)
  1044. fragments.each(function(node) { parent.insertBefore(node, nextSibling) });else
  1045. fragments.each(function(node) { parent.appendChild(node) });}
  1046. else element.outerHTML = content.stripScripts();content.evalScripts.bind(content).defer();return element;};}
  1047. Element._returnOffset = function(l, t) {
  1048. var result = [l, t];result.left = l;result.top = t;return result;};Element._getContentFromAnonymousElement = function(tagName, html) {
  1049. var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];if (t) {
  1050. div.innerHTML = t[0] + html + t[1];t[2].times(function() { div = div.firstChild });} else div.innerHTML = html;return $A(div.childNodes);};Element._insertionTranslations = {
  1051. before: function(element, node) {
  1052. element.parentNode.insertBefore(node, element);},
  1053. top: function(element, node) {
  1054. element.insertBefore(node, element.firstChild);},
  1055. bottom: function(element, node) {
  1056. element.appendChild(node);},
  1057. after: function(element, node) {
  1058. element.parentNode.insertBefore(node, element.nextSibling);},
  1059. tags: {
  1060. TABLE: ['<table>', '</table>', 1],
  1061. TBODY: ['<table><tbody>', '</tbody></table>', 2],
  1062. TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],
  1063. TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
  1064. SELECT: ['<select>', '</select>', 1]
  1065. }
  1066. };(function() {
  1067. Object.extend(this.tags, {
  1068. THEAD: this.tags.TBODY,
  1069. TFOOT: this.tags.TBODY,
  1070. TH: this.tags.TD
  1071. });}).call(Element._insertionTranslations);Element.Methods.Simulated = {
  1072. hasAttribute: function(element, attribute) {
  1073. attribute = Element._attributeTranslations.has[attribute] || attribute;var node = $(element).getAttributeNode(attribute);return node && node.specified;}
  1074. };Element.Methods.ByTag = { };Object.extend(Element, Element.Methods);if (!Prototype.BrowserFeatures.ElementExtensions &&
  1075. document.createElement('div').__proto__) {
  1076. window.HTMLElement = { };window.HTMLElement.prototype = document.createElement('div').__proto__;Prototype.BrowserFeatures.ElementExtensions = true;}
  1077. Element.extend = (function() {
  1078. if (Prototype.BrowserFeatures.SpecificElementExtensions)
  1079. return Prototype.K;var Methods = { }, ByTag = Element.Methods.ByTag;var extend = Object.extend(function(element) {
  1080. if (!element || element._extendedByPrototype ||
  1081. element.nodeType != 1 || element == window) return element;var methods = Object.clone(Methods),
  1082. tagName = element.tagName, property, value;if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);for (property in methods) {
  1083. value = methods[property];if (Object.isFunction(value) && !(property in element))
  1084. element[property] = value.methodize();}
  1085. element._extendedByPrototype = Prototype.emptyFunction;return element;}, {
  1086. refresh: function() {
  1087. if (!Prototype.BrowserFeatures.ElementExtensions) {
  1088. Object.extend(Methods, Element.Methods);Object.extend(Methods, Element.Methods.Simulated);}
  1089. }
  1090. });extend.refresh();return extend;})();Element.hasAttribute = function(element, attribute) {
  1091. if (element.hasAttribute) return element.hasAttribute(attribute);return Element.Methods.Simulated.hasAttribute(element, attribute);};Element.addMethods = function(methods) {
  1092. var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;if (!methods) {
  1093. Object.extend(Form, Form.Methods);Object.extend(Form.Element, Form.Element.Methods);Object.extend(Element.Methods.ByTag, {
  1094. "FORM": Object.clone(Form.Methods),
  1095. "INPUT": Object.clone(Form.Element.Methods),
  1096. "SELECT": Object.clone(Form.Element.Methods),
  1097. "TEXTAREA": Object.clone(Form.Element.Methods)
  1098. });}
  1099. if (arguments.length == 2) {
  1100. var tagName = methods;methods = arguments[1];}
  1101. if (!tagName) Object.extend(Element.Methods, methods || { });else {
  1102. if (Object.isArray(tagName)) tagName.each(extend);else extend(tagName);}
  1103. function extend(tagName) {
  1104. tagName = tagName.toUpperCase();if (!Element.Methods.ByTag[tagName])
  1105. Element.Methods.ByTag[tagName] = { };Object.extend(Element.Methods.ByTag[tagName], methods);}
  1106. function copy(methods, destination, onlyIfAbsent) {
  1107. onlyIfAbsent = onlyIfAbsent || false;for (var property in methods) {
  1108. var value = methods[property];if (!Object.isFunction(value)) continue;if (!onlyIfAbsent || !(property in destination))
  1109. destination[property] = value.methodize();}
  1110. }
  1111. function findDOMClass(tagName) {
  1112. var klass;var trans = {
  1113. "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
  1114. "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
  1115. "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
  1116. "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
  1117. "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
  1118. "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
  1119. "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
  1120. "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
  1121. "FrameSet", "IFRAME": "IFrame"
  1122. };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];}
  1123. if (F.ElementExtensions) {
  1124. copy(Element.Methods, HTMLElement.prototype);copy(Element.Methods.Simulated, HTMLElement.prototype, true);}
  1125. if (F.SpecificElementExtensions) {
  1126. for (var tag in Element.Methods.ByTag) {
  1127. var klass = findDOMClass(tag);if (Object.isUndefined(klass)) continue;copy(T[tag], klass.prototype);}
  1128. }
  1129. Object.extend(Element, Element.Methods);delete Element.ByTag;if (Element.extend.refresh) Element.extend.refresh();Element.cache = { };};document.viewport = {
  1130. getDimensions: function() {
  1131. var dimensions = { };var B = Prototype.Browser;$w('width height').each(function(d) {
  1132. var D = d.capitalize();dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] :
  1133. (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D];});return dimensions;},
  1134. getWidth: function() {
  1135. return this.getDimensions().width;},
  1136. getHeight: function() {
  1137. return this.getDimensions().height;},
  1138. getScrollOffsets: function() {
  1139. return Element._returnOffset(
  1140. window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
  1141. window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);}
  1142. };/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
  1143. * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
  1144. * license. Please see http://www.yui-ext.com/ for more information. */
  1145. var Selector = Class.create({
  1146. initialize: function(expression) {
  1147. this.expression = expression.strip();this.compileMatcher();},
  1148. shouldUseXPath: function() {
  1149. if (!Prototype.BrowserFeatures.XPath) return false;var e = this.expression;if (Prototype.Browser.WebKit &&
  1150. (e.include("-of-type") || e.include(":empty")))
  1151. return false;if ((/(\[[\w-]*?:|:checked)/).test(this.expression))
  1152. return false;return true;},
  1153. compileMatcher: function() {
  1154. if (this.shouldUseXPath())
  1155. return this.compileXPathMatcher();var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
  1156. c = Selector.criteria, le, p, m;if (Selector._cache[e]) {
  1157. this.matcher = Selector._cache[e];return;}
  1158. this.matcher = ["this.matcher = function(root) {",
  1159. "var r = root, h = Selector.handlers, c = false, n;"];while (e && le != e && (/\S/).test(e)) {
  1160. le = e;for (var i in ps) {
  1161. p = ps[i];if (m = e.match(p)) {
  1162. this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
  1163. new Template(c[i]).evaluate(m));e = e.replace(m[0], '');break;}
  1164. }
  1165. }
  1166. this.matcher.push("return h.unique(n);\n}");eval(this.matcher.join('\n'));Selector._cache[this.expression] = this.matcher;},
  1167. compileXPathMatcher: function() {
  1168. var e = this.expression, ps = Selector.patterns,
  1169. x = Selector.xpath, le, m;if (Selector._cache[e]) {
  1170. this.xpath = Selector._cache[e]; return;}
  1171. this.matcher = ['.//*'];
  1172. while (e && le != e && (/\S/).test(e)) {
  1173. le = e;for (var i in ps) {
  1174. if (m = e.match(ps[i])) {
  1175. this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
  1176. new Template(x[i]).evaluate(m));e = e.replace(m[0], '');break;}
  1177. }
  1178. }
  1179. this.xpath = this.matcher.join('');Selector._cache[this.expression] = this.xpath;},
  1180. findElements: function(root) {
  1181. root = root || document;if (this.xpath) return document._getElementsByXPath(this.xpath, root);return this.matcher(root);},
  1182. match: function(element) {
  1183. this.tokens = [];var e = this.expression, ps = Selector.patterns, as = Selector.assertions;var le, p, m;while (e && le !== e && (/\S/).test(e)) {
  1184. le = e;for (var i in ps) {
  1185. p = ps[i];if (m = e.match(p)) {
  1186. if (as[i]) {
  1187. this.tokens.push([i, Object.clone(m)]);e = e.replace(m[0], '');} else {
  1188. return this.findElements(document).include(element);}
  1189. }
  1190. }
  1191. }
  1192. var match = true, name, matches;for (var i = 0, token; token = this.tokens[i]; i++) {
  1193. name = token[0], matches = token[1];if (!Selector.assertions[name](element, matches)) {
  1194. match = false; break;}
  1195. }
  1196. return match;},
  1197. toString: function() {
  1198. return this.expression;},
  1199. inspect: function() {
  1200. return "#<Selector:" + this.expression.inspect() + ">";}
  1201. });Object.extend(Selector, {
  1202. _cache: { },
  1203. xpath: {
  1204. descendant: "//*",
  1205. child: "/*",
  1206. adjacent: "/following-sibling::*[1]",
  1207. laterSibling: '/following-sibling::*',
  1208. tagName: function(m) {
  1209. if (m[1] == '*') return '';return "[local-name()='" + m[1].toLowerCase() +
  1210. "' or local-name()='" + m[1].toUpperCase() + "']";},
  1211. className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
  1212. id: "[@id='#{1}']",
  1213. attrPresence: function(m) {
  1214. m[1] = m[1].toLowerCase();return new Template("[@#{1}]").evaluate(m);},
  1215. attr: function(m) {
  1216. m[1] = m[1].toLowerCase();m[3] = m[5] || m[6];return new Template(Selector.xpath.operators[m[2]]).evaluate(m);},
  1217. pseudo: function(m) {
  1218. 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);},
  1219. operators: {
  1220. '=': "[@#{1}='#{3}']",
  1221. '!=': "[@#{1}!='#{3}']",
  1222. '^=': "[starts-with(@#{1}, '#{3}')]",
  1223. '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
  1224. '*=': "[contains(@#{1}, '#{3}')]",
  1225. '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
  1226. '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
  1227. },
  1228. pseudos: {
  1229. 'first-child': '[not(preceding-sibling::*)]',
  1230. 'last-child': '[not(following-sibling::*)]',
  1231. 'only-child': '[not(preceding-sibling::* or following-sibling::*)]',
  1232. 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
  1233. 'checked': "[@checked]",
  1234. 'disabled': "[@disabled]",
  1235. 'enabled': "[not(@disabled)]",
  1236. 'not': function(m) {
  1237. var e = m[6], p = Selector.patterns,
  1238. x = Selector.xpath, le, v;var exclusion = [];while (e && le != e && (/\S/).test(e)) {
  1239. le = e;for (var i in p) {
  1240. if (m = e.match(p[i])) {
  1241. 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;}
  1242. }
  1243. }
  1244. return "[not(" + exclusion.join(" and ") + ")]";},
  1245. 'nth-child': function(m) {
  1246. return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);},
  1247. 'nth-last-child': function(m) {
  1248. return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);},
  1249. 'nth-of-type': function(m) {
  1250. return Selector.xpath.pseudos.nth("position() ", m);},
  1251. 'nth-last-of-type': function(m) {
  1252. return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);},
  1253. 'first-of-type': function(m) {
  1254. m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);},
  1255. 'last-of-type': function(m) {
  1256. m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);},
  1257. 'only-of-type': function(m) {
  1258. var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);},
  1259. nth: function(fragment, m) {
  1260. 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
  1261. return '[' + fragment + "= " + mm[1] + ']';if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
  1262. 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 " +
  1263. "((#{fragment} - #{b}) div #{a} >= 0)]";return new Template(predicate).evaluate({
  1264. fragment: fragment, a: a, b: b });}
  1265. }
  1266. }
  1267. },
  1268. criteria: {
  1269. tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
  1270. className: 'n = h.className(n, r, "#{1}", c); c = false;',
  1271. id: 'n = h.id(n, r, "#{1}", c); c = false;',
  1272. attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
  1273. attr: function(m) {
  1274. m[3] = (m[5] || m[6]);return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);},
  1275. pseudo: function(m) {
  1276. if (m[6]) m[6] = m[6].replace(/"/g, '\\"');return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);},
  1277. descendant: 'c = "descendant";',
  1278. child: 'c = "child";',
  1279. adjacent: 'c = "adjacent";',
  1280. laterSibling: 'c = "laterSibling";'
  1281. },
  1282. patterns: {
  1283. laterSibling: /^\s*~\s*/,
  1284. child: /^\s*>\s*/,
  1285. adjacent: /^\s*\+\s*/,
  1286. descendant: /^\s/,
  1287. tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
  1288. id: /^#([\w\-\*]+)(\b|$)/,
  1289. className: /^\.([\w\-\*]+)(\b|$)/,
  1290. pseudo:
  1291. /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
  1292. attrPresence: /^\[([\w]+)\]/,
  1293. attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
  1294. },
  1295. assertions: {
  1296. tagName: function(element, matches) {
  1297. return matches[1].toUpperCase() == element.tagName.toUpperCase();},
  1298. className: function(element, matches) {
  1299. return Element.hasClassName(element, matches[1]);},
  1300. id: function(element, matches) {
  1301. return element.id === matches[1];},
  1302. attrPresence: function(element, matches) {
  1303. return Element.hasAttribute(element, matches[1]);},
  1304. attr: function(element, matches) {
  1305. var nodeValue = Element.readAttribute(element, matches[1]);return Selector.operators[matches[2]](nodeValue, matches[3]);}
  1306. },
  1307. handlers: {
  1308. concat: function(a, b) {
  1309. for (var i = 0, node; node = b[i]; i++)
  1310. a.push(node);return a;},
  1311. mark: function(nodes) {
  1312. for (var i = 0, node; node = nodes[i]; i++)
  1313. node._counted = true;return nodes;},
  1314. unmark: function(nodes) {
  1315. for (var i = 0, node; node = nodes[i]; i++)
  1316. node._counted = undefined;return nodes;},
  1317. index: function(parentNode, reverse, ofType) {
  1318. parentNode._counted = true;if (reverse) {
  1319. for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
  1320. var node = nodes[i];if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;}
  1321. } else {
  1322. for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
  1323. if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;}
  1324. },
  1325. unique: function(nodes) {
  1326. if (nodes.length == 0) return nodes;var results = [], n;for (var i = 0, l = nodes.length; i < l; i++)
  1327. if (!(n = nodes[i])._counted) {
  1328. n._counted = true;results.push(Element.extend(n));}
  1329. return Selector.handlers.unmark(results);},
  1330. descendant: function(nodes) {
  1331. var h = Selector.handlers;for (var i = 0, results = [], node; node = nodes[i]; i++)
  1332. h.concat(results, node.getElementsByTagName('*'));return results;},
  1333. child: function(nodes) {
  1334. var h = Selector.handlers;for (var i = 0, results = [], node; node = nodes[i]; i++) {
  1335. for (var j = 0, child; child = node.childNodes[j]; j++)
  1336. if (child.nodeType == 1 && child.tagName != '!') results.push(child);}
  1337. return results;},
  1338. adjacent: function(nodes) {
  1339. for (var i = 0, results = [], node; node = nodes[i]; i++) {
  1340. var next = this.nextElementSibling(node);if (next) results.push(next);}
  1341. return results;},
  1342. laterSibling: function(nodes) {
  1343. var h = Selector.handlers;for (var i = 0, results = [], node; node = nodes[i]; i++)
  1344. h.concat(results, Element.nextSiblings(node));return results;},
  1345. nextElementSibling: function(node) {
  1346. while (node = node.nextSibling)
  1347. if (node.nodeType == 1) return node;return null;},
  1348. previousElementSibling: function(node) {
  1349. while (node = node.previousSibling)
  1350. if (node.nodeType == 1) return node;return null;},
  1351. tagName: function(nodes, root, tagName, combinator) {
  1352. var uTagName = tagName.toUpperCase();var results = [], h = Selector.handlers;if (nodes) {
  1353. if (combinator) {
  1354. if (combinator == "descendant") {
  1355. for (var i = 0, node; node = nodes[i]; i++)
  1356. h.concat(results, node.getElementsByTagName(tagName));return results;} else nodes = this[combinator](nodes);if (tagName == "*") return nodes;}
  1357. for (var i = 0, node; node = nodes[i]; i++)
  1358. if (node.tagName.toUpperCase() === uTagName) results.push(node);return results;} else return root.getElementsByTagName(tagName);},
  1359. id: function(nodes, root, id, combinator) {
  1360. var targetNode = $(id), h = Selector.handlers;if (!targetNode) return [];if (!nodes && root == document) return [targetNode];if (nodes) {
  1361. if (combinator) {
  1362. if (combinator == 'child') {
  1363. for (var i = 0, node; node = nodes[i]; i++)
  1364. if (targetNode.parentNode == node) return [targetNode];} else if (combinator == 'descendant') {
  1365. for (var i = 0, node; node = nodes[i]; i++)
  1366. if (Element.descendantOf(targetNode, node)) return [targetNode];} else if (combinator == 'adjacent') {
  1367. for (var i = 0, node; node = nodes[i]; i++)
  1368. if (Selector.handlers.previousElementSibling(targetNode) == node)
  1369. return [targetNode];} else nodes = h[combinator](nodes);}
  1370. for (var i = 0, node; node = nodes[i]; i++)
  1371. if (node == targetNode) return [targetNode];return [];}
  1372. return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];},
  1373. className: function(nodes, root, className, combinator) {
  1374. if (nodes && combinator) nodes = this[combinator](nodes);return Selector.handlers.byClassName(nodes, root, className);},
  1375. byClassName: function(nodes, root, className) {
  1376. if (!nodes) nodes = Selector.handlers.descendant([root]);var needle = ' ' + className + ' ';for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
  1377. nodeClassName = node.className;if (nodeClassName.length == 0) continue;if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
  1378. results.push(node);}
  1379. return results;},
  1380. attrPresence: function(nodes, root, attr) {
  1381. if (!nodes) nodes = root.getElementsByTagName("*");var results = [];for (var i = 0, node; node = nodes[i]; i++)
  1382. if (Element.hasAttribute(node, attr)) results.push(node);return results;},
  1383. attr: function(nodes, root, attr, value, operator) {
  1384. if (!nodes) nodes = root.getElementsByTagName("*");var handler = Selector.operators[operator], results = [];for (var i = 0, node; node = nodes[i]; i++) {
  1385. var nodeValue = Element.readAttribute(node, attr);if (nodeValue === null) continue;if (handler(nodeValue, value)) results.push(node);}
  1386. return results;},
  1387. pseudo: function(nodes, name, value, root, combinator) {
  1388. if (nodes && combinator) nodes = this[combinator](nodes);if (!nodes) nodes = root.getElementsByTagName("*");return Selector.pseudos[name](nodes, value, root);}
  1389. },
  1390. pseudos: {
  1391. 'first-child': function(nodes, value, root) {
  1392. for (var i = 0, results = [], node; node = nodes[i]; i++) {
  1393. if (Selector.handlers.previousElementSibling(node)) continue;results.push(node);}
  1394. return results;},
  1395. 'last-child': function(nodes, value, root) {
  1396. for (var i = 0, results = [], node; node = nodes[i]; i++) {
  1397. if (Selector.handlers.nextElementSibling(node)) continue;results.push(node);}
  1398. return results;},
  1399. 'only-child': function(nodes, value, root) {
  1400. var h = Selector.handlers;for (var i = 0, results = [], node; node = nodes[i]; i++)
  1401. if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
  1402. results.push(node);return results;},
  1403. 'nth-child': function(nodes, formula, root) {
  1404. return Selector.pseudos.nth(nodes, formula, root);},
  1405. 'nth-last-child': function(nodes, formula, root) {
  1406. return Selector.pseudos.nth(nodes, formula, root, true);},
  1407. 'nth-of-type': function(nodes, formula, root) {
  1408. return Selector.pseudos.nth(nodes, formula, root, false, true);},
  1409. 'nth-last-of-type': function(nodes, formula, root) {
  1410. return Selector.pseudos.nth(nodes, formula, root, true, true);},
  1411. 'first-of-type': function(nodes, formula, root) {
  1412. return Selector.pseudos.nth(nodes, "1", root, false, true);},
  1413. 'last-of-type': function(nodes, formula, root) {
  1414. return Selector.pseudos.nth(nodes, "1", root, true, true);},
  1415. 'only-of-type': function(nodes, formula, root) {
  1416. var p = Selector.pseudos;return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);},
  1417. getIndices: function(a, b, total) {
  1418. if (a == 0) return b > 0 ? [b] : [];return $R(1, total).inject([], function(memo, i) {
  1419. if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);return memo;});},
  1420. nth: function(nodes, formula, root, reverse, ofType) {
  1421. 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++) {
  1422. if (!node.parentNode._counted) {
  1423. h.index(node.parentNode, reverse, ofType);indexed.push(node.parentNode);}
  1424. }
  1425. if (formula.match(/^\d+$/)) { // just a number
  1426. formula = Number(formula);for (var i = 0, node; node = nodes[i]; i++)
  1427. if (node.nodeIndex == formula) results.push(node);} else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
  1428. 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++) {
  1429. for (var j = 0; j < l; j++)
  1430. if (node.nodeIndex == indices[j]) results.push(node);}
  1431. }
  1432. h.unmark(nodes);h.unmark(indexed);return results;},
  1433. 'empty': function(nodes, value, root) {
  1434. for (var i = 0, results = [], node; node = nodes[i]; i++) {
  1435. if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;results.push(node);}
  1436. return results;},
  1437. 'not': function(nodes, selector, root) {
  1438. 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++)
  1439. if (!node._counted) results.push(node);h.unmark(exclusions);return results;},
  1440. 'enabled': function(nodes, value, root) {
  1441. for (var i = 0, results = [], node; node = nodes[i]; i++)
  1442. if (!node.disabled) results.push(node);return results;},
  1443. 'disabled': function(nodes, value, root) {
  1444. for (var i = 0, results = [], node; node = nodes[i]; i++)
  1445. if (node.disabled) results.push(node);return results;},
  1446. 'checked': function(nodes, value, root) {
  1447. for (var i = 0, results = [], node; node = nodes[i]; i++)
  1448. if (node.checked) results.push(node);return results;}
  1449. },
  1450. operators: {
  1451. '=': function(nv, v) { return nv == v; },
  1452. '!=': function(nv, v) { return nv != v; },
  1453. '^=': function(nv, v) { return nv.startsWith(v); },
  1454. '$=': function(nv, v) { return nv.endsWith(v); },
  1455. '*=': function(nv, v) { return nv.include(v); },
  1456. '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
  1457. '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
  1458. },
  1459. matchElements: function(elements, expression) {
  1460. var matches = new Selector(expression).findElements(), h = Selector.handlers;h.mark(matches);for (var i = 0, results = [], element; element = elements[i]; i++)
  1461. if (element._counted) results.push(element);h.unmark(matches);return results;},
  1462. findElement: function(elements, expression, index) {
  1463. if (Object.isNumber(expression)) {
  1464. index = expression; expression = false;}
  1465. return Selector.matchElements(elements, expression || '*')[index || 0];},
  1466. findChildElements: function(element, expressions) {
  1467. var exprs = expressions.join(',');expressions = [];exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
  1468. expressions.push(m[1].strip());});var results = [], h = Selector.handlers;for (var i = 0, l = expressions.length, selector; i < l; i++) {
  1469. selector = new Selector(expressions[i].strip());h.concat(results, selector.findElements(element));}
  1470. return (l > 1) ? h.unique(results) : results;}
  1471. });if (Prototype.Browser.IE) {
  1472. Selector.handlers.concat = function(a, b) {
  1473. for (var i = 0, node; node = b[i]; i++)
  1474. if (node.tagName !== "!") a.push(node);return a;};}
  1475. function $$() {
  1476. return Selector.findChildElements(document, $A(arguments));}
  1477. var Form = {
  1478. reset: function(form) {
  1479. $(form).reset();return form;},
  1480. serializeElements: function(elements, options) {
  1481. 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) {
  1482. if (!element.disabled && element.name) {
  1483. key = element.name; value = $(element).getValue();if (value != null && (element.type != 'submit' || (!submitted &&
  1484. submit !== false && (!submit || key == submit) && (submitted = true)))) {
  1485. if (key in result) {
  1486. if (!Object.isArray(result[key])) result[key] = [result[key]];result[key].push(value);}
  1487. else result[key] = value;}
  1488. }
  1489. return result;});return options.hash ? data : Object.toQueryString(data);}
  1490. };Form.Methods = {
  1491. serialize: function(form, options) {
  1492. return Form.serializeElements(Form.getElements(form), options);},
  1493. getElements: function(form) {
  1494. return $A($(form).getElementsByTagName('*')).inject([],
  1495. function(elements, child) {
  1496. if (Form.Element.Serializers[child.tagName.toLowerCase()])
  1497. elements.push(Element.extend(child));return elements;}
  1498. );},
  1499. getInputs: function(form, typeName, name) {
  1500. 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++) {
  1501. var input = inputs[i];if ((typeName && input.type != typeName) || (name && input.name != name))
  1502. continue;matchingInputs.push(Element.extend(input));}
  1503. return matchingInputs;},
  1504. disable: function(form) {
  1505. form = $(form);Form.getElements(form).invoke('disable');return form;},
  1506. enable: function(form) {
  1507. form = $(form);Form.getElements(form).invoke('enable');return form;},
  1508. findFirstElement: function(form) {
  1509. var elements = $(form).getElements().findAll(function(element) {
  1510. return 'hidden' != element.type && !element.disabled;});var firstByIndex = elements.findAll(function(element) {
  1511. return element.hasAttribute('tabIndex') && element.tabIndex >= 0;}).sortBy(function(element) { return element.tabIndex }).first();return firstByIndex ? firstByIndex : elements.find(function(element) {
  1512. return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());});},
  1513. focusFirstElement: function(form) {
  1514. form = $(form);form.findFirstElement().activate();return form;},
  1515. request: function(form, options) {
  1516. 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) {
  1517. if (Object.isString(params)) params = params.toQueryParams();Object.extend(options.parameters, params);}
  1518. if (form.hasAttribute('method') && !options.method)
  1519. options.method = form.method;return new Ajax.Request(action, options);}
  1520. };/*--------------------------------------------------------------------------*/
  1521. Form.Element = {
  1522. focus: function(element) {
  1523. $(element).focus();return element;},
  1524. select: function(element) {
  1525. $(element).select();return element;}
  1526. };Form.Element.Methods = {
  1527. serialize: function(element) {
  1528. element = $(element);if (!element.disabled && element.name) {
  1529. var value = element.getValue();if (value != undefined) {
  1530. var pair = { };pair[element.name] = value;return Object.toQueryString(pair);}
  1531. }
  1532. return '';},
  1533. getValue: function(element) {
  1534. element = $(element);var method = element.tagName.toLowerCase();return Form.Element.Serializers[method](element);},
  1535. setValue: function(element, value) {
  1536. element = $(element);var method = element.tagName.toLowerCase();Form.Element.Serializers[method](element, value);return element;},
  1537. clear: function(element) {
  1538. $(element).value = '';return element;},
  1539. present: function(element) {
  1540. return $(element).value != '';},
  1541. activate: function(element) {
  1542. element = $(element);try {
  1543. element.focus();if (element.select && (element.tagName.toLowerCase() != 'input' ||
  1544. !['button', 'reset', 'submit'].include(element.type)))
  1545. element.select();} catch (e) { }
  1546. return element;},
  1547. disable: function(element) {
  1548. element = $(element);element.blur();element.disabled = true;return element;},
  1549. enable: function(element) {
  1550. element = $(element);element.disabled = false;return element;}
  1551. };/*--------------------------------------------------------------------------*/
  1552. var Field = Form.Element;var $F = Form.Element.Methods.getValue;/*--------------------------------------------------------------------------*/
  1553. Form.Element.Serializers = {
  1554. input: function(element, value) {
  1555. switch (element.type.toLowerCase()) {
  1556. case 'checkbox':
  1557. case 'radio':
  1558. return Form.Element.Serializers.inputSelector(element, value);default:
  1559. return Form.Element.Serializers.textarea(element, value);}
  1560. },
  1561. inputSelector: function(element, value) {
  1562. if (Object.isUndefined(value)) return element.checked ? element.value : null;else element.checked = !!value;},
  1563. textarea: function(element, value) {
  1564. if (Object.isUndefined(value)) return element.value;else element.value = value;},
  1565. select: function(element, index) {
  1566. if (Object.isUndefined(index))
  1567. return this[element.type == 'select-one' ?
  1568. 'selectOne' : 'selectMany'](element);else {
  1569. var opt, value, single = !Object.isArray(index);for (var i = 0, length = element.length; i < length; i++) {
  1570. opt = element.options[i];value = this.optionValue(opt);if (single) {
  1571. if (value == index) {
  1572. opt.selected = true;return;}
  1573. }
  1574. else opt.selected = index.include(value);}
  1575. }
  1576. },
  1577. selectOne: function(element) {
  1578. var index = element.selectedIndex;return index >= 0 ? this.optionValue(element.options[index]) : null;},
  1579. selectMany: function(element) {
  1580. var values, length = element.length;if (!length) return null;for (var i = 0, values = []; i < length; i++) {
  1581. var opt = element.options[i];if (opt.selected) values.push(this.optionValue(opt));}
  1582. return values;},
  1583. optionValue: function(opt) {
  1584. return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;}
  1585. };/*--------------------------------------------------------------------------*/
  1586. Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
  1587. initialize: function($super, element, frequency, callback) {
  1588. $super(callback, frequency);this.element = $(element);this.lastValue = this.getValue();},
  1589. execute: function() {
  1590. var value = this.getValue();if (Object.isString(this.lastValue) && Object.isString(value) ?
  1591. this.lastValue != value : String(this.lastValue) != String(value)) {
  1592. this.callback(this.element, value);this.lastValue = value;}
  1593. }
  1594. });Form.Element.Observer = Class.create(Abstract.TimedObserver, {
  1595. getValue: function() {
  1596. return Form.Element.getValue(this.element);}
  1597. });Form.Observer = Class.create(Abstract.TimedObserver, {
  1598. getValue: function() {
  1599. return Form.serialize(this.element);}
  1600. });/*--------------------------------------------------------------------------*/
  1601. Abstract.EventObserver = Class.create({
  1602. initialize: function(element, callback) {
  1603. this.element = $(element);this.callback = callback;this.lastValue = this.getValue();if (this.element.tagName.toLowerCase() == 'form')
  1604. this.registerFormCallbacks();else
  1605. this.registerCallback(this.element);},
  1606. onElementEvent: function() {
  1607. var value = this.getValue();if (this.lastValue != value) {
  1608. this.callback(this.element, value);this.lastValue = value;}
  1609. },
  1610. registerFormCallbacks: function() {
  1611. Form.getElements(this.element).each(this.registerCallback, this);},
  1612. registerCallback: function(element) {
  1613. if (element.type) {
  1614. switch (element.type.toLowerCase()) {
  1615. case 'checkbox':
  1616. case 'radio':
  1617. Event.observe(element, 'click', this.onElementEvent.bind(this));break;default:
  1618. Event.observe(element, 'change', this.onElementEvent.bind(this));break;}
  1619. }
  1620. }
  1621. });Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
  1622. getValue: function() {
  1623. return Form.Element.getValue(this.element);}
  1624. });Form.EventObserver = Class.create(Abstract.EventObserver, {
  1625. getValue: function() {
  1626. return Form.serialize(this.element);}
  1627. });if (!window.Event) var Event = { };Object.extend(Event, {
  1628. KEY_BACKSPACE: 8,
  1629. KEY_TAB: 9,
  1630. KEY_RETURN: 13,
  1631. KEY_ESC: 27,
  1632. KEY_LEFT: 37,
  1633. KEY_UP: 38,
  1634. KEY_RIGHT: 39,
  1635. KEY_DOWN: 40,
  1636. KEY_DELETE: 46,
  1637. KEY_HOME: 36,
  1638. KEY_END: 35,
  1639. KEY_PAGEUP: 33,
  1640. KEY_PAGEDOWN: 34,
  1641. KEY_INSERT: 45,
  1642. cache: { },
  1643. relatedTarget: function(event) {
  1644. var element;switch(event.type) {
  1645. case 'mouseover': element = event.fromElement; break;case 'mouseout': element = event.toElement; break;default: return null;}
  1646. return Element.extend(element);}
  1647. });Event.Methods = (function() {
  1648. var isButton;if (Prototype.Browser.IE) {
  1649. var buttonMap = { 0: 1, 1: 4, 2: 2 };isButton = function(event, code) {
  1650. return event.button == buttonMap[code];};} else if (Prototype.Browser.WebKit) {
  1651. isButton = function(event, code) {
  1652. switch (code) {
  1653. case 0: return event.which == 1 && !event.metaKey;case 1: return event.which == 1 && event.metaKey;default: return false;}
  1654. };} else {
  1655. isButton = function(event, code) {
  1656. return event.which ? (event.which === code + 1) : (event.button === code);};}
  1657. return {
  1658. isLeftClick: function(event) { return isButton(event, 0) },
  1659. isMiddleClick: function(event) { return isButton(event, 1) },
  1660. isRightClick: function(event) { return isButton(event, 2) },
  1661. element: function(event) {
  1662. var node = Event.extend(event).target;return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);},
  1663. findElement: function(event, expression) {
  1664. var element = Event.element(event);if (!expression) return element;var elements = [element].concat(element.ancestors());return Selector.findElement(elements, expression, 0);},
  1665. pointer: function(event) {
  1666. return {
  1667. x: event.pageX || (event.clientX +
  1668. (document.documentElement.scrollLeft || document.body.scrollLeft)),
  1669. y: event.pageY || (event.clientY +
  1670. (document.documentElement.scrollTop || document.body.scrollTop))
  1671. };},
  1672. pointerX: function(event) { return Event.pointer(event).x },
  1673. pointerY: function(event) { return Event.pointer(event).y },
  1674. stop: function(event) {
  1675. Event.extend(event);event.preventDefault();event.stopPropagation();event.stopped = true;}
  1676. };})();Event.extend = (function() {
  1677. var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
  1678. m[name] = Event.Methods[name].methodize();return m;});if (Prototype.Browser.IE) {
  1679. Object.extend(methods, {
  1680. stopPropagation: function() { this.cancelBubble = true },
  1681. preventDefault: function() { this.returnValue = false },
  1682. inspect: function() { return "[object Event]" }
  1683. });return function(event) {
  1684. if (!event) return false;if (event._extendedByPrototype) return event;event._extendedByPrototype = Prototype.emptyFunction;var pointer = Event.pointer(event);Object.extend(event, {
  1685. target: event.srcElement,
  1686. relatedTarget: Event.relatedTarget(event),
  1687. pageX: pointer.x,
  1688. pageY: pointer.y
  1689. });return Object.extend(event, methods);};} else {
  1690. Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;Object.extend(Event.prototype, methods);return Prototype.K;}
  1691. })();Object.extend(Event, (function() {
  1692. var cache = Event.cache;function getEventID(element) {
  1693. if (element._eventID) return element._eventID;arguments.callee.id = arguments.callee.id || 1;return element._eventID = ++arguments.callee.id;}
  1694. function getDOMEventName(eventName) {
  1695. if (eventName && eventName.include(':')) return "dataavailable";return eventName;}
  1696. function getCacheForID(id) {
  1697. return cache[id] = cache[id] || { };}
  1698. function getWrappersForEventName(id, eventName) {
  1699. var c = getCacheForID(id);return c[eventName] = c[eventName] || [];}
  1700. function createWrapper(element, eventName, handler) {
  1701. var id = getEventID(element);var c = getWrappersForEventName(id, eventName);if (c.pluck("handler").include(handler)) return false;var wrapper = function(event) {
  1702. if (!Event || !Event.extend ||
  1703. (event.eventName && event.eventName != eventName))
  1704. return false;Event.extend(event);handler.call(element, event);};wrapper.handler = handler;c.push(wrapper);return wrapper;}
  1705. function findWrapper(id, eventName, handler) {
  1706. var c = getWrappersForEventName(id, eventName);return c.find(function(wrapper) { return wrapper.handler == handler });}
  1707. function destroyWrapper(id, eventName, handler) {
  1708. var c = getCacheForID(id);if (!c[eventName]) return false;c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));}
  1709. function destroyCache() {
  1710. for (var id in cache)
  1711. for (var eventName in cache[id])
  1712. cache[id][eventName] = null;}
  1713. if (window.attachEvent) {
  1714. window.attachEvent("onunload", destroyCache);}
  1715. return {
  1716. observe: function(element, eventName, handler) {
  1717. element = $(element);var name = getDOMEventName(eventName);var wrapper = createWrapper(element, eventName, handler);if (!wrapper) return element;if (element.addEventListener) {
  1718. element.addEventListener(name, wrapper, false);} else {
  1719. element.attachEvent("on" + name, wrapper);}
  1720. return element;},
  1721. stopObserving: function(element, eventName, handler) {
  1722. element = $(element);var id = getEventID(element), name = getDOMEventName(eventName);if (!handler && eventName) {
  1723. getWrappersForEventName(id, eventName).each(function(wrapper) {
  1724. element.stopObserving(eventName, wrapper.handler);});return element;} else if (!eventName) {
  1725. Object.keys(getCacheForID(id)).each(function(eventName) {
  1726. element.stopObserving(eventName);});return element;}
  1727. var wrapper = findWrapper(id, eventName, handler);if (!wrapper) return element;if (element.removeEventListener) {
  1728. element.removeEventListener(name, wrapper, false);} else {
  1729. element.detachEvent("on" + name, wrapper);}
  1730. destroyWrapper(id, eventName, handler);return element;},
  1731. fire: function(element, eventName, memo) {
  1732. element = $(element);if (element == document && document.createEvent && !element.dispatchEvent)
  1733. element = document.documentElement;var event;if (document.createEvent) {
  1734. event = document.createEvent("HTMLEvents");event.initEvent("dataavailable", true, true);} else {
  1735. event = document.createEventObject();event.eventType = "ondataavailable";}
  1736. event.eventName = eventName;event.memo = memo || { };if (document.createEvent) {
  1737. element.dispatchEvent(event);} else {
  1738. element.fireEvent(event.eventType, event);}
  1739. return Event.extend(event);}
  1740. };})());Object.extend(Event, Event.Methods);Element.addMethods({
  1741. fire: Event.fire,
  1742. observe: Event.observe,
  1743. stopObserving: Event.stopObserving
  1744. });Object.extend(document, {
  1745. fire: Element.Methods.fire.methodize(),
  1746. observe: Element.Methods.observe.methodize(),
  1747. stopObserving: Element.Methods.stopObserving.methodize(),
  1748. loaded: false
  1749. });(function() {
  1750. /* Support for the DOMContentLoaded event is based on work by Dan Webb,
  1751. Matthias Miller, Dean Edwards and John Resig. */
  1752. var timer;function fireContentLoadedEvent() {
  1753. if (document.loaded) return;if (timer) window.clearInterval(timer);document.fire("dom:loaded");document.loaded = true;}
  1754. if (document.addEventListener) {
  1755. if (Prototype.Browser.WebKit) {
  1756. timer = window.setInterval(function() {
  1757. if (/loaded|complete/.test(document.readyState))
  1758. fireContentLoadedEvent();}, 0);Event.observe(window, "load", fireContentLoadedEvent);} else {
  1759. document.addEventListener("DOMContentLoaded",
  1760. fireContentLoadedEvent, false);}
  1761. } else {
  1762. document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
  1763. $("__onDOMContentLoaded").onreadystatechange = function() {
  1764. if (this.readyState == "complete") {
  1765. this.onreadystatechange = null;fireContentLoadedEvent();}
  1766. };}
  1767. })();/*------------------------------- DEPRECATED -------------------------------*/
  1768. Hash.toQueryString = Object.toQueryString;var Toggle = { display: Element.toggle };Element.Methods.childOf = Element.Methods.descendantOf;var Insertion = {
  1769. Before: function(element, content) {
  1770. return Element.insert(element, {before:content});},
  1771. Top: function(element, content) {
  1772. return Element.insert(element, {top:content});},
  1773. Bottom: function(element, content) {
  1774. return Element.insert(element, {bottom:content});},
  1775. After: function(element, content) {
  1776. return Element.insert(element, {after:content});}
  1777. };var $continue = new Error('"throw $continue" is deprecated, use "return" instead');var Position = {
  1778. includeScrollOffsets: false,
  1779. prepare: function() {
  1780. this.deltaX = window.pageXOffset
  1781. || document.documentElement.scrollLeft
  1782. || document.body.scrollLeft
  1783. || 0;this.deltaY = window.pageYOffset
  1784. || document.documentElement.scrollTop
  1785. || document.body.scrollTop
  1786. || 0;},
  1787. within: function(element, x, y) {
  1788. if (this.includeScrollOffsets)
  1789. return this.withinIncludingScrolloffsets(element, x, y);this.xcomp = x;this.ycomp = y;this.offset = Element.cumulativeOffset(element);return (y >= this.offset[1] &&
  1790. y < this.offset[1] + element.offsetHeight &&
  1791. x >= this.offset[0] &&
  1792. x < this.offset[0] + element.offsetWidth);},
  1793. withinIncludingScrolloffsets: function(element, x, y) {
  1794. 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] &&
  1795. this.ycomp < this.offset[1] + element.offsetHeight &&
  1796. this.xcomp >= this.offset[0] &&
  1797. this.xcomp < this.offset[0] + element.offsetWidth);},
  1798. overlap: function(mode, element) {
  1799. if (!mode) return 0;if (mode == 'vertical')
  1800. return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
  1801. element.offsetHeight;if (mode == 'horizontal')
  1802. return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
  1803. element.offsetWidth;},
  1804. cumulativeOffset: Element.Methods.cumulativeOffset,
  1805. positionedOffset: Element.Methods.positionedOffset,
  1806. absolutize: function(element) {
  1807. Position.prepare();return Element.absolutize(element);},
  1808. relativize: function(element) {
  1809. Position.prepare();return Element.relativize(element);},
  1810. realOffset: Element.Methods.cumulativeScrollOffset,
  1811. offsetParent: Element.Methods.getOffsetParent,
  1812. page: Element.Methods.viewportOffset,
  1813. clone: function(source, target, options) {
  1814. options = options || { };return Element.clonePosition(target, source, options);}
  1815. };/*--------------------------------------------------------------------------*/
  1816. if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
  1817. function iter(name) {
  1818. return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";}
  1819. instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
  1820. function(element, className) {
  1821. className = className.toString().strip();var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
  1822. } : function(element, className) {
  1823. 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++) {
  1824. if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
  1825. (classNames && classNames.all(function(name) {
  1826. return !name.toString().blank() && cn.include(' ' + name + ' ');}))))
  1827. elements.push(Element.extend(child));}
  1828. return elements;};return function(className, parentElement) {
  1829. return $(parentElement || document.body).getElementsByClassName(className);};}(Element.Methods);/*--------------------------------------------------------------------------*/
  1830. Element.ClassNames = Class.create();Element.ClassNames.prototype = {
  1831. initialize: function(element) {
  1832. this.element = $(element);},
  1833. _each: function(iterator) {
  1834. this.element.className.split(/\s+/).select(function(name) {
  1835. return name.length > 0;})._each(iterator);},
  1836. set: function(className) {
  1837. this.element.className = className;},
  1838. add: function(classNameToAdd) {
  1839. if (this.include(classNameToAdd)) return;this.set($A(this).concat(classNameToAdd).join(' '));},
  1840. remove: function(classNameToRemove) {
  1841. if (!this.include(classNameToRemove)) return;this.set($A(this).without(classNameToRemove).join(' '));},
  1842. toString: function() {
  1843. return $A(this).join(' ');}
  1844. };Object.extend(Element.ClassNames.prototype, Enumerable);/*--------------------------------------------------------------------------*/
  1845. Element.addMethods();String.prototype.parseColor = function() {
  1846. var color = '#';if (this.slice(0,4) == 'rgb(') {
  1847. var cols = this.slice(4,this.length-1).split(',');var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);} else {
  1848. if (this.slice(0,1) == '#') {
  1849. if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();if (this.length==7) color = this.toLowerCase();}
  1850. }
  1851. return (color.length==7 ? color : (arguments[0] || this));};/*--------------------------------------------------------------------------*/
  1852. Element.collectTextNodes = function(element) {
  1853. return $A($(element).childNodes).collect( function(node) {
  1854. return (node.nodeType==3 ? node.nodeValue :
  1855. (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));}).flatten().join('');};Element.collectTextNodesIgnoreClass = function(element, className) {
  1856. return $A($(element).childNodes).collect( function(node) {
  1857. return (node.nodeType==3 ? node.nodeValue :
  1858. ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
  1859. Element.collectTextNodesIgnoreClass(node, className) : ''));}).flatten().join('');};Element.setContentZoom = function(element, percent) {
  1860. element = $(element);element.setStyle({fontSize: (percent/100) + 'em'});if (Prototype.Browser.WebKit) window.scrollBy(0,0);return element;};Element.getInlineOpacity = function(element){
  1861. return $(element).style.opacity || '';};Element.forceRerendering = function(element) {
  1862. try {
  1863. element = $(element);var n = document.createTextNode(' ');element.appendChild(n);element.removeChild(n);} catch(e) { }
  1864. };/*--------------------------------------------------------------------------*/
  1865. var Effect = {
  1866. _elementDoesNotExistError: {
  1867. name: 'ElementDoesNotExistError',
  1868. message: 'The specified DOM element does not exist, but is required for this effect to operate'
  1869. },
  1870. Transitions: {
  1871. linear: Prototype.K,
  1872. sinoidal: function(pos) {
  1873. return (-Math.cos(pos*Math.PI)/2) + 0.5;},
  1874. reverse: function(pos) {
  1875. return 1-pos;},
  1876. flicker: function(pos) {
  1877. var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;return pos > 1 ? 1 : pos;},
  1878. wobble: function(pos) {
  1879. return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;},
  1880. pulse: function(pos, pulses) {
  1881. pulses = pulses || 5;return (
  1882. ((pos % (1/pulses)) * pulses).round() == 0 ?
  1883. ((pos * pulses * 2) - (pos * pulses * 2).floor()) :
  1884. 1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())
  1885. );},
  1886. spring: function(pos) {
  1887. return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));},
  1888. none: function(pos) {
  1889. return 0;},
  1890. full: function(pos) {
  1891. return 1;}
  1892. },
  1893. DefaultOptions: {
  1894. duration: 1.0, // seconds
  1895. fps: 100, // 100= assume 66fps max.
  1896. sync: false, // true for combining
  1897. from: 0.0,
  1898. to: 1.0,
  1899. delay: 0.0,
  1900. queue: 'parallel'
  1901. },
  1902. tagifyText: function(element) {
  1903. var tagifyStyle = 'position:relative';if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';element = $(element);$A(element.childNodes).each( function(child) {
  1904. if (child.nodeType==3) {
  1905. child.nodeValue.toArray().each( function(character) {
  1906. element.insertBefore(
  1907. new Element('span', {style: tagifyStyle}).update(
  1908. character == ' ' ? String.fromCharCode(160) : character),
  1909. child);});Element.remove(child);}
  1910. });},
  1911. multiple: function(element, effect) {
  1912. var elements;if (((typeof element == 'object') ||
  1913. Object.isFunction(element)) &&
  1914. (element.length))
  1915. elements = element;else
  1916. elements = $(element).childNodes;var options = Object.extend({
  1917. speed: 0.1,
  1918. delay: 0.0
  1919. }, arguments[2] || { });var masterDelay = options.delay;$A(elements).each( function(element, index) {
  1920. new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));});},
  1921. PAIRS: {
  1922. 'slide': ['SlideDown','SlideUp'],
  1923. 'blind': ['BlindDown','BlindUp'],
  1924. 'appear': ['Appear','Fade']
  1925. },
  1926. toggle: function(element, effect) {
  1927. element = $(element);effect = (effect || 'appear').toLowerCase();var options = Object.extend({
  1928. queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
  1929. }, arguments[2] || { });Effect[element.visible() ?
  1930. Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);}
  1931. };Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;/* ------------- core effects ------------- */
  1932. Effect.ScopedQueue = Class.create(Enumerable, {
  1933. initialize: function() {
  1934. this.effects = [];this.interval = null;},
  1935. _each: function(iterator) {
  1936. this.effects._each(iterator);},
  1937. add: function(effect) {
  1938. var timestamp = new Date().getTime();var position = Object.isString(effect.options.queue) ?
  1939. effect.options.queue : effect.options.queue.position;switch(position) {
  1940. case 'front':
  1941. this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
  1942. e.startOn += effect.finishOn;e.finishOn += effect.finishOn;});break;case 'with-last':
  1943. timestamp = this.effects.pluck('startOn').max() || timestamp;break;case 'end':
  1944. timestamp = this.effects.pluck('finishOn').max() || timestamp;break;}
  1945. effect.startOn += timestamp;effect.finishOn += timestamp;if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
  1946. this.effects.push(effect);if (!this.interval)
  1947. this.interval = setInterval(this.loop.bind(this), 15);},
  1948. remove: function(effect) {
  1949. this.effects = this.effects.reject(function(e) { return e==effect });if (this.effects.length == 0) {
  1950. clearInterval(this.interval);this.interval = null;}
  1951. },
  1952. loop: function() {
  1953. var timePos = new Date().getTime();for(var i=0, len=this.effects.length;i<len;i++)
  1954. this.effects[i] && this.effects[i].loop(timePos);}
  1955. });Effect.Queues = {
  1956. instances: $H(),
  1957. get: function(queueName) {
  1958. if (!Object.isString(queueName)) return queueName;return this.instances.get(queueName) ||
  1959. this.instances.set(queueName, new Effect.ScopedQueue());}
  1960. };Effect.Queue = Effect.Queues.get('global');Effect.Base = Class.create({
  1961. position: null,
  1962. start: function(options) {
  1963. function codeForEvent(options,eventName){
  1964. return (
  1965. (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
  1966. (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
  1967. );}
  1968. if (options && options.transition === false) options.transition = Effect.Transitions.linear;this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });this.currentFrame = 0;this.state = 'idle';this.startOn = this.options.delay*1000;this.finishOn = this.startOn+(this.options.duration*1000);this.fromToDelta = this.options.to-this.options.from;this.totalTime = this.finishOn-this.startOn;this.totalFrames = this.options.fps*this.options.duration;eval('this.render = function(pos){ '+
  1969. 'if (this.state=="idle"){this.state="running";'+
  1970. codeForEvent(this.options,'beforeSetup')+
  1971. (this.setup ? 'this.setup();':'')+
  1972. codeForEvent(this.options,'afterSetup')+
  1973. '};if (this.state=="running"){'+
  1974. 'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
  1975. 'this.position=pos;'+
  1976. codeForEvent(this.options,'beforeUpdate')+
  1977. (this.update ? 'this.update(pos);':'')+
  1978. codeForEvent(this.options,'afterUpdate')+
  1979. '}}');this.event('beforeStart');if (!this.options.sync)
  1980. Effect.Queues.get(Object.isString(this.options.queue) ?
  1981. 'global' : this.options.queue.scope).add(this);},
  1982. loop: function(timePos) {
  1983. if (timePos >= this.startOn) {
  1984. if (timePos >= this.finishOn) {
  1985. this.render(1.0);this.cancel();this.event('beforeFinish');if (this.finish) this.finish();this.event('afterFinish');return;}
  1986. var pos = (timePos - this.startOn) / this.totalTime,
  1987. frame = (pos * this.totalFrames).round();if (frame > this.currentFrame) {
  1988. this.render(pos);this.currentFrame = frame;}
  1989. }
  1990. },
  1991. cancel: function() {
  1992. if (!this.options.sync)
  1993. Effect.Queues.get(Object.isString(this.options.queue) ?
  1994. 'global' : this.options.queue.scope).remove(this);this.state = 'finished';},
  1995. event: function(eventName) {
  1996. if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);if (this.options[eventName]) this.options[eventName](this);},
  1997. inspect: function() {
  1998. var data = $H();for(property in this)
  1999. if (!Object.isFunction(this[property])) data.set(property, this[property]);return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';}
  2000. });Effect.Parallel = Class.create(Effect.Base, {
  2001. initialize: function(effects) {
  2002. this.effects = effects || [];this.start(arguments[1]);},
  2003. update: function(position) {
  2004. this.effects.invoke('render', position);},
  2005. finish: function(position) {
  2006. this.effects.each( function(effect) {
  2007. effect.render(1.0);effect.cancel();effect.event('beforeFinish');if (effect.finish) effect.finish(position);effect.event('afterFinish');});}
  2008. });Effect.Tween = Class.create(Effect.Base, {
  2009. initialize: function(object, from, to) {
  2010. object = Object.isString(object) ? $(object) : object;var args = $A(arguments), method = args.last(),
  2011. options = args.length == 5 ? args[3] : null;this.method = Object.isFunction(method) ? method.bind(object) :
  2012. Object.isFunction(object[method]) ? object[method].bind(object) :
  2013. function(value) { object[method] = value };this.start(Object.extend({ from: from, to: to }, options || { }));},
  2014. update: function(position) {
  2015. this.method(position);}
  2016. });Effect.Event = Class.create(Effect.Base, {
  2017. initialize: function() {
  2018. this.start(Object.extend({ duration: 0 }, arguments[0] || { }));},
  2019. update: Prototype.emptyFunction
  2020. });Effect.Opacity = Class.create(Effect.Base, {
  2021. initialize: function(element) {
  2022. this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
  2023. this.element.setStyle({zoom: 1});var options = Object.extend({
  2024. from: this.element.getOpacity() || 0.0,
  2025. to: 1.0
  2026. }, arguments[1] || { });this.start(options);},
  2027. update: function(position) {
  2028. this.element.setOpacity(position);}
  2029. });Effect.Move = Class.create(Effect.Base, {
  2030. initialize: function(element) {
  2031. this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);var options = Object.extend({
  2032. x: 0,
  2033. y: 0,
  2034. mode: 'relative'
  2035. }, arguments[1] || { });this.start(options);},
  2036. setup: function() {
  2037. this.element.makePositioned();this.originalLeft = parseFloat(this.element.getStyle('left') || '0');this.originalTop = parseFloat(this.element.getStyle('top') || '0');if (this.options.mode == 'absolute') {
  2038. this.options.x = this.options.x - this.originalLeft;this.options.y = this.options.y - this.originalTop;}
  2039. },
  2040. update: function(position) {
  2041. this.element.setStyle({
  2042. left: (this.options.x * position + this.originalLeft).round() + 'px',
  2043. top: (this.options.y * position + this.originalTop).round() + 'px'
  2044. });}
  2045. });Effect.MoveBy = function(element, toTop, toLeft) {
  2046. return new Effect.Move(element,
  2047. Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));};Effect.Scale = Class.create(Effect.Base, {
  2048. initialize: function(element, percent) {
  2049. this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);var options = Object.extend({
  2050. scaleX: true,
  2051. scaleY: true,
  2052. scaleContent: true,
  2053. scaleFromCenter: false,
  2054. scaleMode: 'box', // 'box' or 'contents' or { } with provided values
  2055. scaleFrom: 100.0,
  2056. scaleTo: percent
  2057. }, arguments[2] || { });this.start(options);},
  2058. setup: function() {
  2059. this.restoreAfterFinish = this.options.restoreAfterFinish || false;this.elementPositioning = this.element.getStyle('position');this.originalStyle = { };['top','left','width','height','fontSize'].each( function(k) {
  2060. this.originalStyle[k] = this.element.style[k];}.bind(this));this.originalTop = this.element.offsetTop;this.originalLeft = this.element.offsetLeft;var fontSize = this.element.getStyle('font-size') || '100%';['em','px','%','pt'].each( function(fontSizeType) {
  2061. if (fontSize.indexOf(fontSizeType)>0) {
  2062. this.fontSize = parseFloat(fontSize);this.fontSizeType = fontSizeType;}
  2063. }.bind(this));this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;this.dims = null;if (this.options.scaleMode=='box')
  2064. this.dims = [this.element.offsetHeight, this.element.offsetWidth];if (/^content/.test(this.options.scaleMode))
  2065. this.dims = [this.element.scrollHeight, this.element.scrollWidth];if (!this.dims)
  2066. this.dims = [this.options.scaleMode.originalHeight,
  2067. this.options.scaleMode.originalWidth];},
  2068. update: function(position) {
  2069. var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);if (this.options.scaleContent && this.fontSize)
  2070. this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);},
  2071. finish: function(position) {
  2072. if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);},
  2073. setDimensions: function(height, width) {
  2074. var d = { };if (this.options.scaleX) d.width = width.round() + 'px';if (this.options.scaleY) d.height = height.round() + 'px';if (this.options.scaleFromCenter) {
  2075. var topd = (height - this.dims[0])/2;var leftd = (width - this.dims[1])/2;if (this.elementPositioning == 'absolute') {
  2076. if (this.options.scaleY) d.top = this.originalTop-topd + 'px';if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';} else {
  2077. if (this.options.scaleY) d.top = -topd + 'px';if (this.options.scaleX) d.left = -leftd + 'px';}
  2078. }
  2079. this.element.setStyle(d);}
  2080. });Effect.Highlight = Class.create(Effect.Base, {
  2081. initialize: function(element) {
  2082. this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });this.start(options);},
  2083. setup: function() {
  2084. if (this.element.getStyle('display')=='none') { this.cancel(); return; }
  2085. this.oldStyle = { };if (!this.options.keepBackgroundImage) {
  2086. this.oldStyle.backgroundImage = this.element.getStyle('background-image');this.element.setStyle({backgroundImage: 'none'});}
  2087. if (!this.options.endcolor)
  2088. this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');if (!this.options.restorecolor)
  2089. this.options.restorecolor = this.element.getStyle('background-color');this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));},
  2090. update: function(position) {
  2091. this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
  2092. return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });},
  2093. finish: function() {
  2094. this.element.setStyle(Object.extend(this.oldStyle, {
  2095. backgroundColor: this.options.restorecolor
  2096. }));}
  2097. });Effect.ScrollTo = function(element) {
  2098. var options = arguments[1] || { },
  2099. scrollOffsets = document.viewport.getScrollOffsets(),
  2100. elementOffsets = $(element).cumulativeOffset(),
  2101. max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();if (options.offset) elementOffsets[1] += options.offset;return new Effect.Tween(null,
  2102. scrollOffsets.top,
  2103. elementOffsets[1] > max ? max : elementOffsets[1],
  2104. options,
  2105. function(p){ scrollTo(scrollOffsets.left, p.round()) }
  2106. );};/* ------------- combination effects ------------- */
  2107. Effect.Fade = function(element) {
  2108. element = $(element);var oldOpacity = element.getInlineOpacity();var options = Object.extend({
  2109. from: element.getOpacity() || 1.0,
  2110. to: 0.0,
  2111. afterFinishInternal: function(effect) {
  2112. if (effect.options.to!=0) return;effect.element.hide().setStyle({opacity: oldOpacity});}
  2113. }, arguments[1] || { });return new Effect.Opacity(element,options);};Effect.Appear = function(element) {
  2114. element = $(element);var options = Object.extend({
  2115. from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
  2116. to: 1.0,
  2117. afterFinishInternal: function(effect) {
  2118. effect.element.forceRerendering();},
  2119. beforeSetup: function(effect) {
  2120. effect.element.setOpacity(effect.options.from).show();}}, arguments[1] || { });return new Effect.Opacity(element,options);};Effect.Puff = function(element) {
  2121. element = $(element);var oldStyle = {
  2122. opacity: element.getInlineOpacity(),
  2123. position: element.getStyle('position'),
  2124. top: element.style.top,
  2125. left: element.style.left,
  2126. width: element.style.width,
  2127. height: element.style.height
  2128. };return new Effect.Parallel(
  2129. [ new Effect.Scale(element, 200,
  2130. { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
  2131. new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
  2132. Object.extend({ duration: 1.0,
  2133. beforeSetupInternal: function(effect) {
  2134. Position.absolutize(effect.effects[0].element)
  2135. },
  2136. afterFinishInternal: function(effect) {
  2137. effect.effects[0].element.hide().setStyle(oldStyle); }
  2138. }, arguments[1] || { })
  2139. );};Effect.BlindUp = function(element) {
  2140. element = $(element);element.makeClipping();return new Effect.Scale(element, 0,
  2141. Object.extend({ scaleContent: false,
  2142. scaleX: false,
  2143. restoreAfterFinish: true,
  2144. afterFinishInternal: function(effect) {
  2145. effect.element.hide().undoClipping();}
  2146. }, arguments[1] || { })
  2147. );};Effect.BlindDown = function(element) {
  2148. element = $(element);var elementDimensions = element.getDimensions();return new Effect.Scale(element, 100, Object.extend({
  2149. scaleContent: false,
  2150. scaleX: false,
  2151. scaleFrom: 0,
  2152. scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
  2153. restoreAfterFinish: true,
  2154. afterSetup: function(effect) {
  2155. effect.element.makeClipping().setStyle({height: '0px'}).show();},
  2156. afterFinishInternal: function(effect) {
  2157. effect.element.undoClipping();}
  2158. }, arguments[1] || { }));};Effect.SwitchOff = function(element) {
  2159. element = $(element);var oldOpacity = element.getInlineOpacity();return new Effect.Appear(element, Object.extend({
  2160. duration: 0.4,
  2161. from: 0,
  2162. transition: Effect.Transitions.flicker,
  2163. afterFinishInternal: function(effect) {
  2164. new Effect.Scale(effect.element, 1, {
  2165. duration: 0.3, scaleFromCenter: true,
  2166. scaleX: false, scaleContent: false, restoreAfterFinish: true,
  2167. beforeSetup: function(effect) {
  2168. effect.element.makePositioned().makeClipping();},
  2169. afterFinishInternal: function(effect) {
  2170. effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});}
  2171. })
  2172. }
  2173. }, arguments[1] || { }));};Effect.DropOut = function(element) {
  2174. element = $(element);var oldStyle = {
  2175. top: element.getStyle('top'),
  2176. left: element.getStyle('left'),
  2177. opacity: element.getInlineOpacity() };return new Effect.Parallel(
  2178. [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
  2179. new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
  2180. Object.extend(
  2181. { duration: 0.5,
  2182. beforeSetup: function(effect) {
  2183. effect.effects[0].element.makePositioned();},
  2184. afterFinishInternal: function(effect) {
  2185. effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);}
  2186. }, arguments[1] || { }));};Effect.Shake = function(element) {
  2187. element = $(element);var options = Object.extend({
  2188. distance: 20,
  2189. duration: 0.5
  2190. }, arguments[1] || {});var distance = parseFloat(options.distance);var split = parseFloat(options.duration) / 10.0;var oldStyle = {
  2191. top: element.getStyle('top'),
  2192. left: element.getStyle('left') };return new Effect.Move(element,
  2193. { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) {
  2194. new Effect.Move(effect.element,
  2195. { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
  2196. new Effect.Move(effect.element,
  2197. { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
  2198. new Effect.Move(effect.element,
  2199. { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
  2200. new Effect.Move(effect.element,
  2201. { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
  2202. new Effect.Move(effect.element,
  2203. { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
  2204. effect.element.undoPositioned().setStyle(oldStyle);}}) }}) }}) }}) }}) }});};Effect.SlideDown = function(element) {
  2205. element = $(element).cleanWhitespace();var oldInnerBottom = element.down().getStyle('bottom');var elementDimensions = element.getDimensions();return new Effect.Scale(element, 100, Object.extend({
  2206. scaleContent: false,
  2207. scaleX: false,
  2208. scaleFrom: window.opera ? 0 : 1,
  2209. scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
  2210. restoreAfterFinish: true,
  2211. afterSetup: function(effect) {
  2212. effect.element.makePositioned();effect.element.down().makePositioned();if (window.opera) effect.element.setStyle({top: ''});effect.element.makeClipping().setStyle({height: '0px'}).show();},
  2213. afterUpdateInternal: function(effect) {
  2214. effect.element.down().setStyle({bottom:
  2215. (effect.dims[0] - effect.element.clientHeight) + 'px' });},
  2216. afterFinishInternal: function(effect) {
  2217. effect.element.undoClipping().undoPositioned();effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
  2218. }, arguments[1] || { })
  2219. );};Effect.SlideUp = function(element) {
  2220. element = $(element).cleanWhitespace();var oldInnerBottom = element.down().getStyle('bottom');var elementDimensions = element.getDimensions();return new Effect.Scale(element, window.opera ? 0 : 1,
  2221. Object.extend({ scaleContent: false,
  2222. scaleX: false,
  2223. scaleMode: 'box',
  2224. scaleFrom: 100,
  2225. scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
  2226. restoreAfterFinish: true,
  2227. afterSetup: function(effect) {
  2228. effect.element.makePositioned();effect.element.down().makePositioned();if (window.opera) effect.element.setStyle({top: ''});effect.element.makeClipping().show();},
  2229. afterUpdateInternal: function(effect) {
  2230. effect.element.down().setStyle({bottom:
  2231. (effect.dims[0] - effect.element.clientHeight) + 'px' });},
  2232. afterFinishInternal: function(effect) {
  2233. effect.element.hide().undoClipping().undoPositioned();effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});}
  2234. }, arguments[1] || { })
  2235. );};Effect.Squish = function(element) {
  2236. return new Effect.Scale(element, window.opera ? 1 : 0, {
  2237. restoreAfterFinish: true,
  2238. beforeSetup: function(effect) {
  2239. effect.element.makeClipping();},
  2240. afterFinishInternal: function(effect) {
  2241. effect.element.hide().undoClipping();}
  2242. });};Effect.Grow = function(element) {
  2243. element = $(element);var options = Object.extend({
  2244. direction: 'center',
  2245. moveTransition: Effect.Transitions.sinoidal,
  2246. scaleTransition: Effect.Transitions.sinoidal,
  2247. opacityTransition: Effect.Transitions.full
  2248. }, arguments[1] || { });var oldStyle = {
  2249. top: element.style.top,
  2250. left: element.style.left,
  2251. height: element.style.height,
  2252. width: element.style.width,
  2253. opacity: element.getInlineOpacity() };var dims = element.getDimensions();var initialMoveX, initialMoveY;var moveX, moveY;switch (options.direction) {
  2254. case 'top-left':
  2255. initialMoveX = initialMoveY = moveX = moveY = 0;break;case 'top-right':
  2256. initialMoveX = dims.width;initialMoveY = moveY = 0;moveX = -dims.width;break;case 'bottom-left':
  2257. initialMoveX = moveX = 0;initialMoveY = dims.height;moveY = -dims.height;break;case 'bottom-right':
  2258. initialMoveX = dims.width;initialMoveY = dims.height;moveX = -dims.width;moveY = -dims.height;break;case 'center':
  2259. initialMoveX = dims.width / 2;initialMoveY = dims.height / 2;moveX = -dims.width / 2;moveY = -dims.height / 2;break;}
  2260. return new Effect.Move(element, {
  2261. x: initialMoveX,
  2262. y: initialMoveY,
  2263. duration: 0.01,
  2264. beforeSetup: function(effect) {
  2265. effect.element.hide().makeClipping().makePositioned();},
  2266. afterFinishInternal: function(effect) {
  2267. new Effect.Parallel(
  2268. [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
  2269. new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
  2270. new Effect.Scale(effect.element, 100, {
  2271. scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
  2272. sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
  2273. ], Object.extend({
  2274. beforeSetup: function(effect) {
  2275. effect.effects[0].element.setStyle({height: '0px'}).show();},
  2276. afterFinishInternal: function(effect) {
  2277. effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);}
  2278. }, options)
  2279. )
  2280. }
  2281. });};Effect.Shrink = function(element) {
  2282. element = $(element);var options = Object.extend({
  2283. direction: 'center',
  2284. moveTransition: Effect.Transitions.sinoidal,
  2285. scaleTransition: Effect.Transitions.sinoidal,
  2286. opacityTransition: Effect.Transitions.none
  2287. }, arguments[1] || { });var oldStyle = {
  2288. top: element.style.top,
  2289. left: element.style.left,
  2290. height: element.style.height,
  2291. width: element.style.width,
  2292. opacity: element.getInlineOpacity() };var dims = element.getDimensions();var moveX, moveY;switch (options.direction) {
  2293. case 'top-left':
  2294. moveX = moveY = 0;break;case 'top-right':
  2295. moveX = dims.width;moveY = 0;break;case 'bottom-left':
  2296. moveX = 0;moveY = dims.height;break;case 'bottom-right':
  2297. moveX = dims.width;moveY = dims.height;break;case 'center':
  2298. moveX = dims.width / 2;moveY = dims.height / 2;break;}
  2299. return new Effect.Parallel(
  2300. [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
  2301. new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
  2302. new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
  2303. ], Object.extend({
  2304. beforeStartInternal: function(effect) {
  2305. effect.effects[0].element.makePositioned().makeClipping();},
  2306. afterFinishInternal: function(effect) {
  2307. effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
  2308. }, options)
  2309. );};Effect.Pulsate = function(element) {
  2310. element = $(element);var options = arguments[1] || { };var oldOpacity = element.getInlineOpacity();var transition = options.transition || Effect.Transitions.sinoidal;var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };reverser.bind(transition);return new Effect.Opacity(element,
  2311. Object.extend(Object.extend({ duration: 2.0, from: 0,
  2312. afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
  2313. }, options), {transition: reverser}));};Effect.Fold = function(element) {
  2314. element = $(element);var oldStyle = {
  2315. top: element.style.top,
  2316. left: element.style.left,
  2317. width: element.style.width,
  2318. height: element.style.height };element.makeClipping();return new Effect.Scale(element, 5, Object.extend({
  2319. scaleContent: false,
  2320. scaleX: false,
  2321. afterFinishInternal: function(effect) {
  2322. new Effect.Scale(element, 1, {
  2323. scaleContent: false,
  2324. scaleY: false,
  2325. afterFinishInternal: function(effect) {
  2326. effect.element.hide().undoClipping().setStyle(oldStyle);} });}}, arguments[1] || { }));};Effect.Morph = Class.create(Effect.Base, {
  2327. initialize: function(element) {
  2328. this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);var options = Object.extend({
  2329. style: { }
  2330. }, arguments[1] || { });if (!Object.isString(options.style)) this.style = $H(options.style);else {
  2331. if (options.style.include(':'))
  2332. this.style = options.style.parseStyle();else {
  2333. this.element.addClassName(options.style);this.style = $H(this.element.getStyles());this.element.removeClassName(options.style);var css = this.element.getStyles();this.style = this.style.reject(function(style) {
  2334. return style.value == css[style.key];});options.afterFinishInternal = function(effect) {
  2335. effect.element.addClassName(effect.options.style);effect.transforms.each(function(transform) {
  2336. effect.element.style[transform.style] = '';});}
  2337. }
  2338. }
  2339. this.start(options);},
  2340. setup: function(){
  2341. function parseColor(color){
  2342. if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';color = color.parseColor();return $R(0,2).map(function(i){
  2343. return parseInt( color.slice(i*2+1,i*2+3), 16 )
  2344. });}
  2345. this.transforms = this.style.map(function(pair){
  2346. var property = pair[0], value = pair[1], unit = null;if (value.parseColor('#zzzzzz') != '#zzzzzz') {
  2347. value = value.parseColor();unit = 'color';} else if (property == 'opacity') {
  2348. value = parseFloat(value);if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
  2349. this.element.setStyle({zoom: 1});} else if (Element.CSS_LENGTH.test(value)) {
  2350. var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);value = parseFloat(components[1]);unit = (components.length == 3) ? components[2] : null;}
  2351. var originalValue = this.element.getStyle(property);return {
  2352. style: property.camelize(),
  2353. originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
  2354. targetValue: unit=='color' ? parseColor(value) : value,
  2355. unit: unit
  2356. };}.bind(this)).reject(function(transform){
  2357. return (
  2358. (transform.originalValue == transform.targetValue) ||
  2359. (
  2360. transform.unit != 'color' &&
  2361. (isNaN(transform.originalValue) || isNaN(transform.targetValue))
  2362. )
  2363. )
  2364. });},
  2365. update: function(position) {
  2366. var style = { }, transform, i = this.transforms.length;while(i--)
  2367. style[(transform = this.transforms[i]).style] =
  2368. transform.unit=='color' ? '#'+
  2369. (Math.round(transform.originalValue[0]+
  2370. (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
  2371. (Math.round(transform.originalValue[1]+
  2372. (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
  2373. (Math.round(transform.originalValue[2]+
  2374. (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
  2375. (transform.originalValue +
  2376. (transform.targetValue - transform.originalValue) * position).toFixed(3) +
  2377. (transform.unit === null ? '' : transform.unit);this.element.setStyle(style, true);}
  2378. });Effect.Transform = Class.create({
  2379. initialize: function(tracks){
  2380. this.tracks = [];this.options = arguments[1] || { };this.addTracks(tracks);},
  2381. addTracks: function(tracks){
  2382. tracks.each(function(track){
  2383. track = $H(track);var data = track.values().first();this.tracks.push($H({
  2384. ids: track.keys().first(),
  2385. effect: Effect.Morph,
  2386. options: { style: data }
  2387. }));}.bind(this));return this;},
  2388. play: function(){
  2389. return new Effect.Parallel(
  2390. this.tracks.map(function(track){
  2391. var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');var elements = [$(ids) || $$(ids)].flatten();return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });}).flatten(),
  2392. this.options
  2393. );}
  2394. });Element.CSS_PROPERTIES = $w(
  2395. 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
  2396. 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
  2397. 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
  2398. 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
  2399. 'fontSize fontWeight height left letterSpacing lineHeight ' +
  2400. 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
  2401. 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
  2402. 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
  2403. 'right textIndent top width wordSpacing zIndex');Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;String.__parseStyleElement = document.createElement('div');String.prototype.parseStyle = function(){
  2404. var style, styleRules = $H();if (Prototype.Browser.WebKit)
  2405. style = new Element('div',{style:this}).style;else {
  2406. String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';style = String.__parseStyleElement.childNodes[0].style;}
  2407. Element.CSS_PROPERTIES.each(function(property){
  2408. if (style[property]) styleRules.set(property, style[property]);});if (Prototype.Browser.IE && this.include('opacity'))
  2409. styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);return styleRules;};if (document.defaultView && document.defaultView.getComputedStyle) {
  2410. Element.getStyles = function(element) {
  2411. var css = document.defaultView.getComputedStyle($(element), null);return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
  2412. styles[property] = css[property];return styles;});};} else {
  2413. Element.getStyles = function(element) {
  2414. element = $(element);var css = element.currentStyle, styles;styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
  2415. results[property] = css[property];return results;});if (!styles.opacity) styles.opacity = element.getOpacity();return styles;};};Effect.Methods = {
  2416. morph: function(element, style) {
  2417. element = $(element);new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));return element;},
  2418. visualEffect: function(element, effect, options) {
  2419. element = $(element)
  2420. var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);new Effect[klass](element, options);return element;},
  2421. highlight: function(element, options) {
  2422. element = $(element);new Effect.Highlight(element, options);return element;}
  2423. };$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
  2424. 'pulsate shake puff squish switchOff dropOut').each(
  2425. function(effect) {
  2426. Effect.Methods[effect] = function(element, options){
  2427. element = $(element);Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);return element;}
  2428. }
  2429. );$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
  2430. function(f) { Effect.Methods[f] = Element[f]; }
  2431. );Element.addMethods(Effect.Methods);if(Object.isUndefined(Effect))
  2432. throw("dragdrop.js requires including script.aculo.us' effects.js library");var Droppables = {
  2433. drops: [],
  2434. remove: function(element) {
  2435. this.drops = this.drops.reject(function(d) { return d.element==$(element) });},
  2436. add: function(element) {
  2437. element = $(element);var options = Object.extend({
  2438. greedy: true,
  2439. hoverclass: null,
  2440. tree: false
  2441. }, arguments[1] || { });if(options.containment) {
  2442. options._containers = [];var containment = options.containment;if(Object.isArray(containment)) {
  2443. containment.each( function(c) { options._containers.push($(c)) });} else {
  2444. options._containers.push($(containment));}
  2445. }
  2446. if(options.accept) options.accept = [options.accept].flatten();Element.makePositioned(element); // fix IE
  2447. options.element = element;this.drops.push(options);},
  2448. findDeepestChild: function(drops) {
  2449. deepest = drops[0];for (i = 1; i < drops.length; ++i)
  2450. if (Element.isParent(drops[i].element, deepest.element))
  2451. deepest = drops[i];return deepest;},
  2452. isContained: function(element, drop) {
  2453. var containmentNode;if(drop.tree) {
  2454. containmentNode = element.treeNode;} else {
  2455. containmentNode = element.parentNode;}
  2456. return drop._containers.detect(function(c) { return containmentNode == c });},
  2457. isAffected: function(point, element, drop) {
  2458. return (
  2459. (drop.element!=element) &&
  2460. ((!drop._containers) ||
  2461. this.isContained(element, drop)) &&
  2462. ((!drop.accept) ||
  2463. (Element.classNames(element).detect(
  2464. function(v) { return drop.accept.include(v) } ) )) &&
  2465. Position.within(drop.element, point[0], point[1]) );},
  2466. deactivate: function(drop) {
  2467. if(drop.hoverclass)
  2468. Element.removeClassName(drop.element, drop.hoverclass);this.last_active = null;},
  2469. activate: function(drop) {
  2470. if(drop.hoverclass)
  2471. Element.addClassName(drop.element, drop.hoverclass);this.last_active = drop;},
  2472. show: function(point, element) {
  2473. if(!this.drops.length) return;var drop, affected = [];this.drops.each( function(drop) {
  2474. if(Droppables.isAffected(point, element, drop))
  2475. affected.push(drop);});if(affected.length>0)
  2476. drop = Droppables.findDeepestChild(affected);if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);if (drop) {
  2477. Position.within(drop.element, point[0], point[1]);if(drop.onHover)
  2478. drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));if (drop != this.last_active) Droppables.activate(drop);}
  2479. },
  2480. fire: function(event, element) {
  2481. if(!this.last_active) return;Position.prepare();if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
  2482. if (this.last_active.onDrop) {
  2483. this.last_active.onDrop(element, this.last_active.element, event);return true;}
  2484. },
  2485. reset: function() {
  2486. if(this.last_active)
  2487. this.deactivate(this.last_active);}
  2488. }
  2489. var Draggables = {
  2490. drags: [],
  2491. observers: [],
  2492. register: function(draggable) {
  2493. if(this.drags.length == 0) {
  2494. this.eventMouseUp = this.endDrag.bindAsEventListener(this);this.eventMouseMove = this.updateDrag.bindAsEventListener(this);this.eventKeypress = this.keyPress.bindAsEventListener(this);Event.observe(document, "mouseup", this.eventMouseUp);Event.observe(document, "mousemove", this.eventMouseMove);Event.observe(document, "keypress", this.eventKeypress);}
  2495. this.drags.push(draggable);},
  2496. unregister: function(draggable) {
  2497. this.drags = this.drags.reject(function(d) { return d==draggable });if(this.drags.length == 0) {
  2498. Event.stopObserving(document, "mouseup", this.eventMouseUp);Event.stopObserving(document, "mousemove", this.eventMouseMove);Event.stopObserving(document, "keypress", this.eventKeypress);}
  2499. },
  2500. activate: function(draggable) {
  2501. if(draggable.options.delay) {
  2502. this._timeout = setTimeout(function() {
  2503. Draggables._timeout = null;window.focus();Draggables.activeDraggable = draggable;}.bind(this), draggable.options.delay);} else {
  2504. window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
  2505. this.activeDraggable = draggable;}
  2506. },
  2507. deactivate: function() {
  2508. this.activeDraggable = null;},
  2509. updateDrag: function(event) {
  2510. if(!this.activeDraggable) return;var pointer = [Event.pointerX(event), Event.pointerY(event)];if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;this._lastPointer = pointer;this.activeDraggable.updateDrag(event, pointer);},
  2511. endDrag: function(event) {
  2512. if(this._timeout) {
  2513. clearTimeout(this._timeout);this._timeout = null;}
  2514. if(!this.activeDraggable) return;this._lastPointer = null;this.activeDraggable.endDrag(event);this.activeDraggable = null;},
  2515. keyPress: function(event) {
  2516. if(this.activeDraggable)
  2517. this.activeDraggable.keyPress(event);},
  2518. addObserver: function(observer) {
  2519. this.observers.push(observer);this._cacheObserverCallbacks();},
  2520. removeObserver: function(element) { // element instead of observer fixes mem leaks
  2521. this.observers = this.observers.reject( function(o) { return o.element==element });this._cacheObserverCallbacks();},
  2522. notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
  2523. if(this[eventName+'Count'] > 0)
  2524. this.observers.each( function(o) {
  2525. if(o[eventName]) o[eventName](eventName, draggable, event);});if(draggable.options[eventName]) draggable.options[eventName](draggable, event);},
  2526. _cacheObserverCallbacks: function() {
  2527. ['onStart','onEnd','onDrag'].each( function(eventName) {
  2528. Draggables[eventName+'Count'] = Draggables.observers.select(
  2529. function(o) { return o[eventName]; }
  2530. ).length;});}
  2531. }
  2532. /*--------------------------------------------------------------------------*/
  2533. var Draggable = Class.create({
  2534. initialize: function(element) {
  2535. var defaults = {
  2536. handle: false,
  2537. reverteffect: function(element, top_offset, left_offset) {
  2538. var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
  2539. queue: {scope:'_draggable', position:'end'}
  2540. });},
  2541. endeffect: function(element) {
  2542. var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
  2543. queue: {scope:'_draggable', position:'end'},
  2544. afterFinish: function(){
  2545. Draggable._dragging[element] = false
  2546. }
  2547. });},
  2548. zindex: 1000,
  2549. revert: false,
  2550. quiet: false,
  2551. scroll: false,
  2552. scrollSensitivity: 20,
  2553. scrollSpeed: 15,
  2554. snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
  2555. delay: 0
  2556. };if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
  2557. Object.extend(defaults, {
  2558. starteffect: function(element) {
  2559. element._opacity = Element.getOpacity(element);Draggable._dragging[element] = true;new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});}
  2560. });var options = Object.extend(defaults, arguments[1] || { });this.element = $(element);if(options.handle && Object.isString(options.handle))
  2561. this.handle = this.element.down('.'+options.handle, 0);if(!this.handle) this.handle = $(options.handle);if(!this.handle) this.handle = this.element;if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
  2562. options.scroll = $(options.scroll);this._isScrollChild = Element.childOf(this.element, options.scroll);}
  2563. Element.makePositioned(this.element); // fix IE
  2564. this.options = options;this.dragging = false;this.eventMouseDown = this.initDrag.bindAsEventListener(this);Event.observe(this.handle, "mousedown", this.eventMouseDown);Draggables.register(this);},
  2565. destroy: function() {
  2566. Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);Draggables.unregister(this);},
  2567. currentDelta: function() {
  2568. return([
  2569. parseInt(Element.getStyle(this.element,'left') || '0'),
  2570. parseInt(Element.getStyle(this.element,'top') || '0')]);},
  2571. initDrag: function(event) {
  2572. if(!Object.isUndefined(Draggable._dragging[this.element]) &&
  2573. Draggable._dragging[this.element]) return;if(Event.isLeftClick(event)) {
  2574. var src = Event.element(event);if((tag_name = src.tagName.toUpperCase()) && (
  2575. tag_name=='INPUT' ||
  2576. tag_name=='SELECT' ||
  2577. tag_name=='OPTION' ||
  2578. tag_name=='BUTTON' ||
  2579. tag_name=='TEXTAREA')) return;var pointer = [Event.pointerX(event), Event.pointerY(event)];var pos = Position.cumulativeOffset(this.element);this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });Draggables.activate(this);Event.stop(event);}
  2580. },
  2581. startDrag: function(event) {
  2582. this.dragging = true;if(!this.delta)
  2583. this.delta = this.currentDelta();if(this.options.zindex) {
  2584. this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);this.element.style.zIndex = this.options.zindex;}
  2585. if(this.options.ghosting) {
  2586. this._clone = this.element.cloneNode(true);this.element._originallyAbsolute = (this.element.getStyle('position') == 'absolute');if (!this.element._originallyAbsolute)
  2587. Position.absolutize(this.element);this.element.parentNode.insertBefore(this._clone, this.element);}
  2588. if(this.options.scroll) {
  2589. if (this.options.scroll == window) {
  2590. var where = this._getWindowScroll(this.options.scroll);this.originalScrollLeft = where.left;this.originalScrollTop = where.top;} else {
  2591. this.originalScrollLeft = this.options.scroll.scrollLeft;this.originalScrollTop = this.options.scroll.scrollTop;}
  2592. }
  2593. Draggables.notify('onStart', this, event);if(this.options.starteffect) this.options.starteffect(this.element);},
  2594. updateDrag: function(event, pointer) {
  2595. if(!this.dragging) this.startDrag(event);if(!this.options.quiet){
  2596. Position.prepare();Droppables.show(pointer, this.element);}
  2597. Draggables.notify('onDrag', this, event);this.draw(pointer);if(this.options.change) this.options.change(this);if(this.options.scroll) {
  2598. this.stopScrolling();var p;if (this.options.scroll == window) {
  2599. with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
  2600. } else {
  2601. p = Position.page(this.options.scroll);p[0] += this.options.scroll.scrollLeft + Position.deltaX;p[1] += this.options.scroll.scrollTop + Position.deltaY;p.push(p[0]+this.options.scroll.offsetWidth);p.push(p[1]+this.options.scroll.offsetHeight);}
  2602. var speed = [0,0];if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);this.startScrolling(speed);}
  2603. if(Prototype.Browser.WebKit) window.scrollBy(0,0);Event.stop(event);},
  2604. finishDrag: function(event, success) {
  2605. this.dragging = false;if(this.options.quiet){
  2606. Position.prepare();var pointer = [Event.pointerX(event), Event.pointerY(event)];Droppables.show(pointer, this.element);}
  2607. if(this.options.ghosting) {
  2608. if (!this.element._originallyAbsolute)
  2609. Position.relativize(this.element);delete this.element._originallyAbsolute;Element.remove(this._clone);this._clone = null;}
  2610. var dropped = false;if(success) {
  2611. dropped = Droppables.fire(event, this.element);if (!dropped) dropped = false;}
  2612. if(dropped && this.options.onDropped) this.options.onDropped(this.element);Draggables.notify('onEnd', this, event);var revert = this.options.revert;if(revert && Object.isFunction(revert)) revert = revert(this.element);var d = this.currentDelta();if(revert && this.options.reverteffect) {
  2613. if (dropped == 0 || revert != 'failure')
  2614. this.options.reverteffect(this.element,
  2615. d[1]-this.delta[1], d[0]-this.delta[0]);} else {
  2616. this.delta = d;}
  2617. if(this.options.zindex)
  2618. this.element.style.zIndex = this.originalZ;if(this.options.endeffect)
  2619. this.options.endeffect(this.element);Draggables.deactivate(this);Droppables.reset();},
  2620. keyPress: function(event) {
  2621. if(event.keyCode!=Event.KEY_ESC) return;this.finishDrag(event, false);Event.stop(event);},
  2622. endDrag: function(event) {
  2623. if(!this.dragging) return;this.stopScrolling();this.finishDrag(event, true);Event.stop(event);},
  2624. draw: function(point) {
  2625. var pos = Position.cumulativeOffset(this.element);if(this.options.ghosting) {
  2626. var r = Position.realOffset(this.element);pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;}
  2627. var d = this.currentDelta();pos[0] -= d[0]; pos[1] -= d[1];if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
  2628. pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;}
  2629. var p = [0,1].map(function(i){
  2630. return (point[i]-pos[i]-this.offset[i])
  2631. }.bind(this));if(this.options.snap) {
  2632. if(Object.isFunction(this.options.snap)) {
  2633. p = this.options.snap(p[0],p[1],this);} else {
  2634. if(Object.isArray(this.options.snap)) {
  2635. p = p.map( function(v, i) {
  2636. return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this))
  2637. } else {
  2638. p = p.map( function(v) {
  2639. return (v/this.options.snap).round()*this.options.snap }.bind(this))
  2640. }
  2641. }}
  2642. var style = this.element.style;if((!this.options.constraint) || (this.options.constraint=='horizontal'))
  2643. style.left = p[0] + "px";if((!this.options.constraint) || (this.options.constraint=='vertical'))
  2644. style.top = p[1] + "px";if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
  2645. },
  2646. stopScrolling: function() {
  2647. if(this.scrollInterval) {
  2648. clearInterval(this.scrollInterval);this.scrollInterval = null;Draggables._lastScrollPointer = null;}
  2649. },
  2650. startScrolling: function(speed) {
  2651. if(!(speed[0] || speed[1])) return;this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];this.lastScrolled = new Date();this.scrollInterval = setInterval(this.scroll.bind(this), 10);},
  2652. scroll: function() {
  2653. var current = new Date();var delta = current - this.lastScrolled;this.lastScrolled = current;if(this.options.scroll == window) {
  2654. with (this._getWindowScroll(this.options.scroll)) {
  2655. if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
  2656. var d = delta / 1000;this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );}
  2657. }
  2658. } else {
  2659. this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;}
  2660. Position.prepare();Droppables.show(Draggables._lastPointer, this.element);Draggables.notify('onDrag', this);if (this._isScrollChild) {
  2661. Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;if (Draggables._lastScrollPointer[0] < 0)
  2662. Draggables._lastScrollPointer[0] = 0;if (Draggables._lastScrollPointer[1] < 0)
  2663. Draggables._lastScrollPointer[1] = 0;this.draw(Draggables._lastScrollPointer);}
  2664. if(this.options.change) this.options.change(this);},
  2665. _getWindowScroll: function(w) {
  2666. var T, L, W, H;with (w.document) {
  2667. if (w.document.documentElement && documentElement.scrollTop) {
  2668. T = documentElement.scrollTop;L = documentElement.scrollLeft;} else if (w.document.body) {
  2669. T = body.scrollTop;L = body.scrollLeft;}
  2670. if (w.innerWidth) {
  2671. W = w.innerWidth;H = w.innerHeight;} else if (w.document.documentElement && documentElement.clientWidth) {
  2672. W = documentElement.clientWidth;H = documentElement.clientHeight;} else {
  2673. W = body.offsetWidth;H = body.offsetHeight
  2674. }
  2675. }
  2676. return { top: T, left: L, width: W, height: H };}
  2677. });Draggable._dragging = { };/*--------------------------------------------------------------------------*/
  2678. var SortableObserver = Class.create({
  2679. initialize: function(element, observer) {
  2680. this.element = $(element);this.observer = observer;this.lastValue = Sortable.serialize(this.element);},
  2681. onStart: function() {
  2682. this.lastValue = Sortable.serialize(this.element);},
  2683. onEnd: function() {
  2684. Sortable.unmark();if(this.lastValue != Sortable.serialize(this.element))
  2685. this.observer(this.element)
  2686. }
  2687. });var Sortable = {
  2688. SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
  2689. sortables: { },
  2690. _findRootElement: function(element) {
  2691. while (element.tagName.toUpperCase() != "BODY") {
  2692. if(element.id && Sortable.sortables[element.id]) return element;element = element.parentNode;}
  2693. },
  2694. options: function(element) {
  2695. element = Sortable._findRootElement($(element));if(!element) return;return Sortable.sortables[element.id];},
  2696. destroy: function(element){
  2697. var s = Sortable.options(element);if(s) {
  2698. Draggables.removeObserver(s.element);s.droppables.each(function(d){ Droppables.remove(d) });s.draggables.invoke('destroy');delete Sortable.sortables[s.element.id];}
  2699. },
  2700. create: function(element) {
  2701. element = $(element);var options = Object.extend({
  2702. element: element,
  2703. tag: 'li', // assumes li children, override with tag: 'tagname'
  2704. dropOnEmpty: false,
  2705. tree: false,
  2706. treeTag: 'ul',
  2707. overlap: 'vertical', // one of 'vertical', 'horizontal'
  2708. constraint: 'vertical', // one of 'vertical', 'horizontal', false
  2709. containment: element, // also takes array of elements (or id's); or false
  2710. handle: false, // or a CSS class
  2711. only: false,
  2712. delay: 0,
  2713. hoverclass: null,
  2714. ghosting: false,
  2715. quiet: false,
  2716. scroll: false,
  2717. scrollSensitivity: 20,
  2718. scrollSpeed: 15,
  2719. format: this.SERIALIZE_RULE,
  2720. elements: false,
  2721. handles: false,
  2722. onChange: Prototype.emptyFunction,
  2723. onUpdate: Prototype.emptyFunction
  2724. }, arguments[1] || { });this.destroy(element);var options_for_draggable = {
  2725. revert: true,
  2726. quiet: options.quiet,
  2727. scroll: options.scroll,
  2728. scrollSpeed: options.scrollSpeed,
  2729. scrollSensitivity: options.scrollSensitivity,
  2730. delay: options.delay,
  2731. ghosting: options.ghosting,
  2732. constraint: options.constraint,
  2733. handle: options.handle };if(options.starteffect)
  2734. options_for_draggable.starteffect = options.starteffect;if(options.reverteffect)
  2735. options_for_draggable.reverteffect = options.reverteffect;else
  2736. if(options.ghosting) options_for_draggable.reverteffect = function(element) {
  2737. element.style.top = 0;element.style.left = 0;};if(options.endeffect)
  2738. options_for_draggable.endeffect = options.endeffect;if(options.zindex)
  2739. options_for_draggable.zindex = options.zindex;var options_for_droppable = {
  2740. overlap: options.overlap,
  2741. containment: options.containment,
  2742. tree: options.tree,
  2743. hoverclass: options.hoverclass,
  2744. onHover: Sortable.onHover
  2745. }
  2746. var options_for_tree = {
  2747. onHover: Sortable.onEmptyHover,
  2748. overlap: options.overlap,
  2749. containment: options.containment,
  2750. hoverclass: options.hoverclass
  2751. }
  2752. Element.cleanWhitespace(element);options.draggables = [];options.droppables = [];if(options.dropOnEmpty || options.tree) {
  2753. Droppables.add(element, options_for_tree);options.droppables.push(element);}
  2754. (options.elements || this.findElements(element, options) || []).each( function(e,i) {
  2755. var handle = options.handles ? $(options.handles[i]) :
  2756. (options.handle ? $(e).select('.' + options.handle)[0] : e);options.draggables.push(
  2757. new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));Droppables.add(e, options_for_droppable);if(options.tree) e.treeNode = element;options.droppables.push(e);});if(options.tree) {
  2758. (Sortable.findTreeElements(element, options) || []).each( function(e) {
  2759. Droppables.add(e, options_for_tree);e.treeNode = element;options.droppables.push(e);});}
  2760. this.sortables[element.id] = options;Draggables.addObserver(new SortableObserver(element, options.onUpdate));},
  2761. findElements: function(element, options) {
  2762. return Element.findChildren(
  2763. element, options.only, options.tree ? true : false, options.tag);},
  2764. findTreeElements: function(element, options) {
  2765. return Element.findChildren(
  2766. element, options.only, options.tree ? true : false, options.treeTag);},
  2767. onHover: function(element, dropon, overlap) {
  2768. if(Element.isParent(dropon, element)) return;if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
  2769. return;} else if(overlap>0.5) {
  2770. Sortable.mark(dropon, 'before');if(dropon.previousSibling != element) {
  2771. var oldParentNode = element.parentNode;element.style.visibility = "hidden"; // fix gecko rendering
  2772. dropon.parentNode.insertBefore(element, dropon);if(dropon.parentNode!=oldParentNode)
  2773. Sortable.options(oldParentNode).onChange(element);Sortable.options(dropon.parentNode).onChange(element);}
  2774. } else {
  2775. Sortable.mark(dropon, 'after');var nextElement = dropon.nextSibling || null;if(nextElement != element) {
  2776. var oldParentNode = element.parentNode;element.style.visibility = "hidden"; // fix gecko rendering
  2777. dropon.parentNode.insertBefore(element, nextElement);if(dropon.parentNode!=oldParentNode)
  2778. Sortable.options(oldParentNode).onChange(element);Sortable.options(dropon.parentNode).onChange(element);}
  2779. }
  2780. },
  2781. onEmptyHover: function(element, dropon, overlap) {
  2782. var oldParentNode = element.parentNode;var droponOptions = Sortable.options(dropon);if(!Element.isParent(dropon, element)) {
  2783. var index;var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});var child = null;if(children) {
  2784. var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);for (index = 0; index < children.length; index += 1) {
  2785. if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
  2786. offset -= Element.offsetSize (children[index], droponOptions.overlap);} else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
  2787. child = index + 1 < children.length ? children[index + 1] : null;break;} else {
  2788. child = children[index];break;}
  2789. }
  2790. }
  2791. dropon.insertBefore(element, child);Sortable.options(oldParentNode).onChange(element);droponOptions.onChange(element);}
  2792. },
  2793. unmark: function() {
  2794. if(Sortable._marker) Sortable._marker.hide();},
  2795. mark: function(dropon, position) {
  2796. var sortable = Sortable.options(dropon.parentNode);if(sortable && !sortable.ghosting) return;if(!Sortable._marker) {
  2797. Sortable._marker =
  2798. ($('dropmarker') || Element.extend(document.createElement('DIV'))).
  2799. hide().addClassName('dropmarker').setStyle({position:'absolute'});document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);}
  2800. var offsets = Position.cumulativeOffset(dropon);Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});if(position=='after')
  2801. if(sortable.overlap == 'horizontal')
  2802. Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});else
  2803. Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});Sortable._marker.show();},
  2804. _tree: function(element, options, parent) {
  2805. var children = Sortable.findElements(element, options) || [];for (var i = 0; i < children.length; ++i) {
  2806. var match = children[i].id.match(options.format);if (!match) continue;var child = {
  2807. id: encodeURIComponent(match ? match[1] : null),
  2808. element: element,
  2809. parent: parent,
  2810. children: [],
  2811. position: parent.children.length,
  2812. container: $(children[i]).down(options.treeTag)
  2813. }
  2814. /* Get the element containing the children and recurse over it */
  2815. if (child.container)
  2816. this._tree(child.container, options, child)
  2817. parent.children.push (child);}
  2818. return parent;},
  2819. tree: function(element) {
  2820. element = $(element);var sortableOptions = this.options(element);var options = Object.extend({
  2821. tag: sortableOptions.tag,
  2822. treeTag: sortableOptions.treeTag,
  2823. only: sortableOptions.only,
  2824. name: element.id,
  2825. format: sortableOptions.format
  2826. }, arguments[1] || { });var root = {
  2827. id: null,
  2828. parent: null,
  2829. children: [],
  2830. container: element,
  2831. position: 0
  2832. }
  2833. return Sortable._tree(element, options, root);},
  2834. /* Construct a [i] index for a particular node */
  2835. _constructIndex: function(node) {
  2836. var index = '';do {
  2837. if (node.id) index = '[' + node.position + ']' + index;} while ((node = node.parent) != null);return index;},
  2838. sequence: function(element) {
  2839. element = $(element);var options = Object.extend(this.options(element), arguments[1] || { });return $(this.findElements(element, options) || []).map( function(item) {
  2840. return item.id.match(options.format) ? item.id.match(options.format)[1] : '';});},
  2841. setSequence: function(element, new_sequence) {
  2842. element = $(element);var options = Object.extend(this.options(element), arguments[2] || { });var nodeMap = { };this.findElements(element, options).each( function(n) {
  2843. if (n.id.match(options.format))
  2844. nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];n.parentNode.removeChild(n);});new_sequence.each(function(ident) {
  2845. var n = nodeMap[ident];if (n) {
  2846. n[1].appendChild(n[0]);delete nodeMap[ident];}
  2847. });},
  2848. serialize: function(element) {
  2849. element = $(element);var options = Object.extend(Sortable.options(element), arguments[1] || { });var name = encodeURIComponent(
  2850. (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);if (options.tree) {
  2851. return Sortable.tree(element, arguments[1]).children.map( function (item) {
  2852. return [name + Sortable._constructIndex(item) + "[id]=" +
  2853. encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));}).flatten().join('&');} else {
  2854. return Sortable.sequence(element, arguments[1]).map( function(item) {
  2855. return name + "[]=" + encodeURIComponent(item);}).join('&');}
  2856. }
  2857. }
  2858. Element.isParent = function(child, element) {
  2859. if (!child.parentNode || child == element) return false;if (child.parentNode == element) return true;return Element.isParent(child.parentNode, element);}
  2860. Element.findChildren = function(element, only, recursive, tagName) {
  2861. if(!element.hasChildNodes()) return null;tagName = tagName.toUpperCase();if(only) only = [only].flatten();var elements = [];$A(element.childNodes).each( function(e) {
  2862. if(e.tagName && e.tagName.toUpperCase()==tagName &&
  2863. (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
  2864. elements.push(e);if(recursive) {
  2865. var grandchildren = Element.findChildren(e, only, recursive, tagName);if(grandchildren) elements.push(grandchildren);}
  2866. });return (elements.length>0 ? elements.flatten() : []);}
  2867. Element.offsetSize = function (element, type) {
  2868. return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];}
  2869. if(typeof Effect == 'undefined')
  2870. throw("controls.js requires including script.aculo.us' effects.js library");var Autocompleter = { }
  2871. Autocompleter.Base = Class.create({
  2872. baseInitialize: function(element, update, options) {
  2873. element = $(element)
  2874. this.element = element;this.update = $(update);this.hasFocus = false;this.changed = false;this.active = false;this.index = 0;this.entryCount = 0;this.oldElementValue = this.element.value;if(this.setOptions)
  2875. this.setOptions(options);else
  2876. this.options = options || { };this.options.paramName = this.options.paramName || this.element.name;this.options.tokens = this.options.tokens || [];this.options.frequency = this.options.frequency || 0.4;this.options.minChars = this.options.minChars || 1;this.options.onShow = this.options.onShow ||
  2877. function(element, update){
  2878. if(!update.style.position || update.style.position=='absolute') {
  2879. update.style.position = 'absolute';Position.clone(element, update, {
  2880. setHeight: false,
  2881. offsetTop: element.offsetHeight
  2882. });}
  2883. Effect.Appear(update,{duration:0.15});};this.options.onHide = this.options.onHide ||
  2884. function(element, update){ new Effect.Fade(update,{duration:0.15}) };if(typeof(this.options.tokens) == 'string')
  2885. this.options.tokens = new Array(this.options.tokens);if (!this.options.tokens.include('\n'))
  2886. this.options.tokens.push('\n');this.observer = null;this.element.setAttribute('autocomplete','off');Element.hide(this.update);Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));},
  2887. show: function() {
  2888. if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);if(!this.iefix &&
  2889. (Prototype.Browser.IE) &&
  2890. (Element.getStyle(this.update, 'position')=='absolute')) {
  2891. new Insertion.After(this.update,
  2892. '<iframe id="' + this.update.id + '_iefix" '+
  2893. 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
  2894. 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');this.iefix = $(this.update.id+'_iefix');}
  2895. if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);},
  2896. fixIEOverlapping: function() {
  2897. Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});this.iefix.style.zIndex = 1;this.update.style.zIndex = 2;Element.show(this.iefix);},
  2898. hide: function() {
  2899. this.stopIndicator();if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);if(this.iefix) Element.hide(this.iefix);},
  2900. startIndicator: function() {
  2901. if(this.options.indicator) Element.show(this.options.indicator);},
  2902. stopIndicator: function() {
  2903. if(this.options.indicator) Element.hide(this.options.indicator);},
  2904. onKeyPress: function(event) {
  2905. if(this.active)
  2906. switch(event.keyCode) {
  2907. case Event.KEY_TAB:
  2908. case Event.KEY_RETURN:
  2909. this.selectEntry();Event.stop(event);case Event.KEY_ESC:
  2910. this.hide();this.active = false;Event.stop(event);return;case Event.KEY_LEFT:
  2911. case Event.KEY_RIGHT:
  2912. return;case Event.KEY_UP:
  2913. this.markPrevious();this.render();Event.stop(event);return;case Event.KEY_DOWN:
  2914. this.markNext();this.render();Event.stop(event);return;}
  2915. else
  2916. if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
  2917. (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;this.changed = true;this.hasFocus = true;if(this.observer) clearTimeout(this.observer);this.observer =
  2918. setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);},
  2919. activate: function() {
  2920. this.changed = false;this.hasFocus = true;this.getUpdatedChoices();},
  2921. onHover: function(event) {
  2922. var element = Event.findElement(event, 'LI');if(this.index != element.autocompleteIndex)
  2923. {
  2924. this.index = element.autocompleteIndex;this.render();}
  2925. Event.stop(event);},
  2926. onClick: function(event) {
  2927. var element = Event.findElement(event, 'LI');this.index = element.autocompleteIndex;this.selectEntry();this.hide();},
  2928. onBlur: function(event) {
  2929. setTimeout(this.hide.bind(this), 250);this.hasFocus = false;this.active = false;},
  2930. render: function() {
  2931. if(this.entryCount > 0) {
  2932. for (var i = 0; i < this.entryCount; i++)
  2933. this.index==i ?
  2934. Element.addClassName(this.getEntry(i),"selected") :
  2935. Element.removeClassName(this.getEntry(i),"selected");if(this.hasFocus) {
  2936. this.show();this.active = true;}
  2937. } else {
  2938. this.active = false;this.hide();}
  2939. },
  2940. markPrevious: function() {
  2941. if(this.index > 0) this.index--
  2942. else this.index = this.entryCount-1;this.getEntry(this.index).scrollIntoView(true);},
  2943. markNext: function() {
  2944. if(this.index < this.entryCount-1) this.index++
  2945. else this.index = 0;this.getEntry(this.index).scrollIntoView(false);},
  2946. getEntry: function(index) {
  2947. return this.update.firstChild.childNodes[index];},
  2948. getCurrentEntry: function() {
  2949. return this.getEntry(this.index);},
  2950. selectEntry: function() {
  2951. this.active = false;this.updateElement(this.getCurrentEntry());},
  2952. updateElement: function(selectedElement) {
  2953. if (this.options.updateElement) {
  2954. this.options.updateElement(selectedElement);return;}
  2955. var value = '';if (this.options.select) {
  2956. var nodes = $(selectedElement).select('.' + this.options.select) || [];if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);} else
  2957. value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');var bounds = this.getTokenBounds();if (bounds[0] != -1) {
  2958. var newValue = this.element.value.substr(0, bounds[0]);var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);if (whitespace)
  2959. newValue += whitespace[0];this.element.value = newValue + value + this.element.value.substr(bounds[1]);} else {
  2960. this.element.value = value;}
  2961. this.oldElementValue = this.element.value;this.element.focus();if (this.options.afterUpdateElement)
  2962. this.options.afterUpdateElement(this.element, selectedElement);},
  2963. updateChoices: function(choices) {
  2964. if(!this.changed && this.hasFocus) {
  2965. this.update.innerHTML = choices;Element.cleanWhitespace(this.update);Element.cleanWhitespace(this.update.down());if(this.update.firstChild && this.update.down().childNodes) {
  2966. this.entryCount =
  2967. this.update.down().childNodes.length;for (var i = 0; i < this.entryCount; i++) {
  2968. var entry = this.getEntry(i);entry.autocompleteIndex = i;this.addObservers(entry);}
  2969. } else {
  2970. this.entryCount = 0;}
  2971. this.stopIndicator();this.index = 0;if(this.entryCount==1 && this.options.autoSelect) {
  2972. this.selectEntry();this.hide();} else {
  2973. this.render();}
  2974. }
  2975. },
  2976. addObservers: function(element) {
  2977. Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));Event.observe(element, "click", this.onClick.bindAsEventListener(this));},
  2978. onObserverEvent: function() {
  2979. this.changed = false;this.tokenBounds = null;if(this.getToken().length>=this.options.minChars) {
  2980. this.getUpdatedChoices();} else {
  2981. this.active = false;this.hide();}
  2982. this.oldElementValue = this.element.value;},
  2983. getToken: function() {
  2984. var bounds = this.getTokenBounds();return this.element.value.substring(bounds[0], bounds[1]).strip();},
  2985. getTokenBounds: function() {
  2986. if (null != this.tokenBounds) return this.tokenBounds;var value = this.element.value;if (value.strip().empty()) return [-1, 0];var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);var offset = (diff == this.oldElementValue.length ? 1 : 0);var prevTokenPos = -1, nextTokenPos = value.length;var tp;for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
  2987. tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);if (tp > prevTokenPos) prevTokenPos = tp;tp = value.indexOf(this.options.tokens[index], diff + offset);if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;}
  2988. return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);}
  2989. });Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
  2990. var boundary = Math.min(newS.length, oldS.length);for (var index = 0; index < boundary; ++index)
  2991. if (newS[index] != oldS[index])
  2992. return index;return boundary;};Ajax.Autocompleter = Class.create(Autocompleter.Base, {
  2993. initialize: function(element, update, url, options) {
  2994. this.baseInitialize(element, update, options);this.options.asynchronous = true;this.options.onComplete = this.onComplete.bind(this);this.options.defaultParams = this.options.parameters || null;this.url = url;},
  2995. getUpdatedChoices: function() {
  2996. this.startIndicator();var entry = encodeURIComponent(this.options.paramName) + '=' +
  2997. encodeURIComponent(this.getToken());this.options.parameters = this.options.callback ?
  2998. this.options.callback(this.element, entry) : entry;if(this.options.defaultParams)
  2999. this.options.parameters += '&' + this.options.defaultParams;new Ajax.Request(this.url, this.options);},
  3000. onComplete: function(request) {
  3001. this.updateChoices(request.responseText);}
  3002. });Autocompleter.Local = Class.create(Autocompleter.Base, {
  3003. initialize: function(element, update, array, options) {
  3004. this.baseInitialize(element, update, options);this.options.array = array;},
  3005. getUpdatedChoices: function() {
  3006. this.updateChoices(this.options.selector(this));},
  3007. setOptions: function(options) {
  3008. this.options = Object.extend({
  3009. choices: 10,
  3010. partialSearch: true,
  3011. partialChars: 2,
  3012. ignoreCase: true,
  3013. fullSearch: false,
  3014. selector: function(instance) {
  3015. var ret = []; // Beginning matches
  3016. var partial = []; // Inside matches
  3017. var entry = instance.getToken();var count = 0;for (var i = 0; i < instance.options.array.length &&
  3018. ret.length < instance.options.choices ; i++) {
  3019. var elem = instance.options.array[i];var foundPos = instance.options.ignoreCase ?
  3020. elem.toLowerCase().indexOf(entry.toLowerCase()) :
  3021. elem.indexOf(entry);while (foundPos != -1) {
  3022. if (foundPos == 0 && elem.length != entry.length) {
  3023. ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
  3024. elem.substr(entry.length) + "</li>");break;} else if (entry.length >= instance.options.partialChars &&
  3025. instance.options.partialSearch && foundPos != -1) {
  3026. if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
  3027. partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
  3028. elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
  3029. foundPos + entry.length) + "</li>");break;}
  3030. }
  3031. foundPos = instance.options.ignoreCase ?
  3032. elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
  3033. elem.indexOf(entry, foundPos + 1);}
  3034. }
  3035. if (partial.length)
  3036. ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
  3037. return "<ul>" + ret.join('') + "</ul>";}
  3038. }, options || { });}
  3039. });Field.scrollFreeActivate = function(field) {
  3040. setTimeout(function() {
  3041. Field.activate(field);}, 1);}
  3042. Ajax.InPlaceEditor = Class.create({
  3043. initialize: function(element, url, options) {
  3044. this.url = url;this.element = element = $(element);this.prepareOptions();this._controls = { };arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
  3045. Object.extend(this.options, options || { });if (!this.options.formId && this.element.id) {
  3046. this.options.formId = this.element.id + '-inplaceeditor';if ($(this.options.formId))
  3047. this.options.formId = '';}
  3048. if (this.options.externalControl)
  3049. this.options.externalControl = $(this.options.externalControl);if (!this.options.externalControl)
  3050. this.options.externalControlOnly = false;this._originalBackground = this.element.getStyle('background-color') || 'transparent';this.element.title = this.options.clickToEditText;this._boundCancelHandler = this.handleFormCancellation.bind(this);this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);this._boundFailureHandler = this.handleAJAXFailure.bind(this);this._boundSubmitHandler = this.handleFormSubmission.bind(this);this._boundWrapperHandler = this.wrapUp.bind(this);this.registerListeners();},
  3051. checkForEscapeOrReturn: function(e) {
  3052. if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;if (Event.KEY_ESC == e.keyCode)
  3053. this.handleFormCancellation(e);else if (Event.KEY_RETURN == e.keyCode)
  3054. this.handleFormSubmission(e);},
  3055. createControl: function(mode, handler, extraClasses) {
  3056. var control = this.options[mode + 'Control'];var text = this.options[mode + 'Text'];if ('button' == control) {
  3057. var btn = document.createElement('input');btn.type = 'submit';btn.value = text;btn.className = 'editor_' + mode + '_button';if ('cancel' == mode)
  3058. btn.onclick = this._boundCancelHandler;this._form.appendChild(btn);this._controls[mode] = btn;} else if ('link' == control) {
  3059. var link = document.createElement('a');link.href = '#';link.appendChild(document.createTextNode(text));link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;link.className = 'editor_' + mode + '_link';if (extraClasses)
  3060. link.className += ' ' + extraClasses;this._form.appendChild(link);this._controls[mode] = link;}
  3061. },
  3062. createEditField: function() {
  3063. var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());var fld;if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
  3064. fld = document.createElement('input');fld.type = 'text';var size = this.options.size || this.options.cols || 0;if (0 < size) fld.size = size;} else {
  3065. fld = document.createElement('textarea');fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);fld.cols = this.options.cols || 40;}
  3066. fld.name = this.options.paramName;fld.value = text; // No HTML breaks conversion anymore
  3067. fld.className = 'editor_field';if (this.options.submitOnBlur)
  3068. fld.onblur = this._boundSubmitHandler;this._controls.editor = fld;if (this.options.loadTextURL)
  3069. this.loadExternalText();this._form.appendChild(this._controls.editor);},
  3070. createForm: function() {
  3071. var ipe = this;function addText(mode, condition) {
  3072. var text = ipe.options['text' + mode + 'Controls'];if (!text || condition === false) return;ipe._form.appendChild(document.createTextNode(text));};this._form = $(document.createElement('form'));this._form.id = this.options.formId;this._form.addClassName(this.options.formClassName);this._form.onsubmit = this._boundSubmitHandler;this.createEditField();if ('textarea' == this._controls.editor.tagName.toLowerCase())
  3073. this._form.appendChild(document.createElement('br'));if (this.options.onFormCustomization)
  3074. this.options.onFormCustomization(this, this._form);addText('Before', this.options.okControl || this.options.cancelControl);this.createControl('ok', this._boundSubmitHandler);addText('Between', this.options.okControl && this.options.cancelControl);this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');addText('After', this.options.okControl || this.options.cancelControl);},
  3075. destroy: function() {
  3076. if (this._oldInnerHTML)
  3077. this.element.innerHTML = this._oldInnerHTML;this.leaveEditMode();this.unregisterListeners();},
  3078. enterEditMode: function(e) {
  3079. if (this._saving || this._editing) return;this._editing = true;this.triggerCallback('onEnterEditMode');if (this.options.externalControl)
  3080. this.options.externalControl.hide();this.element.hide();this.createForm();this.element.parentNode.insertBefore(this._form, this.element);if (!this.options.loadTextURL)
  3081. this.postProcessEditField();if (e) Event.stop(e);},
  3082. enterHover: function(e) {
  3083. if (this.options.hoverClassName)
  3084. this.element.addClassName(this.options.hoverClassName);if (this._saving) return;this.triggerCallback('onEnterHover');},
  3085. getText: function() {
  3086. return this.element.innerHTML;},
  3087. handleAJAXFailure: function(transport) {
  3088. this.triggerCallback('onFailure', transport);if (this._oldInnerHTML) {
  3089. this.element.innerHTML = this._oldInnerHTML;this._oldInnerHTML = null;}
  3090. },
  3091. handleFormCancellation: function(e) {
  3092. this.wrapUp();if (e) Event.stop(e);},
  3093. handleFormSubmission: function(e) {
  3094. var form = this._form;var value = $F(this._controls.editor);this.prepareSubmission();var params = this.options.callback(form, value) || '';if (Object.isString(params))
  3095. params = params.toQueryParams();params.editorId = this.element.id;if (this.options.htmlResponse) {
  3096. var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);Object.extend(options, {
  3097. parameters: params,
  3098. onComplete: this._boundWrapperHandler,
  3099. onFailure: this._boundFailureHandler
  3100. });new Ajax.Updater({ success: this.element }, this.url, options);} else {
  3101. var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);Object.extend(options, {
  3102. parameters: params,
  3103. onComplete: this._boundWrapperHandler,
  3104. onFailure: this._boundFailureHandler
  3105. });new Ajax.Request(this.url, options);}
  3106. if (e) Event.stop(e);},
  3107. leaveEditMode: function() {
  3108. this.element.removeClassName(this.options.savingClassName);this.removeForm();this.leaveHover();this.element.style.backgroundColor = this._originalBackground;this.element.show();if (this.options.externalControl)
  3109. this.options.externalControl.show();this._saving = false;this._editing = false;this._oldInnerHTML = null;this.triggerCallback('onLeaveEditMode');},
  3110. leaveHover: function(e) {
  3111. if (this.options.hoverClassName)
  3112. this.element.removeClassName(this.options.hoverClassName);if (this._saving) return;this.triggerCallback('onLeaveHover');},
  3113. loadExternalText: function() {
  3114. this._form.addClassName(this.options.loadingClassName);this._controls.editor.disabled = true;var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);Object.extend(options, {
  3115. parameters: 'editorId=' + encodeURIComponent(this.element.id),
  3116. onComplete: Prototype.emptyFunction,
  3117. onSuccess: function(transport) {
  3118. this._form.removeClassName(this.options.loadingClassName);var text = transport.responseText;if (this.options.stripLoadedTextTags)
  3119. text = text.stripTags();this._controls.editor.value = text;this._controls.editor.disabled = false;this.postProcessEditField();}.bind(this),
  3120. onFailure: this._boundFailureHandler
  3121. });new Ajax.Request(this.options.loadTextURL, options);},
  3122. postProcessEditField: function() {
  3123. var fpc = this.options.fieldPostCreation;if (fpc)
  3124. $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();},
  3125. prepareOptions: function() {
  3126. this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);[this._extraDefaultOptions].flatten().compact().each(function(defs) {
  3127. Object.extend(this.options, defs);}.bind(this));},
  3128. prepareSubmission: function() {
  3129. this._saving = true;this.removeForm();this.leaveHover();this.showSaving();},
  3130. registerListeners: function() {
  3131. this._listeners = { };var listener;$H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
  3132. listener = this[pair.value].bind(this);this._listeners[pair.key] = listener;if (!this.options.externalControlOnly)
  3133. this.element.observe(pair.key, listener);if (this.options.externalControl)
  3134. this.options.externalControl.observe(pair.key, listener);}.bind(this));},
  3135. removeForm: function() {
  3136. if (!this._form) return;this._form.remove();this._form = null;this._controls = { };},
  3137. showSaving: function() {
  3138. this._oldInnerHTML = this.element.innerHTML;this.element.innerHTML = this.options.savingText;this.element.addClassName(this.options.savingClassName);this.element.style.backgroundColor = this._originalBackground;this.element.show();},
  3139. triggerCallback: function(cbName, arg) {
  3140. if ('function' == typeof this.options[cbName]) {
  3141. this.options[cbName](this, arg);}
  3142. },
  3143. unregisterListeners: function() {
  3144. $H(this._listeners).each(function(pair) {
  3145. if (!this.options.externalControlOnly)
  3146. this.element.stopObserving(pair.key, pair.value);if (this.options.externalControl)
  3147. this.options.externalControl.stopObserving(pair.key, pair.value);}.bind(this));},
  3148. wrapUp: function(transport) {
  3149. this.leaveEditMode();this._boundComplete(transport, this.element);}
  3150. });Object.extend(Ajax.InPlaceEditor.prototype, {
  3151. dispose: Ajax.InPlaceEditor.prototype.destroy
  3152. });Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
  3153. initialize: function($super, element, url, options) {
  3154. this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;$super(element, url, options);},
  3155. createEditField: function() {
  3156. var list = document.createElement('select');list.name = this.options.paramName;list.size = 1;this._controls.editor = list;this._collection = this.options.collection || [];if (this.options.loadCollectionURL)
  3157. this.loadCollection();else
  3158. this.checkForExternalText();if (this.options.submitOnChange)
  3159. list.onchange = this._boundSubmitHandler;this._form.appendChild(this._controls.editor);},
  3160. loadCollection: function() {
  3161. this._form.addClassName(this.options.loadingClassName);this.showLoadingText(this.options.loadingCollectionText);var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);Object.extend(options, {
  3162. parameters: 'editorId=' + encodeURIComponent(this.element.id),
  3163. onComplete: Prototype.emptyFunction,
  3164. onSuccess: function(transport) {
  3165. var js = transport.responseText.strip();if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
  3166. throw 'Server returned an invalid collection representation.';this._collection = eval(js);this.checkForExternalText();}.bind(this),
  3167. onFailure: this.onFailure
  3168. });new Ajax.Request(this.options.loadCollectionURL, options);},
  3169. showLoadingText: function(text) {
  3170. this._controls.editor.disabled = true;var tempOption = this._controls.editor.firstChild;if (!tempOption) {
  3171. tempOption = document.createElement('option');tempOption.value = '';this._controls.editor.appendChild(tempOption);tempOption.selected = true;}
  3172. tempOption.update((text || '').stripScripts().stripTags());},
  3173. checkForExternalText: function() {
  3174. this._text = this.getText();if (this.options.loadTextURL)
  3175. this.loadExternalText();else
  3176. this.buildOptionList();},
  3177. loadExternalText: function() {
  3178. this.showLoadingText(this.options.loadingText);var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);Object.extend(options, {
  3179. parameters: 'editorId=' + encodeURIComponent(this.element.id),
  3180. onComplete: Prototype.emptyFunction,
  3181. onSuccess: function(transport) {
  3182. this._text = transport.responseText.strip();this.buildOptionList();}.bind(this),
  3183. onFailure: this.onFailure
  3184. });new Ajax.Request(this.options.loadTextURL, options);},
  3185. buildOptionList: function() {
  3186. this._form.removeClassName(this.options.loadingClassName);this._collection = this._collection.map(function(entry) {
  3187. return 2 === entry.length ? entry : [entry, entry].flatten();});var marker = ('value' in this.options) ? this.options.value : this._text;var textFound = this._collection.any(function(entry) {
  3188. return entry[0] == marker;}.bind(this));this._controls.editor.update('');var option;this._collection.each(function(entry, index) {
  3189. option = document.createElement('option');option.value = entry[0];option.selected = textFound ? entry[0] == marker : 0 == index;option.appendChild(document.createTextNode(entry[1]));this._controls.editor.appendChild(option);}.bind(this));this._controls.editor.disabled = false;Field.scrollFreeActivate(this._controls.editor);}
  3190. });Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
  3191. if (!options) return;function fallback(name, expr) {
  3192. if (name in options || expr === undefined) return;options[name] = expr;};fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
  3193. options.cancelLink == options.cancelButton == false ? false : undefined)));fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
  3194. options.okLink == options.okButton == false ? false : undefined)));fallback('highlightColor', options.highlightcolor);fallback('highlightEndColor', options.highlightendcolor);};Object.extend(Ajax.InPlaceEditor, {
  3195. DefaultOptions: {
  3196. ajaxOptions: { },
  3197. autoRows: 3, // Use when multi-line w/ rows == 1
  3198. cancelControl: 'link', // 'link'|'button'|false
  3199. cancelText: 'cancel',
  3200. clickToEditText: 'Click to edit',
  3201. externalControl: null, // id|elt
  3202. externalControlOnly: false,
  3203. fieldPostCreation: 'activate', // 'activate'|'focus'|false
  3204. formClassName: 'inplaceeditor-form',
  3205. formId: null, // id|elt
  3206. highlightColor: '#ffff99',
  3207. highlightEndColor: '#ffffff',
  3208. hoverClassName: '',
  3209. htmlResponse: true,
  3210. loadingClassName: 'inplaceeditor-loading',
  3211. loadingText: 'Loading...',
  3212. okControl: 'button', // 'link'|'button'|false
  3213. okText: 'ok',
  3214. paramName: 'value',
  3215. rows: 1, // If 1 and multi-line, uses autoRows
  3216. savingClassName: 'inplaceeditor-saving',
  3217. savingText: 'Saving...',
  3218. size: 0,
  3219. stripLoadedTextTags: false,
  3220. submitOnBlur: false,
  3221. submitOnChange: false,
  3222. textAfterControls: '',
  3223. textBeforeControls: '',
  3224. textBetweenControls: ''
  3225. },
  3226. DefaultCallbacks: {
  3227. callback: function(form) {
  3228. return Form.serialize(form);},
  3229. onComplete: function(transport, element) {
  3230. new Effect.Highlight(element, {
  3231. startcolor: this.options.highlightColor, keepBackgroundImage: true });},
  3232. onEnterEditMode: null,
  3233. onEnterHover: function(ipe) {
  3234. ipe.element.style.backgroundColor = ipe.options.highlightColor;if (ipe._effect)
  3235. ipe._effect.cancel();},
  3236. onFailure: function(transport, ipe) {
  3237. alert('Error communication with the server: ' + transport.responseText.stripTags());},
  3238. onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
  3239. onLeaveEditMode: null,
  3240. onLeaveHover: function(ipe) {
  3241. ipe._effect = new Effect.Highlight(ipe.element, {
  3242. startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
  3243. restorecolor: ipe._originalBackground, keepBackgroundImage: true
  3244. });}
  3245. },
  3246. Listeners: {
  3247. click: 'enterEditMode',
  3248. keydown: 'checkForEscapeOrReturn',
  3249. mouseover: 'enterHover',
  3250. mouseout: 'leaveHover'
  3251. }
  3252. });Ajax.InPlaceCollectionEditor.DefaultOptions = {
  3253. loadingCollectionText: 'Loading options...'
  3254. };Form.Element.DelayedObserver = Class.create({
  3255. initialize: function(element, delay, callback) {
  3256. this.delay = delay || 0.5;this.element = $(element);this.callback = callback;this.timer = null;this.lastValue = $F(this.element);Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));},
  3257. delayedListener: function(event) {
  3258. if(this.lastValue == $F(this.element)) return;if(this.timer) clearTimeout(this.timer);this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);this.lastValue = $F(this.element);},
  3259. onTimerEvent: function() {
  3260. this.timer = null;this.callback(this.element, $F(this.element));}
  3261. });var agt=navigator.userAgent.toLowerCase();var appVer = navigator.appVersion.toLowerCase();var is_minor = parseFloat(appVer);var is_major = parseInt(is_minor);var is_opera = (agt.indexOf("opera") != -1);var is_opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);var is_opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);var is_opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);var is_opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);var is_opera6 = (agt.indexOf("opera 6") != -1 || agt.indexOf("opera/6") != -1); // 020128- abk
  3262. var is_opera7 = (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1); // 021205- dmr
  3263. var is_opera8 = (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1); // 09-19-2006 jonw
  3264. var is_opera9 = (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1); // 09-19-2006 jonw
  3265. var is_opera5up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4);var is_opera6up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5); // new020128
  3266. var is_opera7up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5 && !is_opera6); // new021205 -- dmr
  3267. var is_opera8up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5 && !is_opera6 && !is_opera7); // 09-19-2006 - jonw
  3268. var is_opera9up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5 && !is_opera6 && !is_opera7 &&!is_opera8); // 09-19-2006 - jonw
  3269. var is_mac = (agt.indexOf("mac")!=-1);var iePos = appVer.indexOf('msie');if (iePos !=-1) {
  3270. if(is_mac) {
  3271. var iePos = agt.indexOf('msie');is_minor = parseFloat(agt.substring(iePos+5,agt.indexOf(';',iePos)));}
  3272. else is_minor = parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)));is_major = parseInt(is_minor);}
  3273. var is_konq = false;var kqPos = agt.indexOf('konqueror');if (kqPos !=-1) {
  3274. is_konq = true;is_minor = parseFloat(agt.substring(kqPos+10,agt.indexOf(';',kqPos)));is_major = parseInt(is_minor);}
  3275. var is_getElementById = (document.getElementById) ? "true" : "false"; // 001121-abk
  3276. var is_getElementsByTagName = (document.getElementsByTagName) ? "true" : "false"; // 001127-abk
  3277. var is_documentElement = (document.documentElement) ? "true" : "false"; // 001121-abk
  3278. var is_safari = ((agt.indexOf('safari')!=-1)&&(agt.indexOf('mac')!=-1))?true:false;var is_khtml = (is_safari || is_konq);var is_gecko = ((!is_khtml)&&(navigator.product)&&(navigator.product.toLowerCase()=="gecko"))?true:false;var is_gver = 0;if (is_gecko) is_gver=navigator.productSub;var is_fb = ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
  3279. (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1) &&
  3280. (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1) &&
  3281. (is_gecko) && (navigator.vendor=="Firebird"));var is_fx = ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
  3282. (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1) &&
  3283. (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1) &&
  3284. (is_gecko) && ((navigator.vendor=="Firefox")||(agt.indexOf('firefox')!=-1)));var is_moz = ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
  3285. (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1) &&
  3286. (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1) &&
  3287. (is_gecko) && (!is_fb) && (!is_fx) &&
  3288. ((navigator.vendor=="")||(navigator.vendor=="Mozilla")||(navigator.vendor=="Debian")));if ((is_moz)||(is_fb)||(is_fx)) { // 032504 - dmr
  3289. var is_moz_ver = (navigator.vendorSub)?navigator.vendorSub:0;if(is_fx&&!is_moz_ver) {
  3290. is_moz_ver = agt.indexOf('firefox/');is_moz_ver = agt.substring(is_moz_ver+8);is_moz_ver = parseFloat(is_moz_ver);}
  3291. if(!(is_moz_ver)) {
  3292. is_moz_ver = agt.indexOf('rv:');is_moz_ver = agt.substring(is_moz_ver+3);is_paren = is_moz_ver.indexOf(')');is_moz_ver = is_moz_ver.substring(0,is_paren);}
  3293. is_minor = is_moz_ver;is_major = parseInt(is_moz_ver);}
  3294. var is_fb_ver = is_moz_ver;var is_fx_ver = is_moz_ver;var is_nav = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
  3295. && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
  3296. && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)
  3297. && (!is_khtml) && (!(is_moz)) && (!is_fb) && (!is_fx));if ((navigator.vendor)&&
  3298. ((navigator.vendor=="Netscape6")||(navigator.vendor=="Netscape"))&&
  3299. (is_nav)) {
  3300. is_major = parseInt(navigator.vendorSub);is_minor = parseFloat(navigator.vendorSub);}
  3301. var is_nav2 = (is_nav && (is_major == 2));var is_nav3 = (is_nav && (is_major == 3));var is_nav4 = (is_nav && (is_major == 4));var is_nav4up = (is_nav && is_minor >= 4); // changed to is_minor for
  3302. var is_navonly = (is_nav && ((agt.indexOf(";nav") != -1) ||
  3303. (agt.indexOf("; nav") != -1)) );var is_nav6 = (is_nav && is_major==6); // new 010118 mhp
  3304. var is_nav6up = (is_nav && is_minor >= 6); // new 010118 mhp
  3305. var is_nav5 = (is_nav && is_major == 5 && !is_nav6); // checked for ns6
  3306. var is_nav5up = (is_nav && is_minor >= 5);var is_nav7 = (is_nav && is_major == 7);var is_nav7up = (is_nav && is_minor >= 7);var is_nav8 = (is_nav && is_major == 8);var is_nav8up = (is_nav && is_minor >= 8);var is_ie = ((iePos!=-1) && (!is_opera) && (!is_khtml));var is_ie3 = (is_ie && (is_major < 4));var is_ie4 = (is_ie && is_major == 4);var is_ie4up = (is_ie && is_minor >= 4);var is_ie5 = (is_ie && is_major == 5);var is_ie5up = (is_ie && is_minor >= 5);var is_ie5_5 = (is_ie && (agt.indexOf("msie 5.5") !=-1)); // 020128 new - abk
  3307. var is_ie5_5up =(is_ie && is_minor >= 5.5); // 020128 new - abk
  3308. var is_ie6 = (is_ie && is_major == 6);var is_ie6up = (is_ie && is_minor >= 6);var is_ie7 = (is_ie && is_major == 7);var is_ie7up = (is_ie && is_minor >= 7);var is_aol = (agt.indexOf("aol") != -1);var is_aol3 = (is_aol && is_ie3);var is_aol4 = (is_aol && is_ie4);var is_aol5 = (agt.indexOf("aol 5") != -1);var is_aol6 = (agt.indexOf("aol 6") != -1);var is_aol7 = ((agt.indexOf("aol 7")!=-1) || (agt.indexOf("aol7")!=-1));var is_aol8 = ((agt.indexOf("aol 8")!=-1) || (agt.indexOf("aol8")!=-1));var is_webtv = (agt.indexOf("webtv") != -1);var is_TVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1));var is_AOLTV = is_TVNavigator;var is_hotjava = (agt.indexOf("hotjava") != -1);var is_hotjava3 = (is_hotjava && (is_major == 3));var is_hotjava3up = (is_hotjava && (is_major >= 3));var is_js;if (is_nav2 || is_ie3) is_js = 1.0;else if (is_nav3) is_js = 1.1;else if ((is_opera5)||(is_opera6)) is_js = 1.3; // 020214 - dmr
  3309. else if (is_opera7up) is_js = 1.5; // 031010 - dmr
  3310. else if (is_khtml) is_js = 1.5; // 030110 - dmr
  3311. else if (is_opera) is_js = 1.1;else if ((is_nav4 && (is_minor <= 4.05)) || is_ie4) is_js = 1.2;else if ((is_nav4 && (is_minor > 4.05)) || is_ie5) is_js = 1.3;else if (is_nav5 && !(is_nav6)) is_js = 1.4;else if (is_hotjava3up) is_js = 1.4; // new 020128 - abk
  3312. else if (is_nav6up) is_js = 1.5;else if (is_nav && (is_major > 5)) is_js = 1.4;else if (is_ie && (is_major > 5)) is_js = 1.3;else if (is_moz) is_js = 1.5;else if (is_fb||is_fx) is_js = 1.5; // 032504 - dmr
  3313. else is_js = 0.0;if ((agt.indexOf("mac")!=-1) && is_ie5up) is_js = 1.4; // 020128 - abk
  3314. if (is_nav6up) {
  3315. is_minor = navigator.vendorSub;}
  3316. var is_win = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );var is_win95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));var is_win16 = ((agt.indexOf("win16")!=-1) ||
  3317. (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1) ||
  3318. (agt.indexOf("windows 16-bit")!=-1) );var is_win31 = ((agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||
  3319. (agt.indexOf("windows 16-bit")!=-1));var is_winme = ((agt.indexOf("win 9x 4.90")!=-1)); // new 020128 - abk
  3320. var is_win2k = ((agt.indexOf("windows nt 5.0")!=-1) || (agt.indexOf("windows 2000")!=-1)); // 020214 - dmr
  3321. var is_winxp = ((agt.indexOf("windows nt 5.1")!=-1) || (agt.indexOf("windows xp")!=-1)); // 020214 - dmr
  3322. var is_win98 = ((agt.indexOf("win98")!=-1) || (agt.indexOf("windows 98")!=-1));var is_winnt = ((agt.indexOf("winnt")!=-1) || (agt.indexOf("windows nt")!=-1));var is_win32 = (is_win95 || is_winnt || is_win98 ||
  3323. ((is_major >= 4) && (navigator.platform == "Win32")) ||
  3324. (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1));var is_os2 = ((agt.indexOf("os/2")!=-1) ||
  3325. (navigator.appVersion.indexOf("OS/2")!=-1) ||
  3326. (agt.indexOf("ibm-webexplorer")!=-1));var is_mac = (agt.indexOf("mac")!=-1);if (is_mac) { is_win = !is_mac; } // dmr - 06/20/2002
  3327. var is_mac68k = (is_mac && ((agt.indexOf("68k")!=-1) ||
  3328. (agt.indexOf("68000")!=-1)));var is_macppc = (is_mac && ((agt.indexOf("ppc")!=-1) ||
  3329. (agt.indexOf("powerpc")!=-1)));var is_macosx = (is_mac && (agt.indexOf("os x")!=-1));var is_sun = (agt.indexOf("sunos")!=-1);var is_sun4 = (agt.indexOf("sunos 4")!=-1);var is_sun5 = (agt.indexOf("sunos 5")!=-1);var is_suni86= (is_sun && (agt.indexOf("i86")!=-1));var is_irix = (agt.indexOf("irix") !=-1); // SGI
  3330. var is_irix5 = (agt.indexOf("irix 5") !=-1);var is_irix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));var is_hpux = (agt.indexOf("hp-ux")!=-1);var is_hpux9 = (is_hpux && (agt.indexOf("09.")!=-1));var is_hpux10= (is_hpux && (agt.indexOf("10.")!=-1));var is_aix = (agt.indexOf("aix") !=-1); // IBM
  3331. var is_aix1 = (agt.indexOf("aix 1") !=-1);var is_aix2 = (agt.indexOf("aix 2") !=-1);var is_aix3 = (agt.indexOf("aix 3") !=-1);var is_aix4 = (agt.indexOf("aix 4") !=-1);var is_linux = (agt.indexOf("inux")!=-1);var is_sco = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);var is_unixware = (agt.indexOf("unix_system_v")!=-1);var is_mpras = (agt.indexOf("ncr")!=-1);var is_reliant = (agt.indexOf("reliantunix")!=-1);var is_dec = ((agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) ||
  3332. (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) ||
  3333. (agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1));var is_sinix = (agt.indexOf("sinix")!=-1);var is_freebsd = (agt.indexOf("freebsd")!=-1);var is_bsd = (agt.indexOf("bsd")!=-1);var is_unix = ((agt.indexOf("x11")!=-1) || is_sun || is_irix || is_hpux ||
  3334. is_sco ||is_unixware || is_mpras || is_reliant ||
  3335. is_dec || is_sinix || is_aix || is_linux || is_bsd || is_freebsd);var is_vms = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));var is_anchors = (document.anchors) ? "true":"false";var is_regexp = (window.RegExp) ? "true":"false";var is_option = (window.Option) ? "true":"false";var is_all = (document.all) ? "true":"false";document.cookie = "cookies=true";var is_cookie = (document.cookie) ? "true" : "false";var is_images = (document.images) ? "true":"false";var is_layers = (document.layers) ? "true":"false"; // gecko m7 bug?
  3336. var is_forms = (document.forms) ? "true" : "false";var is_links = (document.links) ? "true" : "false";var is_frames = (window.frames) ? "true" : "false";var is_screen = (window.screen) ? "true" : "false";var is_java = (navigator.javaEnabled());var is_Flash = false;var is_FlashVersion = 0;if ((is_nav||is_opera||is_moz||is_fb||is_fx||is_safari)||
  3337. (is_mac&&is_ie5up)) {
  3338. var plugin = (navigator.mimeTypes &&
  3339. navigator.mimeTypes["application/x-shockwave-flash"] &&
  3340. navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) ?
  3341. navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;if (plugin&&plugin.description) {
  3342. is_Flash = true;is_FlashVersion = parseInt(plugin.description.substring(plugin.description.indexOf(".")-1));}
  3343. }
  3344. if (is_win&&is_ie4up)
  3345. {
  3346. document.write(
  3347. '<scr' + 'ipt language=VBScript>' + '\n' +
  3348. 'Dim hasPlayer, playerversion' + '\n' +
  3349. 'hasPlayer = false' + '\n' +
  3350. 'playerversion = 10' + '\n' +
  3351. 'Do While playerversion > 0' + '\n' +
  3352. 'On Error Resume Next' + '\n' +
  3353. 'hasPlayer = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & playerversion)))' + '\n' +
  3354. 'If hasPlayer = true Then Exit Do' + '\n' +
  3355. 'playerversion = playerversion - 1' + '\n' +
  3356. 'Loop' + '\n' +
  3357. 'is_FlashVersion = playerversion' + '\n' +
  3358. 'is_Flash = hasPlayer' + '\n' +
  3359. '<\/sc' + 'ript>'
  3360. );}
  3361. var biRadixBase=2;var biRadixBits=16;var bitsPerDigit=biRadixBits;var biRadix=1<<16;var biHalfRadix=biRadix>>>1;var biRadixSquared=biRadix*biRadix;var maxDigitVal=biRadix-1;var maxInteger=9999999999999998;var maxDigits;var ZERO_ARRAY;var bigZero,bigOne;function setMaxDigits(value)
  3362. {
  3363. maxDigits=value;ZERO_ARRAY=new Array(maxDigits);for(var iza=0;iza<ZERO_ARRAY.length;iza++)ZERO_ARRAY[iza]=0;bigZero=new BigInt();bigOne=new BigInt();bigOne.digits[0]=1;}
  3364. setMaxDigits(20);var dpl10=15;var lr10=biFromNumber(1000000000000000);function BigInt(flag)
  3365. {
  3366. if(typeof flag=="boolean"&&flag==true){
  3367. this.digits=null;}
  3368. else{
  3369. this.digits=ZERO_ARRAY.slice(0);}
  3370. this.isNeg=false;}
  3371. function biFromDecimal(s)
  3372. {
  3373. var isNeg=s.charAt(0)=='-';var i=isNeg?1:0;var result;while(i<s.length&&s.charAt(i)=='0')++i;if(i==s.length){
  3374. result=new BigInt();}
  3375. else{
  3376. var digitCount=s.length-i;var fgl=digitCount%dpl10;if(fgl==0)fgl=dpl10;result=biFromNumber(Number(s.substr(i,fgl)));i+=fgl;while(i<s.length){
  3377. result=biAdd(biMultiply(result,lr10),
  3378. biFromNumber(Number(s.substr(i,dpl10))));i+=dpl10;}
  3379. result.isNeg=isNeg;}
  3380. return result;}
  3381. function biCopy(bi)
  3382. {
  3383. var result=new BigInt(true);result.digits=bi.digits.slice(0);result.isNeg=bi.isNeg;return result;}
  3384. function biFromNumber(i)
  3385. {
  3386. var result=new BigInt();result.isNeg=i<0;i=Math.abs(i);var j=0;while(i>0){
  3387. result.digits[j++]=i&maxDigitVal;i=Math.floor(i/biRadix);}
  3388. return result;}
  3389. function reverseStr(s)
  3390. {
  3391. var result="";for(var i=s.length-1;i>-1;--i){
  3392. result+=s.charAt(i);}
  3393. return result;}
  3394. var hexatrigesimalToChar=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');function biToString(x,radix)
  3395. {
  3396. var b=new BigInt();b.digits[0]=radix;var qr=biDivideModulo(x,b);var result=hexatrigesimalToChar[qr[1].digits[0]];while(biCompare(qr[0],bigZero)==1){
  3397. qr=biDivideModulo(qr[0],b);digit=qr[1].digits[0];result+=hexatrigesimalToChar[qr[1].digits[0]];}
  3398. return(x.isNeg?"-":"")+reverseStr(result);}
  3399. function biToDecimal(x)
  3400. {
  3401. var b=new BigInt();b.digits[0]=10;var qr=biDivideModulo(x,b);var result=String(qr[1].digits[0]);while(biCompare(qr[0],bigZero)==1){
  3402. qr=biDivideModulo(qr[0],b);result+=String(qr[1].digits[0]);}
  3403. return(x.isNeg?"-":"")+reverseStr(result);}
  3404. var hexToChar=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');function digitToHex(n)
  3405. {
  3406. var mask=0xf;var result="";for(i=0;i<4;++i){
  3407. result+=hexToChar[n&mask];n>>>=4;}
  3408. return reverseStr(result);}
  3409. function biToHex(x)
  3410. {
  3411. var result="";var n=biHighIndex(x);for(var i=biHighIndex(x);i>-1;--i){
  3412. result+=digitToHex(x.digits[i]);}
  3413. return result;}
  3414. function charToHex(c)
  3415. {
  3416. var ZERO=48;var NINE=ZERO+9;var littleA=97;var littleZ=littleA+25;var bigA=65;var bigZ=65+25;var result;if(c>=ZERO&&c<=NINE){
  3417. result=c-ZERO;}else if(c>=bigA&&c<=bigZ){
  3418. result=10+c-bigA;}else if(c>=littleA&&c<=littleZ){
  3419. result=10+c-littleA;}else{
  3420. result=0;}
  3421. return result;}
  3422. function hexToDigit(s)
  3423. {
  3424. var result=0;var sl=Math.min(s.length,4);for(var i=0;i<sl;++i){
  3425. result<<=4;result|=charToHex(s.charCodeAt(i))}
  3426. return result;}
  3427. function biFromHex(s)
  3428. {
  3429. var result=new BigInt();var sl=s.length;for(var i=sl,j=0;i>0;i-=4,++j){
  3430. result.digits[j]=hexToDigit(s.substr(Math.max(i-4,0),Math.min(i,4)));}
  3431. return result;}
  3432. function biFromString(s,radix)
  3433. {
  3434. var isNeg=s.charAt(0)=='-';var istop=isNeg?1:0;var result=new BigInt();var place=new BigInt();place.digits[0]=1;for(var i=s.length-1;i>=istop;i--){
  3435. var c=s.charCodeAt(i);var digit=charToHex(c);var biDigit=biMultiplyDigit(place,digit);result=biAdd(result,biDigit);place=biMultiplyDigit(place,radix);}
  3436. result.isNeg=isNeg;return result;}
  3437. function biDump(b)
  3438. {
  3439. return(b.isNeg?"-":"")+b.digits.join(" ");}
  3440. function biAdd(x,y)
  3441. {
  3442. var result;if(x.isNeg!=y.isNeg){
  3443. y.isNeg=!y.isNeg;result=biSubtract(x,y);y.isNeg=!y.isNeg;}
  3444. else{
  3445. result=new BigInt();var c=0;var n;for(var i=0;i<x.digits.length;++i){
  3446. n=x.digits[i]+y.digits[i]+c;result.digits[i]=n%biRadix;c=Number(n>=biRadix);}
  3447. result.isNeg=x.isNeg;}
  3448. return result;}
  3449. function biSubtract(x,y)
  3450. {
  3451. var result;if(x.isNeg!=y.isNeg){
  3452. y.isNeg=!y.isNeg;result=biAdd(x,y);y.isNeg=!y.isNeg;}else{
  3453. result=new BigInt();var n,c;c=0;for(var i=0;i<x.digits.length;++i){
  3454. n=x.digits[i]-y.digits[i]+c;result.digits[i]=n%biRadix;if(result.digits[i]<0)result.digits[i]+=biRadix;c=0-Number(n<0);}
  3455. if(c==-1){
  3456. c=0;for(var i=0;i<x.digits.length;++i){
  3457. n=0-result.digits[i]+c;result.digits[i]=n%biRadix;if(result.digits[i]<0)result.digits[i]+=biRadix;c=0-Number(n<0);}
  3458. result.isNeg=!x.isNeg;}else{
  3459. result.isNeg=x.isNeg;}}
  3460. return result;}
  3461. function biHighIndex(x)
  3462. {
  3463. var result=x.digits.length-1;while(result>0&&x.digits[result]==0)--result;return result;}
  3464. function biNumBits(x)
  3465. {
  3466. var n=biHighIndex(x);var d=x.digits[n];var m=(n+1)*bitsPerDigit;var result;for(result=m;result>m-bitsPerDigit;--result){
  3467. if((d&0x8000)!=0)break;d<<=1;}
  3468. return result;}
  3469. function biMultiply(x,y)
  3470. {
  3471. var result=new BigInt();var c;var n=biHighIndex(x);var t=biHighIndex(y);var u,uv,k;for(var i=0;i<=t;++i){
  3472. c=0;k=i;for(j=0;j<=n;++j,++k){
  3473. uv=result.digits[k]+x.digits[j]*y.digits[i]+c;result.digits[k]=uv&maxDigitVal;c=uv>>>biRadixBits;}
  3474. result.digits[i+n+1]=c;}
  3475. result.isNeg=x.isNeg!=y.isNeg;return result;}
  3476. function biMultiplyDigit(x,y)
  3477. {
  3478. var n,c,uv;result=new BigInt();n=biHighIndex(x);c=0;for(var j=0;j<=n;++j){
  3479. uv=result.digits[j]+x.digits[j]*y+c;result.digits[j]=uv&maxDigitVal;c=uv>>>biRadixBits;}
  3480. result.digits[1+n]=c;return result;}
  3481. function arrayCopy(src,srcStart,dest,destStart,n)
  3482. {
  3483. var m=Math.min(srcStart+n,src.length);for(var i=srcStart,j=destStart;i<m;++i,++j){
  3484. dest[j]=src[i];}}
  3485. var highBitMasks=new Array(0x0000,0x8000,0xC000,0xE000,0xF000,0xF800,
  3486. 0xFC00,0xFE00,0xFF00,0xFF80,0xFFC0,0xFFE0,
  3487. 0xFFF0,0xFFF8,0xFFFC,0xFFFE,0xFFFF);function biShiftLeft(x,n)
  3488. {
  3489. var digitCount=Math.floor(n/bitsPerDigit);var result=new BigInt();arrayCopy(x.digits,0,result.digits,digitCount,
  3490. result.digits.length-digitCount);var bits=n%bitsPerDigit;var rightBits=bitsPerDigit-bits;for(var i=result.digits.length-1,i1=i-1;i>0;--i,--i1){
  3491. result.digits[i]=((result.digits[i]<<bits)&maxDigitVal)|
  3492. ((result.digits[i1]&highBitMasks[bits])>>>
  3493. (rightBits));}
  3494. result.digits[0]=((result.digits[i]<<bits)&maxDigitVal);result.isNeg=x.isNeg;return result;}
  3495. var lowBitMasks=new Array(0x0000,0x0001,0x0003,0x0007,0x000F,0x001F,
  3496. 0x003F,0x007F,0x00FF,0x01FF,0x03FF,0x07FF,
  3497. 0x0FFF,0x1FFF,0x3FFF,0x7FFF,0xFFFF);function biShiftRight(x,n)
  3498. {
  3499. var digitCount=Math.floor(n/bitsPerDigit);var result=new BigInt();arrayCopy(x.digits,digitCount,result.digits,0,
  3500. x.digits.length-digitCount);var bits=n%bitsPerDigit;var leftBits=bitsPerDigit-bits;for(var i=0,i1=i+1;i<result.digits.length-1;++i,++i1){
  3501. result.digits[i]=(result.digits[i]>>>bits)|
  3502. ((result.digits[i1]&lowBitMasks[bits])<<leftBits);}
  3503. result.digits[result.digits.length-1]>>>=bits;result.isNeg=x.isNeg;return result;}
  3504. function biMultiplyByRadixPower(x,n)
  3505. {
  3506. var result=new BigInt();arrayCopy(x.digits,0,result.digits,n,result.digits.length-n);return result;}
  3507. function biDivideByRadixPower(x,n)
  3508. {
  3509. var result=new BigInt();arrayCopy(x.digits,n,result.digits,0,result.digits.length-n);return result;}
  3510. function biModuloByRadixPower(x,n)
  3511. {
  3512. var result=new BigInt();arrayCopy(x.digits,0,result.digits,0,n);return result;}
  3513. function biCompare(x,y)
  3514. {
  3515. if(x.isNeg!=y.isNeg){
  3516. return 1-2*Number(x.isNeg);}
  3517. for(var i=x.digits.length-1;i>=0;--i){
  3518. if(x.digits[i]!=y.digits[i]){
  3519. if(x.isNeg){
  3520. return 1-2*Number(x.digits[i]>y.digits[i]);}else{
  3521. return 1-2*Number(x.digits[i]<y.digits[i]);}}}
  3522. return 0;}
  3523. function biDivideModulo(x,y)
  3524. {
  3525. var nb=biNumBits(x);var tb=biNumBits(y);var origYIsNeg=y.isNeg;var q,r;if(nb<tb){
  3526. if(x.isNeg){
  3527. q=biCopy(bigOne);q.isNeg=!y.isNeg;x.isNeg=false;y.isNeg=false;r=biSubtract(y,x);x.isNeg=true;y.isNeg=origYIsNeg;}else{
  3528. q=new BigInt();r=biCopy(x);}
  3529. return new Array(q,r);}
  3530. q=new BigInt();r=x;var t=Math.ceil(tb/bitsPerDigit)-1;var lambda=0;while(y.digits[t]<biHalfRadix){
  3531. y=biShiftLeft(y,1);++lambda;++tb;t=Math.ceil(tb/bitsPerDigit)-1;}
  3532. r=biShiftLeft(r,lambda);nb+=lambda;var n=Math.ceil(nb/bitsPerDigit)-1;var b=biMultiplyByRadixPower(y,n-t);while(biCompare(r,b)!=-1){
  3533. ++q.digits[n-t];r=biSubtract(r,b);}
  3534. for(var i=n;i>t;--i){
  3535. var ri=(i>=r.digits.length)?0:r.digits[i];var ri1=(i-1>=r.digits.length)?0:r.digits[i-1];var ri2=(i-2>=r.digits.length)?0:r.digits[i-2];var yt=(t>=y.digits.length)?0:y.digits[t];var yt1=(t-1>=y.digits.length)?0:y.digits[t-1];if(ri==yt){
  3536. q.digits[i-t-1]=maxDigitVal;}else{
  3537. q.digits[i-t-1]=Math.floor((ri*biRadix+ri1)/yt);}
  3538. var c1=q.digits[i-t-1]*((yt*biRadix)+yt1);var c2=(ri*biRadixSquared)+((ri1*biRadix)+ri2);while(c1>c2){
  3539. --q.digits[i-t-1];c1=q.digits[i-t-1]*((yt*biRadix)|yt1);c2=(ri*biRadix*biRadix)+((ri1*biRadix)+ri2);}
  3540. b=biMultiplyByRadixPower(y,i-t-1);r=biSubtract(r,biMultiplyDigit(b,q.digits[i-t-1]));if(r.isNeg){
  3541. r=biAdd(r,b);--q.digits[i-t-1];}}
  3542. r=biShiftRight(r,lambda);q.isNeg=x.isNeg!=origYIsNeg;if(x.isNeg){
  3543. if(origYIsNeg){
  3544. q=biAdd(q,bigOne);}else{
  3545. q=biSubtract(q,bigOne);}
  3546. y=biShiftRight(y,lambda);r=biSubtract(y,r);}
  3547. if(r.digits[0]==0&&biHighIndex(r)==0)r.isNeg=false;return new Array(q,r);}
  3548. function biDivide(x,y)
  3549. {
  3550. return biDivideModulo(x,y)[0];}
  3551. function biModulo(x,y)
  3552. {
  3553. return biDivideModulo(x,y)[1];}
  3554. function biMultiplyMod(x,y,m)
  3555. {
  3556. return biModulo(biMultiply(x,y),m);}
  3557. function biPow(x,y)
  3558. {
  3559. var result=bigOne;var a=x;while(true){
  3560. if((y&1)!=0)result=biMultiply(result,a);y>>=1;if(y==0)break;a=biMultiply(a,a);}
  3561. return result;}
  3562. function biPowMod(x,y,m)
  3563. {
  3564. var result=bigOne;var a=x;var k=y;while(true){
  3565. if((k.digits[0]&1)!=0)result=biMultiplyMod(result,a,m);k=biShiftRight(k,1);if(k.digits[0]==0&&biHighIndex(k)==0)break;a=biMultiplyMod(a,a,m);}
  3566. return result;}
  3567. function RSAKeyPair(encryptionExponent,decryptionExponent,modulus)
  3568. {
  3569. this.e=biFromHex(encryptionExponent);this.d=biFromHex(decryptionExponent);this.m=biFromHex(modulus);this.digitSize=2*biHighIndex(this.m)+2;this.chunkSize=this.digitSize-11;this.radix=16;this.barrett=new BarrettMu(this.m);}
  3570. function BarrettMu(m)
  3571. {
  3572. this.modulus=biCopy(m);this.k=biHighIndex(this.modulus)+1;var b2k=new BigInt();b2k.digits[2*this.k]=1;this.mu=biDivide(b2k,this.modulus);this.bkplus1=new BigInt();this.bkplus1.digits[this.k+1]=1;this.modulo=BarrettMu_modulo;this.multiplyMod=BarrettMu_multiplyMod;this.powMod=BarrettMu_powMod;}
  3573. function BarrettMu_modulo(x)
  3574. {
  3575. var q1=biDivideByRadixPower(x,this.k-1);var q2=biMultiply(q1,this.mu);var q3=biDivideByRadixPower(q2,this.k+1);var r1=biModuloByRadixPower(x,this.k+1);var r2term=biMultiply(q3,this.modulus);var r2=biModuloByRadixPower(r2term,this.k+1);var r=biSubtract(r1,r2);if(r.isNeg){
  3576. r=biAdd(r,this.bkplus1);}
  3577. var rgtem=biCompare(r,this.modulus)>=0;while(rgtem){
  3578. r=biSubtract(r,this.modulus);rgtem=biCompare(r,this.modulus)>=0;}
  3579. return r;}
  3580. function BarrettMu_multiplyMod(x,y)
  3581. {
  3582. var xy=biMultiply(x,y);return this.modulo(xy);}
  3583. function BarrettMu_powMod(x,y)
  3584. {
  3585. var result=new BigInt();result.digits[0]=1;var a=x;var k=y;while(true){
  3586. if((k.digits[0]&1)!=0)result=this.multiplyMod(result,a);k=biShiftRight(k,1);if(k.digits[0]==0&&biHighIndex(k)==0)break;a=this.multiplyMod(a,a);}
  3587. return result;}
  3588. function twoDigit(n)
  3589. {
  3590. return(n<10?"0":"")+String(n);}
  3591. function encryptedString(key,s)
  3592. {
  3593. if(key.chunkSize>key.digitSize-11)
  3594. {
  3595. return"Error";}
  3596. var a=new Array();var sl=s.length;var i=0;while(i<sl){
  3597. a[i]=s.charCodeAt(i);i++;}
  3598. var al=a.length;var result="";var j,k,block;for(i=0;i<al;i+=key.chunkSize){
  3599. block=new BigInt();j=0;var x;var msgLength=(i+key.chunkSize)>al?al%key.chunkSize:key.chunkSize;var b=new Array();for(x=0;x<msgLength;x++)
  3600. {
  3601. b[x]=a[i+msgLength-1-x];}
  3602. b[msgLength]=0;var paddedSize=Math.max(8,key.digitSize-3-msgLength);for(x=0;x<paddedSize;x++){
  3603. b[msgLength+1+x]=Math.floor(Math.random()*254)+1;}
  3604. b[key.digitSize-2]=2;b[key.digitSize-1]=0;for(k=0;k<key.digitSize;++j)
  3605. {
  3606. block.digits[j]=b[k++];block.digits[j]+=b[k++]<<8;}
  3607. var crypt=key.barrett.powMod(block,key.e);var text=key.radix==16?biToHex(crypt):biToString(crypt,key.radix);result+=text+" ";}
  3608. return result.substring(0,result.length-1);}
  3609. function decryptedString(key,s)
  3610. {
  3611. var blocks=s.split(" ");var result="";var i,j,block;for(i=0;i<blocks.length;++i){
  3612. var bi;if(key.radix==16){
  3613. bi=biFromHex(blocks[i]);}
  3614. else{
  3615. bi=biFromString(blocks[i],key.radix);}
  3616. block=key.barrett.powMod(bi,key.d);for(j=0;j<=biHighIndex(block);++j){
  3617. result+=String.fromCharCode(block.digits[j]&255,
  3618. block.digits[j]>>8);}}
  3619. if(result.charCodeAt(result.length-1)==0){
  3620. result=result.substring(0,result.length-1);}
  3621. return result;}
  3622. function base64encode(str)
  3623. {
  3624. var base64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var base64DecodeChars=new Array(
  3625. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  3626. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  3627. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
  3628. 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
  3629. -1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
  3630. 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
  3631. -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
  3632. 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);var out,i,len;var c1,c2,c3;len=str.length;i=0;out="";while(i<len){
  3633. c1=str.charCodeAt(i++)&0xff;if(i==len)
  3634. {
  3635. out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt((c1&0x3)<<4);out+="==";break;}
  3636. c2=str.charCodeAt(i++);if(i==len)
  3637. {
  3638. out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));out+=base64EncodeChars.charAt((c2&0xF)<<2);out+="=";break;}
  3639. c3=str.charCodeAt(i++);out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));out+=base64EncodeChars.charAt(((c2&0xF)<<2)|((c3&0xC0)>>6));out+=base64EncodeChars.charAt(c3&0x3F);}
  3640. return out;}
  3641. var RSATYPE={MODULES:"",ENCRYPTEX:""};var RsaSecurityHelper=
  3642. {
  3643. isValid:function()
  3644. {
  3645. return (RSATYPE.MODULES.length > 0 && RSATYPE.ENCRYPTEX.length > 0);},
  3646. encrypt:function(plantext)
  3647. {
  3648. if (RsaSecurityHelper.isValid)
  3649. {
  3650. setMaxDigits(131);var _rsaKey=new RSAKeyPair(RSATYPE.ENCRYPTEX,"",RSATYPE.MODULES);return encryptedString(_rsaKey,base64encode(plantext));}
  3651. return null;},
  3652. getSessionKey:function()
  3653. {
  3654. RSATYPE.MODULES = "";RSATYPE.ENCRYPTEX = "";JSON.getRSAToken(RsaSecurityHelper.getRSATokenCallBack)
  3655. },
  3656. getRSATokenCallBack:function(obj)
  3657. {
  3658. WriteHistory("getRSATokenCallBack");RSATYPE.MODULES = obj.Modulus;RSATYPE.ENCRYPTEX = obj.Exponent;RsaSecurityHelper.toString();},
  3659. toString:function()
  3660. {
  3661. WriteHistory("MODULES: " + RSATYPE.MODULES);WriteHistory("ENCRYPTEX: " + RSATYPE.ENCRYPTEX);WriteHistory("RSAToken");}
  3662. }
  3663. _Scripts = function()
  3664. {
  3665. this.Scripts = new Array();}
  3666. _Scripts.prototype =
  3667. {
  3668. AddScript : function(key, script)
  3669. {
  3670. for(var i=0;i<this.Scripts.length;i++)
  3671. {
  3672. if (this.Scripts[i].key == key.toLowerCase())
  3673. {
  3674. WriteHistory("AddScript:Push:" + this.Scripts[i].JS.length);this.Scripts[i].JS.push(script);return;}
  3675. }
  3676. WriteHistory("AddScript:Add:" + this.Scripts.length);var obj = {}
  3677. obj.key = key.toLowerCase();obj.JS = new Array();obj.JS.push(script);this.Scripts.push(obj);},
  3678. FindKey : function(key)
  3679. {
  3680. for(var i=0;i<this.Scripts.length;i++)
  3681. {
  3682. if (this.Scripts[i].key == key.toLowerCase())
  3683. {
  3684. return this.Scripts[i];}
  3685. }
  3686. return null;},
  3687. RunAllScripts : function()
  3688. {
  3689. WriteHistory("RunAllScripts: " + this.Scripts.length);for(var i=0;i<this.Scripts.length;i++)
  3690. {
  3691. var theScripts = this.Scripts[i];while(theScripts.JS.length > 0)
  3692. {
  3693. var JS = theScripts.JS.shift();WriteHistory(JS);}
  3694. }
  3695. }
  3696. }
  3697. var JSScripts = new _Scripts();if ( typeof(XML) == 'undefined' ) XML = function() {};XML.ObjTree = function () {
  3698. return this;};XML.ObjTree.VERSION = "0.24";XML.ObjTree.prototype.xmlDecl = '<?xml version="1.0" encoding="UTF-8" ?>\n';XML.ObjTree.prototype.attr_prefix = '-';XML.ObjTree.prototype.overrideMimeType = 'text/xml';XML.ObjTree.prototype.parseXML = function ( xml ) {
  3699. var root;if ( window.DOMParser ) {
  3700. var xmldom = new DOMParser();var dom = xmldom.parseFromString( xml, "application/xml" );if ( ! dom ) return;root = dom.documentElement;} else if ( window.ActiveXObject ) {
  3701. xmldom = new ActiveXObject('Microsoft.XMLDOM');xmldom.async = false;xmldom.loadXML( xml );root = xmldom.documentElement;}
  3702. if ( ! root ) return;return this.parseDOM( root );};XML.ObjTree.prototype.parseHTTP = function ( url, options, callback ) {
  3703. var myopt = {};for( var key in options ) {
  3704. myopt[key] = options[key]; // copy object
  3705. }
  3706. if ( ! myopt.method ) {
  3707. if ( typeof(myopt.postBody) == "undefined" &&
  3708. typeof(myopt.postbody) == "undefined" &&
  3709. typeof(myopt.parameters) == "undefined" ) {
  3710. myopt.method = "get";} else {
  3711. myopt.method = "post";}
  3712. }
  3713. if ( callback ) {
  3714. myopt.asynchronous = true; // async-mode
  3715. var __this = this;var __func = callback;var __save = myopt.onComplete;myopt.onComplete = function ( trans ) {
  3716. var tree;if ( trans && trans.responseXML && trans.responseXML.documentElement ) {
  3717. tree = __this.parseDOM( trans.responseXML.documentElement );} else if ( trans && trans.responseText ) {
  3718. tree = __this.parseXML( trans.responseText );}
  3719. __func( tree, trans );if ( __save ) __save( trans );};} else {
  3720. myopt.asynchronous = false; // sync-mode
  3721. }
  3722. var trans;if ( typeof(HTTP) != "undefined" && HTTP.Request ) {
  3723. myopt.uri = url;var req = new HTTP.Request( myopt ); // JSAN
  3724. if ( req ) trans = req.transport;} else if ( typeof(Ajax) != "undefined" && Ajax.Request ) {
  3725. var req = new Ajax.Request( url, myopt ); // ptorotype.js
  3726. if ( req ) trans = req.transport;}
  3727. if ( callback ) return trans;if ( trans && trans.responseXML && trans.responseXML.documentElement ) {
  3728. return this.parseDOM( trans.responseXML.documentElement );} else if ( trans && trans.responseText ) {
  3729. return this.parseXML( trans.responseText );}
  3730. }
  3731. XML.ObjTree.prototype.parseDOM = function ( root ) {
  3732. if ( ! root ) return;this.__force_array = {};if ( this.force_array ) {
  3733. for( var i=0; i<this.force_array.length; i++ ) {
  3734. this.__force_array[this.force_array[i]] = 1;}
  3735. }
  3736. var json = this.parseElement( root ); // parse root node
  3737. if ( this.__force_array[root.nodeName] ) {
  3738. json = [ json ];}
  3739. if ( root.nodeType != 11 ) { // DOCUMENT_FRAGMENT_NODE
  3740. var tmp = {};tmp[root.nodeName] = json; // root nodeName
  3741. json = tmp;}
  3742. return json;};XML.ObjTree.prototype.parseElement = function ( elem ) {
  3743. if ( elem.nodeType == 7 ) {
  3744. return;}
  3745. if ( elem.nodeType == 3 || elem.nodeType == 4 ) {
  3746. var bool = elem.nodeValue.match( /[^\x00-\x20]/ );if ( bool == null ) return; // ignore white spaces
  3747. return elem.nodeValue;}
  3748. var retval;var cnt = {};if ( elem.attributes && elem.attributes.length ) {
  3749. retval = {};for ( var i=0; i<elem.attributes.length; i++ ) {
  3750. var key = elem.attributes[i].nodeName;if ( typeof(key) != "string" ) continue;var val = elem.attributes[i].nodeValue;if ( ! val ) continue;key = this.attr_prefix + key;if ( typeof(cnt[key]) == "undefined" ) cnt[key] = 0;cnt[key] ++;this.addNode( retval, key, cnt[key], val );}
  3751. }
  3752. if ( elem.childNodes && elem.childNodes.length ) {
  3753. var textonly = true;if ( retval ) textonly = false; // some attributes exists
  3754. for ( var i=0; i<elem.childNodes.length && textonly; i++ ) {
  3755. var ntype = elem.childNodes[i].nodeType;if ( ntype == 3 || ntype == 4 ) continue;textonly = false;}
  3756. if ( textonly ) {
  3757. if ( ! retval ) retval = "";for ( var i=0; i<elem.childNodes.length; i++ ) {
  3758. retval += elem.childNodes[i].nodeValue;}
  3759. } else {
  3760. if ( ! retval ) retval = {};for ( var i=0; i<elem.childNodes.length; i++ ) {
  3761. var key = elem.childNodes[i].nodeName;if ( typeof(key) != "string" ) continue;var val = this.parseElement( elem.childNodes[i] );if ( ! val ) continue;if ( typeof(cnt[key]) == "undefined" ) cnt[key] = 0;cnt[key] ++;this.addNode( retval, key, cnt[key], val );}
  3762. }
  3763. }
  3764. return retval;};XML.ObjTree.prototype.addNode = function ( hash, key, cnts, val ) {
  3765. if ( this.__force_array[key] ) {
  3766. if ( cnts == 1 ) hash[key] = [];hash[key][hash[key].length] = val; // push
  3767. } else if ( cnts == 1 ) { // 1st sibling
  3768. hash[key] = val;} else if ( cnts == 2 ) { // 2nd sibling
  3769. hash[key] = [ hash[key], val ];} else { // 3rd sibling and more
  3770. hash[key][hash[key].length] = val;}
  3771. };XML.ObjTree.prototype.writeXML = function ( tree ) {
  3772. var xml = this.hash_to_xml( null, tree );return this.xmlDecl + xml;};XML.ObjTree.prototype.hash_to_xml = function ( name, tree ) {
  3773. var elem = [];var attr = [];for( var key in tree ) {
  3774. if ( ! tree.hasOwnProperty(key) ) continue;var val = tree[key];if ( key.charAt(0) != this.attr_prefix ) {
  3775. if ( typeof(val) == "undefined" || val == null ) {
  3776. elem[elem.length] = "<"+key+" />";} else if ( typeof(val) == "object" && val.constructor == Array ) {
  3777. elem[elem.length] = this.array_to_xml( key, val );} else if ( typeof(val) == "object" ) {
  3778. elem[elem.length] = this.hash_to_xml( key, val );} else {
  3779. elem[elem.length] = this.scalar_to_xml( key, val );}
  3780. } else {
  3781. attr[attr.length] = " "+(key.substring(1))+'="'+(this.xml_escape( val ))+'"';}
  3782. }
  3783. var jattr = attr.join("");var jelem = elem.join("");if ( typeof(name) == "undefined" || name == null ) {
  3784. } else if ( elem.length > 0 ) {
  3785. if ( jelem.match( /\n/ )) {
  3786. jelem = "<"+name+jattr+">\n"+jelem+"</"+name+">\n";} else {
  3787. jelem = "<"+name+jattr+">" +jelem+"</"+name+">\n";}
  3788. } else {
  3789. jelem = "<"+name+jattr+" />\n";}
  3790. return jelem;};XML.ObjTree.prototype.array_to_xml = function ( name, array ) {
  3791. var out = [];for( var i=0; i<array.length; i++ ) {
  3792. var val = array[i];if ( typeof(val) == "undefined" || val == null ) {
  3793. out[out.length] = "<"+name+" />";} else if ( typeof(val) == "object" && val.constructor == Array ) {
  3794. out[out.length] = this.array_to_xml( name, val );} else if ( typeof(val) == "object" ) {
  3795. out[out.length] = this.hash_to_xml( name, val );} else {
  3796. out[out.length] = this.scalar_to_xml( name, val );}
  3797. }
  3798. return out.join("");};XML.ObjTree.prototype.scalar_to_xml = function ( name, text ) {
  3799. if ( name == "#text" ) {
  3800. return this.xml_escape(text);} else {
  3801. return "<"+name+">"+this.xml_escape(text)+"</"+name+">\n";}
  3802. };XML.ObjTree.prototype.xml_escape = function ( text ) {
  3803. return String(text).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');};/*
  3804. =head1 NAME
  3805. XML.ObjTree -- XML source code from/to JavaScript object like E4X
  3806. =head1 SYNOPSIS
  3807. var xotree = new XML.ObjTree();var tree1 = {
  3808. root: {
  3809. node: "Hello, World!"
  3810. }
  3811. };var xml1 = xotree.writeXML( tree1 ); // object tree to XML source
  3812. alert( "xml1: "+xml1 );var xml2 = '<?xml version="1.0"?><response><error>0</error></response>';var tree2 = xotree.parseXML( xml2 ); // XML source to object tree
  3813. alert( "error: "+tree2.response.error );=head1 DESCRIPTION
  3814. XML.ObjTree class is a parser/generater between XML source code
  3815. and JavaScript object like E4X, ECMAScript for XML.
  3816. This is a JavaScript version of the XML::TreePP module for Perl.
  3817. This also works as a wrapper for XMLHTTPRequest and successor to JKL.ParseXML class
  3818. when this is used with prototype.js or JSAN's HTTP.Request class.
  3819. =head2 JavaScript object tree format
  3820. A sample XML source:
  3821. <?xml version="1.0" encoding="UTF-8"?>
  3822. <family name="Kawasaki">
  3823. <father>Yasuhisa</father>
  3824. <mother>Chizuko</mother>
  3825. <children>
  3826. <girl>Shiori</girl>
  3827. <boy>Yusuke</boy>
  3828. <boy>Kairi</boy>
  3829. </children>
  3830. </family>
  3831. Its JavaScript object tree like JSON/E4X:
  3832. {
  3833. 'family': {
  3834. '-name': 'Kawasaki',
  3835. 'father': 'Yasuhisa',
  3836. 'mother': 'Chizuko',
  3837. 'children': {
  3838. 'girl': 'Shiori'
  3839. 'boy': [
  3840. 'Yusuke',
  3841. 'Kairi'
  3842. ]
  3843. }
  3844. }
  3845. };Each elements are parsed into objects:
  3846. tree.family.father; # the father's given name.
  3847. Prefix '-' is inserted before every attributes' name.
  3848. tree.family["-name"]; # this family's family name
  3849. A array is used because this family has two boys.
  3850. tree.family.children.boy[0]; # first boy's name
  3851. tree.family.children.boy[1]; # second boy's name
  3852. tree.family.children.girl; # (girl has no other sisiters)
  3853. =head1 METHODS
  3854. =head2 xotree = new XML.ObjTree()
  3855. This constructor method returns a new XML.ObjTree object.
  3856. =head2 xotree.force_array = [ "rdf:li", "item", "-xmlns" ];This property allows you to specify a list of element names
  3857. which should always be forced into an array representation.
  3858. The default value is null, it means that context of the elements
  3859. will determine to make array or to keep it scalar.
  3860. =head2 xotree.attr_prefix = '@';This property allows you to specify a prefix character which is
  3861. inserted before each attribute names.
  3862. Instead of default prefix '-', E4X-style prefix '@' is also available.
  3863. The default character is '-'.
  3864. Or set '@' to access attribute values like E4X, ECMAScript for XML.
  3865. The length of attr_prefix must be just one character and not be empty.
  3866. =head2 xotree.xmlDecl = '';This library generates an XML declaration on writing an XML code per default.
  3867. This property forces to change or leave it empty.
  3868. =head2 tree = xotree.parseXML( xmlsrc );This method loads an XML document using the supplied string
  3869. and returns its JavaScript object converted.
  3870. =head2 tree = xotree.parseDOM( domnode );This method parses a DOM tree (ex. responseXML.documentElement)
  3871. and returns its JavaScript object converted.
  3872. =head2 tree = xotree.parseHTTP( url, options );This method loads a XML file from remote web server
  3873. and returns its JavaScript object converted.
  3874. XMLHTTPRequest's synchronous mode is always used.
  3875. This mode blocks the process until the response is completed.
  3876. First argument is a XML file's URL
  3877. which must exist in the same domain as parent HTML file's.
  3878. Cross-domain loading is not available for security reasons.
  3879. Second argument is options' object which can contains some parameters:
  3880. method, postBody, parameters, onLoading, etc.
  3881. This method requires JSAN's L<HTTP.Request> class or prototype.js's Ajax.Request class.
  3882. =head2 xotree.parseHTTP( url, options, callback );If a callback function is set as third argument,
  3883. XMLHTTPRequest's asynchronous mode is used.
  3884. This mode calls a callback function with XML file's JavaScript object converted
  3885. after the response is completed.
  3886. =head2 xmlsrc = xotree.writeXML( tree );This method parses a JavaScript object tree
  3887. and returns its XML source generated.
  3888. =head1 EXAMPLES
  3889. =head2 Text node and attributes
  3890. If a element has both of a text node and attributes
  3891. or both of a text node and other child nodes,
  3892. text node's value is moved to a special node named "#text".
  3893. var xotree = new XML.ObjTree();var xmlsrc = '<span class="author">Kawasaki Yusuke</span>';var tree = xotree.parseXML( xmlsrc );var class = tree.span["-class"]; # attribute
  3894. var name = tree.span["#text"]; # text node
  3895. =head2 parseHTTP() method with HTTP-GET and sync-mode
  3896. HTTP/Request.js or prototype.js must be loaded before calling this method.
  3897. var xotree = new XML.ObjTree();var url = "http://example.com/index.html";
  3898. var tree = xotree.parseHTTP( url );xotree.attr_prefix = '@'; // E4X-style
  3899. alert( tree.html["@lang"] );This code shows C<lang=""> attribute from a X-HTML source code.
  3900. =head2 parseHTTP() method with HTTP-POST and async-mode
  3901. Third argument is a callback function which is called on onComplete.
  3902. var xotree = new XML.ObjTree();var url = "http://example.com/mt-tb.cgi";
  3903. var opts = {
  3904. postBody: "title=...&excerpt=...&url=...&blog_name=..."
  3905. };var func = function ( tree ) {
  3906. alert( tree.response.error );};xotree.parseHTTP( url, opts, func );This code send a trackback ping and shows its response code.
  3907. =head2 Simple RSS reader
  3908. This is a RSS reader which loads RDF file and displays all items.
  3909. var xotree = new XML.ObjTree();xotree.force_array = [ "rdf:li", "item" ];var url = "http://example.com/news-rdf.xml";
  3910. var func = function( tree ) {
  3911. var elem = document.getElementById("rss_here");for( var i=0; i<tree["rdf:RDF"].item.length; i++ ) {
  3912. var divtag = document.createElement( "div" );var atag = document.createElement( "a" );atag.href = tree["rdf:RDF"].item[i].link;var title = tree["rdf:RDF"].item[i].title;var tnode = document.createTextNode( title );atag.appendChild( tnode );divtag.appendChild( atag );elem.appendChild( divtag );}
  3913. };xotree.parseHTTP( url, {}, func );=head2 XML-RPC using writeXML, prototype.js and parseDOM
  3914. If you wish to use prototype.js's Ajax.Request class by yourself:
  3915. var xotree = new XML.ObjTree();var reqtree = {
  3916. methodCall: {
  3917. methodName: "weblogUpdates.ping",
  3918. params: {
  3919. param: [
  3920. { value: "Kawa.net xp top page" }, // 1st param
  3921. { value: "http://www.kawa.net/" } // 2nd param
  3922. ]
  3923. }
  3924. }
  3925. };var reqxml = xotree.writeXML( reqtree ); // JS-Object to XML code
  3926. var url = "http://example.com/xmlrpc";
  3927. var func = function( req ) {
  3928. var resdom = req.responseXML.documentElement;xotree.force_array = [ "member" ];var restree = xotree.parseDOM( resdom ); // XML-DOM to JS-Object
  3929. alert( restree.methodResponse.params.param.value.struct.member[0].value.string );};var opt = {
  3930. method: "post",
  3931. postBody: reqxml,
  3932. asynchronous: true,
  3933. onComplete: func
  3934. };new Ajax.Request( url, opt );=head1 AUTHOR
  3935. Yusuke Kawasaki http://www.kawa.net/
  3936. =head1 COPYRIGHT AND LICENSE
  3937. Copyright (c) 2005-2006 Yusuke Kawasaki. All rights reserved.
  3938. This program is free software; you can redistribute it and/or
  3939. modify it under the Artistic license. Or whatever license I choose,
  3940. which I will do instead of keeping this documentation like it is.
  3941. =cut
  3942. */
  3943. function getWindowWidthHeight()
  3944. {
  3945. var result = {};result["Width"] = f_clientWidth();result["Height"] = f_clientHeight();return result;}
  3946. function f_clientWidth() {
  3947. return f_filterResults (
  3948. window.innerWidth ? window.innerWidth : 0,
  3949. document.documentElement ? document.documentElement.clientWidth : 0,
  3950. document.body ? document.body.clientWidth : 0
  3951. );}
  3952. function f_clientHeight() {
  3953. return f_filterResults (
  3954. window.innerHeight ? window.innerHeight : 0,
  3955. document.documentElement ? document.documentElement.clientHeight : 0,
  3956. document.body ? document.body.clientHeight : 0
  3957. );}
  3958. function f_filterResults(n_win, n_docel, n_body) {
  3959. var n_result = n_win ? n_win : 0;if (n_docel && (!n_result || (n_result > n_docel)))
  3960. n_result = n_docel;return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;}
  3961. var isDebugMode = false;function WriteHistory(message)
  3962. {
  3963. if (isDebugMode)
  3964. {
  3965. var historyDiv = document.getElementById('pageHistory');if(historyDiv){
  3966. while(historyDiv.childNodes.length > 500)
  3967. {
  3968. historyDiv.removeChild(historyDiv.lastChild);}
  3969. historyDiv.insertBefore(document.createElement('BR'), historyDiv.firstChild);historyDiv.insertBefore(document.createTextNode(message), historyDiv.firstChild);}
  3970. }
  3971. }
  3972. function ClearHistory()
  3973. {
  3974. var historyDiv = document.getElementById('pageHistory');if(historyDiv){
  3975. historyDiv.innerHTML = "";}
  3976. }
  3977. function setCaretPosition(elemId, caretPos) {
  3978. var elem = document.getElementById(elemId);if(elem != null) {
  3979. if(elem.createTextRange) {
  3980. var range = elem.createTextRange();range.move('character', caretPos);range.select();}
  3981. else {
  3982. if(elem.selectionStart) {
  3983. elem.focus();elem.setSelectionRange(caretPos, caretPos);}
  3984. else
  3985. elem.focus();}
  3986. }
  3987. }
  3988. function $hide(id)
  3989. {
  3990. var element = document.getElementById(id);if (element == null)
  3991. {
  3992. }
  3993. else
  3994. element.style.display="none";}
  3995. function $show(id, style, focus)
  3996. {
  3997. var element = document.getElementById(id);var displayStyle = "block";if (style && style != "IGNORE")
  3998. {
  3999. if (style == "NONE")
  4000. displayStyle = "";else
  4001. displayStyle =style;}
  4002. if (element == null)
  4003. {
  4004. }
  4005. else
  4006. element.style.display=displayStyle;if (focus)
  4007. {
  4008. try
  4009. {
  4010. element.focus();}
  4011. catch(ex)
  4012. {
  4013. }
  4014. }
  4015. }
  4016. function winopen(url, w, h)
  4017. {
  4018. var left = (screen.width) ? (screen.width-w)/2 : 0;var top = (screen.height) ? (screen.height-h)/2 : 0;window.open(url, "_blank", "width="+w+",height="+h+",left="+left+",top="+top+",resizable=yes,scrollbars=yes");return;}
  4019. function winopen_withlocationbar(url)
  4020. {
  4021. var w = screen.width / 2;var h = screen.height /2;var left = (screen.width) ? (screen.width-w)/2 : 0;var top = (screen.height) ? (screen.height-h)/2 : 0;window.open(url, "_blank");return;}
  4022. function winopen2(url,target, w, h)
  4023. {
  4024. var left = (screen.width) ? (screen.width-w)/2 : 0;var top = (screen.height) ? (screen.height-h)/2 : 0;if(popupWin_2[target] != null)
  4025. if(!popupWin_2[target].closed)
  4026. popupWin_2[target].focus();else
  4027. popupWin_2[target] = window.open(url, target, "width="+w+",height="+h+",left="+left+",top="+top+",resizable=yes,scrollbars=yes");else
  4028. popupWin_2[target] = window.open(url, target, "width="+w+",height="+h+",left="+left+",top="+top+",resizable=yes,scrollbars=yes");return;}
  4029. function removeChildNodes(element)
  4030. {
  4031. while(element.firstChild)
  4032. element.removeChild(element.firstChild);}
  4033. function installScript( script )
  4034. {
  4035. if (!script)
  4036. return;WriteHistory("installScript: " + script);if (window.execScript)
  4037. window.execScript( script);else
  4038. window.setTimeout( script, 0 );}
  4039. var installScriptSrc_Dict = new Object();function installScriptSrc_CheckLoaded(src)
  4040. {
  4041. src = makeAbsoluteKey(src);WriteHistory("installScriptSrc_CheckLoaded: " + src);var result = installScriptSrc_Dict[src];WriteHistory(src + " : " + result);if (result)
  4042. return result;else
  4043. return false;}
  4044. function installScriptSrc_UpdateDict(obj)
  4045. {
  4046. var src = makeAbsoluteKey(obj.src)
  4047. WriteHistory("installScriptSrc_UpdateDict: " + src);if (is_ie)
  4048. {
  4049. WriteHistory("installScriptSrc_Dict['" + src + "'] = true;");setTimeout("installScriptSrc_Dict['" + src + "'] = true;", 1000);}
  4050. else
  4051. {
  4052. installScriptSrc_Dict[src] = true;}
  4053. }
  4054. function installScriptSrc_ToString()
  4055. {
  4056. var obj = installScriptSrc_Dict;for(var key in obj)
  4057. {
  4058. WriteHistory(key + " : " + obj[key]);}
  4059. }
  4060. function makeAbsolute(src)
  4061. {
  4062. if (src)
  4063. {
  4064. WriteHistory("makeAbsolute-b4: " + src);src = src.toLowerCase();if (src.indexOf("http") == 0)
  4065. {
  4066. }
  4067. else if (src[0] == "/")
  4068. {
  4069. var x = "";var path = location.href.toLowerCase().replace(location.pathname.toLowerCase() + location.search.toLowerCase(), "");src = path + src;}
  4070. else
  4071. {
  4072. src = location.href.substring(0, location.href.lastIndexOf("/")) + src;}
  4073. WriteHistory("makeAbsolute-after: " + src);return src.toLowerCase();}
  4074. else
  4075. return "";}
  4076. function makeAbsoluteKey(src)
  4077. {
  4078. return makeAbsolute(src).replace(/\//g, "_").replace(/\?/g, "_").replace(/\&/g, "_").replace(/\%/g, "_");
  4079. }
  4080. function installScriptSrc(src)
  4081. {
  4082. WriteHistory("installScriptSrc:" + src);var src2 = makeAbsolute(src);WriteHistory("installScriptSrc #2: " + src2);var Scripts = document.getElementsByTagName("script");for(var i=0;i<Scripts.length;i++)
  4083. {
  4084. if (Scripts[i].src)
  4085. {
  4086. if (makeAbsolute(Scripts[i].src) == src2)
  4087. {
  4088. WriteHistory("installScriptSrc:" + src + " already exists");return;}
  4089. }
  4090. }
  4091. var head = document.getElementsByTagName("head")[0];var scriptObj = document.createElement("script");scriptObj.setAttribute("type", "text/javascript");scriptObj.setAttribute("src", src);head.appendChild(scriptObj);if (is_ie)
  4092. {
  4093. scriptObj.onreadystatechange=function() {
  4094. if (this.readyState == 'loaded' || this.readyState == 'complete')
  4095. {
  4096. installScriptSrc_UpdateDict(this)
  4097. }
  4098. }
  4099. }
  4100. else
  4101. {
  4102. scriptObj.onload=function () {installScriptSrc_UpdateDict(this)}
  4103. }
  4104. WriteHistory("Added" + src2);}
  4105. function grabContent(theURL, FunctionToCall)
  4106. {
  4107. var request = new Sys.Net.WebRequest();request.set_httpVerb("GET");request.set_url(theURL);request.add_completed( function( executor )
  4108. {
  4109. if (executor.get_responseAvailable())
  4110. {
  4111. var content = executor.get_responseData();FunctionToCall(content);}
  4112. });var executor = new Sys.Net.XMLHttpExecutor();request.set_executor(executor);executor.executeRequest();}
  4113. function removeAllAttributesFromChild(Element, attribute)
  4114. {
  4115. if (Element.childNodes)
  4116. {
  4117. var ttl = Element.childNodes.length;for(var i=0;i<ttl;i++)
  4118. {
  4119. var e = Element.childNodes[i];try
  4120. {
  4121. e.removeAttribute(attribute);}
  4122. catch(ex)
  4123. {
  4124. }
  4125. }
  4126. }
  4127. }
  4128. function setAllAttributesForChild(Element, attribute, value)
  4129. {
  4130. if (Element.childNodes)
  4131. {
  4132. var ttl = Element.childNodes.length;for(var i=0;i<ttl;i++)
  4133. {
  4134. var e = Element.childNodes[i];e.setAttribute(attribute, value);}
  4135. }
  4136. }
  4137. function MenuItem_Click(Element, AttributeToSetValue)
  4138. {
  4139. var ElementToIgnore = Element;Element = Element.parentNode;var ttl = Element.childNodes.length;var AttributeToRemove = "classx"
  4140. for(var i=0;i<ttl;i++)
  4141. {
  4142. var e = Element.childNodes[i];if (e != ElementToIgnore)
  4143. {
  4144. if (e.removeAttribute)
  4145. {
  4146. e.removeAttribute(AttributeToRemove);}
  4147. e.className = AttributeToSetValue;}
  4148. }
  4149. ElementToIgnore.setAttribute("classx", ElementToIgnore.className);}
  4150. function MenuItem_OnMouseOut(Element, className)
  4151. {
  4152. var cls = Element.getAttribute('classx');if(cls==null)
  4153. cls='';Element.className=(cls.length > 0 ? cls : className);}
  4154. function setElementToAjaxLoading(Element)
  4155. {
  4156. removeChildNodes(Element);var x = "<img src='/images/ajax_bar.gif' border='0' />";if (arguments.length > 1)
  4157. {
  4158. x = arguments[1] + x + arguments[2];}
  4159. Element.innerHTML = x;}
  4160. function getElementHeight(Element) {
  4161. if(Element.clientHeight) {return Element.clientHeight;}
  4162. else if(Element.offsetHeight) {return Element.offsetHeight;}
  4163. return -1;}
  4164. function getElementWidth(Element) {
  4165. if(Element.clientWidth && parseInt(Element.clientWidth)>0) {return parseInt(Element.clientWidth);}
  4166. else {if(Element.offsetWidth) {return parseInt(Element.offsetWidth);}}
  4167. return 0;}
  4168. function getClickEventProperties(e)
  4169. {
  4170. var posx = 0;var posy = 0;if (!e) var e = window.event;if (e.pageX || e.pageY) {
  4171. posx = e.pageX;posy = e.pageY;}
  4172. else if (e.clientX || e.clientY) {
  4173. posx = e.clientX + document.body.scrollLeft
  4174. + document.documentElement.scrollLeft;posy = e.clientY + document.body.scrollTop
  4175. + document.documentElement.scrollTop;}
  4176. var targ = null;if (e.target) targ = e.target;else if (e.srcElement) targ = e.srcElement;if (targ.nodeType == 3) // defeat Safari bug
  4177. targ = targ.parentNode;var result = {};result.x = posx;result.y = posy;result.target = targ;return result;}
  4178. var mTimeOut = 0;var mCurrentItem = null;var mTargets = new Array();function Menu_AddTarget(src, target)
  4179. {
  4180. WriteHistory("Menu_AddTarget: " + src + " : " + target);src = src.toLowerCase();target = target.toLowerCase();for(var i=0;i<mTargets.length;i++)
  4181. {
  4182. if (src == mTargets[i].src)
  4183. {
  4184. mTargets[i].target.onmouseout = null;mTargets[i].target = target;Menu_Setup(mTargets[i]);return;}
  4185. }
  4186. var obj = {};obj.src = src;obj.target = target;obj.Active = false;mTargets.push(obj);Menu_Setup(obj);}
  4187. function Menu_FindItem(src)
  4188. {
  4189. if (src != null)
  4190. {
  4191. for(var i=0;i<mTargets.length;i++)
  4192. {
  4193. if (src.toLowerCase() == mTargets[i].src)
  4194. {
  4195. return mTargets[i];}
  4196. }
  4197. }
  4198. return null;}
  4199. function Menu_FindTarget(src)
  4200. {
  4201. var item = Menu_FindItem(src);if (item)
  4202. return item.target;else
  4203. return null;}
  4204. function Menu_Setup(obj)
  4205. {
  4206. var js = "$('" + obj.src + "').onmouseout=function() {collapse('" + obj.src + "')};";js += "$('" + obj.target + "').onmouseout=function() {collapse('" + obj.src + "')};";$(obj.target).onmouseover=cancelcollapse;$(obj.src).onclick=expand;installScript(js);}
  4207. function expand(e)
  4208. {
  4209. var x1 = getClickEventProperties(e);if (mCurrentItem != null)
  4210. {
  4211. collapseMenu(mCurrentItem);}
  4212. mCurrentItem = x1.target.id;var Bounds = Sys.UI.DomElement.getBounds(x1.target);var browser = window.navigator.appName;var dif = 0;if (browser != "Microsoft Internet Explorer") { dif = 4; }
  4213. var ClickElement = x1.target;var TargetItem = Menu_FindItem(x1.target.id);WriteHistory("expand: " + TargetItem.src + ":" + TargetItem.target + ":" + TargetItem.Active);var TargetID = TargetItem.target;if (TargetID == null)
  4214. {
  4215. WriteHistory("Error:" + x1.x + ":" + x1.y + ":" + x1.target + ":" + x1.target.id + ":" + ClickElement.id + ":");return;}
  4216. TargetItem.Active = true;var MenuDiv = document.getElementById(Menu_FindTarget(x1.target.id));MenuDiv.style.position = "absolute";MenuDiv.style.visibility = "visible";MenuDiv.style.display = "block";var WindowWH = getWindowWidthHeight();if (WindowWH.Width > Bounds.x + 100)
  4217. {
  4218. MenuDiv.style.left = Bounds.x + "px";MenuDiv.style.right = "";MenuDiv.style.top = (Bounds.y + Bounds.height + dif) + "px";}
  4219. else
  4220. {
  4221. MenuDiv.style.left = "";MenuDiv.style.right = (WindowWH.Width - Bounds.x - Bounds.width) + "px";MenuDiv.style.top = (Bounds.y + Bounds.height + dif) + "px";}
  4222. }
  4223. function collapseMenu(s)
  4224. {
  4225. var TargetItem = Menu_FindItem(s);if (TargetItem.Active)
  4226. {
  4227. TargetItem.Active = false;var d = document.getElementById(TargetItem.target);if (d != null)
  4228. {
  4229. mCurrentItem = null;d.style.visibility = "hidden";d.style.display = "none";}
  4230. }
  4231. }
  4232. function collapse(s)
  4233. {
  4234. var TargetItem = Menu_FindItem(s);if (TargetItem && TargetItem.Active)
  4235. {
  4236. var d = document.getElementById(TargetItem.target);if (d != null)
  4237. {
  4238. mTimeOut = window.setTimeout("collapseMenu('" + s + "')", 1000);}
  4239. }
  4240. }
  4241. function cancelcollapse()
  4242. {
  4243. if (mTimeOut > 0)
  4244. {
  4245. window.clearInterval(mTimeOut);mTimeOut = 0;}
  4246. }
  4247. function XmlToObject(content)
  4248. {
  4249. var xmlDoc = null;try //Internet Explorer
  4250. {
  4251. xmlDoc=new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async = false;xmlDoc.loadXML(content);}
  4252. catch(e)
  4253. {
  4254. try //Firefox, Mozilla, Opera, etc.
  4255. {
  4256. parser=new DOMParser();xmlDoc=parser.parseFromString(content,"text/xml");}
  4257. catch(e) {alert(e.message)}
  4258. }
  4259. if (xmlDoc.childNodes.length > 0)
  4260. {
  4261. var xStatus = xmlDoc.getElementsByTagName("status")[0];var status = (xStatus.length > 0 ? xStatus.firstChild.nodeValue : "");var Communities = xmlDoc.getElementsByTagName("row");var strCommunities = "<ul>";for(var i=0;i<Communities.length;i++)
  4262. {
  4263. strCommunities += "<li><a target='_blank' href='https://u.nus.edu.sg" + Communities[i].childNodes[0].childNodes[0].nodeValue + "'>" +
  4264. Communities[i].childNodes[1].childNodes[0].nodeValue +
  4265. "</li>";}
  4266. strCommunities += "</ul>";}
  4267. xmlDoc = null;}
  4268. function XMLObjTree_ItemArray(Node)
  4269. {
  4270. if (Node)
  4271. {
  4272. if (Node.length)
  4273. {
  4274. return Node;}
  4275. else
  4276. {
  4277. var result = new Array();result.push(Node);return result;}
  4278. }
  4279. else
  4280. return null;}
  4281. function URLEncode(URL)
  4282. {
  4283. var SAFECHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.!~*'()";var HEX = "0123456789ABCDEF";var plaintext = URL;var encoded = "";for (var i = 0; i < plaintext.length; i++ ) {
  4284. var ch = plaintext.charAt(i);if (ch == " ") {
  4285. encoded += "+"; // x-www-urlencoded, rather than %20
  4286. } else if (SAFECHARS.indexOf(ch) != -1) {
  4287. encoded += ch;} else {
  4288. var charCode = ch.charCodeAt(0);if (charCode > 255) {
  4289. alert( "Unicode Character '"
  4290. + ch
  4291. + "' cannot be encoded using standard URL encoding.\n" +
  4292. "(URL encoding only supports 8-bit characters.)\n" +
  4293. "A space (+) will be substituted." );encoded += "+";} else {
  4294. encoded += "%";encoded += HEX.charAt((charCode >> 4) & 0xF);encoded += HEX.charAt(charCode & 0xF);}
  4295. }
  4296. } // for
  4297. return encoded;};var dDefaultBtn = new Object();function setDefaultButton(Input, Button)
  4298. {
  4299. var isNew = true;for(var key in dDefaultBtn)
  4300. {
  4301. if (key == Input.toLowerCase())
  4302. {
  4303. isNew = false;}
  4304. }
  4305. if(isNew)
  4306. {
  4307. $(Input).onkeydown = fnTrap;dDefaultBtn[Input.toLowerCase()] = $(Button);}
  4308. }
  4309. function fnTrap(e)
  4310. {
  4311. if (!e) var e = window.event;var keyCode = e.keyCode;var target = e.target;if(target && target.id)
  4312. {
  4313. for(var key in dDefaultBtn)
  4314. {
  4315. if (key == target.id.toLowerCase())
  4316. {
  4317. fnTrapKD(dDefaultBtn[key], e);}
  4318. }
  4319. }
  4320. }
  4321. function fnTrapKD(btn, event){
  4322. if (document.all){
  4323. if (event.keyCode == 13){
  4324. event.returnValue=false;event.cancel = true;btn.click();}
  4325. }
  4326. else if (document.getElementById){
  4327. if (event.which == 13){
  4328. event.returnValue=false;event.cancel = true;btn.click();}
  4329. }
  4330. else if(document.layers){
  4331. if(event.which == 13){
  4332. event.returnValue=false;event.cancel = true;btn.click();}
  4333. }
  4334. }
  4335. function AddRSS()
  4336. {
  4337. var e = $('RSS_XmlFile');var b = $('btn_RSS');if (e.value.length > 0)
  4338. {
  4339. myWidgets.AddRSS(e.value);b.disabled = true;b.value = "Please wait while we add this rss to your tab...";setTimeout("var e = $('RSS_XmlFile');var b = $('btn_RSS');b.disabled=false;b.value='Add RSS to this Tab';e.value = '';", 1500);}
  4340. else
  4341. {
  4342. alert("Please enter a RSS URL");}
  4343. }
  4344. function DoTip(Element, theTip)
  4345. {
  4346. Element.onmouseover = function() {Tip(theTip, BALLOON, true);}
  4347. Element.onmouseout = function() {UnTip();}
  4348. }
  4349. function execJS(node)
  4350. {
  4351. var bSaf = is_safari;var bOpera = is_opera;var bMoz = is_moz;if (!node) return;/* IE wants it uppercase */
  4352. var st = node.getElementsByTagName('SCRIPT');var strExec;var ItemsToRemove = new Array();for(var i=0;i<st.length; i++)
  4353. {
  4354. WriteHistory("Found: " + st[i]);if (st[i].src)
  4355. {
  4356. WriteHistory("SRC: " + st[i].src);var theSRC = st[i].src;st[i].src = "";var e = document.createElement('script');e.type = 'text/javascript';e.src = theSRC;var theParent = st[i].parentNode;if (theParent)
  4357. {
  4358. theParent.insertBefore(e, st[i]);WriteHistory("insert");theParent.removeChild(st[i]);WriteHistory("remove");}
  4359. }
  4360. else
  4361. {
  4362. if (bSaf) {
  4363. strExec = st[i].innerHTML;st[i].innerHTML = "";} else if (bOpera) {
  4364. strExec = st[i].text;st[i].text = "";} else if (bMoz) {
  4365. strExec = st[i].textContent;st[i].textContent = "";} else {
  4366. strExec = st[i].text;st[i].text = "";}
  4367. try {
  4368. installScript(strExec);/*
  4369. var x = document.createElement("script");x.type = "text/javascript";/* In IE we must use .text! */
  4370. /*
  4371. if ((bSaf) || (bOpera) || (bMoz))
  4372. x.innerHTML = strExec;else x.text = strExec;installScript(strExec);*/
  4373. } catch(e) {
  4374. alert(e);}
  4375. }
  4376. }
  4377. };var Q_event = {
  4378. target: function(e) {
  4379. if(e.target) return e.target;else if(e.srcElement) return e.srcElement;}
  4380. ,add: function(objct,type,fnctn) {
  4381. if (objct.addEventListener) {
  4382. objct.addEventListener(type,fnctn,false); return true;} else if (objct.attachEvent) {
  4383. var rtrn = objct.attachEvent('on'+type,fnctn); return rtrn;} else {
  4384. objct.onclick = fnctn; //objct['on'+type] = fnctn;
  4385. }
  4386. }
  4387. ,remove: function(objct,type,fnctn) {
  4388. if(objct.removeEventListener) {
  4389. objct.removeEventListener(type,fnctn,false); return true;} else if(objct.detachEvent) {
  4390. var rtrn = objct.detachEvent('on'+type,fnctn); return rtrn;} else {
  4391. objct.onclick = null; //objct['on'+type] = null;
  4392. }
  4393. }
  4394. };var Q_Drag = {
  4395. optn: null //resize_x|resize_y|resize_a
  4396. ,s_clntX: null
  4397. ,s_clntY: null
  4398. ,x_lmt : null
  4399. ,y_lmt : null
  4400. ,div_w: null
  4401. ,div_h: null
  4402. ,element:null
  4403. ,elements:null
  4404. ,WidgetID:null
  4405. ,dragstart: function() { return false; }
  4406. ,mousemove: function(e) {
  4407. if(!e) e = window.event;var delta_x = e.clientX-Q_Drag.s_clntX;var delta_y = e.clientY-Q_Drag.s_clntY;if(Q_Drag.optn=='resize_x' || Q_Drag.optn=='resize_a') {
  4408. var frst_x = Q_Drag.div_w+delta_x;if(0<frst_x && frst_x<Q_Drag.x_lmt) {
  4409. var tmp = Q_Drag.div_w+delta_x+'px';Q_Drag.element.style.width = tmp;for(var i=0;i<Q_Drag.elements.length;i++)
  4410. {
  4411. if (Q_Drag.elements[i])
  4412. Q_Drag.elements[i].style.width = tmp;}
  4413. }
  4414. }
  4415. if(Q_Drag.optn=='resize_y' || Q_Drag.optn=='resize_a') {
  4416. var frst_y = Q_Drag.div_h+delta_y;if(0< frst_y && frst_y<Q_Drag.y_lmt) {
  4417. var tmp = Q_Drag.div_h+delta_y+'px';Q_Drag.element.style.height = tmp;for(var i=0;i<Q_Drag.elements.length;i++)
  4418. {
  4419. if (Q_Drag.elements[i])
  4420. Q_Drag.elements[i].style.height = tmp;}
  4421. }
  4422. }
  4423. }
  4424. ,mouseup: function(e) {
  4425. var theHeight = Q_Drag.element.style.height;var theWidget = $WI(Q_Drag.WidgetID);if (theWidget.ResizeHeightComplete)
  4426. theWidget.ResizeHeightComplete(theHeight);theWidget.SaveHeight(theHeight);Q_event.remove(document,'mousemove',Q_Drag.mousemove);Q_event.remove(document,'mouseup' ,Q_Drag.mouseup);}
  4427. ,start: function(e,optn, element, WidgetID) {
  4428. Q_Drag.optn = optn;Q_Drag.s_clntX = e.clientX;Q_Drag.s_clntY = e.clientY;Q_Drag.WidgetID = WidgetID;Q_Drag.elements = new Array();if (element.indexOf("|") > -1)
  4429. {
  4430. var i =0;var Elements = element.split("|");for(var i=0;i<Elements.length;i++)
  4431. {
  4432. var ElementItem = Elements[i];if (i==0)
  4433. {
  4434. Q_Drag.element = $get(ElementItem);}
  4435. else
  4436. {
  4437. Q_Drag.elements.push($get(ElementItem));}
  4438. }
  4439. }
  4440. else
  4441. {
  4442. Q_Drag.element = document.getElementById(element);}
  4443. Q_Drag.div_w = getElementWidth(Q_Drag.element);Q_Drag.div_h = getElementHeight(Q_Drag.element);Q_Drag.x_lmt = 32767;Q_Drag.y_lmt = 32767;if(e.srcElement) Q_event.add(e.srcElement,'dragstart',Q_Drag.dragstart);Q_event.add(document,'mousemove',Q_Drag.mousemove);Q_event.add(document,'mouseup' ,Q_Drag.mouseup);}
  4444. };installScriptSrc_UpdateDict('/js/ieupdate.js');installScriptSrc_UpdateDict('/js/scriptaculous/prototype.js');installScriptSrc_UpdateDict('/js/scriptaculous/effects.js');installScriptSrc_UpdateDict('/js/scriptaculous/dragdrop.js');installScriptSrc_UpdateDict('/js/scriptaculous/controls.js');installScriptSrc_UpdateDict('/js/browser.js');installScriptSrc_UpdateDict('/js/rsa.js');installScriptSrc_UpdateDict('/js/scripts.js');installScriptSrc_UpdateDict('/js/XmlObjtree.js');installScriptSrc_UpdateDict('/js/Generics.js');installScriptSrc_UpdateDict('/js/dragresize.js');