var Imported={};function $jsEval(js){if(window.execScript){window.execScript(js);}else{window.eval(js);}};function $import(ext){if(Imported[ext])return(true);var handler=function(respond){$exec(respond.text);Imported[ext]=true;};$ajax("extensions/"+ext+".js","",handler);};function $ajax(Page,Datas,handler){var http=window.XMLHttpRequest ? new XMLHttpRequest(): new ActiveXObject("MSXML2.XMLHTTP");var todo=handler ? handler : function(){};http.onreadystatechange=function(e){if(http.readyState==4){if(http.status==200){var response={xml: http.responseXML,
text: http.responseText
};todo(response);}else
window.status='Ajax Engine error';}};if(arguments.length==1||!Datas||Datas.length==0){http.open('GET',Page,true);http.send(null);}else{http.open('POST',Page,true);http.setRequestHeader("Content-Type","application/x-www-form-urlencoded");http.send(Datas);}};var Native=function(options){options=options||{};var name=options.name;var legacy=options.legacy;var protect=options.protect;var methods=options.implement;var generics=options.generics;var initialize=options.initialize;var afterImplement=options.afterImplement||function(){};var object=initialize||legacy;generics=generics!==false;object.constructor=Native;object.$family={name:'native'};if(legacy&&initialize)object.prototype=legacy.prototype;object.prototype.constructor=object;if(name){var family=name.toLowerCase();object.prototype.$family={name: family};Native.typize(object,family);}var add=function(obj,name,method,force){if(!protect||force||!obj.prototype[name])obj.prototype[name]=method;if(generics)Native.genericize(obj,name,protect);afterImplement.call(obj,name,method);return obj;};object.alias=function(a1,a2,a3){if(typeof a1=='string'){if((a1=this.prototype[a1]))return add(this,a2,a1,a3);}for(var a in a1)this.alias(a,a1[a],a2);return this;};object.implement=function(a1,a2,a3){if(typeof a1=='string')return add(this,a1,a2,a3);for(var p in a1)add(this,p,a1[p],a2);return this;};if(methods)object.implement(methods);return object;};Native.genericize=function(object,property,check){if((!check||!object[property])&&typeof object.prototype[property]=='function'){object[property]=function(){var args=Array.prototype.slice.call(arguments);return object.prototype[property].apply(args.shift(),args);};}};Native.implement=function(objects,properties){for(var i=0,l=objects.length;i<l;i++)objects[i].implement(properties);};Native.typize=function(object,family){if(!object.type)object.type=function(item){return($type(item)===family);};};(function(){var natives={'Array': Array,'Date': Date,'Function': Function,'Number': Number,'RegExp': RegExp,'String': String};for(var n in natives)new Native({name: n,initialize: natives[n],protect: true});var types={'boolean': Boolean,'native': Native,'object': Object};for(var t in types)Native.typize(types[t],t);var generics={'Array':["concat","indexOf","join","lastIndexOf","pop","push","reverse","shift","slice","sort","splice","toString","unshift","valueOf"],
'String':["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase","valueOf"]
};for(var g in generics){for(var i=generics[g].length;i--;)Native.genericize(window[g],generics[g][i],true);};})();var Hash=new Native({name:'Hash',
initialize: function(object){if($type(object)=='hash')object=$unlink(object.getClean());for(var key in object)this[key]=object[key];return this;}});Hash.implement({forEach: function(fn,bind){for(var key in this){if(this.hasOwnProperty(key))fn.call(bind,this[key],key,this);}},
getClean: function(){var clean={};for(var key in this){if(this.hasOwnProperty(key))clean[key]=this[key];}return clean;},
getLength: function(){var length=0;for(var key in this){if(this.hasOwnProperty(key))length++;}return length;}});Hash.alias('forEach','each');Array.implement({forEach: function(fn,bind){for(var i=0,l=this.length;i<l;i++)fn.call(bind,this[i],i,this);}});Array.alias('forEach','each');function $A(iterable){if(iterable.item){var array=[];for(var i=0,l=iterable.length;i<l;i++)array[i]=iterable[i];return array;}return Array.prototype.slice.call(iterable);};function $arguments(i){return function(){return arguments[i];};};function $chk(obj){return!!(obj||obj===0);};function $clear(timer){clearTimeout(timer);clearInterval(timer);return null;};function $defined(obj){return(obj!=undefined);};function $each(iterable,fn,bind){var type=$type(iterable);((type=='arguments'||type=='collection'||type=='array')? Array : Hash).each(iterable,fn,bind);};function $empty(){};function $extend(original,extended){for(var key in(extended||{}))original[key]=extended[key];return original;};function $H(object){return new Hash(object);};function $lambda(value){return(typeof value=='function')? value : function(){return value;};};function $merge(){var mix={};for(var i=0,l=arguments.length;i<l;i++){var object=arguments[i];if($type(object)!='object')continue;for(var key in object){var op=object[key],mp=mix[key];mix[key]=(mp&&$type(op)=='object'&&$type(mp)=='object')? $merge(mp,op): $unlink(op);}}return mix;};function $pick(){for(var i=0,l=arguments.length;i<l;i++){if(arguments[i]!=undefined)return arguments[i];}return null;};function $random(min,max){return Math.floor(Math.random()*(max-min+1)+min);};function $splat(obj){var type=$type(obj);return(type)?((type!='array'&&type!='arguments')?[obj]: obj):[];};var $time=Date.now||function(){return+new Date;};function $try(){for(var i=0,l=arguments.length;i<l;i++){try{return arguments[i]();}catch(e){}}return null;};function $type(obj){if(obj==undefined)return false;if(obj.$family)return(obj.$family.name=='number'&&!isFinite(obj))? false : obj.$family.name;if(obj.nodeName){switch(obj.nodeType){case 1: return'element';case 3: return(/\S/).test(obj.nodeValue)?'textnode':'whitespace';}}else if(typeof obj.length=='number'){if(obj.callee)return'arguments';else if(obj.item)return'collection';}return typeof obj;};function $unlink(object){var unlinked;switch($type(object)){case'object':
unlinked={};for(var p in object)unlinked[p]=$unlink(object[p]);break;case'hash':
unlinked=new Hash(object);break;case'array':
unlinked=[];for(var i=0,l=object.length;i<l;i++)unlinked[i]=$unlink(object[i]);break;default: return object;}return unlinked;};var Browser=$merge({Engine:{name:'unknown',version: 0},
Platform:{name:(window.orientation!=undefined)?'ipod':(navigator.platform.match(/mac|win|linux/i)||['other'])[0].toLowerCase()},
Features:{xpath:!!(document.evaluate),air:!!(window.runtime),query:!!(document.querySelector)},
Plugins:{},
Engines:{presto: function(){return(!window.opera)? false :((arguments.callee.caller)? 960 :((document.getElementsByClassName)? 950 : 925));},
trident: function(){return(!window.ActiveXObject)? false :((window.XMLHttpRequest)? 5 : 4);},
webkit: function(){return(navigator.taintEnabled)? false :((Browser.Features.xpath)?((Browser.Features.query)? 525 : 420): 419);},
gecko: function(){return(document.getBoxObjectFor==undefined)? false :((document.getElementsByClassName)? 19 : 18);}}},Browser||{});Browser.Platform[Browser.Platform.name]=true;Browser.detect=function(){for(var engine in this.Engines){var version=this.Engines[engine]();if(version){this.Engine={name: engine,version: version};this.Engine[engine]=this.Engine[engine+version]=true;break;}}return{name: engine,version: version};};Browser.detect();Browser.Request=function(){return $try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject('MSXML2.XMLHTTP');});};Browser.Features.xhr=!!(Browser.Request());Browser.Plugins.Flash=(function(){var version=($try(function(){return navigator.plugins['Shockwave Flash'].description;},function(){return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');})||'0 r0').match(/\d+/g);return{version: parseInt(version[0]||0+'.'+version[1]||0),build: parseInt(version[2]||0)};})();function $exec(text){if(!text)return text;if(window.execScript){window.execScript(text);}else{var script=document.createElement('script');script.setAttribute('type','text/javascript');script[(Browser.Engine.webkit&&Browser.Engine.version<420)?'innerText':'text']=text;document.head.appendChild(script);document.head.removeChild(script);}return text;};Native.UID=1;var $uid=(Browser.Engine.trident)? function(item){return(item.uid||(item.uid=[Native.UID++]))[0];}: function(item){return item.uid||(item.uid=Native.UID++);};var Window=new Native({name:'Window',
legacy:(Browser.Engine.trident)? null: window.Window,
initialize: function(win){$uid(win);if(!win.Element){win.Element=$empty;if(Browser.Engine.webkit)win.document.createElement("iframe");win.Element.prototype=(Browser.Engine.webkit)? window["[[DOMElement.prototype]]"]:{};}win.document.window=win;return $extend(win,Window.Prototype);},
afterImplement: function(property,value){window[property]=Window.Prototype[property]=value;}});Window.Prototype={$family:{name:'window'}};new Window(window);var Document=new Native({name:'Document',
legacy:(Browser.Engine.trident)? null: window.Document,
initialize: function(doc){$uid(doc);doc.head=doc.getElementsByTagName('head')[0];doc.html=doc.getElementsByTagName('html')[0];if(Browser.Engine.trident&&Browser.Engine.version<=4)$try(function(){doc.execCommand("BackgroundImageCache",false,true);});if(Browser.Engine.trident)doc.window.attachEvent('onunload',function(){doc.window.detachEvent('onunload',arguments.callee);doc.head=doc.html=doc.window=null;});return $extend(doc,Document.Prototype);},
afterImplement: function(property,value){document[property]=Document.Prototype[property]=value;}});Document.Prototype={$family:{name:'document'}};new Document(document);var agt=navigator.userAgent.toLowerCase();var is_major=parseInt(navigator.appVersion);var is_minor=parseFloat(navigator.appVersion);var is_nav=((agt.indexOf('mozilla')!=-1)&&(agt.indexOf('spoofer')==-1)
&&(agt.indexOf('compatible')== -1)&&(agt.indexOf('opera')==-1)
&&(agt.indexOf('webtv')==-1));var is_nav2=(is_nav&&(is_major==2));var is_nav3=(is_nav&&(is_major==3));var is_nav4=(is_nav&&(is_major==4));var is_nav4up=(is_nav&&(is_major>=4));var is_navonly=(is_nav&&((agt.indexOf(";nav")!= -1)||(agt.indexOf("; nav")!= -1)));var is_nav5=(is_nav&&(is_major==5));var is_nav5up=(is_nav&&(is_major>=5));var is_ie=(agt.indexOf("msie")!= -1);var is_ie3=(is_ie&&(is_major<4));var is_ie4=(is_ie&&(is_major==4)&&(agt.indexOf("msie 5.0")==-1));var is_ie4up=(is_ie&&(is_major>=4));var is_ie5=(is_ie&&(is_major==4)&&(agt.indexOf("msie 5.0")!=-1));var is_ie5up=(is_ie&&!is_ie3&&!is_ie4);var is_ie7=(is_ie&&(is_major==4)&&(agt.indexOf("msie 7.0")!=-1));var is_ie8=(is_ie&&(is_major==4)&&(agt.indexOf("msie 8.0")!=-1));var is_ie9=(is_ie&&(is_major==5)&&(agt.indexOf("msie 9.0")!=-1));var is_opera=(!is_ie&&agt.indexOf('opera')!=-1);var is_safari=(agt.indexOf("safari")!= -1);var is_konqueror=(agt.indexOf("konqueror")!= -1);var is_firefox=(agt.indexOf("firefox")!= -1);Hash.implement({has: Object.prototype.hasOwnProperty,
keyOf: function(value){for(var key in this){if(this.hasOwnProperty(key)&&this[key]===value)return key;}return null;},
hasValue: function(value){return(Hash.keyOf(this,value)!==null);},
extend: function(properties){Hash.each(properties,function(value,key){Hash.set(this,key,value);},this);return this;},
combine: function(properties){Hash.each(properties,function(value,key){Hash.include(this,key,value);},this);return this;},
erase: function(key){if(this.hasOwnProperty(key))delete this[key];return this;},
get: function(key){return(this.hasOwnProperty(key))? this[key]: null;},
set: function(key,value){if(!this[key]||this.hasOwnProperty(key))this[key]=value;return this;},
empty: function(){Hash.each(this,function(value,key){delete this[key];},this);return this;},
include: function(key,value){var k=this[key];if(k==undefined)this[key]=value;return this;},
map: function(fn,bind){var results=new Hash;Hash.each(this,function(value,key){results.set(key,fn.call(bind,value,key,this));},this);return results;},
filter: function(fn,bind){var results=new Hash;Hash.each(this,function(value,key){if(fn.call(bind,value,key,this))results.set(key,value);},this);return results;},
every: function(fn,bind){for(var key in this){if(this.hasOwnProperty(key)&&!fn.call(bind,this[key],key))return false;}return true;},
some: function(fn,bind){for(var key in this){if(this.hasOwnProperty(key)&&fn.call(bind,this[key],key))return true;}return false;},
getKeys: function(){var keys=[];Hash.each(this,function(value,key){keys.push(key);});return keys;},
getValues: function(){var values=[];Hash.each(this,function(value){values.push(value);});return values;},
toQueryString: function(base){var queryString=[];Hash.each(this,function(value,key){if(base)key=base+'['+key+']';var result;switch($type(value)){case'object': result=Hash.toQueryString(value,key);break;case'array':
var qs={};value.each(function(val,i){qs[i]=val;});result=Hash.toQueryString(qs,key);break;default: result=key+'='+encodeURIComponent(value);}if(value!=undefined)queryString.push(result);});return queryString.join('&');}});Hash.alias({keyOf:'indexOf',hasValue:'contains'});var Class=new Native({name:'Class',
initialize: function(properties){properties=properties||{};var klass=function(){for(var key in this){if($type(this[key])!='function')this[key]=$unlink(this[key]);}this.constructor=klass;if(Class.prototyping)return this;var instance=(this.initialize)? this.initialize.apply(this,arguments): this;if(this.options&&this.options.initialize)this.options.initialize.call(this);return instance;};for(var mutator in Class.Mutators){if(!properties[mutator])continue;properties=Class.Mutators[mutator](properties,properties[mutator]);delete properties[mutator];}$extend(klass,this);klass.constructor=Class;klass.prototype=properties;return klass;}});Class.Mutators={Extends: function(self,klass){Class.prototyping=klass.prototype;var subclass=new klass;delete subclass.parent;subclass=Class.inherit(subclass,self);delete Class.prototyping;return subclass;},
Implements: function(self,klasses){$splat(klasses).each(function(klass){Class.prototying=klass;$extend(self,($type(klass)=='class')? new klass : klass);delete Class.prototyping;});return self;}};$extend(Class,{inherit: function(object,properties){var caller=arguments.callee.caller;for(var key in properties){var override=properties[key];var previous=object[key];var type=$type(override);if(previous&&type=='function'){if(override!=previous){if(caller){override.__parent=previous;object[key]=override;}else{Class.override(object,key,override);}}}else if(type=='object'){object[key]=$merge(previous,override);}else{object[key]=override;}}if(caller)object.parent=function(){return arguments.callee.caller.__parent.apply(this,arguments);};return object;},
override: function(object,name,method){var parent=Class.prototyping;if(parent&&object[name]!=parent[name])parent=null;var override=function(){var previous=this.parent;this.parent=parent ? parent[name]: object[name];var value=method.apply(this,arguments);this.parent=previous;return value;};object[name]=override;}});Class.implement({implement: function(){var proto=this.prototype;$each(arguments,function(properties){Class.inherit(proto,properties);});return this;}});var Chain=new Class({$chain:[],
chain: function(){this.$chain.extend(Array.flatten(arguments));return this;},
callChain: function(){return(this.$chain.length)? this.$chain.shift().apply(this,arguments): false;},
clearChain: function(){this.$chain.empty();return this;}});var Events=new Class({$events:{},
addEvent: function(type,fn,internal){type=Events.removeOn(type);if(fn!=$empty){this.$events[type]=this.$events[type]||[];this.$events[type].include(fn);if(internal)fn.internal=true;}return this;},
addEvents: function(events){for(var type in events)this.addEvent(type,events[type]);return this;},
fireEvent: function(type,args,delay){type=Events.removeOn(type);if(!this.$events||!this.$events[type])return this;this.$events[type].each(function(fn){fn.create({'bind': this,'delay': delay,'arguments': args})();},this);return this;},
removeEvent: function(type,fn){type=Events.removeOn(type);if(!this.$events[type])return this;if(!fn.internal)this.$events[type].erase(fn);return this;},
removeEvents: function(events){if($type(events)=='object'){for(var type in events)this.removeEvent(type,events[type]);return this;}if(events)events=Events.removeOn(events);for(var type in this.$events){if(events&&events!=type)continue;var fns=this.$events[type];for(var i=fns.length;i--;i)this.removeEvent(type,fns[i]);}return this;}});Events.removeOn=function(string){return string.replace(/^on([A-Z])/,function(full,first){return first.toLowerCase();});};var Options=new Class({setOptions: function(){this.options=$merge.run([this.options].extend(arguments));if(!this.addEvent)return this;for(var option in this.options){if($type(this.options[option])!='function'||!(/^on[A-Z]/).test(option))continue;this.addEvent(option,this.options[option]);delete this.options[option];}return this;}});Array.implement({every: function(fn,bind){for(var i=0,l=this.length;i<l;i++){if(!fn.call(bind,this[i],i,this))return false;}return true;},
filter: function(fn,bind){var results=[];for(var i=0,l=this.length;i<l;i++){if(fn.call(bind,this[i],i,this))results.push(this[i]);}return results;},
clean: function(){return this.filter($defined);},
indexOf: function(item,from){var len=this.length;for(var i=(from<0)? Math.max(0,len+from): from||0;i<len;i++){if(this[i]===item)return i;}return-1;},
map: function(fn,bind){var results=[];for(var i=0,l=this.length;i<l;i++)results[i]=fn.call(bind,this[i],i,this);return results;},
some: function(fn,bind){for(var i=0,l=this.length;i<l;i++){if(fn.call(bind,this[i],i,this))return true;}return false;},
associate: function(keys){var obj={},length=Math.min(this.length,keys.length);for(var i=0;i<length;i++)obj[keys[i]]=this[i];return obj;},
link: function(object){var result={};for(var i=0,l=this.length;i<l;i++){for(var key in object){if(object[key](this[i])){result[key]=this[i];delete object[key];break;}}}return result;},
contains: function(item,from){return this.indexOf(item,from)!= -1;},
extend: function(array){for(var i=0,j=array.length;i<j;i++)this.push(array[i]);return this;},
getLast: function(){return(this.length)? this[this.length-1]: null;},
getRandom: function(){return(this.length)? this[$random(0,this.length-1)]: null;},
include: function(item){if(!this.contains(item))this.push(item);return this;},
combine: function(array){for(var i=0,l=array.length;i<l;i++)this.include(array[i]);return this;},
erase: function(item){for(var i=this.length;i--;i){if(this[i]===item)this.splice(i,1);}return this;},
remove: function(index){for(var i=index;this[i+1];i++){this[i]=this[i+1];}this.length=this.length-1;return this;},
empty: function(){this.length=0;return this;},
flatten: function(){var array=[];for(var i=0,l=this.length;i<l;i++){var type=$type(this[i]);if(!type)continue;array=array.concat((type=='array'||type=='collection'||type=='arguments')? Array.flatten(this[i]): this[i]);}return array;},
hexToRgb: function(array){if(this.length!=3)return null;var rgb=this.map(function(value){if(value.length==1)value+=value;return value.toInt(16);});return(array)? rgb :'rgb('+rgb+')';},
rgbToHex: function(array){if(this.length<3)return null;if(this.length==4&&this[3]==0&&!array)return'transparent';var hex=[];for(var i=0;i<3;i++){var bit=(this[i]-0).toString(16);hex.push((bit.length==1)?'0'+bit : bit);}return(array)? hex :'#'+hex.join('');},
pregReplace: function(str,pattern){for(var i=0;i<this.length;i++){str=str.replace(pattern,this[i]);}return(str);}});String.implement({test: function(regex,params){return((typeof regex=='string')? new RegExp(regex,params): regex).test(this);},
contains: function(string,separator){return(separator)?(separator+this+separator).indexOf(separator+string+separator)> -1 : this.indexOf(string)> -1;},
trim: function(){return this.replace(/^\s+|\s+$/g,'');},
clean: function(){return this.replace(/\s+/g,' ').trim();},
camelCase: function(){return this.replace(/-\D/g,function(match){return match.charAt(1).toUpperCase();});},
hyphenate: function(){return this.replace(/[A-Z]/g,function(match){return('-'+match.charAt(0).toLowerCase());});},
capitalize: function(){return this.replace(/\b[a-z]/g,function(match){return match.toUpperCase();});},
escapeRegExp: function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,'\\$1');},
toInt: function(base){return parseInt(this,base||10);},
toFloat: function(){return parseFloat(this);},
hexToRgb: function(array){var hex=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(hex)? hex.slice(1).hexToRgb(array): null;},
hex2rgb: function(){var str=this;if(str.indexOf("#")!= -1)str=str.substr(1);return([parseInt(str.substr(0,2),16),parseInt(str.substr(2,2),16),parseInt(str.substr(4,2),16)]);},
rgbToHex: function(array){var rgb=this.match(/\d{1,3}/g);return(rgb)? rgb.rgbToHex(array): null;},
stripScripts: function(option){var scripts='';var text=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){scripts+=arguments[1]+'\n';return'';});if(option===true)$exec(scripts);else if($type(option)=='function')option(scripts,text);return text;},
substitute: function(object,regexp){return this.replace(regexp||(/\\?\{([^{}]+)\}/g),function(match,name){if(match.charAt(0)=='\\') return match.slice(1);
			return (object[name] != undefined) ? object[name] : '';
		});
	}

});Number.implement({

	limit: function(min, max){
		return Math.min(max, Math.max(min, this));
	},

	round: function(precision){
		precision = Math.pow(10, precision || 0);
		return Math.round(this * precision) / precision;
	},

	times: function(fn, bind){
		for (var i = 0; i < this; i++) fn.call(bind, i, this);
	},

	toFloat: function(){
		return parseFloat(this);
	},

	toInt: function(base){
		return parseInt(this, base || 10);
	}

});

