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();