String.prototype.parseColor = function() {var color = '#';if (this.slice(0,4) == 'rgb(') {var cols = this.slice(4,this.length-1).split(',');var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);} else {if (this.slice(0,1) == '#') {if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();if (this.length==7) color = this.toLowerCase();}}return (color.length==7 ? color : (arguments[0] || this));};Element.collectTextNodes = function(element) {return $A($(element).childNodes).collect( function(node) {return (node.nodeType==3 ? node.nodeValue :(node.hasChildNodes() ? Element.collectTextNodes(node) : ''));}).flatten().join('');};Element.collectTextNodesIgnoreClass = function(element, className) {return $A($(element).childNodes).collect( function(node) {return (node.nodeType==3 ? node.nodeValue :((node.hasChildNodes() && !Element.hasClassName(node,className)) ?Element.collectTextNodesIgnoreClass(node, className) : ''));}).flatten().join('');};Element.setContentZoom = function(element, percent) {element = $(element);element.setStyle({fontSize: (percent/100) + 'em'});   if (Prototype.Browser.WebKit) window.scrollBy(0,0);return element;};Element.getInlineOpacity = function(element){return $(element).style.opacity || '';};Element.forceRerendering = function(element) {try {element = $(element);var n = document.createTextNode(' ');element.appendChild(n);element.removeChild(n);} catch(e) { }};var Effect = {_elementDoesNotExistError: {name: 'ElementDoesNotExistError',message: 'The specified DOM element does not exist, but is required for this effect to operate'},Transitions: {linear: Prototype.K,sinoidal: function(pos) {return (-Math.cos(pos*Math.PI)/2) + 0.5;},reverse: function(pos) {return 1-pos;},flicker: function(pos) {var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;return pos > 1 ? 1 : pos;},wobble: function(pos) {return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;},pulse: function(pos, pulses) {pulses = pulses || 5;return (((pos % (1/pulses)) * pulses).round() == 0 ? ((pos * pulses * 2) - (pos * pulses * 2).floor()) :1 - ((pos * pulses * 2) - (pos * pulses * 2).floor()));},spring: function(pos) {return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));},none: function(pos) {return 0;},full: function(pos) {return 1;}},DefaultOptions: {duration: 1.0,fps: 100,sync: false,from: 0.0,to: 1.0,delay: 0.0,queue: 'parallel'},tagifyText: function(element) {var tagifyStyle = 'position:relative';if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';element = $(element);$A(element.childNodes).each( function(child) {if (child.nodeType==3) {child.nodeValue.toArray().each( function(character) {element.insertBefore(new Element('span', {style: tagifyStyle}).update(character == ' ' ? String.fromCharCode(160) : character),child);});Element.remove(child);}});},multiple: function(element, effect) {var elements;if (((typeof element == 'object') ||Object.isFunction(element)) &&(element.length))elements = element;elseelements = $(element).childNodes;var options = Object.extend({speed: 0.1,delay: 0.0}, arguments[2] || { });var masterDelay = options.delay;$A(elements).each( function(element, index) {new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));});},PAIRS: {'slide': ['SlideDown','SlideUp'],'blind': ['BlindDown','BlindUp'],'appear': ['Appear','Fade']},toggle: function(element, effect) {element = $(element);effect = (effect || 'appear').toLowerCase();var options = Object.extend({queue: { position:'end', scope:(element.id || 'global'), limit: 1 }}, arguments[2] || { });Effect[element.visible() ?Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);}};Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;Effect.ScopedQueue = Class.create(Enumerable, {initialize: function() {this.effects = [];this.interval = null;},_each: function(iterator) {this.effects._each(iterator);},add: function(effect) {var timestamp = new Date().getTime();var position = Object.isString(effect.options.queue) ?effect.options.queue : effect.options.queue.position;switch(position) {case 'front':this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {e.startOn += effect.finishOn;e.finishOn += effect.finishOn;});break;case 'with-last':timestamp = this.effects.pluck('startOn').max() || timestamp;break;case 'end':timestamp = this.effects.pluck('finishOn').max() || timestamp;break;}effect.startOn += timestamp;effect.finishOn += timestamp;if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))this.effects.push(effect);if (!this.interval)this.interval = setInterval(this.loop.bind(this), 15);},remove: function(effect) {this.effects = this.effects.reject(function(e) { return e==effect });if (this.effects.length == 0) {clearInterval(this.interval);this.interval = null;}},loop: function() {var timePos = new Date().getTime();for(var i=0, len=this.effects.length;i<len;i++)this.effects[i] && this.effects[i].loop(timePos);}});Effect.Queues = {instances: $H(),get: function(queueName) {if (!Object.isString(queueName)) return queueName;return this.instances.get(queueName) ||this.instances.set(queueName, new Effect.ScopedQueue());}};Effect.Queue = Effect.Queues.get('global');Effect.Base = Class.create({position: null,start: function(options) {function codeForEvent(options,eventName){return ((options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +(options[eventName] ? 'this.options.'+eventName+'(this);' : ''));}if (options && options.transition === false) options.transition = Effect.Transitions.linear;this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });this.currentFrame = 0;this.state = 'idle';this.startOn = this.options.delay*1000;this.finishOn = this.startOn+(this.options.duration*1000);this.fromToDelta = this.options.to-this.options.from;this.totalTime = this.finishOn-this.startOn;this.totalFrames = this.options.fps*this.options.duration;eval('this.render = function(pos){ '+'if (this.state=="idle"){this.state="running";'+codeForEvent(this.options,'beforeSetup')+(this.setup ? 'this.setup();':'')+codeForEvent(this.options,'afterSetup')+'};if (this.state=="running"){'+'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+'this.position=pos;'+codeForEvent(this.options,'beforeUpdate')+(this.update ? 'this.update(pos);':'')+codeForEvent(this.options,'afterUpdate')+'}}');this.event('beforeStart');if (!this.options.sync)Effect.Queues.get(Object.isString(this.options.queue) ?'global' : this.options.queue.scope).add(this);},loop: function(timePos) {if (timePos >= this.startOn) {if (timePos >= this.finishOn) {this.render(1.0);this.cancel();this.event('beforeFinish');if (this.finish) this.finish();this.event('afterFinish');return;}var pos = (timePos - this.startOn) / this.totalTime,frame = (pos * this.totalFrames).round();if (frame > this.currentFrame) {this.render(pos);this.currentFrame = frame;}}},cancel: function() {if (!this.options.sync)Effect.Queues.get(Object.isString(this.options.queue) ?'global' : this.options.queue.scope).remove(this);this.state = 'finished';},event: function(eventName) {if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);if (this.options[eventName]) this.options[eventName](this);},inspect: function() {var data = $H();for(property in this)if (!Object.isFunction(this[property])) data.set(property, this[property]);return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';}});Effect.Parallel = Class.create(Effect.Base, {initialize: function(effects) {this.effects = effects || [];this.start(arguments[1]);},update: function(position) {this.effects.invoke('render', position);},finish: function(position) {this.effects.each( function(effect) {effect.render(1.0);effect.cancel();effect.event('beforeFinish');if (effect.finish) effect.finish(position);effect.event('afterFinish');});}});Effect.Tween = Class.create(Effect.Base, {initialize: function(object, from, to) {object = Object.isString(object) ? $(object) : object;var args = $A(arguments), method = args.last(),options = args.length == 5 ? args[3] : null;this.method = Object.isFunction(method) ? method.bind(object) :Object.isFunction(object[method]) ? object[method].bind(object) :function(value) { object[method] = value };this.start(Object.extend({ from: from, to: to }, options || { }));},update: function(position) {this.method(position);}});Effect.Event = Class.create(Effect.Base, {initialize: function() {this.start(Object.extend({ duration: 0 }, arguments[0] || { }));},update: Prototype.emptyFunction});Effect.Opacity = Class.create(Effect.Base, {initialize: function(element) {this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))this.element.setStyle({zoom: 1});var options = Object.extend({from: this.element.getOpacity() || 0.0,to: 1.0}, arguments[1] || { });this.start(options);},update: function(position) {this.element.setOpacity(position);}});Effect.Move = Class.create(Effect.Base, {initialize: function(element) {this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);var options = Object.extend({x: 0,y: 0,mode: 'relative'}, arguments[1] || { });this.start(options);},setup: function() {this.element.makePositioned();this.originalLeft = parseFloat(this.element.getStyle('left') || '0');this.originalTop = parseFloat(this.element.getStyle('top') || '0');if (this.options.mode == 'absolute') {this.options.x = this.options.x - this.originalLeft;this.options.y = this.options.y - this.originalTop;}},update: function(position) {this.element.setStyle({left: (this.options.x * position + this.originalLeft).round() + 'px',top: (this.options.y * position + this.originalTop).round() + 'px'});}});Effect.MoveBy = function(element, toTop, toLeft) {return new Effect.Move(element,Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));};Effect.Scale = Class.create(Effect.Base, {initialize: function(element, percent) {this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);var options = Object.extend({scaleX: true,scaleY: true,scaleContent: true,scaleFromCenter: false,scaleMode: 'box',scaleFrom: 100.0,scaleTo: percent}, arguments[2] || { });this.start(options);},setup: function() {this.restoreAfterFinish = this.options.restoreAfterFinish || false;this.elementPositioning = this.element.getStyle('position');this.originalStyle = { };['top','left','width','height','fontSize'].each( function(k) {this.originalStyle[k] = this.element.style[k];}.bind(this));this.originalTop = this.element.offsetTop;this.originalLeft = this.element.offsetLeft;var fontSize = this.element.getStyle('font-size') || '100%';['em','px','%','pt'].each( function(fontSizeType) {if (fontSize.indexOf(fontSizeType)>0) {this.fontSize = parseFloat(fontSize);this.fontSizeType = fontSizeType;}}.bind(this));this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;this.dims = null;if (this.options.scaleMode=='box')this.dims = [this.element.offsetHeight, this.element.offsetWidth];if (/^content/.test(this.options.scaleMode))this.dims = [this.element.scrollHeight, this.element.scrollWidth];if (!this.dims)this.dims = [this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth];},update: function(position) {var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);if (this.options.scaleContent && this.fontSize)this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);},finish: function(position) {if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);},setDimensions: function(height, width) {var d = { };if (this.options.scaleX) d.width = width.round() + 'px';if (this.options.scaleY) d.height = height.round() + 'px';if (this.options.scaleFromCenter) {var topd = (height - this.dims[0])/2;var leftd = (width - this.dims[1])/2;if (this.elementPositioning == 'absolute') {if (this.options.scaleY) d.top = this.originalTop-topd + 'px';if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';} else {if (this.options.scaleY) d.top = -topd + 'px';if (this.options.scaleX) d.left = -leftd + 'px';}}this.element.setStyle(d);}});Effect.Highlight = Class.create(Effect.Base, {initialize: function(element) {this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });this.start(options);},setup: function() {if (this.element.getStyle('display')=='none') { this.cancel(); return; }this.oldStyle = { };if (!this.options.keepBackgroundImage) {this.oldStyle.backgroundImage = this.element.getStyle('background-image');this.element.setStyle({backgroundImage: 'none'});}if (!this.options.endcolor)this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');if (!this.options.restorecolor)this.options.restorecolor = this.element.getStyle('background-color');this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));},update: function(position) {this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });},finish: function() {this.element.setStyle(Object.extend(this.oldStyle, {backgroundColor: this.options.restorecolor}));}});Effect.ScrollTo = function(element) {var options = arguments[1] || { },scrollOffsets = document.viewport.getScrollOffsets(),elementOffsets = $(element).cumulativeOffset(),max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();if (options.offset) elementOffsets[1] += options.offset;return new Effect.Tween(null,scrollOffsets.top,elementOffsets[1] > max ? max : elementOffsets[1],options,function(p){ scrollTo(scrollOffsets.left, p.round()) });};Effect.Hide = function(element) {element = $(element);var oldOpacity = element.getInlineOpacity();var options = Object.extend({from: 0.0,to: 0.0,afterFinishInternal: function(effect) {if (effect.options.to!=0) return;effect.element.hide().setStyle({opacity: oldOpacity});}}, arguments[1] || { });return new Effect.Opacity(element,options);};Effect.Fade = function(element) {element = $(element);var oldOpacity = element.getInlineOpacity();var options = Object.extend({from: element.getOpacity() || 1.0,to: 0.0,afterFinishInternal: function(effect) {if (effect.options.to!=0) return;effect.element.hide().setStyle({opacity: oldOpacity});}}, arguments[1] || { });return new Effect.Opacity(element,options);};Effect.Appear = function(element) {element = $(element);var options = Object.extend({from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),to: 1.0,afterFinishInternal: function(effect) {effect.element.forceRerendering();},beforeSetup: function(effect) {effect.element.setOpacity(effect.options.from).show();}}, arguments[1] || { });return new Effect.Opacity(element,options);};Effect.Puff = function(element) {element = $(element);var oldStyle = {opacity: element.getInlineOpacity(),position: element.getStyle('position'),top: element.style.top,left: element.style.left,width: element.style.width,height: element.style.height};return new Effect.Parallel([ new Effect.Scale(element, 200,{ sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],Object.extend({ duration: 1.0,beforeSetupInternal: function(effect) {Position.absolutize(effect.effects[0].element)},afterFinishInternal: function(effect) {effect.effects[0].element.hide().setStyle(oldStyle); }}, arguments[1] || { }));};Effect.BlindUp = function(element) {element = $(element);element.makeClipping();return new Effect.Scale(element, 0,Object.extend({ scaleContent: false,scaleX: false,restoreAfterFinish: true,afterFinishInternal: function(effect) {effect.element.hide().undoClipping();}}, arguments[1] || { }));};Effect.BlindDown = function(element) {element = $(element);var elementDimensions = element.getDimensions();return new Effect.Scale(element, 100, Object.extend({scaleContent: false,scaleX: false,scaleFrom: 0,scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},restoreAfterFinish: true,afterSetup: function(effect) {effect.element.makeClipping().setStyle({height: '0px'}).show();},afterFinishInternal: function(effect) {effect.element.undoClipping();}}, arguments[1] || { }));};Effect.SwitchOff = function(element) {element = $(element);var oldOpacity = element.getInlineOpacity();return new Effect.Appear(element, Object.extend({duration: 0.4,from: 0,transition: Effect.Transitions.flicker,afterFinishInternal: function(effect) {new Effect.Scale(effect.element, 1, {duration: 0.3, scaleFromCenter: true,scaleX: false, scaleContent: false, restoreAfterFinish: true,beforeSetup: function(effect) {effect.element.makePositioned().makeClipping();},afterFinishInternal: function(effect) {effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});}})}}, arguments[1] || { }));};Effect.DropOut = function(element) {element = $(element);var oldStyle = {top: element.getStyle('top'),left: element.getStyle('left'),opacity: element.getInlineOpacity() };return new Effect.Parallel([ new Effect.Move(element, {x: 0, y: 100, sync: true }),new Effect.Opacity(element, { sync: true, to: 0.0 }) ],Object.extend({ duration: 0.5,beforeSetup: function(effect) {effect.effects[0].element.makePositioned();},afterFinishInternal: function(effect) {effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);}}, arguments[1] || { }));};Effect.Shake = function(element) {element = $(element);var options = Object.extend({distance: 20,duration: 0.5}, arguments[1] || {});var distance = parseFloat(options.distance);var split = parseFloat(options.duration) / 10.0;var oldStyle = {top: element.getStyle('top'),left: element.getStyle('left') };return new Effect.Move(element,{ x: distance, y: 0, duration: split, afterFinishInternal: function(effect) {new Effect.Move(effect.element,{ x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {new Effect.Move(effect.element,{ x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {new Effect.Move(effect.element,{ x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {new Effect.Move(effect.element,{ x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {new Effect.Move(effect.element,{ x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {effect.element.undoPositioned().setStyle(oldStyle);}}) }}) }}) }}) }}) }});};Effect.SlideDown = function(element) {element = $(element).cleanWhitespace();var oldInnerBottom = element.down().getStyle('bottom');var elementDimensions = element.getDimensions();return new Effect.Scale(element, 100, Object.extend({scaleContent: false,scaleX: false,scaleFrom: window.opera ? 0 : 1,scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},restoreAfterFinish: true,afterSetup: function(effect) {effect.element.makePositioned();effect.element.down().makePositioned();if (window.opera) effect.element.setStyle({top: ''});effect.element.makeClipping().setStyle({height: '0px'}).show();},afterUpdateInternal: function(effect) {effect.element.down().setStyle({bottom:(effect.dims[0] - effect.element.clientHeight) + 'px' });},afterFinishInternal: function(effect) {effect.element.undoClipping().undoPositioned();effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }}, arguments[1] || { }));};Effect.SlideUp = function(element) {element = $(element).cleanWhitespace();var oldInnerBottom = element.down().getStyle('bottom');var elementDimensions = element.getDimensions();return new Effect.Scale(element, window.opera ? 0 : 1,Object.extend({ scaleContent: false,scaleX: false,scaleMode: 'box',scaleFrom: 100,scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},restoreAfterFinish: true,afterSetup: function(effect) {effect.element.makePositioned();effect.element.down().makePositioned();if (window.opera) effect.element.setStyle({top: ''});effect.element.makeClipping().show();},afterUpdateInternal: function(effect) {effect.element.down().setStyle({bottom:(effect.dims[0] - effect.element.clientHeight) + 'px' });},afterFinishInternal: function(effect) {effect.element.hide().undoClipping().undoPositioned();effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});}}, arguments[1] || { }));};Effect.Squish = function(element) {return new Effect.Scale(element, window.opera ? 1 : 0, {restoreAfterFinish: true,beforeSetup: function(effect) {effect.element.makeClipping();},afterFinishInternal: function(effect) {effect.element.hide().undoClipping();}});};Effect.Grow = function(element) {element = $(element);var options = Object.extend({direction: 'center',moveTransition: Effect.Transitions.sinoidal,scaleTransition: Effect.Transitions.sinoidal,opacityTransition: Effect.Transitions.full}, arguments[1] || { });var oldStyle = {top: element.style.top,left: element.style.left,height: element.style.height,width: element.style.width,opacity: element.getInlineOpacity() };var dims = element.getDimensions();var initialMoveX, initialMoveY;var moveX, moveY;switch (options.direction) {case 'top-left':initialMoveX = initialMoveY = moveX = moveY = 0;break;case 'top-right':initialMoveX = dims.width;initialMoveY = moveY = 0;moveX = -dims.width;break;case 'bottom-left':initialMoveX = moveX = 0;initialMoveY = dims.height;moveY = -dims.height;break;case 'bottom-right':initialMoveX = dims.width;initialMoveY = dims.height;moveX = -dims.width;moveY = -dims.height;break;case 'center':initialMoveX = dims.width / 2;initialMoveY = dims.height / 2;moveX = -dims.width / 2;moveY = -dims.height / 2;break;}return new Effect.Move(element, {x: initialMoveX,y: initialMoveY,duration: 0.01,beforeSetup: function(effect) {effect.element.hide().makeClipping().makePositioned();},afterFinishInternal: function(effect) {new Effect.Parallel([ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),new Effect.Scale(effect.element, 100, {scaleMode: { originalHeight: dims.height, originalWidth: dims.width },sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})], Object.extend({beforeSetup: function(effect) {effect.effects[0].element.setStyle({height: '0px'}).show();},afterFinishInternal: function(effect) {effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);}}, options))}});};Effect.Shrink = function(element) {element = $(element);var options = Object.extend({direction: 'center',moveTransition: Effect.Transitions.sinoidal,scaleTransition: Effect.Transitions.sinoidal,opacityTransition: Effect.Transitions.none}, arguments[1] || { });var oldStyle = {top: element.style.top,left: element.style.left,height: element.style.height,width: element.style.width,opacity: element.getInlineOpacity() };var dims = element.getDimensions();var moveX, moveY;switch (options.direction) {case 'top-left':moveX = moveY = 0;break;case 'top-right':moveX = dims.width;moveY = 0;break;case 'bottom-left':moveX = 0;moveY = dims.height;break;case 'bottom-right':moveX = dims.width;moveY = dims.height;break;case 'center':moveX = dims.width / 2;moveY = dims.height / 2;break;}return new Effect.Parallel([ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })], Object.extend({beforeStartInternal: function(effect) {effect.effects[0].element.makePositioned().makeClipping();},afterFinishInternal: function(effect) {effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }}, options));};Effect.Pulsate = function(element) {element = $(element);var options = arguments[1] || { };var oldOpacity = element.getInlineOpacity();var transition = options.transition || Effect.Transitions.sinoidal;var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };reverser.bind(transition);return new Effect.Opacity(element,Object.extend(Object.extend({ duration: 2.0, from: 0,afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }}, options), {transition: reverser}));};Effect.Fold = function(element) {element = $(element);var oldStyle = {top: element.style.top,left: element.style.left,width: element.style.width,height: element.style.height };element.makeClipping();return new Effect.Scale(element, 5, Object.extend({scaleContent: false,scaleX: false,afterFinishInternal: function(effect) {new Effect.Scale(element, 1, {scaleContent: false,scaleY: false,afterFinishInternal: function(effect) {effect.element.hide().undoClipping().setStyle(oldStyle);} });}}, arguments[1] || { }));};Effect.Morph = Class.create(Effect.Base, {initialize: function(element) {this.element = $(element);if (!this.element) throw(Effect._elementDoesNotExistError);var options = Object.extend({style: { }}, arguments[1] || { });if (!Object.isString(options.style)) this.style = $H(options.style);else {if (options.style.include(':'))this.style = options.style.parseStyle();else {this.element.addClassName(options.style);this.style = $H(this.element.getStyles());this.element.removeClassName(options.style);var css = this.element.getStyles();this.style = this.style.reject(function(style) {return style.value == css[style.key];});options.afterFinishInternal = function(effect) {effect.element.addClassName(effect.options.style);effect.transforms.each(function(transform) {effect.element.style[transform.style] = '';});}}}this.start(options);},setup: function(){function parseColor(color){if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';color = color.parseColor();return $R(0,2).map(function(i){return parseInt( color.slice(i*2+1,i*2+3), 16 )});}this.transforms = this.style.map(function(pair){var property = pair[0], value = pair[1], unit = null;if (value.parseColor('#zzzzzz') != '#zzzzzz') {value = value.parseColor();unit = 'color';} else if (property == 'opacity') {value = parseFloat(value);if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))this.element.setStyle({zoom: 1});} else if (Element.CSS_LENGTH.test(value)) {var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);value = parseFloat(components[1]);unit = (components.length == 3) ? components[2] : null;}var originalValue = this.element.getStyle(property);return {style: property.camelize(),originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),targetValue: unit=='color' ? parseColor(value) : value,unit: unit};}.bind(this)).reject(function(transform){return ((transform.originalValue == transform.targetValue) ||(transform.unit != 'color' &&(isNaN(transform.originalValue) || isNaN(transform.targetValue))))});},update: function(position) {var style = { }, transform, i = this.transforms.length;while(i--)style[(transform = this.transforms[i]).style] =transform.unit=='color' ? '#'+(Math.round(transform.originalValue[0]+(transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +(Math.round(transform.originalValue[1]+(transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +(Math.round(transform.originalValue[2]+(transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :(transform.originalValue +(transform.targetValue - transform.originalValue) * position).toFixed(3) +(transform.unit === null ? '' : transform.unit);this.element.setStyle(style, true);}});Effect.Transform = Class.create({initialize: function(tracks){this.tracks = [];this.options = arguments[1] || { };this.addTracks(tracks);},addTracks: function(tracks){tracks.each(function(track){track = $H(track);var data = track.values().first();this.tracks.push($H({ids: track.keys().first(),effect: Effect.Morph,options: { style: data }}));}.bind(this));return this;},play: function(){return new Effect.Parallel(this.tracks.map(function(track){var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');var elements = [$(ids) || $$(ids)].flatten();return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });}).flatten(),this.options);}});Element.CSS_PROPERTIES = $w('backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +'fontSize fontWeight height left letterSpacing lineHeight ' +'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +'right textIndent top width wordSpacing zIndex');Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;String.__parseStyleElement = document.createElement('div');String.prototype.parseStyle = function(){var style, styleRules = $H();if (Prototype.Browser.WebKit)style = new Element('div',{style:this}).style;else {String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';style = String.__parseStyleElement.childNodes[0].style;}Element.CSS_PROPERTIES.each(function(property){if (style[property]) styleRules.set(property, style[property]);});if (Prototype.Browser.IE && this.include('opacity'))styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);return styleRules;};if (document.defaultView && document.defaultView.getComputedStyle) {Element.getStyles = function(element) {var css = document.defaultView.getComputedStyle($(element), null);return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {styles[property] = css[property];return styles;});};} else {Element.getStyles = function(element) {element = $(element);var css = element.currentStyle, styles;styles = Element.CSS_PROPERTIES.inject({ }, function(hash, property) {hash.set(property, css[property]);return hash;});if (!styles.opacity) styles.set('opacity', element.getOpacity());return styles;};};Effect.Methods = {morph: function(element, style) {element = $(element);new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));return element;},visualEffect: function(element, effect, options) {element = $(element)var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);new Effect[klass](element, options);return element;},highlight: function(element, options) {element = $(element);new Effect.Highlight(element, options);return element;}};$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+'pulsate shake puff squish switchOff dropOut').each(function(effect) {Effect.Methods[effect] = function(element, options){element = $(element);Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);return element;}});$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(function(f) { Effect.Methods[f] = Element[f]; });Element.addMethods(Effect.Methods);var Builder = {NODEMAP: {AREA: 'map',CAPTION: 'table',COL: 'table',COLGROUP: 'table',LEGEND: 'fieldset',OPTGROUP: 'select',OPTION: 'select',PARAM: 'object',TBODY: 'table',TD: 'table',TFOOT: 'table',TH: 'table',THEAD: 'table',TR: 'table'},node: function(elementName) {elementName = elementName.toUpperCase();var parentTag = this.NODEMAP[elementName] || 'div';var parentElement = document.createElement(parentTag);try {parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";} catch(e) {}var element = parentElement.firstChild || null;if(element && (element.tagName.toUpperCase() != elementName))element = element.getElementsByTagName(elementName)[0];if(!element) element = document.createElement(elementName);if(!element) return;if(arguments[1])if(this._isStringOrNumber(arguments[1]) ||(arguments[1] instanceof Array) ||arguments[1].tagName) {this._children(element, arguments[1]);} else {var attrs = this._attributes(arguments[1]);if(attrs.length) {try {parentElement.innerHTML = "<" +elementName + " " +attrs + "></" + elementName + ">";} catch(e) {}element = parentElement.firstChild || null;if(!element) {element = document.createElement(elementName);for(attr in arguments[1])element[attr == 'class' ? 'className' : attr] = arguments[1][attr];}if(element.tagName.toUpperCase() != elementName)element = parentElement.getElementsByTagName(elementName)[0];}}if(arguments[2])this._children(element, arguments[2]);return element;},_text: function(text) {return document.createTextNode(text);},ATTR_MAP: {'className': 'class','htmlFor': 'for'},_attributes: function(attributes) {var attrs = [];for(attribute in attributes)attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +'="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');return attrs.join(" ");},_children: function(element, children) {if(children.tagName) {element.appendChild(children);return;}if(typeof children=='object') {children.flatten().each( function(e) {if(typeof e=='object')element.appendChild(e)elseif(Builder._isStringOrNumber(e))element.appendChild(Builder._text(e));});} elseif(Builder._isStringOrNumber(children))element.appendChild(Builder._text(children));},_isStringOrNumber: function(param) {return(typeof param=='string' || typeof param=='number');},build: function(html) {var element = this.node('div');$(element).update(html.strip());return element.down();},dump: function(scope) {if(typeof scope != 'object' && typeof scope != 'function') scope = window;var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);tags.each( function(tag){scope[tag] = function() {return Builder.node.apply(Builder, [tag].concat($A(arguments)));}});}}if(typeof Effect == 'undefined')throw("controls.js requires including script.aculo.us' effects.js library");var Autocompleter = { }Autocompleter.Base = Class.create({baseInitialize: function(element, update, options) {element = $(element)this.element = element;this.update = $(update);this.hasFocus = false;this.changed = false;this.active = false;this.index = 0;this.entryCount = 0;this.oldElementValue = this.element.value;if(this.setOptions)this.setOptions(options);elsethis.options = options || { };this.options.paramName = this.options.paramName || this.element.name;this.options.tokens = this.options.tokens || [];this.options.frequency = this.options.frequency || 0.4;this.options.minChars = this.options.minChars || 1;this.options.onShow = this.options.onShow ||function(element, update){if(!update.style.position || update.style.position=='absolute') {update.style.position = 'absolute';Position.clone(element, update, {setHeight: false,offsetTop: element.offsetHeight});}Effect.Appear(update,{duration:0.15});};this.options.onHide = this.options.onHide ||function(element, update){ new Effect.Fade(update,{duration:0.15}) };if(typeof(this.options.tokens) == 'string')this.options.tokens = new Array(this.options.tokens);if (!this.options.tokens.include('\n'))this.options.tokens.push('\n');this.observer = null;this.element.setAttribute('autocomplete','off');Element.hide(this.update);Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));Event.observe(this.element, 'keypress', this.onKeyPress.bindAsEventListener(this));},show: function() {if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);if(!this.iefix &&(Prototype.Browser.IE) &&(Element.getStyle(this.update, 'position')=='absolute')) {new Insertion.After(this.update,'<iframe id="' + this.update.id + '_iefix" '+'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');this.iefix = $(this.update.id+'_iefix');}if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);},fixIEOverlapping: function() {Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});this.iefix.style.zIndex = 1;this.update.style.zIndex = 2;Element.show(this.iefix);},hide: function() {this.stopIndicator();if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);if(this.iefix) Element.hide(this.iefix);},startIndicator: function() {if(this.options.indicator) Element.show(this.options.indicator);},stopIndicator: function() {if(this.options.indicator) Element.hide(this.options.indicator);},onKeyPress: function(event) {if(this.active)switch(event.keyCode) {case Event.KEY_TAB:case Event.KEY_RETURN:this.selectEntry();Event.stop(event);case Event.KEY_ESC:this.hide();this.active = false;Event.stop(event);return;case Event.KEY_LEFT:case Event.KEY_RIGHT:return;case Event.KEY_UP:this.markPrevious();this.render();if(Prototype.Browser.WebKit) Event.stop(event);return;case Event.KEY_DOWN:this.markNext();this.render();if(Prototype.Browser.WebKit) Event.stop(event);return;}elseif(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||(Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;this.changed = true;this.hasFocus = true;if(this.observer) clearTimeout(this.observer);this.observer =setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);},activate: function() {this.changed = false;this.hasFocus = true;this.getUpdatedChoices();},onHover: function(event) {var element = Event.findElement(event, 'LI');if(this.index != element.autocompleteIndex){this.index = element.autocompleteIndex;this.render();}Event.stop(event);},onClick: function(event) {var element = Event.findElement(event, 'LI');this.index = element.autocompleteIndex;this.selectEntry();this.hide();},onBlur: function(event) {setTimeout(this.hide.bind(this), 250);this.hasFocus = false;this.active = false;},render: function() {if(this.entryCount > 0) {for (var i = 0; i < this.entryCount; i++)this.index==i ?Element.addClassName(this.getEntry(i),"selected") :Element.removeClassName(this.getEntry(i),"selected");if(this.hasFocus) {this.show();this.active = true;}} else {this.active = false;this.hide();}},markPrevious: function() {if(this.index > 0) this.index--else this.index = this.entryCount-1;this.getEntry(this.index).scrollIntoView(true);},markNext: function() {if(this.index < this.entryCount-1) this.index++else this.index = 0;this.getEntry(this.index).scrollIntoView(false);},getEntry: function(index) {return this.update.firstChild.childNodes[index];},getCurrentEntry: function() {return this.getEntry(this.index);},selectEntry: function() {this.active = false;this.updateElement(this.getCurrentEntry());},updateElement: function(selectedElement) {if (this.options.updateElement) {this.options.updateElement(selectedElement);return;}var value = '';if (this.options.select) {var nodes = $(selectedElement).select('.' + this.options.select) || [];if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);} elsevalue = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');var bounds = this.getTokenBounds();if (bounds[0] != -1) {var newValue = this.element.value.substr(0, bounds[0]);var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);if (whitespace)newValue += whitespace[0];this.element.value = newValue + value + this.element.value.substr(bounds[1]);} else {this.element.value = value;}this.oldElementValue = this.element.value;this.element.focus();if (this.options.afterUpdateElement)this.options.afterUpdateElement(this.element, selectedElement);},updateChoices: function(choices) {if(!this.changed && this.hasFocus) {this.update.innerHTML = choices;Element.cleanWhitespace(this.update);Element.cleanWhitespace(this.update.down());if(this.update.firstChild && this.update.down().childNodes) {this.entryCount =this.update.down().childNodes.length;for (var i = 0; i < this.entryCount; i++) {var entry = this.getEntry(i);entry.autocompleteIndex = i;this.addObservers(entry);}} else {this.entryCount = 0;}this.stopIndicator();this.index = 0;if(this.entryCount==1 && this.options.autoSelect) {this.selectEntry();this.hide();} else {this.render();}}},addObservers: function(element) {Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));Event.observe(element, "click", this.onClick.bindAsEventListener(this));},onObserverEvent: function() {this.changed = false;this.tokenBounds = null;if(this.getToken().length>=this.options.minChars) {this.getUpdatedChoices();} else {this.active = false;this.hide();}this.oldElementValue = this.element.value;},getToken: function() {var bounds = this.getTokenBounds();return this.element.value.substring(bounds[0], bounds[1]).strip();},getTokenBounds: function() {if (null != this.tokenBounds) return this.tokenBounds;var value = this.element.value;if (value.strip().empty()) return [-1, 0];var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);var offset = (diff == this.oldElementValue.length ? 1 : 0);var prevTokenPos = -1, nextTokenPos = value.length;var tp;for (var index = 0, l = this.options.tokens.length; index < l; ++index) {tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);if (tp > prevTokenPos) prevTokenPos = tp;tp = value.indexOf(this.options.tokens[index], diff + offset);if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;}return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);}});Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {var boundary = Math.min(newS.length, oldS.length);for (var index = 0; index < boundary; ++index)if (newS[index] != oldS[index])return index;return boundary;};Ajax.Autocompleter = Class.create(Autocompleter.Base, {initialize: function(element, update, url, options) {this.baseInitialize(element, update, options);this.options.asynchronous = true;this.options.onComplete = this.onComplete.bind(this);this.options.defaultParams = this.options.parameters || null;this.url = url;},getUpdatedChoices: function() {this.startIndicator();var entry = encodeURIComponent(this.options.paramName) + '=' +encodeURIComponent(this.getToken());this.options.parameters = this.options.callback ?this.options.callback(this.element, entry) : entry;if(this.options.defaultParams)this.options.parameters += '&' + this.options.defaultParams;new Ajax.Request(this.url, this.options);},onComplete: function(request) {this.updateChoices(request.responseText);}});Autocompleter.Local = Class.create(Autocompleter.Base, {initialize: function(element, update, array, options) {this.baseInitialize(element, update, options);this.options.array = array;},getUpdatedChoices: function() {this.updateChoices(this.options.selector(this));},setOptions: function(options) {this.options = Object.extend({choices: 10,partialSearch: true,partialChars: 2,ignoreCase: true,fullSearch: false,selector: function(instance) {var ret = [];var partial = [];var entry = instance.getToken();var count = 0;for (var i = 0; i < instance.options.array.length &&ret.length < instance.options.choices ; i++) {var elem = instance.options.array[i];var foundPos = instance.options.ignoreCase ?elem.toLowerCase().indexOf(entry.toLowerCase()) :elem.indexOf(entry);while (foundPos != -1) {if (foundPos == 0 && elem.length != entry.length) {ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +elem.substr(entry.length) + "</li>");break;} else if (entry.length >= instance.options.partialChars &&instance.options.partialSearch && foundPos != -1) {if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(foundPos + entry.length) + "</li>");break;}}foundPos = instance.options.ignoreCase ?elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :elem.indexOf(entry, foundPos + 1);}}if (partial.length)ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))return "<ul>" + ret.join('') + "</ul>";}}, options || { });}});Field.scrollFreeActivate = function(field) {setTimeout(function() {Field.activate(field);}, 1);}Ajax.InPlaceEditor = Class.create({initialize: function(element, url, options) {this.url = url;this.element = element = $(element);this.prepareOptions();this._controls = { };arguments.callee.dealWithDeprecatedOptions(options);Object.extend(this.options, options || { });if (!this.options.formId && this.element.id) {this.options.formId = this.element.id + '-inplaceeditor';if ($(this.options.formId))this.options.formId = '';}if (this.options.externalControl)this.options.externalControl = $(this.options.externalControl);if (!this.options.externalControl)this.options.externalControlOnly = false;this._originalBackground = this.element.getStyle('background-color') || 'transparent';this.element.title = this.options.clickToEditText;this._boundCancelHandler = this.handleFormCancellation.bind(this);this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);this._boundFailureHandler = this.handleAJAXFailure.bind(this);this._boundSubmitHandler = this.handleFormSubmission.bind(this);this._boundWrapperHandler = this.wrapUp.bind(this);this.registerListeners();},checkForEscapeOrReturn: function(e) {if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;if (Event.KEY_ESC == e.keyCode)this.handleFormCancellation(e);else if (Event.KEY_RETURN == e.keyCode)this.handleFormSubmission(e);},createControl: function(mode, handler, extraClasses) {var control = this.options[mode + 'Control'];var text = this.options[mode + 'Text'];if ('button' == control) {var btn = document.createElement('input');btn.type = 'submit';btn.value = text;btn.className = 'editor_' + mode + '_button';if ('cancel' == mode)btn.onclick = this._boundCancelHandler;this._form.appendChild(btn);this._controls[mode] = btn;} else if ('link' == control) {var link = document.createElement('a');link.href = '#';link.appendChild(document.createTextNode(text));link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;link.className = 'editor_' + mode + '_link';if (extraClasses)link.className += ' ' + extraClasses;this._form.appendChild(link);this._controls[mode] = link;}},createEditField: function() {var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());var fld;if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {fld = document.createElement('input');fld.type = 'text';var size = this.options.size || this.options.cols || 0;if (0 < size) fld.size = size;} else {fld = document.createElement('textarea');fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);fld.cols = this.options.cols || 40;}fld.name = this.options.paramName;fld.value = text;fld.className = 'editor_field';if (this.options.submitOnBlur)fld.onblur = this._boundSubmitHandler;this._controls.editor = fld;if (this.options.loadTextURL)this.loadExternalText();this._form.appendChild(this._controls.editor);},createForm: function() {var ipe = this;function addText(mode, condition) {var text = ipe.options['text' + mode + 'Controls'];if (!text || condition === false) return;ipe._form.appendChild(document.createTextNode(text));};this._form = $(document.createElement('form'));this._form.id = this.options.formId;this._form.addClassName(this.options.formClassName);this._form.onsubmit = this._boundSubmitHandler;this.createEditField();if ('textarea' == this._controls.editor.tagName.toLowerCase())this._form.appendChild(document.createElement('br'));if (this.options.onFormCustomization)this.options.onFormCustomization(this, this._form);addText('Before', this.options.okControl || this.options.cancelControl);this.createControl('ok', this._boundSubmitHandler);addText('Between', this.options.okControl && this.options.cancelControl);this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');addText('After', this.options.okControl || this.options.cancelControl);},destroy: function() {if (this._oldInnerHTML)this.element.innerHTML = this._oldInnerHTML;this.leaveEditMode();this.unregisterListeners();},enterEditMode: function(e) {if (this._saving || this._editing) return;this._editing = true;this.triggerCallback('onEnterEditMode');if (this.options.externalControl)this.options.externalControl.hide();this.element.hide();this.createForm();this.element.parentNode.insertBefore(this._form, this.element);if (!this.options.loadTextURL)this.postProcessEditField();if (e) Event.stop(e);},enterHover: function(e) {if (this.options.hoverClassName)this.element.addClassName(this.options.hoverClassName);if (this._saving) return;this.triggerCallback('onEnterHover');},getText: function() {return this.element.innerHTML;},handleAJAXFailure: function(transport) {this.triggerCallback('onFailure', transport);if (this._oldInnerHTML) {this.element.innerHTML = this._oldInnerHTML;this._oldInnerHTML = null;}},handleFormCancellation: function(e) {this.wrapUp();if (e) Event.stop(e);},handleFormSubmission: function(e) {var form = this._form;var value = $F(this._controls.editor);this.prepareSubmission();var params = this.options.callback(form, value) || '';if (Object.isString(params))params = params.toQueryParams();params.editorId = this.element.id;if (this.options.htmlResponse) {var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);Object.extend(options, {parameters: params,onComplete: this._boundWrapperHandler,onFailure: this._boundFailureHandler});new Ajax.Updater({ success: this.element }, this.url, options);} else {var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);Object.extend(options, {parameters: params,onComplete: this._boundWrapperHandler,onFailure: this._boundFailureHandler});new Ajax.Request(this.url, options);}if (e) Event.stop(e);},leaveEditMode: function() {this.element.removeClassName(this.options.savingClassName);this.removeForm();this.leaveHover();this.element.style.backgroundColor = this._originalBackground;this.element.show();if (this.options.externalControl)this.options.externalControl.show();this._saving = false;this._editing = false;this._oldInnerHTML = null;this.triggerCallback('onLeaveEditMode');},leaveHover: function(e) {if (this.options.hoverClassName)this.element.removeClassName(this.options.hoverClassName);if (this._saving) return;this.triggerCallback('onLeaveHover');},loadExternalText: function() {this._form.addClassName(this.options.loadingClassName);this._controls.editor.disabled = true;var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);Object.extend(options, {parameters: 'editorId=' + encodeURIComponent(this.element.id),onComplete: Prototype.emptyFunction,onSuccess: function(transport) {this._form.removeClassName(this.options.loadingClassName);var text = transport.responseText;if (this.options.stripLoadedTextTags)text = text.stripTags();this._controls.editor.value = text;this._controls.editor.disabled = false;this.postProcessEditField();}.bind(this),onFailure: this._boundFailureHandler});new Ajax.Request(this.options.loadTextURL, options);},postProcessEditField: function() {var fpc = this.options.fieldPostCreation;if (fpc)$(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();},prepareOptions: function() {this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);[this._extraDefaultOptions].flatten().compact().each(function(defs) {Object.extend(this.options, defs);}.bind(this));},prepareSubmission: function() {this._saving = true;this.removeForm();this.leaveHover();this.showSaving();},registerListeners: function() {this._listeners = { };var listener;$H(Ajax.InPlaceEditor.Listeners).each(function(pair) {listener = this[pair.value].bind(this);this._listeners[pair.key] = listener;if (!this.options.externalControlOnly)this.element.observe(pair.key, listener);if (this.options.externalControl)this.options.externalControl.observe(pair.key, listener);}.bind(this));},removeForm: function() {if (!this._form) return;this._form.remove();this._form = null;this._controls = { };},showSaving: function() {this._oldInnerHTML = this.element.innerHTML;this.element.innerHTML = this.options.savingText;this.element.addClassName(this.options.savingClassName);this.element.style.backgroundColor = this._originalBackground;this.element.show();},triggerCallback: function(cbName, arg) {if ('function' == typeof this.options[cbName]) {this.options[cbName](this, arg);}},unregisterListeners: function() {$H(this._listeners).each(function(pair) {if (!this.options.externalControlOnly)this.element.stopObserving(pair.key, pair.value);if (this.options.externalControl)this.options.externalControl.stopObserving(pair.key, pair.value);}.bind(this));},wrapUp: function(transport) {this.leaveEditMode();this._boundComplete(transport, this.element);}});Object.extend(Ajax.InPlaceEditor.prototype, {dispose: Ajax.InPlaceEditor.prototype.destroy});Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {initialize: function($super, element, url, options) {this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;$super(element, url, options);},createEditField: function() {var list = document.createElement('select');list.name = this.options.paramName;list.size = 1;this._controls.editor = list;this._collection = this.options.collection || [];if (this.options.loadCollectionURL)this.loadCollection();elsethis.checkForExternalText();this._form.appendChild(this._controls.editor);},loadCollection: function() {this._form.addClassName(this.options.loadingClassName);this.showLoadingText(this.options.loadingCollectionText);var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);Object.extend(options, {parameters: 'editorId=' + encodeURIComponent(this.element.id),onComplete: Prototype.emptyFunction,onSuccess: function(transport) {var js = transport.responseText.strip();if (!/^\[.*\]$/.test(js))throw 'Server returned an invalid collection representation.';this._collection = eval(js);this.checkForExternalText();}.bind(this),onFailure: this.onFailure});new Ajax.Request(this.options.loadCollectionURL, options);},showLoadingText: function(text) {this._controls.editor.disabled = true;var tempOption = this._controls.editor.firstChild;if (!tempOption) {tempOption = document.createElement('option');tempOption.value = '';this._controls.editor.appendChild(tempOption);tempOption.selected = true;}tempOption.update((text || '').stripScripts().stripTags());},checkForExternalText: function() {this._text = this.getText();if (this.options.loadTextURL)this.loadExternalText();elsethis.buildOptionList();},loadExternalText: function() {this.showLoadingText(this.options.loadingText);var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);Object.extend(options, {parameters: 'editorId=' + encodeURIComponent(this.element.id),onComplete: Prototype.emptyFunction,onSuccess: function(transport) {this._text = transport.responseText.strip();this.buildOptionList();}.bind(this),onFailure: this.onFailure});new Ajax.Request(this.options.loadTextURL, options);},buildOptionList: function() {this._form.removeClassName(this.options.loadingClassName);this._collection = this._collection.map(function(entry) {return 2 === entry.length ? entry : [entry, entry].flatten();});var marker = ('value' in this.options) ? this.options.value : this._text;var textFound = this._collection.any(function(entry) {return entry[0] == marker;}.bind(this));this._controls.editor.update('');var option;this._collection.each(function(entry, index) {option = document.createElement('option');option.value = entry[0];option.selected = textFound ? entry[0] == marker : 0 == index;option.appendChild(document.createTextNode(entry[1]));this._controls.editor.appendChild(option);}.bind(this));this._controls.editor.disabled = false;Field.scrollFreeActivate(this._controls.editor);}});Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {if (!options) return;function fallback(name, expr) {if (name in options || expr === undefined) return;options[name] = expr;};fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :options.cancelLink == options.cancelButton == false ? false : undefined)));fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :options.okLink == options.okButton == false ? false : undefined)));fallback('highlightColor', options.highlightcolor);fallback('highlightEndColor', options.highlightendcolor);};Object.extend(Ajax.InPlaceEditor, {DefaultOptions: {ajaxOptions: { },autoRows: 3,cancelControl: 'link',cancelText: 'cancel',clickToEditText: 'Click to edit',externalControl: null,externalControlOnly: false,fieldPostCreation: 'activate',formClassName: 'inplaceeditor-form',formId: null,highlightColor: '#ffff99',highlightEndColor: '#ffffff',hoverClassName: '',htmlResponse: true,loadingClassName: 'inplaceeditor-loading',loadingText: 'Loading...',okControl: 'button',okText: 'ok',paramName: 'value',rows: 1,savingClassName: 'inplaceeditor-saving',savingText: 'Saving...',size: 0,stripLoadedTextTags: false,submitOnBlur: false,textAfterControls: '',textBeforeControls: '',textBetweenControls: ''},DefaultCallbacks: {callback: function(form) {return Form.serialize(form);},onComplete: function(transport, element) {new Effect.Highlight(element, {startcolor: this.options.highlightColor, keepBackgroundImage: true });},onEnterEditMode: null,onEnterHover: function(ipe) {ipe.element.style.backgroundColor = ipe.options.highlightColor;if (ipe._effect)ipe._effect.cancel();},onFailure: function(transport, ipe) {alert('Error communication with the server: ' + transport.responseText.stripTags());},onFormCustomization: null,onLeaveEditMode: null,onLeaveHover: function(ipe) {ipe._effect = new Effect.Highlight(ipe.element, {startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,restorecolor: ipe._originalBackground, keepBackgroundImage: true});}},Listeners: {click: 'enterEditMode',keydown: 'checkForEscapeOrReturn',mouseover: 'enterHover',mouseout: 'leaveHover'}});Ajax.InPlaceCollectionEditor.DefaultOptions = {loadingCollectionText: 'Loading options...'};Form.Element.DelayedObserver = Class.create({initialize: function(element, delay, callback) {this.delay = delay || 0.5;this.element = $(element);this.callback = callback;this.timer = null;this.lastValue = $F(this.element);Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));},delayedListener: function(event) {if(this.lastValue == $F(this.element)) return;if(this.timer) clearTimeout(this.timer);this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);this.lastValue = $F(this.element);},onTimerEvent: function() {this.timer = null;this.callback(this.element, $F(this.element));}});var lastServerMessage= 0;var debug=false;var generalID = 1;var logged = false;var pageLoaded = false;var ignoreError = true;var dwrTimeout = 30000;var lastShortMessage = new Date();var updateLeftTextAreas=[];var contextPath;var enableSounds = true;JQ(document).ready(function (){loadDWR();pulseNew();window.setInterval("updateAllLeftTextAreas()",500);});function loadDWR(){try{dwr.engine.setWarningHandler(errorDWRDefault);dwr.engine.setErrorHandler(errorDWRDefault);dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);}catch(e){}}function pulseNew(){JQ(".new").pulse({opacity: [0,1]}, {times: 10});}function expose(selector,title,msg,options){JQ(".exposeSelect").removeClass("exposeSelect");if(JQ("#tipExpo").exists()){JQ("#tipExpo").remove();}if(!selector){JQ(document).mask({ closeOnEsc: false,closeOnClick: false,onLoad: function() {log("expose onload");JQ("body").append("<div id='tipExpo'>" +"<H3 id='tipExpoTitle'>" + title + "</H3>" +"<div id='tipExpoContent'>" + msg + "</div>" +"</div>");if(options && options.onLoad){options.onLoad();}if(options && options.right){log("expose right on");JQ("#tipExpo").css("right","30px");JQ("#tipExpo").css("left","auto");}},color: "#FE6602",maskId:"exposeMask" });}else{JQ(selector).expose({closeOnEsc: false,closeOnClick: false,onLoad: function() {JQ("body").append("<div id='tipExpo'>" +"<H3 id='tipExpoTitle'>" + title + "</H3>" +"<div id='tipExpoContent'>" + msg + "</div>" +"</div>");if(options && options.right){log("expose right on");JQ("#tipExpo").css("right","30px");JQ("#tipExpo").css("left","auto");}},onClose: function() {JQ("#tipExpo").remove();},color: "#FE6602",maskId:"exposeMask"});JQ(selector).css("background-color","#ffffff");JQ(selector).addClass("exposeSelect");}}function setContentExpose(msg){JQ("#tipExpoContent").html(msg);}function setTitleExpose(msg){JQ("#tipExpoTitle").html(msg);}function insertExitExpose(){if(JQ(".exitTuto").exists()){return;}JQ("#exposeMask").append("<IMG id='exitTutoButton' class='action exitTuto' onclick='closeTutorial();' src='/imgs/button_cancel.png' title='" + getTextD(115,"Sair")+ "'/>");}function nextTutorialStep(title,content,callback){JQ("#tipExpo").hide().delay(300).fadeIn();setTitleExpose(title);setContentExpose(content + "<INPUT id='tipExpoNext' type='button' value='" + getTextD(476,"Continuar") + "'>");JQ("#tipExpoNext").die("click");JQ("#tipExpoNext").live("click",callback);}function closeTutorial(){log("closeTutorial 6880");JQ("#tipExpo").remove();log("closeTutorial 6890");JQ.mask.close();log("closeTutorial 6900");}function dummy(){}function log(msg){try{if(debug && console && console.log){console.log(msg);}}catch(e){}}function error(msg){if(console && console.error){console.error(msg);}}function onReady(fun){JQ(document).ready(fun);}function setMinHeight(selector,height){if(JQ(selector).height()<height){JQ(selector).css("height",height + "px");}else{JQ(selector).css("height","auto");}}function retAddXP(account){level.innerHTML = 'Level ' + account.level +'<span id="completlevel"  title="' + account.exp + '/' + account.expToNextLevel + '" ' +' style="padding-right:' + account.expCompleted + 'px">' +account.expCompleted + '%</span><span id="misslevel"   title="' + account.exp + '/' + account.expToNextLevel + '" ' +' style="padding-right:' + (100 - parseInt(account.expCompleted)) + 'px"></span>';}function addXP(xp,message){message = getText(message);showUpDownMessage(getTextD(40,'Você ganhou %1 pontos de experiência <BR/>por %2!',new Array(xp,message)));if(JQ("level").exists()){User.getActiveUser({callback:retAddXP,timeout:dwrTimeout,errorHandler:errorDWRDefault});}}function showUpDownMessage(text){JQ.notify(text,{historyLinkText:getTextD(1084,"Exibir Notificações"),hideHistoryLinkText:getTextD(1085,"Ocultar"),group:"notify-right",closeText :getTextD(30,"Fechar"),removeText:getTextD(1086,"Excluir")});}function closeUpDownMessage(){JQ('#updownMessage').fadeOut();}function closeMessage(){hideElement('msgBox');}function selectFirstMenu(text){selectMenu(text,'menuTop');}function selectCmpMenu(text){selectMenu(text,'menuCmpTop');}function selectSheetMenu(text){selectMenu(text,'menuSheet');}function selectMenuTemplate(text){selectMenu(text,'menuTemplate');}function selectPlayerMenu(text){selectMenu(text,'playerMenu');}function selectMenu(text,idbase){var menu = null;var menuLeft =null;var menuFind = false;var cont =0;while(cont++ < 15){menu = $(idbase+cont);if(menu != null){menu.className = 'hmenu';}}for(cont =0;cont<15;cont++){menu = $(idbase+cont);if(!menuFind && menu != null && menu.innerHTML.indexOf(text)>0){menu.className = 'hmenuSelected';menuFind =true;}else if(menuFind && menu != null){menu.className = 'hmenu noLeftMargin';if(menuLeft!=null){menuLeft.className = 'hmenu noRightMargin';}return;}else if(!menuFind && menu != null && menu.innerHTML.indexOf(text)==-1){menuLeft = menu;}}}function cbLogin(data){log(data);showShortMessage('');if(data){log("cbLogin3050");document.location.href = data;}else{log("cbLogin3100");location.reload();}}function errorDWRDefault(msg){if(msg.toLowerCase().indexOf("timeout")>-1){showShortMessage(getTextD(1068,"Servidor indisponível"));return;}else if(msg.toLowerCase().indexOf("no data received from server")>-1){showShortMessage(getTextD(977,"Carregando..."));return;}showShortMessage("");showMessage(msg);}function login(){showShortMessage(getTextD(120,'Aguarde'));User.login(JQ('#txtLogin').val(),true,JQ('#txtPassword').val(),{callback: cbLogin,timeout:dwrTimeout,errorHandler:errorDWRDefault});}function quitApplication(){showModalMessage(getTextD(42,'Mas já...'));showShortMessage(getTextD(44,'Redirecionando...'));redirect('/facadepost/action/4',3000);}function expiredSession(){showMessage(getTextD(43,'Sessão expirada'));showShortMessage(getTextD(44,'Redirecionando...'));redirect('/',3000);}function invalidTemplate(){showMessage(getTextD(45,'Modelo incorreto!'));showShortMessage(getTextD(44,'Redirecionando...'));redirect('/user/template',3000);}function messageVoid(data){lastServerMessage = new Date().getTime();}function validateLogin(login){var proibitedChars = "\n =-!@#$%¨&*()_+?:><,.;/\\|\"\'";var cont=0;if(login.length < 3 || login.length > 20) {return 72;}for (cont = 0 ; cont < proibitedChars.length ; cont++){if(login.indexOf(proibitedChars.charAt(cont))!=-1){return 73;}}return -1;}function hideElementSub(elementID){JQ("#"+elementID).hide();}function hideElement(elementID){setTimeout("hideElementSub('" + elementID + "')",1);}function showElement(id){JQ("#"+id).delay(1000).fadeIn();}function sendError(text){JQ("#divMessage").html(text);JQ("#divMessage").fadeIn();JQ("#divMessage").effect("pulsate", { times:3 }, 500);JQ("#divMessage").delay(6000).fadeOut();}function isEmail(email){er = /^[a-zA-Z0-9][a-zA-Z0-9\._-]+@([a-zA-Z0-9\._-]+\.)[a-zA-Z-0-9]{2}/;if(er.exec(email)){return true;} else {return false;}}function isInteger(pVal){var valN = pVal;if(pVal.indexOf("-")!=-1){valN = pVal.substring(1);}var reTipo = /^\d+$/;return reTipo.test(valN);}function isDate(data,ano,mes,dia, opcional){if(dia+mes+ano != ""){if (!isInteger(mes) || mes > 12 || mes < 1){if(isInteger(mes) && opcional==1 && mes==0){ano=0;dia=0;return true;}showMessage(getTextD(46,'Formato do mês inválido.'));data.focus();return false}mes=parseInt(mes);if (!isInteger(dia) || dia > 31 || dia < 1){if(isInteger(dia) && opcional==1 && dia==0){ano=0;mes=0;return true;}showMessage(getTextD(47,'Formato do dia não é valido.'));data.focus();return false}dia=parseInt(dia);if (mes == 4 || mes == 6 || mes == 9 || mes == 11){if (dia == 31){showMessage(getTextD(48,'O mês informado nao possui 31 dias.'));data.focus();return false}}if (mes == 2){bissexto = ano % 4;if (bissexto == 0){if (dia > 29){showMessage(getTextD(49,'O mês informado possui somente 29 dias.'));data.focus();return false}}else{if (dia > 28){showMessage(getTextD(50,'O mês informado possui somente 28 dias.')); data.focus();return false}}}if (!isInteger(ano)){showMessage(getTextD(51,'Formato do ano inválido.'));data.focus();return false}else if(ano==0 && opcional==1){dia=0;mes=0;return true;}}return true;}function refresh(){location.href = location.href;}function relRedirect(url){var oldHref = null;if(url.length>0 && url.substring(0,1)=="/"){url = url.substring(1);}if(window.location.top){oldHref = window.top.location.href ;}else{oldHref = window.location.href ;}var parts = oldHref.split('/');var ret = "";var max =3;if(contextPath){max=4;}JQ(parts).each(function(index,element){if(index<max){ret += element+"/";}});ret+=url;if(window.location.top){window.top.location.href = ret;}else{window.location.href = ret;}}function redirectNow(url){location.href = url;}function redirect(url,timems){setTimeout("redirectNow('" + url + "')",timems);}function centeralize(elementID,diffW,diffH){var div = $(elementID);var nw = (screen.width /2 ) - diffW;var nh = (screen.height /2) - diffH;div.style.left = nw+ "px";div.style.top = nh + "px";}function forceNumberInput(element){try{if(!isInteger(element.value)){element.value = '0';}return;}catch(e){}try{if(!isInteger(element.innerHTML)){element.innerHTML = '0';}}catch(e){}}function isAlphanumeric(value){var accept = "1234567890abcdefghijklmnopqrstuvxyzwABCDEFGHIJKLMNOPQRSTUVXYZW";var cont = 0 ;for(cont =0; cont < value.length; cont++){if(accept.indexOf(value.charAt(cont))==-1){return false;}}return true;}function getFlashMovie(name){if(navigator.appName.indexOf("Microsoft") != -1) {return window[name];} else {return document[name];}}function replaceAll(string, token, newtoken){return string.split(token).join(newtoken);}function showShortMessage(data){if(!data){return;}else{if(JQ("#shortMessage").exists()){JQ("#shortMessage p").html(data);lastShortMessage = new Date();return;}JQ('body').prepend("<div id='shortMessage' ><P id='shortMessage-content'>" + data + "</P></div>");lastShortMessage = new Date();clearShortMessage();}}function clearShortMessage(){log('clearShortMessage');var now = new Date();var delta = now.getTime() - lastShortMessage.getTime();if(delta > 5000){log('clear');if(JQ("#shortMessage").exists()){JQ("#shortMessage").remove();}}else{setTimeout("clearShortMessage()", 6000);}}Cookie = {isSupported: function(){return !!navigator.cookieEnabled;},exists: function(name){return document.cookie.indexOf(name + "=") + 1;},write: function(name, value, expires, path, domain, secure) {expires instanceof Date ? expires = expires.toGMTString(): typeof(expires) == 'number' && (expires = (new Date(+(new Date) + expires * 1e3)).toGMTString());var r = [name + "=" + escape(value)], s, i;for(i in s = {expires: expires, path: path, domain: domain})s[i] && r.push(i + "=" + s[i]);return secure && r.push("secure"), document.cookie = r.join(";"), true;},read: function(name){var c = document.cookie, s = this.exists(name), e;return s ? unescape(c.substring(s += name.length, (c.indexOf(";", s) + 1 || c.length + 1) - 1)) : "";},remove: function(name, path, domain){return this.exists(name) && this.write(name, "", new Date(0), path, domain);}};function valueOrEmpty(value){if(value==undefined){return "";}else{return value;}}function valueOrZero(value){if(isNaN(value)){return 0;}else{return parseInt(value);}}function showModalMessage(data,title){JQ("#modal-evon").html(data);return JQ("#modal-evon").modal2(title);}function showConfirm(options){JQ("#modal-evon").html(options.message);if(!options.okLabel){options.okLabel = "ok";}if(!options.cancelLabel){options.cancelLabel = "cancel";}var onOk = function(){JQ("#modal-evon").modal2({action:"close"});JQ("#confirm-ok").remove();JQ("#confirm-cancel").remove();if(options.onOk){options.onOk();}};var onCancel = function(){JQ("#modal-evon").modal2({action:"close"});JQ("#confirm-ok").remove();JQ("#confirm-cancel").remove();if(options.onCancel){options.onCancel();}};JQ("#modal-evon").append("<div id='confirm-actions'>" +"<input type='button' id='confirm-ok' value='OK'/>" +"<input type='button' id='confirm-cancel' value='" + getTextD(684,"Cancelar") + "'/>" +"</div>");JQ("#confirm-ok").bind("click",onOk);JQ("#confirm-cancel").bind("click",onCancel);JQ("#modal-evon").modal2();return JQ("#modal-evon");}function getElement(id){return JQ("#"+id)[0];}function showMessage(msg){if(msg=="Bad Gateway"){log("DWR-Bad Gateway");return;}else if(msg=="Service Unavailable"){log("DWR-Service Unavailable");showShortMessage(getTextD(1068,"Servidor indisponível"));return;}showModalMessage(msg);}function updateLeftTextArea(selector,max){updateLeftTextAreas.push( {selector:selector, max:max});}function updateAllLeftTextAreas(){JQ(updateLeftTextAreas).each(function(index,object){var value = JQ(object.selector).val();var left = updateLeftTextAreas[0].max - value.length;object.subMethod = null;if(JQ(object.selector).css("display")=="none"){log("updateAllLeftTextAreas:9280");JQ(object.selector).cleditor()[0].updateTextArea();log("updateAllLeftTextAreas:9350");}if(left>0){log("updateAllLeftTextAreas:9390");showShortMessage('Faltam ainda ' + left + "caracteres");}else{log("updateAllLeftTextAreas:9440");showModalMessage('Você está usando muitos caracteres. Ou o texto é muito longo ou você colou de algum lugar e veio muitos caracteres escondidos de formatação. Caso seja o segundo caso, tente colar antes num bloco de ntoas.');if(JQ(object.selector).css("display")=="none"){JQ(object.selector).val(updateLeftTextAreas[0].oldval);JQ(object.selector).cleditor()[0].updateFrame();}return;}log("updateAllLeftTextAreas:9520");object.oldval = JQ(object.selector).val();log("updateAllLeftTextAreas:9540");});}function setMsgDefault(data){onDeprecated('setMsgDefault(data)','showShortMessage(data)');}function totalHideElement(elementID){onDeprecated('totalHideElement(elementID)','hideElement(elementID)');}function getElementById(elementID){onDeprecated('getElementById(elementID) ','getElement(elementID)');}function totalShowElement(elementID){onDeprecated('totalShowElement(elementID)','showElement(elementID)');}function selectTopMenu(menu,text){onDeprecated('selectTopMenu(menu,text)','selectFirstMenu(text)');}function onDeprecated(func,use){alert('Erro na pagina. Por favor envie screen desta tela para o administrador ou copie o texto a seguir [Cod: ' + func + 'Use: ' + use + ']');}function playSound(type) {if(!enableSounds){return;}log("sound:" + type);if (!JQ("#sound" + type).exists()) {var sound = "<audio id='sound" + type + "' preload='auto' autobuffer>";sound += " <source src='/sounds/" + type + ".mp3?version=5' />";sound += " <source src='/sounds/" + type + ".wav?version=5' />";sound += " <source src='/sounds/" + type + ".ogg?version=5' />";sound += " </audio>";log("sound:/sounds/" + type + ".ogg");JQ("body").append(sound);}JQ("#sound" + type).each(function(index, element) {if (element.play) {element.play();} else {showShortMessage(getTextD(1095,"Seu navegador não aceita som em HTML 5"));enableSounds = false;}});}function css_browser_selector(u){var ua = u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1;},g='gecko',w='webkit',s='safari',h=document.getElementsByTagName('html')[0],b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3')?g+' ff3':is('gecko/')?g:/opera(\s|\/)(\d+)/.test(ua)?'opera opera'+RegExp.$2:is('konqueror')?'konqueror':is('chrome')?w+' '+s+' chrome':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?'mobile':is('iphone')?'iphone':is('ipod')?'ipod':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win':is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent);var BrowserDetect = {init: function () {this.browser = this.searchString(this.dataBrowser) || "An unknown browser";this.version = this.searchVersion(navigator.userAgent)|| this.searchVersion(navigator.appVersion)|| "an unknown version";this.OS = this.searchString(this.dataOS) || "an unknown OS";},searchString: function (data) {for (var i=0;i<data.length;i++) {var dataString = data[i].string;var dataProp = data[i].prop;this.versionSearchString = data[i].versionSearch || data[i].identity;if (dataString) {if (dataString.indexOf(data[i].subString) != -1)return data[i].identity;}else if (dataProp)return data[i].identity;}},searchVersion: function (dataString) {var index = dataString.indexOf(this.versionSearchString);if (index == -1) return;return parseFloat(dataString.substring(index+this.versionSearchString.length+1));},dataBrowser: [{string: navigator.userAgent,subString: "Chrome",identity: "Chrome"},{ string: navigator.userAgent,subString: "OmniWeb",versionSearch: "OmniWeb/",identity: "OmniWeb"},{string: navigator.vendor,subString: "Apple",identity: "Safari",versionSearch: "Version"},{prop: window.opera,identity: "Opera"},{string: navigator.vendor,subString: "iCab",identity: "iCab"},{string: navigator.vendor,subString: "KDE",identity: "Konqueror"},{string: navigator.userAgent,subString: "Firefox",identity: "Firefox"},{string: navigator.vendor,subString: "Camino",identity: "Camino"},{string: navigator.userAgent,subString: "Netscape",identity: "Netscape"},{string: navigator.userAgent,subString: "MSIE",identity: "Explorer",versionSearch: "MSIE"},{string: navigator.userAgent,subString: "Gecko",identity: "Mozilla",versionSearch: "rv"},{string: navigator.userAgent,subString: "Mozilla",identity: "Netscape",versionSearch: "Mozilla"}],dataOS : [{string: navigator.platform,subString: "Win",identity: "Windows"},{string: navigator.platform,subString: "Mac",identity: "Mac"},{string: navigator.userAgent,subString: "iPhone",identity: "iPhone/iPod"},{string: navigator.platform,subString: "Linux",identity: "Linux"}]};BrowserDetect.init();function _(obj){if(obj==null){return obj;}function falseFunction (){return false;}function isArray(){if(typeof(this)=="object"){return (this.length)?true:false;}return false;}obj.isArray = isArray;String.prototype.isArray = falseFunction;Number.prototype.isArray = falseFunction;return obj;}var flagSelected = 'PT_BR';var context;function getContextByFlag(flag){flagSelected = flag;return getContext();}function getContext(){if(flagSelected == "PT_BR" && PT_BR){return PT_BR;}else if(EN_US){return EN_US;}}function getTextD(id,defaultText,args){defaultText = _(defaultText);args = _(args);if(defaultText && args && defaultText.isArray() && !args.isArray()){var argsTemp = defaultText;defaultText = args;args = argsTemp;}return getText(id,args);}function getText(id,args){var ctx = getContext();if(ctx){var ret = ctx[id-1];for(var cont =0;args != null && cont < args.length;cont++){ret = replaceAll(ret,"%" + (cont + 1),args[cont]);}return ret;}return "CONTEXT NOT LOAD";}String.prototype.trim = function(){return this.replace(/^\s*|\s*$/g,"");};String.prototype.left = function(n){if (n <= 0)return "";else if (n > this.length)return this;elsereturn this.substring(0,n);};String.prototype.right = function(n){if (n <= 0)return "";else if (n > this.length)return this;else {var iLen = this.length;return this.substring(iLen, iLen - n);}};﻿var loginContent = null;JQ(document).ready(load);function load(){prepareLoginEvents();prepareSlider();JQ("#cmdCreateAccount").bind("click", createAccount);JQ("#forgotteinPass").hide();JQ("#registerFull").hide();JQ("#cmdRegister").bind("click",function (){if(jQuery.browser.msie){JQ("#registerFull").show();}else{JQ("#registerFull").fadeIn(500);}JQ("#register").hide();JQ("#tuto").hide();JQ("#reasons").hide();JQ("#txtNameCreate").focus();});JQ("#backRegisterFull").bind("click",backRegister);JQ("#screentitle").html(screenTitles[0]);JQ("#txtLogin").focus();JQ("#txtEmailCreate").bind({keypress:function(e){var keynum = 0 ;if(window.event){keynum = e.keyCode;}else if(e.which){keynum = e.which;}if(keynum !=13){return;}JQ("#cmdCreateAccount").click();}});}function toForgotteinPass (){loginContent = JQ("#login").html();JQ("#login").html(JQ("#forgotteinPass").html());JQ("#forgotteinPass").html("");JQ("#backLogin").bind("click",toLogin);JQ("#cmdResetPass").bind("click",createNewPassword);}function toLogin (){JQ("#forgotteinPass").html(JQ("#login").html());JQ("#login").html(loginContent);}function prepareLoginEvents(){JQ("#lostPassword").live("click",toForgotteinPass);JQ("#txtPassword").live("keypress",function(e){if(e && e.keyCode && e.keyCode == 13){login();}});JQ("#cmdLogin").live("click",login);}function backRegister(){JQ("#registerFull").hide();if(jQuery.browser.msie){JQ("#register").show();JQ("#tuto").show();JQ("#reasons").show();}else{JQ("#register").fadeIn(500);JQ("#tuto").fadeIn(500);JQ("#reasons").fadeIn(500);}}function validateNewPassword(){if(!isEmail(JQ("#txtEmailForgot").val())){JQ("#forgotMsg1").html("E-mail inválido!");JQ("#forgotMsg1").addClass("red");JQ("#forgotMsg2").html("");JQ("#forgotMsg2").addClass("red");JQ("#txtEmailForgot").focus();return false;}return true;}function createNewPassword(){if(!validateNewPassword()){return;}showShortMessage(getTextD(120,"Aguarde..."));User.createNewPassword(JQ("#txtEmailForgot").val(),{callback: retAccountFunctions,timeout:dwrTimeout,errorHandler:errorDWRDefault});JQ("#txtEmailForgot").val("");toLogin();}function validadeCreate(){if( !isAlphanumeric(JQ("#txtNameCreate").val())|| JQ("#txtNameCreate").val().length == 0){JQ("#registerMsg1").html(getTextD(1057,"Nome de usuário incorreto!"));JQ("#registerMsg1").addClass("red");JQ("#registerMsg2").html(getTextD(1058,"Utilize apenas letras e números."));JQ("#registerMsg2").addClass("red");JQ("#txtNameCreate").focus();return false;}if( JQ("#txtPasswordCreate").val().length < 4 ){JQ("#registerMsg1").html(getTextD(1059,"Senha insegura!"));JQ("#registerMsg1").removeClass("red");JQ("#registerMsg2").html(getTextD(1060,"Prefira utilizar senhas com mais caracteres"));JQ("#registerMsg2").removeClass("red");JQ("#txtPasswordCreate").focus();}if(JQ("#txtPasswordCreate").val().length==0){JQ("#registerMsg1").html(getTextD(1061,"Senha incorreta!"));JQ("#registerMsg1").addClass("red");JQ("#registerMsg2").html("");JQ("#registerMsg2").addClass("red");JQ("#txtPasswordCreate").focus();return false;}if(JQ("#txtPasswordCreate").val() != JQ("#txtPasswordAgain").val()){JQ("#registerMsg1").html(getTextD(1061,"Senha incorreta!"));JQ("#registerMsg1").addClass("red");JQ("#registerMsg2").html(getTextD(1062,"A senha e a confirmação precisam ser iguais"));JQ("#registerMsg2").addClass("red");JQ("#txtPasswordCreate").focus();return false;}if(!isEmail(JQ("#txtEmailCreate").val())){JQ("#registerMsg1").html(getTextD(1063,"E-mail inválido!"));JQ("#registerMsg1").addClass("red");JQ("#registerMsg2").html("");JQ("#registerMsg2").addClass("red");JQ("#txtEmailCreate").focus();return false;}return true;}function createAccount(){if(!validadeCreate()){return;}showShortMessage(getTextD(120,"Aguarde..."));User.createNewAccount(JQ("#txtNameCreate").val(),JQ("#txtPasswordCreate").val(),JQ("#txtEmailCreate").val(),{callback: retAccountFunctions,timeout:dwrTimeout,errorHandler:errorDWRDefault});JQ("#txtNameCreate").val("");JQ("#txtPasswordCreate").val("");JQ("#txtPasswordAgain").val("");JQ("#txtEmailCreate").val("");backRegister();JQ.mask.close();}function retAccountFunctions(data){showShortMessage("");showModalMessage(data);}function prepareSlider(){JQ(".screen").each(function(index,element){if(index>0){JQ(element).hide();}});JQ(".navigation").each(function (index,element){JQ(element).bind("click",function(){JQ("#screentitle").html(screenTitles[index]);JQ(".screen").hide();if(jQuery.browser.msie){JQ("#screen"+(index+1)).show();}else{JQ("#screen"+(index+1)).fadeIn();}JQ(".navigation").removeClass("nav-selected");JQ(this).addClass("nav-selected");});});}var onTutorial = false;var char = {name:"",type:0,hp:0,attack:0,dex:0,mattack:0,armor:0};function tutorial(){onTutorial = true;expose("",getTextD(1153,"O  que é RPG?"),getTextD(1154,"<P>RPG significa Role Playing Game que...") +"<INPUT type='button' value='" + getTextD(476,"Continuar") + "' onclick='tutoRPG2()'>");setTimeout("insertExitExpose()",1000);}function tutoRPG2(){var title = getTextD(1155,"O Mestre");var content = getTextD(1156,"<P>Fazendo um paralelo com o teatro...");nextTutorialStep(title,content,tutoRPG3);}function tutoRPG3(){var title = getTextD(1155,"O Mestre");var content = getTextD(1157,"<P>Dependendo do tipo de RPG, ...");nextTutorialStep(title,content,tutoRPG4);}function tutoRPG4(){var title = getTextD(1158,"Os Personagens");var content = getTextD(1159,"<P>Os demais jogadores serão os personagens. ");nextTutorialStep(title,content,tutoRPG5);}function tutoRPG5(){var title = getTextD(1160,"As Regras do Jogo");var content = getTextD(1161,"<P>Se o mestre simplesmente ...");nextTutorialStep(title,content,tutoRPG6);}function tutoRPG6(){var title = getTextD(1162,"Sistema de Regras");var content = getTextD(1163,"<P>Algumas regras o seu mestre ...");nextTutorialStep(title,content,tutoRPG7);}function tutoRPG7(){var title = getTextD(1162,"Sistema de Regras");var content = getTextD(1164,"<P>O primeiro foi o D&D ...");nextTutorialStep(title,content,tutoRPG8);}function tutoRPG8(){var title = getTextD(1162,"Sistema de Regras");var content = getTextD(1165,"<P>Hoje você encontra uma infinidade ...");nextTutorialStep(title,content,tutoRPG9);}function tutoRPG9(){var title = getTextD(1166,"A Ficha de Pesonagem");var content = getTextD(1167,"<P>Na maioria absoluta dos sistemas...");nextTutorialStep(title,content,tutoRPG10);}function tutoRPG10(){var title = getTextD(1166,"A Ficha de Pesonagem");var content = getTextD(1168,"<P>No nosso exemplo do muro...");nextTutorialStep(title,content,tutoRPG11);}function tutoRPG11(){var title = getTextD(1169,"Os Dados");var content = getTextD(1170,"<P>Peças fundamentais do jogo de RPG...");nextTutorialStep(title,content,tutoRPG12);}function tutoRPG12(){var title = getTextD(1171,"Os Dados - Terminologia");var content = getTextD(1172,"<P>Novamente, quem decide ...");nextTutorialStep(title,content,tutoRPG13);}function tutoRPG11(){var title = getTextD(1173,"O Jogo");var content = getTextD(1174,"<P>Mas a melhor maneira de...") ;nextTutorialStep(title,content,tutoRPG12);}function tutoRPG12(){var title = getTextD(1175,"Escolha Seu Personagem");var content = "<P>" + getTextD(1176,"Vamos começar?") + "</P> " +"<UL><LI id='charThief'>" + getTextD(1177,"Saqueador de túmulos") + "</LI>" +"<LI id='charWarrior'>" + getTextD(1178,"Um guerreiro explorador") + "</LI>" +"<LI id='charMage'>" + getTextD(1179,"Um mago") + "</LI></UL>" ;nextTutorialStep(title,content,tutoRPG13);JQ("#tipExpoNext").remove();JQ("#charThief").bind({click:selectThief});JQ("#charWarrior").bind({click:selectWarrior});JQ("#charMage").bind({click:selectMage});}function createSheet(type,charclass,name){if(type==1){char = {attack:3,mattack:0,dex:6,armor:1,hp: 6,hpMax:6};}else if(type==2){char = {attack:4,mattack:0,dex:0,armor:2,hp: 10,hpMax:10};}else if(type==3){char = {attack:1,mattack:6,dex:3,armor:1,hp: 5,hpMax:5};}char.type = type;char.name = name;char.data = new Array();var sheet = "<DIV id='tutoSheet'>" +"<H3>" + getTextD(1180,"Ficha de Personagem") + "</H3>" +"<P><Strong>" + getTextD(1181,"Classe") + ": </Strong>" + charclass + "</P>" +"<P><Strong>" + getTextD(906,"Nome") + ": </Strong>" + name+ "</P>" +"<H4>" + getTextD(1182,"Habilidades") + ":</H4>" ;sheet += "<P><Strong>" + getTextD(1183,"Ataque") + ": </Strong>" + char.attack + "</P>";sheet += "<P><Strong>" + getTextD(1184,"Ataque mágico") + ": </Strong>" + char.mattack + "</P>";sheet += "<P><Strong>" + getTextD(1185,"Agilidade") + ": </Strong>" + char.dex + "</P>";sheet += "<P><Strong>" + getTextD(1186,"Energia") + ": </Strong><label id='charhp'>" + char.hp + "</label></P>";sheet += "<P><Strong>" + getTextD(1187,"Energia máxima") + ": </Strong>" + char.hpMax + "</P>";sheet += "<P><Strong>" + getTextD(1188,"Defesa") + ": </Strong>" + char.armor + "</P>";sheet += "<div id='inventory'><H4>" + getTextD(1189,"Equipamento") + ":</H4>" ;sheet += "<P>1 " + getTextD(1190,"Mochila") + "</P>";sheet += "<P>1 " + getTextD(1191,"Corda") + "</P>";sheet += "<P>1 " + getTextD(1192,"Cantil de água") + "</P>";if(char.type==1){sheet += "<P>1 " + getTextD(1193,"Adaga") + "</P>";}else if(char.type==2){sheet += "<P>1 " + getTextD(1194,"Espada") + "</P>";}else if(char.type==3){sheet += "<P>1 " + getTextD(1195,"Cajado") + "</P>";}sheet += "</div></div>";JQ("body").append(sheet);JQ("#exitTutoButton").bind({click:function (){JQ('#tutoSheet').remove();}});tutoRPG13();}function selectThief(){createSheet(1,getTextD(1196,"Saqueador de túmulos"),"Vigiana Ronnes");}function selectWarrior(){createSheet(2,getTextD(1197,"Guerreiro explorador"),getTextD(1198,"Ronam, o Bárbaro"));}function selectMage(){createSheet(3,getTextD(1199,"Mago"),"Merlin");}function tutoRPG13(){var title = getTextD(1200,"Ficha");var content = getTextD(1201,"<P>Repare que a ficha...") ;nextTutorialStep(title,content,tutoRPG14);}function tutoRPG14(){var title = getTextD(1202,"Uma noite chuvosa...");var content = getTextD(1203,"Uma noite chuvosa...",[char.name] ) ;nextTutorialStep(title,content,tutoRPG15);}function tutoRPG15(){var title = getTextD(1204,"Sinais estranhos");var add = "";log("type;" + char.type);if(char.type==1){log("2360");add = getTextD(1205," Talvez tenha alguma relíquia guardada,");}else if(char.type==2){log("2410");add = getTextD(1206," Talvez tenha alguma fera que valha a pena ser morta,");}else if(char.type==3){log("2460");add = getTextD(1207," Talvez os sinais sejam arcanos e você descubra uma nova magia,");}var content = getTextD(1208,"<P>Observando a força da chuva...",[add]) +"<UL><LI id='enterCave'>" + getTextD(1209,"Vou em direção do fundo da caverna investigar.") + "</LI>" +"<LI id='waitInCave'>" + getTextD(1210,"Ignoro os símbolos") + "</LI></UL>" ;nextTutorialStep(title,content,dummy);JQ("#tipExpoNext").remove();JQ("#enterCave").live("click",enterCave);JQ("#waitInCave").live("click",waitInCave);}function waitInCave(){char.data['wait'] = true;var title = getTextD(1211,"O Urso");var add = "";if(char.type ==1){add = getTextD(1212,"Você só tem uma única arma...");}else if(char.type ==2){add = getTextD(1213,"Você só tem uma única arma ...");}else if(char.type ==3){add = getTextD(1214,"Você só tem uma única arma ...");}var content = "<P>" + getTextD(1215,"Talvez...") + "</P>" +"<P>" + getTextD(1216,"Agora, você enfrentará um combate") + "</P>" +"<P>" + add + "</P>" ;nextTutorialStep(title,content,waitResult);JQ("#tipExpoNext").val(getTextD(1217,"Rolar 1D6"));}function d6(){var result = parseInt(Math.random() * 6) + 1;return (result==7)?1:result;}function waitResult(){var bearhp = 6;var attack = char.attack;if(char.type ==3 ){attack = char.mattack;}var result = d6();var title = getTextD(1218,"Resultado");var left = bearhp - (result+attack);if(left > 0){damage(left);JQ("#charhp").html(char.hp );}var content = "<P>" + getTextD(1219,"Você tirou",[result,attack,result+attack]) + "</P>";if(char.data['injured']){content += "<P>" + getTextD(1220,"Você foi atingido...") + "</P>" ;}content += "<P>" + getTextD(1221,"Agora que ele está morto,..." ) + "</P>" ;nextTutorialStep(title,content,tutoRPG16);}function tutoRPG16(){var title = getTextD(1222,"Investigar o urso" );var content = "<P>" + getTextD(1223,"Agora, você pode investigar melhor o urso, ou simplesmente deixar ele em paz e esperar pelo amanhecer." ) + "</P> " +"<UL><LI id='searchBear'>" + getTextD(1224,"Revirar o corpo do urso" ) + "</LI>" +"<LI id='waitNewDay'>" + getTextD(1225,"Aguardar o novo dia" ) + "</LI>" +"</UL>" ;nextTutorialStep(title,content,tutoRPG16);JQ("#tipExpoNext").remove();JQ("#searchBear").live("click",searchBear);JQ("#waitNewDay").live("click",waitNewDay);}function searchBear(){char.data['searchBear'] = true;var title = getTextD(1222,"Investigar o urso" );var content = "<P>" + getTextD(1226,"Você encontra um colar preso ao pescoço do urso. Vai remove-lo?" ) + "</P> " +"<UL><LI id='removeBear'>" + getTextD(1227,"Remover o colar" ) + "</LI>" +"<LI id='waitNewDay'>" + getTextD(1228,"Não remover" ) + "</LI>" +"</UL>" ;nextTutorialStep(title,content,waitNewDay);JQ("#tipExpoNext").remove();JQ("#removeBear").live("click",removeBear);JQ("#waitNewDay").live("click",waitNewDay);}function removeBear(){char.data['removeBear'] = true;var title = getTextD(1222,"Investigar o urso" );var content = getTextD(1229,"<P>Ao retirar o colar, o urso ...");JQ("#inventory").append("<P>1 " + getTextD(1230,"colar misterioso") + "</P>");nextTutorialStep(title,content,waitNewDay);}function damage(value){char.hp = char.hp -value;char.hp = (char.hp<0)?0:char.hp;char.data['injured'] = true;JQ('#charhp').html(char.hp);}function enterCave(){var title = getTextD(1231,"Mais sinais" );var content = getTextD(1232,"Mais sinais" ) ;nextTutorialStep(title,content,trap);JQ("#tipExpoNext").val("D6");}function trap(){var title = getTextD(1233,"Resultado" );var result = d6();var findTrap = (result+char.dex)>=4;var content = "<P> " + getTextD(1234,"Você" ) + " ";if(findTrap){char.data['findTrap'] = true;content += getTextD(1235,"percebe uma armadilha no chão e desvia dela." ) + " </P>"}else{content += getTextD(1236,"cai numa armadilha no chão. ..." ) + " </P>"damage(2);}content += "<P>" + getTextD(1237,"cai numa armadilha no chão. ...",[result,char.dex,result + char.dex]) + "</P>";nextTutorialStep(title,content,tutoRPG18);}function tutoRPG18(){var title = getTextD(1238,"O baú" );var weapon = "";if(char.type==1){weapon = getTextD(1239,"adaga." );}else if(char.type==2){weapon = getTextD(1240,"espada." );}else if(char.type==3){weapon = getTextD(1241,"magia. Lutar com seu cajado de madeira seria suicídio." );}var content = "<P>" + getTextD(1242,"Você abre a porta ..." ) + "</P>";content += "<P>" + getTextD(1243,"De repente, os olhos ..." ) + "</P>";content += "<P style='color:#FF0000;font-weight:bold;'>" + getTextD(1244,"Eu sou Xzane, ..." ) + "</P>";content += "<P>" + getTextD(1245,"Você vai precisar ...",[weapon]) + "</P>";nextTutorialStep(title,content,tutoRPG19);JQ("#tipExpoNext").val("D6");}function tutoRPG19(){var title = getTextD(1233,"Resultado" );var result = d6();var win = (result+char.dex)>=4;var content = "<P> " + getTextD(1234,"Você " );if(win){content += getTextD(1246,"o derrota sem se ferir." ) + " </P>";}else{content += getTextD(1247,"o derrota, mas ..." ) + "</P>";damage(2);}content += "<P> " + getTextD(1248,"O antigo mago ..." ) + "</P>";nextTutorialStep(title,content,tutoRPG20);}function tutoRPG20(){var title = getTextD(1249,"A recompensa" );var content = "<P> " + getTextD(1250,"Uma vez que você ..." ) + " </P>";content += "<P> " + getTextD(1251,"Você abre o baú?") + "</P>";content += "<UL>" +"<LI id='openAndReturn'>" + getTextD(1252,"Eu abro.") + "</LI>" +"<LI id='returnCave'>" + getTextD(1253,"Não abro e volto pra entrada.") + "</LI>" +"</UL>";nextTutorialStep(title,content,openAndReturn);JQ("#tipExpoNext").remove();JQ("#openAndReturn").live("click",openAndReturn);JQ("#returnCave").live("click",returnCave);}function openAndReturn(){char.data['questEnd']=true;var title = getTextD(1254,"O Tesouro");var content = "<P>" + getTextD(1255,"Dentro do baú, você encontra:") + "</P>";content += "<UL class='unselect'>" +"<LI>" + getTextD(1256,"Um bracelete") + "</LI>" +"<LI>" + getTextD(1257,"Um pergaminho com escritos mágicos") + "</LI>" +"<LI>50 " + getTextD(1258,"moedas de ouro") + "</LI>" +"</UL>";content += "<P>Depois de coletar sua conquista, você volta para a entrada da caverna.</P>";nextTutorialStep(title,content,returnCave);JQ("#inventory").append("<P>1 " + getTextD(1259,"bracelete misterioso") + "</P>");JQ("#inventory").append("<P>1 " + getTextD(1260,"pergaminho mágico") + "</P>");JQ("#inventory").append("<P>50 " + getTextD(1261,"moedas de ouro") + "</P>");}function returnCave(){var title = getTextD(1262,"Pegadas");var content = getTextD(1263,"<P>Parece que, enquanto...");nextTutorialStep(title,content,waitNewDay);}function waitNewDay(){var title = getTextD(1264,"Novo dia");var content = getTextD(1265,"<P>Chega o novo dia...");nextTutorialStep(title,content,endRPGTuto);}function endRPGTuto(){var title = getTextD(1266,"Final");var content = getTextD(1267,"<P>Este é o final de nossa ...",[char.name])+ "<strong>\"" + getTextD(1268,"Campanha") + "\"</strong>.</P>";nextTutorialStep(title,content,endRPGTuto2);}function endRPGTuto2(){var title = getTextD(1269,"Conclusão");var content = getTextD(1270,"<P>Você ajudou a construir a história. Se você jogasse novamente esta aventura, o resultado poderia ser outro.</P><P>Por exemplo, o que aconteceria se ") ;if(char.data['wait']){content += getTextD(1271,"você tivesse investigado os símbolos no interior da caverna?") + "</P>" ;content += "<P>" + getTextD(1272,"Ou ainda ") ;if(char.data['searchBear']){if(char.data['removeBear']){content += getTextD(1273,"se você tivesse uma maneira de remover ") + "</P>" ;}else{content += getTextD(1274,"tivesse removido o colar do urso?") + "</P>" ;}}else{content += getTextD(1275,"se você tivesse investigado o urso?") + "</P>" ;}}else{content += getTextD(1276,"não tivesse ido investigar os símbolos?") + "</P>" ;content += "<P>" + getTextD(1272,"Ou ainda ") ;if(char.data['findTrap'] ){content += getTextD(1277,"tivesse caído naquela armadilha?") + "</P>" ;}else{content += getTextD(1278,"tivesse uma agilidade maior que %1 e escapado da armadilha?",[char.dex ]) + " </P>" ;}if(char.data['questEnd']){content += "<P>" + getTextD(1279,"E os itens do baú? ...") + "</P>" ;}else{content += "<P>" +getTextD(1280,"E se você tivesse aberto o baú?") +"</P>" ;}content += "<P>" +getTextD(1281,"Numa continuação desta aventura...") +"</P>" ;}nextTutorialStep(title,content,tutoRPG17);}function tutoRPG17(){var title = getTextD(1282,"E isso não é tudo!");var content = "<P>" +getTextD(1283,"Na realidade é só o começo. Num jogo de RPG de verdade, você pode ter ainda muito mais opções!") +"</P>" ;nextTutorialStep(title,content,tutoRPG22);}function tutoRPG22(){var title = getTextD(1284,"Sistemas");var content = "<P>" +getTextD(1285,"Usamos aqui um sistema ..." ) +"</P><P>" +getTextD(1286,"Abaixo, uma relação de sistemas gratuitos para baixar:") +"</P><UL>" +"<LI><A target='_blank' href='http://www.olddragon.com.br'>Old Dragon</A></LI>" +"<LI><A target='_blank' href='http://www.jamboeditora.com.br/produtos/3d&t.htm'>3D&T</A></LI>" +"<LI><A target='_blank' href='http://mightyblade.coisinhaverde.com/home.php'>Mighty Blade</A></LI>" +"<LI><A target='_blank' href='http://www.secular-games.com/2011/03/busca-final/'>Busca Final</A></LI>" +"</UL>" ;nextTutorialStep(title,content,tutoRPG23);}function tutoRPG23(){var title = getTextD(1287,"Equipe");var content = "<P>" +getTextD(1288,"Aqui você jogou sozinho, mas normalmente estará em numa mesa com 3 a 5 outros jogadores. Isso" +" permite mais interação entre os personagens. Um personagem pode ajudar o outro, " +" trocar itens, conversar...") +"</P>" ;nextTutorialStep(title,content,tutoRPG24);}function tutoRPG24(){JQ("#tutoSheet").remove();var title = "Taulukko";var content = "<P>" +getTextD(1289,"Agora que você já sabe o quanto o RPG pode ser divertido, que tal se cadastrar e convidar seus amigos para jogar?") +"</P><P>" +getTextD(1290,"O Taulukko é uma ferramenta que permite você narrar ou participar de histórias a distância." ) +"</P><P>" +getTextD(1291,"Deseja criar uma conta agora?") +"</P><UL>" +"<LI id='accountYes'>" +getTextD(1292,"Sim, quero me cadastrar agora.") +"</LI>" +"<LI id='accountNo'>" +getTextD(1293,"Não, vou me cadastrar depois.") +"</LI>" +"</UL>" ;nextTutorialStep(title,content,accountYes);JQ("#tipExpoNext").remove();JQ("#accountYes").live("click",accountYes);JQ("#accountNo").live("click",accountNo);}function accountYes(){log("6260");JQ("#tipExpo").remove();log("6280");JQ.mask.close();log("6300");showShortMessage(getTextD(120,"Aguarde..."));setTimeout("cbAccountYes()",500);}function cbAccountYes(){showShortMessage("");var title = getTextD(1294,"Criando uma conta");var content = "<P>" +getTextD(1295,"Preencha os campos solcitados. Atenção para preencher corretamente o e-mail, pois você precisará realizar uma confirmação via e-mail.")+"</P>" ;log("6305");expose("#register",title,content);log("6310");JQ("#cmdRegister").bind("click",closeTutorial);}function accountNo(){log("accountNo");closeTutorial();}