Number.alias('times', 'each');

(function(math){
	var methods = {};
	math.each(function(name){
		if (!Number[name]) methods[name] = function(){
			return Math[name].apply(null, [this].concat($A(arguments)));
		};
	});
	Number.implement(methods);
})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);

Function.implement({

	extend: function(properties){
		for (var property in properties) this[property] = properties[property];
		return this;
	},

	create: function(options){
		var self = this;
		options = options || {};
		return function(event){
			var args = options.arguments;
			args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0);
			if (options.event) args = [event || window.event].extend(args);
			var returns = function(){
				return self.apply(options.bind || null, args);
			};
			if (options.delay) return setTimeout(returns, options.delay);
			if (options.periodical) return setInterval(returns, options.periodical);
			if (options.attempt) return $try(returns);
			return returns();
		};
	},

	run: function(args, bind){
		return this.apply(bind, $splat(args));
	},

	pass: function(args, bind){
		return this.create({bind: bind, arguments: args});
	},

	bind: function(bind, args){
		return this.create({bind: bind, arguments: args});
	},

	bindWithEvent: function(bind, args){
		return this.create({bind: bind, arguments: args, event: true});
	},

	attempt: function(args, bind){
		return this.create({bind: bind, arguments: args, attempt: true})();
	},

	delay: function(delay, bind, args){
		return this.create({bind: bind, arguments: args, delay: delay})();
	},

	periodical: function(periodical, bind, args){
		return this.create({bind: bind, arguments: args, periodical: periodical})();
	}

});
var Event = new Native({

	name: 'Event',

	initialize: function(event, win){
		win = win || window;
		var doc = win.document;
		event = event || win.event;
		if (event.$extended) return event;
		this.$extended = true;
		var type = event.type;
		var target = event.target || event.srcElement;
		while (target && target.nodeType == 3) target = target.parentNode;

		if (type.test(/key/)){
			var code = event.which || event.keyCode;
			var key = Event.Keys.keyOf(code);
			if (type == 'keydown'){
				var fKey = code - 111;
				if (fKey > 0 && fKey < 13) key = 'f' + fKey;
			}
			key = key || String.fromCharCode(code).toLowerCase();
		} else if (type.match(/(click|mouse|menu)/i)){
			doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
			var page = {
				x: event.pageX || event.clientX + doc.scrollLeft,
				y: event.pageY || event.clientY + doc.scrollTop
			};
			var client = {
				x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX,
				y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY
			};
			if (type.match(/DOMMouseScroll|mousewheel/)){
				var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : - (event.detail || 0) / 3;
			}
			var rightClick = (event.which == 3) || (event.button == 2);
			var related = null;
			if (type.match(/over|out/)){
				switch (type){
					case 'mouseover': related = event.relatedTarget || event.fromElement; break;
					case 'mouseout': related = event.relatedTarget || event.toElement;
				}
				if (!(function(){
					while (related && related.nodeType == 3) related = related.parentNode;
					return true;
				}).create({attempt: Browser.Engine.gecko})()) related = false;
			}
		}

		return $extend(this, {
			event: event,
			type: type,

			page: page,
			client: client,
			rightClick: rightClick,

			wheel: wheel,

			relatedTarget: related,
			target: target,

			code: code,
			key: key,

			shift: event.shiftKey,
			control: event.ctrlKey,
			alt: event.altKey,
			meta: event.metaKey
		});
	}

});

