/**
 * @description:	A prototype.js based reader to generate HTML-code using templates writen in JSON
 * @author:			Thomas Krapp; t.krapp [at] googlemail [dot] com; http://www.kebdnk.com/
 * @version:		0.7
 * @date:			2008-02-18
 * @requires:		prototype.js 1.6
 */

var JSONTemplate = {
	debug: false,
	
	transform2HTML_Objects: function(obj) {
		for(var i in obj) {
			switch(i) {
				case 'tagName':
					var retval = this.createElement(obj.tagName, retval ? retval : false);
					
					break;
				
				case 'style':
					var retval = this.createElement(obj.tagName, retval ? retval : false);
					
					$(retval).setStyle(obj[i]);
					
					break;
				
				default:
					switch(typeof(obj[i])) {
						case 'object':
							if(!retval && !obj.tagName) {
								var retval = new Array();
							} else if(obj.tagName) {
								var retval = this.createElement(obj.tagName, retval ? retval : false);
							}
							
							var child = this.transform2HTML_Objects(obj[i]);
							
							if(retval instanceof Array) {
								retval.push(child);
							} else {
								for(var j = 0; j < child.length; j++) {
									retval.appendChild(child[j]);
								}
							}
							
							break;
						
						case 'function':
							if(i.startsWith('on')) {
								var retval = this.createElement(obj.tagName, retval ? retval : false);
								
								Event.observe(retval, i.sub('on', ''), obj[i]);
							}
							
							break;
						
						default:
							var retval = this.createElement(obj.tagName, retval ? retval : false);
							
							retval[i] = obj[i];
							break;
					}
					
					break;
			}
		}
		
		return retval;
	},
	
	createElement: function(tagName, retval) {
		if(!retval.tagName) {
			var retval = document.createElement(tagName);
		}
		
		return retval;
	},
	
	throwError: function(error) {
		if(this.debug == true) {
			alert(error);
		}
	}
};

JSONTemplate.AjaxReader = Class.create({
	initialize: function(templatefile, destination) {
		new Ajax.Request(templatefile,
			{
				method:    'post',
				onSuccess: function(transport){
					try {
						var obj = eval('(' + transport.responseText + ')');
					} catch(e) {
						throw(e);
					}
					
					$(destination).appendChild(JSONTemplate.transform2HTML_Objects(obj));
				},
				onFailure: function(transport) {
					JSONTemplate.throwError(transport.status);
				},
				onException: function(transports, err) {
					JSONTemplate.throwError('Msg: ' + err.message + '\n' +
					                        'File: ' + err.fileName + '\n' +
					                        'Line: ' + err.lineNumber);
				}
			}
		);
	}
});

JSONTemplate.Reader = Class.create({
	initialize: function(input, destination) {
		if(typeof(input) == 'object') {
			obj = input;
		} else {
			try {
				var obj = eval('(' + input + ')');
			} catch(e) {
				JSONTemplate.throwError(e);
			}
		}
		
		$(destination).appendChild(JSONTemplate.transform2HTML_Objects(obj));
	}
});
