var Asset=new Hash({javascript:function(F,D){D=$extend({onload:$empty,document:document,check:$lambda(true)},D);var B=new Element("script",{src:F,type:"text/javascript"});var E=D.onload.bind(B),A=D.check,G=D.document;delete D.onload;delete D.check;delete D.document;B.addEvents({load:E,readystatechange:function(){if(["loaded","complete"].contains(this.readyState)){E()}}}).setProperties(D);if(Browser.Engine.webkit419){var C=(function(){if(!$try(A)){return }$clear(C);E()}).periodical(50)}return B.inject(G.head)},css:function(B,A){return new Element("link",$merge({rel:"stylesheet",media:"screen",type:"text/css",href:B},A)).inject(document.head)},image:function(C,B){B=$merge({onload:$empty,onabort:$empty,onerror:$empty},B);var D=new Image();var A=$(D)||new Element("img");["load","abort","error"].each(function(E){var F="on"+E;var G=B[F];delete B[F];D[F]=function(){if(!D){return }if(!A.parentNode){A.width=D.width;A.height=D.height}D=D.onload=D.onabort=D.onerror=null;G.delay(1,A,A);A.fireEvent(E,A,1)}});D.src=A.src=C;if(D&&D.complete){D.onload.delay(1)}return A.setProperties(B)},images:function(D,C){C=$merge({onComplete:$empty,onProgress:$empty},C);if(!D.push){D=[D]}var A=[];var B=0;D.each(function(F){var E=new Asset.image(F,{onload:function(){C.onProgress.call(this,B,D.indexOf(F));B++;if(B==D.length){C.onComplete()}}});A.push(E)});return new Elements(A)}});
Element.implement({
  hasEvent: function(eventType,fn) {
    var myEvents = this.retrieve('events');
    return myEvents && myEvents[eventType] && (fn == undefined || myEvents[eventType].keys.contains(fn));
  }
});

function cbTrigger(s,p){$(p).disabled=s.checked;}
String.prototype.trim=function(){return this.replace(/^\s+/,'').replace(/\s+$/,'');}
NodeList.prototype.each=function(f){for(var i=0;i<this.length;i++){f(this[i],i);}return this;}
Image.prototype.inject=function(e){return e.appendChild(this)?this:e;}

String.implement({
	toDOM: function(){
		var wrapper =	this.test('^<the|^<tf|^<tb|^<colg|^<ca') && ['<table>', '</table>', 1] ||
						this.test('^<col') && ['<table><colgroup>', '</colgroup><tbody></tbody></table>',2] ||
						this.test('^<tr') && ['<table><tbody>', '</tbody></table>', 2] ||
						this.test('^<th|^<td') && ['<table><tbody><tr>', '</tr></tbody></table>', 3] ||
						this.test('^<li') && ['<ul>', '</ul>', 1] ||
						this.test('^<dt|^<dd') && ['<dl>', '</dl>', 1] ||
						this.test('^<le') && ['<fieldset>', '</fieldset>', 1] ||
						this.test('^<opt') && ['<select multiple="multiple">', '</select>', 1] ||
						['', '', 0];
		var el = new Element('div', {html: wrapper[0] + this + wrapper[1]}).getChildren();
		while(wrapper[2]--) el = el[0].getChildren();
		return el;
	}

});

Element.prototype.center=function(hv,po){
  var p=$(po)?$(po):window;
  if(this.parentNode){
    if(this.style.position=='absolute'){
      if((hv&&hv.indexOf('h')>-1)||!hv) this.style.left=((p.innerWidth/2)-(this.offsetWidth/2))+'px';
      if((hv&&hv.indexOf('v')>-1)||!hv) this.style.top=((p.innerHeight/2)-(this.offsetHeight/2))+'px';
    } else {
      throw 'Cant center an Element that has a relative position';
    }
  } else {
    throw 'Cant center an Element that is not on screen';
  }
  return this;
}

Element.prototype.createFader=function(o,before,after){
  var f=new Fx.Morph(this,o);
  if(before&&before.call){f.addEvent('start',function(){before();});}
  if(after&&after.call){f.addEvent('complete',function(){after();});}
  this.fx=f;
  return this;
}

Element.prototype.fadeDir=function(dir){
  if(this.fx) {
    this.fx.start({'opacity':dir?1:0});
  } else {
    throw new TypeError('Element.fadeDir without an existing fx');
  }
  return this;
}