Event.Keys = new Hash({
	'enter': 13,
	'up': 38,
	'down': 40,
	'left': 37,
	'right': 39,
	'esc': 27,
	'space': 32,
	'backspace': 8,
	'tab': 9,
	'delete': 46
});

Event.implement({

	stop: function(){
		return this.stopPropagation().preventDefault();
	},

	stopPropagation: function(){
		if (this.event.stopPropagation) this.event.stopPropagation();
		else this.event.cancelBubble = true;
		return this;
	},

	preventDefault: function(){
		if (this.event.preventDefault) this.event.preventDefault();
		else this.event.returnValue = false;
		return this;
	}

});var Element = new Native({

	name: 'Element',

	legacy: window.Element,

	initialize: function(tag, props){
		var konstructor = Element.Constructors.get(tag);
		if (konstructor) return konstructor(props);
		if (typeof tag == 'string') return document.newElement(tag, props);
		return $(tag).set(props);
	},

	afterImplement: function(key, value){
		Element.Prototype[key] = value;
		if (Array[key]) return;
		Elements.implement(key, function(){
			var items = [], elements = true;
			for (var i = 0, j = this.length; i < j; i++){
				var returns = this[i][key].apply(this[i], arguments);
				items.push(returns);
				if (elements) elements = ($type(returns) == 'element');
			}
			return (elements) ? new Elements(items) : items;
		});
	}

});

Element.Prototype = {$family: {name: 'element'}};

Element.Constructors = new Hash;

var IFrame = new Native({

	name: 'IFrame',

	generics: false,

	initialize: function(){
		var params = Array.link(arguments, {properties: Object.type, iframe: $defined});
		var props = params.properties || {};
		var iframe = $(params.iframe) || false;
		var onload = props.onload || $empty;
		delete props.onload;
		props.id = props.name = $pick(props.id, props.name, iframe.id, iframe.name, 'IFrame_' + $time());
		iframe = new Element(iframe || 'iframe', props);
		var onFrameLoad = function(){
			var host = $try(function(){
				return iframe.contentWindow.location.host;
			});
			if (host && host == window.location.host){
				var win = new Window(iframe.contentWindow);
				new Document(iframe.contentWindow.document);
				$extend(win.Element.prototype, Element.Prototype);
			}
			onload.call(iframe.contentWindow, iframe.contentWindow.document);
		};
		(window.frames[props.id]) ? onFrameLoad() : iframe.addListener('load', onFrameLoad);
		return iframe;
	}

});

var Elements = new Native({

	initialize: function(elements, options){
		options = $extend({ddup: true, cash: true}, options);
		elements = elements || [];
		if (options.ddup || options.cash){
			var uniques = {}, returned = [];
			for (var i = 0, l = elements.length; i < l; i++){
				var el = $.element(elements[i], !options.cash);
				if (options.ddup){
					if (uniques[el.uid]) continue;
					uniques[el.uid] = true;
				}
				returned.push(el);
			}
			elements = returned;
		}
		return (options.cash) ? $extend(elements, this) : elements;
	}

});

Elements.implement({

	filter: function(filter, bind){
		if (!filter) return this;
		return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){
			return item.match(filter);
		} : filter, bind));
	}

});

Document.implement({

	newElement: function(tag, props){
		if (!is_ie9 && Browser.Engine.trident && props){
			['name', 'type', 'checked'].each(function(attribute){
				if (!props[attribute]) return;
				tag += '' + attribute + '="' + props[attribute] + '"';
				if (attribute != 'checked') delete props[attribute];
			});
			tag = '<' + tag + '>';
		}
		return $.element(this.createElement(tag)).set(props);
	},

	newTextNode: function(text){
		return this.createTextNode(text);
	},

	getDocument: function(){
		return this;
	},

	getWindow: function(){
		return this.window;
	}

});

Window.implement({

	$: function(el, nocash){
		if (el && el.$family && el.uid) return el;
		var type = $type(el);
		return ($[type]) ? $[type](el, nocash, this.document) : null;
	},

	$$: function(selector){
		if (arguments.length == 1 && typeof selector == 'string') return this.document.getElements(selector);
		var elements = [];
		var args = Array.flatten(arguments);
		for (var i = 0, l = args.length; i < l; i++){
			var item = args[i];
			switch ($type(item)){
				case 'element': elements.push(item); break;
				case 'string': elements.extend(this.document.getElements(item, true));
			}
		}
		return new Elements(elements);
	},

	getDocument: function(){
		return this.document;
	},

	getWindow: function(){
		return this;
	}

});

$.string = function(id, nocash, doc){
	id = doc.getElementById(id);
	return (id) ? $.element(id, nocash) : null;
};

$.element = function(el, nocash){
	$uid(el);
	if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){
		var proto = Element.Prototype;
		for (var p in proto) el[p] = proto[p];
	};
	return el;
};

$.object = function(obj, nocash, doc){
	if (obj.toElement) return $.element(obj.toElement(doc), nocash);
	return null;
};

$.textnode = $.whitespace = $.window = $.document = $arguments(0);

Native.implement([Element, Document], {

	getElement: function(selector, nocash){
		return $(this.getElements(selector, true)[0] || null, nocash);
	},

	getElements: function(tags, nocash){
		tags = tags.split(',');
		var elements = [];
		var ddup = (tags.length > 1);
		tags.each(function(tag){
			var partial = this.getElementsByTagName(tag.trim());
			(ddup) ? elements.extend(partial) : elements = partial;
		}, this);
		return new Elements(elements, {ddup: ddup, cash: !nocash});
	}

});

