// -*- Mode: MooTools Javascript; tab-width: 4; -*-

var ClientSideInclude = new Class({
	
	Implements: Options,
	
	options:{
		elements: 'a[rel~=embed]',
		targetProperty: 'target',
		urlProperty: 'href'
	},
	
	initialize: function(options){
		this.setOptions(options);
		window.addEvent('domready', this.build.bind(this));
	},
	
	build: function(){
		$$(this.options.elements).each(function(element, i, elements){
			element.set('text','Loading...');
			var selector = element.hash;
			var rq;
			
			if (!build.call(this, element.retrieve('csi:el'))){
				
				rq = new Request;
				if (this.options.onComplete) rq.chain(this.options.onComplete);
				rq.addEvent('success',function(responseText){
					var responseElements =
						 new Element('div')
						.inject(document.body,'bottom')
						.set('html',responseText)
						.dispose()
						.getChildren()
					;
					if (selector) responseElements = responseElements.filter(selector);
					element.store('csi:el', build.call(this,responseElements));
					
				});
				var properties = $splat(this.options.urlProperty);
				for (var p = 0, property, url; (property = properties[p++]) && !url;){
					url = element.get(property);
				}
				rq.get(url);
				
			}
			
			function build(responseElements){
				if (!responseElements){
					return false;
				}
				responseElements = $splat(responseElements).flatten();
				var properties = $splat(this.options.targetProperty);
				for (var p = 0, property, target; (property = properties[p++]) && !target;){
					target = $(element.get(property));
				}
				try {
					responseElements.each(function(responseElement){
						responseElement.inject(element, 'before');
					});
					
				} catch(e){
				}
				element.dispose();
				document.fireEvent('ClientSideInclude', [responseElements], 0);
				return responseElements;
			};
			
		},this);
		return this;
	}
});

ClientSideInclude.build = function(options){
	ClientSideInclude.instance = ClientSideInclude.instance || new ClientSideInclude(options);
	return ClientSideInclude.instance;
};

