//****************************************************************************************
//
//	json.js
//
//	Object converting to and from JSON.
//
//	Depends On:
//				
//
//	Copyright: 	David Horne, Tuross Technologies Australia P/L, 2009.
//				dkhorne@bigpond.net.au
//
//****************************************************************************************

	var JSON = function() {

//	Converts an object to JSON string
		var formatJSON = 			function(item, includeFunctions, indent) {
										if (item == null)
											return "";
											
										switch (global.typeOf(item)) {
											case "array":
											case "object":
												return JSON.toJSON(item, includeFunctions, (indent + 1));
												break;
												
											case "function":
												return "'" + encodeURI(item) + "'";
												break;
												
											case "number":
												return item;
												break;
							
											case "boolean":
												return (item ? "'true'" : "'false'");
												break;
							
											case "undefined":
												return "";
												break;
							
											case "date":
												return "'" + Date(item).toString("dd/MMM/yyyy hh:mm:ss") + "'";
												break;
							
											case "string":
											default:
												return "'" + item.replace(/\\/g, "\\\\") + "'";
												break;
										}
										return "";
									};
									
		return {
			//	Convert an object to JSON string
			toJSON:				function(source, includeFunctions, indent) {
									var delimit = ", ";
									var arrayTemplate = "<indent>[\t<item>\t]";
									var arrayItemTemplate = "<value>" + delimit;
									var objectTemplate = "<indent>{\t<item>\t}";
									var objectItemTemplate = "'<name>': <value>" + delimit;
									var itemNewline = "\n<indent>\t";
									var theTemplate;
									var wasObject = false;
									var strIndent = "";
	
									try {
										includeFunctions = (includeFunctions == null ? false : includeFunctions);
										indent = (indent != null ? indent : 0)
										for (var i = 0; i < indent; i++)
											strIndent += "   ";
										
										var strItems = "";
										if (source instanceof Array) {
											for (var i = 0; i < source.length; i++) {
												if (!(source[item] instanceof Function) || includeFunctions) {
													if (typeof(source[i]) == "object") {
														strItems += itemNewline + arrayItemTemplate.replace(/<value>/g, formatJSON(source[i], includeFunctions, indent));
														wasObject = true;
													} else {
														strItems += (wasObject ? itemNewline : "") + arrayItemTemplate.replace(/<value>/g, formatJSON(source[i], includeFunctions, indent));
														wasObject = false;
													}
												}
											}
							
											theTemplate = arrayTemplate;
										} else {
											for (var item in source) {
												if ((source[item] != null) && (!(source[item] instanceof Function) || includeFunctions)) {
													if (typeof(source[item]) == "object") {
														strItems += itemNewline + objectItemTemplate.replace(/<name>/g, item).replace(/<value>/g, formatJSON(source[item], includeFunctions, indent));
														wasObject = true;
													} else {
														strItems += (wasObject ? itemNewline : "") + objectItemTemplate.replace(/<name>/g, item).replace(/<value>/g, formatJSON(source[item], includeFunctions, indent));
														wasObject = false;
													}
												}
											}
											theTemplate = objectTemplate;
										}
										strItems = strItems.substr(0, strItems.lastIndexOf(delimit, strItems));
										return theTemplate.replace(/<item>/g, strItems).replace(/<indent>/g, strIndent);
									}
									catch (e) {
										alert("Cannot convert object to JSON string: " + e.message);
										return null;
									}
								},
								
			//	Convert JSON string to an object
			fromJSON:			function(source) {
									try {
										if ((source != null) && (source != ""))
											return eval("(" + source + ")");
										else
											return {};
									}
									catch (e) {
										alert("Cannot convert JSON string to object: " + e.message);
										return {};
									}
								}
		}
							
	}();

//	End JSON
//****************************************************************************************
	
	