(function(){

var collected = {}, storage = {};
var props = {input: 'checked', option: 'selected', textarea: (Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerHTML' : 'value'};

var get = function(uid){
	return (storage[uid] || (storage[uid] = {}));
};

var clean = function(item, retain){
	if (!item) return;
	var uid = item.uid;
	if (Browser.Engine.trident){
		if (item.clearAttributes){
			var clone = retain && item.cloneNode(false);
			item.clearAttributes();
			if (clone) item.mergeAttributes(clone);
		} else if (item.removeEvents){
			item.removeEvents();
		}
		if ((/object/i).test(item.tagName)){
			for (var p in item){
				if (typeof item[p] == 'function') item[p] = $empty;
			}
			Element.dispose(item);
		}
	}	
	if (!uid) return;
	collected[uid] = storage[uid] = null;
};

var purge = function(){
	Hash.each(collected, clean);
	if (Browser.Engine.trident) $A(document.getElementsByTagName('object')).each(clean);
	if (window.CollectGarbage) CollectGarbage();
	collected = storage = null;
};

var walk = function(element, walk, start, match, all, nocash){
	var el = element[start || walk];
	var elements = [];
	while (el){
		if (el.nodeType == 1 && (!match || Element.match(el, match))){
			if (!all) return $(el, nocash);
			elements.push(el);
		}
		el = el[walk];
	}
	return (all) ? new Elements(elements, {ddup: false, cash: !nocash}) : null;
};

var attributes = {
	'html': 'innerHTML',
	'class': 'className',
	'for': 'htmlFor',
	'text': (Browser.Engine.trident || (Browser.Engine.webkit && Browser.Engine.version < 420)) ? 'innerText' : 'textContent'
};
var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'noresize', 'defer'];
var camels = ['value', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', 'rowSpan', 'tabIndex', 'useMap'];

Hash.extend(attributes, bools.associate(bools));
Hash.extend(attributes, camels.associate(camels.map(String.toLowerCase)));

var inserters = {

	before: function(context, element){
		if (element.parentNode) element.parentNode.insertBefore(context, element);
	},

	after: function(context, element){
		if (!element.parentNode) return;
		var next = element.nextSibling;
		(next) ? element.parentNode.insertBefore(context, next) : element.parentNode.appendChild(context);
	},

	bottom: function(context, element){
		element.appendChild(context);
	},

	top: function(context, element){
		var first = element.firstChild;
		(first) ? element.insertBefore(context, first) : element.appendChild(context);
	}

};

inserters.inside = inserters.bottom;

Hash.each(inserters, function(inserter, where){

	where = where.capitalize();

	Element.implement('inject' + where, function(el){
		inserter(this, $(el, true));
		return this;
	});

	Element.implement('grab' + where, function(el){
		inserter($(el, true), this);
		return this;
	});

});

Element.implement({

	set: function(prop, value){
		switch ($type(prop)){
			case 'object':
				for (var p in prop) this.set(p, prop[p]);
				break;
			case 'string':
				var property = Element.Properties.get(prop);
				(property && property.set) ? property.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(prop, value);
		}
		return this;
	},

	get: function(prop){
		var property = Element.Properties.get(prop);
		return (property && property.get) ? property.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(prop);
	},

	erase: function(prop){
		var property = Element.Properties.get(prop);
		(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
		return this;
	},

	setProperty: function(attribute, value){
		var key = attributes[attribute];
		if (value == undefined) return this.removeProperty(attribute);
		if (key && bools[attribute]) value = !!value;
		(key) ? this[key] = value : this.setAttribute(attribute, '' + value);
		return this;
	},

	setProperties: function(attributes){
		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
		return this;
	},

	getProperty: function(attribute){
		var key = attributes[attribute];
		var value = (key) ? this[key] : this.getAttribute(attribute, 2);
		return (bools[attribute]) ? !!value : (key) ? value : value || null;
	},

	getProperties: function(){
		var args = $A(arguments);
		return args.map(this.getProperty, this).associate(args);
	},

	removeProperty: function(attribute){
		var key = attributes[attribute];
		(key) ? this[key] = (key && bools[attribute]) ? false : '' : this.removeAttribute(attribute);
		return this;
	},

	removeProperties: function(){
		Array.each(arguments, this.removeProperty, this);
		return this;
	},

	hasClass: function(className){
		return this.className.contains(className, '');
	},

	addClass: function(className){
		if (!this.hasClass(className)) this.className = (this.className + '' + className).clean();
		return this;
	},

	removeClass: function(className){
		this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
		return this;
	},

	toggleClass: function(className){
		return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
	},

	adopt: function(){
		Array.flatten(arguments).each(function(element){
			element = $(element, true);
			if (element) this.appendChild(element);
		}, this);
		return this;
	},

	appendText: function(text, where){
		return this.grab(this.getDocument().newTextNode(text), where);
	},

	grab: function(el, where){
		inserters[where || 'bottom']($(el, true), this);
		return this;
	},

	inject: function(el, where){
		inserters[where || 'bottom'](this, $(el, true));
		return this;
	},

	replaces: function(el){
		el = $(el, true);
		el.parentNode.replaceChild(this, el);
		return this;
	},

	wraps: function(el, where){
		el = $(el, true);
		return this.replaces(el).grab(el, where);
	},

	getPrevious: function(match, nocash){
		return walk(this, 'previousSibling', null, match, false, nocash);
	},

	getAllPrevious: function(match, nocash){
		return walk(this, 'previousSibling', null, match, true, nocash);
	},

	getNext: function(match, nocash){
		return walk(this, 'nextSibling', null, match, false, nocash);
	},

	getAllNext: function(match, nocash){
		return walk(this, 'nextSibling', null, match, true, nocash);
	},

	getFirst: function(match, nocash){
		return walk(this, 'nextSibling', 'firstChild', match, false, nocash);
	},

	getLast: function(match, nocash){
		return walk(this, 'previousSibling', 'lastChild', match, false, nocash);
	},

	getParent: function(match, nocash){
		return walk(this, 'parentNode', null, match, false, nocash);
	},

	getParents: function(match, nocash){
		return walk(this, 'parentNode', null, match, true, nocash);
	},

	getChildren: function(match, nocash){
		return walk(this, 'nextSibling', 'firstChild', match, true, nocash);
	},

	getWindow: function(){
		return this.ownerDocument.window;
	},

	getDocument: function(){
		return this.ownerDocument;
	},

	getElementById: function(id, nocash){
		var el = this.ownerDocument.getElementById(id);
		if (!el) return null;
		for (var parent = el.parentNode; parent != this; parent = parent.parentNode){
			if (!parent) return null;
		}
		return $.element(el, nocash);
	},

	getSelected: function(){
		return new Elements($A(this.options).filter(function(option){
			return option.selected;
		}));
	},

	getComputedStyle: function(property){
		if (this.currentStyle) return this.currentStyle[property.camelCase()];
		var computed = this.getDocument().defaultView.getComputedStyle(this, null);
		return (computed) ? computed.getPropertyValue([property.hyphenate()]) : null;
	},

	toQueryString: function(){
		var queryString = [];
		this.getElements('input,select,textarea', true).each(function(el){
			if (!el.name || el.disabled) return;
			var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){
				return opt.value;
			}) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;
			$splat(value).each(function(val){
				if (typeof val != 'undefined') queryString.push(el.name + '=' + encodeURIComponent(val));
			});
		});
		return queryString.join('&');
	},

	clone: function(contents, keepid){
		contents = contents !== false;
		var clone = this.cloneNode(contents);
		var clean = function(node, element){
			if (!keepid) node.removeAttribute('id');
			if (Browser.Engine.trident){
				node.clearAttributes();
				node.mergeAttributes(element);
				node.removeAttribute('uid');
				if (node.options){
					var no = node.options, eo = element.options;
					for (var j = no.length; j--;) no[j].selected = eo[j].selected;
				}
			}
			var prop = props[element.tagName.toLowerCase()];
			if (prop && element[prop]) node[prop] = element[prop];
		};

		if (contents){
			var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*');
			for (var i = ce.length; i--;) clean(ce[i], te[i]);
		}

		clean(clone, this);
		return $(clone);
	},

	destroy: function(){
		Element.empty(this);
		Element.dispose(this);
		clean(this, true);
		return null;
	},

	empty: function(){
		$A(this.childNodes).each(function(node){
			Element.destroy(node);
		});
		return this;
	},

	dispose: function(){
		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
	},

	hasChild: function(el){
		el = $(el, true);
		if (!el) return false;
		if (Browser.Engine.webkit && Browser.Engine.version < 420) return $A(this.getElementsByTagName(el.tagName)).contains(el);
		return (this.contains) ? (this != el && this.contains(el)) : !!(this.compareDocumentPosition(el) & 16);
	},

	match: function(tag){
		return (!tag || (tag == this) || (Element.get(this, 'tag') == tag));
	}

});

Native.implement([Element, Window, Document], {

	addListener: function(type, fn){
		if (type == 'unload'){
			var old = fn, self = this;
			fn = function(){
				self.removeListener('unload', fn);
				old();
			};
		} else {
			collected[this.uid] = this;
		}
		if (this.addEventListener) this.addEventListener(type, fn, false);
		else this.attachEvent('on' + type, fn);
		return this;
	},

	removeListener: function(type, fn){
		if (this.removeEventListener) this.removeEventListener(type, fn, false);
		else this.detachEvent('on' + type, fn);
		return this;
	},

	retrieve: function(property, dflt){
		var storage = get(this.uid), prop = storage[property];
		if (dflt != undefined && prop == undefined) prop = storage[property] = dflt;
		return $pick(prop);
	},

	store: function(property, value){
		var storage = get(this.uid);
		storage[property] = value;
		return this;
	},

	eliminate: function(property){
		var storage = get(this.uid);
		delete storage[property];
		return this;
	}

});

window.addListener('unload', purge);

})();

Element.Properties = new Hash;

Element.Properties.style = {

	set: function(style){
		this.style.cssText = style;
	},

	get: function(){
		return this.style.cssText;
	},

	erase: function(){
		this.style.cssText = '';
	}

};

Element.Properties.tag = {

	get: function(){
		return this.tagName.toLowerCase();
	}

};

Element.Properties.html = (function(){
	var wrapper = document.createElement('div');

	var translations = {
		table: [1, '<table>', '</table>'],
		select: [1, '<select>', '</select>'],
		tbody: [2, '<table><tbody>', '</tbody></table>'],
		tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
	};
	translations.thead = translations.tfoot = translations.tbody;

	var html = {
		set: function(){
			var html = Array.flatten(arguments).join('');
			var wrap = Browser.Engine.trident && translations[this.get('tag')];
			if (wrap){
				var first = wrapper;
				first.innerHTML = wrap[1] + html + wrap[2];
				for (var i = wrap[0]; i--;) first = first.firstChild;
				this.empty().adopt(first.childNodes);
			} else {
				this.innerHTML = html;
			}
		}
	};

	html.erase = html.set;

	return html;
})();

if (Browser.Engine.webkit && Browser.Engine.version < 420) Element.Properties.text = {
	get: function(){
		if (this.innerText) return this.innerText;
		var temp = this.ownerDocument.newElement('div', {html: this.innerHTML}).inject(this.ownerDocument.body);
		var text = temp.innerText;
		temp.destroy();
		return text;
	}
};
Element.Properties.styles = {set: function(styles){
	this.setStyles(styles);
}};

Element.Properties.opacity = {

	set: function(opacity, novisibility){
		if (!novisibility){
			if (opacity == 0){
				if (this.style.visibility != 'hidden') this.style.visibility = 'hidden';
			} else {
				if (this.style.visibility != 'visible') this.style.visibility = 'visible';
			}
		}
		if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1;
		if (Browser.Engine.trident) this.style.filter = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')';
		this.style.opacity = opacity;
		this.store('opacity', opacity);
	},

	get: function(){
		return this.retrieve('opacity', 1);
	}

};

Element.implement({

	setOpacity: function(value){
		return this.set('opacity', value, true);
	},

	getOpacity: function(){
		return this.get('opacity');
	},

	setStyle: function(property, value){
		switch (property){
			case 'opacity': return this.set('opacity', parseFloat(value));
			case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
		}
		property = property.camelCase();
		if ($type(value) != 'string'){
			var map = (Element.Styles.get(property) || '@').split('');
			value = $splat(value).map(function(val, i){
				if (!map[i]) return '';
				return ($type(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
			}).join('');
		} else if (value == String(Number(value))){
			value = Math.round(value);
		}
		this.style[property] = value;
		return this;
	},

	getStyle: function(property){
		switch (property){
			//case 'opacity': return this.get('opacity');
			case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
		}
		property = property.camelCase();
		var result = this.style[property];
		if (!$chk(result)){
			result = [];
			for (var style in Element.ShortStyles){
				if (property != style) continue;
				for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
				return result.join('');
			}
			result = this.getComputedStyle(property);
		}
		if (result){
			result = String(result);
			var color = result.match(/rgba?\([\d\s,]+\)/);
			if (color) result = result.replace(color[0], color[0].rgbToHex());
		}
		if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(result)))){
			if (property.test(/^(height|width)$/)){
				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
				values.each(function(value){
					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
				}, this);
				return this['offset' + property.capitalize()] - size + 'px';
			}
			if ((Browser.Engine.presto) && String(result).test('px')) return result;
			if (property.test(/(border(.+)Width|margin|padding)/)) return '0px';
		}
		return result;
	},

	setStyles: function(styles){
		for (var style in styles) this.setStyle(style, styles[style]);
		return this;
	},

	getStyles: function(){
		var result = {};
		Array.each(arguments, function(key){
			result[key] = this.getStyle(key);
		}, this);
		return result;
	}

});

Element.Styles = new Hash({
	left: '@px', top: '@px', bottom: '@px', right: '@px',
	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
	backgroundColor: 'rgb(@,@,@)', backgroundPosition: '@px @px', color: 'rgb(@,@,@)',
	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@,@,@)@px @ rgb(@,@,@)@px @ rgb(@,@,@)',
	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@,@,@)rgb(@,@,@)rgb(@,@,@)rgb(@,@,@)',
	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
});

Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};

['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
	var Short = Element.ShortStyles;
	var All = Element.Styles;
	['margin', 'padding'].each(function(style){
		var sd = style + direction;
		Short[style][sd] = All[sd] = '@px';
	});
	var bd = 'border' + direction;
	Short.border[bd] = All[bd] = '@px @ rgb(@,@,@)';
	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
	Short[bd] = {};
	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@,@,@)';
});
Element.Properties.events = {set: function(events){
	this.addEvents(events);
}};

Native.implement([Element, Window, Document], {

	addEvent: function(type, fn){
		var events = this.retrieve('events', {});
		events[type] = events[type] || {'keys': [], 'values': []};
		if (events[type].keys.contains(fn)) return this;
		events[type].keys.push(fn);
		var realType = type, custom = Element.Events.get(type), condition = fn, self = this;
		if (custom){
			if (custom.onAdd) custom.onAdd.call(this, fn);
			if (custom.condition){
				condition = function(event){
					if (custom.condition.call(this, event)) return fn.call(this, event);
					return true;
				};
			}
			realType = custom.base || realType;
		}
		var defn = function(event){
			return fn.call(self, event);
		};
		var nativeEvent = Element.NativeEvents[realType];
		if (nativeEvent){
			if (nativeEvent == 2){
				defn = function(event){
					event = new Event(event, self.getWindow());
					if (condition.call(self, event) === false) event.stop();
				};
			}
			this.addListener(realType, defn);
		}
		events[type].values.push(defn);
		return this;
	},

	removeEvent: function(type, fn){
		var events = this.retrieve('events');
		if (!events || !events[type]) return this;
		var pos = events[type].keys.indexOf(fn);
		if (pos == -1) return this;
		events[type].keys.splice(pos, 1);
		var value = events[type].values.splice(pos, 1)[0];
		var custom = Element.Events.get(type);
		if (custom){
			if (custom.onRemove) custom.onRemove.call(this, fn);
			type = custom.base || type;
		}
		return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this;
	},

	addEvents: function(events){
		for (var event in events) this.addEvent(event, events[event]);
		return this;
	},

	removeEvents: function(events){
		if ($type(events) == 'object'){
			for (var type in events) this.removeEvent(type, events[type]);
			return this;
		}
		var attached = this.retrieve('events');
		if (!attached) return this;
		if (!events){
			for (var type in attached) this.removeEvents(type);
			this.eliminate('events');
		} else if (attached[events]){
			while (attached[events].keys[0]) this.removeEvent(events, attached[events].keys[0]);
			attached[events] = null;
		}
		return this;
	},

	fireEvent: function(type, args, delay){
		var events = this.retrieve('events');
		if (!events || !events[type]) return this;
		events[type].keys.each(function(fn){
			fn.create({'bind': this, 'delay': delay, 'arguments': args})();
		}, this);
		return this;
	},

	cloneEvents: function(from, type){
		from = $(from);
		var fevents = from.retrieve('events');
		if (!fevents) return this;
		if (!type){
			for (var evType in fevents) this.cloneEvents(from, evType);
		} else if (fevents[type]){
			fevents[type].keys.each(function(fn){
				this.addEvent(type, fn);
			}, this);
		}
		return this;
	}

});

