
var Prototype={
Version:'1.5.0_rc1',
BrowserFeatures:{
XPath:!!document.evaluate},
ScriptFragment:'(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
emptyFunction:function(){},
K:function(x){return x}}
var Class={
create:function(){
return function(){
this.initialize.apply(this,arguments);}}}
var Abstract=new Object();
Object.extend=function(destination,source){
for(var property in source){
destination[property]=source[property];}
return destination;}
Object.extend(Object,{
inspect:function(object){
try{
if(object===undefined)return 'undefined';
if(object===null)return 'null';
return object.inspect?object.inspect():object.toString();}catch(e){
if(e instanceof RangeError)return '...';
throw e;}},
keys:function(object){
var keys=[];
for(var property in object)
keys.push(property);
return keys;},
values:function(object){
var values=[];
for(var property in object)
values.push(object[property]);
return values;},
clone:function(object){
return Object.extend({},object);}});
Function.prototype.bind=function(){
var __method=this,args=$A(arguments),object=args.shift();
return function(){
return __method.apply(object,args.concat($A(arguments)));}}
Function.prototype.bindAsEventListener=function(object){
var __method=this,args=$A(arguments),object=args.shift();
return function(event){
return __method.apply(object,[(event||window.event)].concat(args).concat($A(arguments)));}}
Object.extend(Number.prototype,{
toColorPart:function(){
var digits=this.toString(16);
if(this<16)return '0'+digits;
return digits;},
succ:function(){
return this +1;},
times:function(iterator){
$R(0,this,true).each(iterator);
return this;}});
var Try={
these:function(){
var returnValue;
for(var i=0;i<arguments.length;i++){
var lambda=arguments[i];
try{
returnValue=lambda();
break;}catch(e){}}
return returnValue;}}
var PeriodicalExecuter=Class.create();
PeriodicalExecuter.prototype={
initialize:function(callback,frequency){
this.callback=callback;
this.frequency=frequency;
this.currentlyExecuting=false;
this.registerCallback();},
registerCallback:function(){
this.timer=setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},
stop:function(){
if(!this.timer)return;
clearInterval(this.timer);
this.timer=null;},
onTimerEvent:function(){
if(!this.currentlyExecuting){
try{
this.currentlyExecuting=true;
this.callback(this);}finally{
this.currentlyExecuting=false;}}}}
Object.extend(String.prototype,{
gsub:function(pattern,replacement){
var result='',source=this,match;
replacement=arguments.callee.prepareReplacement(replacement);
while(source.length>0){
if(match=source.match(pattern)){
result+=source.slice(0,match.index);
result+=(replacement(match)||'').toString();
source=source.slice(match.index+match[0].length);}else{
result+=source,source='';}}
return result;},
sub:function(pattern,replacement,count){
replacement=this.gsub.prepareReplacement(replacement);
count=count===undefined?1:count;
return this.gsub(pattern,function(match){
if(--count<0)return match[0];
return replacement(match);});},
scan:function(pattern,iterator){
this.gsub(pattern,iterator);
return this;},
truncate:function(length,truncation){
length=length||30;
truncation=truncation===undefined?'...':truncation;
return this.length>length?
this.slice(0,length-truncation.length)+truncation:this;},
strip:function(){
return this.replace(/^\s+/,'').replace(/\s+$/,'');},
stripTags:function(){
return this.replace(/<\/?[^>]+>/gi,'');},
stripScripts:function(){
return this.replace(new RegExp(Prototype.ScriptFragment,'img'),'');},
extractScripts:function(){
var matchAll=new RegExp(Prototype.ScriptFragment,'img');
var matchOne=new RegExp(Prototype.ScriptFragment,'im');
return(this.match(matchAll)||[]).map(function(scriptTag){
return(scriptTag.match(matchOne)||['',''])[1];});},
evalScripts:function(){
return this.extractScripts().map(function(script){return eval(script)});},
escapeHTML:function(){
var div=document.createElement('div');
var text=document.createTextNode(this);
div.appendChild(text);
return div.innerHTML;},
unescapeHTML:function(){
var div=document.createElement('div');
div.innerHTML=this.stripTags();
return div.childNodes[0]?div.childNodes[0].nodeValue:'';},
toQueryParams:function(){
var match=this.strip().match(/[^?]*$/)[0];
if(!match)return{};
var pairs=match.split('&');
return pairs.inject({},function(params,pairString){
var pair=pairString.split('=');
var value=pair[1]?decodeURIComponent(pair[1]):undefined;
params[decodeURIComponent(pair[0])]=value;
return params;});},
toArray:function(){
return this.split('');},
camelize:function(){
var oStringList=this.split('-');
if(oStringList.length==1)return oStringList[0];
var camelizedString=this.indexOf('-')==0?oStringList[0].charAt(0).toUpperCase()+oStringList[0].substring(1):oStringList[0];
for(var i=1,length=oStringList.length;i<length;i++){
var s=oStringList[i];
camelizedString+=s.charAt(0).toUpperCase()+s.substring(1);}
return camelizedString;},
inspect:function(useDoubleQuotes){
var escapedString=this.replace(/\\/g,'\\\\');
if(useDoubleQuotes)
return '"'+escapedString.replace(/"/g,'\\"')+'"';
else
return "'"+escapedString.replace(/'/g,'\\\'') + "'";}});
String.prototype.gsub.prepareReplacement=function(replacement){
if(typeof replacement=='function')return replacement;
var template=new Template(replacement);
return function(match){return template.evaluate(match)};}
String.prototype.parseQuery=String.prototype.toQueryParams;
var Template=Class.create();
Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;
Template.prototype={
initialize:function(template,pattern){
this.template=template.toString();
this.pattern=pattern||Template.Pattern;},
evaluate:function(object){
return this.template.gsub(this.pattern,function(match){
var before=match[1];
if(before=='\\')return match[2];
return before+(object[match[3]]||'').toString();});}}
var $break=new Object();
var $continue=new Object();
var Enumerable={
each:function(iterator){
var index=0;
try{
this._each(function(value){
try{
iterator(value,index++);}catch(e){
if(e!=$continue)throw e;}});}catch(e){
if(e!=$break)throw e;}
return this;},
eachSlice:function(number,iterator){
var index=-number,slices=[],array=this.toArray();
while((index+=number)<array.length)
slices.push(array.slice(index,index+number));
return slices.collect(iterator||Prototype.K);},
all:function(iterator){
var result=true;
this.each(function(value,index){
result=result&&!!(iterator||Prototype.K)(value,index);
if(!result)throw $break;});
return result;},
any:function(iterator){
var result=false;
this.each(function(value,index){
if(result=!!(iterator||Prototype.K)(value,index))
throw $break;});
return result;},
collect:function(iterator){
var results=[];
this.each(function(value,index){
results.push(iterator(value,index));});
return results;},
detect:function(iterator){
var result;
this.each(function(value,index){
if(iterator(value,index)){
result=value;
throw $break;}});
return result;},
findAll:function(iterator){
var results=[];
this.each(function(value,index){
if(iterator(value,index))
results.push(value);});
return results;},
grep:function(pattern,iterator){
var results=[];
this.each(function(value,index){
var stringValue=value.toString();
if(stringValue.match(pattern))
results.push((iterator||Prototype.K)(value,index));})
return results;},
include:function(object){
var found=false;
this.each(function(value){
if(value==object){
found=true;
throw $break;}});
return found;},
inGroupsOf:function(number,fillWith){
fillWith=fillWith||null;
var results=this.eachSlice(number);
if(results.length>0)(number-results.last().length).times(function(){
results.last().push(fillWith)});
return results;},
inject:function(memo,iterator){
this.each(function(value,index){
memo=iterator(memo,value,index);});
return memo;},
invoke:function(method){
var args=$A(arguments).slice(1);
return this.collect(function(value){
return value[method].apply(value,args);});},
max:function(iterator){
var result;
this.each(function(value,index){
value=(iterator||Prototype.K)(value,index);
if(result==undefined||value>=result)
result=value;});
return result;},
min:function(iterator){
var result;
this.each(function(value,index){
value=(iterator||Prototype.K)(value,index);
if(result==undefined||value<result)
result=value;});
return result;},
partition:function(iterator){
var trues=[],falses=[];
this.each(function(value,index){((iterator||Prototype.K)(value,index)?
trues:falses).push(value);});
return[trues,falses];},
pluck:function(property){
var results=[];
this.each(function(value,index){
results.push(value[property]);});
return results;},
reject:function(iterator){
var results=[];
this.each(function(value,index){
if(!iterator(value,index))
results.push(value);});
return results;},
sortBy:function(iterator){
return this.collect(function(value,index){
return{value:value,criteria:iterator(value,index)};}).sort(function(left,right){
var a=left.criteria,b=right.criteria;
return a<b?-1:a>b?1:0;}).pluck('value');},
toArray:function(){
return this.collect(Prototype.K);},
zip:function(){
var iterator=Prototype.K,args=$A(arguments);
if(typeof args.last()=='function')
iterator=args.pop();
var collections=[this].concat(args).map($A);
return this.map(function(value,index){
return iterator(collections.pluck(index));});},
inspect:function(){
return '#<Enumerable:'+this.toArray().inspect()+'>';}}
Object.extend(Enumerable,{
map:Enumerable.collect,
find:Enumerable.detect,
select:Enumerable.findAll,
member:Enumerable.include,
entries:Enumerable.toArray});
var $A=Array.from=function(iterable){
if(!iterable)return[];
if(iterable.toArray){
return iterable.toArray();}else{
var results=[];
for(var i=0,length=iterable.length;i<length;i++)
results.push(iterable[i]);
return results;}}
Object.extend(Array.prototype,Enumerable);
if(!Array.prototype._reverse)
Array.prototype._reverse=Array.prototype.reverse;
Object.extend(Array.prototype,{
_each:function(iterator){
for(var i=0,length=this.length;i<length;i++)
iterator(this[i]);},
clear:function(){
this.length=0;
return this;},
first:function(){
return this[0];},
last:function(){
return this[this.length-1];},
compact:function(){
return this.select(function(value){
return value!=undefined||value!=null;});},
flatten:function(){
return this.inject([],function(array,value){
return array.concat(value&&value.constructor==Array?
value.flatten():[value]);});},
without:function(){
var values=$A(arguments);
return this.select(function(value){
return !values.include(value);});},
indexOf:function(object){
for(var i=0,length=this.length;i<length;i++)
if(this[i]==object)return i;
return -1;},
reverse:function(inline){
return(inline!==false?this:this.toArray())._reverse();},
reduce:function(){
return this.length>1?this:this[0];},
uniq:function(){
return this.inject([],function(array,value){
return array.include(value)?array:array.concat([value]);});},
clone:function(){
return[].concat(this);},
inspect:function(){
return '['+this.map(Object.inspect).join(', ')+']';}});
Array.prototype.toArray=Array.prototype.clone;
var Hash={
_each:function(iterator){
for(var key in this){
var value=this[key];
if(typeof value=='function')continue;
var pair=[key,value];
pair.key=key;
pair.value=value;
iterator(pair);}},
keys:function(){
return this.pluck('key');},
values:function(){
return this.pluck('value');},
merge:function(hash){
return $H(hash).inject(this,function(mergedHash,pair){
mergedHash[pair.key]=pair.value;
return mergedHash;});},
toQueryString:function(){
return this.map(function(pair){
if(!pair.value&&pair.value!==0)pair[1]='';
if(!pair.key)return;
return pair.map(encodeURIComponent).join('=');}).join('&');},
inspect:function(){
return '#<Hash:{'+this.map(function(pair){
return pair.map(Object.inspect).join(': ');}).join(', ')+'}>';}}
function $H(object){
var hash=Object.extend({},object||{});
Object.extend(hash,Enumerable);
Object.extend(hash,Hash);
return hash;}
ObjectRange=Class.create();
Object.extend(ObjectRange.prototype,Enumerable);
Object.extend(ObjectRange.prototype,{
initialize:function(start,end,exclusive){
this.start=start;
this.end=end;
this.exclusive=exclusive;},
_each:function(iterator){
var value=this.start;
while(this.include(value)){
iterator(value);
value=value.succ();}},
include:function(value){
if(value<this.start)
return false;
if(this.exclusive)
return value<this.end;
return value<=this.end;}});
var $R=function(start,end,exclusive){
return new ObjectRange(start,end,exclusive);}
var Ajax={
getTransport:function(){
return Try.these(
function(){return new XMLHttpRequest()},
function(){return new ActiveXObject('Msxml2.XMLHTTP')},
function(){return new ActiveXObject('Microsoft.XMLHTTP')})||false;},
activeRequestCount:0}
Ajax.Responders={
responders:[],
_each:function(iterator){
this.responders._each(iterator);},
register:function(responder){
if(!this.include(responder))
this.responders.push(responder);},
unregister:function(responder){
this.responders=this.responders.without(responder);},
dispatch:function(callback,request,transport,json){
this.each(function(responder){
if(typeof responder[callback]=='function'){
try{
responder[callback].apply(responder,[request,transport,json]);}catch(e){}}});}};
Object.extend(Ajax.Responders,Enumerable);
Ajax.Responders.register({
onCreate:function(){
Ajax.activeRequestCount++;},
onComplete:function(){
Ajax.activeRequestCount--;}});
Ajax.Base=function(){};
Ajax.Base.prototype={
setOptions:function(options){
this.options={
method:'post',
asynchronous:true,
contentType:'application/x-www-form-urlencoded',
encoding:'UTF-8',
parameters:''}
Object.extend(this.options,options||{});
this.options.method=this.options.method.toLowerCase();
this.options.parameters=$H(typeof this.options.parameters=='string'?
this.options.parameters.toQueryParams():this.options.parameters);}}
Ajax.Request=Class.create();
Ajax.Request.Events=['Uninitialized','Loading','Loaded','Interactive','Complete'];
Ajax.Request.prototype=Object.extend(new Ajax.Base(),{
initialize:function(url,options){
this.transport=Ajax.getTransport();
this.setOptions(options);
this.request(url);},
request:function(url){
var params=this.options.parameters;
if(params.any())params['_']='';
if(!['get','post'].include(this.options.method)){
params['_method']=this.options.method;
this.options.method='post';}
this.url=url;
if(this.options.method=='get'&&params.any())
this.url+=(this.url.indexOf('?')>=0?'&':'?')+
params.toQueryString();
try{
Ajax.Responders.dispatch('onCreate',this,this.transport);
this.transport.open(this.options.method.toUpperCase(),this.url,
this.options.asynchronous,this.options.username,
this.options.password);
if(this.options.asynchronous)
setTimeout(function(){this.respondToReadyState(1)}.bind(this),10);
this.transport.onreadystatechange=this.onStateChange.bind(this);
this.setRequestHeaders();
var body=this.options.method=='post'?(this.options.postBody||params.toQueryString()):null;
this.transport.send(body);
if(!this.options.asynchronous&&this.transport.overrideMimeType)
this.onStateChange();}
catch(e){
this.dispatchException(e);}},
onStateChange:function(){
var readyState=this.transport.readyState;
if(readyState>1)
this.respondToReadyState(this.transport.readyState);},
setRequestHeaders:function(){
var headers={
'X-Requested-With':'XMLHttpRequest',
'X-Prototype-Version':Prototype.Version,
'Accept':'text/javascript, text/html, application/xml, text/xml, */*'};
if(this.options.method=='post'){
headers['Content-type']=this.options.contentType+(this.options.encoding?'; charset='+this.options.encoding:'');
if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005)
headers['Connection']='close';}
if(typeof this.options.requestHeaders=='object'){
var extras=this.options.requestHeaders;
if(typeof extras.push=='function')
for(var i=0;i<extras.length;i+=2)
headers[extras[i]]=extras[i+1];
else
$H(extras).each(function(pair){headers[pair.key]=pair.value});}
for(var name in headers)
this.transport.setRequestHeader(name,headers[name]);},
success:function(){
return !this.transport.status||(this.transport.status>=200&&this.transport.status<300);},
respondToReadyState:function(readyState){
var state=Ajax.Request.Events[readyState];
var transport=this.transport,json=this.evalJSON();
if(state=='Complete'){
try{(this.options['on'+this.transport.status]||this.options['on'+(this.success()?'Success':'Failure')]||Prototype.emptyFunction)(transport,json);}catch(e){
this.dispatchException(e);}}
try{(this.options['on'+state]||Prototype.emptyFunction)(transport,json);
Ajax.Responders.dispatch('on'+state,this,transport,json);}catch(e){
this.dispatchException(e);}
if(state=='Complete'){
if((this.getHeader('Content-type')||'').strip().
match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
this.evalResponse();
this.transport.onreadystatechange=Prototype.emptyFunction;}},
getHeader:function(name){
try{
return this.transport.getResponseHeader(name);}catch(e){return null}},
evalJSON:function(){
try{
var json=this.getHeader('X-JSON');
return json?eval('('+json+')'):null;}catch(e){return null}},
evalResponse:function(){
try{
return eval(this.transport.responseText);}catch(e){
this.dispatchException(e);}},
dispatchException:function(exception){(this.options.onException||Prototype.emptyFunction)(this,exception);
Ajax.Responders.dispatch('onException',this,exception);}});
Ajax.Updater=Class.create();
Object.extend(Object.extend(Ajax.Updater.prototype,Ajax.Request.prototype),{
initialize:function(container,url,options){
this.container={
success:(container.success||container),
failure:(container.failure||(container.success?null:container))}
this.transport=Ajax.getTransport();
this.setOptions(options);
var onComplete=this.options.onComplete||Prototype.emptyFunction;
this.options.onComplete=(function(transport,param){
this.updateContent();
onComplete(transport,param);}).bind(this);
this.request(url);},
updateContent:function(){
var receiver=this.container[this.success()?'success':'failure'];
var response=this.transport.responseText;
if(!this.options.evalScripts)response=response.stripScripts();
if(receiver=$(receiver)){
if(this.options.insertion)
new this.options.insertion(receiver,response);
else
receiver.update(response);}
if(this.success()){
if(this.onComplete)
setTimeout(this.onComplete.bind(this),10);}}});
Ajax.PeriodicalUpdater=Class.create();
Ajax.PeriodicalUpdater.prototype=Object.extend(new Ajax.Base(),{
initialize:function(container,url,options){
this.setOptions(options);
this.onComplete=this.options.onComplete;
this.frequency=(this.options.frequency||2);
this.decay=(this.options.decay||1);
this.updater={};
this.container=container;
this.url=url;
this.start();},
start:function(){
this.options.onComplete=this.updateComplete.bind(this);
this.onTimerEvent();},
stop:function(){
this.updater.options.onComplete=undefined;
clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments);},
updateComplete:function(request){
if(this.options.decay){
this.decay=(request.responseText==this.lastText?
this.decay*this.options.decay:1);
this.lastText=request.responseText;}
this.timer=setTimeout(this.onTimerEvent.bind(this),
this.decay*this.frequency*1000);},
onTimerEvent:function(){
this.updater=new Ajax.Updater(this.container,this.url,this.options);}});
function $(element){
if(arguments.length>1){
for(var i=0,elements=[],length=arguments.length;i<length;i++)
elements.push($(arguments[i]));
return elements;}
if(typeof element=='string')
element=document.getElementById(element);
return Element.extend(element);}
if(Prototype.BrowserFeatures.XPath){
document._getElementsByXPath=function(expression,parentElement){
var results=[];
var query=document.evaluate(expression,$(parentElement)||document,
null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
for(var i=0,len=query.snapshotLength;i<len;i++)
results.push(query.snapshotItem(i));
return results;}}
document.getElementsByClassName=function(className,parentElement){
if(Prototype.BrowserFeatures.XPath){
var q=".//*[contains(concat(' ', @class, ' '), ' "+className+" ')]";
return document._getElementsByXPath(q,parentElement);}else{
var children=($(parentElement)||document.body).getElementsByTagName('*');
var elements=[],child;
for(var i=0,length=children.length;i<length;i++){
child=children[i];
if(Element.hasClassName(child,className))
elements.push(Element.extend(child));}
return elements;}}
if(!window.Element)
var Element=new Object();
Element.extend=function(element){
if(!element)return;
if(_nativeExtensions||element.nodeType==3)return element;
if(!element._extended&&element.tagName&&element!=window){
var methods=Object.clone(Element.Methods),cache=Element.extend.cache;
if(element.tagName=='FORM')
Object.extend(methods,Form.Methods);
if(['INPUT','TEXTAREA','SELECT'].include(element.tagName))
Object.extend(methods,Form.Element.Methods);
for(var property in methods){
var value=methods[property];
if(typeof value=='function')
element[property]=cache.findOrStore(value);}
var methods=Object.clone(Element.Methods.Simulated),cache=Element.extend.cache;
for(var property in methods){
var value=methods[property];
if('function'==typeof value&&!(property in element))
element[property]=cache.findOrStore(value);}}
element._extended=true;
return element;}
Element.extend.cache={
findOrStore:function(value){
return this[value]=this[value]||function(){
return value.apply(null,[this].concat($A(arguments)));}}}
Element.Methods={
visible:function(element){
return $(element).style.display!='none';},
toggle:function(element){
element=$(element);
Element[Element.visible(element)?'hide':'show'](element);
return element;},
hide:function(element){
$(element).style.display='none';
return element;},
show:function(element){
$(element).style.display='';
return element;},
remove:function(element){
element=$(element);
element.parentNode.removeChild(element);
return element;},
update:function(element,html){
html=typeof html=='undefined'?'':html.toString();
$(element).innerHTML=html.stripScripts();
setTimeout(function(){html.evalScripts()},10);
return element;},
replace:function(element,html){
element=$(element);
if(element.outerHTML){
element.outerHTML=html.stripScripts();}else{
var range=element.ownerDocument.createRange();
range.selectNodeContents(element);
element.parentNode.replaceChild(
range.createContextualFragment(html.stripScripts()),element);}
setTimeout(function(){html.evalScripts()},10);
return element;},
inspect:function(element){
element=$(element);
var result='<'+element.tagName.toLowerCase();
$H({'id':'id','className':'class'}).each(function(pair){
var property=pair.first(),attribute=pair.last();
var value=(element[property]||'').toString();
if(value)result+=' '+attribute+'='+value.inspect(true);});
return result+'>';},
recursivelyCollect:function(element,property){
element=$(element);
var elements=[];
while(element=element[property])
if(element.nodeType==1)
elements.push(Element.extend(element));
return elements;},
ancestors:function(element){
return $(element).recursivelyCollect('parentNode');},
descendants:function(element){
element=$(element);
return $A(element.getElementsByTagName('*'));},
previousSiblings:function(element){
return $(element).recursivelyCollect('previousSibling');},
nextSiblings:function(element){
return $(element).recursivelyCollect('nextSibling');},
siblings:function(element){
element=$(element);
return element.previousSiblings().reverse().concat(element.nextSiblings());},
match:function(element,selector){
element=$(element);
if(typeof selector=='string')
selector=new Selector(selector);
return selector.match(element);},
up:function(element,expression,index){
return Selector.findElement($(element).ancestors(),expression,index);},
down:function(element,expression,index){
return Selector.findElement($(element).descendants(),expression,index);},
previous:function(element,expression,index){
return Selector.findElement($(element).previousSiblings(),expression,index);},
next:function(element,expression,index){
return Selector.findElement($(element).nextSiblings(),expression,index);},
getElementsBySelector:function(){
var args=$A(arguments),element=$(args.shift());
return Selector.findChildElements(element,args);},
getElementsByClassName:function(element,className){
element=$(element);
return document.getElementsByClassName(className,element);},
getHeight:function(element){
element=$(element);
return element.offsetHeight;},
classNames:function(element){
return new Element.ClassNames(element);},
hasClassName:function(element,className){
if(!(element=$(element)))return;
var elementClassName=element.className;
if(elementClassName.length==0)return false;
if(elementClassName==className||
elementClassName.match(new RegExp("(^|\\s)"+className+"(\\s|$)")))
return true;
return false;},
addClassName:function(element,className){
if(!(element=$(element)))return;
Element.classNames(element).add(className);
return element;},
removeClassName:function(element,className){
if(!(element=$(element)))return;
Element.classNames(element).remove(className);
return element;},
observe:function(){
Event.observe.apply(Event,arguments);
return $A(arguments).first();},
stopObserving:function(){
Event.stopObserving.apply(Event,arguments);
return $A(arguments).first();},
cleanWhitespace:function(element){
element=$(element);
var node=element.firstChild;
while(node){
var nextNode=node.nextSibling;
if(node.nodeType==3&&!/\S/.test(node.nodeValue))
element.removeChild(node);
node=nextNode;}
return element;},
empty:function(element){
return $(element).innerHTML.match(/^\s*$/);},
childOf:function(element,ancestor){
element=$(element),ancestor=$(ancestor);
while(element=element.parentNode)
if(element==ancestor)return true;
return false;},
scrollTo:function(element){
element=$(element);
var x=element.x?element.x:element.offsetLeft,
y=element.y?element.y:element.offsetTop;
window.scrollTo(x,y);
return element;},
getStyle:function(element,style){
element=$(element);
var value=element.style[style.camelize()];
if(!value){
if(document.defaultView&&document.defaultView.getComputedStyle){
var css=document.defaultView.getComputedStyle(element,null);
value=css?css.getPropertyValue(style):null;}else if(element.currentStyle){
value=element.currentStyle[style.camelize()];}}
if(window.opera&&['left','top','right','bottom'].include(style))
if(Element.getStyle(element,'position')=='static')value='auto';
return value=='auto'?null:value;},
setStyle:function(element,style){
element=$(element);
for(var name in style)
element.style[name.camelize()]=style[name];
return element;},
getDimensions:function(element){
element=$(element);
if(Element.getStyle(element,'display')!='none')
return{width:element.offsetWidth,height:element.offsetHeight};
var els=element.style;
var originalVisibility=els.visibility;
var originalPosition=els.position;
els.visibility='hidden';
els.position='absolute';
els.display='';
var originalWidth=element.clientWidth;
var originalHeight=element.clientHeight;
els.display='none';
els.position=originalPosition;
els.visibility=originalVisibility;
return{width:originalWidth,height:originalHeight};},
makePositioned:function(element){
element=$(element);
var pos=Element.getStyle(element,'position');
if(pos=='static'||!pos){
element._madePositioned=true;
element.style.position='relative';
if(window.opera){
element.style.top=0;
element.style.left=0;}}
return element;},
undoPositioned:function(element){
element=$(element);
if(element._madePositioned){
element._madePositioned=undefined;
element.style.position=
element.style.top=
element.style.left=
element.style.bottom=
element.style.right='';}
return element;},
makeClipping:function(element){
element=$(element);
if(element._overflow)return element;
element._overflow=element.style.overflow||'auto';
if((Element.getStyle(element,'overflow')||'visible')!='hidden')
element.style.overflow='hidden';
return element;},
undoClipping:function(element){
element=$(element);
if(!element._overflow)return element;
element.style.overflow=element._overflow=='auto'?'':element._overflow;
element._overflow=null;
return element;}}
Element.Methods.Simulated={
hasAttribute:function(element,attribute){
return $(element).getAttributeNode(attribute).specified;}}
if(document.all){
Element.Methods.update=function(element,html){
element=$(element);
html=typeof html=='undefined'?'':html.toString();
var tagName=element.tagName.toUpperCase();
if(['THEAD','TBODY','TR','TD'].indexOf(tagName)>-1){
var div=document.createElement('div');
switch(tagName){
case 'THEAD':
case 'TBODY':
div.innerHTML='<table><tbody>'+html.stripScripts()+'</tbody></table>';
depth=2;
break;
case 'TR':
div.innerHTML='<table><tbody><tr>'+html.stripScripts()+'</tr></tbody></table>';
depth=3;
break;
case 'TD':
div.innerHTML='<table><tbody><tr><td>'+html.stripScripts()+'</td></tr></tbody></table>';
depth=4;}
$A(element.childNodes).each(function(node){
element.removeChild(node)});
depth.times(function(){div=div.firstChild});
$A(div.childNodes).each(
function(node){element.appendChild(node)});}else{
element.innerHTML=html.stripScripts();}
setTimeout(function(){html.evalScripts()},10);
return element;}}
Object.extend(Element,Element.Methods);
var _nativeExtensions=false;
if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))['','Form','Input','TextArea','Select'].each(function(tag){
var className='HTML'+tag+'Element';
if(window[className])return;
var klass=window[className]={};
klass.prototype=document.createElement(tag?tag.toLowerCase():'div').__proto__;});
Element.addMethods=function(methods){
Object.extend(Element.Methods,methods||{});
function copy(methods,destination,onlyIfAbsent){
onlyIfAbsent=onlyIfAbsent||false;
var cache=Element.extend.cache;
for(var property in methods){
var value=methods[property];
if(!onlyIfAbsent||!(property in destination))
destination[property]=cache.findOrStore(value);}}
if(typeof HTMLElement!='undefined'){
copy(Element.Methods,HTMLElement.prototype);
copy(Element.Methods.Simulated,HTMLElement.prototype,true);
copy(Form.Methods,HTMLFormElement.prototype);[HTMLInputElement,HTMLTextAreaElement,HTMLSelectElement].each(function(klass){
copy(Form.Element.Methods,klass.prototype);});
_nativeExtensions=true;}}
var Toggle=new Object();
Toggle.display=Element.toggle;
Abstract.Insertion=function(adjacency){
this.adjacency=adjacency;}
Abstract.Insertion.prototype={
initialize:function(element,content){
this.element=$(element);
this.content=content.stripScripts();
if(this.adjacency&&this.element.insertAdjacentHTML){
try{
this.element.insertAdjacentHTML(this.adjacency,this.content);}catch(e){
var tagName=this.element.tagName.toLowerCase();
if(tagName=='tbody'||tagName=='tr'){
this.insertContent(this.contentFromAnonymousTable());}else{
throw e;}}}else{
this.range=this.element.ownerDocument.createRange();
if(this.initializeRange)this.initializeRange();
this.insertContent([this.range.createContextualFragment(this.content)]);}
setTimeout(function(){content.evalScripts()},10);},
contentFromAnonymousTable:function(){
var div=document.createElement('div');
div.innerHTML='<table><tbody>'+this.content+'</tbody></table>';
return $A(div.childNodes[0].childNodes[0].childNodes);}}
var Insertion=new Object();
Insertion.Before=Class.create();
Insertion.Before.prototype=Object.extend(new Abstract.Insertion('beforeBegin'),{
initializeRange:function(){
this.range.setStartBefore(this.element);},
insertContent:function(fragments){
fragments.each((function(fragment){
this.element.parentNode.insertBefore(fragment,this.element);}).bind(this));}});
Insertion.Top=Class.create();
Insertion.Top.prototype=Object.extend(new Abstract.Insertion('afterBegin'),{
initializeRange:function(){
this.range.selectNodeContents(this.element);
this.range.collapse(true);},
insertContent:function(fragments){
fragments.reverse(false).each((function(fragment){
this.element.insertBefore(fragment,this.element.firstChild);}).bind(this));}});
Insertion.Bottom=Class.create();
Insertion.Bottom.prototype=Object.extend(new Abstract.Insertion('beforeEnd'),{
initializeRange:function(){
this.range.selectNodeContents(this.element);
this.range.collapse(this.element);},
insertContent:function(fragments){
fragments.each((function(fragment){
this.element.appendChild(fragment);}).bind(this));}});
Insertion.After=Class.create();
Insertion.After.prototype=Object.extend(new Abstract.Insertion('afterEnd'),{
initializeRange:function(){
this.range.setStartAfter(this.element);},
insertContent:function(fragments){
fragments.each((function(fragment){
this.element.parentNode.insertBefore(fragment,
this.element.nextSibling);}).bind(this));}});
Element.ClassNames=Class.create();
Element.ClassNames.prototype={
initialize:function(element){
this.element=$(element);},
_each:function(iterator){
this.element.className.split(/\s+/).select(function(name){
return name.length>0;})._each(iterator);},
set:function(className){
this.element.className=className;},
add:function(classNameToAdd){
if(this.include(classNameToAdd))return;
this.set($A(this).concat(classNameToAdd).join(' '));},
remove:function(classNameToRemove){
if(!this.include(classNameToRemove))return;
this.set($A(this).without(classNameToRemove).join(' '));},
toString:function(){
return $A(this).join(' ');}}
Object.extend(Element.ClassNames.prototype,Enumerable);
var Selector=Class.create();
Selector.prototype={
initialize:function(expression){
this.params={classNames:[]};
this.expression=expression.toString().strip();
this.parseExpression();
this.compileMatcher();},
parseExpression:function(){
function abort(message){throw 'Parse error in selector: '+message;}
if(this.expression=='')abort('empty expression');
var params=this.params,expr=this.expression,match,modifier,clause,rest;
while(match=expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)){
params.attributes=params.attributes||[];
params.attributes.push({name:match[2],operator:match[3],value:match[4]||match[5]||''});
expr=match[1];}
if(expr=='*')return this.params.wildcard=true;
while(match=expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)){
modifier=match[1],clause=match[2],rest=match[3];
switch(modifier){
case '#':params.id=clause;break;
case '.':params.classNames.push(clause);break;
case '':
case undefined:params.tagName=clause.toUpperCase();break;
default:abort(expr.inspect());}
expr=rest;}
if(expr.length>0)abort(expr.inspect());},
buildMatchExpression:function(){
var params=this.params,conditions=[],clause;
if(params.wildcard)
conditions.push('true');
if(clause=params.id)
conditions.push('element.id == '+clause.inspect());
if(clause=params.tagName)
conditions.push('element.tagName.toUpperCase() == '+clause.inspect());
if((clause=params.classNames).length>0)
for(var i=0;i<clause.length;i++)
conditions.push('Element.hasClassName(element, '+clause[i].inspect()+')');
if(clause=params.attributes){
clause.each(function(attribute){
var value='element.getAttribute('+attribute.name.inspect()+')';
var splitValueBy=function(delimiter){
return value+' && '+value+'.split('+delimiter.inspect()+')';}
switch(attribute.operator){
case '=':conditions.push(value+' == '+attribute.value.inspect());break;
case '~=':conditions.push(splitValueBy(' ')+'.include('+attribute.value.inspect()+')');break;
case '|=':conditions.push(
splitValueBy('-')+'.first().toUpperCase() == '+attribute.value.toUpperCase().inspect());break;
case '!=':conditions.push(value+' != '+attribute.value.inspect());break;
case '':
case undefined:conditions.push(value+' != null');break;
default:throw 'Unknown operator '+attribute.operator+' in selector';}});}
return conditions.join(' && ');},
compileMatcher:function(){
this.match=new Function('element','if(!element.tagName)return false;\
return '+this.buildMatchExpression());},
findElements:function(scope){
var element;
if(element=$(this.params.id))
if(this.match(element))
if(!scope||Element.childOf(element,scope))
return[element];
scope=(scope||document).getElementsByTagName(this.params.tagName||'*');
var results=[];
for(var i=0,length=scope.length;i<length;i++)
if(this.match(element=scope[i]))
results.push(Element.extend(element));
return results;},
toString:function(){
return this.expression;}}
Object.extend(Selector,{
matchElements:function(elements,expression){
var selector=new Selector(expression);
return elements.select(selector.match.bind(selector)).collect(Element.extend);},
findElement:function(elements,expression,index){
if(typeof expression=='number')index=expression,expression=false;
return Selector.matchElements(elements,expression||'*')[index||0];},
findChildElements:function(element,expressions){
return expressions.map(function(expression){
return expression.strip().split(/\s+/).inject([null],function(results,expr){
var selector=new Selector(expr);
return results.inject([],function(elements,result){
return elements.concat(selector.findElements(result||element));});});}).flatten();}});
function $$(){
return Selector.findChildElements(document,$A(arguments));}
var Form={
reset:function(form){
$(form).reset();
return form;},
serializeElements:function(elements){
return elements.inject([],function(queryComponents,element){
var queryComponent=Form.Element.serialize(element);
if(queryComponent)queryComponents.push(queryComponent);
return queryComponents;}).join('&');}};
Form.Methods={
serialize:function(form){
return Form.serializeElements($(form).getElements());},
getElements:function(form){
return $A($(form).getElementsByTagName('*')).inject([],
function(elements,child){
if(Form.Element.Serializers[child.tagName.toLowerCase()])
elements.push(Element.extend(child));
return elements;});},
getInputs:function(form,typeName,name){
form=$(form);
var inputs=form.getElementsByTagName('input');
if(!typeName&&!name)
return inputs;
var matchingInputs=new Array();
for(var i=0,length=inputs.length;i<length;i++){
var input=inputs[i];
if((typeName&&input.type!=typeName)||(name&&input.name!=name))
continue;
matchingInputs.push(Element.extend(input));}
return matchingInputs;},
disable:function(form){
form=$(form);
form.getElements().each(function(element){
element.blur();
element.disabled='true';});
return form;},
enable:function(form){
form=$(form);
form.getElements().each(function(element){
element.disabled='';});
return form;},
findFirstElement:function(form){
return $(form).getElements().find(function(element){
return element.type!='hidden'&&!element.disabled&&['input','select','textarea'].include(element.tagName.toLowerCase());});},
focusFirstElement:function(form){
form=$(form);
form.findFirstElement().activate();
return form;}}
Object.extend(Form,Form.Methods);
Form.Element={
focus:function(element){
$(element).focus();
return element;},
select:function(element){
$(element).select();
return element;}}
Form.Element.Methods={
serialize:function(element){
element=$(element);
if(element.disabled)return '';
var method=element.tagName.toLowerCase();
var parameter=Form.Element.Serializers[method](element);
if(parameter){
var key=encodeURIComponent(parameter[0]);
if(key.length==0)return;
if(parameter[1].constructor !=Array)
parameter[1]=[parameter[1]];
return parameter[1].map(function(value){
return key+'='+encodeURIComponent(value);}).join('&');}},
getValue:function(element){
element=$(element);
var method=element.tagName.toLowerCase();
var parameter=Form.Element.Serializers[method](element);
if(parameter)
return parameter[1];},
clear:function(element){
$(element).value='';
return element;},
present:function(element){
return $(element).value!='';},
activate:function(element){
element=$(element);
element.focus();
if(element.select)
element.select();
return element;},
disable:function(element){
element=$(element);
element.disabled=true;
return element;},
enable:function(element){
element=$(element);
element.blur();
element.disabled=false;
return element;}}
Object.extend(Form.Element,Form.Element.Methods);
var Field=Form.Element;
Form.Element.Serializers={
input:function(element){
switch(element.type.toLowerCase()){
case 'checkbox':
case 'radio':
return Form.Element.Serializers.inputSelector(element);
default:
return Form.Element.Serializers.textarea(element);}
return false;},
inputSelector:function(element){
if(element.checked)
return[element.name,element.value];},
textarea:function(element){
return[element.name,element.value];},
select:function(element){
return Form.Element.Serializers[element.type=='select-one'?
'selectOne':'selectMany'](element);},
selectOne:function(element){
var value='',opt,index=element.selectedIndex;
if(index>=0){
opt=Element.extend(element.options[index]);
value=opt.hasAttribute('value')?opt.value:opt.text;}
return[element.name,value];},
selectMany:function(element){
var value=[];
for(var i=0;i<element.length;i++){
var opt=Element.extend(element.options[i]);
if(opt.selected)
value.push(opt.hasAttribute('value')?opt.value:opt.text);}
return[element.name,value];}}
var $F=Form.Element.getValue;
Abstract.TimedObserver=function(){}
Abstract.TimedObserver.prototype={
initialize:function(element,frequency,callback){
this.frequency=frequency;
this.element=$(element);
this.callback=callback;
this.lastValue=this.getValue();
this.registerCallback();},
registerCallback:function(){
setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},
onTimerEvent:function(){
var value=this.getValue();
if(this.lastValue!=value){
this.callback(this.element,value);
this.lastValue=value;}}}
Form.Element.Observer=Class.create();
Form.Element.Observer.prototype=Object.extend(new Abstract.TimedObserver(),{
getValue:function(){
return Form.Element.getValue(this.element);}});
Form.Observer=Class.create();
Form.Observer.prototype=Object.extend(new Abstract.TimedObserver(),{
getValue:function(){
return Form.serialize(this.element);}});
Abstract.EventObserver=function(){}
Abstract.EventObserver.prototype={
initialize:function(element,callback){
this.element=$(element);
this.callback=callback;
this.lastValue=this.getValue();
if(this.element.tagName.toLowerCase()=='form')
this.registerFormCallbacks();
else
this.registerCallback(this.element);},
onElementEvent:function(){
var value=this.getValue();
if(this.lastValue!=value){
this.callback(this.element,value);
this.lastValue=value;}},
registerFormCallbacks:function(){
Form.getElements(this.element).each(this.registerCallback.bind(this));},
registerCallback:function(element){
if(element.type){
switch(element.type.toLowerCase()){
case 'checkbox':
case 'radio':
Event.observe(element,'click',this.onElementEvent.bind(this));
break;
default:
Event.observe(element,'change',this.onElementEvent.bind(this));
break;}}}}
Form.Element.EventObserver=Class.create();
Form.Element.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{
getValue:function(){
return Form.Element.getValue(this.element);}});
Form.EventObserver=Class.create();
Form.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{
getValue:function(){
return Form.serialize(this.element);}});
if(!window.Event){
var Event=new Object();}
Object.extend(Event,{
KEY_BACKSPACE:8,
KEY_TAB:9,
KEY_RETURN:13,
KEY_ESC:27,
KEY_LEFT:37,
KEY_UP:38,
KEY_RIGHT:39,
KEY_DOWN:40,
KEY_DELETE:46,
KEY_HOME:36,
KEY_END:35,
KEY_PAGEUP:33,
KEY_PAGEDOWN:34,
element:function(event){
return event.target||event.srcElement;},
isLeftClick:function(event){
return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},
pointerX:function(event){
return event.pageX||(event.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft));},
pointerY:function(event){
return event.pageY||(event.clientY+(document.documentElement.scrollTop||document.body.scrollTop));},
stop:function(event){
if(event.preventDefault){
event.preventDefault();
event.stopPropagation();}else{
event.returnValue=false;
event.cancelBubble=true;}},
findElement:function(event,tagName){
var element=Event.element(event);
while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase())))
element=element.parentNode;
return element;},
observers:false,
_observeAndCache:function(element,name,observer,useCapture){
if(!this.observers)this.observers=[];
if(element.addEventListener){
this.observers.push([element,name,observer,useCapture]);
element.addEventListener(name,observer,useCapture);}else if(element.attachEvent){
this.observers.push([element,name,observer,useCapture]);
element.attachEvent('on'+name,observer);}},
unloadCache:function(){
if(!Event.observers)return;
for(var i=0,length=Event.observers.length;i<length;i++){
Event.stopObserving.apply(this,Event.observers[i]);
Event.observers[i][0]=null;}
Event.observers=false;},
observe:function(element,name,observer,useCapture){
element=$(element);
useCapture=useCapture||false;
if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent))
name='keydown';
Event._observeAndCache(element,name,observer,useCapture);},
stopObserving:function(element,name,observer,useCapture){
element=$(element);
useCapture=useCapture||false;
if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent))
name='keydown';
if(element.removeEventListener){
element.removeEventListener(name,observer,useCapture);}else if(element.detachEvent){
try{
element.detachEvent('on'+name,observer);}catch(e){}}}});
if(navigator.appVersion.match(/\bMSIE\b/))
Event.observe(window,'unload',Event.unloadCache,false);
var Position={
includeScrollOffsets:false,
prepare:function(){
this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;
this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;},
realOffset:function(element){
var valueT=0,valueL=0;
do{
valueT+=element.scrollTop||0;
valueL+=element.scrollLeft||0;
element=element.parentNode;}while(element);
return[valueL,valueT];},
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];},
positionedOffset:function(element){
var valueT=0,valueL=0;
do{
valueT+=element.offsetTop||0;
valueL+=element.offsetLeft||0;
element=element.offsetParent;
if(element){
if(element.tagName=='BODY')break;
var p=Element.getStyle(element,'position');
if(p=='relative'||p=='absolute')break;}}while(element);
return[valueL,valueT];},
offsetParent:function(element){
if(element.offsetParent)return element.offsetParent;
if(element==document.body)return element;
while((element=element.parentNode)&&element!=document.body)
if(Element.getStyle(element,'position')!='static')
return element;
return document.body;},
within:function(element,x,y){
if(this.includeScrollOffsets)
return this.withinIncludingScrolloffsets(element,x,y);
this.xcomp=x;
this.ycomp=y;
this.offset=this.cumulativeOffset(element);
return(y>=this.offset[1]&&
y<this.offset[1]+element.offsetHeight&&
x>=this.offset[0]&&
x<this.offset[0]+element.offsetWidth);},
withinIncludingScrolloffsets:function(element,x,y){
var offsetcache=this.realOffset(element);
this.xcomp=x+offsetcache[0]-this.deltaX;
this.ycomp=y+offsetcache[1]-this.deltaY;
this.offset=this.cumulativeOffset(element);
return(this.ycomp>=this.offset[1]&&
this.ycomp<this.offset[1]+element.offsetHeight&&
this.xcomp>=this.offset[0]&&
this.xcomp<this.offset[0]+element.offsetWidth);},
overlap:function(mode,element){
if(!mode)return 0;
if(mode=='vertical')
return((this.offset[1]+element.offsetHeight)-this.ycomp)/
element.offsetHeight;
if(mode=='horizontal')
return((this.offset[0]+element.offsetWidth)-this.xcomp)/
element.offsetWidth;},
page:function(forElement){
var valueT=0,valueL=0;
var element=forElement;
do{
valueT+=element.offsetTop||0;
valueL+=element.offsetLeft||0;
if(element.offsetParent==document.body)
if(Element.getStyle(element,'position')=='absolute')break;}while(element=element.offsetParent);
element=forElement;
do{
if(!window.opera||element.tagName=='BODY'){
valueT-=element.scrollTop||0;
valueL-=element.scrollLeft||0;}}while(element=element.parentNode);
return[valueL,valueT];},
clone:function(source,target){
var options=Object.extend({
setLeft:true,
setTop:true,
setWidth:true,
setHeight:true,
offsetTop:0,
offsetLeft:0},arguments[2]||{})
source=$(source);
var p=Position.page(source);
target=$(target);
var delta=[0,0];
var parent=null;
if(Element.getStyle(target,'position')=='absolute'){
parent=Position.offsetParent(target);
delta=Position.page(parent);}
if(parent==document.body){
delta[0]-=document.body.offsetLeft;
delta[1]-=document.body.offsetTop;}
if(options.setLeft)target.style.left=(p[0]-delta[0]+options.offsetLeft)+'px';
if(options.setTop)target.style.top=(p[1]-delta[1]+options.offsetTop)+'px';
if(options.setWidth)target.style.width=source.offsetWidth+'px';
if(options.setHeight)target.style.height=source.offsetHeight+'px';},
absolutize:function(element){
element=$(element);
if(element.style.position=='absolute')return;
Position.prepare();
var offsets=Position.positionedOffset(element);
var top=offsets[1];
var left=offsets[0];
var width=element.clientWidth;
var height=element.clientHeight;
element._originalLeft=left-parseFloat(element.style.left||0);
element._originalTop=top-parseFloat(element.style.top||0);
element._originalWidth=element.style.width;
element._originalHeight=element.style.height;
element.style.position='absolute';
element.style.top=top+'px';;
element.style.left=left+'px';;
element.style.width=width+'px';;
element.style.height=height+'px';;},
relativize:function(element){
element=$(element);
if(element.style.position=='relative')return;
Position.prepare();
element.style.position='relative';
var top=parseFloat(element.style.top||0)-(element._originalTop||0);
var left=parseFloat(element.style.left||0)-(element._originalLeft||0);
element.style.top=top+'px';
element.style.left=left+'px';
element.style.height=element._originalHeight;
element.style.width=element._originalWidth;}}
if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){
Position.cumulativeOffset=function(element){
var valueT=0,valueL=0;
do{
valueT+=element.offsetTop||0;
valueL+=element.offsetLeft||0;
if(element.offsetParent==document.body)
if(Element.getStyle(element,'position')=='absolute')break;
element=element.offsetParent;}while(element);
return[valueL,valueT];}}
Element.addMethods();
var Rico={
Version:'1.1.2',
prototypeVersion:parseFloat(Prototype.Version.split(".")[0]+"."+Prototype.Version.split(".")[1])}
if((typeof Prototype=='undefined')||Rico.prototypeVersion<1.3)
throw("Rico requires the Prototype JavaScript framework >= 1.3");
Rico.ArrayExtensions=new Array();
if(Object.prototype.extend){
Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Object.prototype.extend;}else{
Object.prototype.extend=function(object){
return Object.extend.apply(this,[this,object]);}
Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Object.prototype.extend;}
if(Array.prototype.push){
Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.push;}
if(!Array.prototype.remove){
Array.prototype.remove=function(dx){
if(isNaN(dx)||dx>this.length)
return false;
for(var i=0,n=0;i<this.length;i++)
if(i!=dx)
this[n++]=this[i];
this.length-=1;};
Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.remove;}
if(!Array.prototype.removeItem){
Array.prototype.removeItem=function(item){
for(var i=0;i<this.length;i++)
if(this[i]==item){
this.remove(i);
break;}};
Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.removeItem;}
if(!Array.prototype.indices){
Array.prototype.indices=function(){
var indexArray=new Array();
for(index in this){
var ignoreThis=false;
for(var i=0;i<Rico.ArrayExtensions.length;i++){
if(this[index]==Rico.ArrayExtensions[i]){
ignoreThis=true;
break;}}
if(!ignoreThis)
indexArray[indexArray.length]=index;}
return indexArray;}
Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.indices;}
if(window.DOMParser&&
window.XMLSerializer&&
window.Node&&Node.prototype&&Node.prototype.__defineGetter__){
if(!Document.prototype.loadXML){
Document.prototype.loadXML=function(s){
var doc2=(new DOMParser()).parseFromString(s,"text/xml");
while(this.hasChildNodes())
this.removeChild(this.lastChild);
for(var i=0;i<doc2.childNodes.length;i++){
this.appendChild(this.importNode(doc2.childNodes[i],true));}};}
Document.prototype.__defineGetter__("xml",
function(){
return(new XMLSerializer()).serializeToString(this);});}
document.getElementsByTagAndClassName=function(tagName,className){
if(tagName==null)
tagName='*';
var children=document.getElementsByTagName(tagName)||document.all;
var elements=new Array();
if(className==null)
return children;
for(var i=0;i<children.length;i++){
var child=children[i];
var classNames=child.className.split(' ');
for(var j=0;j<classNames.length;j++){
if(classNames[j]==className){
elements.push(child);
break;}}}
return elements;}
Rico.Accordion=Class.create();
Rico.Accordion.prototype={
initialize:function(container,options){
this.container=$(container);
this.lastExpandedTab=null;
this.accordionTabs=new Array();
this.setOptions(options);
this._attachBehaviors();
if(!container)return;
this.container.style.borderBottom='1px solid '+this.options.borderColor;
if(this.options.onLoadShowTab>=this.accordionTabs.length)
this.options.onLoadShowTab=0;
for(var i=0;i<this.accordionTabs.length;i++){
if(i!=this.options.onLoadShowTab){
this.accordionTabs[i].collapse();
this.accordionTabs[i].content.style.display='none';}}
this.lastExpandedTab=this.accordionTabs[this.options.onLoadShowTab];
if(this.options.panelHeight=='auto'){
var tabToCheck=(this.options.onloadShowTab===0)?1:0;
var titleBarSize=parseInt(RicoUtil.getElementsComputedStyle(this.accordionTabs[tabToCheck].titleBar,'height'));
if(isNaN(titleBarSize))
titleBarSize=this.accordionTabs[tabToCheck].titleBar.offsetHeight;
var totalTitleBarSize=this.accordionTabs.length*titleBarSize;
var parentHeight=parseInt(RicoUtil.getElementsComputedStyle(this.container.parentNode,'height'));
if(isNaN(parentHeight))
parentHeight=this.container.parentNode.offsetHeight;
this.options.panelHeight=parentHeight-totalTitleBarSize-2;}
this.lastExpandedTab.content.style.height=this.options.panelHeight+"px";
this.lastExpandedTab.showExpanded();
this.lastExpandedTab.titleBar.style.fontWeight=this.options.expandedFontWeight;},
setOptions:function(options){
this.options={
expandedBg:'#63699c',
hoverBg:'#63699c',
collapsedBg:'#6b79a5',
expandedTextColor:'#ffffff',
expandedFontWeight:'bold',
hoverTextColor:'#ffffff',
collapsedTextColor:'#ced7ef',
collapsedFontWeight:'normal',
hoverTextColor:'#ffffff',
borderColor:'#1f669b',
panelHeight:200,
onHideTab:null,
onShowTab:null,
onLoadShowTab:0}
Object.extend(this.options,options||{});},
showTabByIndex:function(anIndex,animate){
var doAnimate=arguments.length==1?true:animate;
this.showTab(this.accordionTabs[anIndex],doAnimate);},
showTab:function(accordionTab,animate){
if(this.lastExpandedTab==accordionTab)
return;
var doAnimate=arguments.length==1?true:animate;
if(this.options.onHideTab)
this.options.onHideTab(this.lastExpandedTab);
this.lastExpandedTab.showCollapsed();
var accordion=this;
var lastExpandedTab=this.lastExpandedTab;
this.lastExpandedTab.content.style.height=(this.options.panelHeight-1)+'px';
accordionTab.content.style.display='';
accordionTab.titleBar.style.fontWeight=this.options.expandedFontWeight;
if(doAnimate){
new Rico.Effect.AccordionSize(this.lastExpandedTab.content,
accordionTab.content,
1,
this.options.panelHeight,
100,10,{complete:function(){accordion.showTabDone(lastExpandedTab)}});
this.lastExpandedTab=accordionTab;}
else{
this.lastExpandedTab.content.style.height="1px";
accordionTab.content.style.height=this.options.panelHeight+"px";
this.lastExpandedTab=accordionTab;
this.showTabDone(lastExpandedTab);}},
showTabDone:function(collapsedTab){
collapsedTab.content.style.display='none';
this.lastExpandedTab.showExpanded();
if(this.options.onShowTab)
this.options.onShowTab(this.lastExpandedTab);},
_attachBehaviors:function(){
var panels=this._getDirectChildrenByTag(this.container,'DIV');
for(var i=0;i<panels.length;i++){
var tabChildren=this._getDirectChildrenByTag(panels[i],'DIV');
if(tabChildren.length!=2)
continue;
var tabTitleBar=tabChildren[0];
var tabContentBox=tabChildren[1];
this.accordionTabs.push(new Rico.Accordion.Tab(this,tabTitleBar,tabContentBox));}},
_getDirectChildrenByTag:function(e,tagName){
var kids=new Array();
var allKids=e.childNodes;
for(var i=0;i<allKids.length;i++)
if(allKids[i]&&allKids[i].tagName&&allKids[i].tagName==tagName)
kids.push(allKids[i]);
return kids;}};
Rico.Accordion.Tab=Class.create();
Rico.Accordion.Tab.prototype={
initialize:function(accordion,titleBar,content){
this.accordion=accordion;
this.titleBar=titleBar;
this.content=content;
this._attachBehaviors();},
collapse:function(){
this.showCollapsed();
this.content.style.height="1px";},
showCollapsed:function(){
this.expanded=false;
this.titleBar.style.backgroundColor=this.accordion.options.collapsedBg;
this.titleBar.style.color=this.accordion.options.collapsedTextColor;
this.titleBar.style.fontWeight=this.accordion.options.collapsedFontWeight;
this.content.style.overflow="hidden";},
showExpanded:function(){
this.expanded=true;
this.titleBar.style.backgroundColor=this.accordion.options.expandedBg;
this.titleBar.style.color=this.accordion.options.expandedTextColor;
this.content.style.overflow="auto";},
titleBarClicked:function(e){
if(this.accordion.lastExpandedTab==this)
return;
this.accordion.showTab(this);},
hover:function(e){
this.titleBar.style.backgroundColor=this.accordion.options.hoverBg;
this.titleBar.style.color=this.accordion.options.hoverTextColor;},
unhover:function(e){
if(this.expanded){
this.titleBar.style.backgroundColor=this.accordion.options.expandedBg;
this.titleBar.style.color=this.accordion.options.expandedTextColor;}
else{
this.titleBar.style.backgroundColor=this.accordion.options.collapsedBg;
this.titleBar.style.color=this.accordion.options.collapsedTextColor;}},
_attachBehaviors:function(){
this.content.style.border="1px solid "+this.accordion.options.borderColor;
this.content.style.borderTopWidth="0px";
this.content.style.borderBottomWidth="0px";
this.content.style.margin="0px";
this.titleBar.onclick=this.titleBarClicked.bindAsEventListener(this);
this.titleBar.onmouseover=this.hover.bindAsEventListener(this);
this.titleBar.onmouseout=this.unhover.bindAsEventListener(this);}};
Rico.AjaxEngine=Class.create();
Rico.AjaxEngine.prototype={
initialize:function(){
this.ajaxElements=new Array();
this.ajaxObjects=new Array();
this.requestURLS=new Array();
this.options={};},
registerAjaxElement:function(anId,anElement){
if(!anElement)
anElement=$(anId);
this.ajaxElements[anId]=anElement;},
registerAjaxObject:function(anId,anObject){
this.ajaxObjects[anId]=anObject;},
registerRequest:function(requestLogicalName,requestURL){
this.requestURLS[requestLogicalName]=requestURL;},
sendRequest:function(requestName,options){
if(arguments.length>=2)
if(typeof arguments[1]=='string')
options={parameters:this._createQueryString(arguments,1)};
this.sendRequestWithData(requestName,null,options);},
sendRequestWithData:function(requestName,xmlDocument,options){
var requestURL=this.requestURLS[requestName];
if(requestURL==null)
return;
if(arguments.length>=3)
if(typeof arguments[2]=='string')
options.parameters=this._createQueryString(arguments,2);
new Ajax.Request(requestURL,this._requestOptions(options,xmlDocument));},
sendRequestAndUpdate:function(requestName,container,options){
if(arguments.length>=3)
if(typeof arguments[2]=='string')
options.parameters=this._createQueryString(arguments,2);
this.sendRequestWithDataAndUpdate(requestName,null,container,options);},
sendRequestWithDataAndUpdate:function(requestName,xmlDocument,container,options){
var requestURL=this.requestURLS[requestName];
if(requestURL==null)
return;
if(arguments.length>=4)
if(typeof arguments[3]=='string')
options.parameters=this._createQueryString(arguments,3);
var updaterOptions=this._requestOptions(options,xmlDocument);
new Ajax.Updater(container,requestURL,updaterOptions);},
_requestOptions:function(options,xmlDoc){
var requestHeaders=['X-Rico-Version',Rico.Version];
var sendMethod='post';
if(xmlDoc==null)
if(Rico.prototypeVersion<1.4)
requestHeaders.push('Content-type','text/xml');
else
sendMethod='get';(!options)?options={}:'';
if(!options._RicoOptionsProcessed){
if(options.onComplete)
options.onRicoComplete=options.onComplete;
if(options.overrideOnComplete)
options.onComplete=options.overrideOnComplete;
else
options.onComplete=this._onRequestComplete.bind(this);
options._RicoOptionsProcessed=true;}
this.options={
requestHeaders:requestHeaders,
parameters:options.parameters,
postBody:xmlDoc,
method:sendMethod,
onComplete:options.onComplete};
Object.extend(this.options,options);
return this.options;},
_createQueryString:function(theArgs,offset){
var queryString=""
for(var i=offset;i<theArgs.length;i++){
if(i!=offset)
queryString+="&";
var anArg=theArgs[i];
if(anArg.name!=undefined&&anArg.value!=undefined){
queryString+=anArg.name+"="+escape(anArg.value);}
else{
var ePos=anArg.indexOf('=');
var argName=anArg.substring(0,ePos);
var argValue=anArg.substring(ePos+1);
queryString+=argName+"="+escape(argValue);}}
return queryString;},
_onRequestComplete:function(request){
if(!request)
return;
if(request.status!=200)
return;
var response=request.responseXML.getElementsByTagName("ajax-response");
if(response==null||response.length!=1)
return;
this._processAjaxResponse(response[0].childNodes);
var onRicoComplete=this.options.onRicoComplete;
if(onRicoComplete!=null)
onRicoComplete();},
_processAjaxResponse:function(xmlResponseElements){
for(var i=0;i<xmlResponseElements.length;i++){
var responseElement=xmlResponseElements[i];
if(responseElement.nodeType!=1)
continue;
var responseType=responseElement.getAttribute("type");
var responseId=responseElement.getAttribute("id");
if(responseType=="object")
this._processAjaxObjectUpdate(this.ajaxObjects[responseId],responseElement);
else if(responseType=="element")
this._processAjaxElementUpdate(this.ajaxElements[responseId],responseElement);
else
alert('unrecognized AjaxResponse type : '+responseType);}},
_processAjaxObjectUpdate:function(ajaxObject,responseElement){
ajaxObject.ajaxUpdate(responseElement);},
_processAjaxElementUpdate:function(ajaxElement,responseElement){
ajaxElement.innerHTML=RicoUtil.getContentAsString(responseElement);}}
var ajaxEngine=new Rico.AjaxEngine();
Rico.Color=Class.create();
Rico.Color.prototype={
initialize:function(red,green,blue){
this.rgb={r:red,g:green,b:blue};},
setRed:function(r){
this.rgb.r=r;},
setGreen:function(g){
this.rgb.g=g;},
setBlue:function(b){
this.rgb.b=b;},
setHue:function(h){
var hsb=this.asHSB();
hsb.h=h;
this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},
setSaturation:function(s){
var hsb=this.asHSB();
hsb.s=s;
this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},
setBrightness:function(b){
var hsb=this.asHSB();
hsb.b=b;
this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},
darken:function(percent){
var hsb=this.asHSB();
this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.max(hsb.b-percent,0));},
brighten:function(percent){
var hsb=this.asHSB();
this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.min(hsb.b+percent,1));},
blend:function(other){
this.rgb.r=Math.floor((this.rgb.r+other.rgb.r)/2);
this.rgb.g=Math.floor((this.rgb.g+other.rgb.g)/2);
this.rgb.b=Math.floor((this.rgb.b+other.rgb.b)/2);},
isBright:function(){
var hsb=this.asHSB();
return this.asHSB().b>0.5;},
isDark:function(){
return !this.isBright();},
asRGB:function(){
return "rgb("+this.rgb.r+","+this.rgb.g+","+this.rgb.b+")";},
asHex:function(){
return "#"+this.rgb.r.toColorPart()+this.rgb.g.toColorPart()+this.rgb.b.toColorPart();},
asHSB:function(){
return Rico.Color.RGBtoHSB(this.rgb.r,this.rgb.g,this.rgb.b);},
toString:function(){
return this.asHex();}};
Rico.Color.createFromHex=function(hexCode){
if(hexCode.length==4){
var shortHexCode=hexCode;
var hexCode='#';
for(var i=1;i<4;i++)hexCode+=(shortHexCode.charAt(i)+
shortHexCode.charAt(i));}
if(hexCode.indexOf('#')==0)
hexCode=hexCode.substring(1);
var red=hexCode.substring(0,2);
var green=hexCode.substring(2,4);
var blue=hexCode.substring(4,6);
return new Rico.Color(parseInt(red,16),parseInt(green,16),parseInt(blue,16));}
Rico.Color.createColorFromBackground=function(elem){
var actualColor=RicoUtil.getElementsComputedStyle($(elem),"backgroundColor","background-color");
if(actualColor=="transparent"&&elem.parentNode)
return Rico.Color.createColorFromBackground(elem.parentNode);
if(actualColor==null)
return new Rico.Color(255,255,255);
if(actualColor.indexOf("rgb(")==0){
var colors=actualColor.substring(4,actualColor.length-1);
var colorArray=colors.split(",");
return new Rico.Color(parseInt(colorArray[0]),
parseInt(colorArray[1]),
parseInt(colorArray[2]));}
else if(actualColor.indexOf("#")==0){
return Rico.Color.createFromHex(actualColor);}
else
return new Rico.Color(255,255,255);}
Rico.Color.HSBtoRGB=function(hue,saturation,brightness){
var red=0;
var green=0;
var blue=0;
if(saturation==0){
red=parseInt(brightness*255.0+0.5);
green=red;
blue=red;}
else{
var h=(hue-Math.floor(hue))*6.0;
var f=h-Math.floor(h);
var p=brightness*(1.0-saturation);
var q=brightness*(1.0-saturation*f);
var t=brightness*(1.0-(saturation*(1.0-f)));
switch(parseInt(h)){
case 0:
red=(brightness*255.0+0.5);
green=(t*255.0+0.5);
blue=(p*255.0+0.5);
break;
case 1:
red=(q*255.0+0.5);
green=(brightness*255.0+0.5);
blue=(p*255.0+0.5);
break;
case 2:
red=(p*255.0+0.5);
green=(brightness*255.0+0.5);
blue=(t*255.0+0.5);
break;
case 3:
red=(p*255.0+0.5);
green=(q*255.0+0.5);
blue=(brightness*255.0+0.5);
break;
case 4:
red=(t*255.0+0.5);
green=(p*255.0+0.5);
blue=(brightness*255.0+0.5);
break;
case 5:
red=(brightness*255.0+0.5);
green=(p*255.0+0.5);
blue=(q*255.0+0.5);
break;}}
return{r:parseInt(red),g:parseInt(green),b:parseInt(blue)};}
Rico.Color.RGBtoHSB=function(r,g,b){
var hue;
var saturation;
var brightness;
var cmax=(r>g)?r:g;
if(b>cmax)
cmax=b;
var cmin=(r<g)?r:g;
if(b<cmin)
cmin=b;
brightness=cmax/255.0;
if(cmax!=0)
saturation=(cmax-cmin)/cmax;
else
saturation=0;
if(saturation==0)
hue=0;
else{
var redc=(cmax-r)/(cmax-cmin);
var greenc=(cmax-g)/(cmax-cmin);
var bluec=(cmax-b)/(cmax-cmin);
if(r==cmax)
hue=bluec-greenc;
else if(g==cmax)
hue=2.0+redc-bluec;
else
hue=4.0+greenc-redc;
hue=hue/6.0;
if(hue<0)
hue=hue+1.0;}
return{h:hue,s:saturation,b:brightness};}
Rico.Corner={
round:function(e,options){
var e=$(e);
this._setOptions(options);
var color=this.options.color;
if(this.options.color=="fromElement")
color=this._background(e);
var bgColor=this.options.bgColor;
if(this.options.bgColor=="fromParent")
bgColor=this._background(e.offsetParent);
this._roundCornersImpl(e,color,bgColor);},
_roundCornersImpl:function(e,color,bgColor){
if(this.options.border)
this._renderBorder(e,bgColor);
if(this._isTopRounded())
this._roundTopCorners(e,color,bgColor);
if(this._isBottomRounded())
this._roundBottomCorners(e,color,bgColor);},
_renderBorder:function(el,bgColor){
var borderValue="1px solid "+this._borderColor(bgColor);
var borderL="border-left: "+borderValue;
var borderR="border-right: "+borderValue;
var style="style='"+borderL+";"+borderR+"'";
el.innerHTML="<div "+style+">"+el.innerHTML+"</div>"},
_roundTopCorners:function(el,color,bgColor){
var corner=this._createCorner(bgColor);
for(var i=0;i<this.options.numSlices;i++)
corner.appendChild(this._createCornerSlice(color,bgColor,i,"top"));
el.style.paddingTop=0;
el.insertBefore(corner,el.firstChild);},
_roundBottomCorners:function(el,color,bgColor){
var corner=this._createCorner(bgColor);
for(var i=(this.options.numSlices-1);i>=0;i--)
corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));
el.style.paddingBottom=0;
el.appendChild(corner);},
_createCorner:function(bgColor){
var corner=document.createElement("div");
corner.style.backgroundColor=(this._isTransparent()?"transparent":bgColor);
return corner;},
_createCornerSlice:function(color,bgColor,n,position){
var slice=document.createElement("span");
var inStyle=slice.style;
inStyle.backgroundColor=color;
inStyle.display="block";
inStyle.height="1px";
inStyle.overflow="hidden";
inStyle.fontSize="1px";
var borderColor=this._borderColor(color,bgColor);
if(this.options.border&&n==0){
inStyle.borderTopStyle="solid";
inStyle.borderTopWidth="1px";
inStyle.borderLeftWidth="0px";
inStyle.borderRightWidth="0px";
inStyle.borderBottomWidth="0px";
inStyle.height="0px";
inStyle.borderColor=borderColor;}
else if(borderColor){
inStyle.borderColor=borderColor;
inStyle.borderStyle="solid";
inStyle.borderWidth="0px 1px";}
if(!this.options.compact&&(n==(this.options.numSlices-1)))
inStyle.height="2px";
this._setMargin(slice,n,position);
this._setBorder(slice,n,position);
return slice;},
_setOptions:function(options){
this.options={
corners:"all",
color:"fromElement",
bgColor:"fromParent",
blend:true,
border:false,
compact:false}
Object.extend(this.options,options||{});
this.options.numSlices=this.options.compact?2:4;
if(this._isTransparent())
this.options.blend=false;},
_whichSideTop:function(){
if(this._hasString(this.options.corners,"all","top"))
return "";
if(this.options.corners.indexOf("tl")>=0&&this.options.corners.indexOf("tr")>=0)
return "";
if(this.options.corners.indexOf("tl")>=0)
return "left";
else if(this.options.corners.indexOf("tr")>=0)
return "right";
return "";},
_whichSideBottom:function(){
if(this._hasString(this.options.corners,"all","bottom"))
return "";
if(this.options.corners.indexOf("bl")>=0&&this.options.corners.indexOf("br")>=0)
return "";
if(this.options.corners.indexOf("bl")>=0)
return "left";
else if(this.options.corners.indexOf("br")>=0)
return "right";
return "";},
_borderColor:function(color,bgColor){
if(color=="transparent")
return bgColor;
else if(this.options.border)
return this.options.border;
else if(this.options.blend)
return this._blend(bgColor,color);
else
return "";},
_setMargin:function(el,n,corners){
var marginSize=this._marginSize(n);
var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();
if(whichSide=="left"){
el.style.marginLeft=marginSize+"px";el.style.marginRight="0px";}
else if(whichSide=="right"){
el.style.marginRight=marginSize+"px";el.style.marginLeft="0px";}
else{
el.style.marginLeft=marginSize+"px";el.style.marginRight=marginSize+"px";}},
_setBorder:function(el,n,corners){
var borderSize=this._borderSize(n);
var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();
if(whichSide=="left"){
el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth="0px";}
else if(whichSide=="right"){
el.style.borderRightWidth=borderSize+"px";el.style.borderLeftWidth="0px";}
else{
el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";}
if(this.options.border!=false)
el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";},
_marginSize:function(n){
if(this._isTransparent())
return 0;
var marginSizes=[5,3,2,1];
var blendedMarginSizes=[3,2,1,0];
var compactMarginSizes=[2,1];
var smBlendedMarginSizes=[1,0];
if(this.options.compact&&this.options.blend)
return smBlendedMarginSizes[n];
else if(this.options.compact)
return compactMarginSizes[n];
else if(this.options.blend)
return blendedMarginSizes[n];
else
return marginSizes[n];},
_borderSize:function(n){
var transparentBorderSizes=[5,3,2,1];
var blendedBorderSizes=[2,1,1,1];
var compactBorderSizes=[1,0];
var actualBorderSizes=[0,2,0,0];
if(this.options.compact&&(this.options.blend||this._isTransparent()))
return 1;
else if(this.options.compact)
return compactBorderSizes[n];
else if(this.options.blend)
return blendedBorderSizes[n];
else if(this.options.border)
return actualBorderSizes[n];
else if(this._isTransparent())
return transparentBorderSizes[n];
return 0;},
_hasString:function(str){for(var i=1;i<arguments.length;i++)if(str.indexOf(arguments[i])>=0)return true;return false;},
_blend:function(c1,c2){var cc1=Rico.Color.createFromHex(c1);cc1.blend(Rico.Color.createFromHex(c2));return cc1;},
_background:function(el){try{return Rico.Color.createColorFromBackground(el).asHex();}catch(err){return "#ffffff";}},
_isTransparent:function(){return this.options.color=="transparent";},
_isTopRounded:function(){return this._hasString(this.options.corners,"all","top","tl","tr");},
_isBottomRounded:function(){return this._hasString(this.options.corners,"all","bottom","bl","br");},
_hasSingleTextChild:function(el){return el.childNodes.length==1&&el.childNodes[0].nodeType==3;}}
Rico.DragAndDrop=Class.create();
Rico.DragAndDrop.prototype={
initialize:function(){
this.dropZones=new Array();
this.draggables=new Array();
this.currentDragObjects=new Array();
this.dragElement=null;
this.lastSelectedDraggable=null;
this.currentDragObjectVisible=false;
this.interestedInMotionEvents=false;
this._mouseDown=this._mouseDownHandler.bindAsEventListener(this);
this._mouseMove=this._mouseMoveHandler.bindAsEventListener(this);
this._mouseUp=this._mouseUpHandler.bindAsEventListener(this);},
registerDropZone:function(aDropZone){
this.dropZones[this.dropZones.length]=aDropZone;},
deregisterDropZone:function(aDropZone){
var newDropZones=new Array();
var j=0;
for(var i=0;i<this.dropZones.length;i++){
if(this.dropZones[i]!=aDropZone)
newDropZones[j++]=this.dropZones[i];}
this.dropZones=newDropZones;},
clearDropZones:function(){
this.dropZones=new Array();},
registerDraggable:function(aDraggable){
this.draggables[this.draggables.length]=aDraggable;
this._addMouseDownHandler(aDraggable);},
clearSelection:function(){
for(var i=0;i<this.currentDragObjects.length;i++)
this.currentDragObjects[i].deselect();
this.currentDragObjects=new Array();
this.lastSelectedDraggable=null;},
hasSelection:function(){
return this.currentDragObjects.length>0;},
setStartDragFromElement:function(e,mouseDownElement){
this.origPos=RicoUtil.toDocumentPosition(mouseDownElement);
this.startx=e.screenX-this.origPos.x
this.starty=e.screenY-this.origPos.y
this.interestedInMotionEvents=this.hasSelection();
this._terminateEvent(e);},
updateSelection:function(draggable,extendSelection){
if(!extendSelection)
this.clearSelection();
if(draggable.isSelected()){
this.currentDragObjects.removeItem(draggable);
draggable.deselect();
if(draggable==this.lastSelectedDraggable)
this.lastSelectedDraggable=null;}
else{
this.currentDragObjects[this.currentDragObjects.length]=draggable;
draggable.select();
this.lastSelectedDraggable=draggable;}},
_mouseDownHandler:function(e){
if(arguments.length==0)
e=event;
var nsEvent=e.which!=undefined;
if((nsEvent&&e.which!=1)||(!nsEvent&&e.button!=1))
return;
var eventTarget=e.target?e.target:e.srcElement;
var draggableObject=eventTarget.draggable;
var candidate=eventTarget;
while(draggableObject==null&&candidate.parentNode){
candidate=candidate.parentNode;
draggableObject=candidate.draggable;}
if(draggableObject==null)
return;
this.updateSelection(draggableObject,e.ctrlKey);
if(this.hasSelection())
for(var i=0;i<this.dropZones.length;i++)
this.dropZones[i].clearPositionCache();
this.setStartDragFromElement(e,draggableObject.getMouseDownHTMLElement());},
_mouseMoveHandler:function(e){
var nsEvent=e.which!=undefined;
if(!this.interestedInMotionEvents){
return;}
if(!this.hasSelection())
return;
if(!this.currentDragObjectVisible)
this._startDrag(e);
if(!this.activatedDropZones)
this._activateRegisteredDropZones();
this._updateDraggableLocation(e);
this._updateDropZonesHover(e);
this._terminateEvent(e);},
_makeDraggableObjectVisible:function(e){
if(!this.hasSelection())
return;
var dragElement;
if(this.currentDragObjects.length>1)
dragElement=this.currentDragObjects[0].getMultiObjectDragGUI(this.currentDragObjects);
else
dragElement=this.currentDragObjects[0].getSingleObjectDragGUI();
if(RicoUtil.getElementsComputedStyle(dragElement,"position")!="absolute")
dragElement.style.position="absolute";
if(dragElement.parentNode==null||dragElement.parentNode.nodeType==11)
document.body.appendChild(dragElement);
this.dragElement=dragElement;
this._updateDraggableLocation(e);
this.currentDragObjectVisible=true;},
_leftOffset:function(e){
return e.offsetX?document.body.scrollLeft:0},
_topOffset:function(e){
return e.offsetY?document.body.scrollTop:0},
_updateDraggableLocation:function(e){
var dragObjectStyle=this.dragElement.style;
dragObjectStyle.left=(e.screenX+this._leftOffset(e)-this.startx)+"px"
dragObjectStyle.top=(e.screenY+this._topOffset(e)-this.starty)+"px";},
_updateDropZonesHover:function(e){
var n=this.dropZones.length;
for(var i=0;i<n;i++){
if(!this._mousePointInDropZone(e,this.dropZones[i]))
this.dropZones[i].hideHover();}
for(var i=0;i<n;i++){
if(this._mousePointInDropZone(e,this.dropZones[i])){
if(this.dropZones[i].canAccept(this.currentDragObjects))
this.dropZones[i].showHover();}}},
_startDrag:function(e){
for(var i=0;i<this.currentDragObjects.length;i++)
this.currentDragObjects[i].startDrag();
this._makeDraggableObjectVisible(e);},
_mouseUpHandler:function(e){
if(!this.hasSelection())
return;
var nsEvent=e.which!=undefined;
if((nsEvent&&e.which!=1)||(!nsEvent&&e.button!=1))
return;
this.interestedInMotionEvents=false;
if(this.dragElement==null){
this._terminateEvent(e);
return;}
if(this._placeDraggableInDropZone(e))
this._completeDropOperation(e);
else{
this._terminateEvent(e);
new Rico.Effect.Position(this.dragElement,
this.origPos.x,
this.origPos.y,
200,
20,{complete:this._doCancelDragProcessing.bind(this)});}
Event.stopObserving(document.body,"mousemove",this._mouseMove);
Event.stopObserving(document.body,"mouseup",this._mouseUp);},
_retTrue:function(){
return true;},
_completeDropOperation:function(e){
if(this.dragElement!=this.currentDragObjects[0].getMouseDownHTMLElement()){
if(this.dragElement.parentNode!=null)
this.dragElement.parentNode.removeChild(this.dragElement);}
this._deactivateRegisteredDropZones();
this._endDrag();
this.clearSelection();
this.dragElement=null;
this.currentDragObjectVisible=false;
this._terminateEvent(e);},
_doCancelDragProcessing:function(){
this._cancelDrag();
if(this.dragElement!=this.currentDragObjects[0].getMouseDownHTMLElement()&&this.dragElement)
if(this.dragElement.parentNode!=null)
this.dragElement.parentNode.removeChild(this.dragElement);
this._deactivateRegisteredDropZones();
this.dragElement=null;
this.currentDragObjectVisible=false;},
_placeDraggableInDropZone:function(e){
var foundDropZone=false;
var n=this.dropZones.length;
for(var i=0;i<n;i++){
if(this._mousePointInDropZone(e,this.dropZones[i])){
if(this.dropZones[i].canAccept(this.currentDragObjects)){
this.dropZones[i].hideHover();
this.dropZones[i].accept(this.currentDragObjects);
foundDropZone=true;
break;}}}
return foundDropZone;},
_cancelDrag:function(){
for(var i=0;i<this.currentDragObjects.length;i++)
this.currentDragObjects[i].cancelDrag();},
_endDrag:function(){
for(var i=0;i<this.currentDragObjects.length;i++)
this.currentDragObjects[i].endDrag();},
_mousePointInDropZone:function(e,dropZone){
var absoluteRect=dropZone.getAbsoluteRect();
return e.clientX>absoluteRect.left+this._leftOffset(e)&&
e.clientX<absoluteRect.right+this._leftOffset(e)&&
e.clientY>absoluteRect.top+this._topOffset(e)&&
e.clientY<absoluteRect.bottom+this._topOffset(e);},
_addMouseDownHandler:function(aDraggable){
htmlElement=aDraggable.getMouseDownHTMLElement();
if(htmlElement!=null){
htmlElement.draggable=aDraggable;
Event.observe(htmlElement,"mousedown",this._onmousedown.bindAsEventListener(this));
Event.observe(htmlElement,"mousedown",this._mouseDown);}},
_activateRegisteredDropZones:function(){
var n=this.dropZones.length;
for(var i=0;i<n;i++){
var dropZone=this.dropZones[i];
if(dropZone.canAccept(this.currentDragObjects))
dropZone.activate();}
this.activatedDropZones=true;},
_deactivateRegisteredDropZones:function(){
var n=this.dropZones.length;
for(var i=0;i<n;i++)
this.dropZones[i].deactivate();
this.activatedDropZones=false;},
_onmousedown:function(){
Event.observe(document.body,"mousemove",this._mouseMove);
Event.observe(document.body,"mouseup",this._mouseUp);},
_terminateEvent:function(e){
if(e.stopPropagation!=undefined)
e.stopPropagation();
else if(e.cancelBubble!=undefined)
e.cancelBubble=true;
if(e.preventDefault!=undefined)
e.preventDefault();
else
e.returnValue=false;},
initializeEventHandlers:function(){
if(typeof document.implementation!="undefined"&&
document.implementation.hasFeature("HTML","1.0")&&
document.implementation.hasFeature("Events","2.0")&&
document.implementation.hasFeature("CSS","2.0")){
document.addEventListener("mouseup",this._mouseUpHandler.bindAsEventListener(this),false);
document.addEventListener("mousemove",this._mouseMoveHandler.bindAsEventListener(this),false);}
else{
document.attachEvent("onmouseup",this._mouseUpHandler.bindAsEventListener(this));
document.attachEvent("onmousemove",this._mouseMoveHandler.bindAsEventListener(this));}}}
var dndMgr=new Rico.DragAndDrop();
dndMgr.initializeEventHandlers();
Rico.Draggable=Class.create();
Rico.Draggable.prototype={
initialize:function(type,htmlElement){
this.type=type;
this.htmlElement=$(htmlElement);
this.selected=false;},
getMouseDownHTMLElement:function(){
return this.htmlElement;},
select:function(){
this.selected=true;
if(this.showingSelected)
return;
var htmlElement=this.getMouseDownHTMLElement();
var color=Rico.Color.createColorFromBackground(htmlElement);
color.isBright()?color.darken(0.033):color.brighten(0.033);
this.saveBackground=RicoUtil.getElementsComputedStyle(htmlElement,"backgroundColor","background-color");
htmlElement.style.backgroundColor=color.asHex();
this.showingSelected=true;},
deselect:function(){
this.selected=false;
if(!this.showingSelected)
return;
var htmlElement=this.getMouseDownHTMLElement();
htmlElement.style.backgroundColor=this.saveBackground;
this.showingSelected=false;},
isSelected:function(){
return this.selected;},
startDrag:function(){},
cancelDrag:function(){},
endDrag:function(){},
getSingleObjectDragGUI:function(){
return this.htmlElement;},
getMultiObjectDragGUI:function(draggables){
return this.htmlElement;},
getDroppedGUI:function(){
return this.htmlElement;},
toString:function(){
return this.type+":"+this.htmlElement+":";}}
Rico.Dropzone=Class.create();
Rico.Dropzone.prototype={
initialize:function(htmlElement){
this.htmlElement=$(htmlElement);
this.absoluteRect=null;},
getHTMLElement:function(){
return this.htmlElement;},
clearPositionCache:function(){
this.absoluteRect=null;},
getAbsoluteRect:function(){
if(this.absoluteRect==null){
var htmlElement=this.getHTMLElement();
var pos=RicoUtil.toViewportPosition(htmlElement);
this.absoluteRect={
top:pos.y,
left:pos.x,
bottom:pos.y+htmlElement.offsetHeight,
right:pos.x+htmlElement.offsetWidth};}
return this.absoluteRect;},
activate:function(){
var htmlElement=this.getHTMLElement();
if(htmlElement==null||this.showingActive)
return;
this.showingActive=true;
this.saveBackgroundColor=htmlElement.style.backgroundColor;
var fallbackColor="#ffea84";
var currentColor=Rico.Color.createColorFromBackground(htmlElement);
if(currentColor==null)
htmlElement.style.backgroundColor=fallbackColor;
else{
currentColor.isBright()?currentColor.darken(0.2):currentColor.brighten(0.2);
htmlElement.style.backgroundColor=currentColor.asHex();}},
deactivate:function(){
var htmlElement=this.getHTMLElement();
if(htmlElement==null||!this.showingActive)
return;
htmlElement.style.backgroundColor=this.saveBackgroundColor;
this.showingActive=false;
this.saveBackgroundColor=null;},
showHover:function(){
var htmlElement=this.getHTMLElement();
if(htmlElement==null||this.showingHover)
return;
this.saveBorderWidth=htmlElement.style.borderWidth;
this.saveBorderStyle=htmlElement.style.borderStyle;
this.saveBorderColor=htmlElement.style.borderColor;
this.showingHover=true;
htmlElement.style.borderWidth="1px";
htmlElement.style.borderStyle="solid";
htmlElement.style.borderColor="#ffff00";},
hideHover:function(){
var htmlElement=this.getHTMLElement();
if(htmlElement==null||!this.showingHover)
return;
htmlElement.style.borderWidth=this.saveBorderWidth;
htmlElement.style.borderStyle=this.saveBorderStyle;
htmlElement.style.borderColor=this.saveBorderColor;
this.showingHover=false;},
canAccept:function(draggableObjects){
return true;},
accept:function(draggableObjects){
var htmlElement=this.getHTMLElement();
if(htmlElement==null)
return;
n=draggableObjects.length;
for(var i=0;i<n;i++){
var theGUI=draggableObjects[i].getDroppedGUI();
if(RicoUtil.getElementsComputedStyle(theGUI,"position")=="absolute"){
theGUI.style.position="static";
theGUI.style.top="";
theGUI.style.top="";}
htmlElement.appendChild(theGUI);}}}
Rico.Effect={};
Rico.Effect.SizeAndPosition=Class.create();
Rico.Effect.SizeAndPosition.prototype={
initialize:function(element,x,y,w,h,duration,steps,options){
this.element=$(element);
this.x=x;
this.y=y;
this.w=w;
this.h=h;
this.duration=duration;
this.steps=steps;
this.options=arguments[7]||{};
this.sizeAndPosition();},
sizeAndPosition:function(){
if(this.isFinished()){
if(this.options.complete)this.options.complete(this);
return;}
if(this.timer)
clearTimeout(this.timer);
var stepDuration=Math.round(this.duration/this.steps);
var currentX=this.element.offsetLeft;
var currentY=this.element.offsetTop;
var currentW=this.element.offsetWidth;
var currentH=this.element.offsetHeight;
this.x=(this.x)?this.x:currentX;
this.y=(this.y)?this.y:currentY;
this.w=(this.w)?this.w:currentW;
this.h=(this.h)?this.h:currentH;
var difX=this.steps>0?(this.x-currentX)/this.steps:0;
var difY=this.steps>0?(this.y-currentY)/this.steps:0;
var difW=this.steps>0?(this.w-currentW)/this.steps:0;
var difH=this.steps>0?(this.h-currentH)/this.steps:0;
this.moveBy(difX,difY);
this.resizeBy(difW,difH);
this.duration-=stepDuration;
this.steps--;
this.timer=setTimeout(this.sizeAndPosition.bind(this),stepDuration);},
isFinished:function(){
return this.steps<=0;},
moveBy:function(difX,difY){
var currentLeft=this.element.offsetLeft;
var currentTop=this.element.offsetTop;
var intDifX=parseInt(difX);
var intDifY=parseInt(difY);
var style=this.element.style;
if(intDifX!=0)
style.left=(currentLeft+intDifX)+"px";
if(intDifY!=0)
style.top=(currentTop+intDifY)+"px";},
resizeBy:function(difW,difH){
var currentWidth=this.element.offsetWidth;
var currentHeight=this.element.offsetHeight;
var intDifW=parseInt(difW);
var intDifH=parseInt(difH);
var style=this.element.style;
if(intDifW!=0)
style.width=(currentWidth+intDifW)+"px";
if(intDifH!=0)
style.height=(currentHeight+intDifH)+"px";}}
Rico.Effect.Size=Class.create();
Rico.Effect.Size.prototype={
initialize:function(element,w,h,duration,steps,options){
new Rico.Effect.SizeAndPosition(element,null,null,w,h,duration,steps,options);}}
Rico.Effect.Position=Class.create();
Rico.Effect.Position.prototype={
initialize:function(element,x,y,duration,steps,options){
new Rico.Effect.SizeAndPosition(element,x,y,null,null,duration,steps,options);}}
Rico.Effect.Round=Class.create();
Rico.Effect.Round.prototype={
initialize:function(tagName,className,options){
var elements=document.getElementsByTagAndClassName(tagName,className);
for(var i=0;i<elements.length;i++)
Rico.Corner.round(elements[i],options);}};
Rico.Effect.FadeTo=Class.create();
Rico.Effect.FadeTo.prototype={
initialize:function(element,opacity,duration,steps,options){
this.element=$(element);
this.opacity=opacity;
this.duration=duration;
this.steps=steps;
this.options=arguments[4]||{};
this.fadeTo();},
fadeTo:function(){
if(this.isFinished()){
if(this.options.complete)this.options.complete(this);
return;}
if(this.timer)
clearTimeout(this.timer);
var stepDuration=Math.round(this.duration/this.steps);
var currentOpacity=this.getElementOpacity();
var delta=this.steps>0?(this.opacity-currentOpacity)/this.steps:0;
this.changeOpacityBy(delta);
this.duration-=stepDuration;
this.steps--;
this.timer=setTimeout(this.fadeTo.bind(this),stepDuration);},
changeOpacityBy:function(v){
var currentOpacity=this.getElementOpacity();
var newOpacity=Math.max(0,Math.min(currentOpacity+v,1));
this.element.ricoOpacity=newOpacity;
this.element.style.filter="alpha(opacity:"+Math.round(newOpacity*100)+")";
this.element.style.opacity=newOpacity;;},
isFinished:function(){
return this.steps<=0;},
getElementOpacity:function(){
if(this.element.ricoOpacity==undefined){
var opacity=RicoUtil.getElementsComputedStyle(this.element,'opacity');
this.element.ricoOpacity=opacity!=undefined?opacity:1.0;}
return parseFloat(this.element.ricoOpacity);}}
Rico.Effect.AccordionSize=Class.create();
Rico.Effect.AccordionSize.prototype={
initialize:function(e1,e2,start,end,duration,steps,options){
this.e1=$(e1);
this.e2=$(e2);
this.start=start;
this.end=end;
this.duration=duration;
this.steps=steps;
this.options=arguments[6]||{};
this.accordionSize();},
accordionSize:function(){
if(this.isFinished()){
this.e1.style.height=this.start+"px";
this.e2.style.height=this.end +"px";
if(this.options.complete)
this.options.complete(this);
return;}
if(this.timer)
clearTimeout(this.timer);
var stepDuration=Math.round(this.duration/this.steps);
var diff=this.steps>0?(parseInt(this.e1.offsetHeight)-this.start)/this.steps:0;
this.resizeBy(diff);
this.duration-=stepDuration;
this.steps--;
this.timer=setTimeout(this.accordionSize.bind(this),stepDuration);},
isFinished:function(){
return this.steps<=0;},
resizeBy:function(diff){
var h1Height=this.e1.offsetHeight;
var h2Height=this.e2.offsetHeight;
var intDiff=parseInt(diff);
if(diff!=0){
this.e1.style.height=(h1Height-intDiff)+"px";
this.e2.style.height=(h2Height+intDiff)+"px";}}};
Rico.LiveGridMetaData=Class.create();
Rico.LiveGridMetaData.prototype={
initialize:function(pageSize,totalRows,columnCount,options){
this.pageSize=pageSize;
this.totalRows=totalRows;
this.setOptions(options);
this.ArrowHeight=16;
this.columnCount=columnCount;},
setOptions:function(options){
this.options={
largeBufferSize:7.0,
nearLimitFactor:0.2};
Object.extend(this.options,options||{});},
getPageSize:function(){
return this.pageSize;},
getTotalRows:function(){
return this.totalRows;},
setTotalRows:function(n){
this.totalRows=n;},
getLargeBufferSize:function(){
return parseInt(this.options.largeBufferSize*this.pageSize);},
getLimitTolerance:function(){
return parseInt(this.getLargeBufferSize()*this.options.nearLimitFactor);}};
Rico.LiveGridScroller=Class.create();
Rico.LiveGridScroller.prototype={
initialize:function(liveGrid,viewPort){
this.isIE=navigator.userAgent.toLowerCase().indexOf("msie")>=0;
this.liveGrid=liveGrid;
this.metaData=liveGrid.metaData;
this.createScrollBar();
this.scrollTimeout=null;
this.lastScrollPos=0;
this.viewPort=viewPort;
this.rows=new Array();},
isUnPlugged:function(){
return this.scrollerDiv.onscroll==null;},
plugin:function(){
this.scrollerDiv.onscroll=this.handleScroll.bindAsEventListener(this);},
unplug:function(){
this.scrollerDiv.onscroll=null;},
sizeIEHeaderHack:function(){
if(!this.isIE)return;
var headerTable=$(this.liveGrid.tableId+"_header");
if(headerTable)
headerTable.rows[0].cells[0].style.width=(headerTable.rows[0].cells[0].offsetWidth+1)+"px";},
createScrollBar:function(){
var visibleHeight=this.liveGrid.viewPort.visibleHeight();
this.scrollerDiv=document.createElement("div");
var scrollerStyle=this.scrollerDiv.style;
scrollerStyle.borderRight=this.liveGrid.options.scrollerBorderRight;
scrollerStyle.position="relative";
scrollerStyle.left=this.isIE?"-6px":"-3px";
scrollerStyle.width="19px";
scrollerStyle.height=visibleHeight+"px";
scrollerStyle.overflow="auto";
this.heightDiv=document.createElement("div");
this.heightDiv.style.width="1px";
this.heightDiv.style.height=parseInt(visibleHeight*
this.metaData.getTotalRows()/this.metaData.getPageSize())+"px";
this.scrollerDiv.appendChild(this.heightDiv);
this.scrollerDiv.onscroll=this.handleScroll.bindAsEventListener(this);
var table=this.liveGrid.table;
table.parentNode.parentNode.insertBefore(this.scrollerDiv,table.parentNode.nextSibling);
var eventName=this.isIE?"mousewheel":"DOMMouseScroll";
Event.observe(table,eventName,
function(evt){
if(evt.wheelDelta>=0||evt.detail<0)
this.scrollerDiv.scrollTop-=(2*this.viewPort.rowHeight);
else
this.scrollerDiv.scrollTop+=(2*this.viewPort.rowHeight);
this.handleScroll(false);}.bindAsEventListener(this),
false);},
updateSize:function(){
var table=this.liveGrid.table;
var visibleHeight=this.viewPort.visibleHeight();
this.heightDiv.style.height=parseInt(visibleHeight*
this.metaData.getTotalRows()/this.metaData.getPageSize())+"px";},
rowToPixel:function(rowOffset){
return(rowOffset/this.metaData.getTotalRows())*this.heightDiv.offsetHeight},
moveScroll:function(rowOffset){
this.scrollerDiv.scrollTop=this.rowToPixel(rowOffset);
if(this.metaData.options.onscroll)
this.metaData.options.onscroll(this.liveGrid,rowOffset);},
handleScroll:function(){
if(this.scrollTimeout)
clearTimeout(this.scrollTimeout);
var scrollDiff=this.lastScrollPos-this.scrollerDiv.scrollTop;
if(scrollDiff!=0.00){
var r=this.scrollerDiv.scrollTop%this.viewPort.rowHeight;
if(r!=0){
this.unplug();
if(scrollDiff<0){
this.scrollerDiv.scrollTop+=(this.viewPort.rowHeight-r);}else{
this.scrollerDiv.scrollTop-=r;}
this.plugin();}}
var contentOffset=parseInt(this.scrollerDiv.scrollTop/this.viewPort.rowHeight);
this.liveGrid.requestContentRefresh(contentOffset);
this.viewPort.scrollTo(this.scrollerDiv.scrollTop);
if(this.metaData.options.onscroll)
this.metaData.options.onscroll(this.liveGrid,contentOffset);
this.scrollTimeout=setTimeout(this.scrollIdle.bind(this),1200);
this.lastScrollPos=this.scrollerDiv.scrollTop;},
scrollIdle:function(){
if(this.metaData.options.onscrollidle)
this.metaData.options.onscrollidle();}};
Rico.LiveGridBuffer=Class.create();
Rico.LiveGridBuffer.prototype={
initialize:function(metaData,viewPort){
this.startPos=0;
this.size=0;
this.metaData=metaData;
this.rows=new Array();
this.updateInProgress=false;
this.viewPort=viewPort;
this.maxBufferSize=metaData.getLargeBufferSize()*2;
this.maxFetchSize=metaData.getLargeBufferSize();
this.lastOffset=0;},
getBlankRow:function(){
if(!this.blankRow){
this.blankRow=new Array();
for(var i=0;i<this.metaData.columnCount;i++)
this.blankRow[i]="&nbsp;";}
return this.blankRow;},
loadRows:function(ajaxResponse){
var rowsElement=ajaxResponse.getElementsByTagName('rows')[0];
this.updateUI=rowsElement.getAttribute("update_ui")=="true"
var newRows=new Array()
var trs=rowsElement.getElementsByTagName("tr");
for(var i=0;i<trs.length;i++){
var row=newRows[i]=new Array();
var cells=trs[i].getElementsByTagName("td");
for(var j=0;j<cells.length;j++){
var cell=cells[j];
var convertSpaces=cell.getAttribute("convert_spaces")=="true";
var cellContent=RicoUtil.getContentAsString(cell);
row[j]=convertSpaces?this.convertSpaces(cellContent):cellContent;
if(!row[j])
row[j]='&nbsp;';}}
return newRows;},
update:function(ajaxResponse,start){
var newRows=this.loadRows(ajaxResponse);
if(this.rows.length==0){
this.rows=newRows;
this.size=this.rows.length;
this.startPos=start;
return;}
if(start>this.startPos){
if(this.startPos+this.rows.length<start){
this.rows=newRows;
this.startPos=start;}else{
this.rows=this.rows.concat(newRows.slice(0,newRows.length));
if(this.rows.length>this.maxBufferSize){
var fullSize=this.rows.length;
this.rows=this.rows.slice(this.rows.length-this.maxBufferSize,this.rows.length)
this.startPos=this.startPos+(fullSize-this.rows.length);}}}else{
if(start+newRows.length<this.startPos){
this.rows=newRows;}else{
this.rows=newRows.slice(0,this.startPos).concat(this.rows);
if(this.rows.length>this.maxBufferSize)
this.rows=this.rows.slice(0,this.maxBufferSize)}
this.startPos=start;}
this.size=this.rows.length;},
clear:function(){
this.rows=new Array();
this.startPos=0;
this.size=0;},
isOverlapping:function(start,size){
return((start<this.endPos())&&(this.startPos<start+size))||(this.endPos()==0)},
isInRange:function(position){
return(position>=this.startPos)&&(position+this.metaData.getPageSize()<=this.endPos());},
isNearingTopLimit:function(position){
return position-this.startPos<this.metaData.getLimitTolerance();},
endPos:function(){
return this.startPos+this.rows.length;},
isNearingBottomLimit:function(position){
return this.endPos()-(position+this.metaData.getPageSize())<this.metaData.getLimitTolerance();},
isAtTop:function(){
return this.startPos==0;},
isAtBottom:function(){
return this.endPos()==this.metaData.getTotalRows();},
isNearingLimit:function(position){
return(!this.isAtTop()&&this.isNearingTopLimit(position))||(!this.isAtBottom()&&this.isNearingBottomLimit(position))},
getFetchSize:function(offset){
var adjustedOffset=this.getFetchOffset(offset);
var adjustedSize=0;
if(adjustedOffset>=this.startPos){
var endFetchOffset=this.maxFetchSize+adjustedOffset;
if(endFetchOffset>this.metaData.totalRows)
endFetchOffset=this.metaData.totalRows;
adjustedSize=endFetchOffset-adjustedOffset;
if(adjustedOffset==0&&adjustedSize<this.maxFetchSize){
adjustedSize=this.maxFetchSize;}}else{
var adjustedSize=this.startPos-adjustedOffset;
if(adjustedSize>this.maxFetchSize)
adjustedSize=this.maxFetchSize;}
return adjustedSize;},
getFetchOffset:function(offset){
var adjustedOffset=offset;
if(offset>this.startPos)
adjustedOffset=(offset>this.endPos())?offset:this.endPos();
else{
if(offset+this.maxFetchSize>=this.startPos){
var adjustedOffset=this.startPos-this.maxFetchSize;
if(adjustedOffset<0)
adjustedOffset=0;}}
this.lastOffset=adjustedOffset;
return adjustedOffset;},
getRows:function(start,count){
var begPos=start-this.startPos
var endPos=begPos+count
if(endPos>this.size)
endPos=this.size
var results=new Array()
var index=0;
for(var i=begPos;i<endPos;i++){
results[index++]=this.rows[i]}
return results},
convertSpaces:function(s){
return s.split(" ").join("&nbsp;");}};
Rico.GridViewPort=Class.create();
Rico.GridViewPort.prototype={
initialize:function(table,rowHeight,visibleRows,buffer,liveGrid){
this.lastDisplayedStartPos=0;
this.div=table.parentNode;
this.table=table
this.rowHeight=rowHeight;
this.div.style.height=(this.rowHeight*visibleRows)+"px";
this.div.style.overflow="hidden";
this.buffer=buffer;
this.liveGrid=liveGrid;
this.visibleRows=visibleRows+1;
this.lastPixelOffset=0;
this.startPos=0;},
populateRow:function(htmlRow,row){
for(var j=0;j<row.length;j++){
htmlRow.cells[j].innerHTML=row[j]}},
bufferChanged:function(){
this.refreshContents(parseInt(this.lastPixelOffset/this.rowHeight));},
clearRows:function(){
if(!this.isBlank){
this.liveGrid.table.className=this.liveGrid.options.loadingClass;
for(var i=0;i<this.visibleRows;i++)
this.populateRow(this.table.rows[i],this.buffer.getBlankRow());
this.isBlank=true;}},
clearContents:function(){
this.clearRows();
this.scrollTo(0);
this.startPos=0;
this.lastStartPos=-1;},
refreshContents:function(startPos){
if(startPos==this.lastRowPos&&!this.isPartialBlank&&!this.isBlank){
return;}
if((startPos+this.visibleRows<this.buffer.startPos)||(this.buffer.startPos+this.buffer.size<startPos)||(this.buffer.size==0)){
this.clearRows();
return;}
this.isBlank=false;
var viewPrecedesBuffer=this.buffer.startPos>startPos
var contentStartPos=viewPrecedesBuffer?this.buffer.startPos:startPos;
var contentEndPos=(this.buffer.startPos+this.buffer.size<startPos+this.visibleRows)?this.buffer.startPos+this.buffer.size:startPos+this.visibleRows;
var rowSize=contentEndPos-contentStartPos;
var rows=this.buffer.getRows(contentStartPos,rowSize);
var blankSize=this.visibleRows-rowSize;
var blankOffset=viewPrecedesBuffer?0:rowSize;
var contentOffset=viewPrecedesBuffer?blankSize:0;
for(var i=0;i<rows.length;i++){
this.populateRow(this.table.rows[i+contentOffset],rows[i]);}
for(var i=0;i<blankSize;i++){
this.populateRow(this.table.rows[i+blankOffset],this.buffer.getBlankRow());}
this.isPartialBlank=blankSize>0;
this.lastRowPos=startPos;
this.liveGrid.table.className=this.liveGrid.options.tableClass;
var onRefreshComplete=this.liveGrid.options.onRefreshComplete;
if(onRefreshComplete!=null)
onRefreshComplete();},
scrollTo:function(pixelOffset){
if(this.lastPixelOffset==pixelOffset)
return;
this.refreshContents(parseInt(pixelOffset/this.rowHeight))
this.div.scrollTop=pixelOffset%this.rowHeight
this.lastPixelOffset=pixelOffset;},
visibleHeight:function(){
return parseInt(RicoUtil.getElementsComputedStyle(this.div,'height'));}};
Rico.LiveGridRequest=Class.create();
Rico.LiveGridRequest.prototype={
initialize:function(requestOffset,options){
this.requestOffset=requestOffset;}};
Rico.LiveGrid=Class.create();
Rico.LiveGrid.prototype={
initialize:function(tableId,visibleRows,totalRows,url,options,ajaxOptions){
this.options={
tableClass:$(tableId).className,
loadingClass:$(tableId).className,
scrollerBorderRight:'1px solid #ababab',
bufferTimeout:20000,
sortAscendImg:'images/sort_asc.gif',
sortDescendImg:'images/sort_desc.gif',
sortImageWidth:9,
sortImageHeight:5,
ajaxSortURLParms:[],
onRefreshComplete:null,
requestParameters:null,
inlineStyles:true};
Object.extend(this.options,options||{});
this.ajaxOptions={parameters:null};
Object.extend(this.ajaxOptions,ajaxOptions||{});
this.tableId=tableId;
this.table=$(tableId);
this.addLiveGridHtml();
var columnCount=this.table.rows[0].cells.length;
this.metaData=new Rico.LiveGridMetaData(visibleRows,totalRows,columnCount,options);
this.buffer=new Rico.LiveGridBuffer(this.metaData);
var rowCount=this.table.rows.length;
this.viewPort=new Rico.GridViewPort(this.table,
this.table.offsetHeight/rowCount,
visibleRows,
this.buffer,this);
this.scroller=new Rico.LiveGridScroller(this,this.viewPort);
this.options.sortHandler=this.sortHandler.bind(this);
if($(tableId+'_header'))
this.sort=new Rico.LiveGridSort(tableId+'_header',this.options)
this.processingRequest=null;
this.unprocessedRequest=null;
this.initAjax(url);
if(this.options.prefetchBuffer||this.options.prefetchOffset>0){
var offset=0;
if(this.options.offset){
offset=this.options.offset;
this.scroller.moveScroll(offset);
this.viewPort.scrollTo(this.scroller.rowToPixel(offset));}
if(this.options.sortCol){
this.sortCol=options.sortCol;
this.sortDir=options.sortDir;}
this.requestContentRefresh(offset);}},
addLiveGridHtml:function(){
if(this.table.getElementsByTagName("thead").length>0){
var tableHeader=this.table.cloneNode(true);
tableHeader.setAttribute('id',this.tableId+'_header');
tableHeader.setAttribute('class',this.table.className+'_header');
for(var i=0;i<tableHeader.tBodies.length;i++)
tableHeader.removeChild(tableHeader.tBodies[i]);
this.table.deleteTHead();
this.table.parentNode.insertBefore(tableHeader,this.table);}
new Insertion.Before(this.table,"<div id='"+this.tableId+"_container'></div>");
this.table.previousSibling.appendChild(this.table);
new Insertion.Before(this.table,"<div id='"+this.tableId+"_viewport' style='float:left;'></div>");
this.table.previousSibling.appendChild(this.table);},
resetContents:function(){
this.scroller.moveScroll(0);
this.buffer.clear();
this.viewPort.clearContents();},
sortHandler:function(column){
if(!column)return;
this.sortCol=column.name;
this.sortDir=column.currentSort;
this.resetContents();
this.requestContentRefresh(0)},
adjustRowSize:function(){},
setTotalRows:function(newTotalRows){
this.resetContents();
this.metaData.setTotalRows(newTotalRows);
this.scroller.updateSize();},
initAjax:function(url){
ajaxEngine.registerRequest(this.tableId+'_request',url);
ajaxEngine.registerAjaxObject(this.tableId+'_updater',this);},
invokeAjax:function(){},
handleTimedOut:function(){
this.processingRequest=null;
this.processQueuedRequest();},
fetchBuffer:function(offset){
if(this.buffer.isInRange(offset)&&!this.buffer.isNearingLimit(offset)){
return;}
if(this.processingRequest){
this.unprocessedRequest=new Rico.LiveGridRequest(offset);
return;}
var bufferStartPos=this.buffer.getFetchOffset(offset);
this.processingRequest=new Rico.LiveGridRequest(offset);
this.processingRequest.bufferOffset=bufferStartPos;
var fetchSize=this.buffer.getFetchSize(offset);
var partialLoaded=false;
var queryString
if(this.options.requestParameters)
queryString=this._createQueryString(this.options.requestParameters,0);
queryString=(queryString==null)?'':queryString+'&';
queryString=queryString+'id='+this.tableId+'&page_size='+fetchSize+'&offset='+bufferStartPos;
if(this.sortCol)
queryString=queryString+'&sort_col='+escape(this.sortCol)+'&sort_dir='+this.sortDir;
this.ajaxOptions.parameters=queryString;
ajaxEngine.sendRequest(this.tableId+'_request',this.ajaxOptions);
this.timeoutHandler=setTimeout(this.handleTimedOut.bind(this),this.options.bufferTimeout);},
setRequestParams:function(){
this.options.requestParameters=[];
for(var i=0;i<arguments.length;i++)
this.options.requestParameters[i]=arguments[i];},
requestContentRefresh:function(contentOffset){
this.fetchBuffer(contentOffset);},
ajaxUpdate:function(ajaxResponse){
try{
clearTimeout(this.timeoutHandler);
this.buffer.update(ajaxResponse,this.processingRequest.bufferOffset);
this.viewPort.bufferChanged();}
catch(err){}
finally{this.processingRequest=null;}
this.processQueuedRequest();},
_createQueryString:function(theArgs,offset){
var queryString=""
if(!theArgs)
return queryString;
for(var i=offset;i<theArgs.length;i++){
if(i!=offset)
queryString+="&";
var anArg=theArgs[i];
if(anArg.name!=undefined&&anArg.value!=undefined){
queryString+=anArg.name+"="+escape(anArg.value);}
else{
var ePos=anArg.indexOf('=');
var argName=anArg.substring(0,ePos);
var argValue=anArg.substring(ePos+1);
queryString+=argName+"="+escape(argValue);}}
return queryString;},
processQueuedRequest:function(){
if(this.unprocessedRequest!=null){
this.requestContentRefresh(this.unprocessedRequest.requestOffset);
this.unprocessedRequest=null}}};
Rico.LiveGridSort=Class.create();
Rico.LiveGridSort.prototype={
initialize:function(headerTableId,options){
this.headerTableId=headerTableId;
this.headerTable=$(headerTableId);
this.options=options;
this.setOptions();
this.applySortBehavior();
if(this.options.sortCol){
this.setSortUI(this.options.sortCol,this.options.sortDir);}},
setSortUI:function(columnName,sortDirection){
var cols=this.options.columns;
for(var i=0;i<cols.length;i++){
if(cols[i].name==columnName){
this.setColumnSort(i,sortDirection);
break;}}},
setOptions:function(){
new Image().src=this.options.sortAscendImg;
new Image().src=this.options.sortDescendImg;
this.sort=this.options.sortHandler;
if(!this.options.columns)
this.options.columns=this.introspectForColumnInfo();
else{
this.options.columns=this.convertToTableColumns(this.options.columns);}},
applySortBehavior:function(){
var headerRow=this.headerTable.rows[0];
var headerCells=headerRow.cells;
for(var i=0;i<headerCells.length;i++){
this.addSortBehaviorToColumn(i,headerCells[i]);}},
addSortBehaviorToColumn:function(n,cell){
if(this.options.columns[n].isSortable()){
cell.id=this.headerTableId+'_'+n;
cell.style.cursor='pointer';
cell.onclick=this.headerCellClicked.bindAsEventListener(this);
cell.innerHTML=cell.innerHTML+'<span id="'+this.headerTableId+'_img_'+n+'">'+'&nbsp;&nbsp;&nbsp;</span>';}},
headerCellClicked:function(evt){
var eventTarget=evt.target?evt.target:evt.srcElement;
var cellId=eventTarget.id;
var columnNumber=parseInt(cellId.substring(cellId.lastIndexOf('_')+1));
var sortedColumnIndex=this.getSortedColumnIndex();
if(sortedColumnIndex!=-1){
if(sortedColumnIndex!=columnNumber){
this.removeColumnSort(sortedColumnIndex);
this.setColumnSort(columnNumber,Rico.TableColumn.SORT_ASC);}
else
this.toggleColumnSort(sortedColumnIndex);}
else
this.setColumnSort(columnNumber,Rico.TableColumn.SORT_ASC);
if(this.options.sortHandler){
this.options.sortHandler(this.options.columns[columnNumber]);}},
removeColumnSort:function(n){
this.options.columns[n].setUnsorted();
this.setSortImage(n);},
setColumnSort:function(n,direction){
if(isNaN(n))return;
this.options.columns[n].setSorted(direction);
this.setSortImage(n);},
toggleColumnSort:function(n){
this.options.columns[n].toggleSort();
this.setSortImage(n);},
setSortImage:function(n){
var sortDirection=this.options.columns[n].getSortDirection();
var sortImageSpan=$(this.headerTableId+'_img_'+n);
if(sortDirection==Rico.TableColumn.UNSORTED)
sortImageSpan.innerHTML='&nbsp;&nbsp;';
else if(sortDirection==Rico.TableColumn.SORT_ASC)
sortImageSpan.innerHTML='&nbsp;&nbsp;<img width="'+this.options.sortImageWidth+'" '+
'height="'+this.options.sortImageHeight+'" '+
'src="'+this.options.sortAscendImg+'"/>';
else if(sortDirection==Rico.TableColumn.SORT_DESC)
sortImageSpan.innerHTML='&nbsp;&nbsp;<img width="'+this.options.sortImageWidth+'" '+
'height="'+this.options.sortImageHeight+'" '+
'src="'+this.options.sortDescendImg+'"/>';},
getSortedColumnIndex:function(){
var cols=this.options.columns;
for(var i=0;i<cols.length;i++){
if(cols[i].isSorted())
return i;}
return -1;},
introspectForColumnInfo:function(){
var columns=new Array();
var headerRow=this.headerTable.rows[0];
var headerCells=headerRow.cells;
for(var i=0;i<headerCells.length;i++)
columns.push(new Rico.TableColumn(this.deriveColumnNameFromCell(headerCells[i],i),true));
return columns;},
convertToTableColumns:function(cols){
var columns=new Array();
for(var i=0;i<cols.length;i++)
columns.push(new Rico.TableColumn(cols[i][0],cols[i][1]));
return columns;},
deriveColumnNameFromCell:function(cell,columnNumber){
var cellContent=cell.innerText!=undefined?cell.innerText:cell.textContent;
return cellContent?cellContent.toLowerCase().split(' ').join('_'):"col_"+columnNumber;}};
Rico.TableColumn=Class.create();
Rico.TableColumn.UNSORTED=0;
Rico.TableColumn.SORT_ASC="ASC";
Rico.TableColumn.SORT_DESC="DESC";
Rico.TableColumn.prototype={
initialize:function(name,sortable){
this.name=name;
this.sortable=sortable;
this.currentSort=Rico.TableColumn.UNSORTED;},
isSortable:function(){
return this.sortable;},
isSorted:function(){
return this.currentSort!=Rico.TableColumn.UNSORTED;},
getSortDirection:function(){
return this.currentSort;},
toggleSort:function(){
if(this.currentSort==Rico.TableColumn.UNSORTED||this.currentSort==Rico.TableColumn.SORT_DESC)
this.currentSort=Rico.TableColumn.SORT_ASC;
else if(this.currentSort==Rico.TableColumn.SORT_ASC)
this.currentSort=Rico.TableColumn.SORT_DESC;},
setUnsorted:function(direction){
this.setSorted(Rico.TableColumn.UNSORTED);},
setSorted:function(direction){
this.currentSort=direction;}};
var RicoUtil={
getElementsComputedStyle:function(htmlElement,cssProperty,mozillaEquivalentCSS){
if(arguments.length==2)
mozillaEquivalentCSS=cssProperty;
var el=$(htmlElement);
if(el.currentStyle)
return el.currentStyle[cssProperty];
else
return document.defaultView.getComputedStyle(el,null).getPropertyValue(mozillaEquivalentCSS);},
createXmlDocument:function(){
if(document.implementation&&document.implementation.createDocument){
var doc=document.implementation.createDocument("","",null);
if(doc.readyState==null){
doc.readyState=1;
doc.addEventListener("load",function(){
doc.readyState=4;
if(typeof doc.onreadystatechange=="function")
doc.onreadystatechange();},false);}
return doc;}
if(window.ActiveXObject)
return Try.these(
function(){return new ActiveXObject('MSXML2.DomDocument')},
function(){return new ActiveXObject('Microsoft.DomDocument')},
function(){return new ActiveXObject('MSXML.DomDocument')},
function(){return new ActiveXObject('MSXML3.DomDocument')})||false;
return null;},
getContentAsString:function(parentNode){
return parentNode.xml!=undefined?
this._getContentAsStringIE(parentNode):
this._getContentAsStringMozilla(parentNode);},
_getContentAsStringIE:function(parentNode){
var contentStr="";
for(var i=0;i<parentNode.childNodes.length;i++){
var n=parentNode.childNodes[i];
if(n.nodeType==4){
contentStr+=n.nodeValue;}
else{
contentStr+=n.xml;}}
return contentStr;},
_getContentAsStringMozilla:function(parentNode){
var xmlSerializer=new XMLSerializer();
var contentStr="";
for(var i=0;i<parentNode.childNodes.length;i++){
var n=parentNode.childNodes[i];
if(n.nodeType==4){
contentStr+=n.nodeValue;}
else{
contentStr+=xmlSerializer.serializeToString(n);}}
return contentStr;},
toViewportPosition:function(element){
return this._toAbsolute(element,true);},
toDocumentPosition:function(element){
return this._toAbsolute(element,false);},
_toAbsolute:function(element,accountForDocScroll){
if(navigator.userAgent.toLowerCase().indexOf("msie")==-1)
return this._toAbsoluteMozilla(element,accountForDocScroll);
var x=0;
var y=0;
var parent=element;
while(parent){
var borderXOffset=0;
var borderYOffset=0;
if(parent!=element){
var borderXOffset=parseInt(this.getElementsComputedStyle(parent,"borderLeftWidth"));
var borderYOffset=parseInt(this.getElementsComputedStyle(parent,"borderTopWidth"));
borderXOffset=isNaN(borderXOffset)?0:borderXOffset;
borderYOffset=isNaN(borderYOffset)?0:borderYOffset;}
x+=parent.offsetLeft-parent.scrollLeft+borderXOffset;
y+=parent.offsetTop-parent.scrollTop+borderYOffset;
parent=parent.offsetParent;}
if(accountForDocScroll){
x-=this.docScrollLeft();
y-=this.docScrollTop();}
return{x:x,y:y};},
_toAbsoluteMozilla:function(element,accountForDocScroll){
var x=0;
var y=0;
var parent=element;
while(parent){
x+=parent.offsetLeft;
y+=parent.offsetTop;
parent=parent.offsetParent;}
parent=element;
while(parent&&
parent!=document.body&&
parent!=document.documentElement){
if(parent.scrollLeft)
x-=parent.scrollLeft;
if(parent.scrollTop)
y-=parent.scrollTop;
parent=parent.parentNode;}
if(accountForDocScroll){
x-=this.docScrollLeft();
y-=this.docScrollTop();}
return{x:x,y:y};},
docScrollLeft:function(){
if(window.pageXOffset)
return window.pageXOffset;
else if(document.documentElement&&document.documentElement.scrollLeft)
return document.documentElement.scrollLeft;
else if(document.body)
return document.body.scrollLeft;
else
return 0;},
docScrollTop:function(){
if(window.pageYOffset)
return window.pageYOffset;
else if(document.documentElement&&document.documentElement.scrollTop)
return document.documentElement.scrollTop;
else if(document.body)
return document.body.scrollTop;
else
return 0;}};
var Scriptaculous={
Version:'1.6.5',
require:function(libraryName){
document.write('<script type="text/javascript" src="'+libraryName+'"></script>');},
load:function(){
if((typeof Prototype=='undefined')||(typeof Element=='undefined')||(typeof Element.Methods=='undefined')||
parseFloat(Prototype.Version.split(".")[0]+"."+
Prototype.Version.split(".")[1])<1.5)
throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
$A(document.getElementsByTagName("script")).findAll(function(s){
return(s.src&&s.src.match(/scriptaculous\.js(\?.*)?$/))}).each(function(s){
var path=s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
var includes=s.src.match(/\?.*load=([a-z,]*)/);(includes?includes[1]:'builder,effects,dragdrop,controls,slider').split(',').each(
function(include){Scriptaculous.require(path+include+'.js')});});}}
Scriptaculous.load();
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(navigator.appVersion.indexOf('AppleWebKit')>0)window.scrollBy(0,0);
return element;}
Element.getOpacity=function(element){
element=$(element);
var opacity;
if(opacity=element.getStyle('opacity'))
return parseFloat(opacity);
if(opacity=(element.getStyle('filter')||'').match(/alpha\(opacity=(.*)\)/))
if(opacity[1])return parseFloat(opacity[1])/100;
return 1.0;}
Element.setOpacity=function(element,value){
element=$(element);
if(value==1){
element.setStyle({opacity:(/Gecko/.test(navigator.userAgent)&&!/Konqueror|Safari|KHTML/.test(navigator.userAgent))?
0.999999:1.0});
if(/MSIE/.test(navigator.userAgent)&&!window.opera)
element.setStyle({filter:Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});}else{
if(value<0.00001)value=0;
element.setStyle({opacity:value});
if(/MSIE/.test(navigator.userAgent)&&!window.opera)
element.setStyle({filter:element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'')+
'alpha(opacity='+value*100+')'});}
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){}};
Array.prototype.call=function(){
var args=arguments;
this.each(function(f){f.apply(this,args)});}
var Effect={
_elementDoesNotExistError:{
name:'ElementDoesNotExistError',
message:'The specified DOM element does not exist, but is required for this effect to operate'},
tagifyText:function(element){
if(typeof Builder=='undefined')
throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
var tagifyStyle='position:relative';
if(/MSIE/.test(navigator.userAgent)&&!window.opera)tagifyStyle+=';zoom:1';
element=$(element);
$A(element.childNodes).each(function(child){
if(child.nodeType==3){
child.nodeValue.toArray().each(function(character){
element.insertBefore(
Builder.node('span',{style:tagifyStyle},
character==' '?String.fromCharCode(160):character),
child);});
Element.remove(child);}});},
multiple:function(element,effect){
var elements;
if(((typeof element=='object')||(typeof element=='function'))&&(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);}};
var Effect2=Effect;
Effect.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){
return((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;},
wobble:function(pos){
return(-Math.cos(pos*Math.PI*(9*pos))/2)+0.5;},
pulse:function(pos,pulses){
pulses=pulses||5;
return(
Math.round((pos%(1/pulses))*pulses)==0?((pos*pulses*2)-Math.floor(pos*pulses*2)):
1-((pos*pulses*2)-Math.floor(pos*pulses*2)));},
none:function(pos){
return 0;},
full:function(pos){
return 1;}};
Effect.ScopedQueue=Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype,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=(typeof effect.options.queue=='string')?
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),40);},
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();
this.effects.invoke('loop',timePos);}});
Effect.Queues={
instances:$H(),
get:function(queueName){
if(typeof queueName!='string')return queueName;
if(!this.instances[queueName])
this.instances[queueName]=new Effect.ScopedQueue();
return this.instances[queueName];}}
Effect.Queue=Effect.Queues.get('global');
Effect.DefaultOptions={
transition:Effect.Transitions.sinoidal,
duration:1.0,
fps:25.0,
sync:false,
from:0.0,
to:1.0,
delay:0.0,
queue:'parallel'}
Effect.Base=function(){};
Effect.Base.prototype={
position:null,
start:function(options){
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.event('beforeStart');
if(!this.options.sync)
Effect.Queues.get(typeof this.options.queue=='string'?
'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.finishOn-this.startOn);
var frame=Math.round(pos*this.options.fps*this.options.duration);
if(frame>this.currentFrame){
this.render(pos);
this.currentFrame=frame;}}},
render:function(pos){
if(this.state=='idle'){
this.state='running';
this.event('beforeSetup');
if(this.setup)this.setup();
this.event('afterSetup');}
if(this.state=='running'){
if(this.options.transition)pos=this.options.transition(pos);
pos*=(this.options.to-this.options.from);
pos+=this.options.from;
this.position=pos;
this.event('beforeUpdate');
if(this.update)this.update(pos);
this.event('afterUpdate');}},
cancel:function(){
if(!this.options.sync)
Effect.Queues.get(typeof this.options.queue=='string'?
'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(){
return '#<Effect:'+$H(this).inspect()+',options:'+$H(this.options).inspect()+'>';}}
Effect.Parallel=Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype,Effect.Base.prototype),{
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.Event=Class.create();
Object.extend(Object.extend(Effect.Event.prototype,Effect.Base.prototype),{
initialize:function(){
var options=Object.extend({
duration:0},arguments[0]||{});
this.start(options);},
update:Prototype.emptyFunction});
Effect.Opacity=Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype,Effect.Base.prototype),{
initialize:function(element){
this.element=$(element);
if(!this.element)throw(Effect._elementDoesNotExistError);
if(/MSIE/.test(navigator.userAgent)&&!window.opera&&(!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();
Object.extend(Object.extend(Effect.Move.prototype,Effect.Base.prototype),{
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:Math.round(this.options.x*position+this.originalLeft)+'px',
top:Math.round(this.options.y*position+this.originalTop)+'px'});}});
Effect.MoveBy=function(element,toTop,toLeft){
return new Effect.Move(element,
Object.extend({x:toLeft,y:toTop},arguments[3]||{}));};
Effect.Scale=Class.create();
Object.extend(Object.extend(Effect.Scale.prototype,Effect.Base.prototype),{
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=Math.round(width)+'px';
if(this.options.scaleY)d.height=Math.round(height)+'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();
Object.extend(Object.extend(Effect.Highlight.prototype,Effect.Base.prototype),{
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={
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+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart());}.bind(this))});},
finish:function(){
this.element.setStyle(Object.extend(this.oldStyle,{
backgroundColor:this.options.restorecolor}));}});
Effect.ScrollTo=Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype,Effect.Base.prototype),{
initialize:function(element){
this.element=$(element);
this.start(arguments[1]||{});},
setup:function(){
Position.prepare();
var offsets=Position.cumulativeOffset(this.element);
if(this.options.offset)offsets[1]+=this.options.offset;
var max=window.innerHeight?
window.height-window.innerHeight:
document.body.scrollHeight-(document.documentElement.clientHeight?
document.documentElement.clientHeight:document.body.clientHeight);
this.scrollStart=Position.deltaY;
this.delta=(offsets[1]>max?max:offsets[1])-this.scrollStart;},
update:function(position){
Position.prepare();
window.scrollTo(Position.deltaX,
this.scrollStart+(position*this.delta));}});
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 oldStyle={
top:element.getStyle('top'),
left:element.getStyle('left')};
return new Effect.Move(element,{x:20,y:0,duration:0.05,afterFinishInternal:function(effect){
new Effect.Move(effect.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(effect){
new Effect.Move(effect.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(effect){
new Effect.Move(effect.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(effect){
new Effect.Move(effect.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(effect){
new Effect.Move(effect.element,{x:-20,y:0,duration:0.05,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');
return new Effect.Scale(element,window.opera?0:1,
Object.extend({scaleContent:false,
scaleX:false,
scaleMode:'box',
scaleFrom:100,
restoreAfterFinish:true,
beforeStartInternal: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().setStyle({bottom:oldInnerBottom});
effect.element.down().undoPositioned();}},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]||{}));};['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
'collectTextNodes','collectTextNodesIgnoreClass'].each(
function(f){Element.Methods[f]=Element[f];});
Element.Methods.visualEffect=function(element,effect,options){
s=effect.gsub(/_/,'-').camelize();
effect_class=s.charAt(0).toUpperCase()+s.substring(1);
new Effect[effect_class](element,options);
return $(element);};
Element.addMethods();
