function registerNameSpace(ns) {
	var nsParts = ns.split(".");
	var root = window;

	for ( var i = 0; i < nsParts.length; i++) {
		if (typeof root[nsParts[i]] == "undefined")
			root[nsParts[i]] = new Object();

		root = root[nsParts[i]];
	}
}

registerNameSpace("DMAS");
DMAS.Registry = new function() {
	var registry = { };
	this.set = function (id, obj) {
		registry[id] = obj;
	};

	
	this.get = function (id) {
		return registry[id];
	};
};

registerNameSpace("DMAS.Util.Map");
/**
 * Merge two or more maps together. Everything is merged into the target map
 * 
 * @Param target The map to merge into
 * @Param any number of maps to merge into the target
 * @Return the merged target map
 */

DMAS.Util.Map.merge = function (target, object1 /*, any number of maps to merge */) {
	if (target == null) target = {};
	for (var i = 1; i < arguments.length; i++) {
		var map = arguments[i];
		if (map != null) {
			for (var key in map) {
				target[key] = map[key];
			}
		}
	}
	return target;
};

/**
 * LastReading Widget
 * 
 * Requirements:
 *  yui/build/yahoo/yahoo-min.js
 *  yui/build/get/get-min.js 
 *  DMAS.js
 *  DMASUtil.js
 */
registerNameSpace("DMAS.Widget");
DMAS.Widget.LastReading = function (id, options) {
	var scope = {};
	var elementId = id + "_lastreading"; 
	var config = DMAS.Util.Map.merge({
		sensors: { },
		service_url: "http://dmas.uvic.ca/LastReadingJSON",
		failure: { element: null, message: null },
		refresh: 60
	}, options);

	var url = "";

	var init = function () {
		url = config.service_url + "?";
		//create the url
		var sensors = [];
		for (var sid in config.sensors) {
			sensors.push(sid);
		}
		url += "sensors=" + sensors.join(",");
	};
	init();
	
	var setFailure = function(message) {
		if (config.failure.element != null) {
			var el = document.getElementById(config.failure.element);
			if (el != null) {
				if (message == null) {
					message = config.failure.message;
				}
				el.innerHTML = message;
			}
		}
	};

	this.nextReading = function () {
		var callbacks = {
			success : function (o) {
				if (sensorsInfos == null) {
					callbacks.failure(o);
					return;
				}
				for (var i = 0; i < sensorsInfos.length; i++) {
					var si = sensorsInfos[i];
					var el = document.getElementById(config.sensors[si.sensorId]);
					if (el != null) {
						el.innerHTML = si.lastReading.correctedValue.toFixed(2);
					}
				}
				setFailure("");
				
				setTimeout(function() {
					DMAS.Registry.get(elementId).nextReading();
				}, config.refresh * 1000);
				sensorsInfos = null;
				o.purge();
			},
			
			failure : function (o) {
				setFailure();
				setTimeout(function() {
					DMAS.Registry.get(elementId).nextReading();
				}, config.refresh * 1000);		
			}
		};
		
		var transactionObject = YAHOO.util.Get.script(url, {
			onSuccess : callbacks.success,
			onFailure : callbacks.failure,
			onTimeout : callbacks.failure,
			timeout: 2000
		});
	};
	DMAS.Registry.set(elementId, this);
};