Element.NativeEvents = {
	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
	keydown: 2, keypress: 2, keyup: 2, //keyboard
	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
	load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
	error: 1, abort: 1, scroll: 1 //misc
};

(function(){
	
	var $check = function(event){
		var related = event.relatedTarget;
		if (related == undefined) return true;
		if (related === false) return false;
		return ($type(this) != 'document' && related != this && related.prefix != 'xul' && !this.hasChild(related));
	};

	Element.Events = new Hash({

		mouseenter: {
			base: 'mouseover',
			condition: $check
		},

		mouseleave: {
			base: 'mouseout',
			condition: $check
		},

		mousewheel: {
			base: (!Browser.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel'
		}

	});

	Element.Events.domready = {

		onAdd: function(fn){
			if (Browser.loaded) fn.call(this);
		}

	};

	var domready = function(){
		if (Browser.loaded) return;
		Browser.loaded = true;
		window.fireEvent('domready');
		document.fireEvent('domready');
	};

	if (Browser.Engine.trident){
		var temp = document.createElement('div');
		(function(){
			($try(function(){
				temp.doScroll('left');
				return $(temp).inject(document.body).set('html', 'temp').dispose();
			})) ? domready() : arguments.callee.delay(50);
		})();
	} else if (Browser.Engine.webkit && Browser.Engine.version < 525){
		(function(){
			(['loaded', 'complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50);
		})();
	} else {
		window.addEvent('load', domready);
		document.addEvent('DOMContentLoaded', domready);
	}

})();(function(){

Element.implement({

	scrollTo: function(x, y){
		if (isBody(this)){
			this.getWindow().scrollTo(x, y);
		} else {
			this.scrollLeft = x;
			this.scrollTop = y;
		}
		return this;
	},

	getSize: function(){
		if (isBody(this)) return this.getWindow().getSize();
		return {x: this.offsetWidth, y: this.offsetHeight};
	},

	getScrollSize: function(){
		if (isBody(this)) return this.getWindow().getScrollSize();
		return {x: this.scrollWidth, y: this.scrollHeight};
	},

	getScroll: function(){
		if (isBody(this)) return this.getWindow().getScroll();
		return {x: this.scrollLeft, y: this.scrollTop};
	},

	getScrolls: function(){
		var element = this, position = {x: 0, y: 0};
		while (element && !isBody(element)){
			position.x += element.scrollLeft;
			position.y += element.scrollTop;
			element = element.parentNode;
		}
		return position;
	},

	getOffsetParent: function(){
		var element = this;
		if (isBody(element)) return null;
		if (!Browser.Engine.trident) return element.offsetParent;
		while ((element = element.parentNode) && !isBody(element)){
			if (styleString(element, 'position') != 'static') return element;
		}
		return null;
	},

	getOffsets: function(){
		if (Browser.Engine.trident){
			var bound = this.getBoundingClientRect(), html = this.getDocument().documentElement;
			return {
				x: bound.left + html.scrollLeft - html.clientLeft,
				y: bound.top + html.scrollTop - html.clientTop
			};
		}

		var element = this, position = {x: 0, y: 0};
		if (isBody(this)) return position;

		while (element && !isBody(element)){
			position.x += element.offsetLeft;
			position.y += element.offsetTop;

			if (Browser.Engine.gecko){
				if (!borderBox(element)){
					position.x += leftBorder(element);
					position.y += topBorder(element);
				}
				var parent = element.parentNode;
				if (parent && styleString(parent, 'overflow') != 'visible'){
					position.x += leftBorder(parent);
					position.y += topBorder(parent);
				}
			} else if (element != this && Browser.Engine.webkit){
				position.x += leftBorder(element);
				position.y += topBorder(element);
			}

			element = element.offsetParent;
		}
		if (Browser.Engine.gecko && !borderBox(this)){
			position.x -= leftBorder(this);
			position.y -= topBorder(this);
		}
		return position;
	},

	getPosition: function(relative){
		if (isBody(this)) return {x: 0, y: 0};
		var offset = this.getOffsets(), scroll = this.getScrolls();
		var position = {x: offset.x - scroll.x, y: offset.y - scroll.y};
		var relativePosition = (relative && (relative = $(relative))) ? relative.getPosition() : {x: 0, y: 0};
		return {x: position.x - relativePosition.x, y: position.y - relativePosition.y};
	},

	getCoordinates: function(element){
		if (isBody(this)) return this.getWindow().getCoordinates();
		var position = this.getPosition(element), size = this.getSize();
		var obj = {left: position.x, top: position.y, width: size.x, height: size.y};
		obj.right = obj.left + obj.width;
		obj.bottom = obj.top + obj.height;
		return obj;
	},

	computePosition: function(obj){
		return {left: obj.x - styleNumber(this, 'margin-left'), top: obj.y - styleNumber(this, 'margin-top')};
	},

	position: function(obj){
		return this.setStyles(this.computePosition(obj));
	}

});

Native.implement([Document, Window], {

	getSize: function(){
		var win = this.getWindow();
		if (Browser.Engine.presto || Browser.Engine.webkit) return {x: win.innerWidth, y: win.innerHeight};
		var doc = getCompatElement(this);
		return {x: doc.clientWidth, y: doc.clientHeight};
	},

	getScroll: function(){
		var win = this.getWindow();
		var doc = getCompatElement(this);
		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
	},

	getScrollSize: function(){
		var doc = getCompatElement(this);
		var min = this.getSize();
		return {x: Math.max(doc.scrollWidth, min.x), y: Math.max(doc.scrollHeight, min.y)};
	},

	getPosition: function(){
		return {x: 0, y: 0};
	},

	getCoordinates: function(){
		var size = this.getSize();
		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
	}

});

// private methods

var styleString = Element.getComputedStyle;

function styleNumber(element, style){
	return styleString(element, style).toInt() || 0;
};

function borderBox(element){
	return styleString(element, '-moz-box-sizing') == 'border-box';
};

function topBorder(element){
	return styleNumber(element, 'border-top-width');
};

function leftBorder(element){
	return styleNumber(element, 'border-left-width');
};

function isBody(element){
	return (/^(?:body|html)$/i).test(element.tagName);
};

function getCompatElement(element){
	var doc = element.getDocument();
	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
};

})();

//aliases

Native.implement([Window, Document, Element], {

	getHeight: function(){
		return this.getSize().y;
	},

	getWidth: function(){
		return this.getSize().x;
	},

	getScrollTop: function(){
		return this.getScroll().y;
	},

	getScrollLeft: function(){
		return this.getScroll().x;
	},

	getScrollHeight: function(){
		return this.getScrollSize().y;
	},

	getScrollWidth: function(){
		return this.getScrollSize().x;
	},

	getTop: function(){
		return this.getPosition().y;
	},

	getLeft: function(){
		return this.getPosition().x;
	}

});
var Anim = new Native({

	name: 'Anim',

	initialize: function(object){
		if ($type(object) == 'hash') object = $unlink(object.getClean());
		for (var key in object) this[key] = object[key];
		return this;
	}

});




$extend(Anim,{

	
	FxList : [],
	colorProperties: ['borderColor', 'backgroundColor', 'color'],
	alphaProperties: ['opacity'],
	oneSizeProperties: ['width', 'height', 'top', 'left', 'bottom', 'right', 'maxWidth', 'minWidth', 'maxHeight', 'minHeight', 'textIndent', 'letterSpacing', 'lineHeight', 'zIndex', 'fontSize', 'borderWidth', 'marginTop', 'marginLeft', 'marginRight', 'marginBottom'],
	fourSizeProperties: ['clip', 'margin', 'padding'],
	scrollProperties: ['scrollTop', 'scrollLeft'],
	playAnim: function(Obj){
		Obj.anim.timeElapsed	= new Date().getTime()-Obj.anim.startTimer;
		if(this.playSet(Obj)) this.stopAnim(Obj);
		Obj.fireEvent("animplay");
		return Obj;
	},
	
	stopAnim: function(Obj){
		clearInterval(Obj.anim.intervalObj);
		Obj.anim.inAnim		= false;
		Obj.fireEvent("animfinish");
		return Obj;
	},
	
	playSet: function(Obj){
		if(Obj.anim.duration <= Obj.anim.timeElapsed){
			for(var index in Obj.anim.coords){
				if (this.scrollProperties.contains(index)) 
					Obj[index] = Obj.anim.coord['goal_'+index]
				else if(this.alphaProperties.contains(index)){
					Obj.setStyle(index, Obj.anim.coord['goal_'+index]);
				}
				else if(this.oneSizeProperties.contains(index)){
					//Obj.setStyle(index, Obj.anim.coord['goal_'+index].toString()+"px");
					//alert(Anim.properties[index].replace("@", Obj.anim.coord['goal_'+index]));
					Obj.setStyle(index, Element.Styles[index].replace("@", Obj.anim.coord['goal_'+index]));
				}
				else if(this.colorProperties.contains(index)){
					Obj.setStyle(index, Obj.anim.coord['goal_'+index]);
				}
				else if (this.fourSizeProperties.contains(index)) {
					var goal = new Array();
					goal = this.fourSizeParser(Obj.anim.coord['goal_'+index]);
					Obj.setStyle(index, goal.pregReplace(Element.Styles[index], "@"));
				}
			}
			return true;
		}else{
			for(var index in Obj.anim.coords){
				if (this.scrollProperties.contains(index)) {
					var newVar = this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseInt(Obj.anim.coord['ori_'+index]), Obj.anim.coord['goal_'+index] - parseInt(Obj.anim.coord['ori_'+index]), Obj.anim.duration);
						
						Obj[index] = newVar;
				}else if(this.alphaProperties.contains(index)){
					var newVar = this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseFloat(Obj.anim.coord['ori_'+index]), Obj.anim.coord['goal_'+index] - parseFloat(Obj.anim.coord['ori_'+index]), Obj.anim.duration);
					Obj.setStyle(index, newVar);
				}
				else if(this.oneSizeProperties.contains(index)){
					var newVar = this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseInt(Obj.anim.coord['ori_'+index]), Obj.anim.coord['goal_'+index] - parseInt(Obj.anim.coord['ori_'+index]), Obj.anim.duration);
					
					//alert(Obj.anim.coord['ori_'+index]);
						Obj.setStyle(index, Element.Styles[index].replace("@", newVar.round().toString()));
					
				}
				else if(this.colorProperties.contains(index)){
					var RGB = new Array();
					var origin = this.colorParser(Obj.anim.coord['ori_'+index]);
					var goal = this.colorParser(Obj.anim.coord['goal_'+index]);
					
					RGB[0] = Math.round(this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseInt(origin[0]), goal[0] - parseInt(origin[0]), Obj.anim.duration));
					RGB[1] = Math.round(this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseInt(origin[1]), goal[1] - parseInt(origin[1]), Obj.anim.duration));
					RGB[2] = Math.round(this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseInt(origin[2]), goal[2] - parseInt(origin[2]), Obj.anim.duration));
					Obj.setStyle(index, RGB.rgbToHex());
				}
				else if (this.fourSizeProperties.contains(index)) {
					var origin = this.fourSizeParser(Obj.anim.coord['ori_'+index]);
					var goal = this.fourSizeParser(Obj.anim.coord['goal_'+index]);
					var result = new Array();
					
					result[0] = Math.round(this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseInt(origin[0]), goal[0] - parseInt(origin[0]), Obj.anim.duration));
					result[1] = Math.round(this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseInt(origin[1]), goal[1] - parseInt(origin[1]), Obj.anim.duration));
					result[2] = Math.round(this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseInt(origin[2]), goal[2] - parseInt(origin[2]), Obj.anim.duration));
					result[3] = Math.round(this['Fx_'+Obj.anim.Fx](Obj.anim.timeElapsed, parseInt(origin[3]), goal[3] - parseInt(origin[3]), Obj.anim.duration));
					Obj.setStyle(index, result.pregReplace(Element.Styles[index], '@'));
				}
			}
			return false;
		}
	},
	
	colorParser: function(value){
		if (value.match(/^#[0-9a-f]{3,6}$/i)){ return value.hex2rgb();}
		return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
	},
		
	fourSizeParser: function(value) {
		lol = value.match(/(px)/g);
		if (lol && lol.length == 1)
		{
			p = parseInt(value);
			return([p, p, p, p]);
		}
		return ((value = value.match(/([0-9]+)(([a-z]{2})?)(,?)\s*([0-9]+)(([a-z]{2})?)(,?)\s*([0-9]+)(([a-z]{2})?)(,?)\s*([0-9]+)(([a-z]{2})?)\s*/))) ? [value[1], value[5], value[9], value[13]] : false;
	},
	
	addFx: function(name,FxFunction){
		this['Fx_'+name] = FxFunction;
		this['FxList'][this.FxList.length] = FxFunction;
	},
	
	removeFx: function(name){
		var Func = this['Fx_'+name];
		var Index = this['FxList'].contains(Func);
		this['FxList'].removeArray(Index);
		delete this['Fx_'+name];
	}
});



