Source code for /src/personal_js.js.txt

//======================================================================//
// Author: Mark Qian <markqian@hotmail.com>                             //
// WWW: http://www.coolshare.com                                        //
// Copyright (c) 2006, Mark Qian                                        //
//                                                                      //
// You must contact Mark Qian to get a permission of use                //
// in case you want to make any use of the codes except viewing it     //
// on Mark's site.                                                      //
//======================================================================//


function Subscriber(topic, obj, fn) {
//debugger
	var self = this;
	if (!fn) {
		self.obj = gadgetManager.getObj(obj[0]);
		self.fn = obj[1];
	} else {
		self.obj = obj;
		self.fn = fn;
	}
	dojo.event.topic.subscribe(topic, self.obj, self.fn);
	
	self.toString = function() {
		return "['"+self.obj.id+"','"+self.fn+"']";
	}
}

function Fun(obj, name, des, hidden) {
	var self = this;
	self.obj = obj;
	self.name = name;
	self.des = des;
	self.hidden = hidden;
	//debugger
	self.getObj = function() {
		if ((typeof self.obj) == "object")
			return self.obj;
		return eval(self.obj);
		
	}
}

function Publisher(topic, obj, fn, des) {
//debugger
	var self = this;
	if (!fn) {
		self.obj = gadgetManager.getObj(obj[0]);
		self.fn = obj[1];
		self.des = obj[2];
		
	} else {	
		self.obj = obj;
		self.fn = fn;
		self.des = des||fn;
	}
	dojo.event.topic.registerPublisher(topic, self.obj, self.fn);
	
	self.toString = function() {
		var d = self.des||"";
		return "['"+self.obj.id+"','"+self.fn+"','"+d+"']";
	}
	
}

function Link(srcObj, srcFunc, adviceObj, adviceFunc) {
	var self = this;
	self.srcObj = srcObj;
	self.srcFunc = srcFunc;
	self.adviceObj = adviceObj;
	self.adviceFunc = adviceFunc;	
		
	self.connect = function() {
		dojo.event.connect(self.srcObj, self.srcFunc, self.adviceObj, self.adviceFunc);		
		gadgetManager.linkMap["{"+self.srcObj.id+","+self.adviceObj.id+"}"] = self;
	}
	self.disconnect = function() {
		dojo.event.disconnect(self.srcObj, self.srcFunc, self.adviceObj, self.adviceFunc);
		delete gadgetManager.linkMap["{"+self.srcObj.id+","+self.adviceObj.id+"}"];
	}
}

function Topic(topic) {
	var self = this;
	if ((typeof topic)=="string") {
		self.topic = topic;
		self.subscriberList = {};
		self.publisherList = {};
	} else {
		self.topic = topic[0];
		self.subscriberList = {};
		self.publisherList = {};
		for (var i=0; i<topic[1].length; i++) {
			var sub = new Subscriber(self.topic, topic[1][i]);
			self.subscriberList[sub.id] = sub;
		}
		for (var i=0; i<topic[2].length; i++) {
			var pub = new Publisher(self.topic, topic[2][i]);
			self.publisherList[pub.topic] = pub;
		}
	}
	

	self.subscribe = function(obj, fn) {
		self.subscriberList[obj.id] = new Subscriber(self.topic, obj, fn);		
		if (obj.fg)
			obj.fg["opt"]["sub"][self.topic] = fn;
	}
	self.unsubscribe = function(id) {
		var sub = self.subscriberList[id];
		if (sub) {
			dojo.event.topic.unsubscribe(self.topic, sub.obj, sub.fn);
			delete self.subscriberList[id];
		}
	}
	
	self.registerPublisher = function(obj, fn, des) {
		self.publisherList[obj.id] = new Publisher(self.topic, obj, fn, des);		
		if (obj.fg)
			obj.fg["opt"]["pub"][self.topic] = fn;
	}
	
	self.unregisterPublisher = function(id) {
		var pub = self.publisherList[id];
		if (pub) {
			//dojo.event.topic.unregister(self.topic, pub.obj, pub.fn);
			delete self.publisherList[id];
		}
	}
	self.toString = function() {
		var res = "";
		//debugger
		res += "['"+self.topic+"',[";
		var j = 0;
		for (var i in self.subscriberList) {
			if (j++>0)
				res +=","
			res += self.subscriberList[i].toString();
		}
		res += "],["
		j = 0;
		for (var i in self.publisherList) {
			if (j++>0)
				res +=","
			res += self.publisherList[i].toString();
		}
		res += "]]";
		
		return res;
	}
	
	
}

