/* Prototype JavaScript framework, version 1.7 * (c) 2005-2010 Sam Stephenson * * Prototype is freely distributable under the terms of an MIT-style license. * For details, see the Prototype web site: http://www.prototypejs.org/ * *--------------------------------------------------------------------------*/ var Prototype = { Version: '1.7', Browser: (function(){ var ua = navigator.userAgent; var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; return { IE: !!window.attachEvent && !isOpera, Opera: isOpera, WebKit: ua.indexOf('AppleWebKit/') > -1, Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, MobileSafari: /Apple.*Mobile/.test(ua) } })(), BrowserFeatures: { XPath: !!document.evaluate, SelectorsAPI: !!document.querySelector, ElementExtensions: (function() { var constructor = window.Element || window.HTMLElement; return !!(constructor && constructor.prototype); })(), SpecificElementExtensions: (function() { if (typeof window.HTMLDivElement !== 'undefined') return true; var div = document.createElement('div'), form = document.createElement('form'), isSupported = false; if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { isSupported = true; } div = form = null; return isSupported; })() }, ScriptFragment: ']*>([\\S\\s]*?)<\/script>', JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, emptyFunction: function() { }, K: function(x) { return x } }; if (Prototype.Browser.MobileSafari) Prototype.BrowserFeatures.SpecificElementExtensions = false; var Abstract = { }; var Try = { these: function() { var returnValue; for (var i = 0, length = arguments.length; i < length; i++) { var lambda = arguments[i]; try { returnValue = lambda(); break; } catch (e) { } } return returnValue; } }; /* Based on Alex Arnell's inheritance implementation. */ var Class = (function() { var IS_DONTENUM_BUGGY = (function(){ for (var p in { toString: 1 }) { if (p === 'toString') return false; } return true; })(); function subclass() {}; function create() { var parent = null, properties = $A(arguments); if (Object.isFunction(properties[0])) parent = properties.shift(); function klass() { this.initialize.apply(this, arguments); } Object.extend(klass, Class.Methods); klass.superclass = parent; klass.subclasses = []; if (parent) { subclass.prototype = parent.prototype; klass.prototype = new subclass; parent.subclasses.push(klass); } for (var i = 0, length = properties.length; i < length; i++) klass.addMethods(properties[i]); if (!klass.prototype.initialize) klass.prototype.initialize = Prototype.emptyFunction; klass.prototype.constructor = klass; return klass; } function addMethods(source) { var ancestor = this.superclass && this.superclass.prototype, properties = Object.keys(source); if (IS_DONTENUM_BUGGY) { if (source.toString != Object.prototype.toString) properties.push("toString"); if (source.valueOf != Object.prototype.valueOf) properties.push("valueOf"); } for (var i = 0, length = properties.length; i < length; i++) { var property = properties[i], value = source[property]; if (ancestor && Object.isFunction(value) && value.argumentNames()[0] == "$super") { var method = value; value = (function(m) { return function() { return ancestor[m].apply(this, arguments); }; })(property).wrap(method); value.valueOf = method.valueOf.bind(method); value.toString = method.toString.bind(method); } this.prototype[property] = value; } return this; } return { create: create, Methods: { addMethods: addMethods } }; })(); (function() { var _toString = Object.prototype.toString, NULL_TYPE = 'Null', UNDEFINED_TYPE = 'Undefined', BOOLEAN_TYPE = 'Boolean', NUMBER_TYPE = 'Number', STRING_TYPE = 'String', OBJECT_TYPE = 'Object', FUNCTION_CLASS = '[object Function]', BOOLEAN_CLASS = '[object Boolean]', NUMBER_CLASS = '[object Number]', STRING_CLASS = '[object String]', ARRAY_CLASS = '[object Array]', DATE_CLASS = '[object Date]', NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON && typeof JSON.stringify === 'function' && JSON.stringify(0) === '0' && typeof JSON.stringify(Prototype.K) === 'undefined'; function Type(o) { switch(o) { case null: return NULL_TYPE; case (void 0): return UNDEFINED_TYPE; } var type = typeof o; switch(type) { case 'boolean': return BOOLEAN_TYPE; case 'number': return NUMBER_TYPE; case 'string': return STRING_TYPE; } return OBJECT_TYPE; } function extend(destination, source) { for (var property in source) destination[property] = source[property]; return destination; } function inspect(object) { try { if (isUndefined(object)) return 'undefined'; if (object === null) return 'null'; return object.inspect ? object.inspect() : String(object); } catch (e) { if (e instanceof RangeError) return '...'; throw e; } } function toJSON(value) { return Str('', { '': value }, []); } function Str(key, holder, stack) { var value = holder[key], type = typeof value; if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') { value = value.toJSON(key); } var _class = _toString.call(value); switch (_class) { case NUMBER_CLASS: case BOOLEAN_CLASS: case STRING_CLASS: value = value.valueOf(); } switch (value) { case null: return 'null'; case true: return 'true'; case false: return 'false'; } type = typeof value; switch (type) { case 'string': return value.inspect(true); case 'number': return isFinite(value) ? String(value) : 'null'; case 'object': for (var i = 0, length = stack.length; i < length; i++) { if (stack[i] === value) { throw new TypeError(); } } stack.push(value); var partial = []; if (_class === ARRAY_CLASS) { for (var i = 0, length = value.length; i < length; i++) { var str = Str(i, value, stack); partial.push(typeof str === 'undefined' ? 'null' : str); } partial = '[' + partial.join(',') + ']'; } else { var keys = Object.keys(value); for (var i = 0, length = keys.length; i < length; i++) { var key = keys[i], str = Str(key, value, stack); if (typeof str !== "undefined") { partial.push(key.inspect(true)+ ':' + str); } } partial = '{' + partial.join(',') + '}'; } stack.pop(); return partial; } } function stringify(object) { return JSON.stringify(object); } function toQueryString(object) { return $H(object).toQueryString(); } function toHTML(object) { return object && object.toHTML ? object.toHTML() : String.interpret(object); } function keys(object) { if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); } var results = []; for (var property in object) { if (object.hasOwnProperty(property)) { results.push(property); } } return results; } function values(object) { var results = []; for (var property in object) results.push(object[property]); return results; } function clone(object) { return extend({ }, object); } function isElement(object) { return !!(object && object.nodeType == 1); } function isArray(object) { return _toString.call(object) === ARRAY_CLASS; } var hasNativeIsArray = (typeof Array.isArray == 'function') && Array.isArray([]) && !Array.isArray({}); if (hasNativeIsArray) { isArray = Array.isArray; } function isHash(object) { return object instanceof Hash; } function isFunction(object) { return _toString.call(object) === FUNCTION_CLASS; } function isString(object) { return _toString.call(object) === STRING_CLASS; } function isNumber(object) { return _toString.call(object) === NUMBER_CLASS; } function isDate(object) { return _toString.call(object) === DATE_CLASS; } function isUndefined(object) { return typeof object === "undefined"; } extend(Object, { extend: extend, inspect: inspect, toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON, toQueryString: toQueryString, toHTML: toHTML, keys: Object.keys || keys, values: values, clone: clone, isElement: isElement, isArray: isArray, isHash: isHash, isFunction: isFunction, isString: isString, isNumber: isNumber, isDate: isDate, isUndefined: isUndefined }); })(); Object.extend(Function.prototype, (function() { var slice = Array.prototype.slice; function update(array, args) { var arrayLength = array.length, length = args.length; while (length--) array[arrayLength + length] = args[length]; return array; } function merge(array, args) { array = slice.call(array, 0); return update(array, args); } function argumentNames() { var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') .replace(/\s+/g, '').split(','); return names.length == 1 && !names[0] ? [] : names; } function bind(context) { if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; var __method = this, args = slice.call(arguments, 1); return function() { var a = merge(args, arguments); return __method.apply(context, a); } } function bindAsEventListener(context) { var __method = this, args = slice.call(arguments, 1); return function(event) { var a = update([event || window.event], args); return __method.apply(context, a); } } function curry() { if (!arguments.length) return this; var __method = this, args = slice.call(arguments, 0); return function() { var a = merge(args, arguments); return __method.apply(this, a); } } function delay(timeout) { var __method = this, args = slice.call(arguments, 1); timeout = timeout * 1000; return window.setTimeout(function() { return __method.apply(__method, args); }, timeout); } function defer() { var args = update([0.01], arguments); return this.delay.apply(this, args); } function wrap(wrapper) { var __method = this; return function() { var a = update([__method.bind(this)], arguments); return wrapper.apply(this, a); } } function methodize() { if (this._methodized) return this._methodized; var __method = this; return this._methodized = function() { var a = update([this], arguments); return __method.apply(null, a); }; } return { argumentNames: argumentNames, bind: bind, bindAsEventListener: bindAsEventListener, curry: curry, delay: delay, defer: defer, wrap: wrap, methodize: methodize } })()); (function(proto) { function toISOString() { return this.getUTCFullYear() + '-' + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + this.getUTCDate().toPaddedString(2) + 'T' + this.getUTCHours().toPaddedString(2) + ':' + this.getUTCMinutes().toPaddedString(2) + ':' + this.getUTCSeconds().toPaddedString(2) + 'Z'; } function toJSON() { return this.toISOString(); } if (!proto.toISOString) proto.toISOString = toISOString; if (!proto.toJSON) proto.toJSON = toJSON; })(Date.prototype); RegExp.prototype.match = RegExp.prototype.test; RegExp.escape = function(str) { return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); }; var PeriodicalExecuter = Class.create({ initialize: function(callback, frequency) { this.callback = callback; this.frequency = frequency; this.currentlyExecuting = false; this.registerCallback(); }, registerCallback: function() { this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, execute: function() { this.callback(this); }, stop: function() { if (!this.timer) return; clearInterval(this.timer); this.timer = null; }, onTimerEvent: function() { if (!this.currentlyExecuting) { try { this.currentlyExecuting = true; this.execute(); this.currentlyExecuting = false; } catch(e) { this.currentlyExecuting = false; throw e; } } } }); Object.extend(String, { interpret: function(value) { return value == null ? '' : String(value); }, specialChar: { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\\': '\\\\' } }); Object.extend(String.prototype, (function() { var NATIVE_JSON_PARSE_SUPPORT = window.JSON && typeof JSON.parse === 'function' && JSON.parse('{"test": true}').test; function prepareReplacement(replacement) { if (Object.isFunction(replacement)) return replacement; var template = new Template(replacement); return function(match) { return template.evaluate(match) }; } function gsub(pattern, replacement) { var result = '', source = this, match; replacement = prepareReplacement(replacement); if (Object.isString(pattern)) pattern = RegExp.escape(pattern); if (!(pattern.length || pattern.source)) { replacement = replacement(''); return replacement + source.split('').join(replacement) + replacement; } while (source.length > 0) { if (match = source.match(pattern)) { result += source.slice(0, match.index); result += String.interpret(replacement(match)); source = source.slice(match.index + match[0].length); } else { result += source, source = ''; } } return result; } function sub(pattern, replacement, count) { replacement = prepareReplacement(replacement); count = Object.isUndefined(count) ? 1 : count; return this.gsub(pattern, function(match) { if (--count < 0) return match[0]; return replacement(match); }); } function scan(pattern, iterator) { this.gsub(pattern, iterator); return String(this); } function truncate(length, truncation) { length = length || 30; truncation = Object.isUndefined(truncation) ? '...' : truncation; return this.length > length ? this.slice(0, length - truncation.length) + truncation : String(this); } function strip() { return this.replace(/^\s+/, '').replace(/\s+$/, ''); } function stripTags() { return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, ''); } function stripScripts() { return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); } function extractScripts() { var matchAll = new RegExp(Prototype.ScriptFragment, 'img'), matchOne = new RegExp(Prototype.ScriptFragment, 'im'); return (this.match(matchAll) || []).map(function(scriptTag) { return (scriptTag.match(matchOne) || ['', ''])[1]; }); } function evalScripts() { return this.extractScripts().map(function(script) { return eval(script) }); } function escapeHTML() { return this.replace(/&/g,'&').replace(//g,'>'); } function unescapeHTML() { return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&'); } function toQueryParams(separator) { var match = this.strip().match(/([^?#]*)(#.*)?$/); if (!match) return { }; return match[1].split(separator || '&').inject({ }, function(hash, pair) { if ((pair = pair.split('='))[0]) { var key = decodeURIComponent(pair.shift()), value = pair.length > 1 ? pair.join('=') : pair[0]; if (value != undefined) value = decodeURIComponent(value); if (key in hash) { if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; hash[key].push(value); } else hash[key] = value; } return hash; }); } function toArray() { return this.split(''); } function succ() { return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); } function times(count) { return count < 1 ? '' : new Array(count + 1).join(this); } function camelize() { return this.replace(/-+(.)?/g, function(match, chr) { return chr ? chr.toUpperCase() : ''; }); } function capitalize() { return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); } function underscore() { return this.replace(/::/g, '/') .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') .replace(/([a-z\d])([A-Z])/g, '$1_$2') .replace(/-/g, '_') .toLowerCase(); } function dasherize() { return this.replace(/_/g, '-'); } function inspect(useDoubleQuotes) { var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { if (character in String.specialChar) { return String.specialChar[character]; } return '\\u00' + character.charCodeAt().toPaddedString(2, 16); }); if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; return "'" + escapedString.replace(/'/g, '\\\'') + "'"; } function unfilterJSON(filter) { return this.replace(filter || Prototype.JSONFilter, '$1'); } function isJSON() { var str = this; if (str.blank()) return false; str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); return (/^[\],:{}\s]*$/).test(str); } function evalJSON(sanitize) { var json = this.unfilterJSON(), cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; if (cx.test(json)) { json = json.replace(cx, function (a) { return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }); } try { if (!sanitize || json.isJSON()) return eval('(' + json + ')'); } catch (e) { } throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); } function parseJSON() { var json = this.unfilterJSON(); return JSON.parse(json); } function include(pattern) { return this.indexOf(pattern) > -1; } function startsWith(pattern) { return this.lastIndexOf(pattern, 0) === 0; } function endsWith(pattern) { var d = this.length - pattern.length; return d >= 0 && this.indexOf(pattern, d) === d; } function empty() { return this == ''; } function blank() { return /^\s*$/.test(this); } function interpolate(object, pattern) { return new Template(this, pattern).evaluate(object); } return { gsub: gsub, sub: sub, scan: scan, truncate: truncate, strip: String.prototype.trim || strip, stripTags: stripTags, stripScripts: stripScripts, extractScripts: extractScripts, evalScripts: evalScripts, escapeHTML: escapeHTML, unescapeHTML: unescapeHTML, toQueryParams: toQueryParams, parseQuery: toQueryParams, toArray: toArray, succ: succ, times: times, camelize: camelize, capitalize: capitalize, underscore: underscore, dasherize: dasherize, inspect: inspect, unfilterJSON: unfilterJSON, isJSON: isJSON, evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON, include: include, startsWith: startsWith, endsWith: endsWith, empty: empty, blank: blank, interpolate: interpolate }; })()); var Template = Class.create({ initialize: function(template, pattern) { this.template = template.toString(); this.pattern = pattern || Template.Pattern; }, evaluate: function(object) { if (object && Object.isFunction(object.toTemplateReplacements)) object = object.toTemplateReplacements(); return this.template.gsub(this.pattern, function(match) { if (object == null) return (match[1] + ''); var before = match[1] || ''; if (before == '\\') return match[2]; var ctx = object, expr = match[3], pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; match = pattern.exec(expr); if (match == null) return before; while (match != null) { var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; ctx = ctx[comp]; if (null == ctx || '' == match[3]) break; expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); match = pattern.exec(expr); } return before + String.interpret(ctx); }); } }); Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; var $break = { }; var Enumerable = (function() { function each(iterator, context) { var index = 0; try { this._each(function(value) { iterator.call(context, value, index++); }); } catch (e) { if (e != $break) throw e; } return this; } function eachSlice(number, iterator, context) { var index = -number, slices = [], array = this.toArray(); if (number < 1) return array; while ((index += number) < array.length) slices.push(array.slice(index, index+number)); return slices.collect(iterator, context); } function all(iterator, context) { iterator = iterator || Prototype.K; var result = true; this.each(function(value, index) { result = result && !!iterator.call(context, value, index); if (!result) throw $break; }); return result; } function any(iterator, context) { iterator = iterator || Prototype.K; var result = false; this.each(function(value, index) { if (result = !!iterator.call(context, value, index)) throw $break; }); return result; } function collect(iterator, context) { iterator = iterator || Prototype.K; var results = []; this.each(function(value, index) { results.push(iterator.call(context, value, index)); }); return results; } function detect(iterator, context) { var result; this.each(function(value, index) { if (iterator.call(context, value, index)) { result = value; throw $break; } }); return result; } function findAll(iterator, context) { var results = []; this.each(function(value, index) { if (iterator.call(context, value, index)) results.push(value); }); return results; } function grep(filter, iterator, context) { iterator = iterator || Prototype.K; var results = []; if (Object.isString(filter)) filter = new RegExp(RegExp.escape(filter)); this.each(function(value, index) { if (filter.match(value)) results.push(iterator.call(context, value, index)); }); return results; } function include(object) { if (Object.isFunction(this.indexOf)) if (this.indexOf(object) != -1) return true; var found = false; this.each(function(value) { if (value == object) { found = true; throw $break; } }); return found; } function inGroupsOf(number, fillWith) { fillWith = Object.isUndefined(fillWith) ? null : fillWith; return this.eachSlice(number, function(slice) { while(slice.length < number) slice.push(fillWith); return slice; }); } function inject(memo, iterator, context) { this.each(function(value, index) { memo = iterator.call(context, memo, value, index); }); return memo; } function invoke(method) { var args = $A(arguments).slice(1); return this.map(function(value) { return value[method].apply(value, args); }); } function max(iterator, context) { iterator = iterator || Prototype.K; var result; this.each(function(value, index) { value = iterator.call(context, value, index); if (result == null || value >= result) result = value; }); return result; } function min(iterator, context) { iterator = iterator || Prototype.K; var result; this.each(function(value, index) { value = iterator.call(context, value, index); if (result == null || value < result) result = value; }); return result; } function partition(iterator, context) { iterator = iterator || Prototype.K; var trues = [], falses = []; this.each(function(value, index) { (iterator.call(context, value, index) ? trues : falses).push(value); }); return [trues, falses]; } function pluck(property) { var results = []; this.each(function(value) { results.push(value[property]); }); return results; } function reject(iterator, context) { var results = []; this.each(function(value, index) { if (!iterator.call(context, value, index)) results.push(value); }); return results; } function sortBy(iterator, context) { return this.map(function(value, index) { return { value: value, criteria: iterator.call(context, value, index) }; }).sort(function(left, right) { var a = left.criteria, b = right.criteria; return a < b ? -1 : a > b ? 1 : 0; }).pluck('value'); } function toArray() { return this.map(); } function zip() { var iterator = Prototype.K, args = $A(arguments); if (Object.isFunction(args.last())) iterator = args.pop(); var collections = [this].concat(args).map($A); return this.map(function(value, index) { return iterator(collections.pluck(index)); }); } function size() { return this.toArray().length; } function inspect() { return '#'; } return { each: each, eachSlice: eachSlice, all: all, every: all, any: any, some: any, collect: collect, map: collect, detect: detect, findAll: findAll, select: findAll, filter: findAll, grep: grep, include: include, member: include, inGroupsOf: inGroupsOf, inject: inject, invoke: invoke, max: max, min: min, partition: partition, pluck: pluck, reject: reject, sortBy: sortBy, toArray: toArray, entries: toArray, zip: zip, size: size, inspect: inspect, find: detect }; })(); function $A(iterable) { if (!iterable) return []; if ('toArray' in Object(iterable)) return iterable.toArray(); var length = iterable.length || 0, results = new Array(length); while (length--) results[length] = iterable[length]; return results; } function $w(string) { if (!Object.isString(string)) return []; string = string.strip(); return string ? string.split(/\s+/) : []; } Array.from = $A; (function() { var arrayProto = Array.prototype, slice = arrayProto.slice, _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available function each(iterator, context) { for (var i = 0, length = this.length >>> 0; i < length; i++) { if (i in this) iterator.call(context, this[i], i, this); } } if (!_each) _each = each; function clear() { this.length = 0; return this; } function first() { return this[0]; } function last() { return this[this.length - 1]; } function compact() { return this.select(function(value) { return value != null; }); } function flatten() { return this.inject([], function(array, value) { if (Object.isArray(value)) return array.concat(value.flatten()); array.push(value); return array; }); } function without() { var values = slice.call(arguments, 0); return this.select(function(value) { return !values.include(value); }); } function reverse(inline) { return (inline === false ? this.toArray() : this)._reverse(); } function uniq(sorted) { return this.inject([], function(array, value, index) { if (0 == index || (sorted ? array.last() != value : !array.include(value))) array.push(value); return array; }); } function intersect(array) { return this.uniq().findAll(function(item) { return array.detect(function(value) { return item === value }); }); } function clone() { return slice.call(this, 0); } function size() { return this.length; } function inspect() { return '[' + this.map(Object.inspect).join(', ') + ']'; } function indexOf(item, i) { i || (i = 0); var length = this.length; if (i < 0) i = length + i; for (; i < length; i++) if (this[i] === item) return i; return -1; } function lastIndexOf(item, i) { i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; var n = this.slice(0, i).reverse().indexOf(item); return (n < 0) ? n : i - n - 1; } function concat() { var array = slice.call(this, 0), item; for (var i = 0, length = arguments.length; i < length; i++) { item = arguments[i]; if (Object.isArray(item) && !('callee' in item)) { for (var j = 0, arrayLength = item.length; j < arrayLength; j++) array.push(item[j]); } else { array.push(item); } } return array; } Object.extend(arrayProto, Enumerable); if (!arrayProto._reverse) arrayProto._reverse = arrayProto.reverse; Object.extend(arrayProto, { _each: _each, clear: clear, first: first, last: last, compact: compact, flatten: flatten, without: without, reverse: reverse, uniq: uniq, intersect: intersect, clone: clone, toArray: clone, size: size, inspect: inspect }); var CONCAT_ARGUMENTS_BUGGY = (function() { return [].concat(arguments)[0][0] !== 1; })(1,2) if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; })(); function $H(object) { return new Hash(object); }; var Hash = Class.create(Enumerable, (function() { function initialize(object) { this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); } function _each(iterator) { for (var key in this._object) { var value = this._object[key], pair = [key, value]; pair.key = key; pair.value = value; iterator(pair); } } function set(key, value) { return this._object[key] = value; } function get(key) { if (this._object[key] !== Object.prototype[key]) return this._object[key]; } function unset(key) { var value = this._object[key]; delete this._object[key]; return value; } function toObject() { return Object.clone(this._object); } function keys() { return this.pluck('key'); } function values() { return this.pluck('value'); } function index(value) { var match = this.detect(function(pair) { return pair.value === value; }); return match && match.key; } function merge(object) { return this.clone().update(object); } function update(object) { return new Hash(object).inject(this, function(result, pair) { result.set(pair.key, pair.value); return result; }); } function toQueryPair(key, value) { if (Object.isUndefined(value)) return key; return key + '=' + encodeURIComponent(String.interpret(value)); } function toQueryString() { return this.inject([], function(results, pair) { var key = encodeURIComponent(pair.key), values = pair.value; if (values && typeof values == 'object') { if (Object.isArray(values)) { var queryValues = []; for (var i = 0, len = values.length, value; i < len; i++) { value = values[i]; queryValues.push(toQueryPair(key, value)); } return results.concat(queryValues); } } else results.push(toQueryPair(key, values)); return results; }).join('&'); } function inspect() { return '#'; } function clone() { return new Hash(this); } return { initialize: initialize, _each: _each, set: set, get: get, unset: unset, toObject: toObject, toTemplateReplacements: toObject, keys: keys, values: values, index: index, merge: merge, update: update, toQueryString: toQueryString, inspect: inspect, toJSON: toObject, clone: clone }; })()); Hash.from = $H; Object.extend(Number.prototype, (function() { function toColorPart() { return this.toPaddedString(2, 16); } function succ() { return this + 1; } function times(iterator, context) { $R(0, this, true).each(iterator, context); return this; } function toPaddedString(length, radix) { var string = this.toString(radix || 10); return '0'.times(length - string.length) + string; } function abs() { return Math.abs(this); } function round() { return Math.round(this); } function ceil() { return Math.ceil(this); } function floor() { return Math.floor(this); } return { toColorPart: toColorPart, succ: succ, times: times, toPaddedString: toPaddedString, abs: abs, round: round, ceil: ceil, floor: floor }; })()); function $R(start, end, exclusive) { return new ObjectRange(start, end, exclusive); } var ObjectRange = Class.create(Enumerable, (function() { function initialize(start, end, exclusive) { this.start = start; this.end = end; this.exclusive = exclusive; } function _each(iterator) { var value = this.start; while (this.include(value)) { iterator(value); value = value.succ(); } } function include(value) { if (value < this.start) return false; if (this.exclusive) return value < this.end; return value <= this.end; } return { initialize: initialize, _each: _each, include: include }; })()); var Ajax = { getTransport: function() { return Try.these( function() {return new XMLHttpRequest()}, function() {return new ActiveXObject('Msxml2.XMLHTTP')}, function() {return new ActiveXObject('Microsoft.XMLHTTP')} ) || false; }, activeRequestCount: 0 }; Ajax.Responders = { responders: [], _each: function(iterator) { this.responders._each(iterator); }, register: function(responder) { if (!this.include(responder)) this.responders.push(responder); }, unregister: function(responder) { this.responders = this.responders.without(responder); }, dispatch: function(callback, request, transport, json) { this.each(function(responder) { if (Object.isFunction(responder[callback])) { try { responder[callback].apply(responder, [request, transport, json]); } catch (e) { } } }); } }; Object.extend(Ajax.Responders, Enumerable); Ajax.Responders.register({ onCreate: function() { Ajax.activeRequestCount++ }, onComplete: function() { Ajax.activeRequestCount-- } }); Ajax.Base = Class.create({ initialize: function(options) { this.options = { method: 'post', asynchronous: true, contentType: 'application/x-www-form-urlencoded', encoding: 'UTF-8', parameters: '', evalJSON: true, evalJS: true }; Object.extend(this.options, options || { }); this.options.method = this.options.method.toLowerCase(); if (Object.isHash(this.options.parameters)) this.options.parameters = this.options.parameters.toObject(); } }); Ajax.Request = Class.create(Ajax.Base, { _complete: false, _abort:false, initialize: function($super, url, options) { this.skipCustomHeader = options.skipCustomHeader||false; $super(options); this.transport = Ajax.getTransport(); this.request(url); }, cancel: function() { this._abort = true; this.transport.abort(); }, request: function(url) { this.url = url; this.method = this.options.method; var params = Object.isString(this.options.parameters) ? this.options.parameters : Object.toQueryString(this.options.parameters); if (!['get', 'post'].include(this.method)) { params += (params ? '&' : '') + "_method=" + this.method; this.method = 'post'; } if (params && this.method === 'get') { this.url += (this.url.include('?') ? '&' : '?') + params; } this.parameters = params.toQueryParams(); try { var response = new Ajax.Response(this); if (this.options.onCreate) this.options.onCreate(response); Ajax.Responders.dispatch('onCreate', this, response); this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous); if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); this.transport.onreadystatechange = this.onStateChange.bind(this); this.setRequestHeaders(); this.body = this.method == 'post' ? (this.options.postBody || params) : null; this.transport.send(this.body); /* Force Firefox to handle ready state 4 for synchronous requests */ if (!this.options.asynchronous && this.transport.overrideMimeType) this.onStateChange(); } catch (e) { this.dispatchException(e); } }, onStateChange: function() { var readyState = this.transport.readyState; if (readyState > 1 && !((readyState == 4) && this._complete)) this.respondToReadyState(this.transport.readyState); }, setRequestHeaders: function() { var headers = { 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' }; if(!this.skipCustomHeader) { headers['X-Requested-With'] = 'XMLHttpRequest'; headers['X-Prototype-Version'] = Prototype.Version; } if (this.method == 'post') { headers['Content-type'] = this.options.contentType + (this.options.encoding ? '; charset=' + this.options.encoding : ''); /* Force "Connection: close" for older Mozilla browsers to work * around a bug where XMLHttpRequest sends an incorrect * Content-length header. See Mozilla Bugzilla #246651. */ if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) headers['Connection'] = 'close'; } if (typeof this.options.requestHeaders == 'object') { var extras = this.options.requestHeaders; if (Object.isFunction(extras.push)) for (var i = 0, length = extras.length; i < length; i += 2) headers[extras[i]] = extras[i+1]; else $H(extras).each(function(pair) { headers[pair.key] = pair.value }); } for (var name in headers) this.transport.setRequestHeader(name, headers[name]); }, success: function() { var status = this.getStatus(); return !status || (status >= 200 && status < 300) || status == 304; }, getStatus: function() { try { if (this.transport.status === 1223) return 204; return this.transport.status || 0; } catch (e) { return 0 } }, respondToReadyState: function(readyState) { var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); if (state == 'Complete') { try { this._complete = true; (this.options['on' + response.status] || this.options['on' + (this.success()&&!this._abort ? 'Success' : 'Failure')] || Prototype.emptyFunction)(response, response.headerJSON); } catch (e) { this.dispatchException(e); } var contentType = response.getHeader('Content-type'); if (this.options.evalJS == 'force' || (this.options.evalJS && this.isSameOrigin() && contentType && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) this.evalResponse(); } try { (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); } catch (e) { this.dispatchException(e); } if (state == 'Complete') { this.transport.onreadystatechange = Prototype.emptyFunction; } }, isSameOrigin: function() { var m = this.url.match(/^\s*https?:\/\/[^\/]*/); return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ protocol: location.protocol, domain: document.domain, port: location.port ? ':' + location.port : '' })); }, getHeader: function(name) { try { return this.transport.getResponseHeader(name) || null; } catch (e) { return null; } }, evalResponse: function() { try { return eval((this.transport.responseText || '').unfilterJSON()); } catch (e) { this.dispatchException(e); } }, dispatchException: function(exception) { (this.options.onException || Prototype.emptyFunction)(this, exception); Ajax.Responders.dispatch('onException', this, exception); } }); Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; Ajax.Response = Class.create({ initialize: function(request){ this.request = request; var transport = this.transport = request.transport, readyState = this.readyState = transport.readyState; if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { this.status = this.getStatus(); this.statusText = this.getStatusText(); this.responseText = String.interpret(transport.responseText); this.headerJSON = this._getHeaderJSON(); } if (readyState == 4) { var xml = transport.responseXML; this.responseXML = Object.isUndefined(xml) ? null : xml; this.responseJSON = this._getResponseJSON(); } }, status: 0, statusText: '', getStatus: Ajax.Request.prototype.getStatus, getStatusText: function() { try { return this.transport.statusText || ''; } catch (e) { return '' } }, getHeader: Ajax.Request.prototype.getHeader, getAllHeaders: function() { try { return this.getAllResponseHeaders(); } catch (e) { return null } }, getResponseHeader: function(name) { return this.transport.getResponseHeader(name); }, getAllResponseHeaders: function() { return this.transport.getAllResponseHeaders(); }, _getHeaderJSON: function() { var json = this.getHeader('X-JSON'); if (!json) return null; json = decodeURIComponent(escape(json)); try { return json.evalJSON(this.request.options.sanitizeJSON || !this.request.isSameOrigin()); } catch (e) { this.request.dispatchException(e); } }, _getResponseJSON: function() { var options = this.request.options; if (!options.evalJSON || (options.evalJSON != 'force' && !(this.getHeader('Content-type') || '').include('application/json')) || this.responseText.blank()) return null; try { return this.responseText.evalJSON(options.sanitizeJSON || !this.request.isSameOrigin()); } catch (e) { this.request.dispatchException(e); } } }); Ajax.Updater = Class.create(Ajax.Request, { initialize: function($super, container, url, options) { this.container = { success: (container.success || container), failure: (container.failure || (container.success ? null : container)) }; options = Object.clone(options); var onComplete = options.onComplete; options.onComplete = (function(response, json) { this.updateContent(response.responseText); if (Object.isFunction(onComplete)) onComplete(response, json); }).bind(this); $super(url, options); }, updateContent: function(responseText) { var receiver = this.container[this.success() ? 'success' : 'failure'], options = this.options; if (!options.evalScripts) responseText = responseText.stripScripts(); if (receiver = $(receiver)) { if (options.insertion) { if (Object.isString(options.insertion)) { var insertion = { }; insertion[options.insertion] = responseText; receiver.insert(insertion); } else options.insertion(receiver, responseText); } else receiver.update(responseText); } } }); Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { initialize: function($super, container, url, options) { $super(options); this.onComplete = this.options.onComplete; this.frequency = (this.options.frequency || 2); this.decay = (this.options.decay || 1); this.updater = { }; this.container = container; this.url = url; this.start(); }, start: function() { this.options.onComplete = this.updateComplete.bind(this); this.onTimerEvent(); }, stop: function() { this.updater.options.onComplete = undefined; clearTimeout(this.timer); (this.onComplete || Prototype.emptyFunction).apply(this, arguments); }, updateComplete: function(response) { if (this.options.decay) { this.decay = (response.responseText == this.lastText ? this.decay * this.options.decay : 1); this.lastText = response.responseText; } this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); }, onTimerEvent: function() { this.updater = new Ajax.Updater(this.container, this.url, this.options); } }); function $(element) { if (arguments.length > 1) { for (var i = 0, elements = [], length = arguments.length; i < length; i++) elements.push($(arguments[i])); return elements; } if (Object.isString(element)) element = document.getElementById(element); return Element.extend(element); } if (Prototype.BrowserFeatures.XPath) { document._getElementsByXPath = function(expression, parentElement) { var results = []; var query = document.evaluate(expression, $(parentElement) || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0, length = query.snapshotLength; i < length; i++) results.push(Element.extend(query.snapshotItem(i))); return results; }; } /*--------------------------------------------------------------------------*/ if (!Node) var Node = { }; if (!Node.ELEMENT_NODE) { Object.extend(Node, { ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12 }); } (function(global) { function shouldUseCache(tagName, attributes) { if (tagName === 'select') return false; if ('type' in attributes) return false; return true; } var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){ try { var el = document.createElement(''); return el.tagName.toLowerCase() === 'input' && el.name === 'x'; } catch(err) { return false; } })(); var element = global.Element; global.Element = function(tagName, attributes) { attributes = attributes || { }; tagName = tagName.toLowerCase(); var cache = Element.cache; if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) { tagName = '<' + tagName + ' name="' + attributes.name + '">'; delete attributes.name; return Element.writeAttribute(document.createElement(tagName), attributes); } if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); var node = shouldUseCache(tagName, attributes) ? cache[tagName].cloneNode(false) : document.createElement(tagName); return Element.writeAttribute(node, attributes); }; Object.extend(global.Element, element || { }); if (element) global.Element.prototype = element.prototype; })(this); Element.idCounter = 1; Element.cache = { }; Element._purgeElement = function(element) { var uid = element._prototypeUID; if (uid) { Element.stopObserving(element); element._prototypeUID = void 0; delete Element.Storage[uid]; } } Element.Methods = { visible: function(element) { return $(element).style.display != 'none'; }, toggle: function(element) { element = $(element); Element[Element.visible(element) ? 'hide' : 'show'](element); return element; }, hide: function(element) { element = $(element); element.style.display = 'none'; return element; }, show: function(element) { element = $(element); element.style.display = ''; return element; }, remove: function(element) { element = $(element); element.parentNode.removeChild(element); return element; }, update: (function(){ var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ var el = document.createElement("select"), isBuggy = true; el.innerHTML = ""; if (el.options && el.options[0]) { isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; } el = null; return isBuggy; })(); var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ try { var el = document.createElement("table"); if (el && el.tBodies) { el.innerHTML = "test"; var isBuggy = typeof el.tBodies[0] == "undefined"; el = null; return isBuggy; } } catch (e) { return true; } })(); var LINK_ELEMENT_INNERHTML_BUGGY = (function() { try { var el = document.createElement('div'); el.innerHTML = ""; var isBuggy = (el.childNodes.length === 0); el = null; return isBuggy; } catch(e) { return true; } })(); var ANY_INNERHTML_BUGGY = SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY || LINK_ELEMENT_INNERHTML_BUGGY; var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { var s = document.createElement("script"), isBuggy = false; try { s.appendChild(document.createTextNode("")); isBuggy = !s.firstChild || s.firstChild && s.firstChild.nodeType !== 3; } catch (e) { isBuggy = true; } s = null; return isBuggy; })(); function update(element, content) { element = $(element); var purgeElement = Element._purgeElement; var descendants = element.getElementsByTagName('*'), i = descendants.length; while (i--) purgeElement(descendants[i]); 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 === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { element.text = content; return element; } if (ANY_INNERHTML_BUGGY) { if (tagName in Element._insertionTranslations.tags) { while (element.firstChild) { element.removeChild(element.firstChild); } Element._getContentFromAnonymousElement(tagName, content.stripScripts()) .each(function(node) { element.appendChild(node) }); } else if (LINK_ELEMENT_INNERHTML_BUGGY && Object.isString(content) && content.indexOf(' -1) { while (element.firstChild) { element.removeChild(element.firstChild); } var nodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts(), true); nodes.each(function(node) { element.appendChild(node) }); } else { element.innerHTML = content.stripScripts(); } } else { element.innerHTML = content.stripScripts(); } content.evalScripts.bind(content).defer(); return element; } return update; })(), replace: function(element, content) { element = $(element); if (content && content.toElement) content = content.toElement(); else if (!Object.isElement(content)) { content = Object.toHTML(content); var range = element.ownerDocument.createRange(); range.selectNode(element); content.evalScripts.bind(content).defer(); content = range.createContextualFragment(content.stripScripts()); } element.parentNode.replaceChild(content, element); return element; }, insert: function(element, insertions) { element = $(element); if (Object.isString(insertions) || Object.isNumber(insertions) || Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) insertions = {bottom:insertions}; var content, insert, tagName, childNodes; for (var position in insertions) { content = insertions[position]; position = position.toLowerCase(); insert = Element._insertionTranslations[position]; if (content && content.toElement) content = content.toElement(); if (Object.isElement(content)) { insert(element, content); continue; } content = Object.toHTML(content); tagName = ((position == 'before' || position == 'after') ? element.parentNode : element).tagName.toUpperCase(); childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); if (position == 'top' || position == 'after') childNodes.reverse(); childNodes.each(insert.curry(element)); content.evalScripts.bind(content).defer(); } return element; }, wrap: function(element, wrapper, attributes) { element = $(element); if (Object.isElement(wrapper)) $(wrapper).writeAttribute(attributes || { }); else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); else wrapper = new Element('div', wrapper); if (element.parentNode) element.parentNode.replaceChild(wrapper, element); wrapper.appendChild(element); return wrapper; }, inspect: function(element) { element = $(element); var result = '<' + element.tagName.toLowerCase(); $H({'id': 'id', 'className': 'class'}).each(function(pair) { var property = pair.first(), attribute = pair.last(), value = (element[property] || '').toString(); if (value) result += ' ' + attribute + '=' + value.inspect(true); }); return result + '>'; }, recursivelyCollect: function(element, property, maximumLength) { element = $(element); maximumLength = maximumLength || -1; var elements = []; while (element = element[property]) { if (element.nodeType == 1) elements.push(Element.extend(element)); if (elements.length == maximumLength) break; } return elements; }, ancestors: function(element) { return Element.recursivelyCollect(element, 'parentNode'); }, descendants: function(element) { return Element.select(element, "*"); }, firstDescendant: function(element) { element = $(element).firstChild; while (element && element.nodeType != 1) element = element.nextSibling; return $(element); }, immediateDescendants: function(element) { var results = [], child = $(element).firstChild; while (child) { if (child.nodeType === 1) { results.push(Element.extend(child)); } child = child.nextSibling; } return results; }, previousSiblings: function(element, maximumLength) { return Element.recursivelyCollect(element, 'previousSibling'); }, nextSiblings: function(element) { return Element.recursivelyCollect(element, 'nextSibling'); }, siblings: function(element) { element = $(element); return Element.previousSiblings(element).reverse() .concat(Element.nextSiblings(element)); }, match: function(element, selector) { element = $(element); if (Object.isString(selector)) return Prototype.Selector.match(element, selector); return selector.match(element); }, up: function(element, expression, index) { element = $(element); if (arguments.length == 1) return $(element.parentNode); var ancestors = Element.ancestors(element); return Object.isNumber(expression) ? ancestors[expression] : Prototype.Selector.find(ancestors, expression, index); }, down: function(element, expression, index) { element = $(element); if (arguments.length == 1) return Element.firstDescendant(element); return Object.isNumber(expression) ? Element.descendants(element)[expression] : Element.select(element, expression)[index || 0]; }, previous: function(element, expression, index) { element = $(element); if (Object.isNumber(expression)) index = expression, expression = false; if (!Object.isNumber(index)) index = 0; if (expression) { return Prototype.Selector.find(element.previousSiblings(), expression, index); } else { return element.recursivelyCollect("previousSibling", index + 1)[index]; } }, next: function(element, expression, index) { element = $(element); if (Object.isNumber(expression)) index = expression, expression = false; if (!Object.isNumber(index)) index = 0; if (expression) { return Prototype.Selector.find(element.nextSiblings(), expression, index); } else { var maximumLength = Object.isNumber(index) ? index + 1 : 1; return element.recursivelyCollect("nextSibling", index + 1)[index]; } }, select: function(element) { element = $(element); var expressions = Array.prototype.slice.call(arguments, 1).join(', '); return Prototype.Selector.select(expressions, element); }, adjacent: function(element) { element = $(element); var expressions = Array.prototype.slice.call(arguments, 1).join(', '); return Prototype.Selector.select(expressions, element.parentNode).without(element); }, identify: function(element) { element = $(element); var id = Element.readAttribute(element, 'id'); if (id) return id; do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); Element.writeAttribute(element, 'id', id); return id; }, readAttribute: function(element, name) { element = $(element); if (Prototype.Browser.IE) { var t = Element._attributeTranslations.read; if (t.values[name]) return t.values[name](element, name); if (t.names[name]) name = t.names[name]; if (name.include(':')) { return (!element.attributes || !element.attributes[name]) ? null : element.attributes[name].value; } } return element.getAttribute(name); }, writeAttribute: function(element, name, value) { element = $(element); var attributes = { }, t = Element._attributeTranslations.write; if (typeof name == 'object') attributes = name; else attributes[name] = Object.isUndefined(value) ? true : value; for (var attr in attributes) { name = t.names[attr] || attr; value = attributes[attr]; if (t.values[attr]) name = t.values[attr](element, value); if (value === false || value === null) element.removeAttribute(name); else if (value === true) element.setAttribute(name, name); else element.setAttribute(name, value); } return element; }, getHeight: function(element) { return Element.getDimensions(element).height; }, getWidth: function(element) { return Element.getDimensions(element).width; }, classNames: function(element) { return new Element.ClassNames(element); }, hasClassName: function(element, className) { if (!(element = $(element))) return; var elementClassName = element.className; return (elementClassName.length > 0 && (elementClassName == className || new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); }, addClassName: function(element, className) { if (!(element = $(element))) return; if (!Element.hasClassName(element, className)) element.className += (element.className ? ' ' : '') + className; return element; }, removeClassName: function(element, className) { if (!(element = $(element))) return; element.className = element.className.replace( new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); return element; }, toggleClassName: function(element, className) { if (!(element = $(element))) return; return Element[Element.hasClassName(element, className) ? 'removeClassName' : 'addClassName'](element, className); }, cleanWhitespace: function(element) { element = $(element); var node = element.firstChild; while (node) { var nextNode = node.nextSibling; if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) element.removeChild(node); node = nextNode; } return element; }, empty: function(element) { return $(element).innerHTML.blank(); }, descendantOf: function(element, ancestor) { element = $(element), ancestor = $(ancestor); if (element.compareDocumentPosition) return (element.compareDocumentPosition(ancestor) & 8) === 8; if (ancestor.contains) return ancestor.contains(element) && ancestor !== element; while (element = element.parentNode) if (element == ancestor) return true; return false; }, scrollTo: function(element) { element = $(element); var pos = Element.cumulativeOffset(element); window.scrollTo(pos[0], pos[1]); return element; }, getStyle: function(element, style) { element = $(element); style = style == 'float' ? 'cssFloat' : style.camelize(); var value = element.style[style]; if (!value || value == 'auto') { var css = document.defaultView.getComputedStyle(element, null); value = css ? css[style] : null; } if (style == 'opacity') return value ? parseFloat(value) : 1.0; return value == 'auto' ? null : value; }, getOpacity: function(element) { return $(element).getStyle('opacity'); }, setStyle: function(element, styles) { element = $(element); var elementStyle = element.style, match; if (Object.isString(styles)) { element.style.cssText += ';' + styles; return styles.include('opacity') ? element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; } for (var property in styles) if (property == 'opacity') element.setOpacity(styles[property]); else elementStyle[(property == 'float' || property == 'cssFloat') ? (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : property] = styles[property]; return element; }, setOpacity: function(element, value) { element = $(element); element.style.opacity = (value == 1 || value === '') ? '' : (value < 0.00001) ? 0 : value; return element; }, makePositioned: function(element) { element = $(element); var pos = Element.getStyle(element, 'position'); if (pos == 'static' || !pos) { element._madePositioned = true; element.style.position = 'relative'; if (Prototype.Browser.Opera) { element.style.top = 0; element.style.left = 0; } } return element; }, undoPositioned: function(element) { element = $(element); if (element._madePositioned) { element._madePositioned = undefined; element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; } return element; }, makeClipping: function(element) { element = $(element); if (element._overflow) return element; element._overflow = Element.getStyle(element, 'overflow') || 'auto'; if (element._overflow !== 'hidden') element.style.overflow = 'hidden'; return element; }, undoClipping: function(element) { element = $(element); if (!element._overflow) return element; element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; element._overflow = null; return element; }, clonePosition: function(element, source) { var options = Object.extend({ setLeft: true, setTop: true, setWidth: true, setHeight: true, offsetTop: 0, offsetLeft: 0 }, arguments[2] || { }); source = $(source); var p = Element.viewportOffset(source), delta = [0, 0], parent = null; element = $(element); if (Element.getStyle(element, 'position') == 'absolute') { parent = Element.getOffsetParent(element); delta = Element.viewportOffset(parent); } if (parent == document.body) { delta[0] -= document.body.offsetLeft; delta[1] -= document.body.offsetTop; } 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; } }; Object.extend(Element.Methods, { getElementsBySelector: Element.Methods.select, childElements: Element.Methods.immediateDescendants }); Element._attributeTranslations = { write: { names: { className: 'class', htmlFor: 'for' }, values: { } } }; if (Prototype.Browser.Opera) { Element.Methods.getStyle = Element.Methods.getStyle.wrap( function(proceed, element, style) { switch (style) { case 'height': case 'width': if (!Element.visible(element)) return null; var dim = parseInt(proceed(element, style), 10); if (dim !== element['offset' + style.capitalize()]) return dim + 'px'; var properties; if (style === 'height') { properties = ['border-top-width', 'padding-top', 'padding-bottom', 'border-bottom-width']; } else { properties = ['border-left-width', 'padding-left', 'padding-right', 'border-right-width']; } return properties.inject(dim, function(memo, property) { var val = proceed(element, property); return val === null ? memo : memo - parseInt(val, 10); }) + 'px'; default: return proceed(element, style); } } ); Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( function(proceed, element, attribute) { if (attribute === 'title') return element.title; return proceed(element, attribute); } ); } else if (Prototype.Browser.IE) { Element.Methods.getStyle = function(element, style) { element = $(element); style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); var value = element.style[style]; if (!value && element.currentStyle) value = element.currentStyle[style]; if (style == 'opacity') { if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) if (value[1]) return parseFloat(value[1]) / 100; return 1.0; } if (value == 'auto') { if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) return element['offset' + style.capitalize()] + 'px'; return null; } return value; }; Element.Methods.setOpacity = function(element, value) { function stripAlpha(filter){ return filter.replace(/alpha\([^\)]*\)/gi,''); } element = $(element); var currentStyle = element.currentStyle; if ((currentStyle && !currentStyle.hasLayout) || (!currentStyle && element.style.zoom == 'normal')) element.style.zoom = 1; var filter = element.getStyle('filter'), style = element.style; if (value == 1 || value === '') { (filter = stripAlpha(filter)) ? style.filter = filter : style.removeAttribute('filter'); return element; } else if (value < 0.00001) value = 0; style.filter = stripAlpha(filter) + 'alpha(opacity=' + (value * 100) + ')'; return element; }; Element._attributeTranslations = (function(){ var classProp = 'className', forProp = 'for', el = document.createElement('div'); el.setAttribute(classProp, 'x'); if (el.className !== 'x') { el.setAttribute('class', 'x'); if (el.className === 'x') { classProp = 'class'; } } el = null; el = document.createElement('label'); el.setAttribute(forProp, 'x'); if (el.htmlFor !== 'x') { el.setAttribute('htmlFor', 'x'); if (el.htmlFor === 'x') { forProp = 'htmlFor'; } } el = null; return { read: { names: { 'class': classProp, 'className': classProp, 'for': forProp, 'htmlFor': forProp }, values: { _getAttr: function(element, attribute) { return element.getAttribute(attribute); }, _getAttr2: function(element, attribute) { return element.getAttribute(attribute, 2); }, _getAttrNode: function(element, attribute) { var node = element.getAttributeNode(attribute); return node ? node.value : ""; }, _getEv: (function(){ var el = document.createElement('div'), f; el.onclick = Prototype.emptyFunction; var value = el.getAttribute('onclick'); if (String(value).indexOf('{') > -1) { f = function(element, attribute) { attribute = element.getAttribute(attribute); if (!attribute) return null; attribute = attribute.toString(); attribute = attribute.split('{')[1]; attribute = attribute.split('}')[0]; return attribute.strip(); }; } else if (value === '') { f = function(element, attribute) { attribute = element.getAttribute(attribute); if (!attribute) return null; return attribute.strip(); }; } el = null; return f; })(), _flag: function(element, attribute) { return $(element).hasAttribute(attribute) ? attribute : null; }, style: function(element) { return element.style.cssText.toLowerCase(); }, title: function(element) { return element.title; } } } } })(); Element._attributeTranslations.write = { names: Object.extend({ cellpadding: 'cellPadding', cellspacing: 'cellSpacing' }, Element._attributeTranslations.read.names), values: { checked: function(element, value) { element.checked = !!value; }, style: function(element, value) { element.style.cssText = value ? value : ''; } } }; Element._attributeTranslations.has = {}; $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + 'encType maxLength readOnly longDesc frameBorder').each(function(attr) { Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; Element._attributeTranslations.has[attr.toLowerCase()] = attr; }); (function(v) { Object.extend(v, { href: v._getAttr2, src: v._getAttr2, type: v._getAttr, action: v._getAttrNode, disabled: v._flag, checked: v._flag, readonly: v._flag, multiple: v._flag, onload: v._getEv, onunload: v._getEv, onclick: v._getEv, ondblclick: v._getEv, onmousedown: v._getEv, onmouseup: v._getEv, onmouseover: v._getEv, onmousemove: v._getEv, onmouseout: v._getEv, onfocus: v._getEv, onblur: v._getEv, onkeypress: v._getEv, onkeydown: v._getEv, onkeyup: v._getEv, onsubmit: v._getEv, onreset: v._getEv, onselect: v._getEv, onchange: v._getEv }); })(Element._attributeTranslations.read.values); if (Prototype.BrowserFeatures.ElementExtensions) { (function() { function _descendants(element) { var nodes = element.getElementsByTagName('*'), results = []; for (var i = 0, node; node = nodes[i]; i++) if (node.tagName !== "!") // Filter out comment nodes. results.push(node); return results; } Element.Methods.down = function(element, expression, index) { element = $(element); if (arguments.length == 1) return element.firstDescendant(); return Object.isNumber(expression) ? _descendants(element)[expression] : Element.select(element, expression)[index || 0]; } })(); } } else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { Element.Methods.setOpacity = function(element, value) { element = $(element); element.style.opacity = (value == 1) ? 0.999999 : (value === '') ? '' : (value < 0.00001) ? 0 : value; return element; }; } else if (Prototype.Browser.WebKit) { Element.Methods.setOpacity = function(element, value) { element = $(element); element.style.opacity = (value == 1 || value === '') ? '' : (value < 0.00001) ? 0 : value; if (value == 1) if (element.tagName.toUpperCase() == 'IMG' && element.width) { element.width++; element.width--; } else try { var n = document.createTextNode(' '); element.appendChild(n); element.removeChild(n); } catch (e) { } return element; }; } if ('outerHTML' in document.documentElement) { Element.Methods.replace = function(element, content) { element = $(element); if (content && content.toElement) content = content.toElement(); if (Object.isElement(content)) { element.parentNode.replaceChild(content, element); return element; } content = Object.toHTML(content); var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); if (Element._insertionTranslations.tags[tagName]) { var nextSibling = element.next(), fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); parent.removeChild(element); if (nextSibling) fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); else fragments.each(function(node) { parent.appendChild(node) }); } else element.outerHTML = content.stripScripts(); content.evalScripts.bind(content).defer(); return element; }; } Element._returnOffset = function(l, t) { var result = [l, t]; result.left = l; result.top = t; return result; }; Element._getContentFromAnonymousElement = function(tagName, html, force) { var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; var workaround = false; if (t) workaround = true; else if (force) { workaround = true; t = ['', '', 0]; } if (workaround) { div.innerHTML = ' ' + t[0] + html + t[1]; div.removeChild(div.firstChild); for (var i = t[2]; i--; ) { div = div.firstChild; } } else { div.innerHTML = html; } return $A(div.childNodes); }; Element._insertionTranslations = { before: function(element, node) { element.parentNode.insertBefore(node, element); }, top: function(element, node) { element.insertBefore(node, element.firstChild); }, bottom: function(element, node) { element.appendChild(node); }, after: function(element, node) { element.parentNode.insertBefore(node, element.nextSibling); }, tags: { TABLE: ['', '
', 1], TBODY: ['', '
', 2], TR: ['', '
', 3], TD: ['
', '
', 4], SELECT: ['', 1] } }; (function() { var tags = Element._insertionTranslations.tags; Object.extend(tags, { THEAD: tags.TBODY, TFOOT: tags.TBODY, TH: tags.TD }); })(); Element.Methods.Simulated = { hasAttribute: function(element, attribute) { attribute = Element._attributeTranslations.has[attribute] || attribute; var node = $(element).getAttributeNode(attribute); return !!(node && node.specified); } }; Element.Methods.ByTag = { }; Object.extend(Element, Element.Methods); (function(div) { if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { window.HTMLElement = { }; window.HTMLElement.prototype = div['__proto__']; Prototype.BrowserFeatures.ElementExtensions = true; } div = null; })(document.createElement('div')); Element.extend = (function() { function checkDeficiency(tagName) { if (typeof window.Element != 'undefined') { var proto = window.Element.prototype; if (proto) { var id = '_' + (Math.random()+'').slice(2), el = document.createElement(tagName); proto[id] = 'x'; var isBuggy = (el[id] !== 'x'); delete proto[id]; el = null; return isBuggy; } } return false; } function extendElementWith(element, methods) { for (var property in methods) { var value = methods[property]; if (Object.isFunction(value) && !(property in element)) element[property] = value.methodize(); } } var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); if (Prototype.BrowserFeatures.SpecificElementExtensions) { if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { return function(element) { if (element && typeof element._extendedByPrototype == 'undefined') { var t = element.tagName; if (t && (/^(?:object|applet|embed)$/i.test(t))) { extendElementWith(element, Element.Methods); extendElementWith(element, Element.Methods.Simulated); extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); } } return element; } } return Prototype.K; } var Methods = { }, ByTag = Element.Methods.ByTag; var extend = Object.extend(function(element) { if (!element || typeof element._extendedByPrototype != 'undefined' || element.nodeType != 1 || element == window) return element; var methods = Object.clone(Methods), tagName = element.tagName.toUpperCase(); if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); extendElementWith(element, methods); element._extendedByPrototype = Prototype.emptyFunction; return element; }, { refresh: function() { if (!Prototype.BrowserFeatures.ElementExtensions) { Object.extend(Methods, Element.Methods); Object.extend(Methods, Element.Methods.Simulated); } } }); extend.refresh(); return extend; })(); if (document.documentElement.hasAttribute) { Element.hasAttribute = function(element, attribute) { return element.hasAttribute(attribute); }; } else { Element.hasAttribute = Element.Methods.Simulated.hasAttribute; } Element.addMethods = function(methods) { var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; if (!methods) { Object.extend(Form, Form.Methods); Object.extend(Form.Element, Form.Element.Methods); Object.extend(Element.Methods.ByTag, { "FORM": Object.clone(Form.Methods), "INPUT": Object.clone(Form.Element.Methods), "SELECT": Object.clone(Form.Element.Methods), "TEXTAREA": Object.clone(Form.Element.Methods), "BUTTON": Object.clone(Form.Element.Methods) }); } if (arguments.length == 2) { var tagName = methods; methods = arguments[1]; } if (!tagName) Object.extend(Element.Methods, methods || { }); else { if (Object.isArray(tagName)) tagName.each(extend); else extend(tagName); } function extend(tagName) { tagName = tagName.toUpperCase(); if (!Element.Methods.ByTag[tagName]) Element.Methods.ByTag[tagName] = { }; Object.extend(Element.Methods.ByTag[tagName], methods); } function copy(methods, destination, onlyIfAbsent) { onlyIfAbsent = onlyIfAbsent || false; for (var property in methods) { var value = methods[property]; if (!Object.isFunction(value)) continue; if (!onlyIfAbsent || !(property in destination)) destination[property] = value.methodize(); } } function findDOMClass(tagName) { var klass; var trans = { "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": "FrameSet", "IFRAME": "IFrame" }; if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; if (window[klass]) return window[klass]; klass = 'HTML' + tagName + 'Element'; if (window[klass]) return window[klass]; klass = 'HTML' + tagName.capitalize() + 'Element'; if (window[klass]) return window[klass]; var element = document.createElement(tagName), proto = element['__proto__'] || element.constructor.prototype; element = null; return proto; } var elementPrototype = window.HTMLElement ? HTMLElement.prototype : Element.prototype; if (F.ElementExtensions) { copy(Element.Methods, elementPrototype); copy(Element.Methods.Simulated, elementPrototype, true); } if (F.SpecificElementExtensions) { for (var tag in Element.Methods.ByTag) { var klass = findDOMClass(tag); if (Object.isUndefined(klass)) continue; copy(T[tag], klass.prototype); } } Object.extend(Element, Element.Methods); delete Element.ByTag; if (Element.extend.refresh) Element.extend.refresh(); Element.cache = { }; }; document.viewport = { getDimensions: function() { return { width: this.getWidth(), height: this.getHeight() }; }, getScrollOffsets: function() { return Element._returnOffset( window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); } }; (function(viewport) { var B = Prototype.Browser, doc = document, element, property = {}; function getRootElement() { if (B.WebKit && !doc.evaluate) return document; if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) return document.body; return document.documentElement; } function define(D) { if (!element) element = getRootElement(); property[D] = 'client' + D; viewport['get' + D] = function() { return element[property[D]] }; return viewport['get' + D](); } viewport.getWidth = define.curry('Width'); viewport.getHeight = define.curry('Height'); })(document.viewport); Element.Storage = { UID: 1 }; Element.addMethods({ getStorage: function(element) { if (!(element = $(element))) return; var uid; if (element === window) { uid = 0; } else { if (typeof element._prototypeUID === "undefined") element._prototypeUID = Element.Storage.UID++; uid = element._prototypeUID; } if (!Element.Storage[uid]) Element.Storage[uid] = $H(); return Element.Storage[uid]; }, store: function(element, key, value) { if (!(element = $(element))) return; if (arguments.length === 2) { Element.getStorage(element).update(key); } else { Element.getStorage(element).set(key, value); } return element; }, retrieve: function(element, key, defaultValue) { if (!(element = $(element))) return; var hash = Element.getStorage(element), value = hash.get(key); if (Object.isUndefined(value)) { hash.set(key, defaultValue); value = defaultValue; } return value; }, clone: function(element, deep) { if (!(element = $(element))) return; var clone = element.cloneNode(deep); clone._prototypeUID = void 0; if (deep) { var descendants = Element.select(clone, '*'), i = descendants.length; while (i--) { descendants[i]._prototypeUID = void 0; } } return Element.extend(clone); }, purge: function(element) { if (!(element = $(element))) return; var purgeElement = Element._purgeElement; purgeElement(element); var descendants = element.getElementsByTagName('*'), i = descendants.length; while (i--) purgeElement(descendants[i]); return null; } }); (function() { function toDecimal(pctString) { var match = pctString.match(/^(\d+)%?$/i); if (!match) return null; return (Number(match[1]) / 100); } function getPixelValue(value, property, context) { var element = null; if (Object.isElement(value)) { element = value; value = element.getStyle(property); } if (value === null) { return null; } if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) { return window.parseFloat(value); } var isPercentage = value.include('%'), isViewport = (context === document.viewport); if (/\d/.test(value) && element && element.runtimeStyle && !(isPercentage && isViewport)) { var style = element.style.left, rStyle = element.runtimeStyle.left; element.runtimeStyle.left = element.currentStyle.left; element.style.left = value || 0; value = element.style.pixelLeft; element.style.left = style; element.runtimeStyle.left = rStyle; return value; } if (element && isPercentage) { context = context || element.parentNode; var decimal = toDecimal(value); var whole = null; var position = element.getStyle('position'); var isHorizontal = property.include('left') || property.include('right') || property.include('width'); var isVertical = property.include('top') || property.include('bottom') || property.include('height'); if (context === document.viewport) { if (isHorizontal) { whole = document.viewport.getWidth(); } else if (isVertical) { whole = document.viewport.getHeight(); } } else { if (isHorizontal) { whole = $(context).measure('width'); } else if (isVertical) { whole = $(context).measure('height'); } } return (whole === null) ? 0 : whole * decimal; } return 0; } function toCSSPixels(number) { if (Object.isString(number) && number.endsWith('px')) { return number; } return number + 'px'; } function isDisplayed(element) { var originalElement = element; while (element && element.parentNode) { var display = element.getStyle('display'); if (display === 'none') { return false; } element = $(element.parentNode); } return true; } var hasLayout = Prototype.K; if ('currentStyle' in document.documentElement) { hasLayout = function(element) { if (!element.currentStyle.hasLayout) { element.style.zoom = 1; } return element; }; } function cssNameFor(key) { if (key.include('border')) key = key + '-width'; return key.camelize(); } Element.Layout = Class.create(Hash, { initialize: function($super, element, preCompute) { $super(); this.element = $(element); Element.Layout.PROPERTIES.each( function(property) { this._set(property, null); }, this); if (preCompute) { this._preComputing = true; this._begin(); Element.Layout.PROPERTIES.each( this._compute, this ); this._end(); this._preComputing = false; } }, _set: function(property, value) { return Hash.prototype.set.call(this, property, value); }, set: function(property, value) { throw "Properties of Element.Layout are read-only."; }, get: function($super, property) { var value = $super(property); return value === null ? this._compute(property) : value; }, _begin: function() { if (this._prepared) return; var element = this.element; if (isDisplayed(element)) { this._prepared = true; return; } var originalStyles = { position: element.style.position || '', width: element.style.width || '', visibility: element.style.visibility || '', display: element.style.display || '' }; element.store('prototype_original_styles', originalStyles); var position = element.getStyle('position'), width = element.getStyle('width'); if (width === "0px" || width === null) { element.style.display = 'block'; width = element.getStyle('width'); } var context = (position === 'fixed') ? document.viewport : element.parentNode; element.setStyle({ position: 'absolute', visibility: 'hidden', display: 'block' }); var positionedWidth = element.getStyle('width'); var newWidth; if (width && (positionedWidth === width)) { newWidth = getPixelValue(element, 'width', context); } else if (position === 'absolute' || position === 'fixed') { newWidth = getPixelValue(element, 'width', context); } else { var parent = element.parentNode, pLayout = $(parent).getLayout(); newWidth = pLayout.get('width') - this.get('margin-left') - this.get('border-left') - this.get('padding-left') - this.get('padding-right') - this.get('border-right') - this.get('margin-right'); } element.setStyle({ width: newWidth + 'px' }); this._prepared = true; }, _end: function() { var element = this.element; var originalStyles = element.retrieve('prototype_original_styles'); element.store('prototype_original_styles', null); element.setStyle(originalStyles); this._prepared = false; }, _compute: function(property) { var COMPUTATIONS = Element.Layout.COMPUTATIONS; if (!(property in COMPUTATIONS)) { throw "Property not found."; } return this._set(property, COMPUTATIONS[property].call(this, this.element)); }, toObject: function() { var args = $A(arguments); var keys = (args.length === 0) ? Element.Layout.PROPERTIES : args.join(' ').split(' '); var obj = {}; keys.each( function(key) { if (!Element.Layout.PROPERTIES.include(key)) return; var value = this.get(key); if (value != null) obj[key] = value; }, this); return obj; }, toHash: function() { var obj = this.toObject.apply(this, arguments); return new Hash(obj); }, toCSS: function() { var args = $A(arguments); var keys = (args.length === 0) ? Element.Layout.PROPERTIES : args.join(' ').split(' '); var css = {}; keys.each( function(key) { if (!Element.Layout.PROPERTIES.include(key)) return; if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return; var value = this.get(key); if (value != null) css[cssNameFor(key)] = value + 'px'; }, this); return css; }, inspect: function() { return "#"; } }); Object.extend(Element.Layout, { PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'), COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'), COMPUTATIONS: { 'height': function(element) { if (!this._preComputing) this._begin(); var bHeight = this.get('border-box-height'); if (bHeight <= 0) { if (!this._preComputing) this._end(); return 0; } var bTop = this.get('border-top'), bBottom = this.get('border-bottom'); var pTop = this.get('padding-top'), pBottom = this.get('padding-bottom'); if (!this._preComputing) this._end(); return bHeight - bTop - bBottom - pTop - pBottom; }, 'width': function(element) { if (!this._preComputing) this._begin(); var bWidth = this.get('border-box-width'); if (bWidth <= 0) { if (!this._preComputing) this._end(); return 0; } var bLeft = this.get('border-left'), bRight = this.get('border-right'); var pLeft = this.get('padding-left'), pRight = this.get('padding-right'); if (!this._preComputing) this._end(); return bWidth - bLeft - bRight - pLeft - pRight; }, 'padding-box-height': function(element) { var height = this.get('height'), pTop = this.get('padding-top'), pBottom = this.get('padding-bottom'); return height + pTop + pBottom; }, 'padding-box-width': function(element) { var width = this.get('width'), pLeft = this.get('padding-left'), pRight = this.get('padding-right'); return width + pLeft + pRight; }, 'border-box-height': function(element) { if (!this._preComputing) this._begin(); var height = element.offsetHeight; if (!this._preComputing) this._end(); return height; }, 'border-box-width': function(element) { if (!this._preComputing) this._begin(); var width = element.offsetWidth; if (!this._preComputing) this._end(); return width; }, 'margin-box-height': function(element) { var bHeight = this.get('border-box-height'), mTop = this.get('margin-top'), mBottom = this.get('margin-bottom'); if (bHeight <= 0) return 0; return bHeight + mTop + mBottom; }, 'margin-box-width': function(element) { var bWidth = this.get('border-box-width'), mLeft = this.get('margin-left'), mRight = this.get('margin-right'); if (bWidth <= 0) return 0; return bWidth + mLeft + mRight; }, 'top': function(element) { var offset = element.positionedOffset(); return offset.top; }, 'bottom': function(element) { var offset = element.positionedOffset(), parent = element.getOffsetParent(), pHeight = parent.measure('height'); var mHeight = this.get('border-box-height'); return pHeight - mHeight - offset.top; }, 'left': function(element) { var offset = element.positionedOffset(); return offset.left; }, 'right': function(element) { var offset = element.positionedOffset(), parent = element.getOffsetParent(), pWidth = parent.measure('width'); var mWidth = this.get('border-box-width'); return pWidth - mWidth - offset.left; }, 'padding-top': function(element) { return getPixelValue(element, 'paddingTop'); }, 'padding-bottom': function(element) { return getPixelValue(element, 'paddingBottom'); }, 'padding-left': function(element) { return getPixelValue(element, 'paddingLeft'); }, 'padding-right': function(element) { return getPixelValue(element, 'paddingRight'); }, 'border-top': function(element) { return getPixelValue(element, 'borderTopWidth'); }, 'border-bottom': function(element) { return getPixelValue(element, 'borderBottomWidth'); }, 'border-left': function(element) { return getPixelValue(element, 'borderLeftWidth'); }, 'border-right': function(element) { return getPixelValue(element, 'borderRightWidth'); }, 'margin-top': function(element) { return getPixelValue(element, 'marginTop'); }, 'margin-bottom': function(element) { return getPixelValue(element, 'marginBottom'); }, 'margin-left': function(element) { return getPixelValue(element, 'marginLeft'); }, 'margin-right': function(element) { return getPixelValue(element, 'marginRight'); } } }); if ('getBoundingClientRect' in document.documentElement) { Object.extend(Element.Layout.COMPUTATIONS, { 'right': function(element) { var parent = hasLayout(element.getOffsetParent()); var rect = element.getBoundingClientRect(), pRect = parent.getBoundingClientRect(); return (pRect.right - rect.right).round(); }, 'bottom': function(element) { var parent = hasLayout(element.getOffsetParent()); var rect = element.getBoundingClientRect(), pRect = parent.getBoundingClientRect(); return (pRect.bottom - rect.bottom).round(); } }); } Element.Offset = Class.create({ initialize: function(left, top) { this.left = left.round(); this.top = top.round(); this[0] = this.left; this[1] = this.top; }, relativeTo: function(offset) { return new Element.Offset( this.left - offset.left, this.top - offset.top ); }, inspect: function() { return "#".interpolate(this); }, toString: function() { return "[#{left}, #{top}]".interpolate(this); }, toArray: function() { return [this.left, this.top]; } }); function getLayout(element, preCompute) { return new Element.Layout(element, preCompute); } function measure(element, property) { return $(element).getLayout().get(property); } function getDimensions(element) { element = $(element); var display = Element.getStyle(element, 'display'); if (display && display !== 'none') { return { width: element.offsetWidth, height: element.offsetHeight }; } var style = element.style; var originalStyles = { visibility: style.visibility, position: style.position, display: style.display }; var newStyles = { visibility: 'hidden', display: 'block' }; if (originalStyles.position !== 'fixed') newStyles.position = 'absolute'; Element.setStyle(element, newStyles); var dimensions = { width: element.offsetWidth, height: element.offsetHeight }; Element.setStyle(element, originalStyles); return dimensions; } function getOffsetParent(element) { element = $(element); if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element)) return $(document.body); var isInline = (Element.getStyle(element, 'display') === 'inline'); if (!isInline && element.offsetParent) return $(element.offsetParent); while ((element = element.parentNode) && element !== document.body) { if (Element.getStyle(element, 'position') !== 'static') { return isHtml(element) ? $(document.body) : $(element); } } return $(document.body); } function cumulativeOffset(element) { element = $(element); var valueT = 0, valueL = 0; if (element.parentNode) { do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; } while (element); } return new Element.Offset(valueL, valueT); } function positionedOffset(element) { element = $(element); var layout = element.getLayout(); var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; if (element) { if (isBody(element)) break; var p = Element.getStyle(element, 'position'); if (p !== 'static') break; } } while (element); valueL -= layout.get('margin-top'); valueT -= layout.get('margin-left'); return new Element.Offset(valueL, valueT); } function cumulativeScrollOffset(element) { var valueT = 0, valueL = 0; do { valueT += element.scrollTop || 0; valueL += element.scrollLeft || 0; element = element.parentNode; } while (element); return new Element.Offset(valueL, valueT); } function viewportOffset(forElement) { element = $(element); var valueT = 0, valueL = 0, docBody = document.body; var element = forElement; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; if (element.offsetParent == docBody && Element.getStyle(element, 'position') == 'absolute') break; } while (element = element.offsetParent); element = forElement; do { if (element != docBody) { valueT -= element.scrollTop || 0; valueL -= element.scrollLeft || 0; } } while (element = element.parentNode); return new Element.Offset(valueL, valueT); } function absolutize(element) { element = $(element); if (Element.getStyle(element, 'position') === 'absolute') { return element; } var offsetParent = getOffsetParent(element); var eOffset = element.viewportOffset(), pOffset = offsetParent.viewportOffset(); var offset = eOffset.relativeTo(pOffset); var layout = element.getLayout(); element.store('prototype_absolutize_original_styles', { left: element.getStyle('left'), top: element.getStyle('top'), width: element.getStyle('width'), height: element.getStyle('height') }); element.setStyle({ position: 'absolute', top: offset.top + 'px', left: offset.left + 'px', width: layout.get('width') + 'px', height: layout.get('height') + 'px' }); return element; } function relativize(element) { element = $(element); if (Element.getStyle(element, 'position') === 'relative') { return element; } var originalStyles = element.retrieve('prototype_absolutize_original_styles'); if (originalStyles) element.setStyle(originalStyles); return element; } if (Prototype.Browser.IE) { getOffsetParent = getOffsetParent.wrap( function(proceed, element) { element = $(element); if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element)) return $(document.body); var position = element.getStyle('position'); if (position !== 'static') return proceed(element); element.setStyle({ position: 'relative' }); var value = proceed(element); element.setStyle({ position: position }); return value; } ); positionedOffset = positionedOffset.wrap(function(proceed, element) { element = $(element); if (!element.parentNode) return new Element.Offset(0, 0); var position = element.getStyle('position'); if (position !== 'static') return proceed(element); var offsetParent = element.getOffsetParent(); if (offsetParent && offsetParent.getStyle('position') === 'fixed') hasLayout(offsetParent); element.setStyle({ position: 'relative' }); var value = proceed(element); element.setStyle({ position: position }); return value; }); } else if (Prototype.Browser.Webkit) { cumulativeOffset = function(element) { element = $(element); var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; if (element.offsetParent == document.body) if (Element.getStyle(element, 'position') == 'absolute') break; element = element.offsetParent; } while (element); return new Element.Offset(valueL, valueT); }; } Element.addMethods({ getLayout: getLayout, measure: measure, getDimensions: getDimensions, getOffsetParent: getOffsetParent, cumulativeOffset: cumulativeOffset, positionedOffset: positionedOffset, cumulativeScrollOffset: cumulativeScrollOffset, viewportOffset: viewportOffset, absolutize: absolutize, relativize: relativize }); function isBody(element) { return element.nodeName.toUpperCase() === 'BODY'; } function isHtml(element) { return element.nodeName.toUpperCase() === 'HTML'; } function isDocument(element) { return element.nodeType === Node.DOCUMENT_NODE; } function isDetached(element) { return element !== document.body && !Element.descendantOf(element, document.body); } if ('getBoundingClientRect' in document.documentElement) { Element.addMethods({ viewportOffset: function(element) { element = $(element); if (isDetached(element)) return new Element.Offset(0, 0); var rect = element.getBoundingClientRect(), docEl = document.documentElement; return new Element.Offset(rect.left - docEl.clientLeft, rect.top - docEl.clientTop); } }); } })(); window.$$ = function() { var expression = $A(arguments).join(', '); return Prototype.Selector.select(expression, document); }; Prototype.Selector = (function() { function select() { throw new Error('Method "Prototype.Selector.select" must be defined.'); } function match() { throw new Error('Method "Prototype.Selector.match" must be defined.'); } function find(elements, expression, index) { index = index || 0; var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i; for (i = 0; i < length; i++) { if (match(elements[i], expression) && index == matchIndex++) { return Element.extend(elements[i]); } } } function extendElements(elements) { for (var i = 0, length = elements.length; i < length; i++) { Element.extend(elements[i]); } return elements; } var K = Prototype.K; return { select: select, match: match, find: find, extendElements: (Element.extend === K) ? K : extendElements, extendElement: Element.extend }; })(); Prototype._original_property = window.Sizzle; /*! * Sizzle CSS Selector Engine - v1.0 * Copyright 2009, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true; [0, 0].sort(function(){ baseHasDuplicate = false; return 0; }); var Sizzle = function(selector, context, results, seed) { results = results || []; var origContext = context = context || document; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context), soFar = selector; while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) selector += parts.shift(); set = posProcess( selector, set ); } } } else { if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { var ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { var ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray(set); } else { prune = false; } while ( parts.length ) { var cur = parts.pop(), pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { throw "Syntax error, unrecognized expression: " + (cur || selector); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( var i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( var i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function(results){ if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort(sortOrder); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[i-1] ) { results.splice(i--, 1); } } } } return results; }; Sizzle.matches = function(expr, set){ return Sizzle(expr, null, null, set); }; Sizzle.find = function(expr, context, isXML){ var set, match; if ( !expr ) { return []; } for ( var i = 0, l = Expr.order.length; i < l; i++ ) { var type = Expr.order[i], match; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { var left = match[1]; match.splice(1,1); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace(/\\/g, ""); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = context.getElementsByTagName("*"); } return {set: set, expr: expr}; }; Sizzle.filter = function(expr, set, inplace, not){ var old = expr, result = [], curLoop = set, match, anyFound, isXMLFilter = set && set[0] && isXML(set[0]); while ( expr && set.length ) { for ( var type in Expr.filter ) { if ( (match = Expr.match[ type ].exec( expr )) != null ) { var filter = Expr.filter[ type ], found, item; anyFound = false; if ( curLoop == result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( var i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); var pass = not ^ !!found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } if ( expr == old ) { if ( anyFound == null ) { throw "Syntax error, unrecognized expression: " + expr; } else { break; } } old = expr; } return curLoop; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function(elem){ return elem.getAttribute("href"); } }, relative: { "+": function(checkSet, part, isXML){ var isPartStr = typeof part === "string", isTag = isPartStr && !/\W/.test(part), isPartStrNotTag = isPartStr && !isTag; if ( isTag && !isXML ) { part = part.toUpperCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function(checkSet, part, isXML){ var isPartStr = typeof part === "string"; if ( isPartStr && !/\W/.test(part) ) { part = isXML ? part : part.toUpperCase(); for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName === part ? parent : false; } } } else { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var doneName = done++, checkFn = dirCheck; if ( !/\W/.test(part) ) { var nodeCheck = part = isXML ? part : part.toUpperCase(); checkFn = dirNodeCheck; } checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); }, "~": function(checkSet, part, isXML){ var doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !/\W/.test(part) ) { var nodeCheck = part = isXML ? part : part.toUpperCase(); checkFn = dirNodeCheck; } checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); } }, find: { ID: function(match, context, isXML){ if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? [m] : []; } }, NAME: function(match, context, isXML){ if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName(match[1]); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function(match, context){ return context.getElementsByTagName(match[1]); } }, preFilter: { CLASS: function(match, curLoop, inplace, result, not, isXML){ match = " " + match[1].replace(/\\/g, "") + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { if ( !inplace ) result.push( elem ); } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function(match){ return match[1].replace(/\\/g, ""); }, TAG: function(match, curLoop){ for ( var i = 0; curLoop[i] === false; i++ ){} return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); }, CHILD: function(match){ if ( match[1] == "nth" ) { var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } match[0] = done++; return match; }, ATTR: function(match, curLoop, inplace, result, not, isXML){ var name = match[1].replace(/\\/g, ""); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function(match, curLoop, inplace, result, not){ if ( match[1] === "not" ) { if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function(match){ match.unshift( true ); return match; } }, filters: { enabled: function(elem){ return elem.disabled === false && elem.type !== "hidden"; }, disabled: function(elem){ return elem.disabled === true; }, checked: function(elem){ return elem.checked === true; }, selected: function(elem){ elem.parentNode.selectedIndex; return elem.selected === true; }, parent: function(elem){ return !!elem.firstChild; }, empty: function(elem){ return !elem.firstChild; }, has: function(elem, i, match){ return !!Sizzle( match[3], elem ).length; }, header: function(elem){ return /h\d/i.test( elem.nodeName ); }, text: function(elem){ return "text" === elem.type; }, radio: function(elem){ return "radio" === elem.type; }, checkbox: function(elem){ return "checkbox" === elem.type; }, file: function(elem){ return "file" === elem.type; }, password: function(elem){ return "password" === elem.type; }, submit: function(elem){ return "submit" === elem.type; }, image: function(elem){ return "image" === elem.type; }, reset: function(elem){ return "reset" === elem.type; }, button: function(elem){ return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; }, input: function(elem){ return /input|select|textarea|button/i.test(elem.nodeName); } }, setFilters: { first: function(elem, i){ return i === 0; }, last: function(elem, i, match, array){ return i === array.length - 1; }, even: function(elem, i){ return i % 2 === 0; }, odd: function(elem, i){ return i % 2 === 1; }, lt: function(elem, i, match){ return i < match[3] - 0; }, gt: function(elem, i, match){ return i > match[3] - 0; }, nth: function(elem, i, match){ return match[3] - 0 == i; }, eq: function(elem, i, match){ return match[3] - 0 == i; } }, filter: { PSEUDO: function(elem, match, i, array){ var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var i = 0, l = not.length; i < l; i++ ) { if ( not[i] === elem ) { return false; } } return true; } }, CHILD: function(elem, match){ var type = match[1], node = elem; switch (type) { case 'only': case 'first': while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) return false; } if ( type == 'first') return true; node = elem; case 'last': while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) return false; } return true; case 'nth': var first = match[2], last = match[3]; if ( first == 1 && last == 0 ) { return true; } var doneName = match[0], parent = elem.parentNode; if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { var count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent.sizcache = doneName; } var diff = elem.nodeIndex - last; if ( first == 0 ) { return diff == 0; } else { return ( diff % first == 0 && diff / first >= 0 ); } } }, ID: function(elem, match){ return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function(elem, match){ return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; }, CLASS: function(elem, match){ return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function(elem, match){ var name = match[1], result = Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value != check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function(elem, match, i, array){ var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source ); } var makeArray = function(array, results) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; try { Array.prototype.slice.call( document.documentElement.childNodes, 0 ); } catch(e){ makeArray = function(array, results) { var ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var i = 0, l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( var i = 0; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { if ( a == b ) { hasDuplicate = true; } return 0; } var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; if ( ret === 0 ) { hasDuplicate = true; } return ret; }; } else if ( "sourceIndex" in document.documentElement ) { sortOrder = function( a, b ) { if ( !a.sourceIndex || !b.sourceIndex ) { if ( a == b ) { hasDuplicate = true; } return 0; } var ret = a.sourceIndex - b.sourceIndex; if ( ret === 0 ) { hasDuplicate = true; } return ret; }; } else if ( document.createRange ) { sortOrder = function( a, b ) { if ( !a.ownerDocument || !b.ownerDocument ) { if ( a == b ) { hasDuplicate = true; } return 0; } var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); aRange.setStart(a, 0); aRange.setEnd(a, 0); bRange.setStart(b, 0); bRange.setEnd(b, 0); var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); if ( ret === 0 ) { hasDuplicate = true; } return ret; }; } (function(){ var form = document.createElement("div"), id = "script" + (new Date).getTime(); form.innerHTML = ""; var root = document.documentElement; root.insertBefore( form, root.firstChild ); if ( !!document.getElementById( id ) ) { Expr.find.ID = function(match, context, isXML){ if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function(elem, match){ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); root = form = null; // release memory in IE })(); (function(){ var div = document.createElement("div"); div.appendChild( document.createComment("") ); if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function(match, context){ var results = context.getElementsByTagName(match[1]); if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function(elem){ return elem.getAttribute("href", 2); }; } div = null; // release memory in IE })(); if ( document.querySelectorAll ) (function(){ var oldSizzle = Sizzle, div = document.createElement("div"); div.innerHTML = "

"; if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function(query, context, extra, seed){ context = context || document; if ( !seed && context.nodeType === 9 && !isXML(context) ) { try { return makeArray( context.querySelectorAll(query), extra ); } catch(e){} } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } div = null; // release memory in IE })(); if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ var div = document.createElement("div"); div.innerHTML = "
"; if ( div.getElementsByClassName("e").length === 0 ) return; div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) return; Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function(match, context, isXML) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; div = null; // release memory in IE })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { var sibDir = dir == "previousSibling" && !isXML; for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { if ( sibDir && elem.nodeType === 1 ){ elem.sizcache = doneName; elem.sizset = i; } elem = elem[dir]; var match = false; while ( elem ) { if ( elem.sizcache === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem.sizcache = doneName; elem.sizset = i; } if ( elem.nodeName === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { var sibDir = dir == "previousSibling" && !isXML; for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { if ( sibDir && elem.nodeType === 1 ) { elem.sizcache = doneName; elem.sizset = i; } elem = elem[dir]; var match = false; while ( elem ) { if ( elem.sizcache === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem.sizcache = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } var contains = document.compareDocumentPosition ? function(a, b){ return a.compareDocumentPosition(b) & 16; } : function(a, b){ return a !== b && (a.contains ? a.contains(b) : true); }; var isXML = function(elem){ return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML"; }; var posProcess = function(selector, context){ var tmpSet = [], later = "", match, root = context.nodeType ? [context] : context; while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet ); } return Sizzle.filter( later, tmpSet ); }; window.Sizzle = Sizzle; })(); ;(function(engine) { var extendElements = Prototype.Selector.extendElements; function select(selector, scope) { return extendElements(engine(selector, scope || document)); } function match(element, selector) { return engine.matches(selector, [element]).length == 1; } Prototype.Selector.engine = engine; Prototype.Selector.select = select; Prototype.Selector.match = match; })(Sizzle); window.Sizzle = Prototype._original_property; delete Prototype._original_property; var Form = { reset: function(form) { form = $(form); form.reset(); return form; }, serializeElements: function(elements, options) { if (typeof options != 'object') options = { hash: !!options }; else if (Object.isUndefined(options.hash)) options.hash = true; var key, value, submitted = false, submit = options.submit, accumulator, initial; if (options.hash) { initial = {}; accumulator = function(result, key, value) { if (key in result) { if (!Object.isArray(result[key])) result[key] = [result[key]]; result[key].push(value); } else result[key] = value; return result; }; } else { initial = ''; accumulator = function(result, key, value) { return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value); } } return elements.inject(initial, function(result, element) { if (!element.disabled && element.name) { key = element.name; value = $(element).getValue(); if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && submit !== false && (!submit || key == submit) && (submitted = true)))) { result = accumulator(result, key, value); } } return result; }); } }; Form.Methods = { serialize: function(form, options) { return Form.serializeElements(Form.getElements(form), options); }, getElements: function(form) { var elements = $(form).getElementsByTagName('*'), element, arr = [ ], serializers = Form.Element.Serializers; for (var i = 0; element = elements[i]; i++) { arr.push(element); } return arr.inject([], function(elements, child) { if (serializers[child.tagName.toLowerCase()]) elements.push(Element.extend(child)); return elements; }) }, getInputs: function(form, typeName, name) { form = $(form); var inputs = form.getElementsByTagName('input'); if (!typeName && !name) return $A(inputs).map(Element.extend); for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { var input = inputs[i]; if ((typeName && input.type != typeName) || (name && input.name != name)) continue; matchingInputs.push(Element.extend(input)); } return matchingInputs; }, disable: function(form) { form = $(form); Form.getElements(form).invoke('disable'); return form; }, enable: function(form) { form = $(form); Form.getElements(form).invoke('enable'); return form; }, findFirstElement: function(form) { var elements = $(form).getElements().findAll(function(element) { return 'hidden' != element.type && !element.disabled; }); var firstByIndex = elements.findAll(function(element) { return element.hasAttribute('tabIndex') && element.tabIndex >= 0; }).sortBy(function(element) { return element.tabIndex }).first(); return firstByIndex ? firstByIndex : elements.find(function(element) { return /^(?:input|select|textarea)$/i.test(element.tagName); }); }, focusFirstElement: function(form) { form = $(form); var element = form.findFirstElement(); if (element) element.activate(); return form; }, request: function(form, options) { form = $(form), options = Object.clone(options || { }); var params = options.parameters, action = form.readAttribute('action') || ''; if (action.blank()) action = window.location.href; options.parameters = form.serialize(true); if (params) { if (Object.isString(params)) params = params.toQueryParams(); Object.extend(options.parameters, params); } if (form.hasAttribute('method') && !options.method) options.method = form.method; return new Ajax.Request(action, options); } }; /*--------------------------------------------------------------------------*/ Form.Element = { focus: function(element) { $(element).focus(); return element; }, select: function(element) { $(element).select(); return element; } }; Form.Element.Methods = { serialize: function(element) { element = $(element); if (!element.disabled && element.name) { var value = element.getValue(); if (value != undefined) { var pair = { }; pair[element.name] = value; return Object.toQueryString(pair); } } return ''; }, getValue: function(element) { element = $(element); var method = element.tagName.toLowerCase(); return Form.Element.Serializers[method](element); }, setValue: function(element, value) { element = $(element); var method = element.tagName.toLowerCase(); Form.Element.Serializers[method](element, value); return element; }, clear: function(element) { $(element).value = ''; return element; }, present: function(element) { return $(element).value != ''; }, activate: function(element) { element = $(element); try { element.focus(); if (element.select && (element.tagName.toLowerCase() != 'input' || !(/^(?:button|reset|submit)$/i.test(element.type)))) element.select(); } catch (e) { } return element; }, disable: function(element) { element = $(element); element.disabled = true; return element; }, enable: function(element) { element = $(element); element.disabled = false; return element; } }; /*--------------------------------------------------------------------------*/ var Field = Form.Element; var $F = Form.Element.Methods.getValue; /*--------------------------------------------------------------------------*/ Form.Element.Serializers = (function() { function input(element, value) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': return inputSelector(element, value); default: return valueSelector(element, value); } } function inputSelector(element, value) { if (Object.isUndefined(value)) return element.checked ? element.value : null; else element.checked = !!value; } function valueSelector(element, value) { if (Object.isUndefined(value)) return element.value; else element.value = value; } function select(element, value) { if (Object.isUndefined(value)) return (element.type === 'select-one' ? selectOne : selectMany)(element); var opt, currentValue, single = !Object.isArray(value); for (var i = 0, length = element.length; i < length; i++) { opt = element.options[i]; currentValue = this.optionValue(opt); if (single) { if (currentValue == value) { opt.selected = true; return; } } else opt.selected = value.include(currentValue); } } function selectOne(element) { var index = element.selectedIndex; return index >= 0 ? optionValue(element.options[index]) : null; } function selectMany(element) { var values, length = element.length; if (!length) return null; for (var i = 0, values = []; i < length; i++) { var opt = element.options[i]; if (opt.selected) values.push(optionValue(opt)); } return values; } function optionValue(opt) { return Element.hasAttribute(opt, 'value') ? opt.value : opt.text; } return { input: input, inputSelector: inputSelector, textarea: valueSelector, select: select, selectOne: selectOne, selectMany: selectMany, optionValue: optionValue, button: valueSelector }; })(); /*--------------------------------------------------------------------------*/ Abstract.TimedObserver = Class.create(PeriodicalExecuter, { initialize: function($super, element, frequency, callback) { $super(callback, frequency); this.element = $(element); this.lastValue = this.getValue(); }, execute: function() { var value = this.getValue(); if (Object.isString(this.lastValue) && Object.isString(value) ? this.lastValue != value : String(this.lastValue) != String(value)) { this.callback(this.element, value); this.lastValue = value; } } }); Form.Element.Observer = Class.create(Abstract.TimedObserver, { getValue: function() { return Form.Element.getValue(this.element); } }); Form.Observer = Class.create(Abstract.TimedObserver, { getValue: function() { return Form.serialize(this.element); } }); /*--------------------------------------------------------------------------*/ Abstract.EventObserver = Class.create({ initialize: function(element, callback) { this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); if (this.element.tagName.toLowerCase() == 'form') this.registerFormCallbacks(); else this.registerCallback(this.element); }, onElementEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } }, registerFormCallbacks: function() { Form.getElements(this.element).each(this.registerCallback, this); }, registerCallback: function(element) { if (element.type) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': Event.observe(element, 'click', this.onElementEvent.bind(this)); break; default: Event.observe(element, 'change', this.onElementEvent.bind(this)); break; } } } }); Form.Element.EventObserver = Class.create(Abstract.EventObserver, { getValue: function() { return Form.Element.getValue(this.element); } }); Form.EventObserver = Class.create(Abstract.EventObserver, { getValue: function() { return Form.serialize(this.element); } }); (function() { var Event = { KEY_BACKSPACE: 8, KEY_TAB: 9, KEY_RETURN: 13, KEY_ESC: 27, KEY_LEFT: 37, KEY_UP: 38, KEY_RIGHT: 39, KEY_DOWN: 40, KEY_DELETE: 46, KEY_HOME: 36, KEY_END: 35, KEY_PAGEUP: 33, KEY_PAGEDOWN: 34, KEY_INSERT: 45, cache: {} }; var docEl = document.documentElement; var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl && 'onmouseleave' in docEl; var isIELegacyEvent = function(event) { return false; }; if (window.attachEvent) { if (window.addEventListener) { isIELegacyEvent = function(event) { return !(event instanceof window.Event); }; } else { isIELegacyEvent = function(event) { return true; }; } } var _isButton; function _isButtonForDOMEvents(event, code) { return event.which ? (event.which === code + 1) : (event.button === code); } var legacyButtonMap = { 0: 1, 1: 4, 2: 2 }; function _isButtonForLegacyEvents(event, code) { return event.button === legacyButtonMap[code]; } function _isButtonForWebKit(event, code) { switch (code) { case 0: return event.which == 1 && !event.metaKey; case 1: return event.which == 2 || (event.which == 1 && event.metaKey); case 2: return event.which == 3; default: return false; } } if (window.attachEvent) { if (!window.addEventListener) { _isButton = _isButtonForLegacyEvents; } else { _isButton = function(event, code) { return isIELegacyEvent(event) ? _isButtonForLegacyEvents(event, code) : _isButtonForDOMEvents(event, code); } } } else if (Prototype.Browser.WebKit) { _isButton = _isButtonForWebKit; } else { _isButton = _isButtonForDOMEvents; } function isLeftClick(event) { return _isButton(event, 0) } function isMiddleClick(event) { return _isButton(event, 1) } function isRightClick(event) { return _isButton(event, 2) } function element(event) { event = Event.extend(event); var node = event.target, type = event.type, currentTarget = event.currentTarget; if (currentTarget && currentTarget.tagName) { if (type === 'load' || type === 'error' || (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' && currentTarget.type === 'radio')) node = currentTarget; } if (node.nodeType == Node.TEXT_NODE) node = node.parentNode; return Element.extend(node); } function findElement(event, expression) { var element = Event.element(event); if (!expression) return element; while (element) { if (Object.isElement(element) && Prototype.Selector.match(element, expression)) { return Element.extend(element); } element = element.parentNode; } } function pointer(event) { return { x: pointerX(event), y: pointerY(event) }; } function pointerX(event) { var docElement = document.documentElement, body = document.body || { scrollLeft: 0 }; return event.pageX || (event.clientX + (docElement.scrollLeft || body.scrollLeft) - (docElement.clientLeft || 0)); } function pointerY(event) { var docElement = document.documentElement, body = document.body || { scrollTop: 0 }; return event.pageY || (event.clientY + (docElement.scrollTop || body.scrollTop) - (docElement.clientTop || 0)); } function stop(event) { Event.extend(event); event.preventDefault(); event.stopPropagation(); event.stopped = true; } Event.Methods = { isLeftClick: isLeftClick, isMiddleClick: isMiddleClick, isRightClick: isRightClick, element: element, findElement: findElement, pointer: pointer, pointerX: pointerX, pointerY: pointerY, stop: stop }; var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { m[name] = Event.Methods[name].methodize(); return m; }); if (window.attachEvent) { function _relatedTarget(event) { var element; switch (event.type) { case 'mouseover': case 'mouseenter': element = event.fromElement; break; case 'mouseout': case 'mouseleave': element = event.toElement; break; default: return null; } return Element.extend(element); } var additionalMethods = { stopPropagation: function() { this.cancelBubble = true }, preventDefault: function() { this.returnValue = false }, inspect: function() { return '[object Event]' } }; Event.extend = function(event, element) { if (!event) return false; if (!isIELegacyEvent(event)) return event; if (event._extendedByPrototype) return event; event._extendedByPrototype = Prototype.emptyFunction; var pointer = Event.pointer(event); Object.extend(event, { target: event.srcElement || element, relatedTarget: _relatedTarget(event), pageX: pointer.x, pageY: pointer.y }); Object.extend(event, methods); Object.extend(event, additionalMethods); return event; }; } else { Event.extend = Prototype.K; } if (window.addEventListener) { Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; Object.extend(Event.prototype, methods); } function _createResponder(element, eventName, handler) { var registry = Element.retrieve(element, 'prototype_event_registry'); if (Object.isUndefined(registry)) { CACHE.push(element); registry = Element.retrieve(element, 'prototype_event_registry', $H()); } var respondersForEvent = registry.get(eventName); if (Object.isUndefined(respondersForEvent)) { respondersForEvent = []; registry.set(eventName, respondersForEvent); } if (respondersForEvent.pluck('handler').include(handler)) return false; var responder; if (eventName.include(":")) { responder = function(event) { if (Object.isUndefined(event.eventName)) return false; if (event.eventName !== eventName) return false; Event.extend(event, element); handler.call(element, event); }; } else { if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && (eventName === "mouseenter" || eventName === "mouseleave")) { if (eventName === "mouseenter" || eventName === "mouseleave") { responder = function(event) { Event.extend(event, element); var parent = event.relatedTarget; while (parent && parent !== element) { try { parent = parent.parentNode; } catch(e) { parent = element; } } if (parent === element) return; handler.call(element, event); }; } } else { responder = function(event) { Event.extend(event, element); handler.call(element, event); }; } } responder.handler = handler; respondersForEvent.push(responder); return responder; } function _destroyCache() { for (var i = 0, length = CACHE.length; i < length; i++) { Event.stopObserving(CACHE[i]); CACHE[i] = null; } } var CACHE = []; if (Prototype.Browser.IE) window.attachEvent('onunload', _destroyCache); if (Prototype.Browser.WebKit) window.addEventListener('unload', Prototype.emptyFunction, false); var _getDOMEventName = Prototype.K, translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { _getDOMEventName = function(eventName) { return (translations[eventName] || eventName); }; } function observe(element, eventName, handler) { element = $(element); var responder = _createResponder(element, eventName, handler); if (!responder) return element; if (eventName.include(':')) { if (element.addEventListener) element.addEventListener("dataavailable", responder, false); else { element.attachEvent("ondataavailable", responder); element.attachEvent("onlosecapture", responder); } } else { var actualEventName = _getDOMEventName(eventName); if (element.addEventListener) element.addEventListener(actualEventName, responder, false); else element.attachEvent("on" + actualEventName, responder); } return element; } function stopObserving(element, eventName, handler) { element = $(element); var registry = Element.retrieve(element, 'prototype_event_registry'); if (!registry) return element; if (!eventName) { registry.each( function(pair) { var eventName = pair.key; stopObserving(element, eventName); }); return element; } var responders = registry.get(eventName); if (!responders) return element; if (!handler) { responders.each(function(r) { stopObserving(element, eventName, r.handler); }); return element; } var i = responders.length, responder; while (i--) { if (responders[i].handler === handler) { responder = responders[i]; break; } } if (!responder) return element; if (eventName.include(':')) { if (element.removeEventListener) element.removeEventListener("dataavailable", responder, false); else { element.detachEvent("ondataavailable", responder); element.detachEvent("onlosecapture", responder); } } else { var actualEventName = _getDOMEventName(eventName); if (element.removeEventListener) element.removeEventListener(actualEventName, responder, false); else element.detachEvent('on' + actualEventName, responder); } registry.set(eventName, responders.without(responder)); return element; } function fire(element, eventName, memo, bubble) { element = $(element); if (Object.isUndefined(bubble)) bubble = true; if (element == document && document.createEvent && !element.dispatchEvent) element = document.documentElement; var event; if (document.createEvent) { event = document.createEvent('HTMLEvents'); event.initEvent('dataavailable', bubble, true); } else { event = document.createEventObject(); event.eventType = bubble ? 'ondataavailable' : 'onlosecapture'; } event.eventName = eventName; event.memo = memo || { }; if (document.createEvent) element.dispatchEvent(event); else element.fireEvent(event.eventType, event); return Event.extend(event); } Event.Handler = Class.create({ initialize: function(element, eventName, selector, callback) { this.element = $(element); this.eventName = eventName; this.selector = selector; this.callback = callback; this.handler = this.handleEvent.bind(this); }, start: function() { Event.observe(this.element, this.eventName, this.handler); return this; }, stop: function() { Event.stopObserving(this.element, this.eventName, this.handler); return this; }, handleEvent: function(event) { var element = Event.findElement(event, this.selector); if (element) this.callback.call(this.element, event, element); } }); function on(element, eventName, selector, callback) { element = $(element); if (Object.isFunction(selector) && Object.isUndefined(callback)) { callback = selector, selector = null; } return new Event.Handler(element, eventName, selector, callback).start(); } Object.extend(Event, Event.Methods); Object.extend(Event, { fire: fire, observe: observe, stopObserving: stopObserving, on: on }); Element.addMethods({ fire: fire, observe: observe, stopObserving: stopObserving, on: on }); Object.extend(document, { fire: fire.methodize(), observe: observe.methodize(), stopObserving: stopObserving.methodize(), on: on.methodize(), loaded: false }); if (window.Event) Object.extend(window.Event, Event); else window.Event = Event; })(); (function() { /* Support for the DOMContentLoaded event is based on work by Dan Webb, Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ var timer; function fireContentLoadedEvent() { if (document.loaded) return; if (timer) window.clearTimeout(timer); document.loaded = true; document.fire('dom:loaded'); } function checkReadyState() { if (document.readyState === 'complete') { document.stopObserving('readystatechange', checkReadyState); fireContentLoadedEvent(); } } function pollDoScroll() { try { document.documentElement.doScroll('left'); } catch(e) { timer = pollDoScroll.defer(); return; } fireContentLoadedEvent(); } if (document.addEventListener) { document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); } else { document.observe('readystatechange', checkReadyState); if (window == top) timer = pollDoScroll.defer(); } Event.observe(window, 'load', fireContentLoadedEvent); })(); Element.addMethods(); /*------------------------------- DEPRECATED -------------------------------*/ Hash.toQueryString = Object.toQueryString; var Toggle = { display: Element.toggle }; Element.Methods.childOf = Element.Methods.descendantOf; var Insertion = { Before: function(element, content) { return Element.insert(element, {before:content}); }, Top: function(element, content) { return Element.insert(element, {top:content}); }, Bottom: function(element, content) { return Element.insert(element, {bottom:content}); }, After: function(element, content) { return Element.insert(element, {after:content}); } }; var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); var Position = { includeScrollOffsets: false, prepare: function() { this.deltaX = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; this.deltaY = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; }, within: function(element, x, y) { if (this.includeScrollOffsets) return this.withinIncludingScrolloffsets(element, x, y); this.xcomp = x; this.ycomp = y; this.offset = Element.cumulativeOffset(element); return (y >= this.offset[1] && y < this.offset[1] + element.offsetHeight && x >= this.offset[0] && x < this.offset[0] + element.offsetWidth); }, withinIncludingScrolloffsets: function(element, x, y) { var offsetcache = Element.cumulativeScrollOffset(element); this.xcomp = x + offsetcache[0] - this.deltaX; this.ycomp = y + offsetcache[1] - this.deltaY; this.offset = Element.cumulativeOffset(element); return (this.ycomp >= this.offset[1] && this.ycomp < this.offset[1] + element.offsetHeight && this.xcomp >= this.offset[0] && this.xcomp < this.offset[0] + element.offsetWidth); }, overlap: function(mode, element) { if (!mode) return 0; if (mode == 'vertical') return ((this.offset[1] + element.offsetHeight) - this.ycomp) / element.offsetHeight; if (mode == 'horizontal') return ((this.offset[0] + element.offsetWidth) - this.xcomp) / element.offsetWidth; }, cumulativeOffset: Element.Methods.cumulativeOffset, positionedOffset: Element.Methods.positionedOffset, absolutize: function(element) { Position.prepare(); return Element.absolutize(element); }, relativize: function(element) { Position.prepare(); return Element.relativize(element); }, realOffset: Element.Methods.cumulativeScrollOffset, offsetParent: Element.Methods.getOffsetParent, page: Element.Methods.viewportOffset, clone: function(source, target, options) { options = options || { }; return Element.clonePosition(target, source, options); } }; /*--------------------------------------------------------------------------*/ if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ function iter(name) { return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; } instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? function(element, className) { className = className.toString().strip(); var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); return cond ? document._getElementsByXPath('.//*' + cond, element) : []; } : function(element, className) { className = className.toString().strip(); var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); if (!classNames && !className) return elements; var nodes = $(element).getElementsByTagName('*'); className = ' ' + className + ' '; for (var i = 0, child, cn; child = nodes[i]; i++) { if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || (classNames && classNames.all(function(name) { return !name.toString().blank() && cn.include(' ' + name + ' '); })))) elements.push(Element.extend(child)); } return elements; }; return function(className, parentElement) { return $(parentElement || document.body).getElementsByClassName(className); }; }(Element.Methods); /*--------------------------------------------------------------------------*/ Element.ClassNames = Class.create(); Element.ClassNames.prototype = { initialize: function(element) { this.element = $(element); }, _each: function(iterator) { this.element.className.split(/\s+/).select(function(name) { return name.length > 0; })._each(iterator); }, set: function(className) { this.element.className = className; }, add: function(classNameToAdd) { if (this.include(classNameToAdd)) return; this.set($A(this).concat(classNameToAdd).join(' ')); }, remove: function(classNameToRemove) { if (!this.include(classNameToRemove)) return; this.set($A(this).without(classNameToRemove).join(' ')); }, toString: function() { return $A(this).join(' '); } }; Object.extend(Element.ClassNames.prototype, Enumerable); /*--------------------------------------------------------------------------*/ (function() { window.Selector = Class.create({ initialize: function(expression) { this.expression = expression.strip(); }, findElements: function(rootElement) { return Prototype.Selector.select(this.expression, rootElement); }, match: function(element) { return Prototype.Selector.match(element, this.expression); }, toString: function() { return this.expression; }, inspect: function() { return "#"; } }); Object.extend(Selector, { matchElements: function(elements, expression) { var match = Prototype.Selector.match, results = []; for (var i = 0, length = elements.length; i < length; i++) { var element = elements[i]; if (match(element, expression)) { results.push(Element.extend(element)); } } return results; }, findElement: function(elements, expression, index) { index = index || 0; var matchIndex = 0, element; for (var i = 0, length = elements.length; i < length; i++) { element = elements[i]; if (Prototype.Selector.match(element, expression) && index === matchIndex++) { return Element.extend(element); } } }, findChildElements: function(element, expressions) { var selector = expressions.toArray().join(', '); return Prototype.Selector.select(selector, element || document); } }); })(); function $one(pSelector){return $$(pSelector)[0];} function $each(pSelector, pEvent, pHandler, pStop){$$(pSelector).each(function(el){if(pStop){Event.stopObserving(el, pEvent, pHandler);}else{Event.observe(el, pEvent, pHandler);}})} function proxy(pInstance, pMethod){return function(){pMethod.apply(pInstance, arguments)};} function $fadeIn(pElement, pTime, pComplete) { M4Tween.killTweensOf(pElement, false); pElement.style.display = "block"; if (!(Prototype.Browser.IE && (!document["documentMode"] || document["documentMode"] < 9))) M4Tween.to(pElement, pTime, {opacity:1}).onComplete(pComplete); } function $fadeOut(pElement, pTime, pComplete) { var c = function () { pElement.style.display = "none"; if (pComplete) { pComplete(); } }; if (Prototype.Browser.IE && (!document["documentMode"] || document["documentMode"] < 9)) c(); else { if (pElement.style.opacity == 0) { c(); return; } M4Tween.to(pElement, pTime, {opacity:0}).onComplete(c); } } /** * Event.simulate(@element, eventName[, options]) -> Element * * - @element: element to fire event on * - eventName: name of event to fire (only MouseEvents and HTMLEvents interfaces are supported) * - options: optional object to fine-tune event properties - pointerX, pointerY, ctrlKey, etc. * * $('foo').simulate('click'); // => fires "click" event on an element with id=foo * **/ (function(){ var eventMatchers = { 'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/, 'MouseEvents': /^(?:click|mouse(?:down|up|over|move|out))$/ } var defaultOptions = { pointerX: 0, pointerY: 0, button: 0, ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, bubbles: true, cancelable: true } Event.simulate = function(element, eventName) { var options = Object.extend(defaultOptions, arguments[2] || { }); var oEvent, eventType = null; element = $(element); for (var name in eventMatchers) { if (eventMatchers[name].test(eventName)) { eventType = name; break; } } if (!eventType) throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported'); if (document.createEvent) { oEvent = document.createEvent(eventType); if (eventType == 'HTMLEvents') { oEvent.initEvent(eventName, options.bubbles, options.cancelable); } else { oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView, options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element); } element.dispatchEvent(oEvent); } else { options.clientX = options.pointerX; options.clientY = options.pointerY; oEvent = Object.extend(document.createEventObject(), options); element.fireEvent('on' + eventName, oEvent); } return element; } Element.addMethods({ simulate: Event.simulate }); })(); /* Chosen v1.0.0 | (c) 2011-2013 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */ !function(){ var AbstractChosen,SelectParser,a,b={}.hasOwnProperty,c=function(a,c){function d(){this.constructor=a}for(var e in c)b.call(c,e)&&(a[e]=c[e]);return d.prototype=c.prototype,a.prototype=new d,a.__super__=c.prototype,a};SelectParser=function(){function SelectParser(){this.options_index=0,this.parsed=[]}return SelectParser.prototype.add_node=function(a){return"OPTGROUP"===a.nodeName.toUpperCase()?this.add_group(a):this.add_option(a)},SelectParser.prototype.add_group=function(a){var b,c,d,e,f,g;for(b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:this.escapeExpression(a.label),children:0,disabled:a.disabled}),f=a.childNodes,g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},SelectParser.prototype.add_option=function(a,b,c){return"OPTION"===a.nodeName.toUpperCase()?(""!==a.text?(null!=b&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b,classes:a.className,style:a.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1):void 0},SelectParser.prototype.escapeExpression=function(a){var b,c;return null==a||a===!1?"":/[\&\<\>\"\'\`]/.test(a)?(b={"<":"<",">":">",'"':""","'":"'","`":"`"},c=/&(?!\w+;)|[\<\>\"\'\`]/g,a.replace(c,function(a){return b[a]||"&"})):a},SelectParser}(),SelectParser.select_to_array=function(a){var b,c,d,e,f;for(c=new SelectParser,f=a.childNodes,d=0,e=f.length;e>d;d++)b=f[d],c.add_node(b);return c.parsed},AbstractChosen=function(){function AbstractChosen(a,b){this.form_field=a,this.options=null!=b?b:{},AbstractChosen.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers())}return AbstractChosen.prototype.set_default_values=function(){var a=this;return this.click_test_action=function(b){return a.test_active_click(b)},this.activate_action=function(b){return a.activate_field(b)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.result_single_selected=null,this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&""===this.form_field.options[0].text?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null!=this.options.enable_split_word_search?this.options.enable_split_word_search:!0,this.group_search=null!=this.options.group_search?this.options.group_search:!0,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null!=this.options.single_backstroke_delete?this.options.single_backstroke_delete:!0,this.max_selected_options=this.options.max_selected_options||1/0,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null!=this.options.display_selected_options?this.options.display_selected_options:!0,this.display_disabled_options=null!=this.options.display_disabled_options?this.options.display_disabled_options:!0},AbstractChosen.prototype.set_default_text=function(){return this.default_text=this.form_field.getAttribute("data-placeholder")?this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.options.placeholder_text_multiple||this.options.placeholder_text||AbstractChosen.default_multiple_text:this.options.placeholder_text_single||this.options.placeholder_text||AbstractChosen.default_single_text,this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||AbstractChosen.default_no_result_text},AbstractChosen.prototype.mouse_enter=function(){return this.mouse_on_container=!0},AbstractChosen.prototype.mouse_leave=function(){return this.mouse_on_container=!1},AbstractChosen.prototype.input_focus=function(){var a=this;if(this.is_multiple){if(!this.active_field)return setTimeout(function(){return a.container_mousedown()},50)}else if(!this.active_field)return this.activate_field()},AbstractChosen.prototype.input_blur=function(){var a=this;return this.mouse_on_container?void 0:(this.active_field=!1,setTimeout(function(){return a.blur_test()},100))},AbstractChosen.prototype.results_option_build=function(a){var b,c,d,e,f;for(b="",f=this.results_data,d=0,e=f.length;e>d;d++)c=f[d],b+=c.group?this.result_add_group(c):this.result_add_option(c),(null!=a?a.first:void 0)&&(c.selected&&this.is_multiple?this.choice_build(c):c.selected&&!this.is_multiple&&this.single_set_selected_text(c.text));return b},AbstractChosen.prototype.result_add_option=function(a){var b,c;return a.search_match?this.include_option_in_results(a)?(b=[],a.disabled||a.selected&&this.is_multiple||b.push("active-result"),!a.disabled||a.selected&&this.is_multiple||b.push("disabled-result"),a.selected&&b.push("result-selected"),null!=a.group_array_index&&b.push("group-option"),""!==a.classes&&b.push(a.classes),c=""!==a.style.cssText?' style="'+a.style+'"':"",'
  • '+a.search_text+"
  • "):"":""},AbstractChosen.prototype.result_add_group=function(a){return a.search_match||a.group_match?a.active_options>0?'
  • '+a.search_text+"
  • ":"":""},AbstractChosen.prototype.results_update_field=function(){return this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.result_single_selected=null,this.results_build(),this.results_showing?this.winnow_results():void 0},AbstractChosen.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},AbstractChosen.prototype.results_search=function(){return this.results_showing?this.winnow_results():this.results_show()},AbstractChosen.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(this.no_results_clear(),e=0,g=this.get_search_text(),a=g.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),d=this.search_contains?"":"^",c=new RegExp(d+a,"i"),j=new RegExp(a,"i"),m=this.results_data,k=0,l=m.length;l>k;k++)b=m[k],b.search_match=!1,f=null,this.include_option_in_results(b)&&(b.group&&(b.group_match=!1,b.active_options=0),null!=b.group_array_index&&this.results_data[b.group_array_index]&&(f=this.results_data[b.group_array_index],0===f.active_options&&f.search_match&&(e+=1),f.active_options+=1),(!b.group||this.group_search)&&(b.search_text=b.group?b.label:b.html,b.search_match=this.search_string_match(b.search_text,c),b.search_match&&!b.group&&(e+=1),b.search_match?(g.length&&(h=b.search_text.search(j),i=b.search_text.substr(0,h+g.length)+""+b.search_text.substr(h+g.length),b.search_text=i.substr(0,h)+""+i.substr(h)),null!=f&&(f.group_match=!0)):null!=b.group_array_index&&this.results_data[b.group_array_index].search_match&&(b.search_match=!0)));return this.result_clear_highlight(),1>e&&g.length?(this.update_results_content(""),this.no_results(g)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight())},AbstractChosen.prototype.search_string_match=function(a,b){var c,d,e,f;if(b.test(a))return!0;if(this.enable_split_word_search&&(a.indexOf(" ")>=0||0===a.indexOf("["))&&(d=a.replace(/\[|\]/g,"").split(" "),d.length))for(e=0,f=d.length;f>e;e++)if(c=d[e],b.test(c))return!0},AbstractChosen.prototype.choices_count=function(){var a,b,c,d;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,d=this.form_field.options,b=0,c=d.length;c>b;b++)a=d[b],a.selected&&(this.selected_option_count+=1);return this.selected_option_count},AbstractChosen.prototype.choices_click=function(a){return a.preventDefault(),this.results_showing||this.is_disabled?void 0:this.results_show()},AbstractChosen.prototype.keyup_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:if(a.preventDefault(),this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},AbstractChosen.prototype.container_width=function(){return null!=this.options.width?this.options.width:""+this.form_field.offsetWidth+"px"},AbstractChosen.prototype.include_option_in_results=function(a){return this.is_multiple&&!this.display_selected_options&&a.selected?!1:!this.display_disabled_options&&a.disabled?!1:a.empty?!1:!0},AbstractChosen.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:/iP(od|hone)/i.test(window.navigator.userAgent)?!1:/Android/i.test(window.navigator.userAgent)&&/Mobile/i.test(window.navigator.userAgent)?!1:!0},AbstractChosen.default_multiple_text="Select Some Options",AbstractChosen.default_single_text="Select an Option",AbstractChosen.default_no_result_text="No results match",AbstractChosen}(),this.Chosen=function(b){function Chosen(){return a=Chosen.__super__.constructor.apply(this,arguments)}return c(Chosen,b),Chosen.prototype.setup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.is_rtl=this.form_field.hasClassName("chosen-rtl")},Chosen.prototype.set_default_values=function(){return Chosen.__super__.set_default_values.call(this),this.single_temp=new Template('#{default}
      '),this.multi_temp=new Template('
        '),this.no_results_temp=new Template('
      • '+this.results_none_found+' "#{terms}"
      • ')},Chosen.prototype.set_up_html=function(){var a,b;return a=["chosen-container"],a.push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&a.push(this.form_field.className),this.is_rtl&&a.push("chosen-rtl"),b={"class":a.join(" "),style:"width: "+this.container_width()+";",title:this.form_field.title},this.form_field.id.length&&(b.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=this.is_multiple?new Element("div",b).update(this.multi_temp.evaluate({"default":this.default_text})):new Element("div",b).update(this.single_temp.evaluate({"default":this.default_text})),this.form_field.hide().insert({after:this.container}),this.dropdown=this.container.down("div.chosen-drop"),this.search_field=this.container.down("input"),this.search_results=this.container.down("ul.chosen-results"),this.search_field_scale(),this.search_no_results=this.container.down("li.no-results"),this.is_multiple?(this.search_choices=this.container.down("ul.chosen-choices"),this.search_container=this.container.down("li.search-field")):(this.search_container=this.container.down("div.chosen-search"),this.selected_item=this.container.down(".chosen-single")),this.results_build(),this.set_tab_index(),this.set_label_behavior(),this.form_field.fire("chosen:ready",{chosen:this})},Chosen.prototype.register_observers=function(){var a=this;return this.container.observe("mousedown",function(b){return a.container_mousedown(b)}),this.container.observe("mouseup",function(b){return a.container_mouseup(b)}),this.container.observe("mouseenter",function(b){return a.mouse_enter(b)}),this.container.observe("mouseleave",function(b){return a.mouse_leave(b)}),this.search_results.observe("mouseup",function(b){return a.search_results_mouseup(b)}),this.search_results.observe("mouseover",function(b){return a.search_results_mouseover(b)}),this.search_results.observe("mouseout",function(b){return a.search_results_mouseout(b)}),this.search_results.observe("mousewheel",function(b){return a.search_results_mousewheel(b)}),this.search_results.observe("DOMMouseScroll",function(b){return a.search_results_mousewheel(b)}),this.form_field.observe("chosen:updated",function(b){return a.results_update_field(b)}),this.form_field.observe("chosen:activate",function(b){return a.activate_field(b)}),this.form_field.observe("chosen:open",function(b){return a.container_mousedown(b)}),this.search_field.observe("blur",function(b){return a.input_blur(b)}),this.search_field.observe("keyup",function(b){return a.keyup_checker(b)}),this.search_field.observe("keydown",function(b){return a.keydown_checker(b)}),this.search_field.observe("focus",function(b){return a.input_focus(b)}),this.is_multiple?this.search_choices.observe("click",function(b){return a.choices_click(b)}):this.container.observe("click",function(a){return a.preventDefault()})},Chosen.prototype.destroy=function(){return document.stopObserving("click",this.click_test_action),this.form_field.stopObserving(),this.container.stopObserving(),this.search_results.stopObserving(),this.search_field.stopObserving(),null!=this.form_field_label&&this.form_field_label.stopObserving(),this.is_multiple?(this.search_choices.stopObserving(),this.container.select(".search-choice-close").each(function(a){return a.stopObserving()})):this.selected_item.stopObserving(),this.search_field.tabIndex&&(this.form_field.tabIndex=this.search_field.tabIndex),this.container.remove(),this.form_field.show()},Chosen.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field.disabled,this.is_disabled?(this.container.addClassName("chosen-disabled"),this.search_field.disabled=!0,this.is_multiple||this.selected_item.stopObserving("focus",this.activate_action),this.close_field()):(this.container.removeClassName("chosen-disabled"),this.search_field.disabled=!1,this.is_multiple?void 0:this.selected_item.observe("focus",this.activate_action))},Chosen.prototype.container_mousedown=function(a){return this.is_disabled||(a&&"mousedown"===a.type&&!this.results_showing&&Event.stop(a),null!=a&&a.target.hasClassName("search-choice-close"))?void 0:(this.active_field?this.is_multiple||!a||a.target!==this.selected_item&&!a.target.up("a.chosen-single")||this.results_toggle():(this.is_multiple&&this.search_field.clear(),document.observe("click",this.click_test_action),this.results_show()),this.activate_field())},Chosen.prototype.container_mouseup=function(a){return"ABBR"!==a.target.nodeName||this.is_disabled?void 0:this.results_reset(a)},Chosen.prototype.search_results_mousewheel=function(a){var b;return b=-a.wheelDelta||a.detail,null!=b?(a.preventDefault(),"DOMMouseScroll"===a.type&&(b=40*b),this.search_results.scrollTop=b+this.search_results.scrollTop):void 0},Chosen.prototype.blur_test=function(){return!this.active_field&&this.container.hasClassName("chosen-container-active")?this.close_field():void 0},Chosen.prototype.close_field=function(){return document.stopObserving("click",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClassName("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},Chosen.prototype.activate_field=function(){return this.container.addClassName("chosen-container-active"),this.active_field=!0,this.search_field.value=this.search_field.value,this.search_field.focus()},Chosen.prototype.test_active_click=function(a){return a.target.up(".chosen-container")===this.container?this.active_field=!0:this.close_field()},Chosen.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=SelectParser.select_to_array(this.form_field),this.is_multiple?this.search_choices.select("li.search-choice").invoke("remove"):this.is_multiple||(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field.readOnly=!0,this.container.addClassName("chosen-container-single-nosearch")):(this.search_field.readOnly=!1,this.container.removeClassName("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},Chosen.prototype.result_do_highlight=function(a){var b,c,d,e,f;return this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClassName("highlighted"),d=parseInt(this.search_results.getStyle("maxHeight"),10),f=this.search_results.scrollTop,e=d+f,c=this.result_highlight.positionedOffset().top,b=c+this.result_highlight.getHeight(),b>=e?this.search_results.scrollTop=b-d>0?b-d:0:f>c?this.search_results.scrollTop=c:void 0},Chosen.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClassName("highlighted"),this.result_highlight=null},Chosen.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field.fire("chosen:maxselected",{chosen:this}),!1):(this.container.addClassName("chosen-with-drop"),this.form_field.fire("chosen:showing_dropdown",{chosen:this}),this.results_showing=!0,this.search_field.focus(),this.search_field.value=this.search_field.value,this.winnow_results())},Chosen.prototype.update_results_content=function(a){return this.search_results.update(a)},Chosen.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClassName("chosen-with-drop"),this.form_field.fire("chosen:hiding_dropdown",{chosen:this})),this.results_showing=!1},Chosen.prototype.set_tab_index=function(){var a;return this.form_field.tabIndex?(a=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field.tabIndex=a):void 0},Chosen.prototype.set_label_behavior=function(){var a=this;return this.form_field_label=this.form_field.up("label"),null==this.form_field_label&&(this.form_field_label=$$("label[for='"+this.form_field.id+"']").first()),null!=this.form_field_label?this.form_field_label.observe("click",function(b){return a.is_multiple?a.container_mousedown(b):a.activate_field()}):void 0},Chosen.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.value=this.default_text,this.search_field.addClassName("default")):(this.search_field.value="",this.search_field.removeClassName("default"))},Chosen.prototype.search_results_mouseup=function(a){var b;return b=a.target.hasClassName("active-result")?a.target:a.target.up(".active-result"),b?(this.result_highlight=b,this.result_select(a),this.search_field.focus()):void 0},Chosen.prototype.search_results_mouseover=function(a){var b;return b=a.target.hasClassName("active-result")?a.target:a.target.up(".active-result"),b?this.result_do_highlight(b):void 0},Chosen.prototype.search_results_mouseout=function(a){return a.target.hasClassName("active-result")||a.target.up(".active-result")?this.result_clear_highlight():void 0},Chosen.prototype.choice_build=function(a){var b,c,d=this;return b=new Element("li",{"class":"search-choice"}).update(""+a.html+""),a.disabled?b.addClassName("search-choice-disabled"):(c=new Element("a",{href:"#","class":"search-choice-close",rel:a.array_index}),c.observe("click",function(a){return d.choice_destroy_link_click(a)}),b.insert(c)),this.search_container.insert({before:b})},Chosen.prototype.choice_destroy_link_click=function(a){return a.preventDefault(),a.stopPropagation(),this.is_disabled?void 0:this.choice_destroy(a.target)},Chosen.prototype.choice_destroy=function(a){return this.result_deselect(a.readAttribute("rel"))?(this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.search_field.value.length<1&&this.results_hide(),a.up("li").remove(),this.search_field_scale()):void 0},Chosen.prototype.results_reset=function(){return this.form_field.options[0].selected=!0,this.selected_option_count=null,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),"function"==typeof Event.simulate&&this.form_field.simulate("change"),this.active_field?this.results_hide():void 0},Chosen.prototype.results_reset_cleanup=function(){var a;return this.current_selectedIndex=this.form_field.selectedIndex,a=this.selected_item.down("abbr"),a?a.remove():void 0},Chosen.prototype.result_select=function(a){var b,c,d;return this.result_highlight?(b=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field.fire("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?b.removeClassName("active-result"):(this.result_single_selected&&(this.result_single_selected.removeClassName("result-selected"),d=this.result_single_selected.getAttribute("data-option-array-index"),this.results_data[d].selected=!1),this.result_single_selected=b),b.addClassName("result-selected"),c=this.results_data[b.getAttribute("data-option-array-index")],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(c):this.single_set_selected_text(c.text),(a.metaKey||a.ctrlKey)&&this.is_multiple||this.results_hide(),this.search_field.value="","function"!=typeof Event.simulate||!this.is_multiple&&this.form_field.selectedIndex===this.current_selectedIndex||this.form_field.simulate("change"),this.current_selectedIndex=this.form_field.selectedIndex,this.search_field_scale())):void 0},Chosen.prototype.single_set_selected_text=function(a){return null==a&&(a=this.default_text),a===this.default_text?this.selected_item.addClassName("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClassName("chosen-default")),this.selected_item.down("span").update(a)},Chosen.prototype.result_deselect=function(a){var b;return b=this.results_data[a],this.form_field.options[b.options_index].disabled?!1:(b.selected=!1,this.form_field.options[b.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),"function"==typeof Event.simulate&&this.form_field.simulate("change"),this.search_field_scale(),!0)},Chosen.prototype.single_deselect_control_build=function(){return this.allow_single_deselect?(this.selected_item.down("abbr")||this.selected_item.down("span").insert({after:''}),this.selected_item.addClassName("chosen-single-with-deselect")):void 0},Chosen.prototype.get_search_text=function(){return this.search_field.value===this.default_text?"":this.search_field.value.strip().escapeHTML()},Chosen.prototype.winnow_results_set_highlight=function(){var a;return this.is_multiple||(a=this.search_results.down(".result-selected.active-result")),null==a&&(a=this.search_results.down(".active-result")),null!=a?this.result_do_highlight(a):void 0},Chosen.prototype.no_results=function(a){return this.search_results.insert(this.no_results_temp.evaluate({terms:a}))},Chosen.prototype.no_results_clear=function(){var a,b;for(a=null,b=[];a=this.search_results.down(".no-results");)b.push(a.remove());return b},Chosen.prototype.keydown_arrow=function(){var a;return this.results_showing&&this.result_highlight?(a=this.result_highlight.next(".active-result"))?this.result_do_highlight(a):void 0:this.results_show()},Chosen.prototype.keyup_arrow=function(){var a,b,c;return this.results_showing||this.is_multiple?this.result_highlight?(c=this.result_highlight.previousSiblings(),a=this.search_results.select("li.active-result"),b=c.intersect(a),b.length?this.result_do_highlight(b.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},Chosen.prototype.keydown_backstroke=function(){var a;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.down("a")),this.clear_backstroke()):(a=this.search_container.siblings().last(),a&&a.hasClassName("search-choice")&&!a.hasClassName("search-choice-disabled")?(this.pending_backstroke=a,this.pending_backstroke&&this.pending_backstroke.addClassName("search-choice-focus"),this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClassName("search-choice-focus")):void 0)},Chosen.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClassName("search-choice-focus"),this.pending_backstroke=null},Chosen.prototype.keydown_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),8!==b&&this.pending_backstroke&&this.clear_backstroke(),b){case 8:this.backstroke_length=this.search_field.value.length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:a.preventDefault(),this.keydown_arrow()}},Chosen.prototype.search_field_scale=function(){var a,b,c,d,e,f,g,h,i;if(this.is_multiple){for(c=0,g=0,e="position:absolute; left: -1000px; top: -1000px; display:none;",f=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"],h=0,i=f.length;i>h;h++)d=f[h],e+=d+":"+this.search_field.getStyle(d)+";";return a=new Element("div",{style:e}).update(this.search_field.value.escapeHTML()),document.body.appendChild(a),g=Element.measure(a,"width")+25,a.remove(),b=this.container.getWidth(),g>b-10&&(g=b-10),this.search_field.setStyle({width:g+"px"})}},Chosen}(AbstractChosen)}.call(this); // requestAnim shim layer by Paul Irish window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(/* function */ callback){ window.setTimeout(callback, 1000 / 60); }; })(); /** * M4Tween - Javascript animation library * Copyright (C) 2009 - 2015 NICOLAS Arnaud * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ if(!window["M4"]) var M4 ={}; M4.browser = (function() { var ua = navigator.userAgent; return { IE:ua.indexOf("MSIE")>-1, FF:ua.indexOf("Firefox")>-1, CHROME:ua.indexOf("Chrome")>-1, SAFARI:ua.indexOf("AppleWebKit")>-1&&ua.indexOf("Chrome")===-1 }; })(); function M4Tween(){this.configure(null, null, 0, null, 0, null);} M4Tween.prototype = { configure:function (pTarget, pFirstInfos, pDuration, pEase, pDelay, pStyle) { this.startHandler = null; this.updateHandler = null; this.completeHandler = null; this.startTime = null; this.delay = pDelay; this.target = pTarget; this.context = pStyle?this.target.style:this.target; this.useStyle = pStyle; this.firstInfos = pFirstInfos; this.durationTime = pDuration; this.ease = pEase; }, start:function() { this.waiting = null; this.startTime = new Date().getTime(); var f = this.firstInfos, t = this.target; if(this.useStyle) { if(document&&document.defaultView&&document.defaultView.getComputedStyle) t = document.defaultView.getComputedStyle(this.target, null); else if (this.target.currentStyle) t = this.target.currentStyle; else t = this.target.style; } while(f) { f.extractStartValue(t, this.useStyle, this.context); f = f.next; } if(this.startHandler) { this.startHandler(); } }, update:function(pDt) { var timer, t, factor, i; timer = (pDt - this.startTime) * .001; t = (timer>16), null,null); this.g = new M4TweenInfos("g",((this.finalValue&parseInt("00FF00", 16))>>8), null,null); this.b = new M4TweenInfos("b",(this.finalValue&parseInt("0000FF", 16)), null,null); } M4TweenColorInfos.prototype = { update:function (pFactor) { var r = Math.round(this.r.startValue+ (pFactor * this.r.distanceValue)); var g = Math.round(this.g.startValue+ (pFactor * this.g.distanceValue)); var b = Math.round(this.b.startValue+ (pFactor * this.b.distanceValue)); return "rgb("+r+", "+g+", "+b+")"; }, setStartValue:function(pValue) { this.startValue = Number(pValue); this.r.setStartValue((this.startValue&parseInt("FF0000", 16))>>16); this.g.setStartValue((this.startValue&parseInt("00FF00", 16))>>8); this.b.setStartValue(this.startValue&parseInt("0000FF", 16)); } }; if(typeof(M4TweenPlugins)=="undefined") function M4TweenPlugins(){} M4TweenPlugins.color = { extractStartValue:function(pCtx) { var t; if(t = pCtx[this.property].match(/rgb\(([0-9]+),\s*([0-9]+),\s*([0-9]+)\)/i)) this.setStartValue(t[1]<<16|t[2]<<8|t[3]); else if(t = pCtx[this.property].match(/#([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/i)) this.setStartValue(parseInt(t[1],16)<<16|parseInt(t[2],16)<<8|parseInt(t[3],16)); }, newInfos:function(pProperty, pFinalValue) { return new M4TweenColorInfos(pProperty, parseInt(pFinalValue.replace("#", ""), 16)); } }; M4TweenPlugins.backgroundColor = {}; for(var i in M4TweenPlugins.color) { if(M4TweenPlugins.color.hasOwnProperty(i)) M4TweenPlugins.backgroundColor[i] = M4TweenPlugins.color[i]; } M4TweenPlugins.opacity = { extractStartValue:function(pCtx, pStyle) { var s = pCtx[this.property]; if(pStyle && M4.browser.IE && (!document["documentMode"] || document["documentMode"] < 9)) { try { s = s.replace(/alpha\(opacity=/,""); s = s.replace(/\)/,""); s = s!==""?s:100; } catch(ex){s = 100;} } this.setStartValue(s); }, newInfos:function(pProperty, pFinalValue, pStyle) { var prop = "opacity", template; if(pStyle && M4.browser.IE && (!document["documentMode"] || document["documentMode"] < 9)) { pFinalValue *= 100; prop = "filter"; template = "alpha(opacity=#value#)"; } return new M4TweenInfos(prop, pFinalValue, "", template); } }; M4TweenPlugins.defaultProp = { extractStartValue:function(pCtx, pUseStyle, pRealCtx) { var current = String(pCtx[this.property]); if(this.type === "%"&&String(current).replace(/(px|%)/,"")!=="0") { var setCtx = pCtx; if(pUseStyle) setCtx = pRealCtx; setCtx[this.property] = "auto"; var max = String(pCtx[this.property]).replace(/(px|%)/, ''); setCtx[this.property] = current; current = Math.round((current.replace(/(px|%)/, "") / max) * 1000)/10; } this.setStartValue(String(current).replace(/(px|%)/,"")); }, newInfos:function(pProperty, pFinalValue) { var s = String(pFinalValue), type = "", p = s.search(/(px|%)/); if(p>-1) type = s.substr(p); return new M4TweenInfos(pProperty, s.replace(/(px|%)/,""), type, null); } }; M4TweenPlugins.rotate = { extractStartValue:function(pCtx) { var v = M4TweenGenericInfos.transform.extractStartValue(pCtx, this.property, this.templateValue.split("#value#"), function(pT){ var c = Number(pT[0]); var s = Number(pT[1]); var value = Math.atan2(s, c) * (180 / Math.PI); if(value < 0) value = 360 - value; return value; }); this.setStartValue(v); }, newInfos:function(pProperty, pFinalValue) { return M4TweenGenericInfos.transform.newInfos(pFinalValue, "rotate(#value#)", "deg"); } }; M4TweenPlugins.translateX = { extractStartValue:function(pCtx) { var v = M4TweenGenericInfos.transform.extractStartValue(pCtx, this.property, this.templateValue.split("#value#"), function(pT){ return Number(pT[4])||0; }); this.setStartValue(v); }, newInfos:function(pProperty, pFinalValue) { return M4TweenGenericInfos.transform.newInfos(pFinalValue, "translateX(#value#)", "(px|%)"); } }; M4TweenPlugins.translateY = { extractStartValue:function(pCtx) { var v = M4TweenGenericInfos.transform.extractStartValue(pCtx, this.property, this.templateValue.split("#value#"), function(pT){ return Number(pT[5]); }); this.setStartValue(v); }, newInfos:function(pProperty, pFinalValue) { return M4TweenGenericInfos.transform.newInfos(pFinalValue, "translateY(#value#)", "(px|%)"); } }; M4TweenPlugins.translateZ = { extractStartValue:function(pCtx) { var v = M4TweenGenericInfos.transform.extractStartValue(pCtx, this.property, this.templateValue.split("#value#"), function(pT){ return Number(pT[14]||"0"); }); this.setStartValue(v); }, newInfos:function(pProperty, pFinalValue) { return M4TweenGenericInfos.transform.newInfos(pFinalValue, "translateZ(#value#)", "(px|%)"); } }; var M4TweenGenericInfos = { transform:{ newInfos:function(pFinalValue, pTemplate, pUnits) { var s = String(pFinalValue), p, tpl = pTemplate, t = pUnits, re = new RegExp(pUnits); if((p=s.search(re))>-1) { t = s.substr(p); s = s.replace(re, ""); } if(M4.browser.IE) p = "msTransform"; else if (M4.browser.CHROME||M4.browser.SAFARI) p = "WebkitTransform"; else if (M4.browser.FF) p = "MozTransform"; else p = "transform"; return new M4TweenInfos(p, s, t, tpl); }, extractStartValue:function(pCtx, pProperty, pTemplateParts, pCallback) { var v = pCtx[pProperty], t; if(v) { if(v.indexOf("matrix")>-1) { t = v.split('(')[1].replace(')', '').split(', '); return pCallback(t); } else { v = v.replace(pTemplateParts[0], ""); v = v.replace(pTemplateParts[1], ""); v = v=="none"?0:v; } } else v = 0; return v; } } }; M4Tween.from = function(pStartValue) { return new M4Tween.Dummy(pStartValue); }; M4Tween.Dummy = function(pStartValue) { this.target = {value:pStartValue}; }; M4Tween.Dummy.prototype = { to:function(pEndValue) { this.endValue = pEndValue; return this; }, start:function(pDuration, pOptions) { pDuration = pDuration||1; pOptions = pOptions || {}; pOptions.value = this.endValue; pOptions.useStyle = false; return M4Tween.to(this.target, pDuration, pOptions); } }; /**Easing Equations by Robert Penner (http://www.robertpenner.com/easing/ - BSD License)**/ function Linear(){} Linear.easeNone = function(t, b, c, d){return (c*t/d) + b;}; function Back(){} Back.easeIn = function (t, b, c, d, s){if(!s){s=1.70158;}return c*(t/=d)*t*((s+1)*t - s) + b;}; Back.easeOut = function (t, b, c, d, s){if(!s){s=1.70158;}return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;}; Back.easeInOut = function (t, b, c, d, s){if(!s){s=1.70158;}if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;}; function Bounce(){} Bounce.easeOut = function(t, b, c, d) {if ((t/=d) < (1/2.75)) {return c*(7.5625*t*t) + b;}else if (t < (2/2.75)) {return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;}else if (t < (2.5/2.75)) {return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;} else {return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;}}; Bounce.easeIn = function(t, b, c, d){return c - Bounce.easeOut(d-t, 0, c, d) + b;}; Bounce.easeInOut = function (t, b, c, d){if (t < d/2) return Bounce.easeIn (t*2, 0, c, d) * .5 + b;else return Bounce.easeOut (t*2-d, 0, c, d) * .5 + c*.5 + b;}; function Quad(){} Quad.easeIn = function (t, b, c, d) {return c*(t/=d)*t + b;}; Quad.easeOut = function (t, b, c, d){return -c *(t/=d)*(t-2) + b;}; Quad.easeInOut = function (t, b, c, d){if ((t/=d/2) < 1) return c/2*t*t + b;return -c/2 * ((--t)*(t-2) - 1) + b;}; function Circ(){} Circ.easeIn = function (t, b, c, d){return ((-c * (Math.sqrt(1 - (t/=d)*t) - 1)) + b);}; Circ.easeOut = function (t, b, c, d) {return ((c * Math.sqrt(1 - (t=t/d-1)*t)) + b);}; Circ.easeInOut = function (t, b, c, d){if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;}; function Elastic(){} Elastic.easeOut = function (t, b, c, d, a, p) {var s;if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;if (!a || a < Math.abs(c)) { a=c; s = p/4; }else s = p/(Math.PI*2) * Math.asin (c/a);return (a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(Math.PI*2)/p ) + c + b);}; Elastic.easeInOut = function (t, b, c, d, a, p){var s;if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); if (!a || a < Math.abs(c)) { a=c; s = p/4; }else s = p/(Math.PI*2) * Math.asin (c/a); if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(Math.PI*2)/p )) + b; return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(Math.PI*2)/p )*.5 + c + b;}; Elastic.easeIn = function (t, b, c, d, a, p){var s;if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;if (!a || a < Math.abs(c)) { a=c; s = p/4; }else s = p/(Math.PI*2) * Math.asin (c/a);return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(Math.PI*2)/p )) + b;}; var Tooltip = (function(){ var element, eltClose, eltContent; var defaultW; function Tooltip() { element = document.createElement("div"); element.className = "tooltip"; eltClose = document.createElement("div"); eltClose.className = "close"; eltContent = document.createElement("div"); eltContent.className = "tooltip_content"; element.appendChild(eltClose); var ref = this; eltClose.addEventListener(("ontouchend" in document)?'touchend':'click', function(){ ref.hide(); }); element.appendChild(eltContent); document.body.appendChild(element); element.style.display = "block"; defaultW = element.offsetWidth; element.style.display = "none"; this.hide(); } Tooltip.displayed = false; Tooltip.current = null; Tooltip.prototype = { hide:function(pHandler) { M4Tween.killTweensOf(element); M4Tween.to(element,.4, {opacity:0}).onComplete(function() { element.style.display = "none"; if(pHandler) pHandler(); }); element.style.display = "none"; this.displayed = false; }, updateText:function(pText, pX, pY) { var initY = pY; var ismobile = isMobile() == 'mobile'; var inWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; var inHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; element.style.width = 'auto'; if(ismobile){ element.style.width = '90%'; } element.querySelector('.tooltip_content').innerHTML = pText; var d = element.style.display; element.style.display = "block"; element.style.maxHeight= "800px"; var h = element.offsetHeight; var w = element.offsetWidth; element.style.display = d; if (ismobile) { pX = (inWidth - w) / 2; // minimum top to display below the mobile menu pY = 100; if(h > (inHeight - 100)){ element.style.height = "90%"; element.style.overflow = "auto"; pY = inHeight * 0.05; } } else { pX -= w / 2; if (pX < 0) pX = 20; pY -= h + 20; if (pY < 20) { pY = initY + 20; } } element.style.left = pX + "px"; element.style.top = pY + "px"; }, display:function(pText, pX, pY) { if(pText){ this.updateText(pText, pX, pY); } element.style.display = "block"; M4Tween.killTweensOf(element); M4Tween.to(element,.3, {opacity:1}); this.displayed = true; return element; } }; return Tooltip; })(); (function(){ const LIST_VMPS = "list_vmps"; const RESULTS_VMPS = "results_vmps"; let requestVmp,requestGpr; function init(){ if($(LIST_VMPS)) { new Chosen($(LIST_VMPS),{no_results_text: "Aucun Vmp associé à cette Substance", allow_single_deselect: false, disable_search_threshold: 10 }); $(LIST_VMPS).on('change', onSelectVmpHandler); } if(!window.idVmpSelected){ return; } let idInHash = idVmpSelected; if(window.location.hash.startsWith("#vmp")){ idInHash = window.location.hash.replace("#vmp", ""); } if(idVmpSelected !== idInHash){ refreshDci(idInHash); } } function scrollToDci() { if(window.location.hash !== '') { let idElement = window.location.hash; if(window.location.hash.startsWith("#vmp")) { idElement = '#dci_overall'; } setTimeout(function (){ document.querySelector(idElement).scrollTo(); },100); } } function onSelectVmpHandler(){ let listVmps = document.getElementById(LIST_VMPS); if(listVmps) { let value = listVmps.options[listVmps.selectedIndex].value; refreshDci(value); } } function refreshDci(idVmp) { if(idVmp !== '') { let baseUrl = document.querySelector("link[rel=canonical]").getAttribute('href'); let listVmps = document.getElementById(LIST_VMPS); let name = listVmps.getAttribute('name'); idVmpSelected = idVmp; let hrefHistory = baseUrl+'#'+name+idVmp; history.replaceState({}, '', hrefHistory); let href = baseUrl+'?render=true&'+name+'='+idVmp; document.querySelector('#'+RESULTS_VMPS).classList.add('loading'); document.querySelector('#'+RESULTS_VMPS).innerHTML = ''; if(document.querySelector('.gpr-box')){ document.querySelector('.gpr-box').style.display = "none"; } if(requestVmp){ requestVmp.cancel(); } requestVmp = RequestVidal.load(href).onError(errorHandler).onComplete(displayDci); } } function displayDci(pResponse){ let data = pResponse.responseJSON; let daboxAsync; if(data.html) { document.querySelector('#'+RESULTS_VMPS).classList.remove('loading'); document.querySelector('#'+RESULTS_VMPS).innerHTML = data.html; init(); if(daboxAsync = document.querySelectorAll('#results_vmps *[rel^="Dabox"]')) { daboxAsync.forEach(function (pElement){ Dabox.registerAsync(pElement); }); } refreshGprBox(); }else{ errorHandler(); } } function refreshGprBox() { if(requestGpr){ requestGpr.cancel(); } if(document.querySelector('.VMP [name=atcCode]')) { let baseUrl = document.querySelector("base").getAttribute('href'); const atcParams = []; const atc = document.querySelectorAll('.VMP [name=atcCode]').forEach((atc)=> atcParams.push(atc.value)); requestGpr = RequestVidal.load(baseUrl+"gpr/box.html?render=true&atc="+atcParams.join(',')+"&product=vidal://vmp/"+idVmpSelected ).onError(errorHandler).onComplete(displayGpr); } } function displayGpr(pResponse){ let data = pResponse.responseJSON; if(data.html) { document.querySelector('.gpr-box').innerHTML = data.html; document.querySelector('.gpr-box').style.display = "block"; }else{ errorHandler(); } } function errorHandler() { document.querySelector('#'+RESULTS_VMPS).classList.remove('loading'); document.querySelector('#'+RESULTS_VMPS).innerHTML = "Une erreur s'est produite. Veuillez réessayer ultérieurement."; } window.addEventListener("DOMContentLoaded", init); window.addEventListener('load', (event) => { scrollToDci(); }, false); })(); console.warn('Dependencies : Document is not available'); (function(){ let overlay; let img; let close; function selectImagesToZoom(){ if (!overlay) { createElements(); } document.querySelectorAll('.site-container .main div:not(.list) img:not(.news-thumbnail):not(.icon-print-checklist):not(.picture-cond)').forEach(function(pImg){ if (pImg.width < pImg.naturalWidth || window.innerHeight < pImg.height ) { if(!pImg.getAttribute("data-zoom")){ pImg.setAttribute("data-zoom", 1); pImg.style.cursor = 'zoom-in'; pImg.style.width = null; pImg.style.height = null; pImg.addEventListener('click', zoomInHandler); } } else { if(pImg.getAttribute("data-zoom")){ pImg.removeEventListener('click', zoomInHandler); pImg.removeAttribute('data-zoom'); pImg.style.cursor = 'default'; } } }); } function zoomInHandler(e){ img.style.display = 'block'; overlay.classList.remove('hidden'); img.style.opacity = 0; if (document.getElementById('QSIFeedbackButton-btn')) { document.getElementById('QSIFeedbackButton-btn').style.display = 'none'; } let w; let h; let target = e.currentTarget; img.src = target.src; img.onload = function(){ img.style.opacity = 1; w = img.naturalWidth; h = img.naturalHeight; img.dataset.w = img.style.width = target.offsetWidth + 'px'; img.dataset.h = img.style.height = target.offsetHeight + 'px'; if (window.innerWidth < w && window.innerHeight > h) { h = window.innerWidth / w * h; w = window.innerWidth; } if (window.innerWidth > w && window.innerHeight < h) { w = window.innerHeight / h * w; h = window.innerHeight; } if (w > window.innerWidth && h > window.innerHeight) { if (w - window.innerWidth > h - window.innerHeight) { h = window.innerWidth / w * h; w = window.innerWidth; } else { w = window.innerHeight / h * w; h = window.innerHeight; } } w = w + 'px'; h = h + 'px'; M4Tween.killTweensOf(img); M4Tween.to(img, .4, { width:w, height:h }).onComplete(function (){ img.style.cursor = 'zoom-out'; close.style.display = 'flex'; }); } } function zoomOutHandler(e){ overlay.classList.add('hidden'); close.style.display = 'none'; if (document.getElementById('QSIFeedbackButton-btn')) { document.getElementById('QSIFeedbackButton-btn').style.display = 'block'; } M4Tween.killTweensOf(img); M4Tween.to(img, .3, { opacity:0, width:img.dataset.w, height:img.dataset.h }).onComplete(function (){ img.style.display = 'none'; }); img.onload = function(){}; } function createElements(){ overlay = document.createElement('div'); overlay.classList.add('zoom-overlay'); overlay.classList.add('hidden'); overlay.addEventListener('click', zoomOutHandler); img = document.createElement('img'); img.classList.add('zoom-img'); img.addEventListener('click', zoomOutHandler); document.body.appendChild(overlay); document.body.appendChild(img); close = document.createElement('div'); close.classList.add('close_zoom'); close.innerHTML = '×'; document.body.appendChild(close); close.addEventListener('click', zoomOutHandler); document.addEventListener('keydown', function(event){ if(event.key === "Escape"){zoomOutHandler()} }); } window.addEventListener('DOMContentLoaded', selectImagesToZoom); window.addEventListener('resize', selectImagesToZoom); })(); class Facet { inputs; facetsContainer; documentContent;request; facetsLoader; FACETS_LOADER = '.facets-loader'; beforeCallback = function () { }; afterCallback = function () { }; constructor(pBefore, pAfter) { let instance = this; this.beforeCallback = function(pElement) { instance.eraseResults(pElement); pBefore(pElement); } this.afterCallback = function (pElement, pResults){ instance.replaceResults(pElement, pResults) pAfter(pElement, pResults); }; this.initElements(); if(this.inputs) this.inputs.forEach(function (pFacet){ pFacet.addEventListener('change',function(e){instance.onChangeFacet(e)}); }); } initElements() { this.facetsContainer = document.querySelector('.facets-container'); if(this.facetsContainer) { this.inputs = this.facetsContainer.querySelectorAll('.facets .facet > input'); this.documentContent = document.querySelector('.document > .content'); this.facetsLoader = document.querySelector(this.FACETS_LOADER); } } onChangeFacet(e){ let form = e.target.closest('.facets'); let baseUrl = form.dataset.dest ? atob(form.dataset.dest): window.location.origin + window.location.pathname; let checkedOptions = form.querySelectorAll(':checked'); let params = []; let target = document.querySelector(form.dataset.target); checkedOptions.forEach(function (pOption) { let name = pOption.getAttribute('name'); let value = pOption.getAttribute('value'); if(value != undefined) { if( params[name]) params[name] += '&'+name+'='+value; else params[name] = value; } }) let get = uriEncode(params); history.replaceState({}, '', baseUrl + get); params['render'] = '1'; this.request = makeRequest(baseUrl, params, target, this.beforeCallback, this.afterCallback, this.request); } eraseResults(pElement){ showLoader(this.facetsLoader, 'auto'); pElement.innerHTML = ''; } replaceResults(pElement, pResults) { hideLoader(this.facetsLoader); pElement.innerHTML = pResults; this.initElements(); } } class Pagination { baseUrl; refreshButton = null; beforeCallback = function () { }; afterCallback = function () { }; request; resultClass = ''; PAGINATION_CLASS = '.link-pagination'; PAGINATION_BTN_CLASS = '.link-see-more-action'; LOADER_CLASS = '.loader'; paginationBox; paginationLoader; resultLinksNumber; totalResultLinksNumber; progressionBar; constructor(pResultClass, pBaseUrl, pBefore, pAfter, pRequest) { let instance = this; this.beforeCallback = function(pElement) { instance.showPaginationLoader(); pBefore(pElement); } this.afterCallback = function (pElement, pResultLinks){ instance.hidePaginationLoader(); pAfter(pElement, pResultLinks); instance.refresh(true); }; this.request = pRequest; this.resultClass = pResultClass; this.baseUrl = pBaseUrl; this.initElements(); this.init(); } init() { this.initElements(); if(this.refreshButton) { let instance = this; this.refreshButton.addEventListener('click', function (){ instance.onClickSeeMore(); }); } } initElements() { this.refreshButton = document.querySelector(this.PAGINATION_BTN_CLASS); this.paginationBox = document.querySelector(this.PAGINATION_CLASS); this.paginationLoader = document.querySelector(this.LOADER_CLASS + '.pagination-loader'); this.resultLinksNumber = document.querySelector(this.PAGINATION_CLASS + ' .nb-links'); this.totalResultLinksNumber = document.querySelector(this.PAGINATION_CLASS + ' .total-results'); this.progressionBar = document.querySelector(this.PAGINATION_CLASS + ' .pagination-bar-progress'); this.baseUrl = window.location.origin + window.location.pathname; } onClickSeeMore() { let params = []; params['page'] = this.refreshButton.dataset.next_page ; params['render'] = '1'; params['listOnly'] = '1'; this.request = makeRequest(this.baseUrl, params, this.paginationBox, this.beforeCallback, this.afterCallback, this.request) } showPaginationLoader() { showLoader(this.paginationLoader, 'auto'); } hidePaginationLoader(){ hideLoader(this.paginationLoader); } refresh(pNextPage) { this.initElements(); let nbDisplayedResultLinks = document.querySelectorAll(this.resultClass).length; let nbTotalResultLinks = parseInt(this.totalResultLinksNumber.innerHTML); this.resultLinksNumber.innerHTML = nbDisplayedResultLinks; this.progressionBar.style.width = (nbDisplayedResultLinks / nbTotalResultLinks) * 100 + '%'; if (this.refreshButton) { let maxPage = this.refreshButton.dataset.nb_page; let nextPage = parseInt(this.refreshButton.dataset.next_page) + 1; if (nbDisplayedResultLinks >= nbTotalResultLinks || (pNextPage && nextPage > maxPage)) this.refreshButton.style.display = 'none'; else if (pNextPage) this.refreshButton.dataset.next_page = nextPage + ''; } } } (function () { const RESULT_LINK_CLASS = '.news-link'; const RESULT_LINKS_BOX_CLASS = '.news-list'; let resultLinksList; let baseUrl = window.location.origin + window.location.pathname; let retrieveAndShowRequest; let pagination, facet; function init() { initElements(); initPagination(); initFacet(); } function initElements() { resultLinksList = document.querySelector(RESULT_LINKS_BOX_CLASS); } function initPagination() { try { pagination = new Pagination(RESULT_LINK_CLASS+':not(.loading)', baseUrl, beforeLoading, appendToResultLinks, retrieveAndShowRequest); } catch (e){} } function initFacet(){ facet = new Facet(beforeLoading, function (){initElements(); initPagination()}); } function beforeLoading() { } function appendToResultLinks(pElement, pResultLinks) { let resultLinks = createHtml('ul', pResultLinks).childNodes; resultLinks.forEach(function (e) { resultLinksList.appendChild(e); }) } function createHtml(pHtml, pResultLinks) { let div = document.createElement(pHtml); div.innerHTML = pResultLinks.trim(); return div; } window.addEventListener('DOMContentLoaded', init, true); })(); class PAYoutubePlayer { constructor() { this.paCustomParams = {}; this.mediaInit = false; } set params(params) { this.paCustomParams = params; } set media(media) { this.videoMedia = media; } onPlayerReady = (event) => { this.instanciatedPlayer = event.target; }; onPlayerStateChange = (event) => { var videoData = this.instanciatedPlayer.getVideoData(); this.paCustomParams.av_content_id = videoData.video_id; this.paCustomParams.av_content = videoData.title; this.paCustomParams.av_content_duration = this.instanciatedPlayer.getDuration() * 1000; this.paCustomParams.av_broadcasting_type = videoData.isLive ? "Live" : "Clip"; this.videoMedia.setProps(this.paCustomParams); var cursorPosition = this.instanciatedPlayer.getCurrentTime() * 1000; if (event.data === 1 && (this.previousPlayerState == -1 || !this.mediaInit)) { this.videoMedia.play(cursorPosition); this.videoMedia.playbackStart(cursorPosition); this.mediaInit = true; } if (event.data === 1 && this.previousPlayerState == 5) { this.videoMedia.playbackStart(cursorPosition); } if (event.data === 1 && this.previousPlayerState > 1) { this.videoMedia.playbackResumed(cursorPosition); } if (event.data === 2) { this.videoMedia.playbackPaused(cursorPosition); } if (event.data === 0 || (this.previousPlayerState == -1 && this.mediaInit)) { this.videoMedia.playbackStopped(cursorPosition); this.mediaInit = false; } if (event.data === 3 && this.previousPlayerState != -1) { this.videoMedia.bufferStart(cursorPosition); this.mediaInit = true; } this.previousPlayerState = this.instanciatedPlayer.getPlayerState(); }; onError = (event) => { var errorCode; switch (event.data) { case 2: errorCode = "The request contains an invalid parameter value."; break; case 5: errorCode = "The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred."; break; case 100: errorCode = "The video requested was not found."; break; case 101: errorCode = "The owner of the requested video does not allow it to be played in embedded players."; break; case 150: errorCode = "This error is the same as 101. It's just a 101 error in disguise!"; break; } this.videoMedia.error(errorCode, function () { }, { av_player_error: errorCode, }); }; onPlaybackQualityChange = (event) => { if (this.mediaInit) { this.videoMedia.quality(function () { }, { av_quality: event.data }); } }; onPlaybackRateChange = (event) => { this.videoMedia.setPlaybackSpeed(event.data); }; } const paYoutubeConnector = new PAYoutubePlayer(); (function () { function init() { const iframes = document.querySelectorAll('iframe[src*="youtube"], iframe[src*="if-cdn"]'); if (iframes.length === 0 || !window.pa) return; if (typeof(YT) == 'undefined' || typeof(YT.Player) == 'undefined') { var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); } window.onYouTubeIframeAPIReady = function() { iframes.forEach((el) => { new YoutubeConnectorHandler(el, "VIDAL France"); }); }; } window.addEventListener('DOMContentLoaded', init, true); })(); class YoutubeConnectorHandler { constructor(iframe, author) { this.author = author; const id = this.extractVideoId(iframe.src); if (!iframe.src.includes('enablejsapi=1')) iframe.src += iframe.src.includes('?') ? '&enablejsapi=1' : '?enablejsapi=1'; var player = new YT.Player(iframe, { videoId: id, events: { onReady: paYoutubeConnector.onPlayerReady, onStateChange: paYoutubeConnector.onPlayerStateChange, onError: paYoutubeConnector.onError, onPlaybackQualityChange: paYoutubeConnector.onPlaybackQualityChange, onPlaybackRateChange: paYoutubeConnector.onPlaybackRateChange, }, }); paYoutubeConnector.media = new pa.avInsights.Media(5, 5); paYoutubeConnector.onPlayerReady(player); paYoutubeConnector.params = { 'av_author': this.author, 'av_content_type': 'Vidéo', }; } extractVideoId(src) { if (src.includes('embed/')) { let startIndex = src.indexOf('embed/') + 6; let endIndex = src.indexOf('?') > -1 ? src.indexOf('?') : src.length; return src.substring(startIndex, endIndex); } else { return null; } } } console.warn('Dependencies : Article is not available'); /** * Utilities */ NodeList.prototype.forEach = Array.prototype.forEach; String.prototype.html_entity_decode = function() { var d = M4.createElement("div", {htmlText:this.toString()}); return d.firstChild.nodeValue; }; Function.prototype.proxy = function(pInstance) { var ref = this; return function(){ref.apply(pInstance, arguments);}; }; Object.clone = function(pData) { var obj = {}; for(var i in pData) { if(!pData.hasOwnProperty(i)) continue; obj[i] = pData[i]; } return obj; }; /** * Base Class * Overriding - toString - whatever */ function Class(){} Class.prototype = { super:function(pMethodName) { pMethodName = pMethodName||"constructor"; if(!this.__SUPER__||!this.__SUPER__[pMethodName]) throw new Error("Method '"+pMethodName+"' undefined"); var args = []; for(var i = 1, max = arguments.length;i0) { for(var i = 0, max=pExtends.length; i= 0; i--) a[i].dispatchEvent(e); if (typeof(this.__listeners[pEvent.type]) == "object" && this.__listeners[pEvent.type].length > 0) { for (i = 0, max = this.__listeners[pEvent.type].length; i < max; i++) { if (this.__listeners[pEvent.type] && this.__listeners[pEvent.type][i]) this.__listeners[pEvent.type][i](pEvent); } } if (pEvent.bubbles) { e = Object.clone(pEvent); e.eventPhase = CEvent.BUBBLING_PHASE; for (i = 0, max = a.length; i < max; i++) a[i].dispatchEvent(e); } break; case CEvent.BUBBLING_PHASE: if (typeof(this.__listeners[pEvent.type]) == "undefined") return; for (i = 0, max = this.__listeners[pEvent.type].length; i < max; i++) this.__listeners[pEvent.type][i](pEvent); break; } } }); function RequestVidal(pTarget, pParams, pMethod) { this.removeAllEventListener(); pMethod = (pMethod||"get").toUpperCase(); this.xhr_object = null; if (window.XMLHttpRequest) this.xhr_object = new XMLHttpRequest(); else if (window.ActiveXObject) { var t = ['Msxml2.XMLHTTP','Microsoft.XMLHTTP'],i = 0; while(!this.xhr_object&&t[i++]) try {this.xhr_object = new ActiveXObject(t[i]);}catch(e){} } if(!this.xhr_object) return; var ref = this, v = "", j = 0; for(i in pParams) v += (j++>0?"&":"")+i+"="+pParams[i]; this.xhr_object.open(pMethod, pTarget, true); this.xhr_object.onprogress = this.dispatchEvent.proxy(this); this.xhr_object.onreadystatechange=function() { if(ref.xhr_object.readyState===4) { var ct = ref.xhr_object.getResponseHeader("Content-type"); if(ct&&ct.indexOf("json")>-1) ref.xhr_object.responseJSON = JSON.parse(ref.xhr_object.responseText); switch(ref.xhr_object.status) { case 200: case 201: case 304: ref.dispatchEvent(new RequestEvent(CEvent.COMPLETE, ref.xhr_object.responseText, ref.xhr_object.responseJSON)); break; case 400: case 401: case 402: case 403: case 404: case 405: case 500: case 503: ref.dispatchEvent(new RequestEvent(RequestEvent.ERROR, ref.xhr_object.responseText, ref.xhr_object.responseJSON)); break; } } }; this.xhr_object.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset:'+RequestVidal.CHARSET); this.xhr_object.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); try { this.xhr_object.send(v); } catch(e) { console.log(e); } } Class.define(RequestVidal, [CEventDispatcher], { onComplete:function(pFunction) { this.addEventListener(CEvent.COMPLETE, pFunction, false); return this; }, onProgress:function(pFunction) { this.addEventListener(RequestEvent.PROGRESS, pFunction, false); return this; }, onError:function(pFunction) { this.addEventListener(RequestEvent.ERROR, pFunction, false); return this; }, cancel:function() { this.dispatchEvent(new RequestEvent(RequestEvent.CANCEL)); this.xhr_object.abort(); } }); RequestVidal.CHARSET = "UTF-8"; RequestVidal.load = function (pUrl, pParams, pMethod){return new RequestVidal(pUrl, pParams, pMethod);}; RequestVidal.update = function(pId, pUrl, pParams){return RequestVidal.load(pUrl, pParams).onComplete(function(pResponse){document.getElementById(pId).innerHTML = pResponse.responseText;});}; function RequestEvent(pType, pResponseText, pResponseJSON, pBubble) { this.super("constructor", pType, pBubble); this.responseText = pResponseText||""; this.responseJSON = pResponseJSON||{}; } Class.define(RequestEvent, [CEvent], {}); RequestEvent.ERROR = "error"; RequestEvent.CANCEL = "cancel"; RequestEvent.PROGRESS = "progress"; /** * @author Arnaud NICOLAS - arno06@gmail.com */ var Dabox = (function () { var ESCAPE_CODE = 27; var publicAPI = { display: function (pContent, pOptions) { if (!created) createDaBox(); pOptions = pOptions || {}; pOptions.opacities = pOptions.opacities || {}; pOptions.opacities.daboxHide = pOptions.opacities.daboxHide || 0.95; pOptions.opacities.dabox = pOptions.opacities.dabox || 1; var a = document.getElementById("DaboxHide"); var b = document.getElementById("Dabox"); M4Tween.killTweensOf(a); M4Tween.killTweensOf(b); b.innerHTML = ""; b.style.width = "auto"; b.style.overflow = "auto"; b.innerHTML = pContent; a.style.display = "block"; b.style.display = "block"; b.style.filter = "alpha(opacity=0)"; M4Tween.to(a, .2, {"opacity": pOptions.opacities.daboxHide}); M4Tween.to(b, .3, {"opacity": pOptions.opacities.dabox}); var close = document.createElement("div"); a = document.createElement("a"); a.className = "icon-close"; a.href = "#"; close.appendChild(a); b.appendChild(close); close.classList.add('close'); a.addEventListener('click', closeBoxHandler); document.addEventListener('keydown', keydownHandler); if (displayHandler.length) { for (var i = 0, max = displayHandler.length; i < max; i++) { displayHandler[i](); } } }, hide: function () { var a = document.getElementById("DaboxHide"); var b = document.getElementById("Dabox"); M4Tween.killTweensOf(a); M4Tween.killTweensOf(b); M4Tween.to(a, .3, {"opacity": 0}).onComplete(function () { a.style.display = "none"; b.style.display = "none"; if (hideHandler.length) for (var i = 0, max = hideHandler.length; i < max; i++) { hideHandler[i](); } }); M4Tween.to(b, .2, {"opacity": 0}); document.removeEventListener('keydown', keydownHandler); }, register: function (pElement, pIdContent) { if (content[pIdContent]) { pElement.setAttribute("rel", pIdContent); pElement.addEventListener('click', aClickDisplayBox); return; } var t = document.getElementById(pIdContent); if (!t) return; content[pIdContent] = t.innerHTML; t.parentNode.removeChild(t); pElement.setAttribute("rel", pIdContent); pElement.addEventListener('click', aClickDisplayBox); }, unregister: function (pIdContent) { if (content[pIdContent]) delete content[pIdContent]; }, onDisplay: function (pHandler, pReset) { pReset = pReset || false; if (pReset) { displayHandler = []; } displayHandler.push(pHandler); }, onHide: function (pHandler, pReset) { pReset = pReset || false; if (pReset) { hideHandler = []; } hideHandler.push(pHandler); }, isDisplayed: function () { var a = document.getElementById("DaboxHide"); var b = document.getElementById("Dabox"); return a && b && a.style.opacity > 0 && b.style.opacity > 0; }, getDaboxElement: function () { var elt = document.getElementById("Dabox"); return elt ? elt : null; }, registerAsync: function (pElement) { var r = pElement.getAttribute("rel"), t; if (t = r.match(/Dabox\[cbo\:([^\]]+)\]/)) { pElement.setAttribute('rel', t[1]); pElement.addEventListener('click', aClickCboBox); } else if (t = r.match(/Dabox\[async\:([^\]]+)\]/)) { pElement.setAttribute('rel', t[1]); pElement.addEventListener('click', aClickAsyncBox); } } }; var created = false; var content = {}; var displayHandler = []; var hideHandler = []; function keydownHandler(e) { if (e.keyCode === ESCAPE_CODE) { publicAPI.hide(); } } function aClickAsyncBox(e) { if (e) { e.stopImmediatePropagation(); e.stopPropagation(); e.preventDefault(); } var rel = e.currentTarget.getAttribute("rel"); RequestVidal.load(rel).onComplete(displayBoxAjax); } function aClickCboBox(e) { if (e) { e.stopImmediatePropagation(); e.stopPropagation(); e.preventDefault(); } var rel = decodeURIComponent(window.atob(e.currentTarget.getAttribute("rel"))); RequestVidal.load(rel).onComplete(displayBoxAjax); } function displayBoxAjax(pResponse) { var html = pResponse.responseJSON && pResponse.responseJSON.html ? pResponse.responseJSON.html : pResponse.responseText; publicAPI.display(html); } function createDaBox() { var hide = document.createElement("div"); hide.setAttribute("id", "DaboxHide"); document.body.appendChild(hide); var box = document.createElement("div"); box.setAttribute("id", "Dabox"); document.body.appendChild(box); created = true; hide.addEventListener('click', closeBoxHandler); } function closeBoxHandler(e) { if (e) { e.stopImmediatePropagation(); e.stopPropagation(); e.preventDefault(); } publicAPI.hide(); } function aClickDisplayBox(e) { if (e) { e.stopImmediatePropagation(); e.stopPropagation(); e.preventDefault(); } var rel = e.target.getAttribute("rel") ? e.target.getAttribute("rel") : e.target.parentNode.getAttribute('rel'); publicAPI.display(content[rel]); } function initDaBox() { document.querySelectorAll('*[rel^="Dabox"]').forEach(function (a) { if (a.rel == "") return; var r = a.getAttribute("rel"), t; t = r.match(/Dabox\[([a-z0-9\_\-]+)\]/); t = t ? t[1] : null; if (t) { publicAPI.register(a, t); } publicAPI.registerAsync(a); }); } NodeList.prototype.forEach = Array.prototype.forEach; window.addEventListener("load", initDaBox); return publicAPI; })(); var Scroll = { __offsets:[], __scrollHandler:function(e) { var o, currentHash; for(var i = 0, max = Scroll.__offsets.length-1;i= o.offset && window.scrollY b.offset) return 1; return 0; }); }, selectHash:function(pHash){ document.querySelectorAll('a.current') .forEach(function(a) { a.classList.remove("current"); }); document.querySelectorAll('a[href*="'+pHash+'"]') .forEach(function(a) { a.classList.add("current"); }); }, prepareAll:function(pSelector) { var els = document.querySelectorAll(pSelector); els.forEach(function(pEl){pEl.setAttribute("data-scrollTop", Scroll.offsetTop(pEl));}); }, to:function(pElement, pTime) { pTime = pTime||.5; var st = Number(pElement.getAttribute("data-scrollTop")||Scroll.offsetTop(pElement)); var t = document.documentElement.scrollTop ? document.documentElement:document.body; M4Tween.killTweensOf(t); return M4Tween.to(t, pTime, {useStyle:false, scrollTop:st}); }, offsetTop:function(pElement) { if(pElement==undefined) return 0; var v = pElement.offsetTop; var o = pElement.offsetParent; while(o) { v += o.offsetTop; o = o.offsetParent; } return v; } }; (function(){ function init() { Dabox.onDisplay(function () { var img=document.querySelector('#Dabox .img_url_ressource'); var DaboxElement=document.querySelector('#Dabox'); var checkVideo=document.querySelector('#Dabox div.box_popin video.video_player'); var checkVideoYoutube=document.querySelector('#Dabox div.box_popin iframe'); if (checkVideo||img||checkVideoYoutube){ DaboxElement.style.overflow="inherit"; if(checkVideo||img){ DaboxElement.style.width="800px"; DaboxElement.style.maxHeight="50%"; } } }); Dabox.onHide(function(){ document.querySelectorAll('#Dabox div.box_popin video.video_player').forEach(function(pEl) { pEl.pause(); }); document.querySelectorAll('#Dabox div.box_popin iframe').forEach(function(pEls) { pEls.src=''; }); }); } window.addEventListener('DOMContentLoaded', init); })(); (function() { let MAX_RATIO = 0.5; let shadow, container, imgDiv, title, close, viewer, mediaDiv, closeDiv, diapo = {}; let order = []; let index = 0; let numberOfMedia = 0; function init() { const productName = document.querySelector('.title h1').innerHTML; createViewer(); const containers = document.querySelectorAll('.pictures-cond'); containers.forEach(container => { const viewers = container.querySelectorAll('[data-role^="viewer:"]'); if (viewers.length >= 2) { container.classList.add('has-multiple-viewers'); } }); document.querySelectorAll('*[data-role^="viewer:"]').forEach(function (pEl) { if (pEl.nodeName.toLowerCase() === 'a') { pEl.setAttribute('src', pEl.getAttribute('data-src')); } const id_viewer = pEl.getAttribute('data-role').replace('viewer:', ''); if (!diapo[id_viewer]) { diapo[id_viewer] = []; } pEl.setAttribute("data-index", diapo[id_viewer].length); pEl.addEventListener("click", function (e) { const id_viewer = e.currentTarget.getAttribute('data-role').replace('viewer:', ''); display(id_viewer,Number(e.currentTarget.getAttribute('data-index'))); }); numberOfMedia ++; diapo[id_viewer].push({ name: pEl.getAttribute("name") ? pEl.getAttribute("name") : productName, width: null, height: null, img: null, loaded: false, title: pEl.getAttribute("data-title") || pEl.innerHTML, src: pEl.getAttribute('src'), video: pEl.getAttribute('data-video') }); }); order = Object.keys(diapo); document.querySelectorAll('h2.rubric').forEach(function(pEl) { const rubrics=pEl.innerText.toLowerCase(); let length_rubric =document.querySelectorAll('div#'+rubrics+' div.rubric ul li').length; if (length_rubric>2){ for(let i=2;i= order.length) { return order[0]; } else { return order[currentIndex + 1]; } } function prevViewer(currentViewer) { const currentIndex = order.indexOf(currentViewer); if (currentIndex === 0 ) { return order[order.length - 1]; } else { return order[currentIndex - 1]; } } function createThumbnail(pImages,pViewer) { let containerMiniature = document.getElementById('miniature'); if(containerMiniature) document.getElementById('miniature').innerHTML = ""; if (pImages && pImages.length > 1) { if (!containerMiniature) { containerMiniature = document.createElement("div"); containerMiniature.setAttribute('id', "miniature"); container.appendChild(containerMiniature); } for (let i = 0; i < pImages.length; i++) { let miniatureImage = document.createElement("img"); if (pImages[i].video === "1") { miniatureImage.setAttribute('src', './includes/components/2020/imgs/picto-vidalbox-video.png'); miniatureImage.classList.add('miniature-video'); } else { miniatureImage.setAttribute('src', pImages[i].src); } if (i === index) { miniatureImage.classList.add('miniature-current'); } miniatureImage.setAttribute('alt', pImages[i].title); miniatureImage.setAttribute('data-index', i.toString()); miniatureImage.addEventListener("click", function (e) { display(pViewer, Number(e.currentTarget.getAttribute('data-index'))); }) containerMiniature.appendChild(miniatureImage); } } } function triggerImgSwap(){ M4Tween.to(container.querySelector(".media"),.2, {opacity:1}); } function createViewer(){ shadow = document.createElement("div"); shadow.setAttribute("id", "box_viewer_shadow"); shadow.style.cssText = "opacity:0;display:none;"; shadow.addEventListener("click", hideBox, false); document.body.appendChild(shadow); container = document.createElement("div"); container.setAttribute("id", "box_viewer_container"); container.setAttribute("class", "loading"); imgDiv = document.createElement("div"); container.appendChild(imgDiv); title = document.createElement("span"); title.setAttribute('class', 'title box-title'); imgDiv.appendChild(title); closeDiv = document.createElement("div"); closeDiv.setAttribute('class', 'close'); imgDiv.appendChild(closeDiv); close = document.createElement("a"); close.setAttribute('class', 'icon-close'); let img = document.createElement('img'); img.setAttribute('src', 'includes/components/2020/imgs/icon-close-red.png'); img.classList.add('button-tertiary'); close.appendChild(img); closeDiv.appendChild(close); let arrowRight = document.createElement("div"); let arrowLeft = document.createElement("div"); arrowRight.setAttribute('class', 'arrow right') arrowLeft.setAttribute('class', 'arrow left') mediaDiv = document.createElement("div"); mediaDiv.setAttribute('class', 'media'); imgDiv.appendChild(mediaDiv); mediaDiv.appendChild(arrowRight); mediaDiv.appendChild(arrowLeft); close.addEventListener("click", hideBox, false); document.body.appendChild(container); } function hideBox(){ if(document.querySelector('video.current-media')){ document.querySelector('video.current-media').pause(); } M4Tween.killTweensOf(shadow); M4Tween.to(shadow,.3, {opacity:0, delay:.2}).onComplete(function(){shadow.style.display = "none";}); M4Tween.killTweensOf(container); M4Tween.to(container,.3, {opacity:0}).onComplete(function(){ container.style.display = "none"; document.querySelectorAll('.arrow').forEach(function (element) { element.remove(); }); if(document.getElementById('miniature')) document.getElementById('miniature').remove(); document.querySelectorAll('#box_viewer_container #miniature .media').forEach(function (element) { element.setAttribute('class', ''); }); }); } function initPianoAvVideo() { const videos = document.querySelectorAll('.doc_video'); if (!videos) return; videos.forEach((el) => { new PaBoxVideo(el); }); } window.addEventListener("DOMContentLoaded", init, false); })(); class PaBoxVideo { constructor(el) { if (!window.pa) return; this.el = el; this.player = el.querySelector('video'); this.isFirstPlay = true; this.previousPlayerStateSeeked = false; this.cache = 0; this.cache_prev = 0; this.initPianoAvVideo(); } initPianoAvVideo() { this.paMedia = new pa.avInsights.Media(5,5); const date = new Date(this.el.getAttribute('data-date')); const properties = { av_content_id: this.el.getAttribute('data-id'), av_content: this.el.getAttribute('data-title').replace(/<[^>]+>/g, ''), av_content_type: this.el.getAttribute('data-type'), av_author: '', av_publication_date: date.getTime(), }; this.paMedia.setProps(properties); const eventHandlers = { loadedmetadata: () => { this.paMedia.set('av_content_duration', getMs(this.player.duration)); }, playing: () => { if (!this.isFirstPlay && (this.previousPlayerStateSeeked || this.previousPlayerStatePaused) ) { this.paMedia.playbackResumed(getMs(this.player.currentTime)); } else if (this.isFirstPlay) { this.paMedia.play(getMs(this.player.currentTime)); this.paMedia.playbackStart(getMs(this.player.currentTime)); this.isFirstPlay = false; } }, seeked: () => { this.paMedia.seek(getMs(this.cache_prev), getMs(this.player.currentTime)); this.previousPlayerStateSeeked = true; }, pause: () => { this.paMedia.playbackPaused(getMs(this.player.currentTime)); this.previousPlayerStatePaused = true; }, ended: () => { this.paMedia.playbackStopped(getMs(this.player.currentTime)); }, timeupdate: () => { if (this.cache !== this.player.currentTime) { this.cache_prev = this.cache; this. cache = this.player.currentTime; } } }; for (var eventName in eventHandlers) { this.player.addEventListener(eventName, eventHandlers[eventName], false); } } } function getMs(time) { return Math.trunc(time*1000); } const Tab = { callbackOnSelect: () => { }, setup: function (pSelector) { document.querySelectorAll(pSelector).forEach(function (pLi) { pLi.addEventListener("click", tabSelectedHandler, false); }); }, setCallBackOnSelect: function (callBackOnSelect) { Tab.callBackOnSelect = callBackOnSelect; }, selectTab: function (pTabId) { if(!document.querySelector('[data-role="Tab:' + pTabId + '"]')){ return; } tabSelectedHandler({ preventDefault: function () { }, currentTarget: document.querySelector('[data-role="Tab:' + pTabId + '"]') }) }, }; function tabSelectedHandler(e) { e.preventDefault(); const t = e.currentTarget; const id = t.getAttribute("data-role").replace("Tab:", ""); const currentLi = t.parentNode.querySelector(".current"); if (!id) { return; } var content = document.getElementById(id); if (!content) { return; } currentLi.setAttribute("class", ""); t.setAttribute("class", "current"); const currentlyDisplay = document.getElementById(currentLi.getAttribute("data-role").replace("Tab:", "")); currentlyDisplay.style.display = "none"; content.style.display = "inherit"; const permalink = content.querySelector("input[type='hidden']"); if (permalink) { var selectedPermalink = document.getElementById("selected_tab_permalink"); if (selectedPermalink) selectedPermalink.value = permalink.value; } Tab.callBackOnSelect&&Tab.callBackOnSelect(id); } (function () { function init(){ Tab.setup('.tabs li'); } window.addEventListener("DOMContentLoaded", init, false); })(); console.warn('Dependencies : IconsLegend is not available'); /** * complete.ly 1.0.0 * MIT Licensing * Copyright (c) 2013 Lorenzo Puccetti * * This Software shall be used for doing good things, not bad things. * **/ function completely(container, config) { config = config || {}; config.fontSize = config.fontSize || '16px'; config.fontFamily = config.fontFamily || 'sans-serif'; config.promptInnerHTML = config.promptInnerHTML || ''; config.color = config.color || '#333'; config.hintColor = config.hintColor || '#aaa'; config.backgroundColor = config.backgroundColor || '#fff'; config.dropDownBorderColor = config.dropDownBorderColor || '#aaa'; config.dropDownZIndex = config.dropDownZIndex || '100'; // to ensure we are in front of everybody config.dropDownOnHoverBackgroundColor = config.dropDownOnHoverBackgroundColor || '#ddd'; config.placeHolder = config.placeHolder||"Recherche"; var txtInput = document.createElement('input'); txtInput.type ='text'; //txtInput.spellcheck = false; txtInput.style.width = '100%'; txtInput.style.outline = '0'; txtInput.style.border = '0'; txtInput.style.margin = '0'; txtInput.setAttribute('placeholder', config.placeHolder); txtInput.setAttribute('autocomplete', 'off'); var txtHint = txtInput.cloneNode(); txtHint.disabled=''; txtHint.style.position = 'absolute'; txtHint.style.top = '0'; txtHint.style.left = '0'; txtHint.style.borderColor = 'transparent'; txtHint.style.boxShadow = 'none'; txtHint.style.color = config.hintColor; txtHint.style.display = 'none'; txtInput.style.backgroundColor ='transparent'; var wrapper = document.createElement('div'); wrapper.style.position = 'relative'; wrapper.style.outline = '0'; wrapper.style.border = '0'; wrapper.style.margin = '0'; wrapper.style.padding = '0'; var prompt = document.createElement('div'); prompt.style.position = 'absolute'; prompt.style.outline = '0'; prompt.style.margin = '0'; prompt.style.padding = '0'; prompt.style.border = '0'; prompt.style.fontSize = config.fontSize; prompt.style.fontFamily = config.fontFamily; prompt.style.color = config.color; prompt.style.backgroundColor = config.backgroundColor; prompt.style.top = '0'; prompt.style.left = '0'; prompt.style.overflow = 'hidden'; prompt.innerHTML = config.promptInnerHTML; prompt.style.background = 'transparent'; if (document.body === undefined) { throw 'document.body is undefined. The library was wired up incorrectly.'; } document.body.appendChild(prompt); var w = prompt.getBoundingClientRect().right; // works out the width of the prompt. wrapper.appendChild(prompt); prompt.style.visibility = 'visible'; prompt.style.left = '-'+w+'px'; wrapper.style.marginLeft= w+'px'; wrapper.appendChild(txtHint); wrapper.appendChild(txtInput); //noura var dropDown = document.createElement('div'); dropDown.setAttribute('class', 'dropdown'); dropDown.style.position = 'absolute'; dropDown.style.visibility = 'hidden'; dropDown.style.outline = '0'; dropDown.style.padding = '10'; dropDown.style.textAlign = 'left'; dropDown.style.zIndex = config.dropDownZIndex; dropDown.style.cursor = 'default'; dropDown.style.overflowX= 'hidden'; dropDown.style.whiteSpace = 'pre'; var counterKeyPress=0; var createDropDownHistoryController = function(elem) { if (!elem) return { hide: () => {}, shown: () => {}, move : () => {}, click: () => {} } let oldIndex = -1; const histories = elem.querySelectorAll("div.dropdown_history_item_mobility"); const historiesLength = histories.length; histories.forEach(item => { item.addEventListener('mouseover', function() { histories.forEach(i => i.classList.remove('hover')); this.classList.add('hover'); }); item.addEventListener('mouseout', function() { this.classList.remove('hover'); }); }); var p = { hide: function () { elem.style.visibility = "hidden"; }, shown: function () { const vph = (window.innerHeight || document.documentElement.clientHeight); const rect = elem.parentElement.getBoundingClientRect(); const distanceToTop = rect.top - 20; const distanceToBottom = vph - rect.bottom - 20; if (distanceToTop > distanceToBottom*3) elem.style.maxHeight = distanceToTop+'px'; else elem.style.maxHeight = distanceToBottom+'px'; elem.style.visibility = "visible"; }, move : function(step) { const newIndex = oldIndex + step; if (newIndex >= 0 && newIndex < historiesLength) { histories.forEach(i => i.classList.remove('hover')); histories[newIndex].classList.add('hover'); oldIndex = newIndex; } }, click: function() { if (oldIndex >= 0 && oldIndex < historiesLength) histories[oldIndex].click(); } } return p; } var createDropDownController = function(elem) { var rows = []; var ix = -1; var oldIndex = -1; var onMouseDown = function() { p.hide(); p.onmouseselection(this); }; var onMouseOver = function(event){ var index = event.target.index; if (index !== undefined) { p.highlight(index); } } var p = { hide : function() { elem.style.visibility = 'hidden'; if(document.querySelector('.autocomplete-mssg')){ document.querySelector('.autocomplete-mssg').style.display = "none"; } setTimeout(dropDownHistory.hide, 250); }, refresh : function(token, array) { elem.style.visibility = 'hidden'; ix = 0; elem.innerHTML =''; var vph = (window.innerHeight || document.documentElement.clientHeight); var rect = elem.parentNode.getBoundingClientRect(); var distanceToTop = rect.top - 6; // heuristic give 6px var distanceToBottom = vph - rect.bottom -6; // distance from the browser border. var parts = token.trim().toLowerCase().split(' '); for(let i= 0; i'; } divRow.innerHTML += array[i].split(' ').reduce(function (pVal, pWord) { parts.forEach(function (pPart) { if (pWord.indexOf('') > -1) { return; } pWord = pWord.replace(new RegExp('(' + pPart + ')', 'gi'), '$1'); }); return pVal+ ' ' + pWord; }, '')+''; divRow.style.width = "100%"; rows.push(divRow); elem.appendChild(divRow); } if (rows.length===0) { return; // nothing to show. } if (rows.length===1 && token === rows[0].__hint) { return; // do not show the dropDown if it has only one element which matches what we have just displayed. } // if (rows.length<2) return; // p.highlight(0); if (distanceToTop > distanceToBottom*3) { // Heuristic (only when the distance to the to top is 4 times more than distance to the bottom elem.style.maxHeight = distanceToTop+'px'; // we display the dropDown on the top of the input text elem.style.top =''; elem.style.bottom ='100%'; } else { elem.style.bottom = ''; elem.style.maxHeight = distanceToBottom+'px'; } elem.style.visibility = 'visible'; dropDownHistory.hide(); }, highlight : function(index) { if(rows[index]!=undefined){ if (oldIndex !=-1 && rows[oldIndex]) { rows[oldIndex].removeAttribute('class'); } rows[index].setAttribute('class', 'selected'); oldIndex = index; } }, move : function(step) { // moves the selection either up or down (unless it's not possible) step is either +1 or -1. if (elem.style.visibility === 'hidden') return ''; // nothing to move if there is no dropDown. (this happens if the user hits escape and then down or up) if (ix+step === -1 || ix+step === rows.length) return rows[ix].__hint; // NO CIRCULAR SCROLLING. ix+=step; p.highlight(ix); return rows[ix].__hint; }, onmouseselection : function() {} // it will be overwritten. }; txtInput.onblur = p.hide; return p; }; var dropDownController = createDropDownController(dropDown); var dropDownHistory = createDropDownHistoryController(document.querySelector(".dropdown_history")); dropDownController.onmouseselection = function(pContext) { txtInput.value = txtHint.value = leftSide+pContext.__hint; //rs.onChange(txtInput.value, pContext.getAttribute('date-url')); registerOnTextChangeOldValue = txtInput.value; // <-- ensure that mouse down will not show the dropDown now. setTimeout(function() { txtInput.focus(); },0); // <-- I need to do this for IE rs.onSelect(pContext.dataset); }; var counter = 2; var PopupTimer = setInterval(function(){ if (txtInput === document.activeElement && txtInput.value.length>2 && txtInput.getAttribute('placeholder')=="Asthme, aspirine, amoxicilline...") { if(counter <= 0){ clearInterval(PopupTimer); var span_popup=document.createElement('span'); txtInput.after(span_popup); span_popup.innerHTML="Utiliser la flèche de droite pour autocompléter"; span_popup.className="autocomplete-mssg"; } counter -= 1; } }, 2000); if(txtInput.getAttribute('placeholder')=="Asthme, aspirine, amoxicilline..."){ var timeout; txtInput.addEventListener('keypress', function(){ if(counter <= 0){ clearTimeout(timeout); if(document.querySelector('.autocomplete-mssg') || txtInput.value.length<=3){ document.querySelector('.autocomplete-mssg').style.display="none"; } } timeout = setTimeout(function() {if(document.querySelector('.autocomplete-mssg') && txtInput.value.length>2 && dropDown.visibility=="visible"){ document.querySelector('.autocomplete-mssg').style.display="block"; }}, 2000 ) } );} if(txtInput.value.length<=3){ if(document.querySelector('.autocomplete-mssg')) { document.querySelector('.autocomplete-mssg').style.display = "none"; } } wrapper.appendChild(dropDown); container.appendChild(wrapper); var spacer; var leftSide; // <-- it will contain the leftSide part of the textfield (the bit that was already autocompleted) function calculateWidthForText(text) { if (spacer === undefined) { // on first call only. spacer = document.createElement('span'); spacer.style.visibility = 'hidden'; spacer.style.position = 'fixed'; spacer.style.outline = '0'; spacer.style.margin = '0'; spacer.style.padding = '0'; spacer.style.border = '0'; spacer.style.left = '0'; spacer.style.whiteSpace = 'pre'; spacer.style.fontSize = config.fontSize; spacer.style.fontFamily = config.fontFamily; spacer.style.fontWeight = 'normal'; document.body.appendChild(spacer); } // Used to encode an HTML string into a plain text. // taken from http://stackoverflow.com/questions/1219860/javascript-jquery-html-encoding spacer.innerHTML = String(text).replace(/&/g, '&') .replace(/"/g, '"') .replace(/'/g, ''') .replace(//g, '>'); return spacer.getBoundingClientRect().right; } var rs = { onArrowDown : function() {dropDownHistory.move(+1);}, // defaults to no action. onArrowUp : function() {dropDownHistory.move(-1);}, // defaults to no action. onEnter : function() {dropDownHistory.click();}, // defaults to no action. onTab : function() {}, // defaults to no action. onSelectTab : function() {}, onSelectEnter : function() {}, onChange: function() { rs.repaint() }, // defaults to repainting. onSelect: function(){}, onClick: function(){ if (txtInput.value.length === 0) dropDownHistory.shown(); }, startFrom: 0, options: [], wrapper : wrapper, // Only to allow easy access to the HTML elements to the final user (possibly for minor customizations) input : txtInput, // Only to allow easy access to the HTML elements to the final user (possibly for minor customizations) hint : txtHint, // Only to allow easy access to the HTML elements to the final user (possibly for minor customizations) dropDown : dropDown, // Only to allow easy access to the HTML elements to the final user (possibly for minor customizations) prompt : prompt, setText : function(text) { txtHint.value = text; txtInput.value = text; }, getText : function() { return txtInput.value; }, hideDropDown : function() { dropDownController.hide(); }, repaint : function(pResults) { var text = txtInput.value; var startFrom = rs.startFrom; var options = rs.options; var optionsLength = options.length; if(pResults){ dropDownController.results = pResults; } // breaking text in leftSide and token. var token = text.substring(startFrom); leftSide = text.substring(0,startFrom); // updating the hint. txtHint.value =''; for (var i=0;i 0) dropDownHistory.hide(); if(txtInput.value.length<=3) { if (document.querySelector('.autocomplete-mssg')) { document.querySelector('.autocomplete-mssg').style.display = "none"; } } e = e || window.event; var keyCode = e.keyCode; if (keyCode == 33) { return; } // page up (do nothing) if (keyCode == 34) { return; } // page down (do nothing); if (keyCode == 27) { //escape dropDownController.hide(); dropDownHistory.hide(); txtHint.value = txtInput.value; // ensure that no hint is left. txtInput.focus(); return; } if (keyCode == 39 || keyCode == 35 || keyCode == 9) { // right, end, tab (autocomplete triggered) if (keyCode == 9) { // for tabs we need to ensure that we override the default behaviour: move to the next focusable HTML-element e.preventDefault(); e.stopPropagation(); if (txtHint.value.length == 0) { rs.onTab(); // tab was called with no action. // users might want to re-enable its default behaviour or handle the call somehow. } } if (txtHint.value.length > 0) { // if there is a hint dropDownController.hide(); txtInput.value = txtHint.value; var hasTextChanged = registerOnTextChangeOldValue != txtInput.value; registerOnTextChangeOldValue = txtInput.value; // <-- to avoid dropDown to appear again. // for example imagine the array contains the following words: bee, beef, beetroot // user has hit enter to get 'bee' it would be prompted with the dropDown again (as beef and beetroot also match) if (hasTextChanged) { if(document.querySelectorAll('.results')[0]!= txtInput.value && document.querySelectorAll('.selected')[0]==undefined){ var end=document.querySelectorAll('.results')[0].innerHTML.indexOf(''); var cut=document.querySelectorAll('.results')[0].innerHTML.substring(end); var clean=cut.replace(/<\s*[^>]*>/gi, ''); txtInput.value=clean; } } rs.onSelectTab(hasTextChanged,e); } if(document.querySelector('.dropdown').visibility=="hidden"){ document.querySelector('.autocomplete-mssg').style.display="none"; } return; } if (keyCode == 13) { // enter (autocomplete triggered) if (txtHint.value.length == 0 || !keyboardActions) { // if there is a hint rs.onEnter(); } else { var wasDropDownHidden = (dropDown.style.visibility == 'hidden'); dropDownController.hide(); if (wasDropDownHidden) { txtHint.value = txtInput.value; // ensure that no hint is left. txtInput.focus(); rs.onEnter(); return; } txtInput.value = txtHint.value; var hasTextChanged = registerOnTextChangeOldValue != txtInput.value ; registerOnTextChangeOldValue = txtInput.value; rs.onSelectTab(hasTextChanged,e); } return; } var size= document.querySelectorAll('.results').length; if (keyCode == 40) { counterKeyPress++; if(counterKeyPress==1){ var m = dropDownController.move(+0); }else{ if(counterKeyPress>1 && size==0||size!=0) { var m = dropDownController.move(+1); } } keyboardActions = true; if (m == '') { rs.onArrowDown(); } txtHint.value = leftSide+m; return; } if (keyCode == 38 ) { // up keyboardActions = true; var m = dropDownController.move(-1); if (m == '') { rs.onArrowUp(); } txtHint.value = leftSide+m; e.preventDefault(); e.stopPropagation(); return; } // it's important to reset the txtHint on key down. // think: user presses a letter (e.g. 'x') and never releases... you get (xxxxxxxxxxxxxxxxx) // and you would see still the hint txtHint.value =''; // resets the txtHint. (it might be updated onKeyUp) }; if (txtInput.addEventListener) { txtInput.addEventListener("keydown", keyDownHandler, false); } else { // is this a fair assumption: that attachEvent will exist ? txtInput.attachEvent('onkeydown', keyDownHandler); // IE<9 } const onClickHandler = (e) => { rs.onClick(); }; if (txtInput.addEventListener) { txtInput.addEventListener("click", onClickHandler, false); } else { // is this a fair assumption: that attachEvent will exist ? txtInput.attachEvent('click', onClickHandler); // IE<9 } var removeAccents = function (t){return t.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}; return rs; } class SearchHighlighter { constructor(rootNode = document.body) { this.rootNode = rootNode; this.results = []; this.currentResultIndex = 0; this.nbResults = 0; } highlightResult(result) { const regex = new RegExp("(" + this.escapeRegExp(result.term) + ")(?![^<]*>)", 'gi'); let html = result.originalHtml; html = html.replace(regex, '$&'); result.element.innerHTML = html; } escapeRegExp(str) { const substitutions = { ae: ['ae', 'æ', 'ǽ', 'ǣ'], a: ['a', 'á', 'ă', 'ắ', 'ặ', 'ằ', 'ẳ', 'ẵ', 'ǎ', 'â', 'ấ', 'ậ', 'ầ', 'ẩ', 'ẫ', 'ä', 'ǟ', 'ȧ', 'ǡ', 'ạ', 'ȁ', 'à', 'ả', 'ȃ', 'ā', 'ą', 'ᶏ', 'ẚ', 'å', 'ǻ', 'ḁ', 'ⱥ', 'ã'], c: ['c', 'ć', 'č', 'ç', 'ḉ', 'ĉ', 'ɕ', 'ċ', 'ƈ', 'ȼ'], e: ['e', 'é', 'ĕ', 'ě', 'ȩ', 'ḝ', 'ê', 'ế', 'ệ', 'ề', 'ể', 'ễ', 'ḙ', 'ë', 'ė', 'ẹ', 'ȅ', 'è', 'ẻ', 'ȇ', 'ē', 'ḗ', 'ḕ', 'ⱸ', 'ę', 'ᶒ', 'ɇ', 'ẽ', 'ḛ'], i: ['i', 'í', 'ĭ', 'ǐ', 'î', 'ï', 'ḯ', 'ị', 'ȉ', 'ì', 'ỉ', 'ȋ', 'ī', 'į', 'ᶖ', 'ɨ', 'ĩ', 'ḭ'], n: ['n', 'ń', 'ň', 'ņ', 'ṋ', 'ȵ', 'ṅ', 'ṇ', 'ǹ', 'ɲ', 'ṉ', 'ƞ', 'ᵰ', 'ᶇ', 'ɳ', 'ñ'], o: ['o', 'ó', 'ŏ', 'ǒ', 'ô', 'ố', 'ộ', 'ồ', 'ổ', 'ỗ', 'ö', 'ȫ', 'ȯ', 'ȱ', 'ọ', 'ő', 'ȍ', 'ò', 'ỏ', 'ơ', 'ớ', 'ợ', 'ờ', 'ở', 'ỡ', 'ȏ', 'ō', 'ṓ', 'ṑ', 'ǫ', 'ǭ', 'ø', 'ǿ', 'õ', 'ṍ', 'ṏ', 'ȭ'], u: ['u', 'ú', 'ŭ', 'ǔ', 'û', 'ṷ', 'ü', 'ǘ', 'ǚ', 'ǜ', 'ǖ', 'ṳ', 'ụ', 'ű', 'ȕ', 'ù', 'ủ', 'ư', 'ứ', 'ự', 'ừ', 'ử', 'ữ', 'ȗ', 'ū', 'ṻ', 'ų', 'ᶙ', 'ů', 'ũ', 'ṹ', 'ṵ'], }; return Array.from(this.removeAccents(str).replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).map(c => substitutions[c] ? `[${substitutions[c].join("")}]` : c).join(""); } removeAccents(str) { return str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); } searchInElement(element, terms) { terms.forEach(term => { if (this.hasAtLeastOneTerm(element, [term])) { this.results.push({ term: term, element: element, originalHtml: element.innerHTML, suggestions: [] }); } }); } traverseElements(node, terms) { if (node.nodeType === Node.ELEMENT_NODE && !this.isIgnoredElement(node)) { if (node != this.rootNode && this.hasAtLeastOneTerm(node, terms)) { this.searchInElement(node, terms); } node.childNodes.forEach(child => { this.traverseElements(child, terms); }); } } isIgnoredElement(element) { const ignoredTags = ['SCRIPT', 'STYLE', 'TEMPLATE']; return ignoredTags.includes(element.tagName); } hasAtLeastOneTerm(element, terms) { let text = this.getTextNode(element); for (const term of terms) { const regex = new RegExp(this.escapeRegExp(term), 'gi'); if (text.match(regex)) { return true; } } } setSuggestions(result) { const text = this.removeAccents(this.getTextNode(result.element).toLowerCase()); const regex = new RegExp("\\b" + this.escapeRegExp(result.term) + "\\w*", "gi"); const suggests = text.match(regex); if (suggests != null && suggests.length > 0) { result.suggestions.push(...suggests); } } getTextNode(element) { let text = ''; element.childNodes.forEach(node => { if (node.nodeType === Node.TEXT_NODE) { text += node.nodeValue; } else if (node.tagName === 'BR') { text += ' '; } }); return text; } reset() { this.results.forEach(result => { if (result.hasOwnProperty('element')) { result.element.innerHTML = result.originalHtml; } }); this.results = []; this.currentResultIndex = 0; this.nbResults = 0; } searchAndHighlight(terms) { terms = terms.filter((term) => { return term.trim() !== ""; }); this.reset(); this.terms = terms; this.traverseElements(this.rootNode, this.terms); this.results.forEach(result => { this.setSuggestions(result); this.highlightResult(result); }); this.nbResults = this.rootNode.querySelectorAll("mark.term").length; this.scrollToNextResult(); return this.results; } scrollToNextResult() { if (this.nbResults > this.currentResultIndex) { this.rootNode.querySelectorAll("mark.term.focused").forEach(mark => mark.classList.remove('focused')); this.rootNode.querySelectorAll("mark.term")[this.currentResultIndex].classList.add('focused'); this.rootNode.querySelectorAll("mark.term")[this.currentResultIndex].scrollIntoView(); } if (this.currentResultIndex == this.nbResults - 1) { this.currentResultIndex = 0; } else { this.currentResultIndex = this.currentResultIndex + 1; } } } class SearchHighlighterInput { constructor(input, rootNode = document.body) { this.input = input; this.searchHighlighter = new SearchHighlighter(rootNode); this.autocomplete = null; this.trackingTimeout = null; this.init(); } init() { this.autocomplete = completely(this.input, { fontSize: '13px', placeHolder: 'Chercher dans la page' }); this.autocomplete.onChange = this.searchInputHandler.bind(this); this.autocomplete.onInput = this.searchInputHandler.bind(this); this.autocomplete.onSelect = this.selectHandler.bind(this); this.autocomplete.onEnter = this.selectHandler.bind(this); this.autocomplete.onSelectTab = this.selectHandler.bind(this); this.autocomplete.onSelectEnter = this.selectHandler.bind(this); this.autocomplete.onClick = this.onClickHandler.bind(this); } updateCount() { if (this.searchHighlighter.results.length > 0) { const num = this.searchHighlighter.currentResultIndex + 1; this.input.parentNode.querySelector('.search-terms-count').innerHTML = num + "/" + this.searchHighlighter.nbResults; this.input.parentNode.querySelector('.search-terms-count').style.display = 'block'; } else { this.input.parentNode.querySelector('.search-terms-count').style.display = 'none'; } } selectHandler(textHasChanged) { if (textHasChanged) this.searchInputHandler(this.autocomplete.input.value); else this.searchHighlighter.scrollToNextResult(); this.updateCount(); } searchInputHandler(pValue) { if (pValue.length <= 3) { if (this.searchHighlighter != null) { this.searchHighlighter.reset(); this.updateCount(); } this.input.parentNode.querySelector(".dropdown").style.visibility = "hidden"; return; } else { let searchResults = []; if (this.searchHighlighter != null) { searchResults = this.searchHighlighter.searchAndHighlight([pValue]); if (window.pa) { if (this.trackingTimeout) { clearTimeout(this.trackingTimeout); } this.trackingTimeout = setTimeout(() => { pa.sendEvent('page.search', { 'keyword': pValue }); }, 2000); } this.updateCount(); } let suggestions = []; searchResults.forEach(result => { if (result.suggestions.length > 0) suggestions.push(...result.suggestions); }); suggestions = suggestions.filter((x, i) => suggestions.indexOf(x) === i); suggestions = suggestions.slice(0, 5); suggestions.sort((a, b) => { return a.localeCompare(b); }); if (suggestions.length > 0) { this.input.parentNode.querySelector(".dropdown").style.background = "white"; this.input.parentNode.querySelector(".dropdown").style.maxHeight = "200px"; this.input.parentNode.querySelector(".dropdown").style.border = "1px solid lightgray"; this.input.parentNode.querySelector(".dropdown").style.visibility = "visible"; let opt = []; for (let i = 0; i < suggestions.length; i++) { opt.push(suggestions[i]); } this.autocomplete.options = opt; this.autocomplete.repaint(); } } } onClickHandler() { if (window.pa) pa.sendEvent('click.action', { 'click': 'Rechercher dans la page', 'click_chapter1': 'Sommaire', }) } } const inputs = document.querySelectorAll('.search-terms'); inputs.forEach(input => { new SearchHighlighterInput(input, document.querySelector(input.dataset.root) ?? document.body); }); (function(){ function init(){ if(window.data_focus){ displayMessage(data_focus, '.messages-focus', 'vidal-focus'); } var copy = document.querySelector(".copy"); if (copy) { copy.addEventListener('click', function (pEvt) { document.querySelector(".success-mssg").style.display = "inline"; var copyText = document.querySelector(".dci"); var textArea = document.createElement("textarea"); textArea.value = copyText.textContent; document.body.appendChild(textArea); textArea.select(); document.execCommand("Copy"); textArea.remove() setTimeout(function () { document.querySelector(".success-mssg").style.display = "none"; }, 1000); }); } Tab.setCallBackOnSelect(toggleLab); initSeeOrdonnance(); const availabilityInfoIcon = document.querySelector('.product-status>.availability>.icon-info'); if(!availabilityInfoIcon){ return; } VIDALPiano.delayedOverOutEvent(availabilityInfoIcon, 1000); } function toggleLab(id) { let lab = document.querySelector(".extra .lab"); let labo = document.querySelector(".extra .labo"); let display = "block"; if (id == 'doc_dci') { display= "none"; } if (lab) lab.style.display = display; if (labo) labo.style.display = display; } function initSeeOrdonnance() { const url = window.location.pathname; const pattern =/medicaments\/[a-zA-Z0-9_-]+-(\d+)\.html/; const matches = url.match(pattern); const id = matches[1]; if (id) { document.querySelectorAll('#doc_mono .main .block #interactions,#doc_mono .main .block #effets-indesirables').forEach(function (el) { const type = el.id; el.querySelector('table.title').insertAdjacentHTML("afterend", `
        `); }); } } window.addEventListener('DOMContentLoaded', init, false); })(); /* UAParser.js v0.7.18 Lightweight JavaScript-based User-Agent string parser https://github.com/faisalman/ua-parser-js Copyright ? 2012-2016 Faisal Salman Dual licensed under GPLv2 or MIT */ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,d,b){a!=Array.prototype&&a!=Object.prototype&&(a[d]=b.value)};$jscomp.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof global&&null!=global?global:a};$jscomp.global=$jscomp.getGlobal(this); $jscomp.polyfill=function(a,d,b,e){if(d){b=$jscomp.global;a=a.split(".");for(e=0;e
        '+this.options.title+"
        "+this.options.author+"
        "+e+'
        '+this.options.button+"";m.body?m.body.appendChild(t):m&&m.addEventListener("DOMContentLoaded",function(){m.body.appendChild(t)});c(".smartbanner-button",t).addEventListener("click",this.install.bind(this),!1);c(".smartbanner-close",t).addEventListener("click", this.close.bind(this),!1)},hide:function(){r.classList.remove("smartbanner-show");if("function"===typeof this.options.close)return this.options.close()},show:function(){r.classList.add("smartbanner-show");if("function"===typeof this.options.show)return this.options.show()},close:function(){this.hide();f.set(this.appId+"-smartbanner-closed","true",{path:"/",expires:new Date(Number(new Date)+864E5*this.options.daysHidden)});if("function"===typeof this.options.close)return this.options.close()},install:function(){this.hide(); f.set(this.appId+"-smartbanner-installed","true",{path:"/",expires:new Date(Number(new Date)+864E5*this.options.daysReminder)});if("function"===typeof this.options.close)return this.options.close()},parseAppId:function(){var a=c('meta[name="'+this.appMeta+'"]');if(a)return this.appId="windows"===this.type?a.getAttribute("content"):/app-id=([^\s,]+)/.exec(a.getAttribute("content"))[1]}};d.exports=a},{"component-query":2,"cookie-cutter":3,"get-doc":4,"object-assign":6,"ua-parser-js":7}],2:[function(a, d,b){function e(a,e){return e.querySelector(a)}b=d.exports=function(a,b){b=b||document;return e(a,b)};b.all=function(a,e){e=e||document;return e.querySelectorAll(a)};b.engine=function(a){if(!a.one)throw Error(".one callback required");if(!a.all)throw Error(".all callback required");e=a.one;b.all=a.all;return b}},{}],3:[function(a,d,b){b=d.exports=function(a){a||(a={});"string"===typeof a&&(a={cookie:a});void 0===a.cookie&&(a.cookie="");return{get:function(c){for(var b=a.cookie.split(/;\s*/),f=0;f< b.length;f++){var e=b[f].split("=");if(unescape(e[0])===c)return unescape(e[1])}},set:function(c,b,f){f||(f={});c=escape(c)+"="+escape(b);f.expires&&(c+="; expires="+f.expires);f.path&&(c+="; path="+escape(f.path));f.domain&&(c+="; domain="+escape(f.domain));f.secure&&(c+="; secure");return a.cookie=c}}};"undefined"!==typeof document&&(a=b(document),b.get=a.get,b.set=a.set)},{}],4:[function(a,d,b){a=a("has-dom");d.exports=a()?document:null},{"has-dom":5}],5:[function(a,d,b){d.exports=function(){return"undefined"!== typeof window&&"undefined"!==typeof document&&"function"===typeof document.createElement}},{}],6:[function(a,d,b){var e=Object.getOwnPropertySymbols,c=Object.prototype.hasOwnProperty,m=Object.prototype.propertyIsEnumerable;d.exports=function(){try{if(!Object.assign)return!1;var a=new String("abc");a[5]="de";if("5"===Object.getOwnPropertyNames(a)[0])return!1;var c={};for(a=0;10>a;a++)c["_"+String.fromCharCode(a)]=a;if("0123456789"!==Object.getOwnPropertyNames(c).map(function(a){return c[a]}).join(""))return!1; var b={};"abcdefghijklmnopqrst".split("").forEach(function(a){b[a]=a});return"abcdefghijklmnopqrst"!==Object.keys(Object.assign({},b)).join("")?!1:!0}catch(r){return!1}}()?Object.assign:function(a,b){if(null===a||void 0===a)throw new TypeError("Object.assign cannot be called with null or undefined");var d=Object(a);for(var f,g=1;g>1); var top = (screen.height/2)-(h>>1); var connectWindow = window.open(decodeURIComponent(window.atob(e.currentTarget.getAttribute("data-cbo"))),'_blank','top='+top+',left='+left+',toolbar=0,location=0,directories=0,status=1,menubar=0,titlebar=0,scrollbars=1,resizable=1,width='+w+',height='+h); if(connectWindow) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); } } window.addEventListener("DOMContentLoaded", init, false); return { setup:setup, closedHandler:VIDALConnectClosedHandler }; })(); /** * @author Arno NICOLAS - arno06@gmail.com */ if (NodeList.prototype.forEach === undefined) NodeList.prototype.forEach = Array.prototype.forEach || function(pHandler){for(var i = 0, max = this.length; i-1) p = {x: e.touches[0].pageX, y: e.touches[0].pageY}; t.setAttribute("mouse-start", p.x+","+ p.y); t.setAttribute("mouse-end", p.x+","+ p.y); todo = "add"; break; case TouchBehavior.upEvent: if (t.getAttribute("mouse-start")) { var start = t.getAttribute("mouse-start").split(","); var last = t.getAttribute("mouse-end").split(","); var distanceX = (last[0] - start[0]); var distanceY = (last[1] - start[1]); var distance = Math.sqrt((distanceX*distanceX) + (distanceY*distanceY)); if(distance>pDistance) { e.stopImmediatePropagation(); e.stopPropagation(); } todo = "remove"; } break; case TouchBehavior.moveEvent: default: if(e.type.toLowerCase().indexOf("touch")>-1) p = {x: e.touches[0].pageX, y: e.touches[0].pageY}; t.setAttribute("mouse-end", p.x+","+ p.y); todo = "remove"; break; } if (todo) t.classList[todo](pClassName); }; pElement.addEventListener(TouchBehavior.downEvent, handler, {passive:true}); pElement.addEventListener(TouchBehavior.moveEvent, handler, {passive:true}); pElement.addEventListener(TouchBehavior.upEvent, handler, {passive:true}); }); } }; function isMobile() { let devc = 'bureau'; if (navigator.userAgent.match(/(android|iphone|ipad|blackberry|symbian|symbianos|symbos|netfront|model-orange|javaplatform|iemobile|windows phone|samsung|htc|opera mobile|opera mobi|opera mini|presto|huawei|blazer|bolt|doris|fennec|gobrowser|iris|maemo browser|mib|cldc|minimo|semc-browser|skyfire|teashark|teleca|uzard|uzardweb|meego|nokia|bb10|playbook)/gi)) { if (((screen.width >= 480) && (screen.height >= 800)) || ((screen.width >= 800) && (screen.height >= 480)) || navigator.userAgent.match(/ipad/gi)) { devc = 'tablette'; } else { devc = 'mobile'; } } return devc; } function isNarrowScreen() { return window.matchMedia("(max-width: 950px)").matches; } function isTouchable() { return ("ontouchend" in document); } function uriEncode(pParams) { let get = ''; let prefix = '?'; for (let i in pParams) { get += prefix + i + '=' + pParams[i]; prefix = '&'; } return get; } function makeRequest(pUrl, pParams, pElement, pCallbackBefore, pCallbackAfter, request) { pCallbackBefore(pElement); let get = uriEncode(pParams); if (request) { request.cancel(); } request = new RequestVidal(pUrl + get, null, 'GET'); request.onComplete(function (pResponse) { let response = '

        Une erreur est survenue, veuillez réessayer

        '; if (pResponse.responseJSON) { if (pResponse.responseJSON.hasOwnProperty('html')) response = pResponse.responseJSON.html; else if (pResponse.responseJSON.hasOwnProperty('status') && pResponse.responseJSON.status === 'ok' && pResponse.responseJSON.hasOwnProperty('responseText')) { response = pResponse.responseJSON.responseText; } } pCallbackAfter(pElement, response); }); return request; } function hideLoader(pLoader) { pLoader.style.display = 'none'; pLoader.style.height = 'auto'; } function showLoader(pLoader, pHeight) { pLoader.style.height = pHeight; pLoader.style.display = 'flex'; } (function () { function init() { const SUBSCRIBED = "subscribed"; const NO_CONDITIONS = "noconditions"; initTopArrow(); document.querySelectorAll("*[data-fontsize]").forEach(function(pEl){ const fontSizeCookie = Cookie.getCookie('fontsize'); if (fontSizeCookie) { document.body.style.fontSize = fontSizeCookie; } pEl.addEventListener('click', fontSizeHandler); }); ToggleHandler.register('body'); const iconHamb = document.querySelector('.header header .icon_hamb'); if (iconHamb) { iconHamb.addEventListener('click', function (e) { document.querySelector('.menu').style.display = e.target.classList.contains('close') ? 'none' : 'block'; e.target.classList.toggle('close'); }); } const subscribed = Cookie.getCookie(SUBSCRIBED); const noConditions = Cookie.getCookie(NO_CONDITIONS); if (!subscribed && !noConditions) { if (document.querySelector('.avatar') && window.location.href.indexOf('actualites') > 1 && document.querySelector('#box_subscription_login')) { document.querySelector('#DaboxHide').style.display = 'block'; document.querySelector('#Dabox').style.display = 'block'; document.querySelector('#box_subscription_login').style.display = 'block'; document.querySelector('.sub-btn').addEventListener("click", onUpdatePreference, false); document.querySelector('.icon-close').addEventListener("click", function (e) { e.preventDefault(); boxHide(); }); document.querySelector('.btn-cancel').addEventListener("click", function () { boxHide(); }); } } if (document.querySelector('.popin_already_subscribed')) { if (subscribed) { document.querySelector('#box_login').style.display = 'block'; document.querySelector('.popin_already_subscribe').style.display = 'block'; document.querySelector('.popin_already_subscribed').style.display = 'block'; } document.querySelector('.close-icon').addEventListener("click", function (e) { e.preventDefault(); document.querySelector('.popin_already_subscribe').style.display = 'none'; document.querySelector('.popin_already_subscribed').style.display = 'none'; Cookie.eraseCookie('subscribed'); Cookie.setCookie('noconditions', '1', 7); }); } function boxHide() { document.querySelector('#DaboxHide').style.display = 'none'; document.querySelector('#Dabox').style.display = 'none'; document.querySelector('#box_subscription_login').style.display = 'none'; } let menuEvent = "mouseover"; if (isTouchable()) { TouchBehavior.applyTo('.menu>menu>div'); menuEvent = TouchBehavior.clickEvent; } else { document.querySelectorAll('.menu>menu>div').forEach(function (pItem) { pItem.addEventListener('mouseout', function (e) { e.currentTarget.classList.remove("hover"); }); }); } document.querySelectorAll(".menu>menu>div").forEach(function (pItem) { pItem.addEventListener(menuEvent, function (e) { e.preventDefault(); const opened = document.querySelectorAll(".menu>menu>div.hover"); if (opened && opened.length) { opened.forEach(function (pEl) { pEl.classList.remove("hover"); }); } e.currentTarget.classList.add('hover'); }, false); }); if (document.querySelector(".account .avatar")) { document.querySelector(".account .avatar").addEventListener("click", toggleAvatarListHandler, false); } Scroll.setup(); initSummaries(); let main_form = document.querySelector('.searchbar form'); if (main_form) { main_form.addEventListener('submit', function (e) { document.querySelector('.form-search').action = 'recherche.html'; const val = document.querySelector('#query input[name="query"]').value; if (val.length < 3 || val.length > 255) { e.preventDefault(); const search = document.querySelector("#search_error"); search.innerHTML = val.length > 255 ? "Veuillez saisir moins de 255 caractères pour votre recherche." : "Veuillez saisir au moins 3 caractères pour votre recherche."; search.style.display = 'block'; setTimeout(function () { search.style.display = 'none'; }, 3000); } }); Autocomplete.init('#query').onSelect = function (pData) { if (window.pa) pa.sendEvent('internal_search_result.click', { 'ise_keyword': this.getText(), 'ise_page': 1, 'ise_type': 'Suggestions', 'ise_click_rank': parseInt(pData.rank), 'ise_click_product': pData.name, 'ise_click_product_type': pData.type }); window.location.href = pData.url; }; } CBO.init(document); //Permet l'insertion et/ou la duplication d'un node dans des parents différents let refs = document.querySelectorAll('*[data-insert-before]'); refs.forEach(function (pEl) { if (!pEl.getAttribute("data-keep-in-place")) { pEl.parentNode.removeChild(pEl); } let targets = document.querySelectorAll(pEl.getAttribute("data-insert-before")); targets.forEach(function (pTarget) { pTarget.parentNode.insertBefore(pEl.cloneNode(true), pTarget); }); }); // Add click on print buttons let print_buttons = document.querySelectorAll('.print-button'); if (print_buttons) { let base = document.querySelector('base').getAttribute('href'); print_buttons.forEach((pButton) => { if (pButton.getAttribute('href')) { return; } pButton.addEventListener('click', function () { let url = base + "imprimer/" + window.location.href.replace(base, ""); window.open(url, '_blank'); }); }); } const contactWebMasterLink = document.getElementById("contactWebMasterLink"); if ((contactWebMasterLink) && (window.innerWidth < 650)) { contactWebMasterLink.setAttribute("rel", ""); } const contactSection = document.getElementById("contactWebmaster"); if (contactSection) { const form = document.getElementById("contactForm"); displayFormFullSize(form); changeCaptchaStyle(document.querySelector("input[name='screenType']").value, 0); form.addEventListener('submit', contactSubmitHandler); } Dabox.onDisplay(daboxDisplayedHandler); Dabox.onHide(daboxHideHandler); // Prevent Post data when accessing iam page from drugs page and reload const iamContainer = document.querySelector(".iam-row"); if (iamContainer && (window.history.replaceState)) { window.history.replaceState(null, null, window.location.href); } document.querySelectorAll("caption p").forEach(function (pItem) { const table = pItem.parentNode.parentNode; for (let i = 0; i < table.rows.length; ++i) { if (table.rows[i].cells[0].innerHTML === "" && table.rows[i].cells[0].getAttribute('colspan') == null) { table.rows[i].cells[0].style.borderRightColor = "transparent"; } } }); document.querySelectorAll('table[width="95%"]').forEach(function (pEl) { let wrapper = document.createElement('div'); wrapper.className = "scrollable-table"; pEl.parentNode.insertBefore(wrapper, pEl); wrapper.appendChild(pEl); }); initCollapsible(); let searchbar = document.querySelector('.header .searchbar'); let narrowScreen = isNarrowScreen(); let iconSearch = document.querySelector('.header ul.secondary .search' + (narrowScreen ? '-mobile' : '')); let iconClose = document.querySelector('.header ul.secondary .close' + (narrowScreen ? '-mobile' : '')); if (iconSearch && iconClose) { iconSearch.addEventListener('click', function () { searchbar.classList.add('visible'); searchbar.classList.remove('hidden'); iconClose.style.display = 'block'; iconSearch.style.display = 'none'; document.querySelector('.header .searchbar form input[name="query"]').focus(); }) iconClose.addEventListener('click', function () { searchbar.classList.add('hidden'); searchbar.classList.remove('visible'); iconClose.style.display = 'none'; iconSearch.style.display = 'block'; }); } } function initSummaries() { const summaries = document.querySelectorAll('.summary'); summaries.forEach(function (summary) { new Summary(summary); }); } function initTopArrow() { const arrow = document.querySelector(".scroll-page"); if (arrow) { const c = function () { const scroll = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; if (scroll && arrow.style.display === "none") { arrow.style.display = "block"; } if (!scroll && arrow.style.display === "block") { arrow.style.display = "none"; } }; c(); arrow.addEventListener("click", function () { const t = document.documentElement.scrollTop ? document.documentElement : document.body; M4Tween.killTweensOf(t); M4Tween.to(t, .5, {useStyle: false, scrollTop: 0}); }); window.addEventListener("scroll", c); } } function displayFormFullSize(form) { document.querySelector("input[name='screenType']").value = "fullWindow"; document.querySelector(".mandatory-text").style.fontSize = "0.8em"; const formChildren = form.querySelectorAll("input,select,textarea"); formChildren.forEach((pChild) => { if ((pChild.name !== "btnSubmit") && (pChild.id !== "inp_contact_captcha_captcha")) { pChild.classList.remove("form-input-popup"); pChild.classList.add("form-input-fullSize"); if (pChild.tagName === "INPUT") { pChild.style.lineHeight = "25px"; } } }); } function daboxDisplayedHandler() { const dabox = document.querySelector('#Dabox'); CBO.init(dabox); VIDALConnect.setup(dabox); //Style close Icon const closeIcon = document.querySelector(".icon-close"); const contactWebmasterSection = document.querySelector(".container-contact-section"); if (contactWebmasterSection) { dabox.style.overflow = 'auto'; let index = 0; // Form instance input is defined to check whether the form is rendered twice i.e form display in full window size + click on contact webmaster link to display form popup if (document.querySelector("input[name='screenType']").value === "fullWindow") { document.querySelector("input[name='formInstance']").value = "double"; document.querySelector("input[name='screenType']").value = 'popup'; index = 1; } const form = document.querySelectorAll(".contact-form-form")[index]; if (form) { changeCaptchaStyle(document.querySelector("input[name='screenType']").value, index); // Event Listeners document.querySelectorAll(".details_captcha")[index].querySelector("a").addEventListener("click", onreloadCaptcha); form.addEventListener('submit', contactSubmitHandler); } } if (typeof Subscribe != 'undefined') Subscribe.initDaboxButtons(); } function changeCaptchaStyle(screenType, i) { const captchaInputClass = screenType === "popup" ? "captcha-input-popup" : "captcha-input-fullSize"; const captchaImageClass = screenType === "popup" ? "captcha-image-popup" : "captcha-image-fullSize"; document.querySelector(".mandatory").remove(); document.querySelectorAll(".inp_contact_captcha_captcha")[i].classList.add("captcha-main-container"); document.querySelectorAll(".details_captcha")[i].querySelector("a").classList.add("captcha-reload-link"); document.querySelectorAll("input[name='contact_captcha[captcha]']")[i].classList.add("captcha-text-input"); document.querySelectorAll("input[name='contact_captcha[captcha]']")[i].classList.add(captchaInputClass); document.querySelectorAll("input[name='contact_captcha[captcha]']")[i].classList.add("form-input-text"); document.querySelectorAll(".details_captcha")[i].classList.add("captcha-text-reload"); document.querySelectorAll(".captcha")[i].querySelector("img").classList.add(captchaImageClass); } function onreloadCaptcha(pTarget) { if (pTarget) { pTarget.preventDefault(); } // i = O Form is rendred once let index = 0; // Form instance input is defined to check whether the form is rendered twice i.e form display in full window size + click on contact webmaster link to display form popup if (document.querySelector("input[name='formInstance']").value === "double") { index = 1; // Form rendered twice } document.querySelectorAll("input[name='contact_captcha[captcha]']")[index].value = ""; const i = document.querySelectorAll(".captcha")[index].querySelector("img"); if (typeof src_catpha === 'undefined') src_catpha = i.src; i.setAttribute("src", src_catpha + "" + Math.round(Math.random() * 9999) + "/"); return false; } function contactSubmitHandler(e) { e.preventDefault(); let index = 0; // Double variable is true when the contact webmaster section is rendered twice: i.e full size + click to open popup if (document.querySelector("input[name='formInstance']").value === "double") { index = 1; } const validationMessage = document.querySelectorAll(".validation-message")[index]; let data = {}; const formChildren = e.currentTarget.querySelectorAll("input,select,textarea"); formChildren.forEach((pChild) => { if (pChild.name !== 'btnSubmit') { data[pChild.name] = pChild.value; } }); toggleLoader(index, "show"); RequestVidal.load("contact.html", data, "POST").onComplete(function(response){ toggleLoader(index, "hide"); if (response.responseJSON.content.error) { displayErrorMessage(validationMessage, response.responseJSON.content.error) } else { toggleLoader(index, "show"); RequestVidal.load("submitContact.html", data, "POST").onComplete(function(response){ toggleLoader(index, "hide"); if (response.responseJSON.content.responseHTTPCode === "200") { displaySuccessMessage(validationMessage, index); } else { const errorMsg = "

        Une erreur est apparue lors de l'envoi de vos données

        "; displayErrorMessage(validationMessage, errorMsg); } }); } }); } function toggleLoader(index, message) { const submitBtn = document.querySelectorAll(".submit-form-btn")[index]; const loadImg = document.querySelectorAll(".contact-load-img")[index]; if (!submitBtn || !loadImg) { return; } if (message === "show") { submitBtn.disabled = true; loadImg.style.visibility = "visible"; } else { submitBtn.disabled = false; loadImg.style.visibility = "hidden"; } } function displaySuccessMessage(htmlMessage, index) { htmlMessage.style.opacity = "1"; htmlMessage.classList.remove("validation-error-message"); htmlMessage.classList.add("validation-success-message"); htmlMessage.innerHTML = "

        Votre demande de contact a été prise en compte

        "; setTimeout(function () { htmlMessage.style.opacity = "0"; }, 2500); document.querySelectorAll(".contact-form-form")[index].reset(); onreloadCaptcha(); } function displayErrorMessage(htmlMessage, content) { htmlMessage.style.opacity = "1"; htmlMessage.classList.add("validation-error-message"); htmlMessage.innerHTML = content; htmlMessage.querySelectorAll("p")[0].style.display = "inline"; htmlMessage.querySelectorAll("p")[0].style.padding = "0"; if (htmlMessage.querySelectorAll("p")[1]) { htmlMessage.querySelectorAll("p")[1].style.display = "inline"; htmlMessage.querySelectorAll("p")[1].style.padding = "0"; } onreloadCaptcha(); setTimeout(function () { htmlMessage.style.opacity = "0"; }, 5000); } function daboxHideHandler() { const formInstanceInput = document.querySelector("input[name='formInstance']"); const screenTypeInput = document.querySelector("input[name='screenType']"); if (formInstanceInput) { formInstanceInput.value = "single"; } if (screenTypeInput) { screenTypeInput.value = 'fullWindow'; } } function toggleAvatarListHandler(e) { if (e.target.nodeName.toLowerCase() !== "a") { e.preventDefault(); } const p = document.querySelector(".account"); const ul = p.querySelector("ul"); ul.style.display = ul.style.display && ul.style.display === "block" ? "none" : "block"; document[ul.style.display === "block" ? "addEventListener" : "removeEventListener"]("click", toggleAvatarListHandler, true); } NodeList.prototype.forEach = Array.prototype.forEach; const SIX_MONTHS = 180; function fontSizeHandler(e) { document.body.style.fontSize = e.currentTarget.getAttribute("data-fontsize"); Cookie.setCookie('fontsize', e.currentTarget.getAttribute("data-fontsize"), SIX_MONTHS); } document.addEventListener('DOMContentLoaded', init, false); })(); const ToggleHandler = { register: function (pSelector) { document.querySelector(pSelector).querySelectorAll("*[data-toggle]").forEach(function (pEl) { pEl.addEventListener('click', ToggleHandler.toggleElement); }); }, toggleElement: function (e) { e.currentTarget.classList.toggle('open'); if (e.currentTarget.getAttribute("data-toggle") && document.querySelector(e.currentTarget.getAttribute("data-toggle"))) { document.querySelector(e.currentTarget.getAttribute("data-toggle")).classList.toggle('open'); } } } const Autocomplete = (function () { function init(pSelector) { let t = document.querySelector(pSelector); t.removeEventListener('click', CBO.redirect); t.addEventListener('click', function (e) { e.stopImmediatePropagation(); }); let urlBuilder = function (pValue) { return CBO.decode(t.getAttribute("data-cbo")).replace('{value}', pValue); } let timer; let timerTracking; let req; let autocomplete = completely(t, { placeHolder: t.getAttribute('data-placeholder') }); autocomplete.setText(t.getAttribute("data-value")); autocomplete.input.setAttribute("name", t.getAttribute("id")); autocomplete.onSelectTab = function (pValue ,e ) { if(e){ e.preventDefault(); e.stopPropagation(); } window.location.href = t.querySelector('.dropdown .selected').getAttribute('data-url'); } autocomplete.onChange = function (pValue) { t.parentNode.classList.add("loading"); if (pValue.length < 3) { t.querySelector(".dropdown").style.visibility = "hidden"; if (req) { req.cancel(); } t.parentNode.classList.remove("loading"); return; } clearTimeout(timer); timer = setTimeout(function () { if (req) { req.cancel(); } req = RequestVidal.load(urlBuilder(pValue), "GET").onComplete(function (response) { t.parentNode.classList.remove("pls"); let opt = []; let results = []; const items = response.responseJSON.items; const hasResults = items && items.length; if (hasResults) { items.forEach((pItem, idx) => { const n = pItem.name.htmlEntities(); const type_search = pItem.type ? pItem.type.htmlEntities() : ''; const url = pItem.url ? pItem.url.htmlEntities() : ''; opt.push(n); results.push({id: pItem.id, name: n, url: url, type: type_search, rank: idx + 1}) }); } else if (response.responseJSON.error) { t.parentNode.classList.add("pls"); } t.parentNode.classList.remove("loading"); autocomplete.options = opt; autocomplete.repaint(results); clearTimeout(timerTracking); timerTracking = setTimeout(() => { if (window.pa) pa.sendEvent('internal_search_result.display', { 'ise_keyword': pValue, 'ise_page': hasResults ? 1 : 0, 'ise_type': 'Suggestions' }); }, 2000); }); }, 200); }; return autocomplete; } return {init: init}; })(); const CBO = { init: (pTarget) => { pTarget.querySelectorAll('*[data-cbo]').forEach(function (elt) { if (elt.nodeName.toLowerCase() === "a") { elt.setAttribute("href", CBO.decode(elt.getAttribute("data-cbo"))); return; } elt.addEventListener("click", CBO.redirect); }); }, decode: (string) =>{ return decodeURIComponent(window.atob(string));}, encode: (string) =>{ return window.btoa(string);}, redirect: (event) => { const attribute = event.currentTarget.getAttribute("data-cbo"); if (!attribute) { return; } if (event.ctrlKey) { const newWindow = window.open(CBO.decode(attribute)); newWindow.focus(); } else { document.location.href = CBO.decode(attribute); } } }; function displayMessage(pData, pSelector, pClass) { if (!pData || !pData.length) { return; } let html = ''; for (let i = 0, max = pData.length; i < max; i++) { let item = pData[i]; html += '

        ' + item.content + '

        '; } if(document.querySelector(pSelector)) document.querySelector(pSelector).innerHTML = html; } function setContentConsent() { RequestVidal.load("utilisateur/preference/?alias_preference=consent.content_personalization_profiling&value_preference=1", "GET").onComplete(function(response){ if (response.responseJSON.content.success){ displaySuccessMessage(); } }); } function displaySuccessMessage() { const message = document.querySelector(".restricted .success"); if (message) { message.classList.remove("hide"); message.classList.add("show"); setTimeout(function () { message.classList.add("remove"); message.classList.add("hide"); }, 5000); } window.location.reload(); } String.prototype.htmlEntities = function () { return this.replace(/&#(\d+);/g, function (match, dec) { return String.fromCharCode(dec); }); }; function fadeIn(pElement, pDuration, pCompleteHandler) { M4Tween.killTweensOf(pElement); pElement.style.display = "block"; M4Tween.to(pElement, pDuration, {opacity: 1}).onComplete(pCompleteHandler); } function fadeOut(pElement, pTime, pComplete) { const c = function () { pElement.style.display = "none"; if (pComplete) { pComplete(); } }; if (pElement.style.opacity === 0) { c(); return; } M4Tween.to(pElement, pTime, {opacity: 0}).onComplete(c); } function initCollapsible() { document.querySelectorAll('.collapsible').forEach(function (pCollapsible) { pCollapsible.removeEventListener('click', collapseHandler, false); pCollapsible.addEventListener('click', collapseHandler); }); } function forceHeight(pElement) { let heightBefore = pElement.offsetHeight; pElement.style.height = 'auto'; let heightAfter = pElement.offsetHeight; pElement.style.height = heightBefore + "px"; return heightAfter; } function collapseHandler() { let collapse = !this.classList.contains('collapsed'); let toCollapseElement = document.getElementById(this.dataset.collapsible_element); let toCollapse = {}; let clamp = this.dataset.clamp || false; toCollapseElement.style.overflowY = 'hidden'; if (collapse) { this.classList.add('collapsed'); toCollapse.height = '0px'; } else { this.classList.remove('collapsed'); if (clamp) { forceHeight(toCollapseElement); toCollapseElement.classList.remove('clamped') } if (toCollapseElement) { let height = forceHeight(toCollapseElement); toCollapse.height = height + "px"; } } M4Tween.killTweensOf(toCollapseElement); M4Tween.to(toCollapseElement, .6, toCollapse); } VIDALPiano = { event: (pTarget) => { if (!window.pa) { return; } let eventName = pTarget.dataset.vp || 'click.action'; let options = {}; for (let i in pTarget.dataset) { if (i.indexOf('vp_') === -1) { continue; } let value = pTarget.dataset[i]; if (value.indexOf('this.') === 0) { value = pTarget[value.replace('this.', '')]; } options[i.replace('vp_', '')] = value; } pa.sendEvent(eventName, options); }, delayedOverOutEvent: (pTarget, pDelay = 1000, pOverCallback = null, pOutCallback = null) => { let out_timeout; let pa_timeout; let sent = false; pTarget.addEventListener('mouseover', (e) => { pOverCallback && pOverCallback(); if (out_timeout) { clearTimeout(out_timeout); } if (pa_timeout) { clearTimeout(pa_timeout); } if (sent) { return; } pa_timeout = setTimeout(() => { VIDALPiano.event(pTarget); sent = true; }, pDelay); }); pTarget.addEventListener('mouseout', (e) => { out_timeout = setTimeout(() => { sent = false; pOutCallback && pOutCallback(); if (pa_timeout) { clearTimeout(pa_timeout); } }, 100); }); } }; let retrieveAndShowRequest; let deleteRequest; let deleteAllRequest; let addOrDeleteRequest; (function(){ const ADD_BTN = '.add-bookmark-button'; const RMV_BTN = '.remove-bookmark-button'; let baseUrl; function init(){ baseUrl = document.querySelector('base').getAttribute('href'); initAddBookmark(ADD_BTN); initRemoveBookmark(RMV_BTN); } function initAddBookmark(pElement) { document.querySelectorAll(pElement).forEach(addClickHandler); } function initRemoveBookmark(pElement) { document.querySelectorAll(pElement).forEach(removeClickHandler); } function addClickHandler(pValue) { pValue.addEventListener('click', onClickAddBookmark); } function removeClickHandler(pValue) { pValue.addEventListener('click', onClickRemoveBookmark); } function onClickAddBookmark(){ let params = {'name' : encodeURIComponent(this.dataset.element_name), 'id':this.dataset.element_id, 'type':this.dataset.element_type, 'render': '1'}; makeRequest(baseUrl + 'mes-signets/add/', params, this.parentNode, eraseButton, showButton, addOrDeleteRequest) } function onClickRemoveBookmark(){ let params = {'name' : this.dataset.element_name, 'id':this.dataset.element_id, 'type':this.dataset.element_type, 'render': '1'}; makeRequest(baseUrl + 'mes-signets/delete/', params, this.parentNode, eraseButton, showButton, addOrDeleteRequest) } function eraseButton(pElement) { pElement.innerHTML = ''; pElement.classList.add('loading'); } function showButton(pElement, pResponse) { setTimeout( function (){ pElement.classList.remove('loading'); pElement.innerHTML = pResponse; init(); }, 200 ); } window.addEventListener('DOMContentLoaded', init, true); })();