//Element.implement({

function $Anim(Obj){

	$extend(Obj,{
		anim: {
			fps		: 50,
			inAnim		: false,
			intervalObj	: false,
			duration	: 200,
			coord		: {},
			coords		: {},
			startTimer	: false,
			timeElapsed	: false,
			Fx		: "default"
		},

		makeAnim: function(coords, Fx, duration){

			if(typeof coords != "object"){ alert("the Element : '"+this.id+"' as wrong coord datas"); return false; }

			if(Fx && Anim['Fx_'+Fx]){ 
				this.anim.Fx = Fx; 
			}else if(!this.anim.Fx)
				this.anim.Fx = "default";

			if(duration){ 
				this.anim.duration = duration; 
			}else if(!this.anim.duration)
				this.anim.duration = 1000;
			if(this.anim.inAnim){ this.fireEvent('animstop'); Anim.stopAnim(this); }

			for (var coord in coords) {

				if (coords[coord] === false) continue; 
				if (coord == "scrollTop" || coord == "scrollLeft") {
					this.anim.coord['ori_'+coord] = this[coord];
				}
				else if(coord == "opacity"){
					this.anim.coord['ori_'+coord] = parseFloat(this.getStyle(coord));
				}
				else {
					this.anim.coord['ori_'+coord]	= this.getStyle(coord);
					this.anim.coord['ori_'+coord] = this.anim.coord['ori_'+coord] == "auto" ? 0 : this.anim.coord['ori_'+coord];
				}
				this.anim.coord['goal_'+coord]	= coords[coord];
			}

			this.anim.coords = coords;
			//this.fireEvent("animstart");

			this.anim.startTimer	= new Date().getTime();
			var El 			= this;
			this.anim.intervalObj 	= setInterval(function(){Anim.playAnim(El)}, 1000 / this.anim.fps);
			this.anim.inAnim	= true;
			return true;
		},

		fade: function(opacity) {
			this.makeAnim({
				opacity: opacity
			});
		}
	});
};

/*
var ElementAnim = {
	anim: {
		fps		: 200,
		inAnim		: false,
		intervalObj	: false,
		duration	: 200,
		coord		: {},
		coords		: {},
		startTimer	: false,
		timeElapsed	: false,
		Fx		: "default"
	},
	
	makeAnim: function(coords, Fx, duration){
		
		if(typeof coords != "object"){ alert("the Element : '"+this.id+"' as wrong coord datas"); return false; }
		
		if(Fx && Anim['Fx_'+Fx]){ 
			this.anim.Fx = Fx; 
		}else if(!this.anim.Fx)
			this.anim.Fx = "default";
			
		if(duration){ 
			this.anim.duration = duration; 
		}else if(!this.anim.duration)
			this.anim.duration = 1000;
		if(this.anim.inAnim){ this.fireEvent('animstop'); Anim.stopAnim(this); }
		
		for (var coord in coords) {
			
			if (coords[coord] === false) continue; 
			if (coord == "scrollTop" || coord == "scrollLeft") {
				this.anim.coord['ori_'+coord] = this[coord];
			}
			else {
				this.anim.coord['ori_'+coord]	= this.getStyle(coord);
				this.anim.coord['ori_'+coord] = this.anim.coord['ori_'+coord] == "auto" ? 0 : this.anim.coord['ori_'+coord];
			}
			this.anim.coord['goal_'+coord]	= coords[coord];
		}
		
		this.anim.coords = coords;
		//this.fireEvent("animstart");
		
		this.anim.startTimer	= new Date().getTime();
		var El 			= this;
		this.anim.intervalObj 	= setInterval(function(){Anim.playAnim(El)}, 1000 / this.anim.fps);
		this.anim.inAnim	= true;
		return true;
	},
	
	fade: function(opacity) {
		this.makeAnim({
			opacity: opacity
		});
	}
};*/


Anim.addFx('default', function (time, beginning, change, duration) {
	return change * time / duration + beginning;
});

Anim.addFx('cubic', function (time, beginning, change, duration) {
	return change * Math.pow (time/duration, 3) + beginning;
});

Anim.addFx('easeInQuad', function (time, beginning, change, duration) {
	return change * (time /= duration) * time + beginning;
});

Anim.addFx('easeOutQuad', function (time, beginning, change, duration) {
	return -change * (time /= duration)*(time - 2) + beginning;
});

Anim.addFx('easeInOutQuad', function (time, beginning, change, duration) {
	if ((time /= duration / 2) < 1)
		return change / 2 * time * time + beginning;
	return -change / 2 * ((--time)* (time - 2) - 1) + beginning;
});

Anim.addFx('easeInCubic', function (time, beginning, change, duration) {
	return change * Math.pow (time / duration, 3) + beginning;
});

Anim.addFx('easeOutCubic', function (time, beginning, change, duration) {
	return change * (Math.pow (time / duration - 1, 3) + 1) + beginning;
});

Anim.addFx('easeInOutCubic', function (time, beginning, change, duration) {
	if ((time /= duration / 2) < 1)
		return change / 2 * Math.pow (time, 3) + beginning;
	return change / 2 * (Math.pow (time - 2, 3) + 2) + beginning;
});

Anim.addFx('easeInQuart', function (time, beginning, change, duration) {
	return change * Math.pow (time / duration, 4) + beginning;
});

Anim.addFx('easeOutQuart', function (time, beginning, change, duration) {
	return -change * (Math.pow (time / duration - 1, 4) - 1) + beginning;
});

Anim.addFx('easeInOutQuart', function (time, beginning, change, duration) {
	if ((time /= duration / 2) < 1)
		return change / 2 * Math.pow (time, 4) + beginning;
	return -change / 2 * (Math.pow (time - 2, 4) - 2) + beginning;
});

Anim.addFx('easeInQuint', function (time, beginning, change, duration) {
	return change * Math.pow (time / duration, 5) + beginning;
});

Anim.addFx('easeOutQuint', function (time, beginning, change, duration) {
	return change * (Math.pow (time / duration - 1, 5) + 1) + beginning;
});

Anim.addFx('easeInOutQuint', function (time, beginning, change, duration) {
	if ((time /= duration / 2) < 1)
		return change / 2 * Math.pow (time, 5) + beginning;
	return change / 2 * (Math.pow (time - 2, 5) + 2) + beginning;
});

Anim.addFx('easeInSine', function (time, beginning, change, duration) {
	return change * (1 - Math.cos(time / duration * (Math.PI / 2))) + beginning;
});

Anim.addFx('easeOutSine', function (time, beginning, change, duration) {
	return change * Math.sin(time / duration * (Math.PI / 2)) + beginning;
});

Anim.addFx('easeInOutSine', function (time, beginning, change, duration) {
	return change / 2 * (1 - Math.cos(Math.PI * time / duration)) + beginning;
});

Anim.addFx('easeInExpo', function (time, beginning, change, duration) {
	return change * Math.pow(2, 10 * (time / duration - 1)) + beginning;
});

Anim.addFx('easeOutExpo', function (time, beginning, change, duration) {
	return change * (-Math.pow(2, -10 * time / duration) + 1) + beginning;
});

Anim.addFx('easeInOutExpo', function (time, beginning, change, duration) {
	if ((time /= duration / 2) < 1)
		return change / 2 * Math.pow(2, 10 * (time - 1)) + beginning;
	return change / 2 * (-Math.pow(2, -10 * --time) + 2) + beginning;
});

Anim.addFx('easeInCirc', function (time, beginning, change, duration) {
	return change * (1 - Math.sqrt(1 - (time /= duration) * time)) + beginning;
});

Anim.addFx('easeOutCirc', function (time, beginning, change, duration) {
	return change * Math.sqrt(1 - (time = time / duration - 1) * time) + beginning;
});

Anim.addFx('easeInOutCirc', function (time, beginning, change, duration) {
	if ((time /= duration / 2) < 1)
		return change / 2 * (1 - Math.sqrt(1 - time * time)) + beginning;
	return change / 2 * (Math.sqrt(1 - (time -= 2) * time) + 1) + beginning;
});

Anim.addFx('easeInBounce', function (time, beginning, change, duration) {
  if ((time /= duration) < (1 / 2.75))
  	return change * (7.5625 * time * time) + beginning;
  else if (time < (2 / 2.75))
  	return change * (7.5625 * (time -= (1.5 / 2.75)) * time + .75) + beginning;
  else if (time < (2.5 / 2.75))
  	return change * (7.5625 * (time -= (2.25 / 2.75)) * time + .9375) + beginning;
  else
  	return change * (7.5625 * (time -= (2.625 / 2.75)) * time + .984375) + beginning;
  return change - easeOutBounce(duration - time, 0, change, duration) + beginning;
});

Anim.addFx('easeOutBounce', function (time, beginning, change, duration) {
  if ((time /= duration) < (1 / 2.75))
  	return change * (7.5625 * time * time) + beginning;
  else if (time < (2 / 2.75))
  	return change * (7.5625 * (time -= (1.5 / 2.75)) * time + .75) + beginning;
  else if (time < (2.5 / 2.75))
  	return change * (7.5625 * (time -= (2.25 / 2.75)) * time + .9375) + beginning;
  else
  	return change * (7.5625 * (time -= (2.625 / 2.75)) * time + .984375) + beginning;
});

Anim.addFx('easeInOutBounce', function (time, beginning, change, duration) {
	if (time < duration / 2)
		return Anim.Fx_easeInBounce(time * 2, 0, change, duration) * 0.5 + beginning;
	else
		return Anim.Fx_easeOutBounce(time * 2 - duration, 0, change, duration) * 0.5 + change * 0.5 + beginning;
});

Anim.addFx('easeInElastic', function (time, beginning, change, duration) {
  if ((time /= duration) == 1)
  	return beginning + change;
  p = duration * 0.3;
  s = p / 4;
  return -(change * Math.pow(2, 10 * (time -= 1)) * Math.sin((time * duration - s) * (2 * Math.PI) / p)) + beginning;
});


Anim.addFx('easeOutElastic', function (time, beginning, change, duration) {
  if ((time /= duration) == 1)
  	return beginning + change;
  p = duration * 0.3;
  s = p / 4;
  return (change * Math.pow(2, -10 * time) * Math.sin((time * duration - s) * (2 * Math.PI) / p) + change + beginning);
});

Anim.addFx('easeInOutElastic', function (time, beginning, change, duration) {
  if ((time /= duration / 2) == 2)
  	return beginning + change;
  p = duration * (.3 * 1.5);
  s = p / 4;
  if (time < 1)
  	return -.5 * (change * Math.pow(2, 10 * (time -= 1)) * Math.sin((time * duration - s) * (2 * Math.PI) / p)) + beginning;
  return change * Math.pow(2, -10 * (time -= 1)) * Math.sin((time * duration - s) * (2 * Math.PI) / p) * .5 + change + beginning;
});

