var Heredoc = {
	load: function(uri, loaded, failed) {
		var self = this;
		this._getSource(uri, function(src) {
			loaded(self.parse(src));
		}, failed);
	},
	
	parse: function(src, proc) {
		var values = {};
		var re = /([\w\.\[\]]+)\s*=\s*<<\s*("?)(\w+)"?\s*;?\s*/;
		var p = null;
		while ((p = re.exec(src)) != null) {
			var vname = p[1];
			var quote = p[2];
			var target= p[3];
			src = src.substring(p.index + p[0].length);
	
			var re2 = new RegExp('^' + target + '$', 'm');
			p = re2.exec(src);
			if (p === null) {
				break;
			}
			var v = src.substring(0, p.index);
			src = src.substring(p.index + target.length);
			if (proc) {
				v = proc(v);
			}
			if (quote) {
				v = this.create_template(v);
			}
			values[vname] = v;
		}
		return values;
	},
	
	create_template: function(src) {
		return src;
	},

	parseInline: function() {
		var currentScript = (function (e) { if(e.nodeName.toLowerCase() == 'script') return e; return arguments.callee(e.lastChild) })(document);
		var src = currentScript.innerHTML;
		if (! src) return;
		var values = this.parse(src, function(str) {
			return str.replace(/<(\\*)\\\//g, "<$1/");
		});
		for (var k in values) {
			var v = values[k];
			eval(k + " = v;");
		}
	},
	
	_getSource: function(uri, loaded, failed) {
		var transport = this._getTransport();
		transport.open("GET", uri, true);
		
		transport.onreadystatechange=function() {
 			if (transport.readyState == 4) {
				if (transport.status == 200) {
					loaded(transport.responseText);
				} else {
					if (failed) {
						failed(transport);
					}
				}
			}
		}
		transport.send(null);
	},

	_getTransport: function() {
		var imprements = [
			function() {return new XMLHttpRequest()},
			function() {return new ActiveXObject('Msxml2.XMLHTTP')},
			function() {return new ActiveXObject('Microsoft.XMLHTTP')}
		];
		
		var returnValue;
		for (var i = 0; i < imprements.length; i++) {
			var lambda = imprements[i];
			try {
				returnValue = lambda();
				break;
			} catch (e) { }
		}
		return returnValue;
	}
};

// with prototype.js
Heredoc.create_template = function(src) { 
	if (Template) {
		return new Template(src); 
	}
	return src;
}

Heredoc.parseInline();
