var cTemplate = {

	parse: function(sTemplate, oData) {
		for(var i in oData) {
			if(typeof oData[i] == "array" || typeof oData[i] == "object") {
				// explode template in three parts (before block, block and after block)
				var sRegExp = '{{'+i+':}}([\\s\\S]*){{:'+i+'}}';
				var oRegExp = new RegExp(sRegExp,"g");
				var aMatches = oRegExp.exec(sTemplate);
				if(aMatches == null) {
					continue;
				}
				var sBlock = aMatches[1];
				// recurse with only parsing the block for each item in array or object
				var sReplace = "";
				for(var j in oData[i]) {
					sReplace += cTemplate.parse(sBlock, oData[i][j]);
				}
				// replace block by generated content
				sTemplate = sTemplate.replace(oRegExp, sReplace);
			}
			else if(typeof oData[i] == "boolean") {
				var sRegExp = '{{'+i+':}}([\\s\\S]*){{:'+i+'}}';
				var oRegExp = new RegExp(sRegExp,"g");
				var aMatches = oRegExp.exec(sTemplate);
				if(aMatches == null) {
					continue;
				}
				var sBlock = aMatches[1];
				// recurse with only parsing the block for each item in array or object
				if(!oData[i]) {
					sBlock = "";
				}
				// replace block by generated content
				sTemplate = sTemplate.replace(oRegExp, sBlock);
			}
			else {
				eval("sTemplate = sTemplate.replace(/{{"+i+"}}/g, oData[i]);");
			}
		}
		return sTemplate;
	}

}