Anim.addFx('easeInBack', function (time, beginning, change, duration) {
  return change * (time /= duration) * time * ((1.70158 + 1) * time - 1.70158) + beginning;
});

Anim.addFx('easeOutBack', function (time, beginning, change, duration) {
   return change * ((time = time / duration - 1) * time * ((1.70158 + 1) * time + 1.70158) + 1) + beginning;
});

Anim.addFx('easeInOutBack', function (time, beginning, change, duration) {
  s = 1.70158;
  if ((time /= duration / 2) < 1)
  	return change / 2 * (time * time * (((s *= (1.525)) + 1) * time - s)) + beginning;
  return change / 2 * ((time -= 2) * time * (((s *= (1.525)) + 1) * time + s) + 2) + beginning;
});
var Drag = {
	
	dragObj: false,
	ghost: false,
	dragObj_position: {x:0,y:0},
	drabObj_offset: {x:0,y:0},
	mouse: {x:0,y:0,now:{}},
	overed: false,
	limit: document.body
};

$extend(Drag,{
	
	getProperty: function(obj,prop){
		if((obj.draggedBy && obj.draggedBy.drag && obj.draggedBy.drag[prop]) || (obj.drag && obj.drag[prop]))
			return (obj.drag && obj.drag[prop]) ? obj.drag[prop]: obj.draggedBy.drag[prop]; 
		return false;
	},
	
	moveObj: function(el,distance){
		
		if(this.getProperty(el, 'animate'))
			el.makeAnim({left:distance.x,top:distance.y}, this.getProperty(el, 'Fx'), this.getProperty(el, 'duration'));
		else{
			el.style.left = distance.x;
			el.style.top = distance.y;
		}
	},
	
	checkAgainst: function(el){
		el = el.getCoordinates();
		var now = this.mouse.now;
		var scrollOffset = {x:document.getScrollLeft(),y:document.getScrollTop()};
		return (now.x+scrollOffset.x > el.left && now.x+scrollOffset.x < el.right && now.y+scrollOffset.y < el.bottom && now.y+scrollOffset.y > el.top);
	},
	
	checkDroppables: function(el){
		if(!this.getProperty(el, 'dropReceptors')) return false;
		var overed = this.getProperty(el, 'dropReceptors').filter(this.checkAgainst, this).getLast();
		if (this.overed != overed){
			if (this.overed) this.overed.fireEvent('dragleave', [this.element, this.overed]);
			if (overed){
				this.overed = overed;
				this.overed.fireEvent('dragenter', [this.element, overed]);
			} else {
				this.overed = null;
			}
		}
	}
});

/*
//attribute drag a set sur l'element
drag={target:"self"|Object obj,
grid: Int pixel,
animate: boolean animate;Fx: string Fx,
duration: Int duration,
dropReceptors: Array d'obj
}
*/


document.addEvent("mousedown", function(E) {
	
	if(E.target.drag && typeof E.target.drag  == "object"){
		
		E.preventDefault();
		Drag.dragObj = false;

		Drag.dragObj = E.target.drag.target ? E.target.drag.target: E.target;
		Drag.dragObj.draggedBy = E.target.drag.target ? E.target : false;
		
		if(E.target.drag.target)
			E.target.fireEvent("dragstart");
		Drag.dragObj.fireEvent("dragstart");
		Drag.mouse = E.client;
		
		var limit = Drag.getProperty(Drag.dragObj, "limit");
		if (limit)
			Drag.limit = limit;
		Drag.limit = Element.getCoordinates($(Drag.limit));

		Drag.decal = {x:0,y:0};

		Drag.decal.x += parseInt(Drag.dragObj.getStyle('margin-left'));
		Drag.decal.x += parseInt(Drag.dragObj.getStyle('padding-left'));
		Drag.decal.y += parseInt(Drag.dragObj.getStyle('margin-top'));
		Drag.decal.y += parseInt(Drag.dragObj.getStyle('padding-top'));
		
		Drag.dragObj_offset = {x: Drag.dragObj.getPosition().x - document.getScrollLeft() - Drag.decal.x, y: Drag.dragObj.getPosition().y - document.getScrollTop() - Drag.decal.y};
		
		Drag.dragObj_position = {
			x: (E.client.x + document.getScrollLeft()) - Drag.dragObj.getPosition().x + parseInt(Drag.dragObj.getStyle("margin-left")), 
			y: (E.client.y + document.getScrollTop()) - Drag.dragObj.getPosition().y + parseInt(Drag.dragObj.getStyle("margin-top"))
		};
		
		Drag.dragObj.setStyle("position", "absolute");
		Drag.moveObj(Drag.dragObj,Drag.dragObj_offset);
		
		Drag.ghost = new Element("div", {
			styles:{
				border:Drag.dragObj.getStyle('border'),
				borderColor:'transparent',
				float:Drag.dragObj.getStyle('float'),
				margin:Drag.dragObj.getStyle('margin'),
				width:Drag.dragObj.getStyle('width'),
				height:Drag.dragObj.getStyle('height')
			}
		});
		
		Drag.ghost.injectBefore(Drag.dragObj);
	}
});

document.addEvent("mousemove", function(E){
	if(!Drag.dragObj) return true;

	var distance = {x: E.client.x - Drag.dragObj_position.x, y: E.client.y - Drag.dragObj_position.y};

	//GRID
	if(Drag.getProperty(Drag.dragObj, 'gridSize')){
		var gridSize = Drag.getProperty(Drag.dragObj,'gridSize');
		var distance = {
			x: (Math.round(distance.x/gridSize))*gridSize,
			y: (Math.round(distance.y/gridSize))*gridSize
		};
	}
	Drag.mouse.now = E.page;
	
	//BODY LIMITS
	if(distance.x+Drag.decal.x < Drag.limit.left) {distance.x = Drag.limit.left-Drag.decal.x; }
	if(distance.y+Drag.decal.y < Drag.limit.top) {distance.y = Drag.limit.top-Drag.decal.y; }
	if((distance.x+eval(Drag.dragObj.offsetWidth)+Drag.decal.x) > Drag.limit.right ) {distance.x = Drag.limit.right - eval(Drag.dragObj.offsetWidth)-Drag.decal.x; }
	if((distance.y+eval(Drag.dragObj.offsetHeight)+Drag.decal.y) > Drag.limit.bottom ) {distance.y = Drag.limit.bottom - eval(Drag.dragObj.offsetHeight)-Drag.decal.y; }
	
	var el  = Drag.dragObj;
	Drag.moveObj.delay(Drag.getProperty(Drag.dragObj,'delay'), Drag,[el,distance]);

	Drag.checkDroppables(Drag.dragObj);
	if(Drag.dragObj.draggedBy)
		Drag.dragObj.draggedBy.fireEvent("dragplay");
	Drag.dragObj.fireEvent("dragplay");
	Drag.dragObj.setStyle('-moz-user-select', 'none');
	return false;
});

