//ű,ʽͼƬԴ
var Asset = new Hash({

 //űԴļ
 javascrpt: function(source, properties){
  //ϲ
  properties = $extend({
   //űɺ¼֪ͨ
   onload: $empty,
   //űǩDOM
   document: document,
   //Լ
   check: $lambda(true)
  }, properties);
  
  //scrpt Element,ָ·ű
  var scrpt = new Element('scrpt', {'src': source, 'type': 'text/javascrpt'});
  
  //󶨽űغonload¼
  var load = properties.onload.bind(scrpt), check = properties.check, doc = properties.document;
  //ɾscrptǩ
  delete properties.onload; delete properties.check; delete properties.document;
  
  //¼
  scrpt.addEvents({
   //¼
   load: load,
   //״̬¼
   readystatechange: function(){
    //״̬Ϊloadedcompleteеһ,
    if (['loaded', 'complete'].contains(this.readyState)) load();
   }
   //ñǩ
  }).setProperties(properties);
  
  //Safarihack,Ҫṩcheckֶз
  if (Browser.Engine.webkit419) var checker = (function(){
   //ִcheck,δ,˳
   if (!$try(check)) return;
   //ʱ
   $clear(checker);
   //֪ͨ
   load();
   //ÿ50ִһε
  }).periodical(50);
  
  //scrptǩǰĵͷ
  return scrpt.inject(doc.head);
 },

 //ʽԴļ
 css: function(source, properties){
  //link Element,Բ뵽ǰĵͷ
  return new Element('link', $merge({
   'rel': 'stylesheet', 'media': 'screen', 'type': 'text/css', 'href': source
  }, properties)).inject(document.head);
 },

 //ͼƬԴļ
 image: function(source, properties){
  //ϲ
  properties = $merge({
   //¼
   'onload': $empty,
   //ȡ¼
   'onabort': $empty,
   //ʧ¼
   'onerror': $empty
  }, properties);
  //Image
  var image = new Image();
  //Image޷Element,img Element
  var element = $(image) || new Element('img');
  //load,aborterror¼
  ['load', 'abort', 'error'].each(function(name){
   //Ϊǰ¼onǰ׺
   var type = 'on' + name;
   //Լжȡ¼
   var event = properties[type];
   //ɾԼе¼Ա
   delete properties[type];
   //Ϊimage¼
   image[type] = function(){
    //󲻴,˳
    if (!image) return;
    //ڸڵ
    if (!element.parentNode){
     //ÿ
     element.width = image.width;
     //ø߶
     element.height = image.height;
    }
    //ٶ¼
    image = image.onload = image.onabort = image.onerror = null;
    //ʱִ¼
    event.delay(1, element, element);
    //ʱ¼
    element.fireEvent(name, element, 1);
   };
  });
  //ͼƬ·
  image.src = element.src = source;
  //ͼƬ,ʱִonload¼
  if (image && image.complete) image.onload.delay(1);
  //imgǩԲElement
  return element.setProperties(properties);
 },

 //ͼƬ
 images: function(sources, options){
  //ϲ
  options = $merge({
   //ͼƬ
   onComplete: $empty,
   //ͼƬع
   onProgress: $empty
  }, options);
  //ʹsource黯,ԼֻһͼƬʱ
  if (!sources.push) sources = [sources];
  //ͼƬ,ΪElement
  var images = [];
  //ͼƬ
  var counter = 0;
  //
  sources.each(function(source){
   //ʹAsset.image(new,ʡ)
   var img = new Asset.image(source, {
    //Ӽ¼,ʵֽ֪֪ͨͨ
    'onload': function(){
     //֪ͨ,͵ǰѼǰͼƬ˳ֵ
     options.onProgress.call(this, counter, sources.indexOf(source));
     //1
     counter++;
     //source鳤һ,ȫ,ü¼֪ͨ
     if (counter == sources.length) options.onComplete();
    }
   });
   //ص
   images.push(img);
  });
  //Elements
  return new Elements(images);
 }

});

