//MooTools, My Object Oriented Javascript Tools. Copyright (c) 2006 Valerio Proietti, , MIT Style License. var Position = { cumulativeOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; } while (element); return [valueL, valueT]; } }; function $c(array){ var nArray = []; for (var i=0;i')); $A(this.attributes).each(function(attribute){ if (attribute.name != 'name') el.setProperty(attribute.name, attribute.value); }); if (this.parentNode) this.replaceWith(el); }; default: this.setAttribute(property, value); } return el || this; }, setProperties: function(source){ for (var property in source) this.setProperty(property, source[property]); return this; }, setHTML: function(html){ this.innerHTML = html; return this; }, getProperty: function(property){ return this.getAttribute(property); }, getTag: function(){ return this.tagName.toLowerCase(); }, getOffset: function(what){ what = what.capitalize(); var el = this; var offset = 0; do { offset += el['offset'+what] || 0; el = el.offsetParent; } while (el); return offset; }, getTop: function(){ return this.getOffset('top'); }, getLeft: function(){ return this.getOffset('left'); }, getValue: function(){ var value = false; switch(this.getTag()){ case 'select': value = this.getElementsByTagName('option')[this.selectedIndex].value; break; case 'input': if ( (this.checked && ['checkbox', 'radio'].test(this.type)) || (['hidden', 'text', 'password'].test(this.type)) ) value = this.value; break; case 'textarea': value = this.value; } return value; } }); new Object.Native(Element); Element.extend({ hasClassName: Element.prototype.hasClass, addClassName: Element.prototype.addClass, removeClassName: Element.prototype.removeClass, toggleClassName: Element.prototype.toggleClass }); function $Element(el, method, args){ if ($type(args) != 'array') args = [args]; return Element.prototype[method].apply(el, args); }; function $(el){ if ($type(el) == 'string') el = document.getElementById(el); if ($type(el) == 'element'){ if (!el.extend){ Unload.elements.push(el); el.extend = Object.extend; el.extend(Element.prototype); } return el; } else return false; }; window.addEvent = document.addEvent = Element.prototype.addEvent; window.removeEvent = document.removeEvent = Element.prototype.removeEvent; var Unload = { elements: [], functions: [], vars: [], unload: function(){ Unload.functions.each(function(fn){ fn(); }); window.removeEvent('unload', window.removeFunction); Unload.elements.each(function(el){ for(var p in Element.prototype){ window[p] = null; document[p] = null; el[p] = null; } el.extend = null; }); } }; window.removeFunction = Unload.unload; window.addEvent('unload', window.removeFunction); var Fx = fx = {}; Fx.Base = new Class({ setOptions: function(options){ this.options = Object.extend({ onStart: Class.empty, onComplete: Class.empty, transition: Fx.Transitions.sineInOut, duration: 500, unit: 'px', wait: true, fps: 50 }, options || {}); }, step: function(){ var time = new Date().getTime(); if (time < this.time + this.options.duration){ this.cTime = time - this.time; this.setNow(); } else { this.options.onComplete.pass(this.element, this).delay(10); this.clearTimer(); this.callChain(); this.now = this.to; } this.increase(); }, set: function(to){ this.now = to; this.increase(); return this; }, setNow: function(){ this.now = this.compute(this.from, this.to); }, compute: function(from, to){ return this.options.transition(this.cTime, from, (to - from), this.options.duration); }, custom: function(from, to){ if (!this.options.wait) this.clearTimer(); if (this.timer) return; this.options.onStart.pass(this.element, this).delay(10); this.from = from; this.to = to; this.time = new Date().getTime(); this.timer = this.step.periodical(Math.round(1000/this.options.fps), this); return this; }, clearTimer: function(){ this.timer = $clear(this.timer); return this; }, setStyle: function(element, property, value){ element.setStyle(property, value + this.options.unit); } }); Fx.Base.implement(new Chain); Fx.Style = Fx.Base.extend({ initialize: function(el, property, options){ this.element = $(el); this.setOptions(options); this.property = property.camelCase(); }, hide: function(){ return this.set(0); }, goTo: function(val){ return this.custom(this.now || 0, val); }, increase: function(){ this.setStyle(this.element, this.property, this.now); } }); Fx.Styles = Fx.Base.extend({ initialize: function(el, options){ this.element = $(el); this.setOptions(options); this.now = {}; }, setNow: function(){ for (var p in this.from) this.now[p] = this.compute(this.from[p], this.to[p]); }, custom: function(objFromTo){ if (this.timer && this.options.wait) return; var from = {}; var to = {}; for (var p in objFromTo){ from[p] = objFromTo[p][0]; to[p] = objFromTo[p][1]; } return this.parent(from, to); }, increase: function(){ for (var p in this.now) this.setStyle(this.element, p, this.now[p]); } }); Element.extend({ effect: function(property, options){ return new Fx.Style(this, property, options); }, effects: function(options){ return new Fx.Styles(this, options); } }); Fx.Transitions = { linear: function(t, b, c, d){ return c*t/d + b; }, sineInOut: function(t, b, c, d){ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; } }; function $S(){ var els = []; $A(arguments).each(function(sel){ if ($type(sel) == 'string') els.extend(document.getElementsBySelector(sel)); else if ($type(sel) == 'element') els.push($(sel)); }); return $Elements(els); }; var $$ = $S; function $E(selector, filter){ return ($(filter) || document).getElement(selector); }; function $ES(selector, filter){ return ($(filter) || document).getElementsBySelector(selector); }; function $Elements(elements){ return Object.extend(elements, new Elements); }; Element.extend({ getElements: function(selector){ var filters = []; selector.clean().split(' ').each(function(sel, i){ var bits = sel.test('^(\\w*|\\*)(?:#(\\w+)|\\.(\\w+))?(?:\\[["\']?(\\w+)["\']?([\\*\\^\\$]?=)["\']?(\\w*)["\']?\\])?$'); if (!bits) return; if (!bits[1]) bits[1] = '*'; var param = bits.remove(bits[0]).associate(['tag', 'id', 'class', 'attribute', 'operator', 'value']); if (i == 0){ if (param['id']){ var el = this.getElementById(param['id']); if (!el || (param['tag'] != '*' && $(el).getTag() != param['tag'])) return false; filters = [el]; } else { filters = $A(this.getElementsByTagName(param['tag'])); } } else { if (param['id']) filters = $Elements(filters).filterById(param['id']); filters = $Elements(filters).filterByTagName(param['tag']); } if (param['class']) filters = $Elements(filters).filterByClassName(param['class']); if (param['attribute']) filters = $Elements(filters).filterByAttribute(param['attribute'], param['value'], param['operator']); }, this); filters.each(function(el){ $(el); }); return $Elements(filters); }, getElement: function(selector){ return this.getElementsBySelector(selector)[0]; }, getElementsBySelector: function(selector){ var els = []; selector.split(',').each(function(sel){ els.extend(this.getElements(sel)); }, this); return $Elements(els); } }); document.extend = Object.extend; document.extend({ getElementsByClassName: function(className){ return document.getElements('.'+className); }, getElement: Element.prototype.getElement, getElements: Element.prototype.getElements, getElementsBySelector: Element.prototype.getElementsBySelector }); var Elements = new Class({ action: function(actions){ this.each(function(el){ el = $(el); if (actions.initialize) actions.initialize.apply(el); for(var action in actions){ var evt = false; if (action.test('^on[\\w]{1,}')) el[action] = actions[action]; else if (evt = action.test('([\\w-]{1,})event$')) el.addEvent(evt[1], actions[action]); } }); }, //internal methods filterById: function(id){ var found = []; this.each(function(el){ if (el.id == id) found.push(el); }); return found; }, filterByClassName: function(className){ var found = []; this.each(function(el){ if ($Element(el, 'hasClass', className)) found.push(el); }); return found; }, filterByTagName: function(tagName){ var found = []; this.each(function(el){ found.extend($A(el.getElementsByTagName(tagName))); }); return found; }, filterByAttribute: function(name, value, operator){ var found = []; this.each(function(el){ var att = el.getAttribute(name); if(!att) return; if (!operator) return found.push(el); switch(operator){ case '*=': if (att.test(value)) found.push(el); break; case '=': if (att == value) found.push(el); break; case '^=': if (att.test('^'+value)) found.push(el); break; case '$=': if (att.test(value+'$')) found.push(el); } }); return found; } }); new Object.Native(Elements); ajax = Class.create(); ajax.event = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; function emptyFunction() {} ajax.prototype = { initialize: function(url, options){ this.transport = this.getTransport(); this.options = options; this.postBody = options.postBody || ''; this.method = options.method || 'post'; this.update = $(options.update) || null; this.request(url); }, request: function(url){ this.transport.open(this.method, url, true); this.transport.onreadystatechange = this.onStateChange.bind(this); if (this.method == 'post') { this.transport.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=GB2312','text/xml'); if (this.transport.overrideMimeType) this.transport.setRequestHeader('Connection', 'close'); } this.transport.send(this.postBody); }, onStateChange: function(){ var event = ajax.event[this.transport.readyState]; if (event == 'Complete') { setTimeout(function(){(this.options['on' + this.transport.status] || emptyFunction)(this.transport);}.bind(this), 10); if (this.transport.status == 200 && this.update) setTimeout(function(){this.update.innerHTML = this.transport.responseText;}.bind(this), 10); } setTimeout(function(){(this.options['on' + event] || emptyFunction)(this.transport);}.bind(this), 10); if (event == 'Complete') this.transport.onreadystatechange = function(){}; }, getTransport: function() { if (window.ActiveXObject) return new ActiveXObject('Microsoft.XMLHTTP'); else if (window.XMLHttpRequest) return new XMLHttpRequest(); else return false; } }; Object.toQueryString = function(source){ var queryString = []; for (var property in source) queryString.push(encodeURIComponent(property)+'='+encodeURIComponent(source[property])); return queryString.join('&'); }; Element.extend({ send: function(options){ options = Object.extend(options, {postBody: this.toQueryString(), method: 'post'}); return new Ajax(this.getProperty('action'), options).request(); }, toQueryString: function(){ var queryString = []; $A(this.getElementsByTagName('*')).each(function(el){ var name = $(el).name; var value = el.getValue(); if (value && name) queryString.push(encodeURIComponent(name)+'='+encodeURIComponent(value)); }); return queryString.join('&'); } }); var Drag = {}; Drag.Base = new Class({ setOptions: function(options){ this.options = Object.extend({ handle: false, unit: 'px', onStart: Class.empty, onComplete: Class.empty, onDrag: Class.empty, xMax: false, xMin: false, yMax: false, yMin: false }, options || {}); }, initialize: function(el, xModifier, yModifier, options){ this.setOptions(options); this.element = $(el); this.handle = $(this.options.handle) || this.element; if (xModifier) this.xp = xModifier.camelCase(); if (yModifier) this.yp = yModifier.camelCase(); this.handle.onmousedown = this.start.bind(this); }, start: function(evt){ evt = evt || window.event; this.startX = evt.clientX; this.startY = evt.clientY; this.handleX = this.startX - this.handle.getLeft(); this.handleY = this.startY - this.handle.getTop(); this.set(evt); this.options.onStart.pass(this.element, this).delay(10); document.onmousemove = this.drag.bind(this); document.onmouseup = this.end.bind(this); return false; }, addStyles: function(x, y){ if (this.xp){ var stylex = this.element.getStyle(this.xp).toInt(); var movex = function(val){ this.element.setStyle(this.xp, val+this.options.unit); }.bind(this); if (this.options.xMax && stylex >= this.options.xMax){ if (this.clientX <= this.handleX+this.handle.getLeft()) movex(stylex+x); if (stylex > this.options.xMax) movex(this.options.xMax); } else if(this.options.xMin && stylex <= this.options.xMin){ if (this.clientX >= this.handleX+this.handle.getLeft()) movex(stylex+x); if (stylex < this.options.xMin) movex(this.options.xMin); } else movex(stylex+x); } if (this.yp){ var styley = this.element.getStyle(this.yp).toInt(); var movey = function(val){ this.element.setStyle(this.yp, val+this.options.unit); }.bind(this); if (this.options.yMax && styley >= this.options.yMax){ if (this.clientY <= this.handleY+this.handle.getTop()) movey(styley+y); if (styley > this.options.yMax) movey(this.options.yMax); } else if(this.options.yMin && styley <= this.options.yMin){ if (this.clientY >= this.handleY+this.handle.getTop()) movey(styley+y); if (styley < this.options.yMin) movey(this.options.yMin); } else movey(styley+y); } }, drag: function(evt){ evt = evt || window.event; this.clientX = evt.clientX; this.clientY = evt.clientY; this.options.onDrag.pass(this.element, this).delay(5); this.addStyles((this.clientX-this.lastMouseX), (this.clientY-this.lastMouseY)); this.set(evt); return false; }, set: function(evt){ this.lastMouseX = evt.clientX; this.lastMouseY = evt.clientY; return false; }, end: function(){ document.onmousemove = null; document.onmouseup = null; this.options.onComplete.pass(this.element, this).delay(10); } }); Drag.Move = Drag.Base.extend({ extendOptions: function(options){ this.options = Object.extend(this.options || {}, Object.extend({ onSnap: Class.empty, droppables: [], snapDistance: 8, snap: true, xModifier: 'left', yModifier: 'top', container: false }, options || {})); }, initialize: function(el, options){ this.extendOptions(options); this.container = $(this.options.container); this.parent(el, this.options.xModifier, this.options.yModifier, this.options); }, start: function(evt){ if (this.options.container) { var cont = $(this.options.container).getPosition(); Object.extend(this.options, { xMax: cont.right-this.element.offsetWidth, xMin: cont.left, yMax: cont.bottom-this.element.offsetHeight, yMin: cont.top }); } this.parent(evt); if (this.options.snap) document.onmousemove = this.checkAndDrag.bind(this); return false; }, drag: function(evt){ this.parent(evt); this.options.droppables.each(function(drop){ if (this.checkAgainst(drop)){ if (drop.onOver && !drop.dropping) drop.onOver.pass([this.element, this], drop).delay(10); drop.dropping = true; } else { if (drop.onLeave && drop.dropping) drop.onLeave.pass([this.element, this], drop).delay(10); drop.dropping = false; } }, this); return false; }, checkAndDrag: function(evt){ evt = evt || window.event; var distance = Math.round(Math.sqrt(Math.pow(evt.clientX - this.startX, 2)+Math.pow(evt.clientY - this.startY, 2))); if (distance > this.options.snapDistance){ this.set(evt); this.options.onSnap.pass(this.element, this).delay(10); document.onmousemove = this.drag.bind(this); this.addStyles(-(this.startX-evt.clientX), -(this.startY-evt.clientY)); } return false; }, checkAgainst: function(el){ x = this.clientX+Window.getScrollLeft(); y = this.clientY+Window.getScrollTop(); var el = $(el).getPosition(); return (x > el.left && x < el.right && y < el.bottom && y > el.top); }, end: function(){ this.parent(); this.options.droppables.each(function(drop){ if (drop.onDrop && this.checkAgainst(drop)) drop.onDrop.pass([this.element, this], drop).delay(10); }, this); } }); Element.extend({ makeDraggable: function(options){ return new Drag.Move(this, options); }, makeResizable: function(options){ return new Drag.Base(this, 'width', 'height', options); }, getPosition: function(){ var obj = {}; obj.width = this.offsetWidth; obj.height = this.offsetHeight; obj.left = this.getLeft(); obj.top = this.getTop(); obj.right = obj.left + obj.width; obj.bottom = obj.top + obj.height; return obj; } }); var Window = { disableImageCache: function(){ if (window.ActiveXObject) document.execCommand("BackgroundImageCache", false, true); }, extend: Object.extend, getWidth: function(){ return window.innerWidth || document.documentElement.clientWidth || 0; }, getHeight: function(){ return window.innerHeight || document.documentElement.clientHeight || 0; }, getScrollHeight: function(){ return document.documentElement.scrollHeight; }, getScrollWidth: function(){ return document.documentElement.scrollWidth; }, getScrollTop: function(){ return document.documentElement.scrollTop || window.pageYOffset || 0; }, getScrollLeft: function(){ return document.documentElement.scrollLeft || window.pageXOffset || 0; }, onDomReady: function(init){ var state = document.readyState; if (state && document.childNodes && !document.all && !navigator.taintEnabled){ //khtml if (state.test(/loaded|complete/)) return init(); else return Window.onDomReady.pass(init).delay(100); } else if (state && window.ActiveXObject){ //ie var script = $('_ie_ready_'); if (!script) document.write(""); $('_ie_ready_').addEvent('readystatechange', function(){ if (this.readyState == 'complete') init(); }); return; } else { //others var myInit = function() { if (arguments.callee.done) return; arguments.callee.done = true; init(); }; window.addEvent("load", myInit); document.addEvent("DOMContentLoaded", myInit); } } }; var Cookie = { set: function(key, value, duration){ var date = new Date(); date.setTime(date.getTime()+((duration || 365)*86400000)); document.cookie = key+"="+value+"; expires="+date.toGMTString()+"; path=/"; }, get: function(key){ var myValue, myVal; document.cookie.split(';').each(function(cookie){ if(myVal = cookie.trim().test(key+'=(.*)')) myValue = myVal[1]; }); return myValue; }, remove: function(key){ this.set(key, '', -1); } }; var Json = { toString: function(el){ var string = []; var isArray = function(array){ var string = []; array.each(function(ar){ string.push(Json.toString(ar)); }); return string.join(','); }; var isObject = function(object){ var string = []; for (var property in object) string.push('"'+property+'":'+Json.toString(object[property])); return string.join(','); }; switch($type(obj)){ case 'number': string.push(obj); break; case 'string': string.push('"'+obj+'"'); break; case 'function': string.push(obj); break; case 'object': string.push('{'+isObject(obj)+'}'); break; case 'array': string.push('['+isArray(obj)+']'); } return string.join(','); }, evaluate: function(str){ return eval('(' + str + ')'); } }; var Sortables = new Class({ setOptions: function(options) { this.options = { handles: false, fxDuration: 250, fxTransition: Fx.Transitions.sineInOut, maxOpacity: 0.5, onComplete: Class.empty, onStart: Class.empty, contain: false }; Object.extend(this.options, options || {}); }, initialize: function(elements, options){ this.setOptions(options); this.options.handles = this.options.handles || elements; var trash = new Element('div').injectInside($(document.body)); $A(elements).each(function(el, i){ var copy = $(el).clone().setStyles({ 'position': 'absolute', 'opacity': '0', 'display': 'none' }).injectInside(trash); var elEffect = el.effect('opacity', { duration: this.options.fxDuration, wait: false, transition: this.options.fxTransition }).set(1); var copyEffects = copy.effects({ duration: this.options.fxDuration, wait: false, transition: this.options.fxTransition, onComplete: function(){ copy.setStyle('display', 'none'); } }); var yMax = false; var yMin = false; if (this.options.contain){ yMax = $(el.parentNode).getTop()+el.parentNode.offsetHeight-el.offsetHeight; yMin = el.parentNode.getTop(); } var dragger = new Drag.Move(copy, { handle: this.options.handles[i], yMax: yMax, yMin: yMin, xModifier: false, onStart: function(){ this.options.onStart.bind(this).delay(10); copy.setHTML(el.innerHTML).setStyles({ 'display': 'block', 'opacity': this.options.maxOpacity, 'top': el.getTop()+'px', 'left': el.getLeft()+'px' }); elEffect.custom(elEffect.now, this.options.maxOpacity); }.bind(this), onComplete: function(){ this.options.onComplete.bind(this).delay(10); copyEffects.custom({ 'opacity': [this.options.maxOpacity, 0], 'top': [copy.getTop(), el.getTop()] }); elEffect.custom(elEffect.now, 1); }.bind(this), onDrag: function(){ if (el.getPrevious() && copy.getTop() < (el.getPrevious().getTop())) el.injectBefore(el.getPrevious()); else if (el.getNext() && copy.getTop() > (el.getNext().getTop())) el.injectAfter(el.getNext()); } }); }, this); } }); Fx.Scroll = Fx.Base.extend({ initialize: function(el, options) { this.element = $(el); this.setOptions(options); }, down: function(){ return this.custom(this.element.scrollTop, this.element.scrollHeight-this.element.offsetHeight); }, up: function(){ return this.custom(this.element.scrollTop, 0); }, increase: function(){ this.element.scrollTop = this.now; } }); Fx.Slide = Fx.Base.extend({ initialize: function(el, options){ this.element = $(el); this.wrapper = new Element('div').injectAfter(this.element).setStyle('overflow', 'hidden').adopt(this.element); this.setOptions(options); if (!this.options.mode) this.options.mode = 'vertical'; this.now = []; }, setNow: function(){ [0,1].each(function(i){ this.now[i] = this.compute(this.from[i], this.to[i]); }, this); }, vertical: function(){ this.margin = 'top'; this.layout = 'height'; this.startPosition = [this.element.scrollHeight, '0']; this.endPosition = ['0', -this.element.scrollHeight]; return this; }, horizontal: function(){ this.margin = 'left'; this.layout = 'width'; this.startPosition = [this.element.scrollWidth, '0']; this.endPosition = ['0', -this.element.scrollWidth]; return this; }, hide: function(){ this[this.options.mode](); this.wrapper.setStyle(this.layout, '0'); this.element.setStyle('margin-'+this.margin, -this.element['scroll'+this.layout.capitalize()]+this.options.unit); return this; }, show: function(){ this[this.options.mode](); this.wrapper.setStyle(this.layout, this.element['scroll'+this.layout.capitalize()]+this.options.unit); this.element.setStyle('margin-'+this.margin, '0'); return this; }, toggle: function(mode){ this[this.options.mode](); if (this.wrapper['offset'+this.layout.capitalize()] > 0) return this.custom(this.startPosition, this.endPosition); else return this.custom(this.endPosition, this.startPosition); }, increase: function(){ this.wrapper.setStyle(this.layout, this.now[0]+this.options.unit); this.element.setStyle('margin-'+this.margin, this.now[1]+this.options.unit); } }); Fx.Color = Fx.Base.extend({ initialize: function(el, property, options){ this.element = $(el); this.setOptions(options); this.property = property; this.now = []; }, custom: function(from, to){ return this.parent(from.hexToRgb(true), to.hexToRgb(true)); }, setNow: function(){ [0,1,2].each(function(i){ this.now[i] = Math.round(this.compute(this.from[i], this.to[i])); }, this); }, increase: function(){ this.element.setStyle(this.property, "rgb("+this.now[0]+","+this.now[1]+","+this.now[2]+")"); }, fromColor: function(color){ return this.custom(color, this.element.getStyle(this.property)); }, toColor: function(color){ return this.custom(this.element.getStyle(this.property), color); } }); Fx.Height = Fx.Style.extend({ initialize: function(el, options){ this.parent(el, 'height', options); this.element.setStyle('overflow', 'hidden'); }, toggle: function(){ if (this.element.offsetHeight > 0) return this.custom(this.element.offsetHeight, 0); else return this.custom(0, this.element.scrollHeight); }, show: function(){ return this.set(this.element.scrollHeight); } }); Fx.Width = Fx.Style.extend({ initialize: function(el, options){ this.parent(el, 'width', options); this.element.setStyle('overflow', 'hidden'); this.iniWidth = this.element.offsetWidth; }, toggle: function(){ if (this.element.offsetWidth > 0) return this.custom(this.element.offsetWidth, 0); else return this.custom(0, this.iniWidth); }, show: function(){ return this.set(this.iniWidth); } }); Fx.Opacity = Fx.Style.extend({ initialize: function(el, options){ this.parent(el, 'opacity', options); this.now = 1; }, toggle: function(){ if (this.now > 0) return this.custom(1, 0); else return this.custom(0, 1); }, show: function(){ return this.set(1); } }); Fx.Transitions = { linear: function(t, b, c, d){ return c*t/d + b; }, quadIn: function(t, b, c, d){ return c*(t/=d)*t + b; }, quadOut: function(t, b, c, d){ return -c *(t/=d)*(t-2) + b; }, quadInOut: function(t, b, c, d){ if ((t/=d/2) < 1) return c/2*t*t + b; return -c/2 * ((--t)*(t-2) - 1) + b; }, cubicIn: function(t, b, c, d){ return c*(t/=d)*t*t + b; }, cubicOut: function(t, b, c, d){ return c*((t=t/d-1)*t*t + 1) + b; }, cubicInOut: function(t, b, c, d){ if ((t/=d/2) < 1) return c/2*t*t*t + b; return c/2*((t-=2)*t*t + 2) + b; }, quartIn: function(t, b, c, d){ return c*(t/=d)*t*t*t + b; }, quartOut: function(t, b, c, d){ return -c * ((t=t/d-1)*t*t*t - 1) + b; }, quartInOut: function(t, b, c, d){ if ((t/=d/2) < 1) return c/2*t*t*t*t + b; return -c/2 * ((t-=2)*t*t*t - 2) + b; }, quintIn: function(t, b, c, d){ return c*(t/=d)*t*t*t*t + b; }, quintOut: function(t, b, c, d){ return c*((t=t/d-1)*t*t*t*t + 1) + b; }, quintInOut: function(t, b, c, d){ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; return c/2*((t-=2)*t*t*t*t + 2) + b; }, sineIn: function(t, b, c, d){ return -c * Math.cos(t/d * (Math.PI/2)) + c + b; }, sineOut: function(t, b, c, d){ return c * Math.sin(t/d * (Math.PI/2)) + b; }, sineInOut: function(t, b, c, d){ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; }, expoIn: function(t, b, c, d){ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; }, expoOut: function(t, b, c, d){ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; }, expoInOut: function(t, b, c, d){ if (t==0) return b; if (t==d) return b+c; if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; }, circIn: function(t, b, c, d){ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; }, circOut: function(t, b, c, d){ return c * Math.sqrt(1 - (t=t/d-1)*t) + b; }, circInOut: function(t, b, c, d){ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; }, elasticIn: function(t, b, c, d, a, p){ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (!a) a = 1; if (a < Math.abs(c)){ a=c; var s=p/4; } else var s = p/(2*Math.PI) * Math.asin(c/a); return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; }, elasticOut: function(t, b, c, d, a, p){ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (!a) a = 1; if (a < Math.abs(c)){ a=c; var s=p/4; } else var s = p/(2*Math.PI) * Math.asin(c/a); return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; }, elasticInOut: function(t, b, c, d, a, p){ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); if (!a) a = 1; if (a < Math.abs(c)){ a=c; var s=p/4; } else var s = p/(2*Math.PI) * Math.asin(c/a); if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; }, backIn: function(t, b, c, d, s){ if (!s) s = 1.70158; return c*(t/=d)*t*((s+1)*t - s) + b; }, backOut: function(t, b, c, d, s){ if (!s) s = 1.70158; return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; }, backInOut: function(t, b, c, d, s){ if (!s) s = 1.70158; if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; }, bounceIn: function(t, b, c, d){ return c - Fx.Transitions.bounceOut (d-t, 0, c, d) + b; }, bounceOut: function(t, b, c, d){ if ((t/=d) < (1/2.75)){ return c*(7.5625*t*t) + b; } else if (t < (2/2.75)){ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; } else if (t < (2.5/2.75)){ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; } else { return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; } }, bounceInOut: function(t, b, c, d){ if (t < d/2) return Fx.Transitions.bounceIn(t*2, 0, c, d) * .5 + b; return Fx.Transitions.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; } }; var Tips = new Class({ setOptions: function(options){ this.options = { transitionStart: Fx.Transitions.sineInOut, transitionEnd: Fx.Transitions.sineInOut, maxTitleChars: 30, fxDuration: 150, maxOpacity: 1, timeOut: 100, className: 'tooltip' } Object.extend(this.options, options || {}); }, initialize: function(elements, options){ this.elements = elements; this.setOptions(options); this.toolTip = new Element('div').addClassName(this.options.className).setStyle('position', 'absolute').injectInside(document.body); this.toolTitle = new Element('H4').injectInside(this.toolTip); this.toolText = new Element('p').injectInside(this.toolTip); this.fx = new fx.Style(this.toolTip, 'opacity', {duration: this.options.fxDuration, wait: false}).hide(); $A(elements).each(function(el){ $(el).myText = el.title || false; if (el.myText) el.removeAttribute('title'); if (el.href){ if (el.href.test('http://')) el.myTitle = el.href.replace('http://', ''); if (el.href.length > this.options.maxTitleChars) el.myTitle = el.href.substr(0,this.options.maxTitleChars-3)+"..."; } if (el.myText && el.myText.test('::')){ var dual = el.myText.split('::'); el.myTitle = dual[0].trim(); el.myText = dual[1].trim(); } el.onmouseover = function(){ this.show(el); return false; }.bind(this); el.onmousemove = this.locate.bindAsEventListener(this); el.onmouseout = function(){ this.timer = $clear(this.timer); this.disappear(); }.bind(this); }, this); }, show: function(el){ this.toolTitle.innerHTML = el.myTitle; this.toolText.innerHTML = el.myText; this.timer = $clear(this.timer); this.fx.options.transition = this.options.transitionStart; this.timer = this.appear.delay(this.options.timeOut, this); }, appear: function(){ this.fx.custom(this.fx.now, this.options.maxOpacity); }, locate: function(evt){ var doc = document.documentElement; this.toolTip.setStyles({'top': evt.clientY + doc.scrollTop + 15 + 'px', 'left': evt.clientX + doc.scrollLeft - 30 + 'px'}); }, disappear: function(){ this.fx.options.transition = this.options.transitionEnd; this.fx.custom(this.fx.now, 0); } }); Fx.Elements = Fx.Base.extend({ initialize: function(elements, options){ this.elements = []; elements.each(function(el){ this.elements.push($(el)); }, this); this.setOptions(options); this.now = {}; }, setNow: function(){ for (var i in this.from){ var iFrom = this.from[i]; var iTo = this.to[i]; var iNow = this.now[i] = {}; for (var p in iFrom) iNow[p] = this.compute(iFrom[p], iTo[p]); } }, custom: function(objObjs){ if (this.timer && this.options.wait) return; var from = {}; var to = {}; for (var i in objObjs){ var iProps = objObjs[i]; var iFrom = from[i] = {}; var iTo = to[i] = {}; for (var prop in iProps){ iFrom[prop] = iProps[prop][0]; iTo[prop] = iProps[prop][1]; } } return this.parent(from, to); }, increase: function(){ for (var i in this.now){ var iNow = this.now[i]; for (var p in iNow) this.setStyle(this.elements[i.toInt()], p, iNow[p]); } } }); Fx.Accordion = Fx.Elements.extend({ extendOptions: function(options){ Object.extend(this.options, Object.extend({ start: 'open-first', fixedHeight: false, fixedWidth: false, alwaysHide: false, wait: false, onActive: Class.empty, onBackground: Class.empty, height: true, opacity: true, width: false }, options || {})); }, initialize: function(togglers, elements, options){ this.parent(elements, options); this.extendOptions(options); this.previousClick = 'nan'; togglers.each(function(tog, i){ $(tog).addEvent('click', function(){this.showThisHideOpen(i)}.bind(this)); }, this); this.togglers = togglers; this.h = {}; this.w = {}; this.o = {}; this.elements.each(function(el, i){ this.now[i] = {}; $(el).setStyles({'height': 0, 'overflow': 'hidden'}); }, this); switch(this.options.start){ case 'first-open': this.elements[0].setStyle('height', this.elements[0].scrollHeight+this.options.unit); break; case 'open-first': this.showThisHideOpen(0); break; } }, hideThis: function(i){ if (this.options.height) this.h = {'height': [this.elements[i].offsetHeight, 0]}; if (this.options.width) this.w = {'width': [this.elements[i].offsetWidth, 0]}; if (this.options.opacity) this.o = {'opacity': [this.now[i]['opacity'] || 1, 0]}; }, showThis: function(i){ if (this.options.height) this.h = {'height': [this.elements[i].offsetHeight, this.options.fixedHeight || this.elements[i].scrollHeight]}; if (this.options.width) this.w = {'width': [this.elements[i].offsetWidth, this.options.fixedWidth || this.elements[i].scrollWidth]}; if (this.options.opacity) this.o = {'opacity': [this.now[i]['opacity'] || 0, 1]}; }, showThisHideOpen: function(iToShow){ if (iToShow != this.previousClick || this.options.alwaysHide){ this.previousClick = iToShow; var objObjs = {}; var err = false; var madeInactive = false; this.elements.each(function(el, i){ this.now[i] = this.now[i] || {}; if (i != iToShow){ this.hideThis(i); } else if (this.options.alwaysHide){ if (el.offsetHeight == el.scrollHeight){ this.hideThis(i); madeInactive = true; } else if (el.offsetHeight == 0){ this.showThis(i); } else { err = true; } } else if (this.options.wait && this.timer){ this.previousClick = 'nan'; err = true; } else { this.showThis(i); } objObjs[i] = Object.extend(this.h, Object.extend(this.o, this.w)); }, this); if (err) return; if (!madeInactive) this.options.onActive.call(this, this.togglers[iToShow], iToShow); this.togglers.each(function(tog, i){ if (i != iToShow || madeInactive) this.options.onBackground.call(this, tog, i); }, this); return this.custom(objObjs); } } });