document.addEvent("mouseup", function(E){
	if(Drag.dragObj){

		if(Drag.dragObj.draggedBy)
			Drag.dragObj.draggedBy.fireEvent("dragstop");

		Drag.dragObj.fireEvent("dragstop");

		if(Drag.overed){ Drag.overed.fireEvent("dragdrop", [Drag.dragObj]); }
		if(Drag.dragObj.draggedBy) Drag.dragObj.drag = false;
		Drag.ghost.destroy();
		Drag.dragObj.setStyle("position", "static");
		
		Drag.dragObj = false;
		Drag.dragObj_offset = null;
	}
	return true;	
});function viewer(){document.viewer=this;this.currentImg=0;this.prevImg=false;this.nextImg=false;this.opened=false;this.closeKeys=[27,88,67];this.previousKeys=[37,52,112];this.nextKeys=[39,54,110];this.items=Array();};viewer.prototype.make=function(){$(document).addEvent('keypress',this.keyPress.bind(this));$(document.body).adopt(
$$(
vwbg=new Element('div',{id:'viewerbg',styles:{opacity:0},events:{click:this.close}}),
vwcont=new Element('table',{id:'viewercontainer',styles:{display:'none'},events:{click:this.close}}),
vwloader=new Element('img',{id:'viewerloader',styles:{opacity:0},events:{load:this.imgloaded.bind(this)}}),
vwpreloader=new Element('img',{styles:{opacity:0,width:'1px',height:'1px',position:'absolute'}})
)
);vwtr=$(vwcont).insertRow(0);$(vwtr).adopt($$(vwcell=new Element('td')));$(vwcell).adopt($$(vwframe=new Element('div',{id:'viewerframe',styles:{opacity:0}})));$(vwframe).adopt(
$$(
vwsizer=new Element('div',{id:'viewersizer'}),
vwinfo=new Element('div',{id:'viewerinfos'})
)
);$(vwsizer).adopt(
$$(
vwload=new Element('img',{id:'viewerload',src:'images/viewer/loading.gif',styles:{opacity:0,position:'relative',top:'80px'}}),
vwimg=new Element('img',{id:'viewerimage',alt:'',styles:{opacity:0}}),
vwprev=new Element('div',{id:'viewerprev',title:'Previous',
styles:{opacity:0.01},
events:{mouseover: function(){this.makeAnim({opacity:.3})},
mouseout: function(){this.makeAnim({opacity:.01})},
click: function(E){this.currentImg=this.prevImg;this.changePic();E.stopPropagation();}.bind(this)
}}),
vwnext=new Element('div',{id:'viewernext',title:'Next',
styles:{opacity:0.01},
events:{mouseover: function(){this.makeAnim({opacity:.3})},
mouseout: function(){this.makeAnim({opacity:.01})},
click: function(E){this.currentImg=this.nextImg;this.changePic();E.stopPropagation();}.bind(this)
}})
)
);$(vwinfo).adopt(
$$(
vwimgnum=new Element('span',{id:'viewerimgnum'}),
vwclose=new Element('img',{id:'viewerclose',
src:'images/viewer/close.png',
styles:{cursor:'pointer',backgroundColor:'#777777'},
events:{click:this.close,
mouseover: function(){this.makeAnim({backgroundColor:'#f00000'})},
mouseout: function(){this.makeAnim({backgroundColor:'#777777'})}}})
)
);[vwbg,vwframe,vwsizer,vwclose,vwload,vwimg,vwinfo,vwprev,vwnext].each($Anim);vwbg.anim.Fx=vwsizer.anim.Fx=vwframe.anim.Fx="easeOutCubic";vwbg.anim.duration=vwsizer.anim.duration=vwframe.anim.duration=500;xDecal=0;if(!Browser.Engine.trident||navigator.userAgent.toLowerCase().indexOf("msie 8.0")!=-1)
xDecal=3;if(Browser.Engine.webkit)
xDecal=13;$(vwsizer).addEvent("animfinish",function(){if($(vwframe).getSize().x!=$(vwloader).getSize().x+xDecal)
$(vwframe).makeAnim({width:vwloader.getSize().x+xDecal});else{$(vwframe).fireEvent("animfinish");}});$(vwimg).addEvent("load",function(){this.setImgNum();$(vwimg).makeAnim({opacity:1});$(vwload).makeAnim({opacity:0});}.bind(this));};viewer.prototype.keyPress=function(event){if(!this.opened)return true;code=event.code;if(this.closeKeys.contains(code))
this.close();if(this.previousKeys.contains(code)){this.currentImg=this.prevImg;this.changePic();}if(this.nextKeys.contains(code)){this.currentImg=this.nextImg;this.changePic();}return true;};viewer.prototype.setTop=function(){$$($(vwbg),$(vwcont)).setStyle("top",document.documentElement.scrollTop+"px");};viewer.prototype.imgloaded=function(){$(vwframe).addEvent("animfinish",function(){$(vwimg).addEvent("animfinish",function(){$(vwinfo).makeAnim({height:16,marginTop:5});$$(vwprev,vwnext).setStyle("display","block");this.removeEvents("animfinish");});$(vwimg).src=$(vwloader).src;$(vwpreloader).src=this.items[this.nextImg];$(vwframe).removeEvents("animfinish");}.bind(this));if($(vwsizer).getSize().y!=$(vwloader).getSize().y)
$(vwsizer).makeAnim({height:$(vwloader).getSize().y});else
$(vwsizer).fireEvent("animfinish");};viewer.prototype.setPrevNext=function(){this.prevImg=this.currentImg==0 ? this.items.length-1 : this.currentImg-1;this.nextImg=this.currentImg==this.items.length-1 ? 0 : this.currentImg+1;};viewer.prototype.changePic=function(E){$$(vwprev,vwnext).setStyle("display","none");$(vwimg).addEvent("animfinish",function(){$(vwload).makeAnim({opacity:1});this.setPrevNext();$(vwimg).set("src",false);$(vwloader).set("src",this.items[this.currentImg]);$(vwimg).removeEvents("animfinish");}.bind(this));$(vwimg).makeAnim({opacity:0});$(vwinfo).makeAnim({height:0,marginTop:'0'});};viewer.prototype.open=function(index){this.setImgNum();$$(vwbg,vwcont).setStyle("display","");$(vwframe).setStyles({width:'200px'});$(vwsizer).setStyles({height:'200px'});vwbg.makeAnim({opacity:.6});vwframe.makeAnim.delay(500,vwframe,{opacity:1});vwload.makeAnim.delay(500,vwload,{opacity:1});vwframe.addEvent("animfinish",function(){vwloader.set("src",this.items[index]);this.opened=true;vwframe.removeEvents("animfinish");}.bind(this));this.setTop();this.currentImg=index;this.setPrevNext();};viewer.prototype.close=function(){vwbg.makeAnim.delay(500,vwbg,{opacity:0});vwframe.makeAnim({opacity:0});$$(vwprev,vwnext).setStyle("display","none");(function(){$$(vwbg,vwcont).setStyle("display","none");$(vwimg).setStyle("opacity",0);$(vwimg).set('src',"");$(vwloader).set('src',"");$(vwinfo).setStyles({height:0,marginTop:'0'});}).delay(1000);this.opened=false;};viewer.prototype.setImgNum=function(){$$(vwimgnum).set('html',(this.currentImg+1)+' / '+this.items.length);};viewer.prototype.addItem=function(item){this.items.push(item);};viewer.prototype.addItems=function(items){this.items.combine(items);};new viewer();window.addEvent("domready",function(){document.viewer.make();});window.addEvent("scroll",document.viewer.setTop);var SlideShow=function(){};var SlideShowCaller=function(src){$ajax(src,false,SlideShowCreater);};var SlideShowCreater=function(response){if(!response)return false;var objName=response.xml.getElementsByTagName("objName")[0].getAttribute("value");document[objName]=new SlideShow();document[objName].init(response);return document[objName];};SlideShow.prototype.init=function(response){if(!response)return false;this.ActiveLoader=1;this.currentImg=0;this.firstPlay=true;this.interval=false;this.timer=new Date().getTime();if(Browser.detect().name=="trident")
this.xml=response.xml.childNodes[1];else
this.xml=response.xml.firstChild;this.settings=this.xml.getElementsByTagName("settings")[0];this.imgPath=this.settings.getElementsByTagName("path")[0].getAttribute('value');this.imgContainer1=this.settings.getElementsByTagName("imgContainer1")[0].getAttribute('value');this.imgContainer2=this.settings.getElementsByTagName("imgContainer2")[0].getAttribute('value');this.imageTime=this.settings.getElementsByTagName("interval")[0].getAttribute('value');this.animDuration=this.settings.getElementsByTagName("animDuration")[0].getAttribute('value')*1000;this.animFxIn=this.settings.getElementsByTagName("animType")[0].getAttribute('value');this.itemContainer=this.xml.getElementsByTagName("images")[0];if(this.xml.getElementsByTagName("script").length>0&&this.xml.getElementsByTagName("script")[0].firstChild)
$jsEval(this.xml.getElementsByTagName("script")[0].firstChild.nodeValue);this.slideImg1=$(this.imgContainer1);this.slideImg1.parentEl=this;this.slideImg2=$(this.imgContainer2);this.slideImg2.parentEl=this;this.items=new Array();for(var i=0;this.itemContainer.childNodes[i];i++)
this.items.push(this.itemContainer.childNodes[i].firstChild.nodeValue);$Anim(this.slideImg1);$Anim(this.slideImg2);this.slideImg1.show=function(){if(this.additionalLoad)this.additionalLoad();this.slideImg1.makeAnim({opacity:1},this.animFxIn,this.animDuration);}.bind(this,this);this.slideImg2.show=function(){if(this.additionalLoad)this.additionalLoad();this.slideImg2.makeAnim({opacity:1},this.animFxIn,this.animDuration);}.bind(this,this);this.slideImg1.addEvent("animfinish",function(E){this.slideImg1.setStyles({zIndex:2});this.slideImg2.setStyles({opacity:0,zIndex:3});this['slideImg'+this.ActiveLoader].src=this.imgPath+this.items[this.currentImg];if(this.additionalFx)this.additionalFx();}.bind(this,this));this.slideImg2.addEvent("animfinish",function(E){this.slideImg2.setStyles({zIndex:2});this.slideImg1.setStyles({opacity:0,zIndex:3});this['slideImg'+this.ActiveLoader].src=this.imgPath+this.items[this.currentImg];if(this.additionalFx)this.additionalFx();}.bind(this,this));this.slideImg1.setStyles({opacity:0,position:'absolute',top:0,left:0,zIndex:2});this.slideImg2.setStyles({opacity:0,position:'absolute',top:0,left:0,zIndex:3});if(this.additionalMake)this.additionalMake();this.make();};SlideShow.prototype.make=function(){this.slideImg1.addEvent("load",function(E){this.slideImg1.loaded=true;if(this.firstPlay){this.slideImg1.show();this.firstPlay=false;}}.bind(this,this));this.slideImg2.addEvent("load",function(E){this.slideImg2.loaded=true;}.bind(this,this));this.slideImg1.src=this.imgPath+this.items[0];if(this.additionalLoad)this.additionalLoad();this.interval=setInterval(function(){this.delayer();}.bind(this,this),200);};SlideShow.prototype.goto=function(i){this.currentImg=i;this['slideImg'+this.ActiveLoader].loaded=false;this['slideImg'+this.ActiveLoader].src=this.imgPath+this.items[this.currentImg];this.timer=this.imageTime;};SlideShow.prototype.delayer=function(){if((new Date().getTime())-this.timer>=this.imageTime*1000){if(this['slideImg'+this.ActiveLoader].loaded){var tempC=this['slideImg'+this.ActiveLoader];this.timer=new Date().getTime();this.currentImg=this.currentImg+1==this.items.length ? 0 : this.currentImg+1;this.ActiveLoader=this.ActiveLoader==1 ? 2 : 1;this['slideImg'+this.ActiveLoader].loaded=false;tempC.show();}else
this.timer=this.timer-1000;}};var agt=navigator.userAgent.toLowerCase();var is_major=parseInt(navigator.appVersion);var is_minor=parseFloat(navigator.appVersion);var is_ie=(agt.indexOf("msie")!= -1);var is_ie7=(is_ie&&(is_major==4)&&(agt.indexOf("msie 7.0")!=-1));var is_ie8=(is_ie&&(is_major==4)&&(agt.indexOf("msie 8.0")!=-1));var is_opera=(!is_ie&&agt.indexOf('opera')!=-1);var is_safari=(agt.indexOf("safari")!= -1);var is_chrome=(agt.indexOf("chrome")!= -1);var is_konqueror=(agt.indexOf("konqueror")!= -1);var is_firefox=(agt.indexOf("firefox")!= -1);if(document.all&&!is_ie7&&!is_ie8){document.write('<style type="text/css"><!-- img{ behavior: url(js/png.htc); } --></style>');}function $tn(Id,tag){return Id.getElementsByTagName(tag);}var subTO=false;var baTO=false;var mainSlide;var active_anims=function(){if($('bannerContainer')){mainSlide=SlideShowCaller("images/properties/banners/banner.php");$Anim($('bannerTextBg'));$Anim($('bannerText'));$('bannerTextBg').setStyle("opacity",0);$('bannerText').setStyle("opacity",0);}for(var i=0;$tn(document.body,"a")[i];i++){var A=$tn(document.body,"a")[i];if(A.parentNode.id=="footer")continue;if(A.style.color=="")
A.style.color="#222222";A.bColor=$(A).getStyle('color');$Anim(A);A.anim.duration="400";A.anim.Fx='easeOutCubic';A.onmouseover=function(){this.makeAnim({color:'#f90000'});};A.onmouseout=function(){this.makeAnim({color:this.bColor});};}for(var i=0;$tn($('menuContainer'),"div")[i];i++){if($tn($('menuContainer'),"div")[i].id=="contactSubMenu")continue;var D=$tn($('menuContainer'),"div")[i];$Anim($(D));D.style.backgroundColor="#cccccc";D.anim.duration="400";D.anim.Fx='easeOutCubic';D.onmouseover=function(){this.makeAnim({backgroundColor:'#8c8c8c'});if(this.id=="contactMenu"){if(subTO)clearTimeout(subTO);$("contactSubMenu").style.display="block";}};D.onmouseout=function(){this.makeAnim({backgroundColor:'#cccccc'});if(this.id=="contactMenu")
subTO=setTimeout(function(){$('contactSubMenu').style.display="none";},200);};}$Anim($('muSubMenu'));for(var i=0;$tn($('lMenuContainer'),"div")[i];i++){if($tn($('lMenuContainer'),"div")[i].id=="muSubMenu")continue;var D=$tn($('lMenuContainer'),"div")[i];$Anim($(D));D.style.backgroundColor="#cccccc";D.anim.duration="400";D.anim.Fx='easeOutCubic';D.onmouseover=function(){this.makeAnim({backgroundColor:'#8c8c8c'});if(this.id=="muMenu"){if(subTO)clearTimeout(subTO);$('muSubMenu').style.display="block";}};D.onmouseout=function(){this.makeAnim({backgroundColor:'#cccccc'});if(this.id=="muMenu"){subTO=setTimeout(function(){$('muSubMenu').style.display="none";},200);}};}if($('searchListResults')){for(var i=0;$tn($('searchListResults'),"div")[i];i++){if($tn($('searchListResults'),"div")[i].className!="propertyList1")continue;var D=$tn($('searchListResults'),"div")[i];var I=$tn(D,"img")[0];[$(D),$(I)].each($Anim);D.setStyle("backgroundColor","#f9f9f9");I.style.borderColor="#000000";D.anim.duration=I.anim.duration="400";D.anim.Fx=I.anim.Fx='easeOutCubic';$(D).addEvent("mouseover",function(){this.makeAnim({backgroundColor:'#e3e3e3'});$tn(this,"img")[0].makeAnim({borderColor:'#f90000'});});$(D).addEvent("mouseout",function(){this.makeAnim({backgroundColor:'#f9f9f9'});$tn(this,"img")[0].makeAnim({borderColor:'#000000'});});}}};var getBanDesc=function(id){$ajax("actions/get_description.php","id="+id,getBanDescRep);};var getBanDescRep=function(reponse){var xml=reponse.xml;var id=xml.firstChild.getAttribute("id");var lang=xml.firstChild.getAttribute("lang");var desc=xml.firstChild.firstChild.nodeValue;var name=xml.firstChild.getAttribute("name");$('bannerTextDesc').innerHTML="";
$('bannerTextName').innerHTML=name;
$('bannerTextTitle').href=lang+"-property_"+id;$('bannerTextBg').makeAnim({opacity:.7},"",800);$('bannerText').makeAnim({opacity:1},"",800);};function printProp(id){var PrintPage=window.open("./print/"+id,"PrintPop","width=860,height=600,scrollbars");}var hideBanner=function(){};var makeBanner=function(){};window.addEvent("domready",active_anims);