function GadgetManager() {
  	var self = this;
  	self.gadgetMap = {};
  	self.topicMap = {};
  	self.linkMap = {};
  	self.topicFunMap = {};
  	self.funMap = {};
  	self.id = "GadgetManager";
  	
  	self.mapTopicFun = function(topic, obj, fn, des) {
  		var i = fn.indexOf("_");
		if (i<0) {
			self.topicFunMap[topic] = new Fun(obj, fn, des);
		} else {
			var id = fn.substring(i+1);
			var funs = 	self.topicFunMap[topic];
			if (!funs) {
				funs = {}
				self.topicFunMap[topic] = funs;
			}
			funs[id] = new Fun(obj, fn, des);
		}
  		
  	}
  	self.getTopicFun = function(topic, id) {
  		if (!id) {
  			return self.topicFunMap[topic];
  		}
  		var res = self.topicFunMap[topic];
  		if (!res) {
  			//alert("Topic "+topic+" not found");
  			return null;
  		}
  		return res[id];
  	}
  	
  	self.subscribe = function(topic, obj, fn) {
  		var t = self.topicMap[topic];
  		if (!t) {
  			t = new Topic(topic);
  			self.topicMap[topic] = t;
  		}
		t.subscribe(obj, fn);
	}
	self.unsubscribe = function(topic, id) {
  		var t = self.topicMap[topic];
  		if (!t) {
  			return;
  		}
		t.unsubscribe(id);
	}
	
	self.registerPublisher = function(topic, obj, fn, des) {
  		var t = self.topicMap[topic];
  		if (!t) {
  			t = new Topic(topic);
  			self.topicMap[topic] = t;
  		}
		t.registerPublisher(obj, fn, des);
	}
	self.unregisterPublisher = function(topic, id) {
  		var t = self.topicMap[topic];
  		if (!t) {
  			return;
  		}
		t.unregisterPublisher(id);
	}
	
	self.clearTopic = function (id) {
		for (var i in self.topicMap) {
			var t= self.topicMap[i];
			var s = t.subscriberList[id];
			if (s) {
				t.unsubscribe(s.obj, s.fn);
				delete t.subscriberList[id];
			}
			s = t.publisherList[id];
			if (s) {
				t.unregisterPublisher(s.obj, s.fn);
				delete t.publisherList[id];
			}
		}
	}
	
	self.clearGadget = function (id) {
		self.clearLink(id);
		self.clearTopic(id);
		self.removeFunById(id);
	}
	
	self.connect = function(srcObj, srcFunc, adviceObj, adviceFunc) {
		var link = new Link(srcObj, srcFunc, adviceObj, adviceFunc);
		link.connect();
	}
	
	self.disconnect = function(id1, id2) {
		var id = "{"+id1+","+id2+"}";
		var link = self.linkMap[id];
		if (link) {
			link.disconnect();
			return true;
		}
		
		return false;
	}
	
	self.disconnectById = function(id) {
		var res = false;
		var m = self.linkMap;
		for (var i in m) {
			var k = eval(m[i]);
			if (k[id]) {
				self.linkMap[i].disconnect();			
				res = true;
			}
		}
		return false;
	}
	
	
	self.clearLink = function (id) {
		self.disconnectById(id);
	}
	
	self.addFun = function(fn, fun, des, obj, topic, hidden) {
	//debugger
		if (!obj)
			obj = self;
		obj[fn] = fun;
		gadgetManager.funMap[fn] = new Fun(obj, fn, des, hidden);
		if (topic) 
			self.mapTopicFun(topic, obj, fn, des);
	}
	
	self.removeFunById = function(id) {
		var res = new Array();
		for (var i in self.funMap) {
			var f = self.funMap[i];
			if (f.obj.id==id)
				res[res.length] = i;
		}
		for (var i=0; i<res.length; i++) {
			delete self.funMap[res[i]];
		}
	}
	
	self.getGedget = function(id) {
		return self.gadgetMap[id];
	}
	
	self.defineDefaultFunctions = function() {
	
		self.addFun("hideAllGadgets", (function () {
			return function() {
				    for (var i in self.gadgetMap) {
				    	var g = self.gadgetMap[i];
			        	g.tr.style.display = "none";
			        }
		    }
		})(), "Hide all gadgets");
		self.addFun("hideAllGadgets", (function () {
			return function() {
				    for (var i in self.gadgetMap) {
				    	var g = self.gadgetMap[i];
			        	g.tr.style.display = "none";
			        }
		    }
		})(), "Hide all gadgets");
		self.addFun("showAllGadgets", (function () {
			return function() {
				    for (var i in self.gadgetMap) {
				    	var g = self.gadgetMap[i];
			        	g.tr.style.display = "block";
			        }
		    }
		})(), "Show all gadgets");
		self.addFun("minimizeAllGadgets", (function () {
			return function() {
				    for (var i in self.gadgetMap) {
				    	var g = self.gadgetMap[i];
			        	g.wipeOut();
			        }
		    }
		})(), "Minimize all gadgets");
		self.addFun("restoreAllGadgets", (function () {
			return function() {
				    for (var i in self.gadgetMap) {
				    	var g = self.gadgetMap[i];
			        	g.wipeIn();
			        }
		    }
		})(), "Restore all gadgets");
		
	}
	
	self.doAfterLoad = function() {
		self.defineDefaultFunctions();
		gadgetManager.deserializeEvents(readCookie("events"));
	}
	
	self.addTopic = function(topic) {
		return self.topicMap[topic] = new Topic(topic);
	}
	
	self.serializeEvents = function() {
	//debugger
		var res = "[";
		var j=0;
		for (var i in self.topicMap) {
			if (j++>0)
				res +=",";
			res += self.topicMap[i].toString();
		}
		res +="]";
	//msg(res)		
		return res;
	}
	
	self.deserializeEvents = function(s) {
	//msg(s)
	//debugger
		if (!s)
			return;
		var ss = eval(s);
		for (var i=0; i<ss.length; i++) {
			var t = new Topic(ss[i]);
			self.topicMap[t.topic] = t;
		}
		
	}
	
	self.getObj = function(id) {
		var res = null;
		if (id=="GadgetManager") 
			res = this;
		else if (id=="_win_")
			res = window;
		else  {
			res = self.gadgetMap[id];
			if (!res)
				res = dojo.byId(id);
		}
		return res;
	}
}

var gadgetManager = new GadgetManager();