/**
 * @author christopher
 */

 var RenderingEngine = {
 	
	humanize_dates: true,
	format_money:	true,
	remove_zero_dollars: false,
	strip_slashed: false,
	replace_newlines: false,
	strip_nulls: true,
	
 	/*
 	 * TODO:
 	 * 		- add support for nested structures...
 	 */
	render: function(markup,src) {
		
		if(typeof(src) == "undefined" || !src) {
			return markup;
		}
		// DINGDONG!
		// make this a little more pragmatic...
		markup = markup.replace(/%7B/g,"{").replace(/%7D/g,"}");
		
		markup = markup.replace(/\{method:(.*)\}/g,function(m,key,value) {
			if(typeof(src[key]) !== "undefined") {
				return src[key]();
			}
		});
		
		markup = markup.replace(/\{([a-zA-Z_\.]+)\}/g,function(m,key,value) {
			if(typeof(src[key]) !== "undefined") {
				return src[key];
			}
			// is this a nested structure?
			var p = key.indexOf(".");
			if(p !== -1) {
				var lhs = key.substr(0,p);
				var rhs = key.substr(p+1);
				if(typeof(src[lhs][rhs]) !== "undefined") {
					return src[lhs][rhs];
				}
			}
		});
		
		
		
		if(this.humanize_dates) {
			// the space in the second group, falling in the source string between the date and time,
			// is IMPORTANT.
			markup = markup.replace(/([0-9]{4}-[0-9]{2}-[0-9]{2}( [0-9]{2}\:[0-9]{2}\:[0-9]{2})?)/g,function(m,key,value) {
				return Calendar.human_date(key);
			});
		}
		
		if(this.format_money) {
			markup = markup.replace(/\$([0-9\.]{4,})/g,function(m,key,value) {
				return "$" + formatNumber(key);
			});
		}
		
		if(this.remove_zero_dollars) {
			markup = markup.replace(/\$0/g," ");
		}
		
		if(this.strip_slashes) {
			markup = markup.replace(/\\/g,"");
		}
		
		if(this.strip_nulls) {
			markup = markup.replace(/null/g,"");
		}
		
		if(this.replace_newlines) {
			markup = markup.replace(/\n/g,"<br/>");
		}
		
		markup = markup.replace(/_#_DOLLARSIGN_#_/g,"$");
		
		
		return markup;
	}
 }
 
 
 
 
 var entify = function(s) {
	return s.replace(/\</g,"&lt;").replace(/\>/g,"&gt;").replace(/\n/g,"<br/>").replace(/\"/g,"&quot;").replace(/\'/g,"&apos;")
 }
 
 
 var Factory = {
 	
	build: function(obj, json){
		if(typeof(json) == "string") {
			json = eval("(" + json + ")");
		}
		for(var key in json) {
			if (json[key] !== null) {
				if(typeof(json[key] == "object")) {
					json[key] = this.build(json[key]);
				}
				obj[key] = json[key];
			} else {
				obj[key] = "";
			}
		}
		if(typeof(obj.finalize) != "undefined") {
			obj.finalize();
		}
		return obj;
	},
	
	pack: function(obj) {
		return JSON.stringify(obj);
	},
	
	
	ship: function(recipient,obj) {
		var formID = (new Date()).valueOf();
		//obj.shipping_label = formID;
		
		var f = Element("form");
		f.id = formID;
		f.method = "post";
		f.action = recipient;
		
		var s = Element("input");
		s.setAttribute("type","hidden");
		s.name = "object";
		
		if (typeof(obj.finalize) !== "undefined") {
			obj.finalize(true);
		}
		s.value = this.pack(obj);
		f.appendChild(s);
		
		
		//alert(s.value);
		
		document.body.appendChild(f);
		//alert(f.innerHTML)
		f.submit();
	}
	
 }
 
 
 
 
 
 
 if (typeof(RowAlternator) == "undefined") {
 	var RowAlternator = function(container, targetClass, secondaryClass, mod, limit){
 		container = getElement(container);
 		if (!mod) {
 			mod = 2;
 		}
		
		if(!limit) {
			limit = 999;
		}
 		
 		function bless(obj){
 			if (BrowserDetect.browser == "Explorer") {
 				obj.getElementsByClassName = function(n){
 					var c = this.getElementsByTagName('*');
 					var m = new Array();
 					for (var i = 0; i < c.length; i++) {
 						if (c[i].className.indexOf(n) !== -1) {
 							m.push(c[i]);
 						}
 					}
 					return m;
 				}
 			}
 		}
 		
		
		bless(container);
 		var children = container.getElementsByClassName(targetClass);
		
		if(limit > children.length) {
			limit = children.length;
		}
 		
 		for (var i = 0; i < limit; i++) {
 			if (i % mod) {
 				var d = children[i];
 				d.className += " " + secondaryClass;
 			}
 		}
 	}
 	
 }
 
 
 
 
 
 
 
