/*

Script: Assets.js

	Provides methods to dynamically load JavaScript, CSS, and Image files into the document.



License:

	MIT-style license.

*/



var Asset = new Hash({



	javascript: function(source, properties){

		properties = $extend({

			onload: $empty,

			document: document,

			check: $lambda(true)

		}, properties);

		

		var script = new Element('script', {'src': source, 'type': 'text/javascript'});

		

		var load = properties.onload.bind(script), check = properties.check, doc = properties.document;

		delete properties.onload; delete properties.check; delete properties.document;

		

		script.addEvents({

			load: load,

			readystatechange: function(){

				if (['loaded', 'complete'].contains(this.readyState)) load();

			}

		}).setProperties(properties);

		

		

		if (Browser.Engine.webkit419) var checker = (function(){

			if (!$try(check)) return;

			$clear(checker);

			load();

		}).periodical(50);

		

		return script.inject(doc.head);

	},



	css: function(source, properties){

		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);

		var image = new Image();

		var element = $(image) || new Element('img');

		['load', 'abort', 'error'].each(function(name){

			var type = 'on' + name;

			var event = properties[type];

			delete properties[type];

			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;

		if (image && image.complete) image.onload.delay(1);

		return element.setProperties(properties);

	},



	images: function(sources, options){

		options = $merge({

			onComplete: $empty,

			onProgress: $empty

		}, options);

		if (!sources.push) sources = [sources];

		var images = [];

		var counter = 0;

		sources.each(function(source){

			var img = new Asset.image(source, {

				'onload': function(){

					options.onProgress.call(this, counter, sources.indexOf(source));

					counter++;

					if (counter == sources.length) options.onComplete();

				}

			});

			images.push(img);

		});

		return new Elements(images);

	}



});
