
var ReadyTemplate = Class.create( Template, {
	initialize: function ( template, pattern ) {
		this.template = template?template:'';
		this.readyState = template?1:0;
		this.pattern = pattern?pattern:Template.Pattern;
		
		this.queue = new Array();		
		return;
	},
	load: function(template) {
	    this.template = template.toString();
		this.readyState = 1;
		this.onReadyState();
	},
	_preprocess: function (object) {
		return object;
	},
	evaluateCallback: function (options) {
	    this.options = {
	      object:       {},
	      callback: 	function () {}
	    };
	    Object.extend(this.options, options || { });
		object = this._preprocess(this.options.object);
		if (this.readyState) {
			this.options.callback(this.evaluate(this.options.object));
		} else {
			this.queue.push({
				qtype: 'callback',
				obj: this.options.object,
				fnc: this.options.callback
			});
		}
		return;		
	},
	evaluateElement: function (element, options) {
		var element = $(element);
	    this.options = {
	      object:       {},
		  position: 'bottom',
	      callback: 	function () {}
	    };
		var elm;
		Object.extend(this.options, options || { });
		object = this._preprocess(this.options.object);
		if (this.readyState) {
			if (this.options.position == 'replace') {
				elm = element.removeAllContents().insert( {top: this.evaluate(this.options.object)} );
			} else {
				var position = {};
				position[this.options.position] = this.evaluate(this.options.object);
				elm = element.insert( position );
			}
			this.options.callback.delay(.01, elm);
		} else {
			this.queue.push({
				qtype: 'insert',
				elm: element,
				pos: this.options.position,
				obj: this.options.object,
				fnc: this.options.callback
			});
		}
		return;
	},
	onReadyState: function () {
		while (q = this.queue.shift()) {
			var object = q.obj;
			var qtype = q.qtype;
			var callback = q.fnc;
			var elm;
			switch (qtype) {
			case 'insert':
				var element = q.elm;
				var position = {};
				if (q.pos == "replace") {
					position['top'] = this.evaluate(q.obj);
					elm = element.removeAllContents().insert( position );					
				} else {
					position[q.pos] = this.evaluate(q.obj);
					elm = element.insert( position );					
				}
				callback.delay(.01, elm);
				break;    
			case 'callback':
				callback(this.evaluate(object));
				break;
			}		
		}
	}
});	

var TemplateFactory = Class.create( Hash, {
    dir: "/js/quickshop/html-templates/",

	get: function (key, bRefresh, fileSuffix) {
		if (typeof this._object[key] !== "undefined" && !bRefresh) {
			return this._object[key];
		}
		this._object[key] = new ReadyTemplate();
		var filename = key;
		if (fileSuffix && Object.isString(fileSuffix)) {
    		filename += ('.' + fileSuffix);
		} else {
    		filename += '.html';
        }
		var url = this.dir + filename;
		var tAjax = new Ajax.Request(url, {
		    method: 'get',
		    onSuccess: function(transport) {
		        this._object[key].load(transport.responseText);
		    }.bind(this)
		});
		return this._object[key];	
	},
    getTmpl: function (key, parameters) {
		var tmpl = new ReadyTemplate();
		var filename = key + '.tmpl'	
		var url = this.dir + filename;
		var tAjax = new Ajax.Request(url, {
		    method: 'post',
            parameters: $H(parameters).toQueryString(),
		    onSuccess: function(transport) {
		        tmpl.load(transport.responseText);
		    }.bind(this)
		});
		return tmpl;	
	}
});
av.templateFactory = new TemplateFactory();
