// included in 1.6.4 Event.KEY_PAGEUP = 33; Event.KEY_PAGEDOWN = 34; Event.KEY_HOME = 36; Event.KEY_END = 35; Element.childrenWithClassName = function(element, className, findFirst) { var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)"); var results; if (findFirst) { var result = $A($(element).getElementsByTagName('*')).detect( function(c) { return (c.className && c.className.match(classNameRegExp)); }); if (result) { results = [result]; } } else { results = $A($(element).getElementsByTagName('*')).select( function(c) { return (c.className && c.className.match(classNameRegExp)); }); } if(!results) results = []; return results; } Function.prototype.bindAsEventListener = function(object, element) { var __method = this; element = $(element); return function(event) { return __method.call(object, event || window.event, element); } } Form.Element.Serializers.button = function(element) { return [element.name, element.value]; }; Form.Element.Serializers.textarea = function(element) { var value; if (element.name && element.form && element.form.id && FormManagers[element.form.id]) { value = FormManagers[element.form.id].getValue(element.name); } else { value = element.value; } return [element.name, value]; }; Form.Element.Serializers.selectOne = function(element) { var value = '', opt, index = element.selectedIndex; if (index >= 0) { opt = element.options[index]; if (opt.hasAttribute) { value = opt.hasAttribute('value') ? opt.value : opt.text; } else { var node = opt.getAttributeNode('value'); value = (node && node.specified) ? opt.value : opt.text; } } return [element.name, value]; }; // bug in effects.js Element.setOpacity = function(element, value){ element= $(element); if (value == 1){ Element.setStyle(element, { opacity: (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1 }); if(/MSIE/.test(navigator.userAgent)) Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); } else { if(value < 0.00001) value = 0; Element.setStyle(element, {opacity: value}); if(/MSIE/.test(navigator.userAgent)) Element.setStyle(element, { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + 'alpha(opacity='+value*100+')' }); } }; Event.observe = function(element,name,observer,useCapture){ var element = $(element); useCapture = useCapture || false; this._observeAndCache(element, name, observer, useCapture); }; Event.stopObserving = function(element, name, observer, useCapture){ var element = $(element); useCapture = useCapture || false; if (element.removeEventListener) { element.removeEventListener(name, observer, useCapture); } else if (element.detachEvent) { element.detachEvent('on' + name, observer); } }; Form.serialize = function(form, submit) { submit = $(submit); var elements = Form.getElements($(form)); var queryComponents = new Array(); for (var i = 0; i < elements.length; i++) { if (!submit || elements[i].type != 'submit' || elements[i] == submit) { var queryComponent = Form.Element.serialize(elements[i]); if (queryComponent) queryComponents.push(queryComponent); } } return queryComponents.join('&'); }; Position.getViewPortBounds = function() { var left; var top; var width; var height; if (UserAgent.OPERA || UserAgent.WEBKIT) { left = self.pageXOffset; top = self.pageYOffset; width = window.innerWidth; height = window.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { left = document.documentElement.scrollLeft; top = document.documentElement.scrollTop; width = document.documentElement.clientWidth; height = document.documentElement.clientHeight; } else if (document.body) { left = document.body.scrollLeft; top = document.body.scrollTop; width = document.body.clientWidth; height = document.body.clientHeight; } return { left: left, top: top, width: width, height: height }; }; // Inheritance Class.subclass = function(subClass, superClass, properties) { function inheritance() {}; inheritance.prototype = superClass.prototype; subClass.prototype = new inheritance(); if (properties) { for (property in properties) { subClass.prototype[property] = properties[property]; } } }; // BASE var UserAgent = {}; if (navigator.userAgent.indexOf('AppleWebKit') > -1) { UserAgent.WEBKIT = true; } else if (navigator.userAgent.indexOf('Opera') > -1) { UserAgent.OPERA = true; UserAgent.VERSION = navigator.userAgent.match(/Opera.(\d)/)[1]; } else if (navigator.userAgent.indexOf('KHTML') > -1) { UserAgent.KHTML = true; } else if (navigator.userAgent.indexOf("Gecko") > -1) { UserAgent.GECKO = true; } else if (navigator.userAgent.indexOf("MSIE") > -1) { UserAgent.MSIE = true; if (window.XMLHttpRequest) { UserAgent.VERSION = 7; } else { UserAgent.VERSION = 6; } } Event.mapMacKeypressKeyCode = function(macKeyCode) { var keyCode; switch(macKeyCode) { case 63232: keyCode = Event.KEY_UP; break; case 63233: keyCode = Event.KEY_DOWN; break; case 63276: keyCode = Event.KEY_PAGEUP; break; case 63277: keyCode = Event.KEY_PAGEDOWN; break; case 63273: keyCode = Event.KEY_HOME; break; case 63275: keyCode = Event.KEY_END; break; default: keyCode = macKeyCode; } return keyCode; }; Form.Element.value = function(input) { input = $(input); var value; if (!UserAgent.MSIE) { value = input.value; } else { value = input.value.replace(/\r\n/g, '\n'); } return value; } Form.Element.setSelectionRange = function(input, start, end) { input = $(input); if (input.setSelectionRange) { input.focus(); input.setSelectionRange(start, end); } else if (input.createTextRange) { var range = input.createTextRange(); range.collapse(true); range.moveEnd('character', start); range.moveStart('character', end); range.select(); } }; Form.Element.selectionStart = function(input) { input = $(input); if (input.selectionStart != undefined) { return input.selectionStart; } else if (document.selection && input.createTextRange) { var s = document.selection.createRange(); var r = input.createTextRange(); var pos; if (UserAgent.MSIE && UserAgent.VERSION >= 7) { pos = s.getBookmark().charCodeAt(2) - 3; } else { pos = s.getBookmark().charCodeAt(2) - 2; } return pos; } else { return input.value.length; } }; Form.Element.selectionEnd = function(input) { input = $(input); if (input.selectionEnd != undefined) { return input.selectionEnd; } else if (document.selection && input.createTextRange) { var s = document.selection.createRange(); var r = input.createTextRange(); var pos; if (UserAgent.MSIE && UserAgent.VERSION >= 7) { pos = s.getBookmark().charCodeAt(2) - 3; } else { pos = s.getBookmark().charCodeAt(2) - 2; } return pos + s.text.length; } else { return input.value.length; } }; Form.Element.setCaretToStart = function(input) { input = $(input); if (input.setSelectionRange) { input.setSelectionRange(0,0); } else if (input.createTextRange) { var range = input.createTextRange(); range.collapse(true); range.select(); } }; Form.Element.setCaretToEnd = function(input) { input = $(input); if (input.setSelectionRange) { var pos = input.value.length; input.setSelectionRange(pos,pos); } else if (input.createTextRange) { var range = input.createTextRange(); range.collapse(false); range.select(); } }; Form.Element.scrollToEnd = function(input) { input = $(input); if (input.scrollTop != undefined && input.scrollHeight != undefined) input.scrollTop = input.scrollHeight - input.clientHeight; }; Form.Element.getRangeBounds = function(element, rangeStart, rangeEnd) { element = $(element); var value = Form.Element.value(element); var prefix = value.substr(0, rangeStart); var range = value.slice(rangeStart, rangeEnd); var postfix = value.substr(rangeEnd); var rLeft, rTop, rWidth, rHeight; var r; if (element.createTextRange && (r = element.createTextRange()).offsetLeft != undefined) { r.moveStart('character', prefix.length); r.moveEnd('character', -postfix.length); rLeft = r.offsetLeft + 2; rTop = r.offsetTop - 2; rWidth = r.boundingWidth; rHeight = r.boundingHeight + 4; } if (rLeft == undefined) { var tfs; var tfs_prefix; var tfs_range; var tfs_postfix; if (!Form.Element.tfs) { tfs = document.createElement('div'); tfs.style.position = 'absolute'; tfs.style.left = '0px'; tfs.style.top = '0px'; tfs.style.visibility = 'hidden'; tfs.style.overflow = 'auto'; tfs.style.border = 'solid black 1px'; tfs.style.padding = element.style.padding; tfs.style.background = 'red'; document.body.appendChild(tfs); tfs_prefix = document.createElement('span'); tfs_range = document.createElement('span'); tfs_range.style.background = 'green'; tfs_postfix = document.createElement('span'); tfs.appendChild(tfs_prefix); tfs.appendChild(tfs_range); tfs.appendChild(tfs_postfix); Form.Element.tfs = tfs; Form.Element.tfs_prefix = tfs_prefix; Form.Element.tfs_range = tfs_range; Form.Element.tfs_postfix = tfs_postfix; } else { tfs = Form.Element.tfs; tfs_prefix = Form.Element.tfs_prefix; tfs_range = Form.Element.tfs_range; tfs_postfix = Form.Element.tfs_postfix; } tfs.style.display = ''; if (range.replace(/\s*/, '') == '') range += '|'; var elDims = Element.getDimensions(element); tfs.style.width = (elDims.width - 4) + 'px'; tfs.style.height = (elDims.height - 2) + 'px'; tfs.style.fontSize = Element.getStyle(element, 'font-size'); tfs.style.fontFamily = Element.getStyle(element, 'font-family'); tfs.style.whiteSpace = 'pre'; tfs.style.textAlign = Element.getStyle(element, 'text-align') || 'left'; tfs_prefix.innerHTML = prefix.replace(/\n/g,'
'); tfs_range.innerHTML = range.replace(/\n/g,'
'); tfs_postfix.innerHTML = postfix.replace(/\r\n/g,'
'); tfs.scrollLeft = element.scrollLeft; tfs.scrollTop = element.scrollTop; rLeft = (tfs_range.offsetLeft - tfs.scrollLeft) + 4; if (rLeft > elDims.width) rLeft = elDims.width - (tfs_range.offsetWidth + 4); rTop = tfs_range.offsetTop - tfs.scrollTop; rWidth = tfs_range.offsetWidth; rHeight = tfs_range.offsetHeight + 4; tfs.style.display = 'none'; } return { left: rLeft, top: rTop, width: rWidth, height: rHeight }; }; var OBC_TOOLKIT = {}; OBC_TOOLKIT.tagsNormalize = function(value) { return value .strip() .replace(/[\r\n\t\"\'\\]/g, '') .replace(new RegExp('[;' + String.fromCharCode(255 * 256 + 12) + String.fromCharCode(48 * 256 + 1) + ']', 'g'), ',') .replace(/\s+/g, ' ') .replace(/\,\ +/g, ',') .replace(/\,/g, ', ') .replace(/\,(\ ?\,)*/g, ',') .replace(/\,\ ?$/, '') .replace(/\<.*?\>/g, '') .replace(/\/g,'') .replace(/\'/g,''); }; OBC_TOOLKIT.annotationNormalize = function(value) { return value .strip() .replace(/\n*\s*$/g, '') }; Element.deepRemoveIds = function(element) { if (element.nodeType == 1) { element.removeAttribute('id'); var elements = element.getElementsByTagName('*'); for (var i = 0; i != elements.length; i++) { elements[i].removeAttribute('id'); } } }; Element.deepVisible = function(element) { var visible = true; while (visible && element && element.style) { visible = (element.style.display != 'none'); element = element.parentNode; } return visible && element == document; }; Element.updateAnimated = function(element, innerHTML, options) { element = $(element); options = options || {}; options.afterFinish = function() { Element.remove(element); }; // var newElement = document.createElement(element.tagName); // newElement.id = element.id; // Element.setStyle(newElement, { display: 'none', width: '100%' }); // TEST IE var newElement = element.cloneNode(false); Element.setStyle(newElement, { display: 'none' }); newElement.innerHTML = innerHTML; Element.deepRemoveIds(element); element.parentNode.insertBefore(newElement, element); return Transition.Morph(element, newElement, options); }; Element.replaceAnimated = function(element, html, options) { element = $(element); var cc = document.createElement('div'); cc.innerHTML = html.strip(); while(cc.firstChild && cc.firstChild.nodeType != 1) { cc.removeChild(cc.firstChild); } var newElement = cc.firstChild; if (!newElement) return; options = options || {}; options.afterFinish = function() { Element.remove(element); }; Element.setStyle(newElement, { display: 'none' }); if (!element.style.width) { element.style.width = '100%'; } Element.deepRemoveIds(element); element.parentNode.insertBefore(newElement, element); return Transition.Morph(element, newElement, options); }; var Transition = {}; Transition.Morph = function(element1, element2, options) { options = Object.extend({}, options || {}); afterFinish = options.afterFinish || Prototype.emptyFunction; element1 = $(element1); element2 = $(element2); var oldStyle1 = { position: element1.style.position, visibility: element1.style.visibility, display: 'none', overflow: element1.style.overflow, width: element1.style.width, height: element1.style.height }; var oldStyle2 = { position: element2.style.position, visibility: element2.style.visibility, display: 'block', overflow: element2.style.overflow, width: element2.style.width, height: element2.style.height }; var dim1 = { width: element1.offsetWidth, height: element1.offsetHeight }; Element.setStyle(element2, { position: 'absolute', visibility: 'hidden', display: '', width: dim1.width + 'px' }); var dim2 = { height: element2.offsetHeight }; var newStyle1 = { position: 'absolute', visibility: '', overflow: 'hidden', width: dim1.width + 'px', height: dim1.height + 'px' }; var newStyle2 = { position: 'relative', visibility: '', overflow: 'hidden', height: dim1.height + 'px' }; Element.setStyle(element1, newStyle1); Element.setOpacity(element2, 0.0); Element.setStyle(element2, newStyle2); options.afterFinish = function() { Element.setStyle(element1, oldStyle1); Element.setStyle(element2, oldStyle2); afterFinish(); }.bind(this); var effects = [ new Effect.Opacity(element1, { sync: true, from: 1.0, to: 0.0 }), new Effect.Resize(element1, { sync: true, scaleX: false, scaleY: true, newHeight: dim2.height }), new Effect.Opacity(element2, { sync: true, from: 0.0, to: 1.0 }), new Effect.Resize(element2, { sync: true, scaleX: false, scaleY: true, newHeight: dim2.height })]; return new Effect.Parallel(effects, options); } Effect.Resize = Class.create(); Object.extend(Object.extend(Effect.Resize.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); var options = Object.extend({ newWidth: 0, newHeight: 0, scaleX: true, scaleY: true }, arguments[1] || {}); this.start(options); }, setup: function() { this.dims = [this.element.offsetHeight, this.element.offsetWidth]; this.delta = [this.options.newHeight - this.dims[0], this.options.newWidth - this.dims[1]]; }, update: function(position) { this.setDimensions(this.dims[0] + this.delta[0] * position, this.dims[1] + this.delta[1] * position); }, finish: function(position) { }, setDimensions: function(height, width) { var d = {}; if(this.options.scaleX) d.width = width + 'px'; if(this.options.scaleY) d.height = height + 'px'; Element.setStyle(this.element, d); } }); // layeredpane.js function LayeredPane(pane) { this.pane = $(pane); this.options = Object.extend( { transition: Transition.Morph, duration: 1.0, prefix: '' }, arguments[1] || {}); this.visibleLayer = $A(this.pane.childNodes).findAll(function(e) { return e.nodeType == 1; }).detect(function(l) { return Element.visible(l); }); this.switching = false; } LayeredPane.prototype = { getLayers: function() { return $A(this.pane.childNodes).findAll(function(e) { return e.nodeType == 1; }); }, getVisibleLayer: function() { return this.visibleLayer; }, addLayer: function(layer) { this.pane.appendChild(layer); }, showLayer: function(layer, options) { var transition; if (layer && typeof layer == 'string') layer = this.options.prefix + layer; layer = $(layer); if (!this.switching && layer != this.visibleLayer) { this.switching = true; options = options || {}; var visibleLayer = this.visibleLayer; this.visibleLayer = layer; transition = this.options.transition(visibleLayer, layer, { duration: options.duration || this.options.duration, afterFinishInternal: this.afterSwitch.bind(this), afterFinish: options.afterFinish, sync: options.sync }); } return transition; }, afterSwitch: function() { this.switching = false; } } // inplaceEditor.js function InplaceEditor(instanceId, options) { /* options */ this.options = Object.extend({ insertStringEmpty: '', insertStringNonEmpty: '', normalizeValue: function(value) { return value; } }, options || {}); this.normalizeValue = this.options.normalizeValue; this.insertStringEmpty = this.options.insertStringEmpty; this.insertStringNonEmpty = this.options.insertStringNonEmpty; this.insertedString = ''; /* get main element */ this.main = document.getElementById('inplace_' + instanceId); /* get buttons */ this.editButton = document.getElementById('editButton_' + instanceId); this.saveButton = document.getElementById('saveButton_' + instanceId); this.cancelButton = document.getElementById('cancelButton_' + instanceId); /* get save indicator */ this.saveIndicator = document.getElementById('saveIndicator_' + instanceId); /* get input and display fields */ this.inputField = document.getElementById('inputField_' + instanceId); this.displayField = document.getElementById('displayField_' + instanceId); /* get current value */ this.value = this.normalizeValue(this.inputField.value); /* set display value */ this.setDisplayValue(this.value); Event.observe(window, 'load', this.scrollDisplay.bind(this)); /* add hover for display field and edit button*/ if (this.displayField) { Event.observe( this.displayField, 'mouseover', function() { Element.addClassName( this.displayField, 'hover'); }.bindAsEventListener(this) ); Event.observe( this.displayField, 'mouseout', function() { Element.removeClassName(this.displayField, 'hover'); }.bindAsEventListener(this) ); /* add on-click to display field */ Event.observe( this.displayField, 'click', this.onClickDisplayPane.bindAsEventListener(this) ); if (this.editButton) { Event.observe( this.editButton, 'mouseover', function() { Element.addClassName( this.displayField, 'hover'); }.bindAsEventListener(this) ); Event.observe( this.editButton, 'mouseout', function() { Element.removeClassName(this.displayField, 'hover'); }.bindAsEventListener(this) ); } } /* add on-clicks to buttons */ if (this.editButton) { Event.observe( this.editButton, 'click', this.onClickDisplayPane.bindAsEventListener(this) ); } if (this.saveButton) { Event.observe( this.saveButton, 'click', this.onClickSaveButton.bindAsEventListener(this) ); /* add key listener */ Event.observe(this.saveButton, (UserAgent.MSIE || UserAgent.KHTML) ? 'keydown' : 'keypress', this.onKeyPressSaveButton.bindAsEventListener(this)); } if (this.cancelButton) { Event.observe( this.cancelButton, 'click', this.onClickCancelButton.bindAsEventListener(this) ); } /* add key listener */ Event.observe(this.main, (UserAgent.MSIE || UserAgent.KHTML) ? 'keydown' : 'keypress', this.onKeyPressInputField.bindAsEventListener(this)); /* make layers */ this.layeredPane = new LayeredPane(this.main, { duration: 0.3 }); var layers = this.layeredPane.getLayers(); this.showLayer = layers[0]; this.editLayer = layers[1]; /* flags */ this.editing = false; this.blocked = false; } InplaceEditor.prototype = { getInput: function() { return this.inputField; }, onClickDisplayPane: function(event) { Event.stop(event); this.edit(event.shiftKey ? 2 : undefined); }, onClickSaveButton: function(event) { Event.stop(event); this.save(event.shiftKey ? 2 : undefined); }, onClickCancelButton: function(event) { Event.stop(event); this.cancel(event.shiftKey ? 2 : undefined); }, onKeyPressInputField: function(event) { var keyCode; if (UserAgent.WEBKIT) { keyCode = Event.mapMacKeypressKeyCode(event.keyCode); } else { keyCode = event.keyCode; } switch(keyCode) { case Event.KEY_RETURN: if (!this.options.textareamode) { this.save(); } break; case Event.KEY_ESC: this.cancel(); break; } }, onKeyPressSaveButton: function(event) { var keyCode; if (UserAgent.WEBKIT) { keyCode = Event.mapMacKeypressKeyCode(event.keyCode); } else { keyCode = event.keyCode; } switch(keyCode) { case Event.KEY_RETURN: this.save(); break; } }, edit: function(switchDuration) { if (!this.editing && !this.blocked) { this.editing = true; if (this.value == '') { this.inputField.value = this.value + this.insertStringEmpty; this.insertedString = this.normalizeValue(this.insertStringEmpty); } else { this.inputField.value = this.value + this.insertStringNonEmpty; this.insertedString = this.normalizeValue(this.insertStringNonEmpty); } this.layeredPane.showLayer(this.editLayer, { afterFinish: function() { if (this.options.textareamode) { Form.Element.setCaretToEnd(this.inputField); Form.Element.scrollToEnd(this.inputField); } else { Form.Element.setSelectionRange(this.inputField, this.inputField.value.length, this.inputField.value.length ); } this.inputField.focus(); if (this.displayField) { Element.removeClassName(this.displayField, 'hover'); } }.bind(this), duration: switchDuration } ); } }, save: function(switchDuration) { if (this.editing) { var tmpValue = this.normalizeValue(this.inputField.value); if (tmpValue.slice(-this.insertedString.length) == this.insertedString) { tmpValue = tmpValue.slice(0, -this.insertedString.length); tmpValue = this.normalizeValue(tmpValue); } if (tmpValue != this.value) this.setDisplayValue(tmpValue); this.layeredPane.showLayer(this.showLayer, { duration: switchDuration, afterFinish: this.afterSwitch.bind(this) }); if (tmpValue != this.value) { this.blocked = true; this.value = tmpValue; this.editButton.style.display = 'none'; this.saveIndicator.style.display = 'block'; var tmp = this.options.saveParameters + '&' + encodeURIComponent(this.options.fieldName) + '=' + encodeURIComponent(this.value); new Ajax.Request( this.options.saveAction, { method: 'post', parameters: tmp, onComplete: this.onCompleteSave.bind(this) }); } else { this.editing = false; } } }, afterSwitch: function() { if (!this.blocked) this.editButton.focus(); this.scrollDisplay(); }, onCompleteSave: function(transport) { setTimeout(function(transport) { this.saveIndicator.style.display = 'none'; this.editButton.style.display = 'block'; this.editButton.focus(); this.editing = false; this.blocked = false; var responseObj; try { responseObj = eval(transport.responseText); } catch(e) {} if (!responseObj || responseObj.confirm != 'OK') { this.displayField.innerHTML = 'ERROR'; } if (responseObj.exec) { eval(responseObj.exec); } }.bind(this, transport), 500); }, cancel: function(switchDuration) { if (this.editing) { this.editing = false; this.layeredPane.showLayer(this.showLayer, { duration: switchDuration, afterFinish: this.afterSwitch.bind(this) }); } }, setDisplayValue: function(value) { var style; var displayValue; if (value == '') { displayValue = this.options.createText; style = ' style="color: grey;"'; } else { displayValue = value; style = ''; } displayValue = displayValue .replace(/\/g, '>') .replace(/\"/g, '"') .replace(/\$/g, '$') .replace(/\n/g, '
'); this.displayField.innerHTML = '
' + displayValue + '
'; }, scrollDisplay: function() { Form.Element.scrollToEnd(this.displayField.childNodes[0]); } } // suggestor.js function SimpleSuggestor(suggestions, options) { this.suggestions = suggestions || []; this.options = Object.extend({ suggestionClass: SimpleSelectItem }, options || {}); } SimpleSuggestor.prototype = { setSuggestions: function(suggestions) { this.suggestions = suggestions || []; }, getSuggestions: function(token, callback) { var normalizedToken = this.options.normalize ? this.options.normalize(token) : token; var filteredSuggestions = []; for (var i = 0; i < this.suggestions.length; i++) { var normalizedSuggestion = this.options.normalize ? this.options.normalize(this.suggestions[i]) : this.suggestions[i]; if (normalizedSuggestion.slice(0, normalizedToken.length) == normalizedToken) { var selectItem; if (this.options.suggestionClass) { selectItem = new this.options.suggestionClass(this.suggestions[i]); } else if (this.options.transformFunction) { selectItem = this.options.transformFunction(this.suggestions[i]); } else { selectItem = this.suggestions[i]; } filteredSuggestions.push(selectItem); } } callback(token, filteredSuggestions); } }; function AjaxSuggestor(url, options) { this.options = Object.extend({ suggestionClass: SimpleSelectItem }, options || {}); this.url = url; this.suggestions = {}; } AjaxSuggestor.prototype = { getSuggestions: function(token, callback) { var normalizedToken = this.options.normalize ? this.options.normalize(token) : token; if (this.suggestions[normalizedToken] == undefined) { new Ajax.Request(this.url, { parameters: 'token=' + encodeURIComponent(normalizedToken), onComplete: this.receiveSuggestions.bind(this, token, normalizedToken, callback) }); } else { this.setSuggestions(token, normalizedToken, callback); } }, receiveSuggestions: function(token, normalizedToken, callback, transport) { var suggestions; try { suggestions = eval(transport.responseText); } catch (e) { } if (suggestions) { this.suggestions[normalizedToken] = suggestions; } else { this.suggestions[normalizedToken] = []; } this.setSuggestions(token, normalizedToken, callback); }, setSuggestions: function(token, normalizedToken, callback) { var filteredSuggestions = []; for (var i = 0; i < this.suggestions[normalizedToken].length; i++) { if (this.options.suggestionClass) { selectItem = new this.options.suggestionClass(this.suggestions[normalizedToken][i]); } else if (this.options.transformFunction) { selectItem = this.options.transformFunction(this.suggestions[normalizedToken][i]); } else { selectItem = this.suggestions[normalizedToken][i]; } filteredSuggestions.push(selectItem); } callback(token, filteredSuggestions); } }; var Suggestor = { normalize: function(token) { var normalizedToken = token.replace(/[\ \-\_\&\/]/g, '').toUpperCase(); return normalizedToken; } } // popup.js function PopUp(position, options) { this.position = position; this.active = false; this.options = Object.extend({ style: {}, className: '', selects: [] }, options || {}); var style = Object.extend({ display: 'none', position: 'absolute' }, this.options.style); this.element = document.createElement('div'); this.element.className = this.options.className; Element.setStyle(this.element, style); } PopUp.prototype = { getElement: function() { return this.element; }, setContent: function(content) { if (this.content) { this.element.replaceChild(content, this.content); this.content = content; } else { this.element.appendChild(content); this.content = content; } }, show: function(bounds) { if (UserAgent.MSIE) { for (var i = 0; i < this.options.selects.length; i++) { $(this.options.selects[i]).style.visibility = 'hidden'; } } if (this.element.parentNode != document.body) { document.body.appendChild(this.element); } if (bounds) { this.position(this.element, bounds); } Element.setStyle(this.element, { display: '' }); this.active = true; }, hide: function() { if (UserAgent.MSIE) { for (var i = 0; i < this.options.selects.length; i++) { $(this.options.selects[i]).style.visibility = ''; } } this.active = false; Element.setStyle(this.element, { display: 'none', left: '0', top: '0' }); } } PopUp.position = function(element, bounds) { var left, top; var elDims = Element.getDimensions(element); elDims.width += 2; var vB = Position.getViewPortBounds(); var scrollX = vB.left; // window.pageXOffset || document.documentElement.scrollLeft; var scrollY = vB.top; // window.pageYOffset || document.documentElement.scrollTop; var innerWidth = vB.width; // window.innerWidth || document.documentElement.clientWidth; var innerHeight = vB.height; // window.innerHeight || document.documentElement.clientHeight; if (UserAgent.GECKO) { innerWidth = document.body.clientWidth; innerHeight = window.innerHeight; } else if (UserAgent.MSIE) { innerWidth = document.documentElement.clientWidth; innerHeight = document.documentElement.clientHeight; scrollX = document.documentElement.scrollLeft; scrollY = document.documentElement.scrollTop; } else if (UserAgent.WEBKIT) { innerWidth = window.innerWidth; innerHeight = window.innerHeight - 1; } if (innerWidth + scrollX > bounds.left + elDims.width) { left = bounds.left + 'px'; } else { left = ((innerWidth - elDims.width) + scrollX) + 'px'; } if (innerHeight + scrollY > bounds.top + bounds.height + elDims.height) { top = (bounds.top + bounds.height) + 'px'; } else { top = (bounds.top - elDims.height) + 'px'; } element.style.left = left; element.style.top = top; } // select.js function Select(options) { this.options = Object.extend({ choices: 10, className: '', selectedClassName: 'selected' }, options || {}); this.element = document.createElement('div'); this.element.className = this.options.className; Element.setStyle(this.element, { display: '', position: 'relative', top: '0', left: '0' }); this.arrowUp = document.createElement('img'); this.arrowUp.className = 'up-arrow'; this.arrowUp.src = '/img/xing/arrow_up.gif'; this.arrowUp.alt = 'up'; this.arrowUp.style.display = 'none'; this.element.appendChild(this.arrowUp); this.arrowDown = document.createElement('img'); this.arrowDown.className = 'down-arrow'; this.arrowDown.src = '/img/xing/arrow_down.gif'; this.arrowDown.alt = 'down'; this.arrowDown.style.display = 'none'; this.element.appendChild(this.arrowDown); this.list = document.createElement('ul'); this.element.appendChild(this.list); this.active = false; this.index = undefined; this.sO = undefined; this.vRS = undefined; this.vRE = undefined; this.onMouseMoveListener = this.onMouseMove.bind(this); this.onClickListener = this.onClick.bind(this); if (UserAgent.MSIE || UserAgent.WEBKIT) Event.observe(this.element, "mousewheel", this.onScrollA.bind(this)); else if (UserAgent.GECKO) Event.observe(this.element, "DOMMouseScroll", this.onScrollB.bind(this)); } Select.prototype = { setCallback: function(callback) { this.callback = callback; }, getElement: function() { return this.element; }, setVisibleRange: function(vRS) { if (this.options.choices < this.sO.length) { if (vRS < 0) { vRS = 0; } else if (vRS > this.sO.length - this.options.choices) { vRS = this.sO.length - this.options.choices; } if (vRS == this.vRS - 1) { this.removeSelectItem(this.sO[this.vRE - 1].getDOMElement()); this.addSelectItem(this.sO[vRS].getDOMElement(), this.sO[this.vRS].getDOMElement()); } else if (vRS == this.vRS + 1) { this.removeSelectItem(this.sO[this.vRS].getDOMElement()); this.addSelectItem(this.sO[this.vRE].getDOMElement()); } else if (vRS < this.vRS) { for (var i = vRS, j = this.vRS; j < this.vRE; i++, j++) { Event.stopObserving(this.sO[j].getDOMElement(), "mousemove", this.onMouseMoveListener); Event.stopObserving(this.sO[j].getDOMElement(), "click", this.onClickListener); this.list.replaceChild(this.sO[i].getDOMElement(), this.sO[j].getDOMElement()); Event.observe(this.sO[i].getDOMElement(), "mousemove", this.onMouseMoveListener); Event.observe(this.sO[i].getDOMElement(), "click", this.onClickListener); } } else if (vRS > this.vRS) { for (var i = (vRS + this.options.choices) - 1, j = this.vRE - 1; j >= this.vRS; i--, j--) { Event.stopObserving(this.sO[j].getDOMElement(), "mousemove", this.onMouseMoveListener); Event.stopObserving(this.sO[j].getDOMElement(), "click", this.onClickListener); this.list.replaceChild(this.sO[i].getDOMElement(), this.sO[j].getDOMElement()); Event.observe(this.sO[i].getDOMElement(), "mousemove", this.onMouseMoveListener); Event.observe(this.sO[i].getDOMElement(), "click", this.onClickListener); } } this.vRS = vRS; this.vRE = vRS + this.options.choices; this.setArrows(); } }, addSelectItem: function(element, nextSibiling) { Event.observe(element, "mousemove", this.onMouseMoveListener); Event.observe(element, "click", this.onClickListener); if (nextSibiling != undefined) { this.list.insertBefore(element, nextSibiling); } else { this.list.appendChild(element); } }, removeSelectItem: function(element) { this.list.removeChild(element); Event.stopObserving(element, "mousemove", this.onMouseMoveListener); Event.stopObserving(element, "click", this.onClickListener); }, isActive: function() { return this.active; }, onKeyPress: function(event) { if (this.isActive()) { var keyCode; if (UserAgent.WEBKIT) { keyCode = Event.mapMacKeypressKeyCode(event.keyCode); } else { keyCode = event.keyCode; } switch(keyCode) { case Event.KEY_UP: Event.stop(event); this.markPrevious(); break; case Event.KEY_DOWN: Event.stop(event); this.markNext(); break; case Event.KEY_PAGEUP: Event.stop(event); this.pageUp(); break; case Event.KEY_PAGEDOWN: Event.stop(event); this.pageDown(); break; case Event.KEY_HOME: Event.stop(event); this.posFirst(); break; case Event.KEY_END: Event.stop(event); this.posLast(); break; case Event.KEY_ESC: Event.stop(event); this.callback(); break; case Event.KEY_RETURN: case Event.KEY_TAB: if (this.selectEntry()) { Event.stop(event); } break; } } }, markPrevious: function() { if (this.sO) { if (this.index != undefined) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } if (this.index == undefined) { this.index = this.sO.length - 1; } else if (this.index > 0) { this.index = this.index - 1; } if (this.index < this.vRS) { this.setVisibleRange(this.index); } else if (this.index > this.vRE - 1) { this.setVisibleRange((this.index - this.options.choices) + 1); } if (this.sO[this.index].getValue() != undefined) { Element.addClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } } }, markNext: function() { if (this.sO) { if (this.index != undefined) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } if (this.index == undefined) { this.index = 0; } else if (this.index < this.sO.length - 1) { this.index = this.index + 1; } if (this.index < this.vRS) { this.setVisibleRange(this.index); } else if (this.index > this.vRE - 1) { this.setVisibleRange((this.index - this.options.choices) + 1); } if (this.sO[this.index].getValue() != undefined) { Element.addClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } } }, pageUp: function() { if (this.index != undefined) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } else { this.index = this.sO.length - 1; } this.index -= this.options.choices; if (this.index < 0) this.index = 0; if (this.sO[this.index].getValue() != undefined) { Element.addClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.setVisibleRange(this.vRS - this.options.choices); }, pageDown: function() { if (this.index != undefined) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } else { this.index = 0; } this.index += this.options.choices; if (this.index > this.sO.length - 1) this.index = this.sO.length - 1; if (this.sO[this.index].getValue() != undefined) { Element.addClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.setVisibleRange(this.vRS + this.options.choices); }, posFirst: function() { if (this.index != undefined) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.index = 0; if (this.sO[this.index].getValue() != undefined) { Element.addClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.setVisibleRange(0); }, posLast: function() { if (this.index != undefined) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.index = this.sO.length - 1; if (this.sO[this.index].getValue() != undefined) { Element.addClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.setVisibleRange(this.sO.length - this.options.choices); }, selectEntry: function() { if (this.index != undefined) { this.callback(this.sO[this.index]); return true; } else { this.callback(); return false; } }, setSelectOptions: function(sO, vRS) { if (this.sO) { for (; this.vRS < this.vRE; this.vRS++) { this.removeSelectItem(this.sO[this.vRS].getDOMElement()); } } var maxWidth = 0; for (var i = 0; i < sO.length; i++) { var curWidth = sO[i].getMinWidth(); if (curWidth > maxWidth) maxWidth = curWidth; sO[i].getDOMElement().autocompleteIndex = i; } for (var i = 0; i < sO.length; i++) { sO[i].setWidth(maxWidth); } if (!vRS || vRS < 0) { vRS = 0; } else if (vRS > this.sO.length - this.options.choices) { vRS = this.sO.length - this.options.choices; } this.index = undefined; this.sO = sO; this.vRS = vRS; this.vRE = this.vRS; for (; this.vRE < this.vRS + this.options.choices && this.vRE < this.vRS + this.sO.length; this.vRE++) { this.addSelectItem(sO[this.vRE].getDOMElement()); } this.setArrows(); }, selectValue: function(value) { if (this.index != undefined) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.index = undefined; if (value && this.sO) { for (var i = 0; this.index == undefined && i < this.sO.length; i++) { if (this.sO[i].getValue() == value) { this.index = i; Element.addClassName(this.sO[i].getDOMElement(), this.options.selectedClassName); } } } }, getSelectedValue: function() { return (this.index != undefined) ? this.sO[this.index].getValue() : undefined; }, setArrows: function() { if (this.vRS == 0) { this.arrowUp.style.display = 'none'; } else { this.arrowUp.style.display = ''; } if (this.vRE == this.sO.length) { this.arrowDown.style.display = 'none'; } else { this.arrowDown.style.display = ''; } }, onMouseMove: function(event) { if (this.isActive()) { if (this.index >= 0) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.index = Event.findElement(event, 'LI').autocompleteIndex; if (this.sO[this.index].getValue() != undefined) { Element.addClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } } }, onClick: function(event) { if (this.isActive()) { if (this.index >= 0) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.index = Event.findElement(event, 'LI').autocompleteIndex; if (this.sO[this.index].getValue() != undefined) { Element.addClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); this.selectEntry(); } } }, onScrollA: function(event) { if (this.isActive()) { if(event.wheelDelta > 0) { this.setVisibleRange(this.vRS - 1); } else { this.setVisibleRange(this.vRS + 1); } Event.stop(event); } }, onScrollB: function(event) { if (this.isActive()) { if(event.detail < 0) { this.setVisibleRange(this.vRS - 1); } else { this.setVisibleRange(this.vRS + 1); } Event.stop(event); } }, activate: function() { this.active = true; }, deactivate: function() { this.active = false; if (this.index != undefined) { Element.removeClassName(this.sO[this.index].getDOMElement(), this.options.selectedClassName); } this.index = undefined; } } function SimpleSelectItem(text) { this.text = text; } SimpleSelectItem.prototype = { getDOMElement: function() { if (this.DOMElement == undefined) { this.DOMElement = document.createElement('li'); this.DOMElement.appendChild(document.createTextNode(this.text)); if (!SimpleSelectItem.wtc) { var div = document.createElement('div'); div.className = 'auto-complete'; Element.setStyle(div, { position: 'absolute', left: '0', top: '0', visibility: 'hidden' }); document.body.appendChild(div); SimpleSelectItem.wtc = document.createElement('ul'); div.appendChild(SimpleSelectItem.wtc); } SimpleSelectItem.wtc.appendChild(this.DOMElement); this.minWidth = this.DOMElement.offsetWidth - 33; SimpleSelectItem.wtc.removeChild(this.DOMElement); } return this.DOMElement; }, getMinWidth: function() { if (this.DOMElement == undefined) { this.getDOMElement(); } return this.minWidth; }, setWidth: function(width) { if (this.DOMElement == undefined) { this.getDOMElement(); } Element.setStyle(this.DOMElement, { width: width + 'px' }); }, getValue: function() { return this.text; } } // autocompleter.js function Autocompleter(element, options) { this.options = Object.extend({ minTokenLength: 1, delimiters: [',', ';', String.fromCharCode(255 * 256 + 12), String.fromCharCode(48 * 256 + 1), '\n'], insertString: ', ', delay: 50 }, options || {}); this.ignoreMinTokenLengthOn = $A(this.options.ignoreMinTokenLengthOn); this.element = $(element); this.isTextfield = this.element.tagName == 'INPUT'; Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this), true); Event.observe(this.element, (UserAgent.MSIE || UserAgent.KHTML) ? 'keydown' : 'keypress', this.onKeyPress.bindAsEventListener(this)); Event.observe(this.element, 'keyup', this.onKeyUp.bindAsEventListener(this)); this.suggestor = this.options.suggestor; this.select = this.options.select; this.select.setCallback(this.insert.bind(this)); Event.observe(this.select.getElement(), 'mousedown', this.blockBlur.bindAsEventListener(this), true); this.popup = this.options.popup; if (this.popup) { this.popup.setContent(this.select.getElement()); } this.active = false; this.blurBlocked = false; this.currentToken = undefined; this.requestedToken = undefined; this.triggerTimeout = undefined; } Autocompleter.prototype = { isActive: function() { return this.active; }, onKeyPress: function(event) { if (this.isActive()) { this.select.onKeyPress(event); } else { var keyCode; if (UserAgent.WEBKIT) { keyCode = Event.mapMacKeypressKeyCode(event.keyCode); } else { keyCode = event.keyCode; } switch(keyCode) { case Event.KEY_PAGEUP: case Event.KEY_PAGEDOWN: Event.stop(event); this.triggerUpdate(this.ignoreMinTokenLengthOn.detect(function(o) { return o == keyCode; }) != undefined); break; case Event.KEY_UP: case Event.KEY_DOWN: if (this.isTextfield) { Event.stop(event); this.triggerUpdate(this.ignoreMinTokenLengthOn.detect(function(o) { return o == keyCode; }) != undefined); } break; default: this.select.onKeyPress(event); } } }, onKeyUp: function(event) { if (this.isActive()) { switch(event.keyCode) { case Event.KEY_UP: case Event.KEY_DOWN: case Event.KEY_PAGEUP: case Event.KEY_PAGEDOWN: case Event.KEY_HOME: case Event.KEY_END: case Event.KEY_RETURN: case Event.KEY_TAB: case Event.KEY_ESC: break; default: this.triggerUpdate(); break; } } else { switch(event.keyCode) { case Event.KEY_LEFT: case Event.KEY_RIGHT: case Event.KEY_UP: case Event.KEY_DOWN: case Event.KEY_PAGEUP: case Event.KEY_PAGEDOWN: case Event.KEY_RETURN: case Event.KEY_TAB: case Event.KEY_ESC: break; default: this.triggerUpdate(this.ignoreMinTokenLengthOn.detect(function(o) { return o == event.keyCode; }) != undefined); break; } } }, triggerUpdate: function(force) { if (this.triggerTimeout) clearTimeout(this.triggerTimeout); this.triggerTimeout = setTimeout(this.updateSuggestions.bind(this, force), this.options.delay); }, updateSuggestions: function(force) { var token = this.getToken(); if (token.end == token.caretPos && (token.end - token.start >= this.options.minTokenLength || force)) { var newToken = token.value.slice(token.start, token.caretPos); if (newToken != this.requestedToken && newToken != this.currentToken) { this.requestedToken = newToken; this.suggestor.getSuggestions(this.requestedToken, this.receiveSuggestions.bind(this)); } } else if (this.isActive()) { this.deactivate(); } }, receiveSuggestions: function(token, suggestions) { if (token == this.requestedToken && suggestions.length > 0) { var selectedValue; if (this.isActive()) { selectedValue = this.select.getSelectedValue(); this.deactivate(); } this.select.setSelectOptions(suggestions, 0); this.select.selectValue(selectedValue); this.activate(); this.requestedToken = ''; this.currentToken = token; } else if (this.isActive()) { this.deactivate(); } }, onBlur: function(event) { if (this.blurBlocked) { Event.stop(event); this.blurBlocked = false; this.element.focus(); } else { this.deactivate(); } }, blockBlur: function(event) { Event.stop(event); this.blurBlocked = true; }, insert: function(selectItem) { var text; if (selectItem) { text = selectItem.getValue(); } this.deactivate(); if (text != undefined) { var token = this.getToken(true); var prefix = token.value.slice(0, token.start); var postfix = token.value.slice(token.end); var insertDelimiter = !this.options.insertDelimiterOnlyAtEnd || postfix.replace(/\s*/, '').length == 0; this.element.value = prefix + text + (insertDelimiter ? this.options.insertString : '') + postfix; var caretPos = token.start + text.length + (insertDelimiter ? this.options.insertString.length : 0); Form.Element.setSelectionRange(this.element, caretPos, caretPos); } this.element.focus(); }, getToken: function(last) { var newValue = Form.Element.value(this.element); if (!last && (this.value != newValue || this.selectionStart != Form.Element.selectionStart(this.element) || this.selectionEnd != Form.Element.selectionEnd(this.element))) { this.value = newValue; this.selectionStart = Form.Element.selectionStart(this.element); this.selectionEnd = Form.Element.selectionEnd(this.element); var prefix = this.value.slice(0, this.selectionStart); var postfix = this.value.slice(this.selectionEnd); var delimPosPrefix = -1; for (var i = 0; i < this.options.delimiters.length; i++) { var pos = prefix.lastIndexOf(this.options.delimiters[i]); if (pos > delimPosPrefix) delimPosPrefix = pos; } var delimPosPostfix = postfix.length; for (var i = 0; i < this.options.delimiters.length; i++) { var pos = postfix.indexOf(this.options.delimiters[i]); if (pos >= 0 && pos < delimPosPostfix) delimPosPostfix = pos; } this.token = { changed: true, start: this.selectionStart - prefix.slice(delimPosPrefix + 1).replace(/^\s*/,'').length, end: this.selectionEnd + postfix.slice(0, delimPosPostfix).replace(/\s*$/,'').length, caretPos: this.selectionStart, value: this.value }; } else { this.token.changed = false; } return this.token; }, activate: function() { this.select.activate(); if (this.popup) { var token = this.getToken(); var bounds; var iPos = Position.cumulativeOffset(this.element); if (this.isTextfield) { bounds = Form.Element.getRangeBounds(this.element, token.start, token.caretPos); bounds.left += iPos[0] - 1; bounds.top += iPos[1]; } else { var dims = Element.getDimensions(this.element); bounds = { left: iPos[0] + 1, top: iPos[1], width: dims.width, height: dims.height + 1 } } this.popup.show(bounds); } this.active = true; }, deactivate: function() { this.active = false; this.blurBlocked = false; this.currentToken = undefined; this.requestedToken = undefined; if (this.triggerTimeout) clearTimeout(this.triggerTimeout); if (this.popup) this.popup.hide(); this.select.deactivate(); } } function DependentSelect(args) { this.map = args['map']; this.mapKeys = args['mapKeys']; this.masterSelect = document.getElementById(args['masterSelect']); this.initialInput = document.getElementById(args['dependentSelect']); this.container = this.initialInput.parentNode; this.currentInput = this.initialInput; this.inputs = {}; this.labels = []; if (args['labels']) { for (var i = 0; i < args['labels'].length; i++) { var label_id = args['labels'][i]; var label = document.getElementById(label_id); if (label) this.labels.push(label); } } this.noKeyOption = args['noKeyOption'] || {}; this.undefinedOption = args['undefinedOption'] || {}; this.noOption = args['noOption'] || {}; this.singleOption = args['singleOption'] || {}; this.multipleOptions = args['multipleOptions'] || {}; this.onChangeListener = args['onChange']; this.onchange(); Event.observe(this.masterSelect, 'change', this.onchange.bind(this)); }; DependentSelect.prototype.onchange = function(event) { var value = this.masterSelect.value; var key = 'key:' + value; var nextInput; var hideLabel; var hideElements = []; var showElements = []; if (!value) { if (!this.inputs[key]) { if (this.noKeyOption.hidden) this.inputs[key] = this.createHiddenInput(); else this.inputs[key] = this.initialInput; } hideLabel = this.noKeyOption.hidden; hideElements = hideElements.concat(this.noKeyOption.hideElements || []); showElements = showElements.concat(this.noKeyOption.showElements || []); } else if (!this.map[value]) { if (!this.inputs[key]) { if (this.undefinedOption.hidden) this.inputs[key] = this.createHiddenInput(); else this.inputs[key] = this.initialInput; } hideLabel = this.undefinedOption.hidden; hideElements = hideElements.concat(this.undefinedOption.hideElements || []); showElements = showElements.concat(this.undefinedOption.showElements || []); } else if (this.map[value].length == 0) { if (!this.inputs[key]) { this.inputs[key] = this.createHiddenInput(); } hideLabel = true; hideElements = hideElements.concat(this.noOption.hideElements || []); showElements = showElements.concat(this.noOption.showElements || []); } else if (this.map[value].length == 1) { if (!this.inputs[key]) { if (this.singleOption.hidden) this.inputs[key] = this.createHiddenInput(this.mapKeys ? this.map[value][0][this.mapKeys.value] : this.map[value][0]); else this.inputs[key] = this.createSelect(value, this.singleOption); } hideLabel = this.singleOption.hidden; hideElements = hideElements.concat(this.singleOption.hideElements || []); showElements = showElements.concat(this.singleOption.showElements || []); } else if (this.map[value].length > 1) { if (!this.inputs[key]) { this.inputs[key] = this.createSelect(value, this.multipleOptions); } hideLabel = false; hideElements = hideElements.concat(this.multipleOptions.hideElements || []); showElements = showElements.concat(this.multipleOptions.showElements || []); } if (this.currentInput != this.inputs[key]) { var visibilityAttribute = hideLabel ? 'hidden' : ''; for (var i = 0; i < this.labels.length; i++) { this.labels[i].style.visibility = visibilityAttribute; } for (var i = 0; i < hideElements.length; i++) { $(hideElements[i]).style.visibility = 'hidden'; } for (var i = 0; i < showElements.length; i++) { $(showElements[i]).style.visibility = 'visible'; } this.container.replaceChild(this.inputs[key], this.currentInput); this.currentInput = this.inputs[key]; } if (this.onChangeListener) this.onChangeListener(value); }; DependentSelect.prototype.createHiddenInput = function(value) { var input = document.createElement('input'); input.type = 'hidden'; input.id = this.initialInput.id; input.name = this.initialInput.name; input.value = value; return input; }; DependentSelect.prototype.createSelect = function(key, selectOptions) { var currentValue = this.currentInput.value; var select = document.createElement('select'); select.id = this.initialInput.id; select.name = this.initialInput.name; select.className = this.initialInput.className; select.style.width = this.initialInput.style.width; select.tabIndex = this.initialInput.tabIndex; var i = 0; if (selectOptions.emptyOption) { select.options[i] = new Option(selectOptions.emptyOption, ''); i++; } var selectedIndex = 0; for (var j = 0; j < this.map[key].length; j++, i++) { var value; var label; if (this.mapKeys) { value = this.map[key][j][this.mapKeys.value]; label = this.map[key][j][this.mapKeys.label]; } else { value = this.map[key][j]; label = this.map[key][j]; } // we cant use the selected paramter of the constructor, since IE magically selects previous option select.options[i] = new Option(label, value, false, false); if (value == currentValue) { selectedIndex = i; } } select.selectedIndex = selectedIndex; return select; }; var Overlay = { start: function(options) { this.options = options || {}; if (UserAgent.MSIE) { var selects = document.getElementsByTagName('select'); for (i = 0; i < selects.length; i++) { selects[i].style.visibility = 'hidden'; } } if (!this.overlay) { this.refreshDisplayEL = this.refreshDisplay.bind(this); this.overlay = document.createElement('div'); this.overlay.id = 'modal-background'; this.overlay.className = 'modal-background'; document.body.appendChild(this.overlay); } Element.setStyle(this.overlay, { visibility: 'hidden', width: '0', height: '0', display: '' }); this.refreshDisplay(); Element.setStyle(this.overlay, { visibility: '' }); Event.observe(window, 'resize', this.refreshDisplayEL); Event.observe(window, 'scroll', this.refreshDisplayEL); }, stop: function() { Event.stopObserving(window, 'resize', this.refreshDisplayEL); Event.stopObserving(window, 'scroll', this.refreshDisplayEL); Element.hide(this.overlay); if (UserAgent.MSIE) { var selects = document.getElementsByTagName('select'); for (i = 0; i < selects.length; i++) { selects[i].style.visibility = ''; } } }, refreshDisplay: function() { var vB = Position.getViewPortBounds(); Element.setStyle(this.overlay, { width: (vB.left + vB.width) + 'px', height: (vB.top + vB.height) + 'px' }); if (this.options.dialog) { var left = (vB.left + ((vB.width - this.options.dialog.offsetWidth) / 2)); var top = (vB.top + ((vB.height - this.options.dialog.offsetHeight) / 2)); if (left < 0) left = 0; if (top < 0) top = 0; Element.setStyle(this.options.dialog, { left: left + 'px', top: top + 'px' }); } } }; /* Created By: Chris Campbell Website: http://particletree.com Date: 2/1/2006 Inspired by the lightbox implementation found at http://www.huddletogether.com/projects/lightbox/ Stripped and adapted by Michael Otto. http://www.epublica.de Rewritten by Lorenz Knies. http://www.epublica.de */ // callback var do_confirm; function cool_confirm(args) { if (!args['id']) { if (!cool_confirm.initalized) { cool_confirm.initalized = true; cool_confirm.okLabel = document.getElementById('modal-window:ok_label').innerHTML; cool_confirm.cancelLabel = document.getElementById('modal-window:cancel_label').innerHTML; } else { document.getElementById('modal-window:title').innerHTML = ''; document.getElementById('modal-window:text').innerHTML = ''; document.getElementById('modal-window:ok_label').innerHTML = cool_confirm.okLabel; document.getElementById('modal-window:cancel_label').innerHTML = cool_confirm.cancelLabel; document.getElementById('modal-window:title').style.backgroundImage = 'url(/img/xing/icn_help.gif)'; } } var id = args['id'] || 'modal-window'; var element = args['element']; var op = args['op']; var href = args['href']; var callback = args['callback']; do_confirm = _do_confirm; var modalWindow = document.getElementById(id); modalWindow.className = 'modal-window'; Element.setStyle(modalWindow, { visibility: 'hidden', position: 'absolute', left: '0', top: '0', display: '' }); if (modalWindow.parentNode != document.body) document.body.appendChild(modalWindow); if (args['icon']) { var div = document.getElementById(id + ':title'); if (div) { div.style.backgroundImage = 'url(' + args['icon'] + ')'; } } for (var k in { title: true, text: true, ok_label: true, cancel_label: true }) { if (args[k]) { var div = document.getElementById(id + ':' + k); if (div) { div.innerHTML = args[k]; } } } Overlay.start({ dialog: modalWindow }); Element.setStyle(modalWindow, { visibility: '' }); var firstButton = modalWindow.getElementsByTagName('button')[0]; if (firstButton) firstButton.focus(); return false; function _do_confirm(returncode) { Element.hide(modalWindow); Overlay.stop(); if (returncode) { if (callback) { callback(returncode); } else if (element) { if (element.tagName == 'A') { var uriComponent; var form = modalWindow.getElementsByTagName('form')[0]; if (form) { uriComponent = Form.serialize(form); } else { uriComponent = ''; } location.href = element.href + '&' + uriComponent; } else if (element.tagName == 'BUTTON' || element.tagName == 'INPUT') { if (element.type == 'submit') { if (op) element.form.op.value = op; element.form.submit(); } else if (element.type == 'button' && href) { location.href = href; } } } } } } function Preview(args) { this.callback = args['callback']; this.dialog = $(args['dialog']); this.container = $(this.dialog.id + ':container'); if (Preview.innerHTML[this.container.id]) this.container.innerHTML = Preview.innerHTML[this.container.id]; this.cancelEL = this.cancel.bind(this); this.sendEL = this.send.bind(this); Event.observe(this.dialog.id + ':cancel', 'click', this.cancelEL); Event.observe(this.dialog.id + ':send', 'click', this.sendEL); if ($(this.dialog.id + ':close')) { Event.observe(this.dialog.id + ':close', 'click', this.cancelEL); } document.body.appendChild(this.dialog); new Ajax.Request(args.url, { parameters: args.parameters, onComplete: this.onComplete.bind(this) }); Element.setStyle(this.dialog, { display: '', visibility: 'hidden' }); Overlay.start({ dialog: this.dialog }); Element.setStyle(this.dialog, { visibility: '' }); } Preview.innerHTML = {}; Preview.prototype = { cancel: function() { Element.hide(this.dialog); Overlay.stop(); Event.stopObserving(this.dialog.id + ':cancel', 'click', this.cancelEL); Event.stopObserving(this.dialog.id + ':send', 'click', this.sendEL); if ($(this.dialog.id + ':close')) { Event.stopObserving(this.dialog.id + ':close', 'click', this.cancelEL); } }, send: function() { if (this.loaded) { this.cancel(); this.callback(); } }, onComplete: function(transport) { if (!Preview.innerHTML[this.container.id]) Preview.innerHTML[this.container.id] = this.container.innerHTML; Element.update(this.container, transport.responseText); Overlay.refreshDisplay(); this.loaded = true; } } function SharedData(args) { this.prefix = args['prefix']; this.defaults = args['defaults']; this.cbAll = document.getElementById(this.prefix + ':all'); this.f = this.cbAll.form; var saveButton = document.getElementById(this.prefix + ':save_button'); if (saveButton) { Event.observe(saveButton, 'click', this.onSubmit.bind(this)); } this.boxRefreshListener = this.boxRefresh.bindAsEventListener(this); this.toggles = {}; this.expanders = {}; this.divs = {}; Event.observe(this.cbAll, 'click', this.checkAll.bind(this)); for (var i = 0; i < this.groups.length; i++) { var group = this.groups[i]; this.toggles[group] = document.getElementById(this.prefix + ':toggle_' + group); this.expanders[group] = document.getElementById(this.prefix + ':expander_' + group); this.divs[group] = document.getElementById(this.prefix + ':div_' + group); Event.observe(this.f[group], 'click', this.checkGroup.bind(this, group)); Event.observe(this.toggles[group], 'click', this.toggle.bind(this, group)); } Event.observe(this.f.birth_date, 'click', this.checkBday.bind(this)); Event.observe(this.f.birth_year, 'click', this.checkByear.bind(this)); for (var group in this.inputs) { for (var j = 0; j < this.inputs[group].length; j++) { Event.observe(this.f[this.inputs[group][j]], 'click', this.boxRefreshListener); } } var saveDefaultsButton = document.getElementById(this.prefix + ':save_as_defaults'); if (saveDefaultsButton) Event.observe(saveDefaultsButton, 'click', this.saveAsDefaults.bindAsEventListener(this)); var useDefaultsButton = document.getElementById(this.prefix + ':use_defaults'); if (useDefaultsButton) Event.observe(useDefaultsButton, 'click', this.useDefaults.bindAsEventListener(this)); this.boxRefresh(); } SharedData.prototype = { groups: ["business","private","im"], inputs: {"private": ["email_p","city_p","province_p","country_p","address_p","phone_private","fax_p","misc2"], "business": ["email","address_business","phone_business","fax_business","phone_mobile"], "im": ["im_icq","im_msn","im_aim","im_yahoo","im_skype","misc1", "misc3"], "various": ["birth_date","birth_year","allow_message"]}, checkAll: function() { var onoff = this.cbAll.checked; for (var group in this.inputs) { for (var i = 0; i < this.inputs[group].length; i++) { this.f[this.inputs[group][i]].checked = onoff; } } this.boxRefresh(); }, checkGroup: function(group) { var onoff = this.f[group].checked for (var i = 0; i < this.inputs[group].length; i++) { this.f[this.inputs[group][i]].checked = onoff; } this.boxRefresh(); }, checkBday: function() { if (this.f.birth_year.checked) { this.f.birth_year.checked = this.f.birth_date.checked; } }, checkByear: function() { if (this.f.birth_year.checked == 1) this.f.birth_date.checked = 1; }, boxRefresh: function() { var allChecked = true; for (var i = 0; i < this.groups.length; i++) { var group = this.groups[i]; var status = this.mayToggle(group); var allChecked = allChecked && status[1]; this.f[group].checked = status[1]; if (status[0]) { this.toggles[group].style.cursor = 'pointer'; this.set_expander(this.expanders[group], Element.visible(this.divs[group])); } else { if (!Element.visible(this.divs[group])) { this.blindDown(this.divs[group]); } this.toggles[group].style.cursor = 'auto'; this.unset_expander(this.expanders[group]); } } var status = this.mayToggle('various'); allChecked = allChecked && status[1]; this.cbAll.checked = allChecked; this.set_ajax_state_none(); }, toggle: function(group) { if (Element.visible(this.divs[group])) { if (this.mayToggle(group)[0]) { this.blindUp(this.divs[group]); this.set_expander(this.expanders[group], false); } } else { this.blindDown(this.divs[group]); this.set_expander(this.expanders[group], true); } }, mayToggle: function(group) { var allChecked = true; var allUnchecked = true; for (var j = 0; j < this.inputs[group].length; j++) { allChecked = allChecked && this.f[this.inputs[group][j]].checked; allUnchecked = allUnchecked && !this.f[this.inputs[group][j]].checked; } return [(allChecked || allUnchecked), allChecked, allUnchecked]; }, blindUp: function(element) { Effect.BlindUp(element, { duration: 0.3, afterFinish: function() { this.blocked = false; }.bind(this) }); }, blindDown: function(element) { Effect.BlindDown(element, { duration: 0.3, afterFinish: function() { this.blocked = false; }.bind(this) }); }, onSubmit: function(event) { Event.stop(event); if (document.getElementById(this.prefix + ':global_settings_warning')) Effect.BlindUp(this.prefix + ':global_settings_warning', { duration: 0.3 }); this.set_ajax_state_waiting(); var parameters = Form.serialize(this.f); new Ajax.Request('/app/profile/ajax.js', { method: 'post', parameters: parameters, onComplete: function() { this.set_ajax_state_done(); }.bind(this) } ); }, saveAsDefaults: function (event) { Event.stop(event); this.set_ajax_state_waiting('ajax_state_save_as_defaults'); this.defaults = {}; var parameters = 'op=add.save_as_defaults'; for (var group in this.inputs) { for (var i = 0; i < this.inputs[group].length; i++) { if (this.f[this.inputs[group][i]].checked) { parameters += '&' + this.inputs[group][i] + '=1'; this.defaults[this.inputs[group][i]] = 1; } } } new Ajax.Request('/app/contact/ajax.js', { method: 'post', parameters: parameters, onComplete: function() { this.set_ajax_state_none('ajax_state_save_as_defaults'); }.bind(this) }); }, useDefaults: function(event) { Event.stop(event); this.set_ajax_state_waiting('ajax_state_use_defaults'); for (var group in this.inputs) { for (var i = 0; i < this.inputs[group].length; i++) { this.f[this.inputs[group][i]].checked = this.defaults[this.inputs[group][i]] ? true : false; } } this.boxRefresh(); this.set_ajax_state_none('ajax_state_use_defaults'); }, set_ajax_state_none: function(ajaxStateId) { var ajaxState = document.getElementById(this.prefix + ':' + (ajaxStateId || 'ajax_state')); if (ajaxState) { setTimeout(function() { ajaxState.src = '/img/no.gif'; }, 800); } if (ajaxState) { // ajaxState.src = '/img/no.gif'; } }, set_ajax_state_done: function(ajaxStateId) { var ajaxState = document.getElementById(this.prefix + ':' + (ajaxStateId || 'ajax_state')); if (ajaxState) { setTimeout(function() { ajaxState.src = '/img/saved_icon.png'; }, 800); } }, set_ajax_state_waiting: function(ajaxStateId) { var ajaxState = document.getElementById(this.prefix + ':' + (ajaxStateId || 'ajax_state')); if (ajaxState) { ajaxState.src="/img/ajax_waiting.gif"; } }, set_expander: function(expander, expanded) { if (expanded) { expander.src='/img/list_minus.png'; } else { expander.src='/img/list_plus.png'; } }, unset_expander: function(expander) { expander.src="/img/no.gif"; } } function ContextHelp(args) { Element.setStyle(args['triggerId'], { cursor: 'help' }); var eventname = args['eventName'] ? args['eventName'] : 'click'; Event.observe(args['triggerId'], eventname, function(e) { Event.stop(e); document.getElementById('context-window-help:help-html').innerHTML = args['helpHTML']; ContextWindow({ id: 'context-window-help', alignTo: args['triggerId'], xOffset: 8, yOffset: document.getElementById(args['triggerId']).offsetHeight + 8 }); }.bindAsEventListener(this)); } function ContextWindow(args) { var id = args['id'] || 'context-window'; var alignTo = $(args['alignTo']); if (ContextWindow.alignTo && ContextWindow.alignTo == alignTo) { ContextWindow.hide(); return; } if (ContextWindow.alignTo && ContextWindow.alignTo != alignTo) { ContextWindow.hide(); } ContextWindow.alignTo = alignTo; var cw = document.getElementById(id); if (cw.parentNode != document.body) { document.body.appendChild(cw); Element.setStyle(cw, { position: 'absolute' }); } if (!ContextWindow.windowObserver) { Event.observe(document, 'click', ContextWindow.hide); ContextWindow.windowObserver = true; } if (!ContextWindow.observers[id]) { Event.observe(cw, 'click', function(e) { if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } }.bindAsEventListener(this)); ContextWindow.observers[id] = true; } if (args['update_function']) { args['update_function'](cw, args); } var pos = Position.cumulativeOffset(ContextWindow.alignTo); pos[0] += args['xOffset'] || 0; pos[1] += args['yOffset'] || 0; if (pos[0] > 800) { pos[0] -= 140; } ContextWindow.visibleWindow = cw; Element.setStyle(cw, { left: (pos[0] - 10) + 'px', top: (pos[1] - 10) + 'px' }); Effect.Appear(cw, { duration: 0.3 }); } ContextWindow.observers = {}; ContextWindow.hide = function() { if (ContextWindow.visibleWindow) { ContextWindow.visibleWindow.style.display = 'none'; ContextWindow.visibleWindow = null; ContextWindow.alignTo = null; } }; ContextWindow.updateSkypeWindow = function(cw, args) { var as = cw.getElementsByTagName('a'); for (var i = 0; i < as.length; i++) { var href = as[i].href; as[i].href = 'skype:' + args['im_skype'] + href.slice(href.lastIndexOf('?')); } } var FormManagers = {}; function FormManager(args) { this.onFocusEL = this.onFocus.bindAsEventListener(this); this.onBlurEL = this.onBlur.bindAsEventListener(this); FormManagers[args['form_id']] = this; this.form = document.getElementById(args['form_id']); this.checks = []; this.hints = {}; this.observedInputs = {}; this.addChecks(args['checks'] || []); this.addHints(args['hints'] || {}); this.globalErrorMsg = document.getElementById(args['globalErrorMsg']); Event.observe(this.form, 'reset', this.onReset.bindAsEventListener(this)); Event.observe(this.form, 'submit', this.onSubmit.bindAsEventListener(this)); } FormManager.prototype = { addChecks: function(checks) { for (var i = 0; i < checks.length; i++) { this.checks.push(checks[i]); if (checks[i].inputName) { if (!this.observedInputs[checks[i].inputName]) { this.observedInputs[checks[i].inputName] = true; var input = this.form[checks[i].inputName]; Event.observe(input, 'focus', this.onFocusEL); Event.observe(input, 'blur', this.onBlurEL); } } } }, addHints: function(hints) { for (var name in hints) { this.hints[name] = hints[name]; if (!this.observedInputs[name]) { this.observedInputs[name] = true; var input = this.form[name]; Event.observe(input, 'focus', this.onFocusEL); Event.observe(input, 'blur', this.onBlurEL); } this.setInput(name); } }, removeInputs: function(names) { for (var i = 0; i < names.length; i++) { var name = names[i]; var filteredChecks = []; for (var j = 0; j < this.checks.length; j++) { if (!this.checks[i].inputName || this.checks[i].inputName != name) filteredChecks.push(this.checks[i]); } this.checks = filteredChecks; delete(this.hints[name]); delete(this.observedInputs[name]); var input = this.form[name]; if (input) { Event.stopObserving(input, 'focus', this.onFocusEL); Event.stopObserving(input, 'blur', this.onBlurEL); } } }, getValue: function(name) { var input = this.form[name]; if (!this.hints[name]) return input.value; var hint = this.hints[input.name].replace(/[\r\n]/g, ''); var value = input.value.replace(/[\r\n]/g, ''); if (value == hint) { return ''; } else { return input.value; } }, reset: function() { this.form.reset(); this.onReset(); }, submit: function() { if (this.onSubmit()) { this.form.submit(); } }, onFocus: function(e) { var name = Event.element(e).name; if (name) this.resetInput(name); }, onBlur: function(e) { var name = Event.element(e).name; if (name) this.setInput(Event.element(e).name); }, onReset: function(e) { for (var name in this.hints) { this.setInput(name); } }, onSubmit: function(e) { if (this.globalErrorMsg) { Element.hide(this.globalErrorMsg); } for (var i = 0; i < this.checks.length; i++) { var input = this.checks[i].inputName ? this.form[this.checks[i].inputName] : null; var errorClass = this.checks[i].errorClass || 'error-form-field'; var errorMsg = document.getElementById(this.checks[i].errorMsg || 'error-' + this.checks[i].inputName); if (input) Element.removeClassName(input, errorClass); if (errorMsg) Element.hide(errorMsg); } var submit = true; for (var i = 0; i < this.checks.length; i++) { if (!this.checks[i].onBlur && !this.checks[i].check(this, this.checks[i].inputName)) { submit = false; var input = this.checks[i].inputName ? this.form[this.checks[i].inputName] : null; var errorClass = this.checks[i].errorClass || 'error-form-field'; var errorMsg = document.getElementById(this.checks[i].errorMsg || 'error-' + this.checks[i].inputName); if (input) Element.addClassName(input, errorClass); if (errorMsg) Element.show(errorMsg); } } if (submit) { for (var name in this.hints) { this.resetInput(name); } if (e) { return; } else { return true; } } else { if (this.globalErrorMsg) { Element.show(this.globalErrorMsg); new Effect.ScrollTo(document.body, { duration: 0.5 }); } if (e) { Event.stop(e); return; } else { return false; } } }, setInput: function(name) { var i = this.form[name]; if (this.hints[name] && this.getValue(name) == '') { i.style.color = '#808080'; i.value = this.hints[name]; this.hints[name] = i.value; } else { i.style.color = '#000'; } }, resetInput: function(name) { var i = this.form[name]; i.value = this.getValue(name); i.style.color = '#000'; } }; var FormValidation = {}; FormValidation.combineAnd = function(checks) { return function(formManager, name) { for (var i = 0; i < checks.length; i++) { if (!checks[i](formManager, name)) return false; } return true; } } FormValidation.combineOr = function(checks) { return function(formManager, name) { for (var i = 0; i < checks.length; i++) { if (checks[i](formManager, name)) return true; } return false; } } FormValidation.valid = function() { return function() { return true; } } FormValidation.inValid = function() { return function() { return false; } } FormValidation._validEmailAddress = function(formManager, name) { return /^[^@ ]+\@([^@ .]+\.)+[^@ .]+$/.test(formManager.getValue(name).strip()); }; FormValidation.validEmailAddress = function() { return FormValidation._validEmailAddress; }; FormValidation.strippedMinLength = function(length) { return function(formManager, name) { return formManager.getValue(name).strip().length >= length; } }; FormValidation.strippedMaxLength = function(length) { return function(formManager, name) { return formManager.getValue(name).strip().length <= length; } }; FormValidation.matches = function(regexp) { return function(formManager, name) { return regexp.test(formManager.getValue(name)); } } Form.InlineHints = function(form, hints) { this.form = $(form); this.hints = {}; this.onFocusEL = this.onFocus.bindAsEventListener(this); this.onBlurEL = this.onBlur.bindAsEventListener(this); this.setInputsEL = this.setInputs.bindAsEventListener(this); this.resetInputsEL = this.resetInputs.bindAsEventListener(this) this.addHints(hints); Event.observe(this.form, 'reset', this.setInputsEL); Event.observe(this.form, 'submit', this.resetInputsEL); }; Form.InlineHints.prototype = { addHints: function(hints) { for (var name in hints) { this.hints[name] = hints[name]; var i = this.form[name]; Event.observe(i, 'focus', this.onFocusEL); Event.observe(i, 'blur', this.onBlurEL); } this.setInputs(); }, removeHints: function(names) { for (var i = 0; i < names.length; i++) { delete(this.hints[names[i]]); } }, onFocus: function(e) { var i = Event.element(e); if (this.hints[i.name]) { var hint = this.hints[i.name].replace(/[\r\n]/g, ''); var value = i.value.replace(/[\r\n]/g, ''); if (value == hint) { i.style.color = '#000'; i.value = ''; } } }, onBlur: function(e) { var i = Event.element(e); this.restoreHints(i); }, restoreHints: function( i ) { if (i.value == '') { i.style.color = '#808080'; i.value = this.hints[i.name]; this.hints[i.name] = i.value; } }, setInputs: function() { for (var name in this.hints) { var i = this.form[name]; var hint = this.hints[i.name].replace(/[\r\n]/g, ''); var value = i.value.replace(/[\r\n]/g, ''); if (value == '' || value == hint) { i.style.color = '#808080'; i.value = this.hints[name]; this.hints[name] = i.value; } else { i.style.color = '#000'; } } }, resetInputs: function() { for (var name in this.hints) { var i = this.form[name]; var hint = this.hints[i.name].replace(/[\r\n]/g, ''); var value = i.value.replace(/[\r\n]/g, ''); if (value == hint) { i.style.color = '#000'; i.value = ''; } } } }; function CurrencyConverter(select, amounts, currency) { this.select = $(select); this.amounts = amounts; this.currency = currency; Event.observe(this.select, 'change', this.convert.bind(this)); } CurrencyConverter.prototype = { convert: function() { if (this.select.value == this.currency) { this.clearAmounts(); } else { var parameters = 'op=convert_amounts&source_currency=' + this.currency + '&target_currency=' + this.select.value + '&amounts=' + this.amounts.join(' '); new Ajax.Request('/app/upgrade', { parameters: parameters, onSuccess: this.onSuccess.bind(this), onFailure: this.onFailure.bind(this) }); } }, onSuccess: function(transport) { var result; try { result = eval(transport.responseText); } catch(e) {} if (result) { this.setAmounts(result); } else { this.clearAmounts(); } }, onFailure: function(transport) { this.clearAmounts(); }, setAmounts: function(amounts) { for (var i = 0; i < this.amounts.length; i++) { $('AM_' + this.amounts[i]).innerHTML = amounts[this.amounts[i]]; } }, clearAmounts: function(amounts) { for (var i = 0; i < this.amounts.length; i++) { $('AM_' + this.amounts[i]).innerHTML = ''; } } } function ClickPrice(select, clickprice, shop_country) { this.select = $(select); this.clickprice = clickprice; this.shop_country = shop_country; Event.observe(this.select, 'change', this.convert.bind(this)); } ClickPrice.prototype = { convert: function() { if (this.select.value == this.shop_country) { this.clearClickprice(); } else { var parameters = 'op=clickprice&shop_country=' + this.select.value; new Ajax.Request('/app/upgrade', { parameters: parameters, onSuccess: this.onSuccess.bind(this), onFailure: this.onFailure.bind(this) }); } }, onSuccess: function(transport) { var result; try { result = eval(transport.responseText); } catch(e) {} if (result) { this.setClickprice(result); } else { this.clearClickprice(); } }, onFailure: function(transport) { this.clearClickprice(); }, setClickprice: function(clickprice) { $('clickprice').innerHTML = clickprice.amount + ' ' + clickprice.currency; }, clearClickprice: function() { $('clickprice').innerHTML = ''; //this.clickprice; } } // language_selection.js var LanguageSelection = { initialize: function() { this.headerLanguageSelector = document.getElementById('header-language-selector'); if (!this.headerLanguageSelector) return; document.body.appendChild(this.headerLanguageSelector); this.languageLink = document.getElementById('language-value'); this.languageLinkMin = document.getElementById('language-value-min'); this.languageSelectIframe = document.getElementById('language-select-iframe'); Event.observe(this.languageLink, 'click', this.showLanguages.bindAsEventListener(this)); Event.observe(this.languageLink, 'mouseout', this.delayedHideLanguages.bindAsEventListener(this)); if (this.languageLinkMin) { Event.observe(this.languageLinkMin, 'click', this.showLanguages.bindAsEventListener(this)); Event.observe(this.languageLinkMin, 'mouseout', this.delayedHideLanguages.bindAsEventListener(this)); } Event.observe(this.headerLanguageSelector, 'mouseout', this.delayedHideLanguages.bindAsEventListener(this)); Event.observe(this.headerLanguageSelector, 'mouseover', this.clearHideLanguages.bindAsEventListener(this)); if (this.languageSelectIframe) { Element.setStyle(this.headerLanguageSelector, { visibility: 'hidden', display: '' }); this.languageSelectIframe.style.width = this.headerLanguageSelector.offsetWidth + 'px'; this.languageSelectIframe.style.height = this.headerLanguageSelector.offsetHeight +'px'; Element.setStyle(this.headerLanguageSelector, { visibility: '', display: 'none' }); } }, showLanguages: function(e) { Event.stop(e); var languageLink = Event.element(e); languageLink.blur(); this.clearHideLanguages(); if (this.visible) { this.hideLanguages(); } else { var leftBorder = Position.cumulativeOffset(languageLink)[0] + languageLink.offsetWidth; this.headerLanguageSelector.style.left = (leftBorder - 168) + 'px'; this.headerLanguageSelector.style.top = '20px'; try { Effect.Appear(this.headerLanguageSelector, {duration:0.3}); } catch(e) { Element.show(this.headerLanguageSelector); } this.visible = true; } }, hideLanguages: function(){ if (this.visible) { try { Effect.Fade(this.headerLanguageSelector, {duration:0.3}); } catch(e) { Element.hide(this.headerLanguageSelector); } this.visible = false; } }, delayedHideLanguages: function(e) { if (this.visible){ this.clearHideLanguages(); this.delayID = setTimeout(this.hideLanguages.bind(this), 250); } }, clearHideLanguages: function(){ if (this.delayID) { clearTimeout(this.delayID); this.delayID = null; } } }; var Header = { toggle: function(){ if (!this.visible){ this.header_min = document.getElementById('header-min'); this.header_max = document.getElementById('header'); this.minimize_link = document.getElementById('minimize-link'); this.maximize_link = document.getElementById('maximize-link'); this.visible = this.header_min.style.display == 'none' ? this.header_max : this.header_min; } if (this.visible.id == 'header'){ new Ajax.Request('/app/network',{parameters:'op=save_header_state.minimize' } ); this.minimize_link.style.display = 'none'; this.maximize_link.style.display = ''; Transition.Morph(this.header_max, this.header_min, { duration: 0.5 }); this.visible = this.header_min; } else { new Ajax.Request('/app/network',{parameters:'op=save_header_state.maximize' } ); this.maximize_link.style.display = 'none'; this.minimize_link.style.display = ''; Transition.Morph(this.header_min, this.header_max, { duration: 0.5 }); this.visible = this.header_max; } } } Event.observe(window, 'load', LanguageSelection.initialize.bind(LanguageSelection)); var Password = { calculateStrength: function(passwd, stopWords) { if (passwd.length == 0) return 0; stopWords = stopWords || []; var tmp = passwd.toLowerCase().strip(); for (var i = 0; i < stopWords.length; i++) { var sw = stopWords[i].toLowerCase().strip(); if (tmp == sw) return 0; } var score = 0 if (passwd.length < 5) { score += 3; } else if (passwd.length < 8) { score += 6; } else if (passwd.length < 10) { score += 12; } else { score += 18; } var lowerCaseChars = (passwd != passwd.toUpperCase()); if (lowerCaseChars) { score += 1; } var upperCaseChars = (passwd != passwd.toLowerCase()); if (upperCaseChars) { score += 5; } var chars = (upperCaseChars || lowerCaseChars); var digits = (passwd.match(/\d/g) || []).length; if (digits > 0) { score += 5; } if (digits > 2) { score += 5; } var specialChars = (passwd.match(/[@!#$%^&*?_~]/g) || []).length; if (specialChars > 0) { score += 5; } if (specialChars > 1) { score += 5; } if (upperCaseChars && lowerCaseChars) { score += 2; } if (chars && digits) { score += 2; } if (chars && digits && specialChars) { score += 2; } return score / 50; } }; Form.TextareaLimiter = function(elementId, limit, hintId) { this.textarea = document.getElementById(elementId); this.hint = document.getElementById(hintId); this.hintVisible = false; this.limit = limit; Event.observe(this.textarea, 'keyup', this.limitSize.bind(this)); }; Form.TextareaLimiter.prototype = { limitSize: function() { if (this.textarea.value.length > this.limit) { this.textarea.value = this.textarea.value.substring(0, this.limit); } if (this.textarea.value.length > (this.limit-10)) { if (!this.hintVisible && this.hint) { Effect.Appear(this.hint); this.hintVisible = true; } } else { if (this.hintVisible && this.hint) { Element.hide(this.hint); this.hintVisible = false; } } } }; function KeystrokeTracker(element, key) { this.cache = {}; this.encodedKey = encodeURIComponent(key); Event.observe(element, 'keyup', this.track.bindAsEventListener(this)); }; KeystrokeTracker.prototype = { track: function(event) { var value = Event.element(event).value; if (!this.cache[value]) { new Ajax.Request('/app/user', { parameters: 'op=keystroke_tracking&key=' + this.encodedKey }); this.cache[value] = true; } } }; var LocalProfileTime = Class.create(); LocalProfileTime.prototype = { initialize: function(args) { this.id = args['id']; this.localHour = args['hour']; this.localMinute = args['minute']; this.localFormat = args['format']; var time = new Date(); this.hourOffset = this.localHour - time.getHours(); this.minuteOffset = this.localMinute - time.getMinutes(); Event.observe(window, 'load', this.run.bindAsEventListener(this)); }, render: function() { var time = new Date(); time.setHours(time.getHours() + this.hourOffset); time.setMinutes(time.getMinutes() + this.minuteOffset); $(this.id).innerHTML = this.formatTime(time.getHours(), time.getMinutes()); }, run: function() { this.render(); new PeriodicalExecuter(this.render.bind(this), 60); }, formatTime: function(hour, minute) { var amPm = ''; if (this.localFormat == '12') { amPm = hour >= 12 ? ' PM' : ' AM'; if (hour == 0) { hour = 12; } else if (hour > 12) { hour = hour - 12; } } hour = hour < 10 ? '0' + hour : hour; minute = minute < 10 ? '0' + minute : minute; return hour + ':' + minute + amPm; } }; var RenderAdvertising = Class.create(); RenderAdvertising.prototype = { initialize: function(args) { this.set_src = args['src']; this.set_height = args['height']; this.set_width = args['width']; this.generateIframe(); }, generateIframe: function() { var iframe = document.createElement("iframe"); iframe.setAttribute("name", "advertising-frame"); iframe.setAttribute("id", "advertising-frame"); iframe.setAttribute("src", this.set_src); iframe.setAttribute("width", this.set_width); iframe.setAttribute("height", this.set_height); iframe.setAttribute("marginheight","0"); iframe.setAttribute("marginwidth", "0"); iframe.setAttribute("scrolling", "no"); iframe.setAttribute("frameborder", "0"); $("advertising-container").appendChild(iframe); } };