home *** CD-ROM | disk | FTP | other *** search
Wrap
Text File | 2009-12-23 | 502.1 KB | 12,574 lines
var Logging = { LogToConsole: function(ex, addInfo) { if (!PrefService.GetPref("conduit.debugMode")) return; if (ex && typeof ex.fileName != "undefined") { var strMsg = addInfo + " " + ex + "\nStack:\n " + ex.stack; this.ExtendedLogToConsole(strMsg, ex.fileName, null, ex.lineNumber, null, null, ex.name); } else this.ExtendedLogToConsole(ex, null, null, null, null, null, null); }, ExtendedLogToConsole: function(aMessage, aSourceName, aSourceLine, aLineNumber, aColumnNumber, aFlags, aCategory) { var consoleService = Components.classes["@mozilla.org/consoleservice;1"] .getService(Components.interfaces.nsIConsoleService); var scriptError = Components.classes["@mozilla.org/scripterror;1"] .createInstance(Components.interfaces.nsIScriptError); scriptError.init(aMessage, aSourceName, aSourceLine, aLineNumber, aColumnNumber, aFlags, aCategory); consoleService.logMessage(scriptError); }, //DB error log DBLogToConsole: function(tableName, error, ex, moreInfo) { var strMsg = stringFormat("DB Error\nTable name:{0}\n{1}\n{2}\n{3}", tableName, error, ex, moreInfo); this.LogToConsole(strMsg); } }; function EBLog(ex, addInfo) { Logging.LogToConsole(ex, addInfo); }; var AppInfo = { //consts WIN: "WIN", MAC: "MAC", LINUX: "LINUX", //public properties OS: "", browserVersion: "", isGecko191: null, //FF3.5 and up isGecko19: null, //FF3 and up isGecko18: null, //FF2 and up xulRuntime: null, compareVersions: function(strVer1, strVer2) { var oVersionCompare = Components.classes["@mozilla.org/xpcom/version-comparator;1"] .createInstance(Components.interfaces.nsIVersionComparator); return oVersionCompare.compare(strVer1, strVer2); }, getOS: function() { try { var window = getWindow(); var strUserAgent = window.navigator.userAgent; var iStart = strUserAgent.indexOf('('); var iEnd = strUserAgent.indexOf(')'); var strPlatformData = strUserAgent.substring(iStart, iEnd); var arrData = strPlatformData.split(';'); return arrData[2].replace(/\s/g, ""); } catch (e) { return ""; } }, isVista: function() { var os = this.getOS().toUpperCase(); if (os.indexOf(this.WIN) == -1) return false; os = os.replace(/\./g, ""); var ver = os.match(/(\d+)/); return parseInt(ver) >= 60 }, init: function() { //parse OS type try { this.xulRuntime = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime); var _os = this.xulRuntime.OS.toUpperCase(); if (_os.indexOf(this.WIN) != -1) { this.OS = this.WIN; } else if (_os.indexOf(this.MAC) != -1) this.OS = this.MAC; else this.OS = this.LINUX; //set gecko version (1.8.x or 1.9.x) var _geckoVer = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo).platformVersion; this.browserVersion = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo).version; var strGeckoVer = "1.9.0.0"; //FF3 gecko version var iCompare = this.compareVersions(_geckoVer, strGeckoVer); this.isGecko19 = (iCompare >= 0); strGeckoVer = "1.9.1.0"; //FF3.5 gecko version var iCompare = this.compareVersions(_geckoVer, strGeckoVer); this.isGecko191 = (iCompare >= 0); strGeckoVer = "1.8.0.0"; //FF2 gecko version iCompare = this.compareVersions(_geckoVer, strGeckoVer); this.isGecko18 = (iCompare >= 0); } catch (e) { Logging.LogToConsole(e) } } }; AppInfo.init(); var CommonFolderManagment = { cleanup: function() { try { var oDir = Dir.get("ProfD"); oDir.append(CommonData.ConduitFolder); var arrFiles = Dir.read(oDir, true); Dir.unlink(oDir, true); } catch (ex) { EBLog(ex); } } }; function FeedCustomData(strTitle, strLink, strImageUrl) { this.title = strTitle; this.link = strLink; this.imageUrl = strImageUrl; }; function FeedCustomItem() { this.title = ""; this.link = ""; this.pubDate = ""; this.description = ""; this.guid = ""; this.isHistory = false; this.initFromItem = function(feedItem) { this.link = (feedItem.link) ? feedItem.link.resolve("") : ""; this.title = (feedItem.title) ? feedItem.title.text : ""; //patch to grab the published date this.pubDate = (feedItem.published) ? feedItem.published : feedItem.fields.getPropertyAsAString("pubDate"); this.description = (feedItem.summary) ? feedItem.summary.text : feedItem.content.text; this.guid = feedItem.id; }; this.init = function(title, link, description, pubDate, guid) { this.link = link; this.title = title; this.description = description; this.pubDate = pubDate; this.guid = guid; }; }; var FeedParser = { //this function returns an Array of FeedCustomItem, with 2 more properties: //title, link parseFeed: function(strFeedText, strUrl, isPodcast, objCallback, objCallbackThis, state) { //parse with build in Web Feed Api if (AppInfo.isGecko18) return this._parseFeedNative(strFeedText, strUrl, isPodcast, objCallback, objCallbackThis, state); else return this._parseFeedFFBelow2(strFeedText, strUrl, isPodcast, objCallback, objCallbackThis, state); }, _parseFeedNative: function(strFeedText, strUrl, isPodcast, objCallback, objCallbackThis, state) { var FeedResultListener = function(objCallback, objCallbackThis) { //feed parser function this.handleResult = function(result) { var feed = result.doc; feed.QueryInterface(Components.interfaces.nsIFeed); var itemArray = feed.items; var customItemArray = new Array(); var numItems = itemArray.length; var item = null; var feedCustomItem = null; for (var i = 0; i < numItems; i++) { item = itemArray.queryElementAt(i, Components.interfaces.nsIFeedEntry); feedCustomItem = new FeedCustomItem(); feedCustomItem.initFromItem(item); customItemArray.push(feedCustomItem); } customItemArray.feedData = new FeedCustomData((feed.title) ? feed.title.plainText() : "", (feed.link) ? feed.link.resolve("") : "", (feed.image) ? feed.image.getPropertyAsAString("url") : "" ); objCallback.call(objCallbackThis, customItemArray, state); } }; var resultListener = new FeedResultListener(objCallback, objCallbackThis); var fp = Components.classes["@mozilla.org/feed-processor;1"].createInstance(Components.interfaces.nsIFeedProcessor); fp.listener = resultListener; fp.parseFromString(strFeedText, getURI(strUrl)); }, _parseFeedFFBelow2: function(strFeedText, strUrl, isPodcast, objCallback, objCallbackThis, state) { //TODO: take a code from toolbar feed parsing } } //this object receives url of the feed, and callback function, to call when feed is processed, passing //the processed feed nsIFeedContainer as a parameter. function FeedPoller(strUrl, isPodcast, objCallback, objCallbackThis, state) { this.onFeedDataAvailable = function(strFeedData) { FeedParser.parseFeed(strFeedData, strUrl, isPodcast, objCallback, objCallbackThis, state); }; var self = this; EBServerDataURL.HTTPServerRequest(strUrl, null, false, function(strFeedData) { self.onFeedDataAvailable(strFeedData); }); }; function HashArray(saveKeysInArray) { this.IndexerArray = null; this.HashArray = null; this.KeysArray = null; this.Init = function() { this.IndexerArray = new Array(); this.HashArray = new Array(); this.KeysArray = new Array(); }; this.Add = function(strKeyID, objValue) { //check if already exists if (!this.Contains(strKeyID)) { strKeyID = this.LegalizeHashKey(strKeyID); //add to the indexers array to the last place this.IndexerArray[this.IndexerArray.length] = objValue; //add to the hash array per component id this.HashArray[strKeyID] = objValue; if (saveKeysInArray) this.KeysArray.push(strKeyID); } }; this.Insert = function(iIndex, strKeyID, objValue) { if (!this.Contains(strKeyID)) { strKeyID = this.LegalizeHashKey(strKeyID); //add to the indexers array to the iIndex place this.IndexerArray.splice(iIndex, 0, objValue); //add to the hash array per component id this.HashArray[strKeyID] = objValue; if (saveKeysInArray) this.KeysArray.push(strKeyID); } }; this.Remove = function(iIndex, strKeyID) { if (this.Contains(strKeyID)) { strKeyID = this.LegalizeHashKey(strKeyID); //remove from indexer array this.IndexerArray.splice(iIndex, 1); //remove from hash delete this.HashArray[strKeyID]; } }; this.GetByIndex = function(iIndex) { var objValue = this.IndexerArray[iIndex]; return objValue; }; this.GetByID = function(strKeyID) { strKeyID = this.LegalizeHashKey(strKeyID); var objValue = this.HashArray[strKeyID]; return objValue; }; this.GetIndexByObjectValue = function(oValue) { for (var i = 0; i < this.IndexerArray.length; i++) { if (this.GetByIndex(i) == oValue) { return i; } } return -1; }; this.Contains = function(strKeyID) { var objValue = this.GetByID(strKeyID); return objValue ? true : false; }; this.Count = function() { return this.IndexerArray.length; }; this.LegalizeHashKey = function(strKeyID) { try { strKeyID = strKeyID.toString(); strKeyID = strKeyID.toUpperCase(); } catch (ex) { Logging.LogToConsole(ex); } return strKeyID; }; this.Clear = function() { this.Init(); }; this.Init(); } //this object is not real hash, it's used for little amount of data, but can delete from the hash. function HashArray2() { this.arr = null; this.Init = function() { this.arr = new Array(); }; this.Add = function(strKeyID, objValue) { strKeyID = this.LegalizeHashKey(strKeyID); //remove if already exists this.Remove(strKeyID); this.arr.push({ "key": strKeyID, "value": objValue }); }; this.Remove = function(strKeyID) { strKeyID = this.LegalizeHashKey(strKeyID); var elem = null; var temp = this._getObjAndIndex(strKeyID); if (!temp) return; this.arr.splice(temp.index, 1); }; this.GetByIndex = function(iIndex) { return this.arr[iIndex].value; }; this.GetByID = function(strKeyID) { strKeyID = this.LegalizeHashKey(strKeyID); var temp = this._getObjAndIndex(strKeyID); if (!temp) throw ("element not found in hash"); return temp.obj.value; }; this.Contains = function(strKeyID) { strKeyID = this.LegalizeHashKey(strKeyID); return this._getObjAndIndex(strKeyID) != null; }; this.Count = function() { return this.arr.length; }; this.LegalizeHashKey = function(strKeyID) { try { strKeyID = strKeyID.toString(); strKeyID = strKeyID.toUpperCase(); } catch (ex) { Logging.LogToConsole(ex); } return strKeyID; }; this._getObjAndIndex = function(strKeyID) { strKeyID = this.LegalizeHashKey(strKeyID); for (var i = 0; i < this.arr.length; i++) { elem = this.arr[i]; if (elem.key == strKeyID) { return { "obj": elem, "index": i }; } } return null; }; this.Clear = function() { this.Init(); }; this.Init(); } function IdleObserver(iTimout, onIdleCallback, onBackCallback, objThis) { var NSIObserverService = Components.classes["@mozilla.org/widget/idleservice;1"].getService(Components.interfaces["nsIIdleService"]); this.isIdle = false; this.register = function() { NSIObserverService.addIdleObserver(this, iTimout); }; this.unregister = function() { NSIObserverService.removeIdleObserver(this, iTimout); }; this.observe = function(aSubject, aTopic, idleTime) { if (aTopic == "idle") { this.isIdle = true; onIdleCallback.call(objThis, idleTime); } else if (aTopic == "back") { this.isIdle = false; onBackCallback.call(objThis, idleTime); } }; this.getIddleTime = function() { return NSIObserverService.idleTime; }; }; IdleObserver.prototype = new BaseObserver(); function IO(strOriginalCTID, strCurrentCTID) { this.basePath = ""; this.baseMCPath = ""; //*************** Public methods ********************* //returns file content as string this.readToolbarFile = function(strRelativePath, isMC, charset) { var oFile = this._getFile(strRelativePath, isMC); if (!oFile) return ""; else return File.read(oFile, charset); }; this.writeToolbarFile = function(strData, strRelativePath, isMC, charset) { var oFile = this._getFile(strRelativePath, isMC); if (!oFile) return; File.write(oFile, strData, null, charset); }; this.isExists = function(strRelativePath, isMC) { try { var oFile = null; oFile = File.open(this._getBaseDirPath(isMC) + Dir.sep + strRelativePath); return oFile.exists(); } catch (e) { return false; } }; this.isExistsNotEmpty = function(strRelativePath, isMC) { if (!this.isExists(strRelativePath, isMC)) return false; var strData = this.readToolbarFile(strRelativePath, isMC); if (strData && strData.length > 0) return true; else return false; }; this.deleteFile = function(strRelativePath, isMC) { if (!this.isExists(strRelativePath, isMC)) return; var oFile = this._getFile(strRelativePath, isMC); if (oFile) File.unlink(oFile); }; //*************** Private methods ********************* this._init = function(strOriginalCTID, strCurrentCTID) { this.basePath = IOManager.GetPrefsDir().path + Dir.sep + strOriginalCTID; if (strOriginalCTID != strCurrentCTID) this.baseMCPath = this.basePath + Dir.sep + "communities" + Dir.sep + strCurrentCTID; else this.baseMCPath = this.basePath; //create base dirs if not exists var oToolbarDir = Dir.open(this.basePath); if (!oToolbarDir.exists()) Dir.create(oToolbarDir); oToolbarDir = Dir.open(this.baseMCPath) if (!oToolbarDir.exists()) Dir.create(oToolbarDir); }; this._getBaseDirPath = function(isMC) { return (isMC) ? this.baseMCPath : this.basePath; }; this._getFile = function(strRelativePath, isMC) { try { var oFile = null; oFile = File.open(this._getBaseDirPath(isMC) + Dir.sep + strRelativePath); if (!oFile.exists()) File.create(oFile); return oFile; } catch (ex) { return null; } }; //init class this._init(strOriginalCTID, strCurrentCTID); }; var File = { defaultCharSet: "UTF-8", localfileCID: '@mozilla.org/file/local;1', localfileIID: Components.interfaces.nsILocalFile, finstreamCID: '@mozilla.org/network/file-input-stream;1', finstreamIID: Components.interfaces.nsIFileInputStream, foutstreamCID: '@mozilla.org/network/file-output-stream;1', foutstreamIID: Components.interfaces.nsIFileOutputStream, sinstreamCID: '@mozilla.org/scriptableinputstream;1', sinstreamIID: Components.interfaces.nsIScriptableInputStream, suniconvCID: '@mozilla.org/intl/scriptableunicodeconverter', suniconvIID: Components.interfaces.nsIScriptableUnicodeConverter, open: function(path) { try { var file = Components.classes[this.localfileCID] .createInstance(this.localfileIID); file.initWithPath(path); return file; } catch (e) { return false; } }, read: function(file, charset) { try { if (typeof charset == "undefined") charset = this.defaultCharSet; var data = new String(); var fiStream = Components.classes[this.finstreamCID] .createInstance(this.finstreamIID); var siStream = Components.classes[this.sinstreamCID] .createInstance(this.sinstreamIID); fiStream.init(file, 1, 0, false); siStream.init(fiStream); data += siStream.read(-1); siStream.close(); fiStream.close(); if (charset) { data = this.toUnicode(data, charset); } return data; } catch (e) { EBLog(e, "file read error"); return false; } }, write: function(file, data, mode, charset) { try { if (typeof charset == "undefined") charset = this.defaultCharSet; var foStream = Components.classes[this.foutstreamCID] .createInstance(this.foutstreamIID); if (charset) data = this.fromUnicode(data, charset); var flags = 0x02 | 0x08 | 0x20; // wronly | create | truncate if (mode == 'a') { flags = 0x02 | 0x10; // wronly | append } foStream.init(file, flags, 0664, 0); foStream.write(data, data.length); // foStream.flush(); foStream.close(); return true; } catch (e) { EBLog(e, "file write error"); return false; } }, create: function(file) { try { file.create(0x00, 0664); return true; } catch (e) { return false; } }, unlink: function(file) { try { file.remove(false); return true; } catch (e) { return false; } }, path: function(file) { try { return 'file:///' + file.path.replace(/\\/g, '\/') .replace(/^\s*\/?/, '').replace(/\ /g, '%20'); } catch (e) { return false; } }, toUnicode: function(data, charset) { try { if (typeof charset == "undefined") charset = this.defaultCharSet; var uniConv = Components.classes[this.suniconvCID] .createInstance(this.suniconvIID); uniConv.charset = charset; data = uniConv.ConvertToUnicode(data); } catch (e) { // foobar! } return data; }, fromUnicode: function(data, charset) { try { if (typeof charset == "undefined") charset = this.defaultCharSet; var uniConv = Components.classes[this.suniconvCID] .createInstance(this.suniconvIID); uniConv.charset = charset; data = uniConv.ConvertFromUnicode(data); // data += uniConv.Finish(); } catch (e) { // foobar! } return data; } } var Dir = { sep: '/', dirservCID: '@mozilla.org/file/directory_service;1', propsIID: Components.interfaces.nsIProperties, fileIID: Components.interfaces.nsIFile, get: function(type) { try { var dir = Components.classes[this.dirservCID] .createInstance(this.propsIID) .get(type, this.fileIID); return dir; } catch (e) { return false; } }, open: function(path) { return File.open(path); }, create: function(dir) { try { dir.create(0x01, 0755); //make sure we can read and write to and from the directory if (!dir.isReadable() || !dir.isWritable()) { dir.permissions = 0755; } return true; } catch (e) { return false; } }, read: function(dir, recursive) { var list = new Array(); try { if (dir.isDirectory()) { if (recursive == null) { recursive = false; } var files = dir.directoryEntries; list = this._read(files, recursive); } } catch (e) { // foobar! } return list; }, _read: function(dirEntry, recursive) { var list = new Array(); try { while (dirEntry.hasMoreElements()) { list.push(dirEntry.getNext() .QueryInterface(File.localfileIID)); } if (recursive) { var list2 = new Array(); for (var i = 0; i < list.length; ++i) { if (list[i].isDirectory()) { files = list[i].directoryEntries; list2 = this._read(files, recursive); } } for (i = 0; i < list2.length; ++i) { list.push(list2[i]); } } } catch (e) { // foobar! } return list; }, unlink: function(dir, recursive) { try { if (recursive == null) { recursive = false; } dir.remove(recursive); return true; } catch (e) { return false; } }, path: function(dir) { return File.path(dir); }, split: function(str, join) { var arr = str.split(/\/|\\/), i; str = new String(); for (i = 0; i < arr.length; ++i) { str += arr[i] + ((i != arr.length - 1) ? join : ''); } return str; }, join: function(str, split) { var arr = str.split(split), i; str = new String(); for (i = 0; i < arr.length; ++i) { str += arr[i] + ((i != arr.length - 1) ? this.sep : ''); } return str; } } if ("@mozilla.org/windows-registry-key;1" in Components.classes) Dir.sep = "\\"; var IOManager = { GetPrefsDir: function() { return Dir.get('ProfD'); }, GetSearchPluginsDir: function() { return Dir.get("SrchPlugns"); }, GetExtentionPath: function(id) { var strExtPath = ""; try { var ext = Components.classes["@mozilla.org/extensions/manager;1"] .getService(Components.interfaces.nsIExtensionManager) .getInstallLocation(id) .getItemLocation(id); strExtPath = ext.path; } catch (ex) { strExtPath = ""; } finally { return strExtPath; } }, CreateDir: function(strDirName) { var ebDirPath = this.GetPrefsDir().path + Dir.sep + strDirName; var ebDir = Dir.open(ebDirPath); if (!ebDir.exists()) { Dir.create(ebDir); } return ebDir; }, CreateToolbarFile: function(strFileName, strCTID) { var ebFile = null; try { var ebDir = this.CreateDir(strCTID); ebFile = File.open(ebDir.path + Dir.sep + strFileName); if (!ebFile.exists()) { File.create(ebFile); } } catch (err) { ebFile = null; } finally { return ebFile; } }, DeleteToolbarDirectory: function(strCTID) { var bRetVal = false; try { var objEBDir = this.CreateDir(strCTID); Dir.unlink(objEBDir, true); bRetVal = true; } catch (err) { bRetVal = false; } return bRetVal; }, IsToolbarFileExists: function(strFileName, strCTID) { var bRetVal = false; try { var ebDir = this.CreateDir(strCTID); ebFile = File.open(ebDir.path + Dir.sep + strFileName); bRetVal = ebFile.exists(); } catch (err) { bRetVal = false; } return bRetVal; } } if (typeof JSON == "undefined") { //FF3.5 if (AppInfo.isGecko191) { //do nothing } //FF3 else if (AppInfo.isGecko19) { var myJson = Components.classes["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON); JSON = {}; JSON.stringify = function(obj) { return myJson.encode(obj); }; JSON.parse = function(str) { return myJson.decode(str); }; } //FF2 else { var myJson = { stringify: function(aJSObject, aKeysToDrop) { var pieces = []; function append_piece(aObj) { if (typeof aObj == "string") { aObj = aObj.replace(/[\\"\x00-\x1F\u0080-\uFFFF]/g, function($0) { switch ($0) { case "\b": return "\\b"; case "\t": return "\\t"; case "\n": return "\\n"; case "\f": return "\\f"; case "\r": return "\\r"; case '"': return '\\"'; case "\\": return "\\\\"; } return "\\u" + ("0000" + $0.charCodeAt(0).toString(16)).slice(-4); }); pieces.push('"' + aObj + '"') } else if (typeof aObj == "boolean") { pieces.push(aObj ? "true" : "false"); } else if (typeof aObj == "number" && isFinite(aObj)) { pieces.push(aObj.toString()); } else if (aObj === null) { pieces.push("null"); } else if (aObj instanceof Array || typeof aObj == "object" && "length" in aObj && (aObj.length === 0 || aObj[aObj.length - 1] !== undefined)) { pieces.push("["); for (var i = 0; i < aObj.length; i++) { arguments.callee(aObj[i]); pieces.push(","); } if (aObj.length > 0) pieces.pop(); // drop the trailing colon pieces.push("]"); } else if (typeof aObj == "object") { pieces.push("{"); for (var key in aObj) { // allow callers to pass objects containing private data which // they don't want the JSON string to contain (so they don't // have to manually pre-process the object) if (aKeysToDrop && aKeysToDrop.indexOf(key) != -1) continue; arguments.callee(key.toString()); pieces.push(":"); arguments.callee(aObj[key]); pieces.push(","); } if (pieces[pieces.length - 1] == ",") pieces.pop(); // drop the trailing colon pieces.push("}"); } else { throw new TypeError("No JSON representation for this object!"); } } append_piece(aJSObject); return pieces.join(""); }, /** * Converts a JSON string into a JavaScript object. * * @param aJSONString is the string to be converted * @return a JavaScript object for the given JSON representation */ parse: function(aJSONString) { if (!this.isMostlyHarmless(aJSONString)) throw new SyntaxError("No valid JSON string!"); var s = new Components.utils.Sandbox("about:blank"); return Components.utils.evalInSandbox("(" + aJSONString + ")", s); }, /** * Checks whether the given string contains potentially harmful * content which might be executed during its evaluation * (no parser, thus not 100% safe! Best to use a Sandbox for evaluation) * * @param aString is the string to be tested * @return a boolean */ isMostlyHarmless: function(aString) { var maybeHarmful = /[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/; var jsonStrings = /"(\\.|[^"\\\n\r])*"/g; return !maybeHarmful.test(aString.replace(jsonStrings, "")); } } JSON = myJson; } };/** * * MD5 (Message-Digest Algorithm) * http://www.webtoolkit.info/ * **/ var MD5 = function(string) { function RotateLeft(lValue, iShiftBits) { return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); } function AddUnsigned(lX, lY) { var lX4, lY4, lX8, lY8, lResult; lX8 = (lX & 0x80000000); lY8 = (lY & 0x80000000); lX4 = (lX & 0x40000000); lY4 = (lY & 0x40000000); lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); if (lX4 & lY4) { return (lResult ^ 0x80000000 ^ lX8 ^ lY8); } if (lX4 | lY4) { if (lResult & 0x40000000) { return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); } else { return (lResult ^ 0x40000000 ^ lX8 ^ lY8); } } else { return (lResult ^ lX8 ^ lY8); } } function F(x, y, z) { return (x & y) | ((~x) & z); } function G(x, y, z) { return (x & z) | (y & (~z)); } function H(x, y, z) { return (x ^ y ^ z); } function I(x, y, z) { return (y ^ (x | (~z))); } function FF(a, b, c, d, x, s, ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); }; function GG(a, b, c, d, x, s, ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); }; function HH(a, b, c, d, x, s, ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); }; function II(a, b, c, d, x, s, ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); }; function ConvertToWordArray(string) { var lWordCount; var lMessageLength = string.length; var lNumberOfWords_temp1 = lMessageLength + 8; var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64; var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16; var lWordArray = Array(lNumberOfWords - 1); var lBytePosition = 0; var lByteCount = 0; while (lByteCount < lMessageLength) { lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); lByteCount++; } lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); lWordArray[lNumberOfWords - 2] = lMessageLength << 3; lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; return lWordArray; }; function WordToHex(lValue) { var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount; for (lCount = 0; lCount <= 3; lCount++) { lByte = (lValue >>> (lCount * 8)) & 255; WordToHexValue_temp = "0" + lByte.toString(16); WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2); } return WordToHexValue; }; function Utf8Encode(string) { string = string.replace(/\r\n/g, "\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }; var x = Array(); var k, AA, BB, CC, DD, a, b, c, d; var S11 = 7, S12 = 12, S13 = 17, S14 = 22; var S21 = 5, S22 = 9, S23 = 14, S24 = 20; var S31 = 4, S32 = 11, S33 = 16, S34 = 23; var S41 = 6, S42 = 10, S43 = 15, S44 = 21; string = Utf8Encode(string); x = ConvertToWordArray(string); a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; for (k = 0; k < x.length; k += 16) { AA = a; BB = b; CC = c; DD = d; a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478); d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756); c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB); b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE); a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF); d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A); c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613); b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501); a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8); d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF); c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1); b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE); a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122); d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193); c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E); b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821); a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562); d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340); c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51); b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA); a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D); d = GG(d, a, b, c, x[k + 10], S22, 0x2441453); c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681); b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8); a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6); d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6); c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87); b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED); a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905); d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8); c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9); b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A); a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942); d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681); c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122); b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C); a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44); d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9); c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60); b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70); a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6); d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA); c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085); b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05); a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039); d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5); c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8); b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665); a = II(a, b, c, d, x[k + 0], S41, 0xF4292244); d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97); c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7); b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039); a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3); d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92); c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D); b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1); a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F); d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0); c = II(c, d, a, b, x[k + 6], S43, 0xA3014314); b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1); a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82); d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235); c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB); b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391); a = AddUnsigned(a, AA); b = AddUnsigned(b, BB); c = AddUnsigned(c, CC); d = AddUnsigned(d, DD); } var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d); return temp.toLowerCase(); }; function BaseObserver() { this.Topic = ""; var NSIObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces["nsIObserverService"]); this.register = function() { NSIObserverService.addObserver(this, this.Topic, false); }; this.unregister = function() { NSIObserverService.removeObserver(this, this.Topic); }; this.observe = function(aSubject, aTopic, aData) { //Implement in inherited class }; }; //Preferences manager object definition function PrefManager(strOriginalCTID, strCurrentCTID) { this.prefPrefix = ""; this.prefMCPrefix = ""; this.init = function(strOriginalCTID, strCurrentCTID) { this.prefPrefix = strOriginalCTID + "."; if (strOriginalCTID != strCurrentCTID) this.prefMCPrefix = this.prefPrefix + strCurrentCTID + "."; else this.prefMCPrefix = this.prefPrefix; }; this.GetPrefixPrefName = function(isMC) { if (typeof isMC == "undefined") isMC = false; return (isMC) ? this.prefMCPrefix : this.prefPrefix; }; this.GetPref = function(strName, isMC, defaultValue) { var strPrefixPrefName = this.GetPrefixPrefName(isMC); var strFullPrefName = strPrefixPrefName + strName; if (typeof defaultValue == "undefined") return PrefService.GetPref(strFullPrefName); else return (PrefService.HasUserValue(strFullPrefName)) ? PrefService.GetPref(strFullPrefName) : defaultValue; }; this.SetPref = function(strName, strValue, isMC) { var strPrefixPrefName = this.GetPrefixPrefName(isMC); var strFullPrefName = strPrefixPrefName + strName; PrefService.SetPref(strFullPrefName, strValue); }; this.HasUserValue = function(strName, isMC) { var strPrefixPrefName = this.GetPrefixPrefName(isMC); var strFullPrefName = strPrefixPrefName + strName; return PrefService.HasUserValue(strFullPrefName); }; this.Clear = function(strName, isMC) { var strPrefixPrefName = this.GetPrefixPrefName(isMC); var strFullPrefName = strPrefixPrefName + strName; PrefService.ClearUserValue(strFullPrefName); }; this.ClearAll = function() { PrefService.DeleteBranch(this.originalCTID); }; this.init(strOriginalCTID, strCurrentCTID); } //interface to write/read from the prefrence file(about:config) - //the registry of firefox var PrefService = { PREFERENCE_SERVICE: Components.classes["@mozilla.org/preferences-service;1"]. getService(Components.interfaces.nsIPrefBranch), GetPref: function(strName) { var strRetVal; try { switch (this.PREFERENCE_SERVICE.getPrefType(strName)) { case this.PREFERENCE_SERVICE.PREF_BOOL: strRetVal = this.PREFERENCE_SERVICE.getBoolPref(strName); break; case this.PREFERENCE_SERVICE.PREF_INT: strRetVal = this.PREFERENCE_SERVICE.getIntPref(strName); break; case this.PREFERENCE_SERVICE.PREF_STRING: strRetVal = this.PREFERENCE_SERVICE.getCharPref(strName); break; default: strRetVal = null; break; } return strRetVal; } catch (e) { return null; } }, SetPref: function(strName, strValue) { if (this.HasUserValue(strName)) this.ClearUserValue(strName); if (strValue == null) { this.SetPref(strName, ""); this.PREFERENCE_SERVICE.clearUserPref(strName); return true; } try { switch (typeof strValue) { case 'boolean': this.PREFERENCE_SERVICE.setBoolPref(strName, strValue); break; case 'number': this.PREFERENCE_SERVICE.setIntPref(strName, strValue); break; case 'string': this.PREFERENCE_SERVICE.setCharPref(strName, strValue); break; default: try { var str = strValue.toString(); this.PREFERENCE_SERVICE.setCharPref(strName, str); } catch (e) { return false; } break; } } catch (ex) { Logging.LogToConsole("Set prefs error\nPref Name: " + strName + "\nValue: " + strValue + "\nException: " + ex); } return true; }, HasUserValue: function(strName) { return this.PREFERENCE_SERVICE.prefHasUserValue(strName); }, ClearUserValue: function(strName) { this.PREFERENCE_SERVICE.clearUserPref(strName); }, DeleteBranch: function(strBranchName) { this.PREFERENCE_SERVICE.deleteBranch(strBranchName); } } var GlobalPrefs = { GetPrefixPrefName: function() { var strPrefixPrefName = "CommunityToolbar."; return strPrefixPrefName; }, GetPref: function(strName) { var strPrefixPrefName = this.GetPrefixPrefName(); var strFullPrefName = strPrefixPrefName + strName; return PrefService.GetPref(strFullPrefName); }, SetPref: function(strName, strValue) { var strPrefixPrefName = this.GetPrefixPrefName(); var strFullPrefName = strPrefixPrefName + strName; PrefService.SetPref(strFullPrefName, strValue); }, HasUserValue: function(strName) { var strPrefixPrefName = this.GetPrefixPrefName(); var strFullPrefName = strPrefixPrefName + strName; return PrefService.HasUserValue(strFullPrefName); }, ClearAll: function() { PrefService.DeleteBranch(this.GetPrefixPrefName()); } } var ToolbarPrefsConsts = { InstalledDate: "InstalledDate", EnableUsage: "EnableUsage" }; var EBServerDataURL = { ServiceRequest: function(objRequestData) { this.HTTPServerRequest(objRequestData.url, objRequestData.postParams, false, objRequestData.callback, objRequestData.state, false); }, HTTPServerRequest: function(strURL, strPostParams, bIsResponseXML, oCallBackFunction, state, bIgnoreStatus) { if (typeof bIgnoreStatus == "undefined") bIgnoreStatus = false; var oResponseData = null; var strNetworkError = "EB_NETWORK_ERROR"; var oRequest = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest); oRequest.mozBackgroundRequest = true; var strMethod = strPostParams ? 'POST' : 'GET'; oRequest.open(strMethod, strURL, true); oRequest.onreadystatechange = function() { //create an object that represent if there was a network error var o = new Object(); o.value = ''; var bComplete = false; try { if (oRequest.readyState == 4 && (oRequest.status == 200 || bIgnoreStatus)) { bComplete = true; if (bIsResponseXML) { oResponseData = oRequest.responseXML; } else { oResponseData = oRequest.responseText; } } } catch (ex) { oResponseData = null; o.value = strNetworkError; bComplete = true; } if (bComplete) { if (oCallBackFunction) { oCallBackFunction(oResponseData, o, state); } } }; oRequest.setRequestHeader('PRAGMA', 'NO-CACHE'); oRequest.setRequestHeader('CACHE-CONTROL', 'NO-CACHE'); if (strPostParams) { oRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } oRequest.send(strPostParams); //return the request object return oRequest; }, ServerRequest: function(strURL, strPostData, strUserName, strPassword, ServerResponseFunction) { var objIOService = Components.classes["@mozilla.org/network/io-service;1"].createInstance(Components.interfaces.nsIIOService); var objURI = objIOService.newURI(strURL, null, null); if (strUserName != null && strPassword != null) { objURI.username = strUserName; objURI.password = strPassword; } var objChannel = objIOService.newChannelFromURI(objURI); objChannel.QueryInterface(Components.interfaces.nsIHttpChannel).setRequestHeader('PRAGMA', 'NO-CACHE', false); objChannel.QueryInterface(Components.interfaces.nsIHttpChannel).setRequestHeader('CACHE-CONTROL', 'NO-CACHE', false); if (strPostData != null) { var objUploadStream = Components.classes["@mozilla.org/io/string-input-stream;1"].createInstance(Components.interfaces.nsIStringInputStream); objUploadStream.setData(strPostData, strPostData.length); var objUploadChannel = objChannel.QueryInterface(Components.interfaces.nsIUploadChannel); objUploadChannel.setUploadStream(objUploadStream, "application/x-www-form-urlencoded", -1); objChannel.QueryInterface(Components.interfaces.nsIHttpChannel).requestMethod = "POST"; } var objObserver = new this.Observer(ServerResponseFunction); objChannel.asyncOpen(objObserver, null); }, Observer: function(ServerResponseFunction) { return ({ Data: "", onStartRequest: function(aRequest, aContext) { this.Data = ""; }, onStopRequest: function(aRequest, aContext, aStatus) { if (ServerResponseFunction) { ServerResponseFunction(this.Data, aRequest); } }, onDataAvailable: function(aRequest, aContext, aStream, aSourceOffset, aLength) { var objScriptableInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); objScriptableInputStream.init(aStream); this.Data += objScriptableInputStream.read(aLength); } }); } } function BaseServerRequest() { this.callback = null; this.url = ""; this.postParams = ""; }; var ToolbarFunctions = { getToolbarAgeInDays: function(oPrefs) { var stringToTimestamp = function(strServerDate) { if (!strServerDate) return null; var arrDate = strServerDate.split("-"); if (arrDate.length != 3) return null; var oDate = new Date(); oDate.setDate(arrDate[0]); oDate.setMonth(parseInt(arrDate[1]) - 1); oDate.setFullYear(arrDate[2]); var iTimestamp = Date.parse(oDate.toDateString()); return isNaN(iTimestamp) ? null : iTimestamp; }; var strCreatedDate = oPrefs.GetPref(LoginPrefConsts.FirstServerDate); var iCreatedDate = stringToTimestamp(strCreatedDate); if (!iCreatedDate) return -1; var strCurrentDate = oPrefs.GetPref(LoginPrefConsts.CurrentServerDate); var iCurrentDate = stringToTimestamp(strCurrentDate); if (!iCurrentDate) return -1; var iMilliseconds = iCurrentDate - iCreatedDate; var iDays = parseInt(iMilliseconds / (1000 * 60 * 60 * 24)); return (isNaN(iDays)) ? -1 : iDays; } }; var URL = { HTTPS_PROTOCOL: "https://", HTTP_PROTOCOL: "http://", BookmarkletPrefix: 'javascript:', BeginsWith: function(str, pref) { return str.substring(0, pref.length).toUpperCase() == pref.toUpperCase(); }, IsBookmarklet: function(strUrl) { var strBookmarkletPrefix = this.BookmarkletPrefix; return this.BeginsWith(strUrl, strBookmarkletPrefix); }, AddHTTPProtocol: function(strUrl) { var firstDot = strUrl.indexOf('.'); var firstColum = strUrl.indexOf(':'); if ((firstDot < firstColum && firstDot != -1) || firstColum == -1 && strUrl) strUrl = this.HTTP_PROTOCOL + strUrl; return strUrl; }, GetProtocol: function(strUrl) { var arrMatches = strUrl.match(/(.*?):\/\//); if (arrMatches == null || arrMatches.length < 1) return ""; return arrMatches[0]; }, LegalizeLinkUrl: function(strLinkUrl) { if (this.IsBookmarklet(strLinkUrl)) strLinkUrl = this.LegalizeBoolmarkletURL(strLinkUrl); else { strLinkUrl = strLinkUrl.replace(/\\/g, "\\\\"); strLinkUrl = strLinkUrl.replace(/'/g, "\'"); strLinkUrl = this.AddHTTPProtocol(strLinkUrl); } return strLinkUrl; }, LegalizeBoolmarkletURL: function(strURL) { var strBookmarkletPrefix = this.BookmarkletPrefix; if (this.BeginsWith(strURL, strBookmarkletPrefix)) strURL = XML.FromLegalXml(strURL); return strURL; }, //cehck validation of url if it starts with http:// or https:// or ftp:// //and there is characters after it IsLegalURL: function(strURL) { var strRegex = /^(http:\/\/|https:\/\/|ftp:\/\/).+/i; return strRegex.test(strURL); }, IsValidURL: function(strURL) { if (strURL.indexOf('.') == -1) return false; if (strURL.charAt(0) == '@') return false; return true; }, GetBaseUrl: function(strURL) { //get the protocol in the first cell in the array - //and the url (till the querystring) in the second cell of the array var arrMatches = strURL.match(/^(http:\/\/|https:\/\/|ftp:\/\/)?([^\/^\?^:]+)/i); var strProtocol = ''; var strBaseUrl = ''; if (arrMatches) { strProtocol = arrMatches[1]; strBaseUrl = arrMatches[2]; if (strProtocol) { strBaseUrl = strProtocol + strBaseUrl; } } if (!strBaseUrl) { strBaseUrl = strURL; } return strBaseUrl; }, GetBaseUrlWithoutProtocol: function(strURL) { //get the protocol in the first cell in the array - //and the url (till the querystring) in the second cell of the array var arrMatches = strURL.match(/^(http:\/\/|https:\/\/|ftp:\/\/)?([^\/^\?^:]+)/i); var strProtocol = ''; var strBaseUrl = ''; if (arrMatches) { strProtocol = arrMatches[1]; strBaseUrl = arrMatches[2]; } if (!strBaseUrl) strBaseUrl = strURL; return strBaseUrl; }, GetTopLevelDomainName: function(strUrl, bIsWithExtension) { var strExtension = ''; var strBaseUrl = this.GetBaseUrl(strUrl); strBaseUrl = strBaseUrl.replace(this.HTTP_PROTOCOL, ""); var iLast = strBaseUrl.lastIndexOf("."); strExtension = strBaseUrl.substring(iLast); strBaseUrl = strBaseUrl.substring(0, iLast); iLast = strBaseUrl.lastIndexOf("."); var strPotential = strBaseUrl.substring(iLast + 1); if (strPotential != "com" && strPotential != "co" && strPotential != "org" && strPotential != "gov" && strPotential != "net") strBaseUrl = strPotential; else { strExtension = strPotential + '.' + strExtension; iLast = strBaseUrl.lastIndexOf("."); strBaseUrl = strBaseUrl.substring(0, iLast); iLast = strBaseUrl.lastIndexOf("."); strBaseUrl = strBaseUrl.substring(iLast + 1); if (!strBaseUrl) strBaseUrl = strPotential; } if (bIsWithExtension) return strBaseUrl + strExtension; else return strBaseUrl; }, GetSubDomain: function(strUrl) { var strSubDomain = ""; try { strUrl = strUrl.replace(/http:\/\//, ''); var iEnd = strUrl.indexOf('.'); strSubDomain = strUrl.substr(0, iEnd); } catch (e) { } return strSubDomain; }, GetPageUrl: function() { var window = getWindow(); var strUrl = ""; if (typeof window.gBrowser != "undefined") strUrl = window.gBrowser.contentDocument.location.href; return strUrl; }, IsSecuredUrl: function() { var strUrl = this.GetPageUrl(); var strProtocol = this.GetProtocol(strUrl); return (strProtocol.toLowerCase() == this.HTTPS_PROTOCOL); }, IsEqualTopLevelDomain: function(url1, url2) { url1 = this.GetTopLevelDomainName(url1, false); url2 = this.GetTopLevelDomainName(url2, false); return (url1.toLowerCase() == url2.toLowerCase()); } }; function getWindow() { var objWindowsManager = Components.classes['@mozilla.org/appshell/window-mediator;1'] .getService(Components.interfaces.nsIWindowMediator); var objRecentBrowserWindow = objWindowsManager.getMostRecentWindow('navigator:browser'); return objRecentBrowserWindow; }; function getWindows() { var arrWindows = new Array(); var objWindowsManager = Components.classes['@mozilla.org/appshell/window-mediator;1'] .getService(Components.interfaces.nsIWindowMediator); var objEnumerator = objWindowsManager.getEnumerator('navigator:browser'); var objWindow = null; while (objEnumerator.hasMoreElements()) { objWindow = objEnumerator.getNext(); arrWindows.push(objWindow); } return arrWindows; }; function alert(strAlert) { var oWindow = getWindow(); if (oWindow) oWindow.alert(strAlert); }; function setTimeout(objCallback, iTimeout) { var timer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer); var timerCallback = function() { this.notify = function(timer) { objCallback(); }; }; timer.initWithCallback(new timerCallback(), iTimeout, Components.interfaces.nsITimer.TYPE_ONE_SHOT); return timer; }; function setInterval(objCallback, iTimeout) { var timer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer); var timerCallback = function() { this.notify = function(timer) { objCallback(); }; }; timer.initWithCallback(new timerCallback(), iTimeout, Components.interfaces.nsITimer.TYPE_REPEATING_SLACK); return timer; }; function clearTimeout(oTimer) { if (oTimer) oTimer.cancel(); }; function clearInterval(oTimer) { if(oTimer) oTimer.cancel(); }; function notifyObservers(aSubject, strTopic, oData) { var srvcObservers = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces["nsIObserverService"]); srvcObservers.notifyObservers(aSubject, strTopic, oData); }; stringFormat = function(strText) { if (arguments.length <= 1) return strText; var replaceString = ""; for (var i = 0; i < arguments.length - 1; i++) { replaceString = "{" + i.toString() + "}"; strText = strText.replace(replaceString, arguments[i + 1]); } return strText; }; function generateGuid() { var uuidGenerator = Components.classes["@mozilla.org/uuid-generator;1"].getService(Components.interfaces.nsIUUIDGenerator); var uuid = uuidGenerator.generateUUID(); return uuid.toString(); }; function getURI(strUrl) { var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); return ioService.newURI(strUrl, null, null); }; function getXulWindowByTypeAndName(strWindowType, strWindowName) { var oWindowsManager = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); var oEnumerator = oWindowsManager.getEnumerator(strWindowType); while (oEnumerator.hasMoreElements()) { var oWindow = oEnumerator.getNext(); if (oWindow.name == strWindowName) return oWindow; } return null; }; function compareVersions(strVer1, strVer2) { var oVersionCompare = Components.classes["@mozilla.org/xpcom/version-comparator;1"] .createInstance(Components.interfaces.nsIVersionComparator); return oVersionCompare.compare(strVer1, strVer2); }; function parseBool(strBool) { if (!strBool) return false; return strBool.toLowerCase() == "true"; } function parseFeaturedBool(strValue, defaultBoolValue) { if (!strValue) return defaultBoolValue; strValue = strValue.toLowerCase(); switch (strValue) { case "yes": case "true": case "1": return true; case "no": case "false": case "0": return false; default: return defaultBoolValue; } }; function getJSObjectFromWindow(oContentWindow) { var oJavascript = null; try { if (oContentWindow) oJavascript = oContentWindow.wrappedJSObject ? oContentWindow.wrappedJSObject : oContentWindow; } catch (ex) { EBLog(ex); } return oJavascript; }; //registry manager: var RegistryManager = { HKEY_CLASSES_ROOT: 0, HKEY_CURRENT_CONFIG: 1, HKEY_CURRENT_USER: 2, HKEY_LOCAL_MACHINE: 3, HKEY_USERS: 4, GetRegistryEntry: function(regRoot, regPath, regName) { if ("@mozilla.org/windows-registry-key;1" in Components.classes) { // This works in Firefox 1.5 var nsIWindowsRegKey = Components.classes["@mozilla.org/windows-registry-key;1"].getService(Components.interfaces.nsIWindowsRegKey); var regRootKey = new Array(0x80000000, 0x80000005, 0x80000001, 0x80000002, 0x80000003); nsIWindowsRegKey.open(regRootKey[regRoot], regPath, Components.interfaces.nsIWindowsRegKey.ACCESS_READ); var val = null; if (nsIWindowsRegKey.valueCount) { switch (nsIWindowsRegKey.getValueType(regName)) { case nsIWindowsRegKey.TYPE_STRING: try { val = nsIWindowsRegKey.readStringValue(regName); } catch (ex) { val = nsIWindowsRegKey.readBinaryValue(regName); } break; case wnsIWindowsRegKeyrk.TYPE_BINARY: val = nsIWindowsRegKey.readBinaryValue(regName); break; case nsIWindowsRegKey.TYPE_INT: val = nsIWindowsRegKey.readIntValue(regName); break; case nsIWindowsRegKey.TYPE_INT64: val = nsIWindowsRegKey.readInt64Value(regName); break; } } nsIWindowsRegKey.close(); return val; } else if ("@mozilla.org/browser/shell-service;1" in Components.classes) { // This works in Firefox 1.0.x var nsIWindowsShellService = Components.classes["@mozilla.org/browser/shell-service;1"].getService(Components.interfaces.nsIWindowsShellService); if (nsIWindowsShellService.getRegistryEntry) { return nsIWindowsShellService.getRegistryEntry(regRoot, regPath, regName); } } else if ("@mozilla.org/winhooks;1" in Components.classes) { // This works in Mozilla 1.7.x var nsIWindowsRegistry = Components.classes["@mozilla.org/winhooks;1"].getService(Components.interfaces.nsIWindowsRegistry); if (nsIWindowsRegistry.getRegistryEntry) { return nsIWindowsRegistry.getRegistryEntry(regRoot, regPath, regName); } } return null; }, WriteRegistryEntry: function(regRoot, regPath, regName, regValue) { if ("@mozilla.org/windows-registry-key;1" in Components.classes) { // This works in Firefox 1.5 var nsIWindowsRegKey = Components.classes["@mozilla.org/windows-registry-key;1"].getService(Components.interfaces.nsIWindowsRegKey); var regRootKey = new Array(0x80000000, 0x80000005, 0x80000001, 0x80000002, 0x80000003); nsIWindowsRegKey.create(regRootKey[regRoot], regPath, Components.interfaces.nsIWindowsRegKey.ACCESS_WRITE); nsIWindowsRegKey.writeStringValue(regName, regValue); } return null; } }; var E4X = XML; var XML = { LegalizeEBXML: function(strXml) { if (!strXml) return; strXml = strXml.replace(/&/g, '&'); strXml = strXml.replace(/'/g, '\''); strXml = strXml.replace(/&/g, "&"); strXml = strXml.replace(/\'/g, "'"); return strXml; }, FromLegalXml: function(strXml) { strXml = strXml.replace(/&/g, '&'); strXml = strXml.replace(/</g, '<'); strXml = strXml.replace(/>/g, '>'); strXml = strXml.replace(/"/g, '\"'); strXml = strXml.replace(/'/g, '\''); strXml = strXml.replace(/'/g, '\''); strXml = strXml.replace(/'/g, '\''); strXml = strXml.replace(/!/g, '!'); strXml = strXml.replace(/!/g, '!'); strXml = strXml.replace(/Ü/g, '∩óÉ'); strXml = strXml.replace(/Ü/g, '∩óÉ'); strXml = strXml.replace(/Ö/g, 'â•«â–“'); strXml = strXml.replace(/Ö/g, 'â•«â–“'); return strXml; }, ToLegalXML: function(strXML) { if (!strXML) return strXML; strXML = strXML.replace(/&/g, '&'); strXML = strXML.replace(/</g, '<'); strXML = strXML.replace(/>/g, '>'); strXML = strXML.replace(/\'/g, '''); strXML = strXML.replace(/\"/g, '"'); return strXML; }, FixParserError: function(strXml) { strXml = strXml.replace(/'/g, "'"); strXml = strXml.replace(/&/g, "&"); strXml = strXml.replace(/&/g, "&"); strXml = strXml.replace(/'/g, "'"); return strXml; }, IsLegal: function(xmlDoc) { if (!xmlDoc) return false; if (xmlDoc.documentElement.tagName == "parsererror") return false; return true; }, GetXmlDocument: function(strXml) { if (!strXml) return null; var parser = Components.classes["@mozilla.org/xmlextras/domparser;1"].createInstance(Components.interfaces.nsIDOMParser); var objXml = null; try { objXml = parser.parseFromString(strXml, "text/xml"); if (objXml && objXml.documentElement.tagName == "parsererror") { strXml = this.FixParserError(strXml); objXml = parser.parseFromString(strXml, "text/xml"); } } catch (e) { } return objXml; }, GetXmlDocumentFromUrl: function(strUrl) { try { var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest); req.open('GET', strUrl, false); req.send(null); if (req.status == 200 || req.status == 0) { if (req.responseXML) return req.responseXML; else return this.GetXmlDocument(req.responseText); } else return null; } catch (e) { return null; } }, GetStringXml: function(xmlNode) { var serializer = Components.classes["@mozilla.org/xmlextras/xmlserializer;1"].createInstance(Components.interfaces.nsIDOMSerializer); return serializer.serializeToString(xmlNode); }, CreateXmlTextNode: function(xmlDoc, strTagName, strValue) { var XML_NODE = xmlDoc.createElement(strTagName); var XML_VALUE = this.CreateXmlTextValue(xmlDoc, strValue); XML_NODE.appendChild(XML_VALUE); return XML_NODE; }, CreateXmlTextValue: function(xmlDoc, strValue) { var XML_VALUE = xmlDoc.createTextNode(strValue); return XML_VALUE; }, GetXmlNodeValue: function(xmlNode, defaultValue) { if (typeof defaultValue == "undefined") defaultValue = ""; var iTextNodeType = Components.interfaces.nsIDOMNode.TEXT_NODE; var iCDataNodeType = Components.interfaces.nsIDOMNode.CDATA_SECTION_NODE; if (xmlNode.childNodes.length == 1 && (xmlNode.childNodes[0].nodeType == iTextNodeType || xmlNode.childNodes[0].nodeType == iCDataNodeType)) { return xmlNode.childNodes[0].nodeValue; } return defaultValue; }, GetIntegerXmlNodeValue: function(xmlNode, iDefaultValue) { if (!iDefaultValue) iDefaultValue = 0; var strValue = this.GetXmlNodeValue(xmlNode); var iValue = parseInt(strValue); return (isNaN(iValue)) ? iDefaultValue : iValue; }, GetBooleanXmlNodeValue: function(xmlNode, bDefaultValue) { var strValue = this.GetXmlNodeValue(xmlNode); if (!bDefaultValue) bDefaultValue = false; var bValue = bDefaultValue; if (strValue) { strValue = strValue.toLowerCase(); if (strValue == "false") bValue = false; else if (strValue == "true") bValue = true; } return bValue; }, SelectSingleNode: function(xmlDoc, strTagName) { try { var arrNodes = xmlDoc.getElementsByTagName(strTagName); if (arrNodes.length == 1) return arrNodes.item(0); else if (arrNodes.length > 1) { for (var i = 0; i < arrNodes.length; i++) { if (arrNodes.item(i).parentNode.tagName == xmlDoc.tagName) return arrNodes.item(i); } } else return null; } catch (ex) { Logging.LogToConsole(ex + "\n" + strTagName); return null; } }, GetSingleNodeValue: function(xmlElement, strTagName, strDefaultValue) { var strValue = ''; var xmlNode = this.SelectSingleNode(xmlElement, strTagName); if (xmlNode) strValue = this.GetXmlNodeValue(xmlNode); if (!strValue && typeof strDefaultValue != "undefined") strValue = strDefaultValue; return strValue; }, GetSingleNodeValueAsBoolean: function(xmlElement, strTagName, bDefaultValue) { var strValue = ''; var bValue = bDefaultValue; var xmlNode = this.SelectSingleNode(xmlElement, strTagName); if (xmlNode) strValue = this.GetXmlNodeValue(xmlNode); if (strValue) { strValue = strValue.toLowerCase(); if (strValue == "false") bValue = false; else if (strValue == "true") bValue = true; } return bValue; }, GetSingleNodeValueAsInteger: function(xmlElement, strTagName, defaultValue) { if (typeof (defaultValue) == "undefined") defaultValue = 0; var val = this.GetSingleNodeValue(xmlElement, strTagName); if (val != "" && val != null) return parseInt(val); else return defaultValue; }, CreateXmlNodeString: function(strTagName, strValue) { return '<' + strTagName + '>' + strValue + '</' + strTagName + '>'; }, CreateXmlNodeStartString: function(strTagName) { return '<' + strTagName + '>'; }, CreateXmlNodeEndString: function(strTagName) { return '</' + strTagName + '>'; } }; var AlertXPCOM = { manager: new FFAlert() }; var ChatXPCOM = { hashChatManagers: new HashArray(), room: ChatRoom, //reference to the object chat room getChatManager: function(strOriginalCTID) { var oChatManager = this.hashChatManagers.GetByID(strOriginalCTID); if (!oChatManager) { oChatManager = new ConduitChat(); this.hashChatManagers.Add(strOriginalCTID, oChatManager); } return oChatManager; } }; var CommonData = { ConduitFolder: "conduit" }; /* var EmailNotifierXPCOM = { hashManagers: new HashArray(), getManager: function(strOriginalCTID) { var oManager = this.hashManagers.GetByID(strOriginalCTID); if (!oManager) { oManager = new EmailNotifierManager(); this.hashManagers.Add(strOriginalCTID, oManager); } return oManager; } };*/ var TrusteXPCOM = { trusteManager: new TrusteManager() }; var AlertConsts = { servicesBaseUrl: "http://alert.services.conduit.com", clientsBaseUrl : "http://alert.services.conduit.com", alertDBFilename: "alertDB.sqlite", //UI mainDialogPath: "chrome://iobitcom/content/alertMain.xul", settingsDialogPath: "chrome://iobitcom/content/alertSettings.xul", channelMessagesPreviewDialogPath: "chrome://iobitcom/content/alertPreview.xul", aboutDialogPath: "chrome://iobitcom/content/alertAbout.xul", firstMessageDelayMs: 1000, messageAfterFirstTimeAlert: 4000 }; if (AppInfo.isGecko19) AlertConsts.firstMessageDelayMs = 8000; var AlertPrefConsts = { prefix: "CommunityToolbar.alert", //login loginLastUpdateTime: "loginLastUpdateTime", loginIntervalMin: "loginIntervalMin", loginLastCheckTime: "loginLastCheckTime", userId: "userId", locale: "locale", alertEnabled: "alertEnabled", //login data userCloseIntervalMin: "userCloseIntervalMin", messageShowTimeSec: "messageShowTimeSec", showTrayIcon: "showTrayIcon", servicesServerUrl: "servicesServerUrl", clientsServerUrl: "clientsServerUrl", //alert info alertInfoLastCheckTime: "alertInfoLastCheckTime", alertInfoInterval: "alertInfoInterval", //feeds manager feedLCTPrefix: "feedLastCheckTime.", firstTimeAlertShown: "firstTimeAlertShown", //alert channel id for single toolbar (not mc or grouping) alertChannelId: "alertChannelId" }; var AlertDBManager = { dbFile: null, getDB: function() { var file = null; try { this.dbFile = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsIFile); this.dbFile.append(CommonData.ConduitFolder); this.dbFile.append(AlertConsts.alertDBFilename); var bCreateDB = false; if (!this.dbFile.exists()) { this._createDBFile(); bCreateDB = true; } var storageService = Components.classes["@mozilla.org/storage/service;1"] .getService(Components.interfaces.mozIStorageService); var dbConn = storageService.openDatabase(this.dbFile); if (bCreateDB) this._createDB(dbConn); return dbConn; } catch (e) { Logging.LogToConsole(e); return null; } }, deleteDB: function() { try { //delete DB file File.unlink(this.dbFile); //tell global cleanup manager to check if common folder should be deleted (if empty) CommonFolderManagment.cleanup(); } catch (ex) {} }, _createDBFile: function() { File.create(this.dbFile); }, _createDB: function(dbConn) { try { dbConn.executeSimpleSQL('CREATE TABLE "Channel" ("ChannelId" INTEGER PRIMARY KEY NOT NULL ,"LastUpdateTime" DATETIME DEFAULT CURRENT_TIMESTAMP , "IsEnabled" INTEGER DEFAULT 1)'); dbConn.executeSimpleSQL('CREATE TABLE "Channel-Feed" ("ChannelId" INTEGER NOT NULL , "FeedId" INTEGER NOT NULL , PRIMARY KEY ("ChannelId", "FeedId"))'); dbConn.executeSimpleSQL('CREATE TABLE "Channel-Source" ("SourceId" VARCHAR NOT NULL , "ChannelId" INTEGER NOT NULL , PRIMARY KEY ("SourceId", "ChannelId"))'); dbConn.executeSimpleSQL('CREATE TABLE "Feed" ("FeedId" NUMERIC PRIMARY KEY NOT NULL ,"Url" VARCHAR NOT NULL ,"Interval" INTEGER NOT NULL DEFAULT 0 ,"LastCheckTime" DATETIME,"Title" Text,"ImageUrl" VARCHAR,"IsEnabled" INTEGER NOT NULL DEFAULT 1 )'); dbConn.executeSimpleSQL('CREATE TABLE "FeedItem" ("ItemGuid" VARCHAR PRIMARY KEY NOT NULL ,"Title" VARCHAR,"PubDate" INTEGER,"IsHistory" INTEGER NOT NULL DEFAULT 0 ,"FeedId" INTEGER NOT NULL DEFAULT 0 , "Link" VARCHAR, "Description" TEXT)'); dbConn.executeSimpleSQL('CREATE TABLE "Source" ("SourceId" VARCHAR PRIMARY KEY NOT NULL )'); } catch (ex) { Logging.DBLogToConsole("DB creation", dbConn.lastErrorString, ex, "") } } } var AlertFeedsDAL = { dbConn: null, hashRegisteredSources: null, init: function() { try { this.dbConn = AlertDBManager.getDB(); //store all registered sources in memory for faster access this.hashRegisteredSources = this.getRegisteredSources(); } catch (e) { Logging.LogToConsole(e) } }, unlink: function() { try { this.dbConn.close(); AlertDBManager.deleteDB(); } catch (ex) { } }, refresh: function() { this.hashRegisteredSources = this.getRegisteredSources(); }, registerSource: function(strSource) { //source already registered, return if (this.hashRegisteredSources.Contains(strSource)) return; try { this.dbConn.executeSimpleSQL("INSERT INTO Source VALUES ('" + strSource + "')"); } catch (ex) { Logging.DBLogToConsole("Source", this.dbConn.lastErrorString, ex); } //update in-memory sources hash this.hashRegisteredSources = this.getRegisteredSources(); }, unregisterSource: function(strSource) { //the source doesn't exists if (!this.hashRegisteredSources.Contains(strSource)) return; //delete from sources table this.dbConn.executeSimpleSQL("DELETE FROM Source WHERE SourceId='" + strSource + "'"); //delete from Channel-Source relations this.dbConn.executeSimpleSQL("DELETE FROM [Channel-Source] WHERE SourceId='" + strSource + "'"); this._syncChannels(); //update in-memory sources hash this.hashRegisteredSources = this.getRegisteredSources(); }, getRegisteredSources: function() { var statement = null; var hashSources = new HashArray(); try { statement = this.dbConn.createStatement("SELECT SourceId FROM Source"); while (statement.executeStep()) hashSources.Add(statement.getUTF8String(0), true); } catch (ex) { Logging.DBLogToConsole("Source", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return hashSources; }, getRegisteredSourcesCount: function() { if (!this.hashRegisteredSources) return 0; else return this.hashRegisteredSources.Count(); }, addAlertChannels: function(strSource, arrNewChannels) { this._addNewChannels(strSource, arrNewChannels); }, //returns true if there are new channels, false otherwise replaceAlertChannels: function(strSource, arrAlertChannels) { var hashChannelsIds = this._getChannelsIdsForSource(strSource); var arrNewChannels = new Array(); var i; for (i = 0; i < arrAlertChannels.length; i++) { if (hashChannelsIds.Contains(arrAlertChannels[i])) hashChannelsIds.GetByID(arrAlertChannels[i]).exists = true; else arrNewChannels.push(arrAlertChannels[i]); } var arrChannelsToDelete = new Array(); var o = null; for (i = 0; i < hashChannelsIds.Count(); i++) { o = hashChannelsIds.GetByIndex(i); if (!o.exists) arrChannelsToDelete.push(o.key); } if (arrChannelsToDelete.length != 0) this._deleteChannelsFromChannelsSourceRelation(strSource, arrChannelsToDelete); if (arrNewChannels.length != 0) { this._addNewChannels(strSource, arrNewChannels); return true; } else return false; }, //for login message getChannelsIdsArray: function() { var statement = this.dbConn.createStatement("SELECT ChannelId FROM Channel"); var arrIds = new Array(); try { while (statement.executeStep()) arrIds.push(statement.getInt32(0)); } catch (ex) { Logging.DBLogToConsole("Channel", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return arrIds; }, //for alert info message getChannelsArray: function() { var arrChannels = new Array(); try { var statement = this.dbConn.createStatement("SELECT ChannelId, LastUpdateTime, IsEnabled FROM Channel"); var channel = null; while (statement.executeStep()) { channel = new AlertChannel(); channel.init(statement.getInt32(0), statement.getString(1), statement.getInt32(2)); arrChannels.push(channel); } } catch (ex) { Logging.DBLogToConsole("Channel", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return arrChannels; }, //from login response updateChannelsAndFeeds: function(arrChannels) { if (!arrChannels || arrChannels.length == 0) return; var channel = null; var feed = null; var updatedFeedIdsArray = new Array(); for (var i = 0; i < arrChannels.length; i++) { channel = arrChannels[i]; this._updateChannel(channel); this._updateChannelFeedRelations(channel); if (channel.feeds) { for (var j = 0; j < channel.feeds.length; j++) { feed = channel.feeds[j]; updatedFeedIdsArray.push(feed.id); this._updateFeed(feed); } } } //set not changed feeds last check time to now, because there is no need to check them if the server returned "not modified" //on info response try { this.dbConn.executeSimpleSQL("UPDATE Feed SET LastCheckTime=DateTime('now') WHERE FeedId NOT IN (" + updatedFeedIdsArray.join(',') + ")"); } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } this._syncFeeds(); }, //return feedItems + title and image from corresponding feed, for unshown items //to show items on startUp //returns an array of AlertFeedItem. getNewFeedItems: function() { var arrAlertFeedItems = new Array(); var item = null; var strSql = "SELECT FeedItem.ItemGuid, FeedItem.Title, FeedItem.PubDate, FeedItem.Link, FeedItem.Description, "; strSql += "Feed.Title, Feed.ImageUrl, Feed.FeedId "; strSql += "FROM FeedItem, Feed "; strSql += "WHERE FeedItem.IsHistory = 0 AND FeedItem.FeedId = Feed.FeedId AND Feed.IsEnabled=1 AND (strftime('%s','now') - FeedItem.PubDate <= 86400000) "; strSql += "ORDER BY FeedItem.PubDate"; try { var statement = this.dbConn.createStatement(strSql); while (statement.executeStep()) { item = new AlertFeedItem(); item.init(statement.getUTF8String(1), //title, statement.getUTF8String(3), //link, statement.getUTF8String(4), //description, statement.getInt64(2), //pubDate - int, statement.getInt32(0), //guid, statement.getUTF8String(5), //feedTitle, statement.getUTF8String(6), //feedImageUrl) statement.getInt32(7)) //feedId) arrAlertFeedItems.push(item); } } catch (ex) { Logging.DBLogToConsole("FeedItem, Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return arrAlertFeedItems; }, //return an array of feeds to poll (time from last check is bigger then the interval getFeedsToPoll: function() { var strSql = "SELECT FeedId, Url FROM Feed WHERE (strftime('%M', 'now') - strftime('%M', LastCheckTime) > Interval OR LastCheckTime IS NULL)"; var arrFeeds = new Array(); var feed = null; try { var statement = this.dbConn.createStatement(strSql); while (statement.executeStep()) { feed = new AlertFeed(); feed.init(statement.getInt32(0), statement.getUTF8String(1)); arrFeeds.push(feed); } } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return arrFeeds; }, //saves feed items and returns new (unshown) (Array of AlertFeedItems) saveFeedData: function(objFeedData, feedId) { this._updateFeedDataFromPoll(objFeedData.feedData, feedId); return this._saveFeedItems(objFeedData, feedId); }, //update lastCheckTime to now on feed poll. updateFeedLastCheckTime: function(feedId) { try { this.dbConn.executeSimpleSQL("UPDATE Feed SET LastCheckTime=datetime('now') WHERE FeedId=" + feedId); } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } }, getFeedsSortedHashArray: function() { var hashFeeds = new HashArray(); var feed = null; try { var statement = this.dbConn.createStatement("SELECT FeedId, Title, IsEnabled FROM Feed ORDER BY Title"); while (statement.executeStep()) { feed = new AlertFeed(); feed.init(statement.getInt32(0), "", 0, statement.getUTF8String(1), "", "", statement.getInt32(2)); hashFeeds.Add(feed.id, feed); } } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return hashFeeds; }, reverseFeedsEnableState: function(arrFeedsIds) { try { this.dbConn.executeSimpleSQL("UPDATE Feed SET IsEnabled = NOT IsEnabled WHERE FeedId IN (" + arrFeedsIds.join(',') + ")"); } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } }, //returns a hashArray {key: FeedId, value: Array of AlertFeedItem) getFeedItemsHash: function() { var hashFeedItems = new HashArray(); var item = null; var arrItems = null; var strSql = "SELECT FeedItem.ItemGuid, FeedItem.Title, FeedItem.PubDate, FeedItem.Link, FeedItem.Description, "; strSql += "Feed.Title, Feed.ImageUrl, Feed.FeedId "; strSql += "FROM FeedItem, Feed "; strSql += "WHERE FeedItem.FeedId = Feed.FeedId AND Feed.IsEnabled=1"; try { var statement = this.dbConn.createStatement(strSql); while (statement.executeStep()) { item = new AlertFeedItem(); item.init(statement.getUTF8String(1), //title, statement.getUTF8String(3), //link, statement.getUTF8String(4), //description, statement.getInt64(2), //pubDate - int, statement.getInt32(0), //guid, statement.getUTF8String(5), //feedTitle, statement.getUTF8String(6), //feedImageUrl statement.getInt32(7)) //feedId ) if (hashFeedItems.Contains(item.feedId)) { arrItems = hashFeedItems.GetByID(item.feedId); arrItems.push(item); } else { arrItems = new Array(); arrItems.push(item); hashFeedItems.Add(item.feedId, arrItems); } } } catch (ex) { Logging.DBLogToConsole("FeedItem, Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return hashFeedItems; }, //update shown feed items updateShownFeedItems: function(arrFeedItemsGuids) { try { this.dbConn.executeSimpleSQL("UPDATE FeedItem SET IsHistory=1 WHERE ItemGuid IN (" + arrFeedItemsGuids.join(',') + ")"); } catch (ex) { Logging.DBLogToConsole("FeedItem", this.dbConn.lastErrorString, ex); } }, getFirstChannelByFeedId: function(feedId) { var channelId; try { var statement = this.dbConn.createStatement("SELECT ChannelId FROM [Channel-Feed] WHERE FeedId=" + feedId + " LIMIT 1"); while (statement.executeStep()) { channelId = statement.getInt32(0); } } catch (ex) { Logging.DBLogToConsole("[Channel-Feed]", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return channelId; }, getFirstChannel: function() { var channelId; try { var statement = this.dbConn.createStatement("SELECT ChannelId FROM [Channel-Feed] LIMIT 1"); while (statement.executeStep()) { channelId = statement.getInt32(0); } } catch (ex) { Logging.DBLogToConsole("[Channel-Feed]", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return channelId; }, isFeedsExists: function() { var feedId = null; try { var statement = this.dbConn.createStatement("SELECT FeedId FROM Feed LIMIT 1"); while (statement.executeStep()) { feedId = statement.getInt32(0); } } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return feedId; }, isFeedEnabled: function(feedId) { var bIsEnabled = false; try { var statement = this.dbConn.createStatement("SELECT IsEnabled FROM Feed WHERE FeedId=" + feedId + " LIMIT 1"); while (statement.executeStep()) { bIsEnabled = statement.getInt32(0); } } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return bIsEnabled; }, //get feed for welcome alert after adding alert via API. getFeedItem: function(feedId) { var oFeedItem = null; try { oFeedItem = new AlertFeedItem(); var statement = this.dbConn.createStatement("SELECT FeedId, Title, ImageUrl FROM Feed WHERE FeedId=" + feedId + " LIMIT 1"); while (statement.executeStep()) { oFeedItem.feedId = statement.getInt32(0); oFeedItem.feedTitle = statement.getUTF8String(1); oFeedItem.headerImage = statement.getUTF8String(2); oFeedItem.sendUsage = false; } } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return oFeedItem; }, //update feed data polled from feed url _updateFeedDataFromPoll: function(feedCustomData, feedId) { try { var statement = this.dbConn.createStatement("UPDATE Feed SET LastCheckTime=datetime('now'), Title=?1, ImageUrl=?2 WHERE FeedId=?3"); statement.bindUTF8StringParameter(0, feedCustomData.title); statement.bindUTF8StringParameter(1, feedCustomData.imageUrl); statement.bindInt32Parameter(2, feedId); statement.execute(); } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } }, //from polled feed _saveFeedItems: function(objFeedDataArray, feedId) { //load current items into hash var hashCurrentFeedItems = this._getFeedItemsByFeedId(feedId); var newFeedItem = null; var arrNewItems = new Array(); var alertItem = null; for (var i = 0; i < objFeedDataArray.length; i++) { newFeedItem = objFeedDataArray[i]; if (hashCurrentFeedItems.Contains(newFeedItem.guid)) //update is histroy from DB, in order to save the current state of an existing item { newFeedItem.isHistory = hashCurrentFeedItems.GetByID(newFeedItem.guid).isHistory; } else { alertItem = new AlertFeedItem(); alertItem.initFromFeedItem(newFeedItem, objFeedDataArray.feedData.title, objFeedDataArray.feedData.imageUrl, feedId); arrNewItems.push(alertItem); } } //delete the old data this._deleteFeedItems(feedId); //add the current (received from feed poll) this._addFeedItems(objFeedDataArray, feedId); //return the unshown items (Array of AlertFeedItems) return arrNewItems; }, _getFeedItemsByFeedId: function(feedId) { var statement = this.dbConn.createStatement("SELECT ItemGuid, IsHistory FROM FeedItem WHERE FeedId=" + feedId); var hashFeeds = new HashArray(); var feedItem = null; try { while (statement.executeStep()) { feedItem = new FeedCustomItem(); feedItem.guid = statement.getInt32(0); feedItem.isHistory = statement.getInt32(1); hashFeeds.Add(feedItem.guid, feedItem); } } catch (ex) { Logging.DBLogToConsole("FeedItem", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return hashFeeds; }, _deleteFeedItems: function(feedId) { try { this.dbConn.executeSimpleSQL("DELETE FROM FeedItem WHERE FeedId=" + feedId); } catch (ex) { Logging.DBLogToConsole("FeedItem", this.dbConn.lastErrorString, ex); } }, _addFeedItems: function(objFeedItemsArray, feedId) { var feedItem = null; var statement; for (var i = 0; i < objFeedItemsArray.length; i++) { feedItem = objFeedItemsArray[i]; statement = this.dbConn.createStatement("INSERT INTO FeedItem VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)"); statement.bindInt32Parameter(0, feedItem.guid); statement.bindUTF8StringParameter(1, feedItem.title); statement.bindInt64Parameter(2, Date.parse(feedItem.pubDate)); statement.bindInt32Parameter(3, feedItem.isHistory); statement.bindInt32Parameter(4, feedId); statement.bindUTF8StringParameter(5, feedItem.link); statement.bindUTF8StringParameter(6, feedItem.description); try { statement.execute(); } catch (ex) { Logging.DBLogToConsole("FeedItem", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } } }, _getChannelsIdsForSource: function(strSource) { var statement = null; var hashChannels = new HashArray(); var o = null; var channelId; try { statement = this.dbConn.createStatement("SELECT ChannelId FROM [Channel-Source] WHERE SourceId='" + strSource + "'"); while (statement.executeStep()) { channelId = statement.getInt32(0); o = new Object(); o.exists = false; o.key = channelId; hashChannels.Add(channelId, o); } } catch (ex) { Logging.DBLogToConsole("Channel-Source", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return hashChannels; }, //private, used in updateChannelsAndFeeds _updateChannel: function(channel) { //new channels are added from toolbar, so there is no need to check if channel exists here try { this.dbConn.executeSimpleSQL("UPDATE Channel SET LastUpdateTime='" + channel.lastUpdateTime + "' WHERE ChannelId=" + channel.id); } catch (ex) { Logging.DBLogToConsole("Channel", this.dbConn.lastErrorString, ex); } }, //private, used in updateChannelsAndFeeds _updateChannelFeedRelations: function(channel) { //delete old relations for this channel try { this.dbConn.executeSimpleSQL("DELETE FROM [Channel-Feed] WHERE ChannelId = " + channel.id); } catch (ex) { Logging.DBLogToConsole("Channel-Feed", this.dbConn.lastErrorString, ex); } //no new ones to add, exit if (channel.feeds.length == 0) return; //add the new ones var feed = null; for (var i = 0; i < channel.feeds.length; i++) { feed = channel.feeds[i]; try { this.dbConn.executeSimpleSQL("INSERT INTO [Channel-Feed] VALUES(" + channel.id + "," + feed.id + ")"); } catch (ex) { Logging.DBLogToConsole("Channel-Feed", this.dbConn.lastErrorString, ex); } } }, //private, used in updateChannelsAndFeeds _updateFeed: function(feed) { var statement; //update if (this._isFeedExist(feed.id)) { statement = this.dbConn.createStatement("UPDATE Feed SET Url=?1, Interval=?2, LastCheckTime=null, Title=?3 WHERE FeedId=?4"); statement.bindUTF8StringParameter(0, feed.url); statement.bindInt32Parameter(1, feed.interval); statement.bindUTF8StringParameter(2, feed.title); statement.bindInt32Parameter(3, feed.id); } //add else { statement = this.dbConn.createStatement("INSERT INTO Feed VALUES (?1, ?2, ?3, null, ?4, '', 1)"); statement.bindInt32Parameter(0, feed.id); statement.bindUTF8StringParameter(1, feed.url); statement.bindInt32Parameter(2, feed.interval); statement.bindUTF8StringParameter(3, feed.title); } try { statement.execute(); } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } }, _isFeedExist: function(feedId) { var statement = this.dbConn.createStatement("SELECT FeedId FROM Feed WHERE FeedId=" + feedId); var bExists; try { if (statement.executeStep() && statement.getInt32(0)) bExists = true; else bExists = false; } catch (ex) { bExists = false; Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return bExists; }, _isChannelExists: function(channelId) { var chId = null; try { var statement = this.dbConn.createStatement("SELECT ChannelId FROM Channel WHERE ChannelId=" + channelId + " LIMIT 1"); while (statement.executeStep()) chId = statement.getInt32(0); } catch (ex) { Logging.DBLogToConsole("Channel", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return chId != null; }, _isChannelSourceExists: function(channelId, sourceId) { var chId = null; try { var statement = this.dbConn.createStatement("SELECT ChannelId FROM [Channel-Source] WHERE ChannelId=" + channelId + " AND SourceId='" + sourceId + "' LIMIT 1"); while (statement.executeStep()) chId = statement.getInt32(0); } catch (ex) { Logging.DBLogToConsole("Channel-Source", this.dbConn.lastErrorString, ex); } finally { if (statement) this._finalizeStatement(statement); } return chId != null; }, _deleteChannelsFromChannelsSourceRelation: function(sourceId, arrChannelsIds) { try { this.dbConn.executeSimpleSQL("DELETE FROM [Channel-Source] WHERE SourceId='" + sourceId + "' AND ChannelId IN (" + arrChannelsIds.join(',') + ")"); } catch (ex) { Logging.DBLogToConsole("Channel-Source", this.dbConn.lastErrorString, ex); } this._syncChannels(); }, _addNewChannels: function(sourceId, arrChannelsIds) { var channelId; for (var i = 0; i < arrChannelsIds.length; i++) { channelId = arrChannelsIds[i]; //insert into channel-source table if (!this._isChannelSourceExists(channelId, sourceId)) { try { this.dbConn.executeSimpleSQL("INSERT INTO [Channel-Source] VALUES('" + sourceId + "'," + channelId + ")"); } catch (ex) { Logging.DBLogToConsole("Channel-Source", this.dbConn.lastErrorString, ex); } } //if the channel is not exists, add it to channels DB with lastCheckTime = null if (!this._isChannelExists(channelId)) { try { this.dbConn.executeSimpleSQL("INSERT INTO Channel VALUES('" + channelId + "','',1)"); } catch (ex) { Logging.DBLogToConsole("Channel", this.dbConn.lastErrorString, ex); } } } }, //remove unused channels according to Channel-Source table _syncChannels: function() { try { this.dbConn.executeSimpleSQL("DELETE FROM Channel WHERE ChannelId NOT IN (SELECT ChannelId FROM [Channel-Source])"); this.dbConn.executeSimpleSQL("DELETE FROM [Channel-Feed] WHERE ChannelId NOT IN (SELECT ChannelId FROM Channel)"); } catch (ex) { Logging.DBLogToConsole("Channel", this.dbConn.lastErrorString, ex); } this._syncFeeds(); }, //remove unused feeds according to Channel-Feed table _syncFeeds: function() { try { this.dbConn.executeSimpleSQL("DELETE FROM Feed WHERE FeedId NOT IN (SELECT FeedId FROM [Channel-Feed])"); } catch (ex) { Logging.DBLogToConsole("Feed", this.dbConn.lastErrorString, ex); } this._syncFeedItems(); }, //remove unused feedItems according to Feeds table _syncFeedItems: function() { try { this.dbConn.executeSimpleSQL("DELETE FROM FeedItem WHERE FeedId NOT IN (SELECT FeedId FROM Feed)"); } catch (ex) { Logging.DBLogToConsole("FeedItem", this.dbConn.lastErrorString, ex); } }, _finalizeStatement: function(statement) { if (statement.finalize) statement.finalize(); else statement.reset(); } }; function AlertFeedItem() { this.feedTitle = ""; this.headerImage = ""; this.feedId = 0; this.headerText = ""; this.sendUsage = true; this.isInternal = false; this.init = function(title, link, description, pubDate, guid, feedTitle, feedImageUrl, feedId) { this.link = link; this.title = title; this.description = description; this.pubDate = pubDate; this.guid = guid; this.feedTitle = feedTitle; this.headerImage = feedImageUrl; this.feedId = feedId; }; this.initFromFeedItem = function(feedItem, feedTitle, feedImageUrl, feedId) { this.link = feedItem.link; this.title = feedItem.title; this.description = feedItem.description; this.pubDate = feedItem.pubDate; this.guid = feedItem.guid; this.feedTitle = feedTitle; this.headerImage = feedImageUrl; this.feedId = feedId; }; }; AlertFeedItem.prototype = new FeedCustomItem(); function AlertItem(headerText, headerCssStyle, headerImg, msgHtml, sendUsage, guid, isInternal, feedId, idExpirationSec) { this.__defineGetter__("headerText", function() { return headerText; }); this.__defineGetter__("headerCssStyle", function() { return headerCssStyle; }); this.__defineGetter__("headerImage", function() { return headerImg; }); this.__defineGetter__("msgHtml", function() { return msgHtml; }); this.__defineGetter__("sendUsage", function() { return sendUsage; }); this.__defineGetter__("isInternal", function() { return isInternal; }); this.__defineGetter__("guid", function() { return guid; }); this.__defineGetter__("feedId", function() { return feedId; }); this.toXMLString = function() { if (typeof idExpirationSec == "undefined") idExpirationSec = 60 * 4; var xml = '<instant_alerts_channel><author>TOOLBAR_NAME</author><id>FB_ALERT</id><feed><title></title><id></id><alert_item><guid>' + guid + '</guid><timeout_sec>10</timeout_sec><id_expiration_timeout_sec>' + idExpirationSec + '</id_expiration_timeout_sec>' + '<content><html><width>300' + '</width><height>80' + '</height><code><raw><![CDATA[' + '<html xmlns="http://www.w3.org/1999/xhtml"><head><style type="text/css">body{margin:2px;} .ebLink{color: #004498;} .ebLink:hover{text-decoration: underline;} .msgText{font-family:Arial; font-size: 11px;}</style><title>Untitled Page</title></head><body>' + msgHtml + '</body></html>' + ']]></raw></code></html></content><gui><height>140' + '</height><width>310' + '</width><window_title><image><url>' + headerImg + '</url></image><text>' + headerText + '</text></window_title></gui></alert_item></feed></instant_alerts_channel>'; return xml; }; }; function AlertChannel() { var NOT_MODIFIED = "NOT_MODIFIED"; this.id = ""; this.lastUpdateTime = ""; this.isModified = true; this.feeds = null; this.isEnabled = true; this.init = function(id, lastUpdateTime) { this.id = id; if (!lastUpdateTime) lastUpdateTime = 0; this.lastUpdateTime = lastUpdateTime; }; this.initFromXml = function(xmlChannel) { if (!xmlChannel || xmlChannel.tagName != "CHANNEL") return; this.id = XML.GetSingleNodeValue(xmlChannel, "ID"); //lastUpdateTime can be "NOT_MODIFIED", then there is not reason to check the feeds on this channel, //the feeds of this channel can be set to last check time = now. //if modified, then update last check time of all feeds to "0", in order to get now, and check feeds now. this.lastUpdateTime = XML.GetSingleNodeValue(xmlChannel, "LAST_UPDATE_TIME"); if (this.lastUpdateTime == NOT_MODIFIED) this.isModified = false; }; }; function AlertFeed() { this.id = ""; this.url = ""; this.interval = 0; //minutes this.title = ""; this.channelId = ""; this.lastCheckTime = ""; this.isEnabled = true; this.feedItems; //feed items array this.init = function(id, url, interval, title, channelId, lastCheckTime, isEnabled) { this.id = id; this.url = url; this.interval = interval; this.title = title; this.channelId = channelId; this.lastCheckTime = lastCheckTime; this.isEnabled = isEnabled; }; this.initFromXml = function(xmlFeed, channelId) { if (!xmlFeed || xmlFeed.tagName != "FEED") return; this.id = XML.GetSingleNodeValue(xmlFeed, "ID"); this.url = XML.GetSingleNodeValue(xmlFeed, "URL"); this.interval = XML.GetSingleNodeValue(xmlFeed, "INTERVAL"); this.title = XML.GetSingleNodeValue(xmlFeed, "TITLE"); this.channelId = channelId; }; }; function FFAlert() { var FF_EXTERNAL_TOOLBAR_ID = "FF_TB_EXT"; var _alertManager = null; var _init = false; this.isInit = false; this.register = function(strOriginalCTID) { var bSuccess = false; if (!_init) { if (AppInfo.OS == AppInfo.WIN && !PrefService.GetPref("conduit.alertForceInternal")) { //try to init external alert _alertManager = new ExternalAlertManager(); bSuccess = _alertManager.isInit(); } if (!bSuccess && AppInfo.isGecko18) { _alertManager = new InternalAlertManager(); _alertManager.init(); bSuccess = true; } _init = true; if (bSuccess) this.isInit = true; } if (bSuccess) _alertManager.register(strOriginalCTID); }; this.unregister = function(strOriginalCTID) { _alertManager.unregister(strOriginalCTID); }; this.addExternalAlertChannel = function(iAlertChannelId) { var arr = new Array(); arr.push(iAlertChannelId); _alertManager.addAlertChannels(FF_EXTERNAL_TOOLBAR_ID, arr); }; this.addMyStuffAlertChannel = function(iAlertChannelId, providerName) { var arr = new Array(); arr.push(iAlertChannelId); _alertManager.addMyStuffAlertChannels(FF_EXTERNAL_TOOLBAR_ID, arr, providerName); }; this.replaceChannelIds = function(strOriginalCTID, arrChannelIds) { _alertManager.replaceAlertChannels(strOriginalCTID, arrChannelIds); }; this.openSettingsDialog = function(strOriginalCTID, win) { _alertManager.openSettingsDialog(strOriginalCTID, win); }; this.refresh = function(isForceRefresh) { //isForceRefresh - for future use _alertManager.refresh(); }; this.alertEnabled = function(value) { return _alertManager.alertEnabled(value); }; this.getInternalAlert = function() { if (_alertManager instanceof InternalAlertManager) return _alertManager; else return null; }; this.sendInternalAlert = function(alertItem) { _alertManager.sendInternalAlert(alertItem); }; }; function AlertFeedsManager(onNewItemCallback, onNewItemCallbackThis) { //TODO: set timer to check the feeds, think where this time should be, in order not to get same feed twice, //at the time that first request didn't return yet. //var URL_POSTFIX = "Alerts/AlertServices.asmx/GetHostedFeedRss?alertId={0}&alertFeedId={1}"; var oTimer = null; var oTimer_IntervalSec = 30; //sec var sendFeedsInterval= 5* 60 * 1000; var sendFeedsIntervalMethod =null; var that = this; this.init = function() { this.initFeedsToShow(); this._initFeedsToPoll(); this.startIntervalForFeeds(); }; this.startIntervalForFeeds = function() { this.stopIntervalForFeeds(); sendFeedsIntervalMethod = setInterval(function() { that.initFeedsToShow(); }, sendFeedsInterval); }; this.stopIntervalForFeeds = function() { if (sendFeedsIntervalMethod) clearInterval(sendFeedsIntervalMethod); sendFeedsIntervalMethod = null; }; this.reInit = function() { this.shutdown(); this._initFeedsToPoll(); }; this.shutdown = function() { clearTimeout(oTimer); }; this.initFeedsToShow = function() { var arrAlertFeedItems = AlertFeedsDAL.getNewFeedItems(); if (!arrAlertFeedItems || arrAlertFeedItems.length == 0) { return; } this._pushNewItems(arrAlertFeedItems); }; this._pushNewItems = function(arrAlertFeedItems) { for (var i = 0; i < arrAlertFeedItems.length; i++) { onNewItemCallback.call(onNewItemCallbackThis, arrAlertFeedItems[i]); } this.stopIntervalForFeeds(); }; this._initFeedsToPoll = function() { var arrFeeds = AlertFeedsDAL.getFeedsToPoll(); if (!arrFeeds || arrFeeds.length == 0) return; this._pollFeeds(arrFeeds); var self = this; oTimer = setTimeout(function() { self._initFeedsToPoll(); }, oTimer_IntervalSec * 1000); }; this._pollFeeds = function(arrFeedsToPoll) { var strRequestUrl = ""; var feed = null; var feedPoller = null; for (var i = 0; i < arrFeedsToPoll.length; i++) { feed = arrFeedsToPoll[i]; AlertFeedsDAL.updateFeedLastCheckTime(feed.id); feedPoller = new FeedPoller(feed.url, false, this._onFeedResponse, this, feed); } }; this._onFeedResponse = function(objFeedCustomData, feed) { //feeds arrives in last published first - order, reverse it in order to show them ordered by pubDate objFeedCustomData.reverse(); var arrUnshownFeedItems = AlertFeedsDAL.saveFeedData(objFeedCustomData, feed.id); if (!arrUnshownFeedItems || arrUnshownFeedItems.length == 0 || !AlertFeedsDAL.isFeedEnabled(feed.id)) return; this._pushNewItems(arrUnshownFeedItems); }; }; AlertFeedsManager.prototype = new BaseAlertServerManager(); function AlertInfoManager(prefs, onChangeCallback, onChangeCallbackThis) { var ALERT_INFO_CHECK_INTERVAL_MIN = 60; var SERVER_URL_POSTFIX = "/Alerts/AlertServices.asmx/GetToolbarAlertsInfo"; var oTimer = null; this.prefs = prefs; this.init = function(isForceCheck) { if (isForceCheck) this._nullifyLastCheckTime(); this._setCheckTimer(); }; this.reInit = function(isForceCheck) { this.shutdown(); this.init(isForceCheck); }; this.shutdown = function() { clearTimeout(oTimer); }; this._setCheckTimer = function() { var iNextInfoTimeout = this._getNextCheckInterval(); var self = this; oTimer = setTimeout(function() { self._serverRequest(); }, iNextInfoTimeout); }; this._nullifyLastCheckTime = function() { prefs.SetPref(AlertPrefConsts.alertInfoLastCheckTime, null); }; this._getNextCheckInterval = function() { var strLastCheckTime = prefs.GetPref(AlertPrefConsts.alertInfoLastCheckTime); if (!strLastCheckTime) return 0; var iLastCheckTime = Date.parse(strLastCheckTime); if (!iLastCheckTime) return 0; var iNow = Date.parse(Date()); //check interval in ms var iCheckIntervalMS = this._getCheckInterval(); var iNextCheckIntervalMS = iLastCheckTime + iCheckIntervalMS - iNow; //next check interval is passed, check immediately if (iNextCheckIntervalMS <= 0) return 0; else return iNextCheckIntervalMS; }; this._getCheckInterval = function() { var iCheckInterval = prefs.GetPref(AlertPrefConsts.alertInfoInterval); if (!iCheckInterval) { iCheckInterval = ALERT_INFO_CHECK_INTERVAL_MIN prefs.SetPref(AlertPrefConsts.alertInfoInterval, iCheckInterval); } return iCheckInterval * 60 * 1000; }; this._serverRequest = function() { var arrAlertChannels = AlertFeedsDAL.getChannelsArray(); if (!arrAlertChannels || arrAlertChannels.length == 0) return; var serviceUrl = this._getFullServerUrl(SERVER_URL_POSTFIX); var self = this; var alertInfoRQ = new AlertInfoRQ(serviceUrl, arrAlertChannels, function(alertInfoRS) { self._serverResponse(alertInfoRS) }); //save last check time prefs.SetPref(AlertPrefConsts.alertInfoLastCheckTime, Date()); //execute request EBServerDataURL.ServiceRequest(alertInfoRQ); }; this._serverResponse = function(strResponse) { var alertInfoRS = new AlertInfoRS(strResponse); this._saveServerResponse(alertInfoRS); //set next check this._setCheckTimer(); }; this._saveServerResponse = function(alertInfoRS) { prefs.SetPref(AlertPrefConsts.alertInfoInterval, alertInfoRS.interval); //nothing modified if (alertInfoRS.modifiedChannelsArray.length == 0) return; AlertFeedsDAL.updateChannelsAndFeeds(alertInfoRS.modifiedChannelsArray); onChangeCallback.call(onChangeCallbackThis); }; }; AlertInfoManager.prototype = new BaseAlertServerManager(); function AlertLoginManager(prefs) { var LOGIN_CHECK_INTERVAL_MIN = 1440; var SERVER_URL_POSTFIX = "/Alerts/AlertServices.asmx/AlertLogin"; var oTimer = null; this.prefs = prefs; this.init = function() { this._setCheckTimer(); }; this.reInit = function() { this.shutdown(); this.init(); }; this.shutdown = function() { clearTimeout(oTimer); }; this._setCheckTimer = function() { var iNextLoginTimeout = this._getNextCheckInterval(); var self = this; oTimer = setTimeout(function() { self._serverRequest(); }, iNextLoginTimeout); }; this._getCheckInterval = function() { var iCheckInterval = prefs.GetPref(AlertPrefConsts.loginIntervalMin); if (!iCheckInterval) { iCheckInterval = LOGIN_CHECK_INTERVAL_MIN prefs.SetPref(AlertPrefConsts.loginIntervalMin, iCheckInterval); } return iCheckInterval * 60 * 1000; }; this._getNextCheckInterval = function() { var strLastCheckTime = prefs.GetPref(AlertPrefConsts.loginLastCheckTime); if (!strLastCheckTime) return 0; var strLastUpdateTime = prefs.GetPref(AlertPrefConsts.loginLastUpdateTime); if (!strLastUpdateTime) return 0; var iLastCheckTime = Date.parse(strLastCheckTime); if (!iLastCheckTime) return 0; var iNow = Date.parse(Date()); //check interval in ms var iCheckIntervalMS = this._getCheckInterval(); var iNextCheckIntervalMS = iLastCheckTime + iCheckIntervalMS - iNow; //next check interval is passed, check immidiatly if (iNextCheckIntervalMS <= 0) return 0; else return iNextCheckIntervalMS; }; this._getUserId = function() { var userId = prefs.GetPref(AlertPrefConsts.userId); if (!userId) { userId = generateGuid(); prefs.SetPref(AlertPrefConsts.userId, userId); } return userId; }; this._serverRequest = function() { var serviceUrl = this._getFullServerUrl(SERVER_URL_POSTFIX); var lastUpdateTime = prefs.GetPref(AlertPrefConsts.loginLastUpdateTime); if (!lastUpdateTime) lastUpdateTime = 0; var userId = this._getUserId(); var alertsStatus = (prefs.GetPref(AlertPrefConsts.alertEnabled) == false) ? "DISABLED" : "ENABLED"; var version = "2.5.2.14"; var arrChannelsIds = AlertFeedsDAL.getChannelsIdsArray(); var self = this; var alertLoginRQ = new AlertLoginRQ(serviceUrl, lastUpdateTime, userId, alertsStatus, version, arrChannelsIds, function(strResponse) { self._serverResponse(strResponse) }); //save last check time prefs.SetPref(AlertPrefConsts.loginLastCheckTime, Date()); //execute the request EBServerDataURL.ServiceRequest(alertLoginRQ); }; this._serverResponse = function(strResponse) { var alertLoginRS = new AlertLoginRS(strResponse); if (alertLoginRS.isModified) this._saveServerResponse(alertLoginRS); //set next check this._setCheckTimer(); }; this._saveServerResponse = function(alertLoginRS) { prefs.SetPref(AlertPrefConsts.loginLastUpdateTime, alertLoginRS.lastUpdateTime); prefs.SetPref(AlertPrefConsts.loginIntervalMin, alertLoginRS.intervalMin); prefs.SetPref(AlertPrefConsts.locale, alertLoginRS.locale); prefs.SetPref(AlertPrefConsts.userCloseIntervalMin, alertLoginRS.data.userCloseIntervalMin); prefs.SetPref(AlertPrefConsts.messageShowTimeSec, alertLoginRS.data.messageShowTimeSec); prefs.SetPref(AlertPrefConsts.showTrayIcon, alertLoginRS.data.showTrayIcon); prefs.SetPref(AlertPrefConsts.servicesServerUrl, alertLoginRS.data.servicesServerUrl); prefs.SetPref(AlertPrefConsts.clientsServerUrl, alertLoginRS.data.clientsServerUrl); }; }; AlertLoginManager.prototype = new BaseAlertServerManager(); function AlertUsageManager(oPrefs) { this.prefs = oPrefs; var urlPostfix = "/Alerts/AlertServices.asmx/SetAlertUsageRequest"; this.msgViewed = function(itemGuid, feedId) { if(itemGuid && feedId) this._pushUsage(itemGuid, feedId, "MESSAGE_VIEWED"); else this._pushUsage(null, null, "INITIAL_NOTIFICATION_VIEWED"); }; this.msgClicked = function(itemGuid, feedId) { if(itemGuid && feedId) this._pushUsage(itemGuid, feedId, "CLICK_ON_MESSAGE"); else this._pushUsage(null, null, "INITIAL_NOTIFICATION_CLICKED"); }; this.msgForwarded = function(itemGuid, feedId) { if (itemGuid && feedId) this._pushUsage(itemGuid, feedId, "MESSAGE_PAGED_FORWARD"); }; this.msgBackwarded = function(itemGuid, feedId) { if (itemGuid && feedId) this._pushUsage(itemGuid, feedId, "MESSAGE_PAGED_BACKWARD"); }; this._pushUsage = function(itemGuid, feedId, type) { var channelId = (itemGuid && feedId) ? AlertFeedsDAL.getFirstChannelByFeedId(feedId) : AlertFeedsDAL.getFirstChannel(feedId); var fullUrl = this._getFullServerUrl(urlPostfix); var oMsg = new AlertUsageRQ(fullUrl, type, channelId, feedId, itemGuid, null) EBServerDataURL.ServiceRequest(oMsg); }; }; AlertUsageManager.prototype = new BaseAlertServerManager(); function BaseAlertManager() { this.isInit = function() { }; this.register = function(strOriginalCTID) { return true; }; this.unregister = function(strOriginalCTID) { }; this.replaceAlertChannels = function(strSource, arrAlertChannels) { }; this.addAlertChannels = function(strSource, arrAlertChannels) { }; this.addMyStuffAlertChannels = function(strSource, arrAlertChannels, providerName) { }; this.openSettingsDialog = function(strOriginalCTID, win) { }; this.refresh = function() { }; this.alertEnabled = function(value) { }; //get, set this.sendInternalAlert = function(alertItem) { }; }; function BaseAlertServerManager() { this.prefs = null; this._getFullServerUrl = function(strPostfix) { var strBaseServerUrl = this.prefs.GetPref(AlertPrefConsts.servicesServerUrl); if (!strBaseServerUrl) { strBaseServerUrl = AlertConsts.servicesBaseUrl; this.prefs.SetPref(AlertPrefConsts.servicesServerUrl, strBaseServerUrl); } return strBaseServerUrl + strPostfix; }; this._getArrayOfIds = function(hashObjects) { var arrIds = new Array(); for (var i = 0; i < this.hashObjects.Count(); arrIds.push(this.hashObjects.GetByIndex(i)), i++); return arrIds; }; }; function ExternalAlertManager() { var alertXPCOM = null; this.register = function(strOriginalCTID) { if (alertXPCOM == null) return; try { alertXPCOM.register(strOriginalCTID); } catch (ex) { } }; this.unregister = function(strOriginalCTID) { alertXPCOM.unregister(strOriginalCTID); }; this.replaceAlertChannels = function(strOriginalCTID, arrChannelIds) { alertXPCOM.replaceChannels(strOriginalCTID, arrChannelIds); }; this.addAlertChannels = function(strSource, arrChannelsIds) { alertXPCOM.addChannels(strSource, arrChannelsIds); }; this.addMyStuffAlertChannels = function(strSource, arrChannelsIds, providerName) { alertXPCOM.addMyStuffChannels(strSource, arrChannelsIds[0], providerName); try { alertXPCOM.showTrayIcon(true); } catch (ex) { Logging.LogToConsole(ex); } }; this.openSettingsDialog = function(strOriginalCTID) { alertXPCOM.openSettingsDialog(strOriginalCTID); }; this.refresh = function() { alertXPCOM.refresh(); }; this.alertEnabled = function(value) { var strRegKey = (AppInfo.isVista()) ? "Software\\AppDataLow\\Software\\Conduit\\Community Alerts\\Settings" : "Software\\Conduit\\Community Alerts\\Settings"; //get if (typeof value == "undefined") { try { var bEnabled = alertXPCOM.isAlertsEnabled(); return bEnabled; } //old IE alert catch (ex) { var regValue = RegistryManager.GetRegistryEntry(RegistryManager.HKEY_CURRENT_USER, strRegKey, "ShowAlerts"); return (regValue) ? regValue.charAt(0).toString().toUpperCase() == "T" : true; } } //set else { try { alertXPCOM.enableAlerts(value); } //old IE alert catch (ex) { RegistryManager.WriteRegistryEntry(RegistryManager.HKEY_CURRENT_USER, strRegKey, "ShowAlerts", "TRUE"); } } }; this.sendInternalAlert = function(alertItem) { var strAlertXml = alertItem.toXMLString(); try { alertXPCOM.sendInternalAlert(strAlertXml); } catch (ex) { EBLog(ex); } }; this.isInit = function() { return (alertXPCOM && alertXPCOM.isInit()); }; this._init = function() { try { alertXPCOM = Components.classes["@conduit.com/externalAlert;3"].getService(Components.interfaces.IFFExternalAlert3); } catch (ex) { EBLog(ex); alertXPCOM = null; } }; this._init(); }; ExternalAlertManager.prototype = new BaseAlertManager(); ///<reference path="..\..\DAL\ChatProviderRoomInfo.js" /> function InternalAlertManager() { var prefs = new PrefManager(AlertPrefConsts.prefix, AlertPrefConsts.prefix); var loginManager = null; var alertInfoManager = null; var feedManager = null; var hashChannels = null; var hashFeeds = null; var trayIconShown = false; this.uiManager = null; this.usageManager = null; var initTimeStamp = Date.parse(Date()); var arrWaitingMessages = new Array(); var msgsWaitingList = new Array(); var isFirstMsgSent = false; var publisherAlertHtml = '<div style="padding:3px 0px 0px 0px; height: 65px; overflow: hidden !important;"><div style="font-family:Arial; font-size: 9px; color: #7c99c5; margin-bottom:2px;">{0}</div><div style="color: rgb(0,82,170); font-family:Arial; font-size: 13px; margin-top:2px; padding:0px;">{1}</div><div style="font-family:Arial; font-size: 11px; margin:2px 1px 0px 1px;">{2}</div></div>'; var publisherAlertHtmlLinux = '<div style="padding:3px 0px 0px 0px; height: 65px; overflow: hidden !important;"><div style="font-family:Arial; font-size: 9px; color: #7c99c5; margin-bottom:2px;">{0}</div><div style="color: rgb(0,82,170); font-family:Arial; font-size: 12px; margin-top:2px; padding:0px;">{1}</div><div style="font-family:Arial; font-size: 10px; margin:2px 1px 0px 1px;">{2}</div></div>'; var isInIdle = false; var feedItemsHash = new HashArray(); this.register = function(strOriginalCTID) { AlertFeedsDAL.registerSource(strOriginalCTID); return true; }; this.unregister = function(strOriginalCTID) { AlertFeedsDAL.unregisterSource(strOriginalCTID); if (AlertFeedsDAL.getRegisteredSourcesCount() == 0) this._cleanUpAllData(); }; this.replaceAlertChannels = function(strSource, arrAlertChannels) { var bIsNew = AlertFeedsDAL.replaceAlertChannels(strSource, arrAlertChannels); if (bIsNew && alertInfoManager && this.alertEnabled()) alertInfoManager.reInit(true); }; this.addAlertChannels = function(strSource, arrAlertChannels) { AlertFeedsDAL.addAlertChannels(strSource, arrAlertChannels); if (alertInfoManager && this.alertEnabled()) alertInfoManager.reInit(true); //set icon visible this.showTray(true); }; this.addMyStuffAlertChannels = function(strSource, arrAlertChannels, providerName) { this.addAlertChannels(strSource, arrAlertChannels); this._sendSampleAlert(providerName); }; this.openSettingsDialog = function(strOriginalCTID, win) { this.uiManager.openSettingsDialog(win); }; this.refresh = function() { if (this.alertEnabled()) { AlertFeedsDAL.refresh(); alertInfoManager.reInit(true); } }; this.onWindowLoad = function(document) { this.uiManager.showHideTray(this.showTray(), document); }; //settings methods this.getFeedsHash = function() { var hashFeeds = AlertFeedsDAL.getFeedsSortedHashArray(); var hashFeedItems = AlertFeedsDAL.getFeedItemsHash(); if (!hashFeeds || hashFeeds.Count() == 0) return hashFeeds; var feed = null; for (var i = 0; i < hashFeeds.Count(); i++) { feed = hashFeeds.GetByIndex(i); if (hashFeedItems.Contains(feed.id)) feed.feedItems = hashFeedItems.GetByID(feed.id); } return hashFeeds; }; this.removeShownMessages = function(arrShownMessagesGuids, oFirstTimeMsg) { this.uiManager.alertOpenState = 0; if (oFirstTimeMsg) { //update DB AlertFeedsDAL.updateShownFeedItems(arrShownMessagesGuids); //restart alert open interval feedManager.startIntervalForFeeds(); feedItemsHash.Clear(); } //first time message was shown else { var that = this; this.uiManager.firstTimeMsg = null; prefs.SetPref(AlertPrefConsts.firstTimeAlertShown, true); setTimeout(function() { that.invokeMsgsWaitList(); }, AlertConsts.messageAfterFirstTimeAlert); } }; this.invokeMsgsWaitList = function() { for (var i = 0; i < msgsWaitingList.length; i++) this.sendInternalAlert(msgsWaitingList[i]); msgsWaitingList = new Array(); }; //update feeds from settings dialog this.updateFeedsFromSettings = function(arrFeeds) { if (!arrFeeds || arrFeeds.length == 0) return; var arrFeedsIds = new Array(); for (var i = 0; i < arrFeeds.length; i++) arrFeedsIds.push(arrFeeds[i].id); AlertFeedsDAL.reverseFeedsEnableState(arrFeedsIds); setTimeout(function() { feedManager.initFeedsToShow(); }, 1000); }; this.alertEnabled = function(bValue) { //get if (typeof bValue == "undefined") { return (prefs.GetPref(AlertPrefConsts.alertEnabled) == false) ? false : true; } //set else { prefs.SetPref(AlertPrefConsts.alertEnabled, bValue); if (bValue) this._enable(); else this._disable(); } }; this.showTray = function(bValue) { //get if (typeof bValue == "undefined") return (prefs.GetPref(AlertPrefConsts.showTrayIcon) == true) ? true : false; //set else { prefs.SetPref(AlertPrefConsts.showTrayIcon, bValue); this.uiManager.showHideTray(bValue); } }; this.onIdle = function() { if (!this.alertEnabled()) return; isInIdle = true; feedManager.shutdown(); }; this.onBackFromIdle = function() { if (!this.alertEnabled()) return; isInIdle = false; this.invokeMsgsWaitList(); feedManager.init(); }; this._cleanUpAllData = function() { AlertFeedsDAL.unlink(); }; this.onChannelsAndFeedsChange = function() { feedManager.reInit(); }; this.sendAlert = function(alertItem) { if (this.isFirstMsgShown() && !isInIdle) { if (this._canBroadcastToUI()) this.uiManager.addFeedMessage(alertItem); else { if (arrWaitingMessages.length == 0) this._initReleaseWaitingMessages(); arrWaitingMessages.push(alertItem); } } else { msgsWaitingList.push(alertItem); if (!isFirstMsgSent) { this.uiManager._showFirstTimeAlert(this.createFirstMsgAlertItem(alertItem)); isFirstMsgSent = true; } } }; this.onNewFeedAlert = function(feedItem) { var alertItem = this.convertFromFeedToItem(feedItem, false); if (!feedItemsHash.Contains(alertItem.guid)) { this.sendAlert(alertItem); feedItemsHash.Add(alertItem.guid, true); } }; this.isFirstMsgShown = function() { return prefs.GetPref(AlertPrefConsts.firstTimeAlertShown); }; this.createFirstMsgAlertItem = function(item) { var oAlertMsg = new AlertFeedItem(); oAlertMsg.init(this.uiManager.firstTimeMsgTitle, this.uiManager.getFaqLink(), this.uiManager.firstTimeMsgDescription, "", "", "", item.headerImg, null); return this.convertFromFeedToItem(oAlertMsg, true); }; this.convertFromFeedToItem = function(feed, firstTime) { var headerCssStyle = { "color": "#004498", "fontFamily": "Arial", "isBold": true }; var strTitle = (feed.link) ? stringFormat("<a href=\"{0}\" style=\"text-decoration:underline;\">{1}</a>", feed.link, feed.title) : feed.title; var pubAlertHtml = (AppInfo.OS == AppInfo.LINUX) ? publisherAlertHtmlLinux : publisherAlertHtml; var html = stringFormat(pubAlertHtml, feed.feedTitle, strTitle, feed.description.replace(/\n/, "<br />")); return new AlertItem(feed.headerText, headerCssStyle, feed.headerImage, html, feed.sendUsage, feed.guid, firstTime, feed.feedId); }; this.sendInternalAlert = function(alertItem) { if (this.uiManager.alertOpenState == 0) feedManager.initFeedsToShow(); this.sendAlert(alertItem); }; this._canBroadcastToUI = function() { var now = Date.parse(Date()); var bValue = (now - initTimeStamp >= AlertConsts.firstMessageDelayMs); return bValue; }; this._initReleaseWaitingMessages = function() { var that = this; var releaseWaitingMessages = function() { if (arrWaitingMessages.length == 0) return; for (var i = 0; i < arrWaitingMessages.length; i++) that.uiManager.addFeedMessage(arrWaitingMessages[i]); arrWaitingMessages = null; } setTimeout(releaseWaitingMessages, AlertConsts.firstMessageDelayMs); }; this._enable = function() { if (!alertInfoManager) alertInfoManager = new AlertInfoManager(prefs, this.onChannelsAndFeedsChange, this); if (!feedManager) feedManager = new AlertFeedsManager(this.onNewFeedAlert, this); var bForceInit = (AlertFeedsDAL.getChannelsIdsArray().length > 0 && !AlertFeedsDAL.isFeedsExists()) ? true : false; alertInfoManager.init(bForceInit); feedManager.init(); //change tray icon this.uiManager.onEnable(); }; this._disable = function() { if (alertInfoManager) alertInfoManager.shutdown(); if (feedManager) feedManager.shutdown(); //change tray icon this.uiManager.onDisable(); }; this._sendSampleAlert = function(strTitle) { var oFeedItem = new AlertFeedItem(); oFeedItem.feedId = -1; oFeedItem.headerText = "Thanks for adding our Alerts"; oFeedItem.feedTitle = strTitle; oFeedItem.title = "The Alerts look like this"; oFeedItem.headerImage = ""; oFeedItem.sendUsage = false; oFeedItem.description = "They bring community news right to your desktop!"; this.onNewFeedAlert(oFeedItem); }; this.init = function() { AlertFeedsDAL.init(); //always start login manager, even if alert is disbaled var bIsEnabled = this.alertEnabled(); loginManager = new AlertLoginManager(prefs); loginManager.init(); this.uiManager = new AlertUIManager(prefs, this.onIdle, this.onBackFromIdle, this); this.usageManager = new AlertUsageManager(prefs); if (bIsEnabled) this._enable(); else this.uiManager.onDisable(); }; }; InternalAlertManager.prototype = new BaseAlertManager(); function AlertInfoRQ(serviceUrl, arrAlertChannels, objCallback) { var ALERT_RQ = "alertInfoRequestXml=<ALERT_XML><TYPE>ALERT_INFO</TYPE><MESSAGE>{0}</MESSAGE></ALERT_XML>"; this.callback = objCallback; this.url = serviceUrl; this.postParams = ""; this._getChannelsInfo = function(arrAlertChannels) { var strChannelsInfo = ""; var strChannelInfo = ""; for (var i = 0; i < arrAlertChannels.length; i++) { strChannelInfo = XML.CreateXmlNodeString("ID", arrAlertChannels[i].id); strChannelInfo += XML.CreateXmlNodeString("LAST_UPDATE_TIME", arrAlertChannels[i].lastUpdateTime); strChannelsInfo += XML.CreateXmlNodeString("ALERT_CHANNEL", strChannelInfo); } return strChannelsInfo; }; this._init = function() { var strChannelsInfo = this._getChannelsInfo(arrAlertChannels); this.postParams = stringFormat(ALERT_RQ, strChannelsInfo); }; this._init(); }; function AlertInfoRS(strResponseXml) { this.interval = 0; this.modifiedChannelsArray = new Array() this._parseChannels = function(xmlChannels) { if (!xmlChannels) return; var xmlChannel = null; var xmlFeeds = null; var xmlFeed = null; var channel = null; var feed = null; for (var i = 0; i < xmlChannels.childNodes.length; i++) { xmlChannel = xmlChannels.childNodes[i]; if (xmlChannel.tagName == "CHANNEL") { channel = new AlertChannel(); channel.initFromXml(xmlChannel); if (channel.isModified) { this.modifiedChannelsArray.push(channel); channel.feeds = new Array(); xmlFeeds = XML.SelectSingleNode(xmlChannel, "FEEDS"); for (var j = 0; j < xmlFeeds.childNodes.length; j++) { xmlFeed = xmlFeeds.childNodes[j]; if (xmlFeed.tagName == "FEED") { feed = new AlertFeed(); feed.initFromXml(xmlFeed, channel.id); channel.feeds.push(feed); } } } } } }; this._init = function() { if (!strResponseXml) return; var xmlResponse = XML.GetXmlDocument(strResponseXml); if (!xmlResponse) return; this.interval = XML.GetSingleNodeValueAsInteger(xmlResponse, "INTERVAL"); var xmlChannels = XML.SelectSingleNode(xmlResponse, "CHANNELS"); this._parseChannels(xmlChannels); }; this._init(); }; function AlertLoginRQ(serviceUrl, lastUpdateTime, userId, alertsStatus, version, arrChannels, objCallback) { var ALERT_RQ = "alertLoginRequestXml=<ALERT_XML><TYPE>ALERT_LOGIN</TYPE><MESSAGE><LUT>{0}</LUT><USER_ID>{1}</USER_ID><USER_ALERTS_STATUS>{2}</USER_ALERTS_STATUS><VERSION>{3}</VERSION><CHANNELS>{4}</CHANNELS></MESSAGE></ALERT_XML>"; this.callback = objCallback; this.url = serviceUrl; this.postParams = ""; this._generateChannelsInfo = function(arrChannels) { var strChannels = "<ID>" + arrChannels.join("</ID><ID>") + "</ID>"; return strChannels; }; this._init = function() { var strChannelsInfo = this._generateChannelsInfo(arrChannels); this.postParams = stringFormat(ALERT_RQ, lastUpdateTime, userId, alertsStatus, version, strChannelsInfo); }; this._init(); }; AlertLoginRQ.prototype = new BaseServerRequest(); function AlertLoginRS(strResponseXml) { var FLAG_NOT_MOFIFIED = "NOT_MODIFIED"; this.isModified = true; this.lastUpdateTime = ""; this.intervalMin = 0; this.locale = ""; this.data = null; this._init = function() { if (!strResponseXml) return; var xmlResponse = XML.GetXmlDocument(strResponseXml); if (!xmlResponse) return; var flag = XML.GetSingleNodeValue(xmlResponse, "FLAGS"); if (flag == FLAG_NOT_MOFIFIED) { this.isModified = false; return; } this.lastUpdateTime = XML.GetSingleNodeValue(xmlResponse, "LUT"); this.intervalMin = XML.GetSingleNodeValueAsInteger(xmlResponse, "INTERVAL_MM"); this.locale = XML.GetSingleNodeValue(xmlResponse, "LOCALE"); this.data = new AlertLoginRSData(XML.SelectSingleNode(xmlResponse, "DATA")); }; this._init(); }; function AlertLoginRSData(xmlData) { this.userCloseIntervalMin = 0; this.messageShowTimeSec = 0; this.showTrayIcon = null; this.servicesServerUrl = ""; this.clientsServerUrl = ""; this._init = function() { if(!xmlData) return; this.userCloseIntervalMin = XML.GetSingleNodeValueAsInteger(xmlData, "USER_CLOSE_INTERVAL_MM"); this.messageShowTimeSec = XML.GetSingleNodeValueAsInteger(xmlData, "MESSAGE_SHOW_TIME_SS"); this.showTrayIcon = XML.GetSingleNodeValueAsBoolean(xmlData, "SHOW_SYS_TRAY_ICON"); this.servicesServerUrl = XML.GetSingleNodeValue(xmlData, "ALP_SERVICES_SERVER_URL"); this.clientsServerUrl = XML.GetSingleNodeValue(xmlData, "ALP_CLIENTS_SERVER_URL"); }; this._init(); }; function AlertUsageRQ(serviceUrl, type, channelId, feedId, itemId ,objCallback) { var ALERT_RQ = "alertUsageRequestXml=<ALERT_XML><TYPE>ALERT_USAGE</TYPE><MESSAGE><VERSION>2.5.2.14</VERSION><TYPE>{0}</TYPE><DATA><ALERT_ID>{1}</ALERT_ID>{2}</DATA></MESSAGE></ALERT_XML>"; var FEED_ITEM_INFO = "<FEED_ID>{0}</FEED_ID><ITEM_ID>{1}</ITEM_ID>"; this.callback = objCallback; this.url = serviceUrl; this.postParams = ""; this._init = function() { var feedChannelInfo = (feedId && itemId) ? stringFormat(FEED_ITEM_INFO, feedId, itemId) : ""; this.postParams = stringFormat(ALERT_RQ, type, channelId, feedChannelInfo); }; this._init(); }; function AlertUIManager(prefs, onIdle, onBackFromIdle, objThis) { var alertWidth = "313"; var alertHeigth = "133"; var alertWindowType = "EBAlertMainType"; var alertWindowName = "EBAlertMainName"; var settingsWindowType = "EBAlertSettingsType"; var settingsWindowName = "EBAlertSettingsName"; var aboutWindowType = "EBAlertAboutType"; var aboutWindowName = "EBAlertAboutName"; var previewWindowType = "EBAlertPreviewType"; var previewWindowName = "EBAlertPreviewType"; //links postfix urls var linkFeedback = "Alerts/Feedback/?aid="; var linkFaq = "Alerts/Faq/?aid="; var linkPrivacy = "Alerts/Privacy/?aid="; //tray icon var iconPanelId = "pnl_CT2384137_Alert"; var iconId = "icon_CT2384137_Alert"; var ringIconUrl = "chrome://iobitcom/skin/alert/TrayIconAnimated.gif"; var alertIconUrl = "chrome://iobitcom/skin/alert/TrayIcon.ico"; var disabledIconUrl = "chrome://iobitcom/skin/alert/TrayIconBlocked.ico"; var currentIconUrl = ""; var arrFeedMessages = new Array(); var arrWaitingMessagesFF2 = new Array(); var tryNotifyLoops = 10; var idleObserver; var idleTimeout = 60; //sec this.firstTimeMsgTitle = "Introducing a handy new feature"; this.firstTimeMsgDescription = "As a community toolbar user, you're about to receive\nimportant news from us in an alert like this one."; this.alertOpenState = 0; var bShowFirstTime = true; //in order not to show first time message more then once (happends when after installation there are more then one alert) var oPopup = null; var lastActiveElement = null; var lastActiveElementWindow = null; var firstTimeMsg = null; this.observer = new Object(); this.observer.topic = "eb-alert-new-message"; this.addFeedMessage = function(objAlertItem) { arrFeedMessages.push(objAlertItem); this._showAlert(objAlertItem); }; this.getFeedMessages = function() { return arrFeedMessages; }; this.getFirstTimeMsg = function() { return firstTimeMsg; }; this.openAlertDialog = function(oAlertMsg) { var win = getWindow(); var oPos = this._getMainDialogPosition(win); //FF3+ alert is <panel noautofocus="true" /> if (AppInfo.isGecko19 && AppInfo.OS != AppInfo.LINUX) { this.alertOpenState = 2; oPopup = win.document.getElementById("alertMain_CT2384137"); oPopup.openPopupAtScreen(oPos.x, oPos.y, false); oPopup.addAlert(oAlertMsg); } //FF2 alert is xul dialog, that returns focus after load. else { this.alertOpenState = 1; lastActiveElement = win.document.commandDispatcher.focusedElement; lastActiveElementWindow = win; var strParams = stringFormat("chrome,dependent,resizeable=no,titlebar=yes,top={0},left={1}", oPos.y, oPos.x); oPopup = win.openDialog(AlertConsts.mainDialogPath, alertWindowName, strParams, oAlertMsg); } }; this.openSettingsDialog = function(win) { if (!win) win = getWindow(); var strParams = "chrome,dependent,modal,resizeable=no,titlebar=yes,centerscreen"; win.openDialog(AlertConsts.settingsDialogPath, settingsWindowName, strParams); }; this.openAboutDialog = function(win) { if (!win) win = getWindow(); var strParams = "chrome,dependent,modal,resizeable=no,titlebar=yes,centerscreen"; win.openDialog(AlertConsts.aboutDialogPath, aboutWindowName, strParams); }; this.openPreviewDialog = function(feed, win) { var strParams = "chrome,dependent,modal,resizeable=no,titlebar=yes,centerscreen"; win.openDialog(AlertConsts.channelMessagesPreviewDialogPath, previewWindowName, strParams, feed); }; this.showHideTray = function(bValue, document) { var strDisplay = (bValue) ? "" : "none"; this._setTrayIcon(currentIconUrl, document); //set to single window if (document) document.getElementById(iconPanelId).style.display = strDisplay; //set to all windows else { var arrWindows = getWindows(); for (var i = 0; i < arrWindows.length; i++) arrWindows[i].document.getElementById(iconPanelId).style.display = strDisplay; } }; this.returnFocus = function() { //do not return focus in mac, because the alert window is goind under the main window. if (!lastActiveElement || !lastActiveElementWindow || AppInfo.OS == AppInfo.MAC) return; try { lastActiveElementWindow.focus(); lastActiveElement.focus(); } catch (ex) { Logging.LogToConsole(ex); } }; this.releaseFF2WaitingMessages = function() { if (arrWaitingMessagesFF2.length == 0) return; this.alertOpenState = 2; for (var i = 0; i < arrWaitingMessagesFF2.length; i++) this._showAlert(arrWaitingMessagesFF2[i]); arrWaitingMessagesFF2 = new Array(); }; this.onEnable = function() { currentIconUrl = alertIconUrl; this._setTrayIcon(alertIconUrl); }; this.onDisable = function() { currentIconUrl = disabledIconUrl; this._setTrayIcon(disabledIconUrl); }; this.setAnimatedIcon = function() { this._setTrayIcon(ringIconUrl); }; this.setNormalIcon = function() { this.onEnable(); }; this.getFeedBackLink = function() { return this._getLinkUrl(linkFeedback); }; this.getFaqLink = function() { return this._getLinkUrl(linkFaq); }; this.getPrivacyLink = function() { return this._getLinkUrl(linkPrivacy); }; this.onIdle = function(iIdleTime) { onIdle.call(objThis); }; this.onBackFromIdle = function(iIdleTime) { onBackFromIdle.call(objThis); }; this._showFirstTimeAlert = function(item) { arrFeedMessages.push(item); bShowFirstTime = false; this._showAlert(item); }; //opens a new dialog or adds to existing if there are messages this._showAlert = function(oAlertMsg) { if (arrFeedMessages.length == 0 || !this._isToShowAlert()) return; switch (this.alertOpenState) { case 0: this.openAlertDialog(oAlertMsg); break; case 1: arrWaitingMessagesFF2.push(oAlertMsg); break; case 2: //FF3+ - simply activate alert popup's function if (AppInfo.isGecko19 && AppInfo.OS != AppInfo.LINUX) { oPopup.addAlert(oAlertMsg); } //FF2 - send via observer else { var topic = this.observer.topic; setTimeout(function() { var aSubject = new Object(); aSubject.wrappedJSObject = aSubject; aSubject.message = oAlertMsg; notifyObservers(aSubject, topic, ""); }, 100); } break; } }; this._getLinkUrl = function(strPostFix) { //lazy init if (!prefs) prefs = new PrefManager(AlertPrefConsts.prefix, AlertPrefConsts.prefix); var strBaseClientUrl = prefs.GetPref(AlertPrefConsts.clientsServerUrl); if (!strBaseClientUrl) { strBaseClientUrl = AlertConsts.clientsBaseUrl; prefs.SetPref(AlertPrefConsts.clientsServerUrl, strBaseClientUrl); } var arrChannelsIds = AlertFeedsDAL.getChannelsIdsArray(); return strBaseClientUrl + "/" + strPostFix + arrChannelsIds[0]; }; this._setTrayIcon = function(iconUrl, document) { //set to single window if (document) { xulIcon = document.getElementById(iconId); if (xulIcon) xulIcon.src = iconUrl; } //set to all windows else { var arrWindows = getWindows(); if (!arrWindows || arrWindows.length == 0) return; var xulIcon = null; for (var i = 0; i < arrWindows.length; i++) { xulIcon = arrWindows[i].document.getElementById(iconId); if (xulIcon) xulIcon.src = iconUrl; } } }; this._isFeedMessageExists = function(guid) { for (var i = 0; i < arrFeedMessages.length; i++) if (arrFeedMessages[i].guid == guid) return true; return false; }; this._notifyNewMessage = function() { var topic = this.observer.topic; setTimeout(function() { notifyObservers(null, topic, ""); }, 300); }; this._getMainDialogPosition = function(win) { var statusBarHeight = win.document.getElementById("status-bar").boxObject.height; var x = win.screen.availWidth - alertWidth; var y = win.screen.availHeight - alertHeigth - statusBarHeight; return { "x": x, "y": y }; }; this._isToShowAlert = function() { if (idleObserver) return !idleObserver.isIdle; else return true; }; this._init = function() { if (AppInfo.isGecko19) { idleObserver = new IdleObserver(idleTimeout, this.onIdle, this.onBackFromIdle, this); idleObserver.register(); } }; this._init(); }; var ChatPrefConsts = { ChatPrefix: "Chat.", ServerLastCheckTime: "ServerLastCheckTime", ServerLastResponseTime: "ServerLastResponseTime" }; function ChatInfo(oIO, oPref, oProvidersCallback, thatChatManager) { this.filename = "chat" + Dir.sep + "ChatInfo.xml"; this.lastUpdateTime = ""; this.providersHash; this.publisherRooms; this.publicRooms; this.isLoaded = false; this.mProvidersCallback = oProvidersCallback; this.mIO = oIO; this.mPref = oPref; this.mThatChatManager = thatChatManager; this.loadFromFile = function() { this.isLoaded = false; var strXml = this.mIO.readToolbarFile(this.filename, true); var xmlDoc = XML.GetXmlDocument(strXml); if (xmlDoc) this.loadFromXml(xmlDoc.documentElement); }; this.loadFromXml = function(xmlRoot) { this.isLoaded = false; if (!xmlRoot) return; var xmlChild = null; for (var i = 0; i < xmlRoot.childNodes.length; i++) { xmlChild = xmlRoot.childNodes[i]; switch (xmlChild.tagName) { case "LAST_UPDATE_TIME": this.lastUpdateTime = XML.GetXmlNodeValue(xmlChild); break; case "PROVIDERS": this._parseProviders(xmlChild); break; case "ROOMS": this._parseRooms(xmlChild); break; } } if ((!this.publisherRooms || this.publisherRooms.Count() == 0) && (!this.publicRooms || this.publicRooms.Count() == 0)) { this.isLoaded = false; this.lastUpdateTime = ""; } else { this.isLoaded = true; if (this.providersHash && this.providersHash.Count() > 0) { this._registerRoomsToProviders(); this._initProviders(); } } }; //this function is called after new settings received this.loadFromXmlAndSave = function(xmlRoot) { if (!xmlRoot) return; this.shutdown(true); this.saveToFile(xmlRoot); this.loadFromXml(xmlRoot); }; this.saveToFile = function(xmlRoot) { var strXml = XML.GetStringXml(xmlRoot); this.mIO.writeToolbarFile(strXml, this.filename, true); }; this.shutdown = function(bReinit) { this._shutdownProviders(bReinit); }; this._parseProviders = function(xmlProviders) { this._shutdownProviders(); this.providersHash = new HashArray(); var xmlProvider = null; for (var i = 0; i < xmlProviders.childNodes.length; i++) { xmlProvider = xmlProviders.childNodes[i]; if (xmlProvider.tagName) { var oProvider = ChatProviderFactory.getProvider(xmlProvider, this.mPref); if (oProvider) this.providersHash.Add(oProvider.type, oProvider); } } }; this._parseRooms = function(xmlRooms) { this.publisherRooms = new HashArray(); this.publicRooms = new HashArray(); var xmlRoom = null; for (var i = 0; i < xmlRooms.childNodes.length; i++) { xmlRoom = xmlRooms.childNodes[i]; if (xmlRoom.tagName) { var oRoom = new ChatRoom(xmlRoom); if (oRoom.isPublisher) this.publisherRooms.Add(oRoom.id, oRoom); else this.publicRooms.Add(oRoom.id, oRoom); } } }; this._shutdownProviders = function(bReinit) { if (!this.providersHash) return; var oProvider = null; for (var i = 0; i < this.providersHash.IndexerArray.length; i++) { oProvider = this.providersHash.IndexerArray[i]; oProvider.shutdown(bReinit); } }; this._registerRoomsToProviders = function() { if (!this.isLoaded) return; this._clearRoomsInProviders(); //add rooms to providers var oRoom = null; if (this.publisherRooms) this._registerRoomsToProvidersHelper(this.publisherRooms); if (this.publicRooms) this._registerRoomsToProvidersHelper(this.publicRooms); }; this._clearRoomsInProviders = function() { if (!this.providersHash || this.providersHash.Count() == 0) return; for (var i = 0; i < this.providersHash.Count(); i++) this.providersHash.GetByIndex(i).clearRooms(); }; this._registerRoomsToProvidersHelper = function(hashRooms) { for (var i = 0; i < hashRooms.Count(); i++) { oRoom = hashRooms.GetByIndex(i); if (oRoom.providerRoomInfo) ChatProviderFactory.registerRoom(oRoom.providerRoomInfo.providerType, oRoom.providerRoomInfo.roomId, this.providersHash); } }; this._initProviders = function() { if (!this.providersHash) return; var oProvider = null; for (var i = 0; i < this.providersHash.Count(); i++) { oProvider = this.providersHash.GetByIndex(i); oProvider.init(this.mProvidersCallback, this.mThatChatManager); } }; } function ChatInfoRequest(strCTID, strLastUpdateTime, strUrl, bInvalidateCache, objCallback) { var REQUEST_STRING = "<CHAT_INFO_REQUEST><CTID>CT_ID</CTID><LAST_UPDATE_TIME>LUT</LAST_UPDATE_TIME>INVALIDATE_CACHE</CHAT_INFO_REQUEST>"; var POST_PARAM_NAME = "requestXML="; var INITIAL_LAST_UPDATE_TIME = "0001-01-01T00:00:00"; var INVALIDATE_CAHCE_TAG = "<IC>TRUE</IC>"; //public properties this.callback = objCallback; this.url = strUrl; this.postParams = ""; this._init = function() { if (!strLastUpdateTime) strLastUpdateTime = INITIAL_LAST_UPDATE_TIME; var invalidateCacheAlias = (bInvalidateCache) ? INVALIDATE_CAHCE_TAG : ""; var reqString = REQUEST_STRING.replace(/CT_ID/, strCTID); reqString = reqString.replace(/LUT/, strLastUpdateTime); reqString = reqString.replace(/INVALIDATE_CACHE/, invalidateCacheAlias); this.postParams = POST_PARAM_NAME + encodeURIComponent(reqString); }; this._init(); }; ChatInfoRequest.prototype = new BaseServerRequest(); function ChatProviderRoomInfo(xmlProviderRoomInfo) { this.providerType = ''; this.roomId = ''; this.init = function(xmlProviderRoomInfo) { var xmlChildNode = null; for (var i = 0; i < xmlProviderRoomInfo.childNodes.length; i++) { xmlChildNode = xmlProviderRoomInfo.childNodes[i]; switch (xmlChildNode.tagName) { case "PROVIDER_TYPE": this.providerType = XML.GetXmlNodeValue(xmlChildNode); break; case "PROVIDER_ROOM_ID": this.roomId = XML.GetXmlNodeValue(xmlChildNode); break; } } }; this.init(xmlProviderRoomInfo); } //************ Base Chat provider ****************** function ChatProvider() { this.mPref = null; this.prefPrefix = ""; this.defaultInterval = 60; this.roomIdsArr = new Array(); this.type = ''; this.participantsCountService = { url: '', intervalSec: 0 }; this.addRoom = function(providerRoomId) { this.roomIdsArr.push(providerRoomId); }; this.getLastCheckTime = function() { return this.mPref.GetPref(this.prefPrefix + ChatPrefConsts.ServerLastCheckTime, true); }; this.getLastResponseTime = function() { return this.mPref.GetPref(this.prefPrefix + ChatPrefConsts.ServerLastResponseTime, true); }; this.init = function(oCallback) { //implement in subclass }; this.shutdown = function(bReinit) { //implement in subclass }; this.clearRooms = function() { this.roomIdsArr = new Array(); }; } var ChatProviderFactory = { getProvider: function(xmlProvider, oPref) { var strChatProvider = XML.GetSingleNodeValue(xmlProvider, "PROVIDER_TYPE"); if (!strChatProvider) return null; switch (strChatProvider.toUpperCase()) { case "MEEBO": return new ChatProviderMeebo(xmlProvider, oPref); default: return null; } }, registerRoom: function(strProviderType, strProviderRoomId, providersHash) { var oProvider = providersHash.GetByID(strProviderType); if (oProvider) oProvider.addRoom(strProviderRoomId); } } ///<reference path="ChatProvider.js" /> ///<reference path="..\..\..\CommonFunctions\utilities.js" /> //************ Meebo Chat provider ****************** function ChatProviderMeebo(xmlProvider, oPref) { this.mPref = oPref; this.mNewDataCallback = null; this.mThatDataCallback = null; this.mRequestUrl = ""; var minInterval = 60; //minimum interval in seconds //pointers to internal thread this.mThread_ServerCheck = null; this.mThread_DefineCheckInterval = null; this.mThread_CheckInetvalRef = null; this.mThread_CheckIsValidData = null; this._init = function(xmlProvider) { var xmlNode = null; for (var i = 0; i < xmlProvider.childNodes.length; i++) { xmlNode = xmlProvider.childNodes[i]; if (xmlNode.tagName) { switch (xmlNode.tagName.toUpperCase()) { case "PROVIDER_TYPE": this.type = XML.GetXmlNodeValue(xmlNode); break; case "PARTICIPANTS_COUNT_SERVICE": this._parseParticipantsCountService(xmlNode); break; } } } this.prefPrefix = ChatPrefConsts.ChatPrefix + this.type + "."; }; this._parseParticipantsCountService = function(xmlCountService) { var xmlNode = null; for (var i = 0; i < xmlCountService.childNodes.length; i++) { xmlNode = xmlCountService.childNodes[i]; if (xmlNode.tagName) { switch (xmlNode.tagName.toUpperCase()) { case "API_URL": this.participantsCountService.url = XML.GetXmlNodeValue(xmlNode); break; case "API_QUERY_INTERVAL_IN_SECONDS": var strInterval = XML.GetXmlNodeValue(xmlNode); this.participantsCountService.intervalSec = (strInterval) ? parseInt(strInterval) : this.defaultInterval; if (this.participantsCountService.intervalSec < minInterval) this.participantsCountService.intervalSec = minInterval; break; } } } } this.init = function(oCallback, thatCallback) { this.mNewDataCallback = oCallback; this.mThatDataCallback = thatCallback; var iNextCheck = this._getNextCheckInterval(); this._createRequestUrl(); var self = this; this.mThread_ServerCheck = setTimeout(function() { self._serverRequest(); }, iNextCheck); this.mThread_DefineCheckInterval = setTimeout(function() { self._defineCheckInterval(); }, iNextCheck); }; this.shutdown = function(bReinit) { clearTimeout(this.mThread_ServerCheck); clearTimeout(this.mThread_DefineCheckInterval); clearInterval(this.mThread_CheckInetvalRef); clearInterval(this.mThread_CheckIsValidData); this.roomIdsArr = new Array(); if (bReinit) this.mPref.SetPref(this.prefPrefix + ChatPrefConsts.ServerLastCheckTime, "", true); }; this._createRequestUrl = function() { this.mRequestUrl = this.participantsCountService.url + "&num=" + this.roomIdsArr.length; for (var i = 0; i < this.roomIdsArr.length; i++) this.mRequestUrl += "&" + parseInt(i + 1) + "node=" + this.roomIdsArr[i]; }; this._getNextCheckInterval = function() { var strLastCheckTime = this.getLastCheckTime(); var iLastCheckTime = Date.parse(strLastCheckTime); //never checked, interval 0 - immidiate check if (!iLastCheckTime) return 0; var iNow = Date.parse(Date()); //check interval in ms var iCheckIntervalMS = this.participantsCountService.intervalSec * 1000; var iNextCheckIntervalMS = iLastCheckTime + iCheckIntervalMS - iNow; //next check interval is passed, check immidiatly if (iNextCheckIntervalMS <= 0) return 0; else return iNextCheckIntervalMS; }; this._defineCheckInterval = function() { var self = this; this.mThread_CheckInetvalRef = setInterval(function() { self._serverRequest(); }, this.participantsCountService.intervalSec * 1000); this.mThread_CheckIsValidData = setInterval(function() { self._checkIsValidData(); }, this.participantsCountService.intervalSec * 1000 * 2); }; this._checkIsValidData = function() { var strDateTimeLastResponse = this.mPref.GetPref(this.prefPrefix + ChatPrefConsts.ServerLastResponseTime, true); if (!strDateTimeLastResponse) this.mNewDataCallback.call(this.mThatDataCallback, this.type, null); var iLastResponse = Date.parse(strDateTimeLastResponse); var iNow = Date.parse(Date()); if (iNow - iLastResponse > this.participantsCountService.intervalSec * 1000 * 2) this.mNewDataCallback.call(this.mThatDataCallback, this.type, null); }; this._serverRequest = function() { var self = this; var objRequest = new Object(); objRequest.url = this.mRequestUrl; objRequest.callback = function(strResponse) { self._serverResponse(strResponse) }; objRequest.postParams = null; //set last check time to now this.mPref.SetPref(this.prefPrefix + ChatPrefConsts.ServerLastCheckTime, Date(), true); EBServerDataURL.ServiceRequest(objRequest); }; this._serverResponse = function(strResponse) { //set last response time to now this.mPref.SetPref(this.prefPrefix + ChatPrefConsts.ServerLastResponseTime, Date(), true); var roomsHash = this._createRoomsInfo(strResponse); if (roomsHash) this.mNewDataCallback.call(this.mThatDataCallback, this.type, roomsHash); }; this._createRoomsInfo = function(strJson) { if (!strJson || strJson.length <= 0) return null; var objData = JSON.parse(strJson); if (!objData || objData.stat != "ok") return null; var hashRooms = new HashArray(); for (var i = 0; i < objData.data.length; i++) hashRooms.Add(objData.data[i].node, new ProviderRoomData(objData.data[i].node, objData.data[i].participants)); return hashRooms; }; this._init(xmlProvider); }; ChatProviderMeebo.prototype = new ChatProvider(); ///<reference path="ChatProviderRoomInfo.js" /> function ChatRoom(xmlRoom) { this.type = ''; this.isPublisher = false; this.id = 0; this.url = ''; this.name = ''; this.iconUrl = ''; this.providerRoomInfo = null; this.init = function(xmlRoom) { var xmlChildNode = null; for (var i = 0; i < xmlRoom.childNodes.length; i++) { xmlChildNode = xmlRoom.childNodes[i]; if (xmlChildNode.tagName) { switch (xmlChildNode.tagName.toUpperCase()) { case "TYPE": this.type = XML.GetXmlNodeValue(xmlChildNode); if (this.type && this.type.toUpperCase() == "PUBLISHER") this.isPublisher = true; break; case "ROOM_ID": this.id = XML.GetXmlNodeValue(xmlChildNode); break; case "URL": this.url = XML.GetXmlNodeValue(xmlChildNode); break; case "NAME": this.name = XML.GetXmlNodeValue(xmlChildNode); break; case "ICON_URL": this.iconUrl = XML.GetXmlNodeValue(xmlChildNode); break; case "PROVIDER_INFO": this.providerRoomInfo = new ChatProviderRoomInfo(xmlChildNode); break; default: break; } } } } this.init(xmlRoom); } //Conduit chat server data object function ConduitChatServerData(strOriginalCTID, strCurrentCTID, strServerUrl, iCheckInterval) { this.originalCTID = strOriginalCTID; this.currentCTID = strCurrentCTID; this.serverUrl = strServerUrl; this.checkInterval = iCheckInterval; this.equalsTo = function(oConduitChatServerData) { if (!(oConduitChatServerData instanceof ConduitChatServerData)) return false; if (oConduitChatServerData.originalCTID != this.originalCTID || oConduitChatServerData.currentCTID != this.currentCTID || oConduitChatServerData.serverUrl != this.serverUrl || oConduitChatServerData.checkInterval != this.checkInterval) return false; else return true; }; }; //Rooms hash is HashArray(providerRoomsId, numberOfParticipants) function ProviderRoomsData(strProviderId, oPref) { this.providerId = strProviderId; this.roomsDataHash; this.arrRooms; this.totalCount = 0; this.prefPrefix = ChatPrefConsts.ChatPrefix + this.providerId + ".rooms."; this.mPref = oPref; this.loadFromPrefs = function(arrRoomsIds, strLastCheckTime, iCheckInterval) { this.arrRooms = arrRoomsIds; this.roomsDataHash = new HashArray(); this.totalCount = 0; var strPrefName = ""; var iParticipantsCount = 0; var iIntervalFromLastCheckTime = Date.parse(Date()) - Date.parse(strLastCheckTime); var bInvalidateCount = (iIntervalFromLastCheckTime > iCheckInterval + 10) ? true : false; //get rooms participants from prefs if (!bInvalidateCount) { for (var i = 0; i < arrRoomsIds.length; i++) { strPrefName = this.prefPrefix + arrRoomsIds[i]; iParticipantsCount = this.mPref.GetPref(strPrefName, true); this.totalCount += iParticipantsCount; this.roomsDataHash.Add(arrRoomsIds[i], new ProviderRoomData(arrRoomsIds[i], iParticipantsCount)); } } //outdated rooms participants data in prefs else this.invalidateCount(); }; this.load = function(roomsDataHash) { this.roomsDataHash = roomsDataHash; this._calculateTotal(); }; this.invalidateCount = function() { for (var i = 0; i < this.arrRooms.length; i++) this.roomsDataHash.Add(this.arrRooms[i], new ProviderRoomData(this.arrRooms[i], null)); this.totalCount = null; }; this.saveToPrefs = function() { if (!this.roomsDataHash) return; var strPrefName = ""; var objProviderRoomData = null; for (var i = 0; i < this.roomsDataHash.Count(); i++) { objProviderRoomData = this.roomsDataHash.GetByIndex(i); strPrefName = this.prefPrefix + objProviderRoomData.providerRoomId; this.mPref.SetPref(strPrefName, objProviderRoomData.participants, true); } }; this._calculateTotal = function() { this.totalCount = 0; for (var i = 0; i < this.roomsDataHash.Count(); this.totalCount += this.roomsDataHash.GetByIndex(i).participants, i++); }; }; //provider room data structure function ProviderRoomData(providerRoomId, participants) { this.providerRoomId = providerRoomId; this.participants = participants; }; ///<reference path="..\..\CommonFunctions\XML.js" /> ///<reference path="..\..\CommonFunctions\Hash.js" /> ///<reference path="..\..\CommonFunctions\ConsoleLogging.js" /> ///<reference path="..\..\CommonFunctions\ServerCommunications.js" /> ///<reference path="..\..\CommonFunctions\utilities.js" /> ///<reference path="..\..\CommonFunctions\IO\IO.js" /> ///<reference path="..\..\CommonFunctions\Prefs\Prefs.js" /> ///<reference path="DataStructures\ChatInfo.js" /> //main component function ConduitChat() { this.mConduitChatServerData = null; this.mChatInfo = null; this.mChatServerManager = null; this.mPref = null; this.mIO = null; this.mProvidersRoomsDataHash = null; this.observersTopic = "EBChat"; var reInit = false; var invalidateCache = false; this.init = function(strOriginalCTID, strCurrentCTID, strServerUrl, iCheckInterval) { //chat initialized if (this.mConduitChatServerData) { //by the same data var oConduitChatServerData = new ConduitChatServerData(strOriginalCTID, strCurrentCTID, strServerUrl, iCheckInterval); //another current ctid initilized the toolbar or toolbar refreshed - reInit if (!this.mConduitChatServerData.equalsTo(oConduitChatServerData) || reInit) this.shutdown(strOriginalCTID, strCurrentCTID, reInit); else return; } //create IO objects this._initIO(strOriginalCTID, strCurrentCTID); //create this toolbar pair server data (original CTID, current CTID) this.mConduitChatServerData = new ConduitChatServerData(strOriginalCTID, strCurrentCTID, strServerUrl, iCheckInterval); //load chat info from file this.mChatInfo = new ChatInfo(this.mIO, this.mPref, this._onProviderResponse, this); this.mChatInfo.loadFromFile(); this._loadProvidersRoomsData(); //create and init chat server manager this.mChatServerManager = new ChatServerManager(this.mConduitChatServerData, this.mChatInfo.lastUpdateTime, this.mPref, this._onChatInfoChange, this); this.mChatServerManager.init(reInit || !this.mChatInfo.isLoaded, invalidateCache); }; this.shutdown = function(strOriginalCTID, strCurrentCTID, bReinit) { if (this.mChatServerManager) this.mChatServerManager.shutdown(); if (this.mChatInfo) this.mChatInfo.shutdown(bReinit); }; //this function will be called before init this.onToolbarRefresh = function(bInvalidateCache) { reInit = true; invalidateCache = bInvalidateCache; }; this.reInit = function(bInvalidateCache) { this.onToolbarRefresh(bInvalidateCache); this.init(this.mConduitChatServerData.originalCTID, this.mConduitChatServerData.currentCTID, this.mConduitChatServerData.serverUrl, this.mConduitChatServerData.checkInterval); }; this.getRoomsInfo = function() { if (!this.mChatInfo || !this.mChatInfo.isLoaded) return null; var publisherRooms = (this.mChatInfo.publisherRooms && this.mChatInfo.publisherRooms.Count() > 0) ? this.mChatInfo.publisherRooms : null; var publicRooms = (this.mChatInfo.publicRooms && this.mChatInfo.publicRooms.Count()) ? this.mChatInfo.publicRooms : null; return { "publisherRooms": publisherRooms, "publicRooms": publicRooms }; }; this.getProviderRoomsInfo = function(strProviderId) { if (!this.mProvidersRoomsDataHash) return null; if (!this.mProvidersRoomsDataHash.Contains(strProviderId)) return null; var oProviderRoomsData = this.mProvidersRoomsDataHash.GetByID(strProviderId); return { "rooms": oProviderRoomsData.roomsDataHash, "total": oProviderRoomsData.totalCount}; }; this.getProvidersRoomsInfo = function() { return this.mProvidersRoomsDataHash; }; this.getAllProvidersParticipantsCount = function() { var iCount = 0; if (this.mProvidersRoomsDataHash && this.mProvidersRoomsDataHash.Count() > 0) { for (var i = 0; i < this.mProvidersRoomsDataHash.Count(); i++) iCount += this.mProvidersRoomsDataHash.GetByIndex(i).totalCount; } else iCount = -1; return iCount; }; this._initIO = function(strOriginalCTID, strCurrentCTID) { this.mPref = new PrefManager(strOriginalCTID, strCurrentCTID); this.mIO = new IO(strOriginalCTID, strCurrentCTID); }; this._loadProvidersRoomsData = function() { if (!this.mChatInfo.isLoaded || !this.mChatInfo.providersHash) { return; } this.mProvidersRoomsDataHash = new HashArray(); var oProviderRoomData = null; var oProvider = null; for (var i = 0; i < this.mChatInfo.providersHash.IndexerArray.length; i++) { oProvider = this.mChatInfo.providersHash.IndexerArray[i]; oProviderRoomData = new ProviderRoomsData(oProvider.type, this.mPref); oProviderRoomData.loadFromPrefs(oProvider.roomIdsArr, oProvider.getLastResponseTime(), this.mConduitChatServerData.checkInterval); this.mProvidersRoomsDataHash.Add(oProvider.type, oProviderRoomData); } }; //this function is called from chat server manager when new chat info received this._onChatInfoChange = function(xmlChatInfoRoot) { this.mChatInfo.loadFromXmlAndSave(xmlChatInfoRoot); this._loadProvidersRoomsData(); }; //this function is called from provider server response this._onProviderResponse = function(strProviderId, hashRoomsData) { this._saveProviderResponse(strProviderId, hashRoomsData); }; this._saveProviderResponse = function(strProviderId, hashRoomsData) { var oProviderRoomsData = this.mProvidersRoomsDataHash.GetByID(strProviderId); if (hashRoomsData) { oProviderRoomsData.load(hashRoomsData); oProviderRoomsData.saveToPrefs(); } else oProviderRoomsData.invalidateCount(); //notify observers notifyObservers(null, this.observersTopic, this.mConduitChatServerData.currentCTID); }; } ///<reference path="..\..\CommonFunctions\XML.js" /> ///<reference path="..\..\CommonFunctions\Hash.js" /> ///<reference path="..\..\CommonFunctions\ConsoleLogging.js" /> ///<reference path="..\..\CommonFunctions\ServerCommunications.js" /> ///<reference path="..\..\CommonFunctions\utilities.js" /> ///<reference path="..\..\CommonFunctions\IO\IO.js" /> ///<reference path="..\..\CommonFunctions\Prefs\Prefs.js" /> //Conduit chat server manager function ChatServerManager(objChatServerData, strLastUpdateTime, oPref, oDataChangedCallback, thatChatManager) { this.mChatServerData = objChatServerData; this.mPref = oPref; this.mLastUpdateTime = strLastUpdateTime; this.mDataChangedCallback = oDataChangedCallback; this.mThatChatManager = thatChatManager; var invalidateCache = false; //pointers to internal thread this.mThread_ServerCheck = null; this.mThread_DefineCheckInterval = null; this.mThread_CheckInetvalRef = null; this.init = function(bForceCheck, bInvalidateCache) { invalidateCache = bInvalidateCache; if (bForceCheck) this.mLastUpdateTime = ""; var iNextCheck; if (!this.mLastUpdateTime) iNextCheck = 0; else iNextCheck = this._getNextCheckInterval(); var self = this; this.mThread_ServerCheck = setTimeout(function() { self._serverRequest(); }, iNextCheck); this.mThread_DefineCheckInterval = setTimeout(function() { self._defineCheckInterval(); }, iNextCheck); }; this.shutdown = function() { clearTimeout(this.mThread_ServerCheck); clearTimeout(this.mThread_DefineCheckInterval); clearInterval(this.mThread_CheckInetvalRef); }; this._getNextCheckInterval = function() { var strLastCheckTime = this.mPref.GetPref(ChatPrefConsts.ChatPrefix + ChatPrefConsts.ServerLastCheckTime, true); var iLastCheckTime = Date.parse(strLastCheckTime); //never checked, interval 0 - immidiate check if (!iLastCheckTime) { this.mLastUpdateTime = null; return 0; } var iNow = Date.parse(Date()); //check interval in ms var iCheckIntervalMS = this.mChatServerData.checkInterval * 60 * 1000; var iNextCheckIntervalMS = iLastCheckTime + iCheckIntervalMS - iNow; //next check interval is passed, check immidiatly if (iNextCheckIntervalMS <= 0) return 0; else return iNextCheckIntervalMS; }; this._defineCheckInterval = function() { var self = this; this.mThread_CheckInetvalRef = setInterval(function() { self._serverRequest(); }, this.mChatServerData.checkInterval * 60 * 1000); }; this._serverRequest = function() { var self = this; var objRequest = new ChatInfoRequest(this.mChatServerData.currentCTID, this.mLastUpdateTime, this.mChatServerData.serverUrl, invalidateCache, function(strResponse) { self._serverResponse(strResponse); }); //set last check time to now this.mPref.SetPref(ChatPrefConsts.ChatPrefix + ChatPrefConsts.ServerLastCheckTime, Date(), true); EBServerDataURL.ServiceRequest(objRequest); //use invalidate cache only for one request invalidateCache = false; }; this._serverResponse = function(strResponse) { if (!strResponse) return; var xmlResponse = XML.GetXmlDocument(strResponse); var bIsModified = XML.GetSingleNodeValueAsBoolean(xmlResponse, "MODIFIED"); if (!bIsModified) return; this.mLastUpdateTime = XML.GetSingleNodeValue(xmlResponse, "LAST_UPDATE_TIME"); this.mDataChangedCallback.call(this.mThatChatManager, xmlResponse.documentElement); }; }; function Defaults_ImageData(xmlImage) { this.originalPath; this.localPath; this.init = function(xmlImage) { this.originalPath = XML.GetSingleNodeValue(xmlImage, "original_path"); this.localPath = XML.GetSingleNodeValue(xmlImage, "local_file_path"); }; if(xmlImage) this.init(xmlImage); }; function DefaultsManager(chromeName, originalCTID) { this.defaultsFolder = "chrome://" + chromeName + "/skin/defaults/"; this.manifestFileName = "manifest.xml"; this.settingsFilePath = ""; this.imagesHash = null; this.isInit = false; this.isImagesInit = false; this.isSettingsInit = false; this.checkIcon = function(xulElement) { //lazy init if (!this.isInit) this.init(); if (!this.isImagesInit) return; var strImageUrl = ""; if (xulElement.tagName == "image") strImageUrl = xulElement.getAttribute("src"); else strImageUrl = xulElement.getAttribute("image"); //if no icon defined, nothing to check if (!strImageUrl) return; //find if icon is in defaults, if not, return var strFullLocalPath = this.checkFileAndGetFullPath(strImageUrl); if (!strFullLocalPath) return; xulElement.setAttribute("image", strFullLocalPath); }; this.getImageUrl = function(strImageUrl) { //lazy init if (!this.isInit) this.init(); if (!this.isImagesInit) return strImageUrl; var strFullLocalPath = this.checkFileAndGetFullPath(strImageUrl); if (strFullLocalPath) return strFullLocalPath; else return strImageUrl; }; this.checkFileAndGetFullPath = function(strIconUrl) { if (!this.imagesHash || this.imagesHash.Count() == 0 || !this.imagesHash.Contains(strIconUrl)) return ""; var strLocalPath = this.imagesHash.GetByID(strIconUrl); if (strLocalPath) return this.defaultsFolder + strLocalPath.replace(/\\/g, "/"); else return ""; }; this.getAndCopySettingsFile = function() { //lazy init if (!this.isInit) this.init(); if (!this.isSettingsInit) return null; var xmlSettings = XML.GetXmlDocumentFromUrl(this.defaultsFolder + this.settingsFilePath); var oFile = null; oFile = this.copySettingsFile(xmlSettings); return xmlSettings; }; //copy the settings file from defaults and delete it in defaults this.copySettingsFile = function(xmlSettings) { try { var strSettings = XML.GetStringXml(xmlSettings); var oIO = new IO(originalCTID, originalCTID); oIO.writeToolbarFile(strSettings, ToolbarManagerConst.settingsFilename, false); } catch (e) { return null; } }; this.getManifestXml = function() { var xmlManifest = XML.GetXmlDocumentFromUrl(this.defaultsFolder + this.manifestFileName); return xmlManifest; }; this.init = function() { this.isInit = true; var xmlDoc = this.getManifestXml(); if (!xmlDoc) return; var xmlSettings = XML.SelectSingleNode(xmlDoc, "settings"); var xmlImages = XML.SelectSingleNode(xmlDoc, "images"); this.initSettings(xmlSettings); this.initImages(xmlImages); }; this.initSettings = function(xmlSettings) { if (!xmlSettings) return; this.settingsFilePath = XML.GetSingleNodeValue(xmlSettings, "local_file_path"); this.isSettingsInit = true; }; this.initImages = function(xmlImages) { this.imagesHash = new HashArray(); if (!xmlImages || xmlImages.childNodes.length == 0) return; var arrImages = xmlImages.getElementsByTagName("image"); var oImageData = null; for (var i = 0; i < arrImages.length; i++) { oImageData = new Defaults_ImageData(arrImages[i]); this.imagesHash.Add(oImageData.originalPath, oImageData.localPath); } this.isImagesInit = true; }; }; var DefaultsXPCOM = { hashManagers: new HashArray(), getManager: function(chromeName, originalCTID) { var manager = null; if (!this.hashManagers.Contains(chromeName)) { manager = new DefaultsManager(chromeName, originalCTID); this.hashManagers.Add(chromeName, manager); } else manager = this.hashManagers.GetByID(chromeName); return manager; } }; /* function AccountData() { }*/ /* ///<reference path="..\..\CommonFunctions\XML.js" /> ///<reference path="..\..\CommonFunctions\Hash.js" /> ///<reference path="..\..\CommonFunctions\ConsoleLogging.js" /> ///<reference path="..\..\CommonFunctions\ServerCommunications.js" /> ///<reference path="..\..\CommonFunctions\utilities.js" /> ///<reference path="..\..\CommonFunctions\IO\IO.js" /> ///<reference path="..\..\CommonFunctions\Prefs\Prefs.js" /> function EmailNotifierManager() { var oPref = null; var oIO = null; var isInit = false; var objBrowser = null; this.init = function(strOriginalCTID) { if (isInit) return; isInit = true; objBrowser = new Components.classes["@mozilla.org/embedding/browser/nsWebBrowser;1"]; //.createInstance(Components.interfaces.nsIWebBrowser); //alert(objBrowser.loadURI); }; var _init = function(strOriginalCTID) { }; }; */function FacebookConsts() { this.observer = new Object(); this.observer.topic = "EBFacebookTopic"; this.observer.loggedIn = "logged in"; this.observer.logout = "logout"; this.observer.addStar = "add star"; this.observer.removeStar = "remove star"; this.observer.dynamicMenuReady = "dynamic-menu-ready"; this.FB_APP_API_KEY = "f1fd4cc78e14014efe6c7a5de6c12d3a"; this.FB_APP_SECRET = "033953958cd0adf2b265bfd247f36f9a"; this.FB_API_VER = "1.0"; this.FB_URL = "http://www.facebook.com"; this.prefix = "CommunityToolbar.facebook", this.tokenPref = "token"; this.sessionKeyPref = "sessionKey"; this.sessionSecretPref = "sessionSecret"; this.userIdPref = "userId"; this.settingsLastCheckTime = "settingsLastCheckTime"; this.settingsServiceUrl = "settingsServiceUrl"; this.settingsDefaultUrl = "http://facebook.conduit-services.com/Settings.ashx?locale=[LOCALE]&browserType=[BROWSER_TYPE]&toolbarVersion=[TOOLBAR_VERSION]"; this.fbAlerts = new Object(); this.fbAlerts.prefix = "CommunityToolbar.facebook.alerts"; this.fbAlerts.enabled = "enabled"; this.fbAlerts.friendReqEnabled = "friendReqEnabled"; this.fbAlerts.inboxEnabled = "inboxEnabled"; this.fbAlerts.groupsEnabled = "groupsEnabled"; this.fbAlerts.eventsEnabled = "eventsEnabled"; this.fbAlerts.newsFeedsEnabled = "newsFeedsEnabled"; this.settingsDialogPath = "chrome://iobitcom/content/fbSettings.xul"; // permissions this.PERM_READ_STREAM = "read_stream"; this.PERM_PUBLISH_STREAM = "publish_stream"; this.FB_PERM_STATUS_UPDATE = "status_update"; this.gadgetType = new Object(); this.gadgetType.login ="LOGIN"; this.gadgetType.getUpdateStatusPermission = "GET_UPDATE_STATUS_PERMISSION"; this.gadgetType.getReadMailboxPermission = "GET_READ_MAILBOX_PERMISSION"; this.gadgetType.updateStatusAfterGetPermission = "UPDATE_STATUS_AFTER_PERMISSION"; this.gadgetType.updateStatusWithoutAfterGetPermission = "UPDATE_STATUS"; this.gadgetType.share = "SHARE"; this.gadgetClosingType = new Object(); this.gadgetClosingType.close = "Close"; this.gadgetClosingType.cancel = "Cancel"; this.gadgetClosingType.success = "Success"; this.gadgetClosingType.clear = "Clear"; this.folder = "facebook"; this.dynamicMenuFilename = "menu-{0}.xml"; this.settingsFilename = "settings.xml"; }; function FacebookAlertsPermissions() { this.facebookAcceptAllCheck = null; this.facebookFriendReqCheck = null; this.facebookInboxCheck = null; this.facebookGroupsCheck = null; this.facebookEventsCheck = null; this.facebookNewFeedCheck = null; this.init = function(checkBoxStatus) { this.facebookAcceptAllCheck = checkBoxStatus.facebookAcceptAllCheck; this.facebookFriendReqCheck = checkBoxStatus.facebookFriendReqCheck; this.facebookInboxCheck = checkBoxStatus.facebookInboxCheck; this.facebookGroupsCheck = checkBoxStatus.facebookGroupsCheck; this.facebookEventsCheck = checkBoxStatus.facebookEventsCheck; this.facebookNewFeedCheck = checkBoxStatus.facebookNewFeedCheck; }; }; function FacebookRQ(serviceUrl, arrParams, objCallback, state) { this.callback = objCallback; this.url = serviceUrl; if (arrParams) this.postParams = arrParams.join("&"); this.state = state; };function FacebookSettingsDS() { this.facebookApiUrl = ""; this.notificationsIntervalMM = 0; this.newsFeedsIntervalMM = 0; this.gadget = new Object(); this.gadget.facebookSuccessUrl = null; this.gadget.facebookFailureUrl = null; this.gadget.facebookLoginUrl = null; this.gadget.facebookSharerUrl = null; this.gadget.facebookPermissionUrl = null; this.gadget.facebookGetNewsFeedPermission = null; this.gadget.facebookGetInboxPermission = null; this.gadget.facebookSetStatusPermission = null; this.gadget.facebookUpdateStatusUrl = null; this.gadget.facebookUpdateStatusHeight = null; this.gadget.facebookUpdateStatusWidth = null; this.gadget.facebookPermissionHeight = null; this.gadget.facebookPermissionWidth = null; this.gadget.facebookLoginHeight = null; this.gadget.facebookLoginWidth = null; this.gadget.facebookSharerHeight = null; this.gadget.facebookSharerWidth = null; this.gadget.facebookUpdateStatusParam = null; this.links = new Object(); this.links.facebookInboxUrl = null; this.links.facebookLogoutUrl = null; this.links.facebookProfileUrl = null; this.links.facebookGroupUrl = null; this.links.facebookEventUrl = null; this.links.facebookNewsFeedMoreUrl = null; this.requests = new Object(); this.requests.facebookRequestsUrl = null; this.requests.facebookReqFriend = null; this.requests.facebookReqGroup = null; this.requests.facebookReqEvent = null; this.images = new Object(); this.images.facebookInboxImgUrl = null; this.images.facebookFriendReqImgUrl = null; this.images.facebookGroupImgUrl = null; this.images.facebookEventImgUrl = null; this.images.facebookNewsFeedImgUrl = null; this.images.facebookAlertMainImgUrl = null; this.images.facebookDefaultProfileImgUrl = null; this.images.facebookDefaultEvenOrGroupImgUrl = null; this.checkBoxStatus = new Object(); this.checkBoxStatus.facebookAcceptAllCheck = null; this.checkBoxStatus.facebookFriendReqCheck = null; this.checkBoxStatus.facebookInboxCheck = null; this.checkBoxStatus.facebookGroupsCheck = null; this.checkBoxStatus.facebookEventsCheck = null; this.checkBoxStatus.facebookNewFeedCheck = null; this.init = function(xmlFBSettings, facebookItem) { var xmlNode = null; var innerNode = null; for (var i = 0; i < xmlFBSettings.childNodes.length; i++) { xmlNode = xmlFBSettings.childNodes[i]; switch (xmlFBSettings.childNodes[i].tagName) { case "API": this.facebookApiUrl = XML.GetSingleNodeValue(xmlNode, "URL"); break; case "NOTIFICATIONS": this.notificationsIntervalMM = XML.GetSingleNodeValueAsInteger(xmlNode, "INTERVAL_MM", 4); break; case "NEWS_FEED": this.newsFeedsIntervalMM = XML.GetSingleNodeValueAsInteger(xmlNode, "INTERVAL_MM", 4); break; case "GADGETS": this.gadget.facebookSuccessUrl = XML.GetSingleNodeValue(xmlNode, "SUCCESS_URL"); this.gadget.facebookFailureUrl = XML.GetSingleNodeValue(xmlNode, "FAILURE_URL"); for (var j = 0; j < xmlNode.childNodes.length; j++) { if (xmlNode.childNodes[j].tagName == 'LOGIN') { innerNode = xmlNode.childNodes[j]; break; } } this.gadget.facebookLoginUrl = XML.GetSingleNodeValue(innerNode, "URL"); this.gadget.facebookLoginHeight = XML.GetSingleNodeValueAsInteger(innerNode, "HEIGHT"); this.gadget.facebookLoginWidth = XML.GetSingleNodeValueAsInteger(innerNode, "WIDTH"); for (var j = 0; j < xmlNode.childNodes.length; j++) { if (xmlNode.childNodes[j].tagName == 'UPDATE_STATUS') { innerNode = xmlNode.childNodes[j]; break; } } this.gadget.facebookUpdateStatusUrl = XML.GetSingleNodeValue(innerNode, "URL"); this.gadget.facebookUpdateStatusParams = XML.GetSingleNodeValue(innerNode, "PARAMS"); this.gadget.facebookUpdateStatusHeight = XML.GetSingleNodeValueAsInteger(innerNode, "HEIGHT"); this.gadget.facebookUpdateStatusWidth = XML.GetSingleNodeValueAsInteger(innerNode, "WIDTH"); for (var j = 0; j < xmlNode.childNodes.length; j++) { if (xmlNode.childNodes[j].tagName == 'SHARER') { innerNode = xmlNode.childNodes[j]; break; } } this.gadget.facebookSharerUrl = XML.GetSingleNodeValue(innerNode, "URL"); this.gadget.facebookSharerHeight = XML.GetSingleNodeValueAsInteger(innerNode, "HEIGHT"); this.gadget.facebookSharerWidth = XML.GetSingleNodeValueAsInteger(innerNode, "WIDTH"); for (var j = 0; j < xmlNode.childNodes.length; j++) { if (xmlNode.childNodes[j].tagName == 'PERMISSION') { innerNode = xmlNode.childNodes[j]; break; } } this.gadget.facebookPermissionUrl = XML.GetSingleNodeValue(innerNode, "URL"); this.gadget.facebookPermissionHeight = XML.GetSingleNodeValueAsInteger(innerNode, "HEIGHT"); this.gadget.facebookPermissionWidth = XML.GetSingleNodeValueAsInteger(innerNode, "WIDTH"); for (var j = 0; j < innerNode.childNodes.length; j++) { if (innerNode.childNodes[j].tagName == 'TYPES') { innerNode = innerNode.childNodes[j]; break; } } this.gadget.facebookGetNewsFeedPermission = XML.GetSingleNodeValue(innerNode, "NEWS_FEED"); this.gadget.facebookGetInboxPermission = XML.GetSingleNodeValue(innerNode, "INBOX"); this.gadget.facebookSetStatusPermission = XML.GetSingleNodeValue(innerNode, "STATUS"); break; case "LINKS": this.links.facebookInboxUrl = XML.GetSingleNodeValue(xmlNode, "INBOX_URL"); this.links.facebookLogoutUrl = XML.GetSingleNodeValue(xmlNode, "LOGOUT_URL"); this.links.facebookProfileUrl = XML.GetSingleNodeValue(xmlNode, "PROFILE_URL"); this.links.facebookGroupUrl = XML.GetSingleNodeValue(xmlNode, "GROUP_URL"); this.links.facebookEventUrl = XML.GetSingleNodeValue(xmlNode, "EVENT_URL"); this.links.facebookNewsFeedMoreUrl = XML.GetSingleNodeValue(xmlNode, "NEWS_FEED_MORE_LINK"); break; case "REQUESTS": this.requests.facebookRequestsUrl = XML.GetSingleNodeValue(xmlNode, "URL"); for (var j = 0; j < xmlNode.childNodes.length; j++) { if (xmlNode.childNodes[j].tagName == 'TYPES') { innerNode = xmlNode.childNodes[j]; break; } } this.requests.facebookReqFriend = XML.GetSingleNodeValue(innerNode, "FRIEND"); this.requests.facebookReqGroup = XML.GetSingleNodeValue(innerNode, "GROUP"); this.requests.facebookReqEvent = XML.GetSingleNodeValue(innerNode, "EVENT"); break; case "IMAGES": this.images.facebookInboxImgUrl = XML.GetSingleNodeValue(xmlNode, "INBOX"); this.images.facebookFriendReqImgUrl = XML.GetSingleNodeValue(xmlNode, "FRIEND_REQ"); this.images.facebookGroupImgUrl = XML.GetSingleNodeValue(xmlNode, "GROUP"); this.images.facebookEventImgUrl = XML.GetSingleNodeValue(xmlNode, "EVENT"); this.images.facebookNewsFeedImgUrl = XML.GetSingleNodeValue(xmlNode, "NEWS_FEED"); this.images.facebookAlertMainImgUrl = XML.GetSingleNodeValue(xmlNode, "ALERT_MAIN"); this.images.facebookDefaultProfileImgUrl = XML.GetSingleNodeValue(xmlNode, "DEFAULT_PROFILE"); this.images.facebookDefaultEvenOrGroupImgUrl = XML.GetSingleNodeValue(xmlNode, "DEFAULT_GROUP_EVENT"); break; case "ALERTS_DEFAULTS": this.checkBoxStatus.facebookAcceptAllCheck = (facebookItem.facebookAcceptAllCheck == null) ? XML.GetSingleNodeValueAsBoolean(xmlNode, "ACCEPT_ALL") : facebookItem.facebookAcceptAllCheck; this.checkBoxStatus.facebookFriendReqCheck = (facebookItem.facebookFriendReqCheck == null) ? XML.GetSingleNodeValueAsBoolean(xmlNode, "FRIEND_REQUESTS") : facebookItem.facebookFriendReqCheck; this.checkBoxStatus.facebookInboxCheck = (facebookItem.facebookInboxCheck == null) ? XML.GetSingleNodeValueAsBoolean(xmlNode, "INBOX") : facebookItem.facebookInboxCheck; this.checkBoxStatus.facebookGroupsCheck = (facebookItem.facebookGroupsCheck == null) ? XML.GetSingleNodeValueAsBoolean(xmlNode, "GROUPS") : facebookItem.facebookGroupsCheck; this.checkBoxStatus.facebookEventsCheck = (facebookItem.facebookEventsCheck == null) ? XML.GetSingleNodeValueAsBoolean(xmlNode, "EVENTS") : facebookItem.facebookEventsCheck; this.checkBoxStatus.facebookNewFeedCheck = (facebookItem.facebookNewFeedCheck == null) ? XML.GetSingleNodeValueAsBoolean(xmlNode, "NEWS_FEED") : facebookItem.facebookNewFeedCheck; break; default: break; } } }; }; function FacebookSettingsRQ(strUrl, locale, version, objCallback) { this.url = ""; this.callback = objCallback; this.state = null; this.postParams = null; this.init = function() { this.url = strUrl.replace(/\[LOCALE\]/, locale).replace(/\[BROWSER_TYPE\]/, "FF").replace(/\[TOOLBAR_VERSION\]/, version); }; this.init(); };var FacebookXPCOM = { consts: new FacebookConsts(), facebookManager: null, init: function() { var that = this; this.__defineGetter__("manager", function() { if (!that.facebookManager) { that.facebookManager = new FacebookManager(); } return that.facebookManager; }); } }; FacebookXPCOM.init(); function FacebookAlertsManager(objPrefsFromSettings, lp, toolbarName) { var fbConsts = FacebookXPCOM.consts.fbAlerts; var oPrefs = new PrefManager(fbConsts.prefix); var _lpManager = lp; var _toolbarName = toolbarName; var settingsWindowName = "fbSettingsWindowName"; var aboutWindowName = "fbAboutWindowName"; var alertManager = AlertXPCOM.manager; var fbAlertJS = ""; var userId = null; var fbAlertHtmlTemplate = '{4}<div> <div style="font-family:Verdana; font-size: 10px; color: #7c99c5; margin-bottom:2px;">{0}</div> <table class="msgText"> <tr> <td valign="top" style="padding-right:5px;"><a {5} ><img src="{1}" alt="" border="0" style=\"max-width:50px; max-height:50px;\" onload="if(this.width > 50) this.width = 50;" /></a></td> <td valign="top" style="padding-right:5px;"><img src="{2}" alt="" border="0"/></td> <td valign="top" style="padding-top:0px;">{3}</td> </tr> </table> </div><script>if(typeof OnLoad!= "undefined") OnLoad();</script>'; var headerCssStyle = { "color": "#004498", "fontFamily": "Arial", "isBold": true }; this.__defineGetter__("enabled", function() { return oPrefs.GetPref(fbConsts.enabled, false, objPrefsFromSettings.checkBoxStatus.facebookAcceptAllCheck); }); this.__defineGetter__("friendReqEnabled", function() { return oPrefs.GetPref(fbConsts.friendReqEnabled, false, objPrefsFromSettings.checkBoxStatus.facebookFriendReqCheck); }); this.__defineGetter__("inboxEnabled", function() { return oPrefs.GetPref(fbConsts.inboxEnabled, false, objPrefsFromSettings.checkBoxStatus.facebookInboxCheck); }); this.__defineGetter__("groupsEnabled", function() { return oPrefs.GetPref(fbConsts.groupsEnabled, false, objPrefsFromSettings.checkBoxStatus.facebookGroupsCheck ); }); this.__defineGetter__("eventsEnabled", function() { return oPrefs.GetPref(fbConsts.eventsEnabled, false, objPrefsFromSettings.checkBoxStatus.facebookEventsCheck); }); this.__defineGetter__("newsFeedsEnabled", function() {return oPrefs.GetPref(fbConsts.newsFeedsEnabled, false, objPrefsFromSettings.checkBoxStatus.facebookNewFeedCheck); }); this.__defineSetter__("userId", function(val) { userId = val; }); this.__defineSetter__("enabled", function(val) { oPrefs.SetPref(fbConsts.enabled, val); }); this.__defineSetter__("friendReqEnabled", function(val) { oPrefs.SetPref(fbConsts.friendReqEnabled, val); }); this.__defineSetter__("inboxEnabled", function(val) { oPrefs.SetPref(fbConsts.inboxEnabled, val); }); this.__defineSetter__("groupsEnabled", function(val) { oPrefs.SetPref(fbConsts.groupsEnabled, val); }); this.__defineSetter__("eventsEnabled", function(val) { oPrefs.SetPref(fbConsts.eventsEnabled, val); }); this.__defineSetter__("newsFeedsEnabled", function(val) { oPrefs.SetPref(fbConsts.newsFeedsEnabled, val); }); this.updateLanguagePackAndToolbarName = function(lp, toolbarName) { _lpManager = lp; _toolbarName = toolbarName; }; this.openSettingsDialog = function(win) { if (!win) win = getWindow(); var strParams = "chrome,dependent,modal,resizeable=no,titlebar=yes,centerscreen"; win.openDialog(FacebookXPCOM.consts.settingsDialogPath, settingsWindowName, strParams); }; var getFBAlertJSContent = function() { var oFile; oFile = __LOCATION__.clone().parent.parent; oFile.append("defaults"); oFile.append("fbAlert.js"); fbAlertJS = File.read(oFile); }; var getInnerALink = function(strUrl) { var strInnerALink = stringFormat(" href='{0}' class='ebLink msgText' ", strUrl); return strInnerALink; }; var getAlertHeader = function() { return _lpManager.GetByIDNL("CTLP_STR_ID_FACEBOOK_ALERT_HEADER").replace(/\[TOOLBAR_NAME\]/, _toolbarName); }; var fillUsersHash = function(arrUsers) { var userHash = new HashArray(); for (var i = 0; i < arrUsers.length; i++) userHash.Add(arrUsers[i].uid, arrUsers[i]); return userHash; }; /* var strJson = '('; strJson += ' [{"name":"Yuval Shahar","uid":885595556,"pic_square":"http:\/\/profile.ak.fbcdn.net\/object2\/1468\/44\/n191017999840_4686.jpg"},'; strJson += '{"name":"Omri Conduit","uid":100000224352922,"pic_square":"http:\/\/profile.ak.fbcdn.net\/v223\/641\/2\/q100000224352922_1895.jpg"},'; strJson += '{"name":"Yuval Shahar","uid":100000207559049,"pic_square":""}]'; strJson += '])'; */ var buildEventsOrGroupsAlerts = function(arrData, lpTitle, lpInner, url, urlAlias, innerAlias, iconUrl, idProperty) { var html = ""; var headerText = _lpManager.GetByIDNL(lpTitle); var titleImage = objPrefsFromSettings.images.facebookAlertMainImgUrl; var innerText = ""; var linkToEvent = ""; var data = null; for (var i = 0; i < arrData.length; i++) { data = arrData[i]; linkToEvent = url.replace(urlAlias, data[idProperty]); innerText = _lpManager.GetByIDNL(lpInner); innerText = innerText.replace(/EB_FB_LINK1/, getInnerALink(linkToEvent)); innerText = innerText.replace(innerAlias, data.name); html = stringFormat(fbAlertHtmlTemplate, getAlertHeader(), (data.pic_big) ? data.pic_big : objPrefsFromSettings.images.facebookDefaultEvenOrGroupImgUrl, iconUrl, innerText, "", ""); var guid = (idProperty == "gid") ? "FB_" + userId + "_GROUP_" + data[idProperty] : "FB_" + userId + "_EVENT_" + data[idProperty]; var alertItem = new AlertItem(headerText, headerCssStyle, titleImage, html, false, guid, true, null, objPrefsFromSettings.notificationsIntervalMM * 60); alertManager.sendInternalAlert(alertItem); } }; var buildUsersAlerts = function(users) { var html = ""; var headerText = _lpManager.GetByIDNL("CTLP_STR_ID_FACEBOOK_ALERT_FRIENDS_TITLE"); var titleImage = objPrefsFromSettings.images.facebookAlertMainImgUrl; var innerText = ""; var linkToUserProfile = ""; for (var i = 0; i < users.length; i++) { linkToUserProfile = objPrefsFromSettings.links.facebookProfileUrl.replace(/EB_FB_USER_ID/, users[i].uid); innerText = _lpManager.GetByIDNL("CTLP_STR_ID_FACEBOOK_ALERT_FRIENDS_HTML"); innerText = innerText.replace(/EB_FB_LINK1/, getInnerALink(linkToUserProfile)); innerText = innerText.replace(/EB_FB_USER_NAME/, users[i].name); innerText = innerText.replace(/EB_FB_LINK2/, getInnerALink(objPrefsFromSettings.requests.facebookRequestsUrl.replace(/EB_FB_REQ_TYPE/, objPrefsFromSettings.requests.facebookReqFriend))); html = stringFormat(fbAlertHtmlTemplate, getAlertHeader(), (users[i].pic_big) ? users[i].pic_big : objPrefsFromSettings.images.facebookDefaultProfileImgUrl, objPrefsFromSettings.images.facebookFriendReqImgUrl, innerText, "", getInnerALink(linkToUserProfile)); var guid = "FB_" + userId + "_FRIEND_" + users[i].uid; var alertItem = new AlertItem(headerText, headerCssStyle, titleImage, html, false, guid, true, null, objPrefsFromSettings.notificationsIntervalMM * 60); alertManager.sendInternalAlert(alertItem); } }; this.buildAlertsForMessages = function(json) { var html = ""; var headerText = _lpManager.GetByIDNL("CTLP_STR_ID_FACEBOOK_ALERT_INBOX_TITLE"); var titleImage = objPrefsFromSettings.images.facebookAlertMainImgUrl; var innerText = ""; var linkToUserProfile = ""; for (var i = 0; i < json.length; i++) { linkToUserProfile = objPrefsFromSettings.links.facebookProfileUrl.replace(/EB_FB_USER_ID/, json[i].uid); innerText = _lpManager.GetByIDNL("CTLP_STR_ID_FACEBOOK_ALERT_INBOX_HTML"); innerText = innerText.replace(/EB_FB_LINK1/, getInnerALink(linkToUserProfile)); innerText = innerText.replace(/EB_FB_USER_NAME/, json[i].name); innerText = innerText.replace(/EB_FB_LINK2/, getInnerALink(objPrefsFromSettings.links.facebookInboxUrl)); html = stringFormat(fbAlertHtmlTemplate, getAlertHeader(), (json[i].pic_square) ? json[i].pic_square : objPrefsFromSettings.images.facebookDefaultProfileImgUrl, objPrefsFromSettings.images.facebookInboxImgUrl, innerText, "", getInnerALink(linkToUserProfile)); var guid = "FB_" + userId + "_INBOX_" + json[i].uid; var alertItem = new AlertItem(headerText, headerCssStyle, titleImage, html, false, guid, true, null, objPrefsFromSettings.notificationsIntervalMM * 60); alertManager.sendInternalAlert(alertItem); } }; this.buildAlertsForUnreadMail = function(unreadNum) { var innerText = _lpManager.GetByIDNL("CTLP_STR_ID_FACEBOOK_ALERT_INBOX_GENERAL_HTML"); var titleImage = objPrefsFromSettings.images.facebookAlertMainImgUrl; var headerText = _lpManager.GetByIDNL("CTLP_STR_ID_FACEBOOK_ALERT_INBOX_TITLE"); innerText = innerText.replace(/EB_FB_LINK1/, getInnerALink(objPrefsFromSettings.links.facebookInboxUrl)); html = stringFormat(fbAlertHtmlTemplate, getAlertHeader(), "", objPrefsFromSettings.images.facebookInboxImgUrl, innerText, "", ""); var guid = "FB_" + userId + "_INBOX_NO_PERMISSION"; var alertItem = new AlertItem(headerText, headerCssStyle, titleImage, html, false, guid, true, null, objPrefsFromSettings.notificationsIntervalMM * 60); alertManager.sendInternalAlert(alertItem); }; /* var json3 = '('; json3 += '[{"name": "events", "fql_result_set": [{ "name": "lan party", "pic_big": "", "eid":"21323"},{ "name": "lan party22", "pic_big": "http:\/\/profile.ak.fbcdn.net\/object2\/1468\/44\/n191017999840_4686.jpg", "eid":"213223"}]},'; json3 += '{"name": "groups", "fql_result_set": [{ "name": "free me", "pic_big": "", "gid":"21323"},{ "name": "lan party123", "pic_big": "", "gid":"2133323"}]},'; json3 += '{"name": "users", "fql_result_set": [{ "name": "sami", "pic_big": ""},{ "name": "lan party1123", "pic_big": ""}]}] '; json3 += ')'; */ this.buildAlertsForNotifications = function(json) { for (var i = 0; i < json.length; i++) { switch (json[i].name) { case "events": buildEventsOrGroupsAlerts(json[i].fql_result_set, "CTLP_STR_ID_FACEBOOK_ALERT_EVENTS_TITLE", "CTLP_STR_ID_FACEBOOK_ALERT_EVENTS_HTML", objPrefsFromSettings.links.facebookEventUrl, "EB_FB_EVENT_ID", "EB_FB_EVENT_NAME", objPrefsFromSettings.images.facebookEventImgUrl, "eid"); break; case "groups": buildEventsOrGroupsAlerts(json[i].fql_result_set, "CTLP_STR_ID_FACEBOOK_ALERT_GROUPS_TITLE", "CTLP_STR_ID_FACEBOOK_ALERT_GROUPS_HTML", objPrefsFromSettings.links.facebookGroupUrl, "EB_FB_GROUP_ID", "EB_FB_GROUP_NAME", objPrefsFromSettings.images.facebookGroupImgUrl, "gid"); break; case "users": buildUsersAlerts(json[i].fql_result_set); break; default: break; } } }; /* var strJson2 = '('; strJson2 += '{"feeds":'; strJson2+= '[{"time":1254228879,"uid":885595556,"message":"bla bla http://www.zap.co.il/ sdfsdfsdf sdfsdfsdf sdfsdfasdf asdfasdf asdfasdfasd fasdfasdfasdf asdfasdfasdf asdfasdfasdf asdfasdfasdf sadfasdf asd fas asdf asd fasdf asdf"},'; strJson2+= '{"time":1253986091,"uid":885595556,"message":"bla bla 2 324234 vfsadf 3908098 qwerf 234`23rwerqwe wer3241234 qwerwer32 werqwer sdf"},'; strJson2+= '{"time":1253777984,"uid":885595556,"message":"bla bla 3"},'; strJson2+= '{"time":1253645741,"uid":885595556,"message":"bla bla 4"},'; strJson2+= '{"time":1253617715,"uid":100000224352922,"message":"bla bla 5"}] ,'; strJson2+= '"users":'; strJson2+= '[{"name":"Yuval Shahar","uid":885595556,"pic_square":"http:\/\/profile.ak.fbcdn.net\/v227\/1975\/110\/q885595556_3433.jpg"},'; strJson2+= '{"name":"Omri Conduit","uid":100000224352922,"pic_square":"http:\/\/profile.ak.fbcdn.net\/v223\/641\/2\/q100000224352922_1895.jpg"}]}'; strJson2 += ')';*/ this.buildAlertsForNewFeeds = function(json) { if (!json.users || !json.feeds) return; if (!fbAlertJS) getFBAlertJSContent(); var userHash = fillUsersHash(json.users); var feed = null; var html = ""; var headerText = _lpManager.GetByIDNL("CTLP_STR_ID_FACEBOOK_ALERT_NEWS_FEED_TITLE"); var titleImage = objPrefsFromSettings.images.facebookAlertMainImgUrl; var innerText = ""; var linkToUserProfile = ""; var user = null; var localfbAlertJS = ""; for (var i = 0; i < json.feeds.length; i++) { feed = json.feeds[i]; user = userHash.GetByID(feed.uid); linkToUserProfile = objPrefsFromSettings.links.facebookNewsFeedMoreUrl.replace(/EB_FB_USER_ID/, feed.uid).replace(/EB_FB_NEWS_FEED_ID/, feed.status_id); //replace aliases in JS localfbAlertJS = stringFormat(fbAlertJS, _lpManager.GetByIDNL("CTLP_STR_ID_FACEBOOK_ALERT_MORE"), linkToUserProfile, 45, 187, 3); innerText = "<a EB_FB_LINK1>EB_FB_USER_NAME</a> EB_FB_STATUS_MESSAGE"; innerText = innerText.replace(/EB_FB_LINK1/, getInnerALink(linkToUserProfile)); innerText = innerText.replace(/EB_FB_USER_NAME/, user.name); var msg = "<span>" + feed.message.replace(/\s/g, "</span> <span>") + "</span>"; innerText = innerText.replace(/EB_FB_STATUS_MESSAGE/, msg); innerText = "<div id=\"mainDiv\" style=\"overflow:visible;\">" + innerText + "</div>"; html = stringFormat(fbAlertHtmlTemplate, getAlertHeader(), (user.pic_square) ? user.pic_square : objPrefsFromSettings.images.facebookDefaultProfileImgUrl, objPrefsFromSettings.images.facebookNewsFeedImgUrl, innerText, localfbAlertJS, getInnerALink(linkToUserProfile)); var guid = "FB_" + userId + "_NEWS_FEED_" + user.uid + "_" + feed.time; var alertItem = new AlertItem(headerText, headerCssStyle, titleImage, html, false, guid, true, objPrefsFromSettings.newsFeedsIntervalMM * 60); alertManager.sendInternalAlert(alertItem); } }; }; function FacebookManager() { var serviceManager = null; var hashSettingsManagers = new HashArray(); var hashDynamicMenusXml = new HashArray2(); var _alertsPermissions = null; this.facebookSettings = null; this.alertsManager = null; var idleObserver = null; var idleTimeoutSec = 60; this.isInit = false; this.isLoggedIn = false; this.isCheckInFirstTime = false; this.inboxUnreadNum = -1; this.friendsRequestNum = -1; this.groupsRequestNum = -1; this.eventsRequestNum = -1; this.userName = null; var isInboxNeedStar = false; var isEventNeedStar = false; var isFriendReqNeedStar = false; var isGroupNeedStar = false; var _lp = null; var _toolbarName = null; this.__defineGetter__("isStarred", function() { return isInboxNeedStar || isEventNeedStar || isFriendReqNeedStar || isGroupNeedStar; }); this.__defineSetter__("isStarred", function(val) { isInboxNeedStar = isEventNeedStar = isFriendReqNeedStar = isGroupNeedStar = val; if (!val) notifyObservers(null, FacebookXPCOM.consts.observer.topic, FacebookXPCOM.consts.observer.removeStar); }); var readMailPermission = false; var EventInvitesList = null; var FriendRequestsList = null; var GroupInvitesList = null; var nextLastKnownUnreadMsgUpdateTime = -1; var updateStatusPermissionCallBack; var getUserDataCallBack; var prefs = new PrefManager(FacebookXPCOM.consts.prefix, FacebookXPCOM.consts.prefix); var oIO = new IO(CommonData.ConduitFolder, CommonData.ConduitFolder); this.init = function() { var self = this; this.isInit = true; this.facebookSettings = this.loadSettings(); if (!this.facebookSettings) { var settingsManager = hashSettingsManagers.GetByIndex(0); settingsManager.request(true); this.isInit = false; return; } this.alertsManager = new FacebookAlertsManager(this.facebookSettings, _lp, _toolbarName); serviceManager = new FacebookServiceManager(function(res, method) { self.handleResponse(res, method); }, this.alertsManager, this.facebookSettings); this.loadPrefs(); this.registerIdleObserver(); this.checkPreConditions(); this.getUser(); }; this.register = function(facebookItem, lp, toolbarName, locale) { var self = this; //init settings manager if (!hashSettingsManagers.Contains(locale)) { var settingsManager = new FacebookSettingsManager(prefs, facebookItem.serviceIntervalSec, facebookItem.serviceUrl, locale, function(xmlRoot, locale) { self.onSettingsResponse(xmlRoot, locale); }); settingsManager.request(false); hashSettingsManagers.Add(locale, settingsManager); } if (!_alertsPermissions) { _alertsPermissions = new FacebookAlertsPermissions(); _alertsPermissions.init(facebookItem); _lp = lp; _toolbarName = toolbarName; } if (!hashDynamicMenusXml.Contains(locale)) { var xmlDynamicMenu = this.loadDynamicMenuXml(locale); if (xmlDynamicMenu) hashDynamicMenusXml.Add(locale, xmlDynamicMenu); //if no menu exists locally, force get it else { var settingsManager = hashSettingsManagers.GetByID(locale); if (settingsManager) settingsManager.request(true); this.isInit = false; return; } } if (!this.isInit) this.init(); }; this.updateLanguagePackAndToolbarName = function(lp, toolbarName) { this.alertsManager.updateLanguagePackAndToolbarName(lp, toolbarName); }; this.checkStatus = function() { if (this.isLoggedIn) notifyObservers(null, FacebookXPCOM.consts.observer.topic, FacebookXPCOM.consts.observer.loggedIn); else notifyObservers(null, FacebookXPCOM.consts.observer.topic, FacebookXPCOM.consts.observer.logout); }; this.checkPreConditions = function() { if (serviceManager.sessionKey && serviceManager.sessionSecret && serviceManager.userId) return true; return false; }; this.logout = function() { serviceManager.RequestForLogout(); this.cleanData(); }; this.cleanData = function() { serviceManager.shutdown(); //TODO: maybe shutdown settings services EventInvitesList = null; FriendRequestsList = null; GroupInvitesList = null; nextLastKnownUnreadMsgUpdateTime = -1; }; this.clearSessionData = function() { serviceManager.sessionKey = serviceManager.sessionSecret = serviceManager.userId=0; this.isLoggedIn = false; }; this.createToken = function() { serviceManager.Request('facebook.auth.createToken'); }; this.getUser = function() { this.isCheckInFirstTime = true; serviceManager.Request('facebook.users.getLoggedInUser'); }; this.getUserNameForFirstTime = function() { serviceManager.getUserNameForFirstTime(); }; this.setStatus = function(status) { serviceManager.Request('facebook.status.set', status); }; this.checkUpdateStatusPermission = function(callback) { updateStatusPermissionCallBack = callback; serviceManager.Request('facebook.users.hasAppPermission', this.facebookSettings.gadget.facebookSetStatusPermission, 'facebook.users.hasAppPermission.status'); }; this.checkReadMailPermission = function() { serviceManager.Request('facebook.users.hasAppPermission', this.facebookSettings.gadget.facebookGetInboxPermission, 'facebook.users.hasAppPermission.readMail'); }; this.getUserDataForUpdateStatus = function(callback) { getUserDataCallBack = callback; serviceManager.getUserDataForUpdateStatus(); }; this.clearPrefs = function() { if (prefs.HasUserValue(FacebookXPCOM.consts.sessionKeyPref)) prefs.Clear(FacebookXPCOM.consts.sessionKeyPref); if (prefs.HasUserValue(FacebookXPCOM.consts.sessionSecretPref)) prefs.Clear(FacebookXPCOM.consts.sessionSecretPref); if (prefs.HasUserValue(FacebookXPCOM.consts.userIdPref)) prefs.Clear(FacebookXPCOM.consts.userIdPref); }; this.loadPrefs = function() { if (prefs.HasUserValue(FacebookXPCOM.consts.sessionKeyPref)) serviceManager.sessionKey = prefs.GetPref(FacebookXPCOM.consts.sessionKeyPref); if (prefs.HasUserValue(FacebookXPCOM.consts.sessionSecretPref)) serviceManager.sessionSecret = prefs.GetPref(FacebookXPCOM.consts.sessionSecretPref); if (prefs.HasUserValue(FacebookXPCOM.consts.userIdPref)) serviceManager.userId = prefs.GetPref(FacebookXPCOM.consts.userIdPref); }; this.updateData = function(jasonObj) { serviceManager.sessionKey = jasonObj.session_key; prefs.SetPref(FacebookXPCOM.consts.sessionKeyPref, jasonObj.session_key); serviceManager.sessionSecret = jasonObj.secret; prefs.SetPref(FacebookXPCOM.consts.sessionSecretPref, jasonObj.secret); var userIdStr = jasonObj.uid.toString(); serviceManager.userId = userIdStr; prefs.SetPref(FacebookXPCOM.consts.userIdPref, userIdStr); }; this.updateNotifications = function(strJson) { var notificationsJsonObj = JSON.parse(strJson); if (!this.isResponseOk(notificationsJsonObj)) return; if (!notificationsJsonObj) return; this.inboxUnreadNum = notificationsJsonObj.messages.unread; this.eventsRequestNum = this.getNumFromList(notificationsJsonObj.event_invites); this.friendsRequestNum = this.getNumFromList(notificationsJsonObj.friend_requests); this.groupsRequestNum = this.getNumFromList(notificationsJsonObj.group_invites); var newInboxTime = notificationsJsonObj.messages.most_recent; if (newInboxTime > nextLastKnownUnreadMsgUpdateTime && nextLastKnownUnreadMsgUpdateTime > -1) isInboxNeedStar = true; else isInboxNeedStar = false; nextLastKnownUnreadMsgUpdateTime = notificationsJsonObj.messages.most_recent; if (!EventInvitesList) EventInvitesList = new Array(); else { serviceManager.getEventInvitesDeltaList = this.getDeltaList(notificationsJsonObj.event_invites, EventInvitesList); if (serviceManager.getEventInvitesDeltaList && serviceManager.getEventInvitesDeltaList.length > 0) isEventNeedStar = true; else isEventNeedStar = false; } EventInvitesList = notificationsJsonObj.event_invites; if (!FriendRequestsList) FriendRequestsList = new Array(); else { serviceManager.getFriendRequestsDeltaList = this.getDeltaList(notificationsJsonObj.friend_requests, FriendRequestsList); if (serviceManager.getFriendRequestsDeltaList && serviceManager.getFriendRequestsDeltaList.length > 0) isFriendReqNeedStar = true; else isFriendReqNeedStar = false; } FriendRequestsList = notificationsJsonObj.friend_requests; if (!GroupInvitesList) GroupInvitesList = new Array(); else { serviceManager.getGroupInvitesDeltaList = this.getDeltaList(notificationsJsonObj.group_invites, GroupInvitesList); if (serviceManager.getGroupInvitesDeltaList && serviceManager.getGroupInvitesDeltaList.length > 0) isGroupNeedStar = true; else isGroupNeedStar = false; } GroupInvitesList = notificationsJsonObj.group_invites; if (this.isStarred) notifyObservers(null, FacebookXPCOM.consts.observer.topic, FacebookXPCOM.consts.observer.addStar); }; this.getDeltaList = function(newList, oldList) { if (!newList.length) { oldList = null; return null; } if (!oldList) { oldList = newList; return newList; } var tmpArray = new Array(); for (var i = 0; i < newList.length; i++) { if (!this.isItemInList(newList[i],oldList)) tmpArray.push(newList[i]); } return tmpArray; }; this.isItemInList = function(item, list) { for (var i = 0; i < list.length; i++) { if (list[i] == item) return true; } return false; }; this.getDateToAlerts = function() { serviceManager.RequestDataForAlerts(); }; this.getNumFromList = function(StrList) { if (!StrList.length) return 0; return StrList.length; }; this.handleResponse = function(text, method) { switch (method) { case ('facebook.users.getLoggedInUser'): if (text == serviceManager.userId && this.checkPreConditions()) { this.isLoggedIn = true; serviceManager.initAlertRequests(); this.getUserNameForFirstTime(); this.alertsManager.userId = text; } else this.isLoggedIn = false; this.checkStatus(); break; case ('facebook.auth.createToken'): text = text.substr(1, text.length - 2); serviceManager.token = text; prefs.SetPref(FacebookXPCOM.consts.tokenPref, text); this.getUser(); break; case ('facebook.fql.getUserNameForFirstTime'): var nameObj = JSON.parse(text); if (!this.isResponseOk(nameObj)) return; this.userName = nameObj[0].name; break; case ('facebook.notifications.get'): this.updateNotifications(text); this.getDateToAlerts(); serviceManager.lastKnownUnreadMsgUpdateTime = nextLastKnownUnreadMsgUpdateTime; break; case ('facebook.alerts.data'): if (text) { var alertsJsonObj = JSON.parse(text); this.alertsManager.buildAlertsForNotifications(alertsJsonObj); } break; case ('facebook.logout'): this.clearSessionData(); this.clearPrefs(); this.checkStatus(); serviceManager.lastCheckTimeForNotifications = -1; serviceManager.lastCheckTimeForNewFeeds = -1; break; case ('facebook.users.hasAppPermission.readMail'): if (text == 1) readMailPermission = true; else readMailPermission = false; this.getNotifications(); break; case ('facebook.users.hasAppPermission.status'): if (updateStatusPermissionCallBack) { updateStatusPermissionCallBack(text); updateStatusPermissionCallBack = null; } break; case ('facebook.fql.newMessages'): var alertsJsonObj = JSON.parse(text); if (!this.isResponseOk(alertsJsonObj)) return; if (alertsJsonObj.error_code == '612') { if (isInboxNeedStar) this.alertsManager.buildAlertsForUnreadMail(this.inboxUnreadNum); } else this.alertsManager.buildAlertsForMessages(alertsJsonObj); break; case ('facebook.fql.usersForNewFeeds'): if (text) { var alertsJsonObj = JSON.parse(text); if (!this.isResponseOk(alertsJsonObj)) return; this.alertsManager.buildAlertsForNewFeeds(alertsJsonObj); } break; case ('facebook.fql.getUserDataForUpdateStatus'): if (getUserDataCallBack) { if (readMailPermission) getUserDataCallBack(text, FacebookXPCOM.consts.gadgetType.updateStatusWithoutAfterGetPermission); else getUserDataCallBack(text, FacebookXPCOM.consts.gadgetType.updateStatusAfterGetPermission); getUserDataCallBack = null; } break; } }; this.isResponseOk = function(jsonObj) { return (!jsonObj.error_code || jsonObj.error_code == '612'); }; this.__defineGetter__("sessionKey", function() { return serviceManager.sessionKey; }); this.onIdle = function() { serviceManager.isIdle = true; }; this.onBackFromIdle = function() { serviceManager.isIdle = false; if (serviceManager.forceNotifications) { serviceManager._defineNotificationsInterval(); serviceManager.forceNotifications = false; } if (serviceManager.forceNewFeeds) { serviceManager._defineNewFeedsInterval(); serviceManager.forceNewFeeds = false; } }; this.registerIdleObserver = function() { if (AppInfo.isGecko19) { idleObserver = new IdleObserver(idleTimeoutSec, this.onIdle, this.onBackFromIdle, this); idleObserver.register(); } }; this.unregisterIdleObserver = function() { if (!idleObserver) return; idleObserver.unregister(); }; //settings functions this.getDynamicMenuItem = function(locale, facebookItem) { if (!hashDynamicMenusXml.Contains(locale)) return null; var xmlDynamicMenu = hashDynamicMenusXml.GetByID(locale); var objData = facebookItem.objData; var oData = new ToolbarItemData(xmlDynamicMenu, ToolbarDataParsingXPCOM.ComponentType.Settings, objData.isPublisher, objData.chromeName, objData.originalCTID, objData.actingCTID); var dynamicMenuItem = ToolbarDataParsingXPCOM.toolbarItemsFactory.GetInstance(oData); dynamicMenuItem.DisableUsage = true; return dynamicMenuItem; }; var getDynamicMenuFilepath = function(locale) { return stringFormat("{0}{1}{2}", FacebookXPCOM.consts.folder, Dir.sep, stringFormat(FacebookXPCOM.consts.dynamicMenuFilename, locale)); }; var getSettingsFilepath = function () { return stringFormat("{0}{1}{2}", FacebookXPCOM.consts.folder, Dir.sep, FacebookXPCOM.consts.settingsFilename); }; this.updateDynamicMenu = function(xmlDynamicMenu, locale) { if (!xmlDynamicMenu) return; //save dynamic menu into file (by locale) oIO.writeToolbarFile(XML.GetStringXml(xmlDynamicMenu), getDynamicMenuFilepath(locale)); //replace/add this menu to hash, in order not to load it each time per toolbar. hashDynamicMenusXml.Add(locale, xmlDynamicMenu); if (!this.isInit) this.init(); //broadcast dynamic menu changed var aSubject = new Object(); aSubject.wrappedJSObject = aSubject; aSubject.locale = locale; notifyObservers(aSubject, FacebookXPCOM.consts.observer.topic, FacebookXPCOM.consts.observer.dynamicMenuReady); }; this.updateSettings = function(xmlSettings) { //save new settings oIO.writeToolbarFile(XML.GetStringXml(xmlSettings), getSettingsFilepath()); //update in memory settings object this.facebookSettings = new FacebookSettingsDS(); this.facebookSettings.init(xmlSettings, _alertsPermissions); if (!this.isInit) this.init(); }; this.loadSettings = function() { var strSettings = oIO.readToolbarFile(getSettingsFilepath()); if (!strSettings) return null; var xmlSettings = XML.GetXmlDocument(strSettings); if (!XML.IsLegal(xmlSettings)) return null; var objFacebookSettings = new FacebookSettingsDS(); objFacebookSettings.init(xmlSettings.documentElement, _alertsPermissions); return objFacebookSettings; }; this.loadDynamicMenuXml = function(locale) { var strDynamicMenu = oIO.readToolbarFile(getDynamicMenuFilepath(locale)); if (!strDynamicMenu) return null; var xmlDynamicMenu = XML.GetXmlDocument(strDynamicMenu); if (!XML.IsLegal(xmlDynamicMenu)) return null; return xmlDynamicMenu.documentElement; }; this.onSettingsResponse = function(xmlRoot, locale) { //save and update dynamic menu var xmlDynamicMenu = XML.SelectSingleNode(xmlRoot, "DYNAMIC_MENU"); this.updateDynamicMenu(xmlDynamicMenu, locale); //save and update settings xmlRoot.removeChild(xmlDynamicMenu); this.updateSettings(xmlRoot); }; }; function FacebookServiceManager(objCallback, facebookAlertsManager, facebookPrefFromSetting) { this.isIdle = false; this.token; // authenticated login/security token for facebook this.sessionKey; // session key to be used in order to retrieve information this.sessionSecret; // session secret, to be used instead of app-secret this.userId; this.lastKnownUnreadMsgUpdateTime = -1; this.lastKnownUnreadFeedUpdateTime = -1; this.getEventInvitesDeltaList; this.getFriendRequestsDeltaList; this.getGroupInvitesDeltaList; this.lastCheckTimeForNotifications = -1; this.lastCheckTimeForNewFeeds= -1; this.notificationsIntervalMM = facebookPrefFromSetting.notificationsIntervalMM; this.newsFeedsIntervalMM = facebookPrefFromSetting.newsFeedsIntervalMM; var tmpDataForNewFeeds; var mThread_NewFeedsInetvalRef; var mThread_NotificationsInetvalRef; this.forceNotifications = false; this.forceNewFeeds = false; var that = this; this.Request = function(method, text, callbackState) { if (!callbackState) callbackState = method; var self = this; var arrParams = this.createFacebookRequestPostParams(method, text); var oRequest = new FacebookRQ(facebookPrefFromSetting.facebookApiUrl, arrParams, function(strResponse, o, method) { self.onResponse(strResponse, o, method); }, callbackState); EBServerDataURL.ServiceRequest(oRequest); }; this.initAlertRequests = function() { that._defineNewFeedsInterval(); that._defineNotificationsInterval(); }; this.shutdown = function() { if (mThread_NewFeedsInetvalRef) clearTimeout(mThread_NewFeedsInetvalRef); if (mThread_NotificationsInetvalRef) clearTimeout(mThread_NotificationsInetvalRef); mThread_NotificationsInetvalRef = null; mThread_NewFeedsInetvalRef = null; this.lastKnownUnreadMsgUpdateTime = -1; this.lastKnownUnreadFeedUpdateTime = -1; this.lastCheckTimeForNotifications = -1; this.getEventInvitesDeltaList = null; this.getFriendRequestsDeltaList = null; this.getGroupInvitesDeltaList = null; }; this._defineNewFeedsInterval = function() { this.requestNewFeeds(); mThread_NewFeedsInetvalRef = setInterval(function() { that.requestNewFeeds(); }, that.newsFeedsIntervalMM * 60 * 1000); }; this._defineNotificationsInterval = function() { this.requestNotifications(); mThread_NotificationsInetvalRef = setInterval(function() { that.requestNotifications(); }, that.notificationsIntervalMM * 60 * 1000); }; this.requestNewFeeds = function() { if (!this.isIdle) { if (facebookAlertsManager.enabled && facebookAlertsManager.newsFeedsEnabled) { var self = this; this.forceNewFeeds = false; var queryStr = (this.lastKnownUnreadFeedUpdateTime < 0) ? "SELECT time FROM status WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=" + this.userId + ") LIMIT 1" : "SELECT uid,time,message,status_id FROM status WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=" + this.userId + ") AND time>" + this.lastKnownUnreadFeedUpdateTime; var arrParams = this.createFacebookRequestPostParams('facebook.fql.query', queryStr); var oRequest = new FacebookRQ(facebookPrefFromSetting.facebookApiUrl, arrParams, function(strResponse, o, method) { self.onResponse(strResponse, o, method); }, 'facebook.fql.newFeeds'); EBServerDataURL.ServiceRequest(oRequest); } } else { this.forceNewFeeds = true; clearTimeout(mThread_NewFeedsInetvalRef); } }; this.requestNotifications = function() { if (!this.isIdle) { this.forceNotifications = false; var self = this; var arrParams = this.createFacebookRequestPostParams('facebook.notifications.get'); var oRequest = new FacebookRQ(facebookPrefFromSetting.facebookApiUrl, arrParams, function(strResponse, o, method) { self.onResponse(strResponse, o, method); }, 'facebook.notifications.get'); EBServerDataURL.ServiceRequest(oRequest); } else { this.forceNotifications = true; clearTimeout(mThread_NotificationsInetvalRef); } }; this.getUserDataForUpdateStatus = function() { var querysStr var arrParams; var oRequest; var self = this; querysStr = "SELECT name, pic_square, status ,profile_update_time FROM user WHERE uid=" + this.userId; arrParams = this.createFacebookRequestPostParams('facebook.fql.query', querysStr); oRequest = new FacebookRQ(facebookPrefFromSetting.facebookApiUrl, arrParams, function(strResponse, o, method) { self.onResponse(strResponse, o, method); }, 'facebook.fql.getUserDataForUpdateStatus'); EBServerDataURL.ServiceRequest(oRequest); }; this.getUserNameForFirstTime = function() { var querysStr = "SELECT name FROM user WHERE uid=" + this.userId; var arrParams = this.createFacebookRequestPostParams('facebook.fql.query', querysStr); var self = this; var oRequest = new FacebookRQ(facebookPrefFromSetting.facebookApiUrl, arrParams, function(strResponse, o, method) { self.onResponse(strResponse, o, method); }, 'facebook.fql.getUserNameForFirstTime'); EBServerDataURL.ServiceRequest(oRequest); }; this.RequestDataForAlerts = function() { if (!facebookAlertsManager.enabled || this.isIdle) return; var queriesStr = new Array(); var arrParams; var oRequest; if (this.getGroupInvitesDeltaList && this.getGroupInvitesDeltaList.length > 0 && facebookAlertsManager.groupsEnabled) queriesStr.push("\"groups\":\"SELECT gid,name,pic_big FROM group WHERE gid IN(" + this.getGroupInvitesDeltaList.join(',') + ")\""); if (this.getEventInvitesDeltaList && this.getEventInvitesDeltaList.length > 0 && facebookAlertsManager.eventsEnabled) queriesStr.push("\"events\":\"SELECT eid,name,pic_big FROM event WHERE eid IN(" + this.getEventInvitesDeltaList.join(',') + ")\""); if (this.getFriendRequestsDeltaList && this.getFriendRequestsDeltaList.length > 0 && facebookAlertsManager.friendReqEnabled) queriesStr.push("\"users\":\"SELECT uid,name,pic_square FROM user WHERE uid IN(" + this.getFriendRequestsDeltaList.join(',') + ")\""); arrParams = this.createFacebookRequestPostParams('facebook.fql.multiquery', "{" + queriesStr.join(',') + "}"); var self = this; if (queriesStr.length > 0) { oRequest = new FacebookRQ(facebookPrefFromSetting.facebookApiUrl, arrParams, function(strResponse, o, method) { self.onResponse(strResponse, o, method); }, 'facebook.fql.multiquery'); EBServerDataURL.ServiceRequest(oRequest); } if (this.lastKnownUnreadMsgUpdateTime > -1 && facebookAlertsManager.inboxEnabled) { var queryStr = "SELECT uid,name,pic_square FROM user WHERE uid IN (SELECT snippet_author FROM thread WHERE folder_id=0 AND unread<>0 AND updated_time>" + this.lastKnownUnreadMsgUpdateTime + ")"; arrParams = this.createFacebookRequestPostParams('facebook.fql.query', queryStr); oRequest = new FacebookRQ(facebookPrefFromSetting.facebookApiUrl, arrParams, function(strResponse, o, method) { self.onResponse(strResponse, o, method); }, 'facebook.fql.newMessages'); EBServerDataURL.ServiceRequest(oRequest); } }; this.RequestForLogout = function() { var self = this; var oRequest = new FacebookRQ(facebookPrefFromSetting.links.facebookLogoutUrl + "?api_key=" + FacebookXPCOM.consts.FB_APP_API_KEY + "&session_key=" + this.sessionKey, null, function(strResponse, o, method) { self.onResponse(strResponse, o, method); }, "facebook.logout"); EBServerDataURL.ServiceRequest(oRequest); }; this.createFacebookRequestPostParams = function(method, text) { var arrParams = new Array(); arrParams.push("api_key=" + FacebookXPCOM.consts.FB_APP_API_KEY); arrParams.push("v=" + FacebookXPCOM.consts.FB_API_VER); arrParams.push("method=" + method); arrParams.push("call_id=" + new Date().getTime()); // if we have a stored token/session, use them if (this.token) arrParams.push("auth_token=" + this.token); if (this.sessionKey) arrParams.push("session_key=" + this.sessionKey); switch (method) { case "facebook.fql.query": arrParams.push("query=" + text); break; case "facebook.fql.multiquery": arrParams.push("queries=" + text); break; case "facebook.status.set": arrParams.push("status=" + text); break; case "facebook.users.hasAppPermission": arrParams.push("ext_perm=" + text); break; } arrParams.push("format=JSON"); arrParams.sort(); arrParams.push("sig=" + this.GetSignature(arrParams)); arrParams.sort(); return arrParams; }; this.GetSignature = function(arrParams) { var params = arrParams.join(""); params += (this.sessionSecret) ? this.sessionSecret : FacebookXPCOM.consts.FB_APP_SECRET; return MD5(params); }; this.onResponse = function(strResponse, o, method) { switch (method) { case 'facebook.notifications.get': break; case 'facebook.fql.newFeeds': tmpDataForNewFeeds = strResponse; this.handleNewFeedsResponse(strResponse); break; case 'facebook.fql.usersForNewFeeds': strResponse = "{\"feeds\":" + tmpDataForNewFeeds + " ,\"users\":" + strResponse + "}"; tmpDataForNewFeeds = ""; break; case 'facebook.fql.multiquery': method = 'facebook.alerts.data'; break; } objCallback(strResponse, method); }; this.handleNewFeedsResponse = function(jsonStr) { var jsonObj = JSON.parse(jsonStr); if (this.lastKnownUnreadFeedUpdateTime == -1) { this.lastKnownUnreadFeedUpdateTime = jsonObj[0].time; } else { var uidArray = new Array(); if (jsonObj[0]) this.lastKnownUnreadFeedUpdateTime = jsonObj[0].time; for (var i = 0; i < jsonObj.length; i++) uidArray.push(jsonObj[i].uid); if (uidArray.length > 0) { var query = "SELECT uid,name, pic_square FROM user WHERE uid IN(" + uidArray.join(',') + ")"; this.Request('facebook.fql.query', query, 'facebook.fql.usersForNewFeeds'); } } }; }; function FacebookSettingsManager(oPrefs, iIntervalSec, serviceUrl, locale, objCallback) { var timeoutRef = null; this._request = function() { var self = this; var objRequest = new FacebookSettingsRQ(this.getUrl(), locale, "2.5.2.14", function(strResponse) { self.response(strResponse); }); oPrefs.SetPref(FacebookXPCOM.consts.settingsLastCheckTime, Date()); EBServerDataURL.ServiceRequest(objRequest); }; this.request = function(bForce) { this.shutdown(); var iTimeout = (bForce) ? 0 : this.getNextCheckInterval(); var self = this; timeoutRef = setTimeout(function() { self._request(); }, iTimeout); }; this.response = function(strResponse) { this.request(false); if (!strResponse) return; var xmlDoc = XML.GetXmlDocument(strResponse); if (!XML.IsLegal(xmlDoc)) return; objCallback(xmlDoc.documentElement, locale); }; this.shutdown = function() { if (timeoutRef) clearTimeout(timeoutRef); }; this.getUrl = function() { return serviceUrl ? serviceUrl : FacebookXPCOM.consts.settingsDefaultUrl; }; this.getNextCheckInterval = function() { var lastCheck = oPrefs.GetPref(FacebookXPCOM.consts.settingsLastCheckTime); if (!lastCheck) return 0; var iLastCheck = Date.parse(lastCheck); if (!iLastCheck) return 0; var iNow = Date.parse(Date()); var iNextCheck = iLastCheck + iIntervalSec * 1000 - iNow; if (iNextCheck < 0) iNextCheck = 0; return iNextCheck; }; }; function Fix404Obj(ctid, url, isEnabled, isExternal) { this.url = url; this.CTID = ctid; this.isEnabled = isEnabled; this.isExternal = isExternal; }; function Fix404Manager() { var toolbarsHash = new HashArray(); this.register = function(strCTID, strUrl, isEnabled, isExternal) { var objData = null; if (toolbarsHash.Contains(strCTID)) { objData = toolbarsHash.GetByID(strCTID); objData.isEnabled = isEnabled; objData.isExternal = isExternal; objData.url = strUrl; } else { objData = new Fix404Obj(strCTID, strUrl, isEnabled, isExternal); toolbarsHash.Add(strCTID, objData); } }; this.setEnabledState = function(strCTID, isEnabled) { if (!toolbarsHash.Contains(strCTID)) return; var objData = toolbarsHash.GetByID(strCTID); objData.isEnabled = isEnabled; }; this.getData = function() { var objData = null; for (var i = 0; i < toolbarsHash.Count(); i++) { objData = toolbarsHash.GetByIndex(i); if (objData.isEnabled) return objData; } return null; }; this.on404 = function(aProgress, aRequest, aFlag, aStatus) { var objData = this.getData(); if (!objData) return; var oWindow = aProgress.DOMWindow; var strRedirectUrl = objData.url.replace(/EB_MAIN_FRAME_URL/g, encodeURIComponent(oWindow.document.baseURI)); var oCallback = function(strResponse) { //check if the page is legal if (strResponse.indexOf("<!--FIX_PAGE_NOT_FOUND_REMARK-->") == -1) return; if (objData.isExternal) { try { var iframe = oWindow.document.createElement("iframe"); iframe.setAttribute("style", "width:100%; height:100%; margin:0px; border:0px solid white"); var oBody = oWindow.document.getElementsByTagName("body")[0]; var oHead = oWindow.document.getElementsByTagName("head")[0]; if (oHead) oHead.innerHTML = ""; if (oBody) { oBody.innerHTML = ""; oBody.style.margin = "0px"; oBody.style.padding = "0px"; oBody.appendChild(iframe); iframe.src = strRedirectUrl; } } catch (ex) { Logging.LogToConsole(ex); } } else { try { strResponse = strResponse.replace(/<!--FIX_PAGE_NOT_FOUND_REMARK-->/, ''); strResponse = strResponse.replace(/<!--/g, ''); strResponse = strResponse.replace(/-->/g, ''); strResponse = strResponse.replace(/\'/g, "\\'"); strResponse = strResponse.replace(/\r\n/g, ""); strResponse = strResponse.replace(/\/\/\<\!\[CDATA\[/g, ''); strResponse = strResponse.replace(/\/\/]]>/g, ''); var strJSInnerHTML = "document.write('" + strResponse + "'); document.close();"; var oScript = oWindow.document.createElement('script'); oScript.setAttribute('type', 'text/javascript'); oScript.innerHTML = strJSInnerHTML; oWindow.document.getElementsByTagName('head')[0].appendChild(oScript); } catch (ex) { Logging.LogToConsole(ex); } } }; try { aRequest.cancel(aRequest.NS_ERROR_FAILURE); EBServerDataURL.HTTPServerRequest(strRedirectUrl, null, false, oCallback, null, true); } catch (ex) { Logging.LogToConsole(ex); } }; }; var Fix404XPCOM = { manager: new Fix404Manager() }; function KeysStorageManager() { this.Data = new Array(); this.storeKey = function(strCTID, strKey, strValue) { if (!this.Data[strCTID]) this.Data[strCTID] = new Array(); this.Data[strCTID][strKey] = strValue; }; this.retrieveKey = function(strCTID, strKey) { return this.Data[strCTID][strKey]; }; this.deleteKey = function(strCTID, strKey) { delete this.Data[strCTID][strKey]; }; }; var KeysStorageXPCOM = { manager: new KeysStorageManager() }; var SearchInNewTabConsts = { htmlDataFile: "searchInNewTabData.xml" }; var SearchInNewTabPrefConsts = { LastCheckTime: "SearchInNewTabLastCheckTime", SearchInNewTabUserEnabled: "SearchInNewTabUserEnabled" }; function SearchInNewTabRQ(serviceUrl, objCallback) { this.callback = objCallback; this.url = serviceUrl; this.postParams = ""; }; function SearchInNewTabRS(xmlNewTab) { this.script = ""; this.html = ""; this.parse = function() { for (var i = 0; i < xmlNewTab.childNodes.length; i++) { switch (xmlNewTab.childNodes[i].tagName) { case "SCRIPT": this.script = XML.GetXmlNodeValue(xmlNewTab.childNodes[i]); break; case "HTML": this.html = XML.GetXmlNodeValue(xmlNewTab.childNodes[i]); break; } } }; this.toString = function() { return XML.GetStringXml(xmlNewTab); }; if (xmlNewTab) this.parse(); }; function SearchInNewTabUsageRQ(serviceUrl, originalCTID, browserVersion, toolbarVersion, platform, toolbarAge, actionType) { var USAGE_RQ = "incomingUsersRequestXML=<HOSTING_USAGE_XML><MSG_TYPE>USER_USAGE_RQ</MSG_TYPE><MSG_XML><ORIGINAL_CT_ID>{0}</ORIGINAL_CT_ID><BROWSER_VERSION>{1}</BROWSER_VERSION><TOOLBAR_VERSION>{2}</TOOLBAR_VERSION><PLATFORM>{3}</PLATFORM><TOOLBAR_AGE_DAYS>{4}</TOOLBAR_AGE_DAYS><ACTION_TYPE>{5}</ACTION_TYPE></MSG_XML></HOSTING_USAGE_XML>"; this.callback = null; this.url = serviceUrl; this.postParams = ""; this._init = function() { this.postParams = stringFormat(USAGE_RQ, originalCTID, browserVersion, toolbarVersion, platform, toolbarAge, actionType); }; this._init(); }; function SearchInNewTabManager(originalCTID, currentCTID, objToolbarDefaults, publisherServiceUrl, enabled) { var oPrefs = new PrefManager(originalCTID, currentCTID); var oIO = new IO(originalCTID, currentCTID); var serviceManager = null; var objXmlData = null; var _isEnabled = null; this.__defineSetter__("userEnabled", function(value) { oPrefs.SetPref(SearchInNewTabPrefConsts.SearchInNewTabUserEnabled, value); _isEnabled = value && enabled; }); this.__defineGetter__("userEnabled", function() { return (oPrefs.HasUserValue(SearchInNewTabPrefConsts.SearchInNewTabUserEnabled)) ? oPrefs.GetPref(SearchInNewTabPrefConsts.SearchInNewTabUserEnabled) : true; }); this.__defineSetter__("isEnabled", function(value) { _isEnabled = value; }); this.__defineGetter__("isEnabled", function() { return _isEnabled; }); this.arrachEvents = function(DOMWindow) { DOMWindow.newTabEventsAttached = true; var oJS = getJSObjectFromWindow(DOMWindow); var that = this; if (oJS.ScriptHelper && oJS.ScriptHelper.NotifyClose) { oJS.ScriptHelper.NotifyClose = function(e) { oPrefs.SetPref(SearchInNewTabPrefConsts.SearchInNewTabUserEnabled, false); that.userEnabled = false; //send usage if (oPrefs.GetPref(ToolbarPrefsConsts.EnableUsage, false, true)) SearchInNewTabUsage.closeSearchInNewTab(oPrefs, originalCTID, objToolbarDefaults.version); }; } //return focus to url bar getWindow().gURLBar.focus(); }; this.onNewTabOpened = function(DOMWindow) { if (!objXmlData) return; var strUrl = stringFormat("chrome://{0}/content/{1}", objToolbarDefaults.chromeName, SearchInNewTabXPCOM.HTML_FILE_NAME); getWindow().gBrowser.loadURIWithFlags(strUrl, Components.interfaces.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY, null, null); }; this.onWindowLoad = function(DOMWindow) { //messing with DOM causes another document complete event, so we need to set attribute to know that //DOM is already updated if (DOMWindow.newTabScriptInjected) { if (DOMWindow.newTabEventsAttached) return; else //attach event that notifies toolbar that user doesn't wont to show newtab search box again this.arrachEvents(DOMWindow); return; } DOMWindow.newTabScriptInjected = true; var doc = DOMWindow.document; var oScript = doc.createElement("script"); oScript.setAttribute("type", "text/javascript"); oScript.innerHTML = objXmlData.script; doc.getElementsByTagName("head")[0].appendChild(oScript); var oHtmlContainer = doc.body; oHtmlContainer.innerHTML = objXmlData.html; //send usage if (oPrefs.GetPref(ToolbarPrefsConsts.EnableUsage, false, true)) SearchInNewTabUsage.newTab(oPrefs, originalCTID, objToolbarDefaults.version); }; this.onServiceResponse = function(xmlResponse) { oIO.writeToolbarFile(XML.GetStringXml(xmlResponse), SearchInNewTabConsts.htmlDataFile, true); objXmlData = new SearchInNewTabRS(xmlResponse.documentElement); }; this.loadData = function() { var strData = oIO.readToolbarFile(SearchInNewTabConsts.htmlDataFile, true); if (!strData) return; var xmlData = XML.GetXmlDocument(strData); if (!XML.IsLegal(xmlData)) return; objXmlData = new SearchInNewTabRS(xmlData.documentElement); }; this.init = function() { var isUserEnabled = (oPrefs.HasUserValue(SearchInNewTabPrefConsts.SearchInNewTabUserEnabled)) ? oPrefs.GetPref(SearchInNewTabPrefConsts.SearchInNewTabUserEnabled) : true; this.isEnabled = isUserEnabled && enabled; this.loadData(); var strServiceUrl = (publisherServiceUrl) ? publisherServiceUrl : oPrefs.GetPref(LoginPrefConsts.SearchInNewTabServiceUrl); //replace aliases strServiceUrl = strServiceUrl.replace(/EB_TOOLBAR_ID/g, currentCTID); serviceManager = new SearchInNewTabServiceManager(strServiceUrl, oPrefs, this.onServiceResponse, this); serviceManager.request(); }; this.shutdown = function() { if (serviceManager) serviceManager.shutdown(); }; this.init(); }; function SearchInNewTabServiceManager(strServiceUrl, oPrefs, objCallback, objCallbackThis) { var DEFAULT_INTERVAL_MM = 1440; var timeoutRef = null; this.request = function() { var iTimeout = this._getNextCheckInterval(); var self = this; var request = function() { oPrefs.SetPref(SearchInNewTabPrefConsts.LastCheckTime, Date(), true); var oRequest = new SearchInNewTabRQ(strServiceUrl, function(strResponse) { self.onResponse(strResponse); }); EBServerDataURL.ServiceRequest(oRequest); }; timeoutRef = setTimeout(request, iTimeout); }; this.shutdown = function() { clearTimeout(timeoutRef); }; this.reInit = function() { this.shutdown(); this.request(); }; this.onResponse = function(strResponse) { //set new request this.request(); var xmlResponse = XML.GetXmlDocument(strResponse); if (!XML.IsLegal(xmlResponse)) return; objCallback.call(objCallbackThis, xmlResponse); }; this._getNextCheckInterval = function() { //no last check time var strLastCheckTime = oPrefs.GetPref(SearchInNewTabPrefConsts.LastCheckTime, true); if (!strLastCheckTime) return 0; var iCheckIntervalMM = (oPrefs.HasUserValue(LoginPrefConsts.SearchInNewTabIntervalMM)) ? oPrefs.GetPref(LoginPrefConsts.SearchInNewTabIntervalMM) : DEFAULT_INTERVAL_MM; var iLastCheckTime = Date.parse(strLastCheckTime); var iNow = Date.parse(Date()); //time to check var nextCheck = (iLastCheckTime + iCheckIntervalMM * 60 * 1000) - iNow; return (nextCheck < 0) ? 0 : nextCheck; }; }; var SearchInNewTabUsage = { newTab: function(oPrefs, originalCTID, toolbarVersion) { var usageServiceUrl = oPrefs.GetPref(LoginPrefConsts.SearchInNewTabUsageUrl); var browserVersion = AppInfo.browserVersion; var platform = "FF"; var actionType = "NEW_TAB"; var toolbarAge = ToolbarFunctions.getToolbarAgeInDays(oPrefs); var usageRQ = new SearchInNewTabUsageRQ(usageServiceUrl, originalCTID, browserVersion, toolbarVersion, platform, toolbarAge, actionType); EBServerDataURL.ServiceRequest(usageRQ); }, closeSearchInNewTab: function(oPrefs, originalCTID, toolbarVersion) { var usageServiceUrl = oPrefs.GetPref(LoginPrefConsts.SearchInNewTabUsageUrl); var browserVersion = AppInfo.browserVersion; var platform = "FF"; var actionType = "NEW_TAB_DISABLED"; var toolbarAge = ToolbarFunctions.getToolbarAgeInDays(oPrefs); var usageRQ = new SearchInNewTabUsageRQ(usageServiceUrl, originalCTID, browserVersion, toolbarVersion, platform, toolbarAge, actionType); EBServerDataURL.ServiceRequest(usageRQ); } }; var SearchInNewTabXPCOM = { HTML_FILE_NAME: "aboutTabs.htm", hashManagers: new HashArray2(), register: function(originalCTID, currentCTID, objToolbarDefaults, publisherServiceUrl, enabled) { var manager = new SearchInNewTabManager(originalCTID, currentCTID, objToolbarDefaults, publisherServiceUrl, enabled); if (this.hashManagers.Contains(originalCTID)) { var oldManager = this.hashManagers.GetByID(originalCTID); oldManager.shutdown(); this.hashManagers.Add(originalCTID, manager); } else this.hashManagers.Add(originalCTID, manager); }, getManager: function(originalCTID) { if (this.hashManagers.Contains(originalCTID)) return this.hashManagers.GetByID(originalCTID); else { EBLog("search in new tab manager not found"); return null; } }, getActiveManager: function() { if (this.hashManagers.Count() == 0) return null; var manager = null; for (var i = 0; i < this.hashManagers.Count(); i++) { manager = this.hashManagers.GetByIndex(i); if (manager.isEnabled) return manager; } return null; }, onNewTabOpened: function(DOMWindow) { var manager = this.getActiveManager(); if (!manager) return; manager.onNewTabOpened(DOMWindow); }, isNewTabDocument: function(strUrl) { return (strUrl.indexOf("chrome://") == 0 && strUrl.indexOf(this.HTML_FILE_NAME) != -1); }, onDocumentLoaded: function(DOMWindow) { var strUrl = DOMWindow.document.location.href; if (!this.isNewTabDocument(strUrl)) return; var manager = this.getActiveManager(); if (!manager) return; manager.onWindowLoad(DOMWindow); } }; var ClientLogXPCOM = { event: ClientLogEvent, toolbarInfo: ClientLogToolbarInfo, manager: new ClientLogManager() }; var ClientLogConsts = { defaultServiceUrl: "http://clientlog.users.conduit.com/ClientDiagnostics.asmx/ReportDiagnosticsEvent" }; var ClientLogPrefConsts = { serviceUrl: "clientLogServiceUrl", isEnabled: "clientLogIsEnabled" } function ClientLogEvent(id, eventType, message, data) { this.id = id; this.eventType = eventType; this.message = XML.ToLegalXML(message); this.data = data; }; function ClientLogToolbarInfo(version, originalCTID, actingCTID, os, browser) { this.version = version; this.originalCTID = originalCTID; this.platform = "FF"; this.os = os; this.browser = XML.ToLegalXML(browser); this.ctid = actingCTID; }; function ClientLogManager() { this.onLoginResponse = function(xmlClientLog, strOriginalCTID) { if (!xmlClientLog) return; var bIsEnabled = XML.GetSingleNodeValueAsBoolean(xmlClientLog, "ENABLED", false); var strSerivceUrl = XML.GetSingleNodeValue(xmlClientLog, "SERVICE_URL"); this._updateServiceUrl(strOriginalCTID, strSerivceUrl, bIsEnabled); }; this.send = function(objToolbarInfo, objEvent) { if (!this._isEnabled(objToolbarInfo.originalCTID)) return; var strServiceUrl = this._getServiceUrl(objToolbarInfo.originalCTID); var objMessage = new ClientLogRQ(strServiceUrl, objToolbarInfo, objEvent); EBServerDataURL.ServiceRequest(objMessage); }; this._updateServiceUrl = function(strCTID, strServiceUrl, isEnabled) { var strPrefName = strCTID + "." + ClientLogPrefConsts.serviceUrl; PrefService.SetPref(strPrefName, strServiceUrl); strPrefName = strCTID + "." + ClientLogPrefConsts.isEnabled; PrefService.SetPref(strPrefName, isEnabled); }; this._isEnabled = function(strCTID) { var strPrefName = strCTID + "." + ClientLogPrefConsts.isEnabled; if (!PrefService.HasUserValue(strPrefName)) return true; else return PrefService.GetPref(strPrefName); }; this._getServiceUrl = function(strCTID) { var strPrefName = strCTID + "." + ClientLogPrefConsts.serviceUrl; if (!PrefService.HasUserValue(strPrefName)) return ClientLogConsts.defaultServiceUrl; else return PrefService.GetPref(strPrefName); }; }; function ClientLogRQ(serviceUrl, objToolbarInfo, objEvent) { var CLIENT_LOG_RQ = "<USERS_LOG_REQUEST><TOOLBAR_INFO><TOOLBAR_VERSION>{0}</TOOLBAR_VERSION><CTID>{1}</CTID><PLATFORM>{2}</PLATFORM><BROWSER_VERSION>{3}</BROWSER_VERSION><OPERATING_SYSTEM>{4}</OPERATING_SYSTEM><ACTING_CTID>{5}</ACTING_CTID></TOOLBAR_INFO><EVENT><ID>{6}</ID><TYPE>{7}</TYPE><MESSAGE>{8}</MESSAGE><DATA>{9}</DATA></EVENT></USERS_LOG_REQUEST>"; var POST_PARAM = "RequestString="; this.callback = null; this.url = serviceUrl; this.postParams = ""; this._init = function() { var strPostParam = stringFormat(CLIENT_LOG_RQ, objToolbarInfo.version, objToolbarInfo.originalCTID, objToolbarInfo.platform, objToolbarInfo.browser, objToolbarInfo.os, objToolbarInfo.ctid, objEvent.id, objEvent.eventType, objEvent.message, objEvent.data); this.postParams = POST_PARAM + encodeURIComponent(strPostParam); }; this._init(); }; var LanguagePackPrefConsts = { LanguagePackLastCheckTime: "LanguagePackLastCheckTime", ToolbarLocale: "Locale" }; function LanguagePackManager(defaultServiceUrl, originalCTID, actingCTID, version, oPrefs, callback, callbackThis) { this.request = function(bForce, lastUpdateTime) { var bIsTimeElased = this._isTimeElapse(); if (!bIsTimeElased && !bForce) return; if (!lastUpdateTime) lastUpdateTime = 0; if (bForce) lastUpdateTime = 0; var locale = oPrefs.GetPref(SettingsPrefConsts.ToolbarLocale, true); //didn't receive settings yet if (!locale) return; //request LP var self = this; var oRequest = new LanguagePackRQ(this._getUrl(), actingCTID, version, locale, lastUpdateTime, LanguagePackDefaults.terms.KeysArray, function(strLP) { self.onResponse(strLP); }); EBServerDataURL.ServiceRequest(oRequest); }; this.shutdown = function() { //insert self clean up logic here }; this.onResponse = function(strLP) { var xmlElem = ServerMessagesFunctions.getMessageXML(strLP); if (xmlElem) { var lpRS = new LanguagePackRS(xmlElem); this.saveLP(lpRS); } }; this.saveLP = function(lpRS) { //save last check time oPrefs.SetPref(LanguagePackPrefConsts.LanguagePackLastCheckTime, Date(), true); //wrong locale var locale = oPrefs.GetPref(SettingsPrefConsts.ToolbarLocale, true); if (locale != lpRS.locale) return; if (!lpRS.isModified) return; callback.call(callbackThis, lpRS.xmlLP); }; this._getUrl = function() { var strUrl = oPrefs.GetPref(LoginPrefConsts.LanguagePackServiceUrl, true); if (!strUrl) strUrl = defaultServiceUrl; return strUrl; }; this._isTimeElapse = function() { //no last check time var strLastCheckTime = oPrefs.GetPref(LanguagePackPrefConsts.LanguagePackLastCheckTime, true); if (!strLastCheckTime) return true; //no interval var iCheckInterval = oPrefs.GetPref(LoginPrefConsts.LanguagePackReloadIntervalMM, false); if (!iCheckInterval) return true; var iLastCheckTime = Date.parse(strLastCheckTime); var iNow = Date.parse(Date()); //time to check if (iLastCheckTime + iCheckInterval * 60 * 1000 <= iNow) return true; return false; }; }; function LanguagePackRQ(serviceUrl, actingCTID, version, locale, lastUpdateTime, arrKeys, objCallback) { var LP_RQ = "<EBXML><EBMSGID>CT_TRANSLATION_PACK_RQ</EBMSGID><EBMSG><CT_ID>{0}</CT_ID><VERSION>{1}</VERSION><LOCALE>{2}</LOCALE><LAST_UPDATE_TIME>{3}</LAST_UPDATE_TIME><TRANSLATION_KEYS>{4}</TRANSLATION_KEYS></EBMSG></EBXML>"; var POST_PARAM = "RequestString="; this.callback = objCallback; this.url = serviceUrl; this.postParams = ""; this._getKeysXmlString = function() { var strKeys = ""; for (var i = 0; i < arrKeys.length; i++) strKeys += XML.CreateXmlNodeString("KEY_ID", arrKeys[i]); return strKeys; }; this._init = function() { var strKeysXml = this._getKeysXmlString(); var strPostParam = stringFormat(LP_RQ, actingCTID, version, locale, lastUpdateTime, strKeysXml); this.postParams = POST_PARAM + encodeURIComponent(strPostParam); }; this._init(); }; function LanguagePackRS(xmlLP) { this.lastUpdateTime = ""; this.locale = ""; this.xmlTranslatedKeys = null; this.isModified = true; this.xmlLP = xmlLP; this.parse = function() { this.lastUpdateTime = XML.GetSingleNodeValue(xmlLP, "LAST_UPDATE_TIME"); this.locale = XML.GetSingleNodeValue(xmlLP, "LOCALE"); this.xmlTranslatedKeys = XML.SelectSingleNode(xmlLP, "TRANSLATED_KEYS"); }; this.checkIfModified = function() { if (this.xmlTranslatedKeys && this.xmlTranslatedKeys.childNodes.length == 1 && XML.GetXmlNodeValue(this.xmlTranslatedKeys) == "NOT MODIFIED") this.isModified = false; }; if (xmlLP) { this.parse(); this.checkIfModified(); } }; var LoginPrefConsts = { LastLoginDate: "LastLogin_2.5.2.14", LoginCache: "LoginCache", UserID : "UserID", GroupingServerCheckInterval: "GroupingServerCheckInterval", GroupingServiceUrl: "GroupingServiceUrl", AboutPrivacyUrl: "AboutPrivacyUrl", TrusteLinkUrl: "TrusteLinkUrl", UsageServerURL: "UsageServerURL", FirstTime: "FirstTime", LanguagePackServiceUrl: "LanguagePackServiceUrl", LanguagePackReloadIntervalMM: "LanguagePackReloadIntervalMM", MyStuffServiceUrl: "myStuffServiceUrl", MyStuffServiceIntervalMM: "myStuffServiceIntervalMM", MyStuffSearchUrl: "myStuffSearchUrl", MyStuffEnabled: "myStuffEnabled", MyStuffPublihserMinWidth: "myStuffPublihserMinWidth", LatestVersion: "LatestVersion", ValidationData_Search: "ValidationData_Search", ValidationData_Toolbar: "ValidationData_Toolbar", //search in new tab SearchInNewTabServiceUrl: "SearchInNewTabServiceUrl", SearchInNewTabIntervalMM: "SearchInNewTabIntervalMM", SearchInNewTabUsageUrl: "SearchInNewTabUsageUrl", SearchInNewTabEnabled: "SearchInNewTabEnabled", FirstServerDate: "FirstServerDate", CurrentServerDate: "CurrentServerDate" }; function LoginManager(defaultServiceUrl, originalCTID, actingCTID, oPrefs, objToolbarDefaults, refreshCallback, refreshCallbackThis) { var UN = "UN"; var UNIQUE_ID_LENGTH = 19; var SERVER_POST_FIX = "/iis2ebs.asp"; var DEFAULT_LOGIN_CACHE = 4; var timeoutFunct = null; this._request = function() { var os = AppInfo.getOS(); var browserVersion = AppInfo.xulRuntime.version; var platform = AppInfo.xulRuntime.name.toUpperCase(); var version = objToolbarDefaults.version; var objValidationData = null; if (objToolbarDefaults.sendValidationData) { objValidationData = new Object(); objValidationData.isFirst = !oPrefs.HasUserValue(LoginPrefConsts.LastLoginDate); objValidationData.search = (oPrefs.HasUserValue(LoginPrefConsts.ValidationData_Search)) ? oPrefs.GetPref(LoginPrefConsts.ValidationData_Search) : 0; objValidationData.toolbar = (oPrefs.HasUserValue(LoginPrefConsts.ValidationData_Toolbar)) ? oPrefs.GetPref(LoginPrefConsts.ValidationData_Toolbar) : 0; objValidationData.isUsageEnabled = (oPrefs.HasUserValue(ToolbarPrefsConsts.EnableUsage)) ? oPrefs.GetPref(ToolbarPrefsConsts.EnableUsage) : true; } var self = this; var oRequest = new LoginRQ(this._getUrl(), originalCTID, this.getUserID(), version, os, platform, browserVersion, actingCTID, objValidationData, function(strLogin) { self.onResponse(strLogin); }); EBServerDataURL.ServiceRequest(oRequest); }; this.request = function(bForce) { //do not login until user sets the personal components dialog var notFirstTime = oPrefs.GetPref(LoginPrefConsts.FirstTime, false); if (!notFirstTime) return; var nextCheckInterval = (bForce) ? 0 : this._getNextCheckInterval(); var self = this; timeoutFunct = setTimeout(function() { self._request(); }, nextCheckInterval); }; this.shutdown = function() { clearTimeout(timeoutFunct); }; this.onResponse = function(strLogin) { var xmlElem = ServerMessagesFunctions.getMessageXML(strLogin); var isFirstTime = false; if (xmlElem) { var loginRS = new LoginRS(xmlElem); isFirstTime = this.saveLogin(loginRS); } //if login previously done, still update the check time to now else { if (oPrefs.HasUserValue(LoginPrefConsts.LastLoginDate, false)) oPrefs.SetPref(LoginPrefConsts.LastLoginDate, Date(), false); } if (isFirstTime) refreshCallback.call(refreshCallbackThis); this.request(false); }; this.saveLogin = function(loginRS) { ClientLogXPCOM.manager.onLoginResponse(loginRS.xmlClientLog, originalCTID); UninstallLogXPCOM.manager.onLoginResponse(loginRS.xmlUninstallLog, originalCTID); if (loginRS.LPServiceUrl) oPrefs.SetPref(LoginPrefConsts.LanguagePackServiceUrl, loginRS.LPServiceUrl); if (loginRS.LPIntervalMM) oPrefs.SetPref(LoginPrefConsts.LanguagePackReloadIntervalMM, loginRS.LPIntervalMM); //update last check time to now var bIsFirstTime = !oPrefs.HasUserValue(LoginPrefConsts.LastLoginDate); oPrefs.SetPref(LoginPrefConsts.LastLoginDate, Date(), false); //login cache if (oPrefs.HasUserValue(LoginPrefConsts.LoginCache, false)) oPrefs.Clear(LoginPrefConsts.LoginCache, false); oPrefs.SetPref(LoginPrefConsts.LoginCache, loginRS.loginCache, false); //grouping if (loginRS.groupingInterval != 0 && loginRS.groupingInterval >= 30 && loginRS.groupingInterval <= 10080) oPrefs.SetPref(LoginPrefConsts.GroupingServerCheckInterval, loginRS.groupingInterval, false); if (loginRS.groupingServerUrl) oPrefs.SetPref(LoginPrefConsts.GroupingServiceUrl, loginRS.groupingServerUrl, false); //privacy url if (loginRS.privacyUrl) oPrefs.SetPref(LoginPrefConsts.AboutPrivacyUrl, loginRS.privacyUrl, false); //truste link url if (loginRS.trusteUrl) oPrefs.SetPref(LoginPrefConsts.TrusteLinkUrl, loginRS.trusteUrl, false); //usage service url if (loginRS.usageUrl) oPrefs.SetPref(LoginPrefConsts.UsageServerURL, loginRS.usageUrl, false); //mystuff if (loginRS.myStuffUrl) oPrefs.SetPref(LoginPrefConsts.MyStuffServiceUrl, loginRS.myStuffUrl, false); if (loginRS.myStuffIntervalMM) oPrefs.SetPref(LoginPrefConsts.MyStuffServiceIntervalMM, loginRS.myStuffIntervalMM, false); if (loginRS.myStuffSearchUrl) oPrefs.SetPref(LoginPrefConsts.MyStuffSearchUrl, loginRS.myStuffSearchUrl, false); if (loginRS.myStuffPublisherMinWidth) oPrefs.SetPref(LoginPrefConsts.MyStuffPublihserMinWidth, loginRS.myStuffPublisherMinWidth, false); oPrefs.SetPref(LoginPrefConsts.MyStuffEnabled, loginRS.myStuffEnabled, false); //trusted api domains if (loginRS.trustedApiDomains.length > 0) ToolbarManagerXPCOM.trustedDomains.saveTrustedDomains(loginRS.trustedApiDomains, originalCTID); //latest version if (loginRS.latestVersion) oPrefs.SetPref(LoginPrefConsts.LatestVersion, loginRS.latestVersion, false); //search in new tab if (loginRS.searchInNewTabServiceUrl) oPrefs.SetPref(LoginPrefConsts.SearchInNewTabServiceUrl, loginRS.searchInNewTabServiceUrl, false); if (loginRS.searchInNewTabIntervalMM) oPrefs.SetPref(LoginPrefConsts.SearchInNewTabIntervalMM, loginRS.searchInNewTabIntervalMM, false); if (loginRS.searchInNewTabUsageUrl) oPrefs.SetPref(LoginPrefConsts.SearchInNewTabUsageUrl, loginRS.searchInNewTabUsageUrl, false); oPrefs.SetPref(LoginPrefConsts.SearchInNewTabEnabled, loginRS.searchInNewTabEnabled, false); //handle server date if (loginRS.serverDate) { //set the first time only if didn't set before. if (!oPrefs.HasUserValue(LoginPrefConsts.FirstServerDate)) oPrefs.SetPref(LoginPrefConsts.FirstServerDate, loginRS.serverDate); oPrefs.SetPref(LoginPrefConsts.CurrentServerDate, loginRS.serverDate); } return bIsFirstTime; }; this._getUrl = function() { var strUrl = oPrefs.GetPref(SettingsPrefConsts.ServerURL, false); if (!strUrl) strUrl = defaultServiceUrl; return strUrl + SERVER_POST_FIX; }; this._getNextCheckInterval = function() { //no last check time var strLastCheckTime = oPrefs.GetPref(LoginPrefConsts.LastLoginDate, false); if (!strLastCheckTime) return 0; //no interval var iCheckInterval = (oPrefs.HasUserValue(LoginPrefConsts.LoginCache)) ? oPrefs.GetPref(LoginPrefConsts.LoginCache) : DEFAULT_LOGIN_CACHE; var iLastCheckTime = Date.parse(strLastCheckTime); var iNow = Date.parse(Date()); //time to check var nextCheck = (iLastCheckTime + iCheckInterval * 60 * 60 * 1000) - iNow; if (nextCheck < 0) nextCheck = 0; return nextCheck; }; this.getUserID = function() { var strUserId; //get it from preference strUserId = oPrefs.GetPref(LoginPrefConsts.UserID); if (!strUserId || strUserId.length != UNIQUE_ID_LENGTH) { strUserId = this._generateUserID(); //save it to pref oPrefs.SetPref(LoginPrefConsts.UserID, strUserId, false); } return strUserId; }; this._generateUserID = function() { var strID = UN + Math.random().toString().substring(2); while (strID.length < UNIQUE_ID_LENGTH) strID += Math.random().toString().substring(2); return strID.substr(0, 19); }; }; function LoginRQ(serviceUrl, originalCTID, userID, version, os, platform, browserVersion, actingCTID, objValidationData, objCallback) { var LOGIN_RQ = "<EBXML><EBMSGID>CT_LOGIN_RQ</EBMSGID><EBMSG><CT_ID>{0}</CT_ID><USERID>{1}</USERID><VERSION>{2}</VERSION><OPERATING_SYSTEM>{3}</OPERATING_SYSTEM><TIMESTAMP>{4}</TIMESTAMP><PLATFORM>{5}</PLATFORM><BROWSER_VERSION>{6}</BROWSER_VERSION><ACTING_CT_ID>{7}</ACTING_CT_ID>{8}</EBMSG></EBXML>"; var VALIDATION_DATA = "<VALIDATION_DATA><SEARCH>{0}</SEARCH><TOOLBAR>{1}</TOOLBAR><IS_FIRST>{2}</IS_FIRST><IS_USAGE_LOGGING_ENABLED>{3}</IS_USAGE_LOGGING_ENABLED></VALIDATION_DATA>"; var POST_PARAM = "RequestString="; this.callback = objCallback; this.url = serviceUrl; this.postParams = ""; this.generateTimeStamp = function() { var strTimeStamp = ""; var dateObj = new Date(); var strMonth = ""; var iMonth = dateObj.getMonth(); iMonth++; strMonth = iMonth < 10 ? "0" + iMonth : iMonth; var strDay = ""; var iDay = dateObj.getDate(); strDay = iDay < 10 ? "0" + iDay : iDay; var strYear = dateObj.getFullYear(); var strHour = ""; var iHour = dateObj.getHours(); strHour = iHour < 10 ? "0" + iHour : iHour; var strMinute = ""; var iMinute = dateObj.getMinutes(); strMinute = iMinute < 10 ? "0" + iMinute : iMinute; var strSecond = ""; var iSecond = dateObj.getSeconds(); strSecond = iSecond < 10 ? "0" + iSecond : iSecond; strTimeStamp = strMonth.toString() + "-" + strDay.toString() + "-" + strYear.toString() + " " + strHour.toString() + ":" + strMinute.toString() + ":" + strSecond.toString(); return strTimeStamp; }; this._init = function() { var strValidationData = (objValidationData) ? stringFormat(VALIDATION_DATA, objValidationData.search, objValidationData.toolbar, objValidationData.isFirst.toString().toUpperCase(), objValidationData.isUsageEnabled.toString().toUpperCase()) : ""; var strPostParam = stringFormat(LOGIN_RQ, originalCTID, userID, version, os, this.generateTimeStamp(), platform, browserVersion, actingCTID, strValidationData); this.postParams = POST_PARAM + encodeURIComponent(strPostParam); }; this._init(); }; function LoginRS(xmlLogin) { this.userId = ""; this.loginCache = 0; this.xmlAboutBox = null; this.groupingInterval = 0; this.groupingServerUrl = ""; this.privacyUrl = ""; this.trusteUrl = ""; this.usageUrl = ""; this.xmlClientLog = null; this.xmlUninstallLog = null; this.xmlLP = null; this.LPServiceUrl = ""; this.LPIntervalMM = 0; this.myStuffUrl = ""; this.myStuffIntervalMM = 0; this.myStuffSearchUrl = ""; this.myStuffEnabled = false; this.myStuffPublisherMinWidth = 0; this.trustedApiDomains = new Array(); this.latestVersion = ""; this.searchInNewTabServiceUrl = ""; this.searchInNewTabIntervalMM = 0; this.searchInNewTabUsageUrl = ""; this.searchInNewTabEnabled = false; this.serverDate = ""; this.parse = function() { this.userId = XML.GetSingleNodeValue(xmlLogin, "USERID"); this.loginCache = XML.GetSingleNodeValueAsInteger(xmlLogin, "LOGIN_CACHE"); this.groupingServerUrl = XML.GetSingleNodeValue(xmlLogin, "GROUPING_SERVER_URL"); this.serverDate = XML.GetSingleNodeValue(xmlLogin, "SERVER_TIME"); //grouping var xmlGrouping = XML.SelectSingleNode(xmlLogin, "GROUPING_INFO"); if (xmlGrouping) this.groupingInterval = XML.GetSingleNodeValueAsInteger(xmlGrouping, "INTERVAL"); //privacy this.xmlAboutBox = XML.SelectSingleNode(xmlLogin, "ABOUT_BOX"); if (this.xmlAboutBox) { this.privacyUrl = XML.GetSingleNodeValue(this.xmlAboutBox, "PRIVACY_PAGE_URL"); this.trusteUrl = XML.GetSingleNodeValue(this.xmlAboutBox, "TRUSTE_SEAL_URL"); } //usage this.usageUrl = XML.GetSingleNodeValue(xmlLogin, "USERS_USAGE_REQUEST_URL"); //client log this.xmlClientLog = XML.SelectSingleNode(xmlLogin, "CLIENT_LOG_SERVICE"); //uninstall log this.xmlUninstallLog = XML.SelectSingleNode(xmlLogin, "UNINSTALL_LOG_SERVICE"); //language pack this.xmlLP = XML.SelectSingleNode(xmlLogin, "TRANSLATION_SERVICE"); if (this.xmlLP) { this.LPServiceUrl = XML.GetSingleNodeValue(this.xmlLP, "SERVICE_URL"); this.LPIntervalMM = XML.GetSingleNodeValueAsInteger(this.xmlLP, "INTERVAL_IN_MM"); } var xmlMyStuff = XML.SelectSingleNode(xmlLogin, "MY_STUFF"); if (xmlMyStuff) { this.myStuffSearchUrl = XML.GetSingleNodeValue(xmlMyStuff, "ADD_STUFF_WEB_URL"); this.myStuffEnabled = XML.GetSingleNodeValueAsBoolean(xmlMyStuff, "ENABLED", false); this.myStuffPublisherMinWidth = XML.GetSingleNodeValueAsInteger(xmlMyStuff, "PUBLISHER_RESERVED_AREA_PX"); var xmlMyStuffService = XML.SelectSingleNode(xmlMyStuff, "MY_STUFF_SERVICE"); if (xmlMyStuffService) { this.myStuffUrl = XML.GetSingleNodeValue(xmlMyStuffService, "SERVICE_URL"); this.myStuffIntervalMM = XML.GetSingleNodeValueAsInteger(xmlMyStuffService, "INTERVAL_IN_MM"); } } var xmlToolbarApi = XML.SelectSingleNode(xmlLogin, "TOOLBAR_API"); if (xmlToolbarApi) { var xmlTrustedDomains = XML.SelectSingleNode(xmlToolbarApi, "TRUSTED_DOMAINS"); if (xmlTrustedDomains) { var xmlDomain = null; for (var i = 0; i < xmlTrustedDomains.childNodes.length; i++) { xmlDomain = xmlTrustedDomains.childNodes[i]; if (xmlDomain.tagName == "DOMAIN") this.trustedApiDomains.push(XML.GetXmlNodeValue(xmlDomain)); } } } xpathResult = xmlLogin.ownerDocument.evaluate("LATEST_VERSION/FF", xmlLogin, null, 2, null); if (xpathResult) this.latestVersion = xpathResult.stringValue; //search in new tab var xmlNewTab = XML.SelectSingleNode(xmlLogin, "SEARCH_IN_TAB_SERVICE"); if (xmlNewTab) { this.searchInNewTabServiceUrl = XML.GetSingleNodeValue(xmlNewTab, "SERVICE_URL"); this.searchInNewTabIntervalMM = XML.GetSingleNodeValueAsInteger(xmlNewTab, "INTERVAL_IN_MM", 1440); this.searchInNewTabUsageUrl = XML.GetSingleNodeValue(xmlNewTab, "USAGE_URL"); this.searchInNewTabEnabled = XML.GetSingleNodeValueAsBoolean(xmlNewTab, "ENABLED", false); } }; if (xmlLogin) this.parse(); }; function MyStuffConsts() { this.responseFlags = new Object(); this.responseFlags.NOT_MODIFIED = "NOT_MODIFIED"; this.responseFlags.MODIFIED = "MODIFIED"; this.responseFlags.ERROR= "SERVER_ERROR"; this.responseFlags.DELETED = "DELETED"; this.responseFlags.COMPONENT_NOT_FOUND = "COMPONENT_NOT_FOUND"; this.responseFlags.EXISTS = "EXISTS"; //not returned from server this.responseFlags.CONNECTION_ERROR = "CONNECTION_ERROR"; this.responseFlags.SERVER_UNREACHABLE = "SERVER_UNREACHABLE"; this.responseFlags.UNSUPPORTED = "UNSUPPORTED"; this.responseFlags.BAD_INPUT = "BAD_INPUT"; this.responseFlags.INVALID_XML = "INVALID_XML"; }; function MyStuffServiceManager(defaultServiceUrl, oPrefs, callback, callbackThis) { var done = false; var reqCount = 0; var DEFAULT_INTERVAL = 1440; //minutes this.request = function(arrMyStuffData, responseCallback, isFromApi, force) { done = false; var serviceUrl = this._getUrl(); var myStuffData = null; var arrReq = new Array(); var manager = this; var lastUpdateTime; var self = this; for (var i = 0; i < arrMyStuffData.length; i++) { myStuffData = arrMyStuffData[i]; lastUpdateTime = (force) ? "" : myStuffData.lastUpdateTime; if (this._isTimeElapse(lastUpdateTime, myStuffData.lastCheckTime)) { var state = new Object(); state.isFromApi = isFromApi; state.responseCallback = responseCallback; state.compGuid = myStuffData.compGuid; arrReq.push(new MyStuffRQ(serviceUrl, myStuffData.compInstanceGuid, lastUpdateTime, function(strXml, o, state) { self.response(strXml, o, state); }, state)); reqCount++; } } for (var i = 0; i < arrReq.length; i++) EBServerDataURL.ServiceRequest(arrReq[i]); }; this.shutdown = function() { }; this.response = function(strXml, o, state) { reqCount--; var compGuid = state.compGuid; if (reqCount == 0) done = true; var myStuffRS = null; var isNetworkError = (o.value == "EB_NETWORK_ERROR"); if (!isNetworkError) { var xmlDoc = XML.GetXmlDocument(strXml); if (xmlDoc) xmlDoc = xmlDoc.documentElement; var myStuffRS = new MyStuffRS(xmlDoc); } callback.call(callbackThis, myStuffRS, compGuid, done, state.responseCallback, state.isFromApi, isNetworkError); }; this._getUrl = function() { var strUrl = oPrefs.GetPref(LoginPrefConsts.MyStuffServiceUrl); if (!strUrl) strUrl = defaultServiceUrl; return strUrl; }; this._isTimeElapse = function(lastUpdateTime, lastCheckTime) { if (!lastCheckTime || !lastUpdateTime) return true; var iIntervalMM = oPrefs.GetPref(LoginPrefConsts.MyStuffServiceIntervalMM); if (!iIntervalMM) iIntervalMM = DEFAULT_INTERVAL; return lastCheckTime + iIntervalMM * 60 * 1000 <= lastCheckTime; }; }; function MyStuffRQ(serviceUrl, componentInstanceGuid, lastUpdateTime, objCallback, state) { var INSTANCE_GUID_ALIAS = "EB_MY_STUFF_INSTANCE_GUID"; var LUT_ALIAS = "EB_MY_STUFF_LUT"; this.callback = objCallback; this.url = ""; this.postParams = null; this.state = state; this._init = function() { this.url = serviceUrl.replace(INSTANCE_GUID_ALIAS, componentInstanceGuid).replace(LUT_ALIAS, lastUpdateTime); }; this._init(); }; function MyStuffRS(xmlResponse) { this.flags = ToolbarDataParsingXPCOM.myStuff.responseFlags.CONNECTION_ERROR; this.compInstanceGuid = ""; this.lastUpdateTime = ""; this.xmlComponent = null; this.parse = function() { this.flags = XML.GetSingleNodeValue(xmlResponse, "FLAGS"); if (this.flags != ToolbarDataParsingXPCOM.myStuff.responseFlags.MODIFIED) return; this.lastUpdateTime = XML.GetSingleNodeValue(xmlResponse, "LAST_UPDATE_TIME"); this.compInstanceGuid = XML.GetSingleNodeValue(xmlResponse, "COMPONENT_INSTANCE_GUID"); this.xmlComponent = XML.SelectSingleNode(xmlResponse, "COMPONENT_XML"); if (this.xmlComponent) this.xmlComponent = this.xmlComponent.firstChild; }; if(xmlResponse) this.parse(); }; var ServerMessagesFunctions = { getMessageXML: function(strXml) { if (!strXml) return null; try { strXml = XML.LegalizeEBXML(strXml); var xmlDoc = XML.GetXmlDocument(strXml); var xmlRoot = xmlDoc.documentElement; var xmlElem = XML.SelectSingleNode(xmlRoot, "EBMSG"); return xmlElem; } catch (ex) { return null; } } }; var SettingsPrefConsts = { SettingsLastUpdateTime: "SettingsLastUpdate", SettingsVisualLastUpdateTime: "VusualLastUpdateTime", ServerURL: 'Server', SettingsLastCheckTime: "SettingsLastCheckTime", SettingsCheckIntervalMM: "SettingsCheckIntervalMin", ToolbarLocale: "Locale", DialogsAlignMode: "DialogsAlignMode", IsMulticommunity: 'IsMulticommunity', IsGrouping: 'IsGrouping', CommunityChanged: 'CommunityChanged', MCDetectTooltipWidth: 'MCDetectTooltipWidth', MCDetectTooltipHeight: 'MCDetectTooltipHeight', MCDetectTooltipUrl: 'MCDetectTooltipUrl', CTID: "CTID", MyStuffEnabled: "MyStuffEnabled" }; function SettingsManager(defaultServiceUrl, version, originalCTID, actingCTID, oPrefs, callback, callbackThis) { var SERVER_POST_FIX = "/iis2ebs.asp"; this.request = function(bForce, bInvalidateCache) { var lastUpdateTime = oPrefs.GetPref(SettingsPrefConsts.SettingsLastUpdateTime, true); var bIsTimeElapsed = this._isTimeElapse(); if (!bIsTimeElapsed && !bForce && lastUpdateTime) return; if (!lastUpdateTime || bForce) lastUpdateTime = 0; //update last check time to now oPrefs.SetPref(SettingsPrefConsts.SettingsLastCheckTime, Date(), true); //request settings var self = this; var oRequest = new SettingsRQ(this._getUrl(), version, originalCTID, actingCTID, lastUpdateTime, bInvalidateCache, function(strSettings) { self.onResponse(strSettings); }); EBServerDataURL.ServiceRequest(oRequest); }; this.shutdown = function() { //insert self clean up logic here }; this._getUrl = function() { var strUrl = oPrefs.GetPref(SettingsPrefConsts.ServerURL, true); if (!strUrl) strUrl = defaultServiceUrl; return strUrl + SERVER_POST_FIX; }; this._isTimeElapse = function() { //no last check time var strLastCheckTime = oPrefs.GetPref(SettingsPrefConsts.SettingsLastCheckTime, true); if (!strLastCheckTime) return true; //no interval var iCheckInterval = oPrefs.GetPref(SettingsPrefConsts.SettingsCheckIntervalMM, true); if (!iCheckInterval) return true; iCheckInterval = parseInt(iCheckInterval); var iLastCheckTime = Date.parse(strLastCheckTime); var iNow = Date.parse(Date()); //time to check if (iLastCheckTime + iCheckInterval * 60 * 1000 <= iNow) return true; return false; }; this.onResponse = function(strSettings) { var xmlElem = ServerMessagesFunctions.getMessageXML(strSettings); if (!xmlElem) return; var settingsRS = new SettingsRS(xmlElem); this.saveSettings(settingsRS); }; this.saveSettings = function(settingsRS) { var bLocaleChanged = false; //settings reload interval minutes (cache time) oPrefs.SetPref(SettingsPrefConsts.SettingsCheckIntervalMM, settingsRS.reloadInterval, true); //server last update time oPrefs.SetPref(SettingsPrefConsts.SettingsLastUpdateTime, settingsRS.lastUpdateTime, true); //settings visual last update time for * in MC menu - only for MC/Grouping toolbar if (settingsRS.SettingsVisualLastUpdateTime) { oPrefs.SetPref(SettingsPrefConsts.SettingsVisualLastUpdateTime, settingsRS.visualLastUpdateTime, true); oPrefs.SetPref(SettingsPrefConsts.CommunityChanged, false, true); } //locale var oldLocale = oPrefs.GetPref(SettingsPrefConsts.ToolbarLocale, true); if (oldLocale != settingsRS.toolbarLocale) bLocaleChanged = true; oPrefs.SetPref(SettingsPrefConsts.ToolbarLocale, settingsRS.toolbarLocale, true); //dialogs dir oPrefs.SetPref(SettingsPrefConsts.DialogsAlignMode, (settingsRS.isLocaleRTL) ? "RTL" : "LTR", true); //multicommunity if (settingsRS.isMC) oPrefs.SetPref(SettingsPrefConsts.IsMulticommunity, settingsRS.isMC, false); //grouping oPrefs.SetPref(SettingsPrefConsts.IsGrouping, settingsRS.isGrouping, false); //mc tooltip oPrefs.SetPref(SettingsPrefConsts.MCDetectTooltipWidth, settingsRS.communityDetectedTooltipWidth, false); oPrefs.SetPref(SettingsPrefConsts.MCDetectTooltipHeight, settingsRS.communityDetectedTooltipHeight, false); oPrefs.SetPref(SettingsPrefConsts.MCDetectTooltipUrl, settingsRS.communityDetectedTooltipUrl, false); //alert var oldAlertChannelId = oPrefs.GetPref(AlertPrefConsts.alertChannelId); var bAlertChanged = false; if (!settingsRS.isMC && !settingsRS.isGrouping && settingsRS.alertChannelId) { oPrefs.SetPref(AlertPrefConsts.alertChannelId, settingsRS.alertChannelId); bAlertChanged = oldAlertChannelId != settingsRS.alertChannelId; } if (bLocaleChanged || settingsRS.isSettingsModified || bAlertChanged) callback.call(callbackThis, settingsRS.isSettingsModified, settingsRS.xmlSettings, bLocaleChanged, bAlertChanged); }; }; function SettingsRQ(serviceUrl, version, originalCTID, actingCTID, lastUpdateTime, bInvalidateCache, objCallback) { var SETTINGS_RQ = "<EBXML><EBMSGID>CT_MULTI_SETTINGS_RQ</EBMSGID><EBMSG><VERSION>{0}</VERSION><ORIGINAL_CT><CT_ID>{1}</CT_ID></ORIGINAL_CT><ACTING_CT><CT_ID>{2}</CT_ID><LAST_UPDATE_TIME>{3}</LAST_UPDATE_TIME></ACTING_CT>{4}</EBMSG></EBXML>"; var INVALIDATE_CACHE = "<INVALIDATE_CACHE>TRUE</INVALIDATE_CACHE>"; var POST_PARAM = "RequestString="; this.callback = objCallback; this.url = serviceUrl; this.postParams = ""; this._init = function() { var strInvalidateCache = (bInvalidateCache) ? INVALIDATE_CACHE : ""; var strPostParam = stringFormat(SETTINGS_RQ, version, originalCTID, actingCTID, lastUpdateTime, strInvalidateCache); this.postParams = POST_PARAM + encodeURIComponent(strPostParam); }; this._init(); }; function SettingsRS(xmlSettings) { this.originalCTID = ""; this.isMC = false; this.isGrouping = false; this.alertChannelId = null; this.actingCTID = ""; this.lastUpdateTime = ""; this.visualLastUpdateTime = ""; this.toolbarLocale = ""; this.isLocaleRTL = false; this.xmlSettings = null; this.reloadInterval = 0; this.isSettingsModified = true; // community detected dialog settings this.communityDetectedTooltipWidth = 0; this.communityDetectedTooltipHeight = 0; this.communityDetectedTooltipUrl = 0; this.parse = function() { //Original CTID var xmlOriginalCTID = XML.SelectSingleNode(xmlSettings, "ORIGINAL_CT"); if (xmlOriginalCTID) { this.originalCTID = XML.GetSingleNodeValue(xmlOriginalCTID, "CT_ID"); //Grouping info var xmlGroupingInfo = XML.SelectSingleNode(xmlOriginalCTID, "GROUPING_INFO"); if (xmlGroupingInfo) { this.isMC = XML.GetSingleNodeValueAsBoolean(xmlGroupingInfo, "OPEN_GROUP"); this.isGrouping = XML.GetSingleNodeValueAsBoolean(xmlGroupingInfo, "PREDEFINED_GROUP"); } //Alert info var xmlAlertInfo = XML.SelectSingleNode(xmlOriginalCTID, "ALERT_INFO"); if (xmlAlertInfo) this.alertChannelId = XML.GetSingleNodeValue(xmlAlertInfo, "ALERT_CHANNEL_ID"); } //Acting CTID var xmlActingCTID = XML.SelectSingleNode(xmlSettings, "ACTING_CT"); if (xmlActingCTID) { this.actingCTID = XML.GetSingleNodeValue(xmlActingCTID, "CT_ID"); this.lastUpdateTime = XML.GetSingleNodeValue(xmlActingCTID, "LAST_UPDATE_TIME"); this.visualLastUpdateTime = XML.GetSingleNodeValue(xmlActingCTID, "VISUAL_LAST_UPDATE_TIME"); this.toolbarLocale = XML.GetSingleNodeValue(xmlActingCTID, "TOOLBAR_LOCALE"); this.isLocaleRTL = XML.GetSingleNodeValueAsBoolean(xmlActingCTID, "LOCALE_RTL"); this.xmlSettings = XML.SelectSingleNode(xmlActingCTID, "SETTINGS"); } //Reload interval this.reloadInterval = XML.GetSingleNodeValueAsInteger(xmlSettings, "RELOAD_INTERVAL"); //Community detected tooltip var xmlTooltip = XML.SelectSingleNode(xmlSettings, "COMMUNITY_DETECTED_TOOLTIP"); if (xmlTooltip) { this.communityDetectedTooltipWidth = XML.GetSingleNodeValue(xmlTooltip, "WIDTH"); this.communityDetectedTooltipHeight = XML.GetSingleNodeValue(xmlTooltip, "HEIGHT"); this.communityDetectedTooltipUrl = XML.GetSingleNodeValue(xmlTooltip, "URL"); } }; this.checkIfModified = function() { if (this.xmlSettings && this.xmlSettings.childNodes.length == 1 && XML.GetXmlNodeValue(this.xmlSettings) == "SETTINGS_NOT_MODIFIED") this.isSettingsModified = false; }; this.parse(); this.checkIfModified(); }; var ThirdPartyPrefConsts = { ThirdPartyComponentsLastCheck: "ThirdPartyComponentsLastCheck", ThirdPartyComponentsLastUpdate: "ThirdPartyComponentsLastUpdate", ThirdPartyComponentsInterval: "ThirdPartyComponentsInterval" }; function ThirdPartyManager(defaultServiceUrl, originalCTID, actingCTID, oPrefs, callback, callbackThis) { var timeout = null; var SERVER_POST_FIX = "/iis2ebs.asp"; var DEFAULT_CHECK_INTERVAL_MM = 24; this.init = function() { var iIntervalMS = this._getNextCheckInterval(); var self = this; setTimeout(function() { self.request(); }, iIntervalMS); }; this.shutdown = function() { clearTimeout(timeout); }; this.reInit = function() { this.shutdown(); this.init(); }; this.request = function(bForce) { var lastUpdateTime = oPrefs.GetPref(ThirdPartyPrefConsts.ThirdPartyComponentsLastUpdate, true); var bIsTimeElased = (this._getNextCheckInterval() == 0) ? true : false; if (!bIsTimeElased && !bForce && lastUpdateTime) return; if (!lastUpdateTime || bForce) lastUpdateTime = 0; //update last check time to now oPrefs.SetPref(ThirdPartyPrefConsts.ThirdPartyComponentsLastCheck, Date(), true); var platform = AppInfo.xulRuntime.name.toUpperCase(); //request 3rd party var self = this; var oRequest = new ThirdPartyRQ(this._getUrl(), actingCTID, platform, lastUpdateTime, function(strThirdParty) { self.onResponse(strThirdParty); }); EBServerDataURL.ServiceRequest(oRequest); this.reInit(); }; this.onResponse = function(strThirdParty) { var xmlElem = ServerMessagesFunctions.getMessageXML(strThirdParty); var thirdPartyRS = new ThirdPartyRS(xmlElem); this.saveThirdParty(thirdPartyRS); }; this.saveThirdParty = function(thirdPartyRS) { if (thirdPartyRS.lastUpdateTime) oPrefs.SetPref(ThirdPartyPrefConsts.ThirdPartyComponentsLastUpdate, thirdPartyRS.lastUpdateTime, true); if (thirdPartyRS.reloadInterval && isFinite(thirdPartyRS.reloadInterval)) { //patch, older version wrote this value as string if (oPrefs.HasUserValue(ThirdPartyPrefConsts.ThirdPartyComponentsInterval, false)) oPrefs.Clear(ThirdPartyPrefConsts.ThirdPartyComponentsInterval, false); oPrefs.SetPref(ThirdPartyPrefConsts.ThirdPartyComponentsInterval, thirdPartyRS.reloadInterval, false); } //modify new xmlThirdParty received. if (thirdPartyRS.isModifed && thirdPartyRS.xmlThirdPartyComponents) callback.call(callbackThis, thirdPartyRS.xmlThirdPartyComponents); }; this._getUrl = function() { var strUrl = oPrefs.GetPref(SettingsPrefConsts.ServerURL, false); if (!strUrl) strUrl = defaultServiceUrl; return strUrl + SERVER_POST_FIX; }; this._getNextCheckInterval = function() { //no last check time var strLastCheckTime = oPrefs.GetPref(ThirdPartyPrefConsts.ThirdPartyComponentsLastCheck, true); if (!strLastCheckTime) return 0; //no interval var iCheckInterval = oPrefs.GetPref(ThirdPartyPrefConsts.ThirdPartyComponentsInterval, false); if (!iCheckInterval) iCheckInterval = DEFAULT_CHECK_INTERVAL_MM; iCheckInterval *= 60 * 60 * 1000; var iLastCheckTime = Date.parse(strLastCheckTime); var iNow = Date.parse(Date()); //time to check var iNextCheck = iLastCheckTime + iCheckInterval - iNow; if (iNextCheck < 0) iNextCheck = 0; return iNextCheck }; }; function ThirdPartyRQ(serviceUrl, actingCTID, platform, lut, callback) { var THIRD_PARTY_RQ = "<EBXML><EBMSGID>CT_THIRD_PARTY_COMPONENTS_RQ</EBMSGID><EBMSG><CT_ID>{0}</CT_ID><PLATFORM>{1}</PLATFORM><LAST_UPDATE_TIME>{2}</LAST_UPDATE_TIME></EBMSG></EBXML>"; var POST_PARAM = "RequestString="; this.callback = callback; this.url = serviceUrl; this.postParams = ""; this._init = function() { var strPostParam = stringFormat(THIRD_PARTY_RQ, actingCTID, platform, lut); this.postParams = POST_PARAM + encodeURIComponent(strPostParam); }; this._init(); }; function ThirdPartyRS(xmlThirdParty) { this.xmlThirdPartyComponents = null; this.lastUpdateTime = ""; this.reloadInterval = 0; this.isModifed = true; this.parse = function() { this.xmlThirdPartyComponents = XML.SelectSingleNode(xmlThirdParty, "THIRD_PARTY_COMPONENTS"); this.lastUpdateTime = XML.GetSingleNodeValue(xmlThirdParty, "LAST_UPDATE_TIME"); this.reloadInterval = XML.GetSingleNodeValueAsInteger(xmlThirdParty, "RELOAD_INTERVAL"); }; this.checkIfModified = function() { if (this.xmlThirdPartyComponents && this.xmlThirdPartyComponents.childNodes.length == 1 && XML.GetXmlNodeValue(this.xmlThirdPartyComponents) == "NOT_MODIFIED") this.isModifed = false; }; if (xmlThirdParty) { this.parse(); this.checkIfModified(); } }; var UninstallLogConsts = { defaultServiceUrl: "http://uninstall.users.conduit.com/Uninstall.asmx/RegisterToolbarUninstallation" }; var UninstallLogPrefConsts = { serviceUrl: "uninstallLogServiceUrl" } function UninstallLogDS(version, originalCTID, actingCTID, os, browser, uid) { this.version = version; this.originalCTID = originalCTID; this.platform = "FF"; this.os = os; this.browser = XML.ToLegalXML(browser); this.ctid = actingCTID; this.uid = uid; }; function UninstallLogManager() { //this hash is used to track that only one window will send a message var sentHash = new HashArray(); this.onLoginResponse = function(xmlUninstallLog, strOriginalCTID) { if (!xmlUninstallLog) return; var strSerivceUrl = XML.GetSingleNodeValue(xmlUninstallLog, "SERVICE_URL"); this._updateServiceUrl(strOriginalCTID, strSerivceUrl); }; this.send = function(objUninstallLogDS) { if (sentHash.Contains(objUninstallLogDS.originalCTID)) return; sentHash.Add(objUninstallLogDS.originalCTID, true); var strServiceUrl = this._getServiceUrl(objUninstallLogDS.originalCTID); var objMessage = new UninstallLogRQ(strServiceUrl, objUninstallLogDS); EBServerDataURL.ServiceRequest(objMessage); }; this._updateServiceUrl = function(strCTID, strServiceUrl) { var strPrefName = strCTID + "." + UninstallLogPrefConsts.serviceUrl; PrefService.SetPref(strPrefName, strServiceUrl); }; this._getServiceUrl = function(strCTID) { var strPrefName = strCTID + "." + UninstallLogPrefConsts.serviceUrl; if (!PrefService.HasUserValue(strPrefName)) return UninstallLogConsts.defaultServiceUrl; else return PrefService.GetPref(strPrefName); }; }; function UninstallLogRQ(serviceUrl, objUninstallLogDS) { var UNINSTALL_LOG_RQ = "<USERS_UNINSTALL_REQUEST><TOOLBAR_INFO><TOOLBAR_VERSION>{0}</TOOLBAR_VERSION><CTID>{1}</CTID><PLATFORM>{2}</PLATFORM><BROWSER_VERSION>{3}</BROWSER_VERSION><OPERATING_SYSTEM>{4}</OPERATING_SYSTEM><ACTING_CTID>{5}</ACTING_CTID></TOOLBAR_INFO><UID>{6}</UID></USERS_UNINSTALL_REQUEST>"; var POST_PARAM = "RequestString="; this.callback = null; this.url = serviceUrl; this.postParams = ""; this._init = function() { var strPostParam = stringFormat(UNINSTALL_LOG_RQ, objUninstallLogDS.version, objUninstallLogDS.originalCTID, objUninstallLogDS.platform, objUninstallLogDS.browser, objUninstallLogDS.os, objUninstallLogDS.ctid, objUninstallLogDS.uid); this.postParams = POST_PARAM + encodeURIComponent(strPostParam); }; this._init(); }; var UninstallLogXPCOM = { uninstallLogDS: UninstallLogDS, manager: new UninstallLogManager() }; var ToolbarDataParsingXPCOM = { dataNodeFactory: new DataNodeFactory, dataObjects: { Application: DataNodeApplication, Command: DataNodeCommand, Link: DataNodeLink, PopHtml: DataNodePopHtml, Rss: DataNodeRss }, dataNodeTypes: new DataNodeTypes(), ComponentType: { Settings: "Settings", ThirdParty: "ThirdParty", UserAdded: "UserAdded", MyStuff: "MyStuff" }, Editable: { FULL: 'FULL', NONE: 'NONE' }, ComponentsID: { MainMenu: '100', SearchBox: '101', Highlighter: '102', EMailNotifier: '103', Privacy: '104', Weather: '105', Radio: '107', OldRadio: '108', // 109 - is chat component Facebook: '116', MultiCommunity: '200', MyGadgets: '202', Chevron: "201", ChevronMyStuff: "202", MyStuffSplitter: "203", Chat: '', MyStuffAddButton: "204", MyStuffOptionsButton: "205", MyStuffUsage: "300" }, myStuff: new MyStuffConsts(), toolbarItems: { browserComponent: BrowserItem, button: ButtonItem, chat: ChatItem, dynamicMenu: DynamicMenuItem, emailNotifier: EMailNotifierItem, externalComponent: ExternalComponentItem, feed: FeedItem, highlighter: HighlighterItem, label: LabelItem, multicommunity: MultiCommunityItem, multiFeed: MultiFeedItem, privacy: PrivacyItem, radio: RadioItem, searchBox: SearchBoxItem, separator: SeparatorItem, toggleComponent: ToggleItem, weather: WeatherItem, myStuffWithOptions: MyStuffWithOptionsButtonItem, myStuff: MyStuffButtonItem, twitter: TwitterItem, facebook: FacebookItem }, toolbarItemsFactory: new ToolbarItemsFactory(), toolbarItemData: ToolbarItemData, observerData: { settings: "eb-settings", userAddComponents: "eb-userComponents", thirdParty: "eb-thirdParty", languagePack: "eb-languagePack", switchCommunity: "eb-switchCommunity", myStuff: "eb-myStuff", myStuffSwitchedOn: "eb-myStuffSwitchedOn" }, observerTopic: "eb-toolbar-data-changed", consts: new ToolbarDataConsts() }; function ToolbarDataConsts() { this.aliases = new Object(); this.aliases.MainFrameURL = 'EB_MAIN_FRAME_URL'; this.aliases.ToolbarID = 'EB_TOOLBAR_ID'; this.aliases.UserID = 'EB_USER_ID'; this.aliases.SearchTerm = 'EB_SEARCH_TERM'; this.aliases.ToolbarVersion = 'EB_TOOLBAR_VERSION'; this.aliases.ToolbarOriginalID = 'EB_ORIGINAL_CTID'; this.aliases.MainFrameTitle = 'EB_MAIN_FRAME_TITLE'; this.aliases.ToolbarSubDomain = 'EB_TOOLBAR_SUB_DOMAIN'; }; var LanguagePackDefaults = { terms: new HashArray(true), init: function() { this.terms.Add('CTLP_STR_ID_GLOBAL_OK', 'OK'); this.terms.Add('CTLP_STR_ID_GLOBAL_CANCEL', 'Cancel'); this.terms.Add('CTLP_STR_ID_GLOBAL_YES', 'Yes'); this.terms.Add('CTLP_STR_ID_GLOBAL_NO', 'No'); this.terms.Add('CTLP_STR_ID_GLOBAL_BROWSE', 'Browse...'); this.terms.Add('CTLP_STR_ID_GLOBAL_NEW', 'new'); this.terms.Add('CTLP_STR_ID_GLOBAL_UNREAD', 'unread'); this.terms.Add('CTLP_ADD_USER_COMPONENT_WARNING_DESCRIPTION', 'You are about to add a component to your toolbar. Click OK to allow this component.'); this.terms.Add('CTLP_STR_ID_ADD_ALERT_DESCRIPTION', 'You are about to subscribe to receive new alerts.\n\nAlerts are special messages that are sent to you via the community toolbar.\nThe alerts usually include important news or special offers, are sent only to members of the community, and can always be easily unsubscribed.\n\nDo you want to subscribe to the alerts?'); this.terms.Add('CTLP_STR_ID_GLOBAL_DO_NOT_SHOW_AGAIN', 'Do not show again'); this.terms.Add('CTLP_STR_ID_GLOBAL_HELP', 'Help'); this.terms.Add('CTLP_STR_ID_SEPERATOR_TEXT', 'Separator'); this.terms.Add('CTLP_STR_ID_SEARCH_HISTORY', 'History'); this.terms.Add('CTLP_STR_ID_SEARCH_SUGGESTIONS', 'Suggestions'); this.terms.Add('CTLP_STR_ID_NO_SEARCH_HISTORY_FOUND', '(No Search History)'); this.terms.Add('\@APPSERVER_MAIN_MENU_PRIVACY_APPSERVER\@', 'Privacy'); this.terms.Add('CTLP_STR_ID_GLOBAL_EULA', 'End user License Agreement'); this.terms.Add('CTLP_STR_ID_GLOBAL_PRIVACY_POLICY', 'Privacy Policy'); //this.terms.Add('CTLP_STR_ID_GLOBAL_PRIVACY_TEXT', 'For more information about the community toolbar, please view our'); this.terms.Add('CTLP_STR_ID_GLOBAL_AND', 'and'); this.terms.Add('CTLP_STR_ID_GLOBAL_LEARN_MORE', 'Learn more...'); this.terms.Add('CTLP_STR_ID_SEARCH_LIST_BOX_HISTORY_TITLE', 'Clear History'); //toolbar options dialog this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_TITLE', 'Toolbar Options'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_PERSONAL_COMPONENTS_TAB_TITLE', 'Personal Components'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_PERSONAL_COMPONENTS_TAB_DESCRIPTION', 'You can choose to include these additional useful components in the toolbar:'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_EMAIL_NOTIFIER_COMP_TITLE', 'E-mail Notifier'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_EMAIL_NOTIFIER_COMP_DESCRIPTION', 'Automatically notifies you of new e-mails you receive'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_EMAIL_NOTIFIER_SETTINGS_BUTTON', 'E-mail Notifier Settings…'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_PRIVACY_COMP_TITLE', 'Privacy Component'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_PRIVACY_COMP_DESCRIPTION', 'Includes cookie cleaner, history cleaner, and cache cleaner.'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_WEATHER_COMP_TITLE', 'Weather Forecaster'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_WEATHER_COMP_DESCRIPTION', 'Shows the current local weather all over the world'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_RADIO_COMP_TITLE', 'Online Radio Player'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_RADIO_COMP_DESCRIPTION', 'Lets you easily listen to online radio stations and podcasts'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_PREDEFINED_COMPONENTS_TAB_TITLE', 'Predefined Components'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_PREDEFINED_COMPONENTS_TAB_DESCRIPTION', 'You can select which one of these predefined components to add and remove from the toolbar.'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_DELETE_COMPONENT_BUTTON', 'Delete'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_USEFUL_COMPONENTS_TAB_TITLE', 'Useful Components'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_USEFUL_COMPONENTS_TAB_DESCRIPTION', 'You can choose to include these additional useful components in the toolbar.'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_AUTO_UPDATE_DESCRIPTION', 'Enable Automatic Update'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_TAB_TITLE', 'Additional Settings'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_TAB_DESCRIPTION', 'You will be able to change this settings at any time.'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_ENABLE_HISTORY', 'Enable search box history'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_SUGGEST', 'Suggest search from my search history'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_BUTTON_CLEAR_HISTORY', 'Clear search history'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_CONFIRM_CLEAR_HISTORY', 'Are you sure you want to clear the search history?'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_USAGE', 'Send usage statistics (help us improve our toolbar).'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_CLICK_TO_SEARCHBOX', 'Enable select to search box (selecting text on the page will send it to the search box).'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_BACK_TO_DEFAULT_SEARCH_ENGINE', 'Always revert to default search engine.'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_SEARCH_IN_NEW_TAB', 'Show the Search page when opening a new tab.'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_HIDE_COMPONENT_BUTTON', 'Hide'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_SHOW_COMPONENT_BUTTON', 'Show'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ADDITIONAL_SHOW_POPUP_ON_COMMUNITY_DETECTED', 'Show tooltip when community toolbar detected.'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ALERT_SETTINGS_BUTTON', 'Alert Settings...'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ALERT_SETTINGS_DESCRIPTION', 'Alerts are community messages you can get right to your desktop.'); this.terms.Add('CTLP_STR_ID_FIX_PAGE_NOT_FOUND_ERRORS', 'Fix "page not found" errors.'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_ENABLE_SEARCH_ADDRESS_BAR', 'Enable search from address bar.'); //my stuff in options dialog this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_MY_STUFF_TAB_TITLE', 'My Stuff'); this.terms.Add('CTLP_STR_ID_OPTIONS_DLG_MY_STUFF_TAB_DESCRIPTION', 'The components you added to your toolbar are listed below.\nSelect a component and then an action button.'); //email notifier this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_TITLE', 'E-mail Notifier Settings'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_INNER_TITLE', 'E-mail Notifier Settings'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_INNER_DESCRIPTION', 'Get notified of new e-mails in your e-mail accounts directly in the toolbar.'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_LIST_TITLE', 'Just enter your e-mail account details and get easy access to all of your e-mails.'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_LIST_CUL_NAME', 'Account Name'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_LIST_CUL_ADDRESS', 'E-mail Address'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_LIST_CUL_TYPE', 'Account Type'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_LIST_CUL_AUTOLOGIN', 'Auto Login'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_BUTT_ADD_TEXT', 'Add'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_BUTT_EDIT_TEXT', 'Edit'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_BUTT_DELETE_TEXT', 'Delete'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_CHECK_EVERY_TEXT', 'Check for new e-mails every (minutes):'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_PLAY_SOUND_TEXT', 'Play a sound when new e-mails arrive'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_DEFAULT_SOUND_TEXT', 'Use default sound'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_DIFFERENT_SOUND_TEXT', 'Choose a different sound'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_BUTT_PLAY_TEXT', 'Play'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_FEEDBACK_LINK_TEXT', 'Tell us what you think about this component'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_SETTINGS_DLG_BUTT_TBOPTIONS_TEXT', 'Toolbar Options…'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_TITLE', 'E-mail Account Details'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_INNER_TITLE', 'E-mail Account Details'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_TYPE_TEXT', 'Account type:'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_HOTMAIL', 'Hotmail'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_YAHOO', 'Yahoo'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_GAMIL', 'Gmail'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_POP3', 'POP3'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_SUPPORTED_DOMAINS_TEXT', 'Supported domains'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_EMAIL_ADDRESS_TEXT', 'E-mail Address'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_USER_NAME_TEXT', 'User Name'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_PASSWORD_TEXT', 'Password'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_NAME_ACCOUNT_TEXT', 'Name your account'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_INCOMMING_SERVER_TEXT', 'Incoming mail server'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_PORT_TEXT', 'Port'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_OPEN_DEFAULT_CLIENT_TEXT', 'Open default mail client'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_AUTO_LOGIN_TEXT', 'Auto Login (will not ask for password when logging into my account)'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ADD_DLG_BUTT_TEST_MAIL_TEXT', 'Test e-mail account…'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_TITLE', 'E-mail Account Test'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_INNER_TITLE', 'E-mail Account Test'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_CUL_TASKS', 'Tasks'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_CUL_STATUS', 'Status'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_ESTABLISH', 'Entablish network connection'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_FIND_SERVER', 'Find mail server'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_LOGINTO', 'Log into mail server'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_FAILED_TESTING', 'Failed testing mail acocunt'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_COMPLETED', 'Completed'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_DONE_TESTING', 'Done'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_FAILED', 'Failed'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_PLEASE_LOGOUT_TEXT', 'Please logout of your web accounts first'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_TEST_DLG_COMPLETED_SUCC_TEXT', 'Mail account tested successfully'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_PASSWORD_DLG_TITLE', 'Confirm your account password'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_PASSWORD_DLG_DESC', "To enable automatic login please confirm this account's password"); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_PASSWORD_DLG_PASSWORD', 'Password:'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ALERT_MESSAGE_BOX_TITLE', 'E-mail Notifier Alert'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ALERT_MESSAGE_ACCOUNT_ALREADY_EXISTS', 'You have already defined an account with that address'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ALERT_MESSAGE_EMAIL_NOT_SUPPORTED', 'This e-mail address domain is not supported…'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ALERT_MESSAGE_INCCORECT_ADDRESS', 'The E-mail address you have entered appears to be incorrect'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ALERT_MSG_WRONG_PASSWORD_TITLE', 'Check e-mail password'); this.terms.Add('CTLP_STR_ID_EMAIL_NOTIFIER_ALERT_MSG_WRONG_PASSWORD', 'Incorrect password! Please enter the password that you have defined in this account'); // Radio this.terms.Add('CTLP_STR_ID_RADIO_SEARCH_DLG_TITLE', 'Search results for'); this.terms.Add('CTLP_STR_ID_RADIO_SEARCH_DLG_HEADER', 'Select the stations you want to add and click OK'); this.terms.Add('CTLP_STR_ID_RADIO_SEARCH_DLG_NO_STATIONS_FOUND', 'No stations were found'); this.terms.Add('CTLP_STR_ID_RADIO_MENU_ADD_AND_EDIT', 'Add and Edit Stations'); this.terms.Add('CTLP_STR_ID_RADIO_MENU_USER_DEFINED_STATIONS_TITLE', 'My Stations'); this.terms.Add('CTLP_STR_ID_RADIO_MENU_USER_DEFINED_STATIONS_TITLE_TTIP', 'Stations that you defined'); this.terms.Add('CTLP_STR_ID_RADIO_MENU_PUBLISHER_MORE_STATIONS_TITLE', 'More'); this.terms.Add('CTLP_STR_ID_RADIO_MENU_PUBLISHER_MORE_STATIONS_TITLE_TTIP', 'View additional radio stations'); this.terms.Add('CTLP_STR_ID_RADIO_MENU_NOPODCAST_TITLE', 'No items found in podcast'); this.terms.Add('CTLP_STR_ID_RADIO_MENU_PODCAST_TIMEOUT_TITLE', 'Podcast currently not available'); this.terms.Add('CTLP_STR_ID_RADIO_LOCAL_STATIONS', 'Local Stations'); this.terms.Add('CTLP_STR_ID_RADIO_RECENT_STATIONS', 'Recent Stations'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_COMBO_CHOOSE_STREAM_TYPE', 'Chose stream type'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_COMBO_CHOOSE_WINDOWS_MEDIA_PLAYER', 'Windows Media Player'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_COMBO_CHOOSE_REAL_PLAYER', 'Real Player'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_COMBO_CHOOSE_PODCAST', 'Podcast'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_CANT_REMOVE_MESSAGE_CURRENT_STATION_PLAYED', "cannot be deleted since it's currently being played. Please switch to a different station and then delete this one"); this.terms.Add('CTLP_STR_ID_RADIO_ADD_CANT_REMOVE_MESSAGE_CURRENT_STATION_STOPPED', "cannot be deleted since it's selected for playing. Please switch to a different station and then delete this one"); this.terms.Add('CTLP_STR_ID_RADIO_ADD_SELECT_AUDIO_FILES_TITLE', "Select Audio Files"); this.terms.Add('CTLP_STR_ID_RADIO_LOADING', 'Loading...'); this.terms.Add('CTLP_STR_ID_RADIO_LOADING_TTIP', 'Wait loading...'); this.terms.Add('CTLP_STR_ID_RADIO_NO_STATIONS', 'No stations'); this.terms.Add('CTLP_STR_ID_RADIO_PLAY_TTIP', 'Play'); this.terms.Add('CTLP_STR_ID_RADIO_STOP_TTIP', 'Stop'); this.terms.Add('CTLP_STR_ID_RADIO_SHRINK_TTIP', 'Shrink'); this.terms.Add('CTLP_STR_ID_RADIO_UNSHRINK_TTIP', 'Unshrink'); this.terms.Add('CTLP_STR_ID_RADIO_VOLUME_TTIP', 'Volume'); this.terms.Add('CTLP_STR_ID_RADIO_PLAY_EQUALIZER_TTIP', 'Playing'); this.terms.Add('CTLP_STR_ID_RADIO_STOP_EQUALIZER_TTIP', 'Stopped'); this.terms.Add('CTLP_STR_ID_RADIO_BUFFERING_EQUALIZER_TTIP', 'Buffering'); this.terms.Add('CTLP_STR_ID_RADIO_CONNECTING_EQUALIZER_TTIP', 'Connecting...'); this.terms.Add('CTLP_STR_ID_RADIO_SETTINGS_DLG_TITLE', 'Radio Stations'); this.terms.Add('CTLP_STR_ID_RADIO_SETTINGS_DLG_FIND_MORE_STATIONS', 'Add Stations'); this.terms.Add('CTLP_STR_ID_RADIO_SETTINGS_DLG_IDC_STATIC_SEARCH_STATIONS', 'Search for Stations'); this.terms.Add('CTLP_STR_ID_RADIO_SETTINGS_DLG_FIND_MORE_STATIONS_TTIP', 'Add and edit the stations in the radio'); this.terms.Add('CTLP_STR_ID_RADIO_SETTINGS_DLG_IDC_BUTTON_SEARCH_DIALOG', 'Search'); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_80S', "80's"); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_ALTERNATIVE', 'Alternative'); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_CHRISTIAN', 'Christian'); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_COUNTRY', 'Country'); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_LATINE', 'Latin'); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_OLDIES', 'Oldies'); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_RAP', 'Rap'); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_ROCK', 'Rock') this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_JAZZ', 'Jazz'); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_DEFINE_YOUR_OWN', 'Define your own station'); this.terms.Add('CTLP_STR_ID_RADIO_CATEGORY_BROWSE_LOCAL', 'Add your files'); this.terms.Add('CTLP_STR_ID_RADIO_STATIC_MANAGE_MY_STATIONS', 'Manage Your Stations'); this.terms.Add('CTLP_STR_ID_RADIO_BUTTON_EDIT_STATION', 'Edit'); this.terms.Add('CTLP_STR_ID_RADIO_BUTTON_REMOVE_DIALOG', 'Remove'); this.terms.Add('CTLP_STR_RADIO_STATIONS_LIST_NAME_CAPTION', 'Station Name'); this.terms.Add('CTLP_STR_RADIO_STATIONS_LIST_URL_CAPTION', 'URL'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_ADD_TITLE', 'Add Your Own Radio Station'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_EDIT_TITLE', 'Edit Radio Station'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_ADD_HEADER', 'Enter the name and stream URL of the station you want to add'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_EDIT_HEADER', 'Edit the name and steam URL of the selected station'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_INVALID_STREAM_URL', 'Invalid stream URL'); this.terms.Add('CTLP_STR_ID_RADIO_ADD_DLG_INVALID_STREAM_CAPTION', 'Invalid Stream Caption'); this.terms.Add('CTLP_STR_ID_STATIC_NAME_EG', 'e.g. 100FM'); this.terms.Add('CTLP_STR_ID_STATIC_URL_EG', 'e.g. http://radio-station.com/stream.asx'); this.terms.Add('CTLP_STR_ID_STATIC_URL', 'Stream URL'); this.terms.Add('CTLP_STR_ID_STATIC_NAME', 'Station Name'); this.terms.Add('CTLP_STR_ID_STATIC_TYPE', 'Stream Type'); this.terms.Add('CTLP_STR_ID_RADIO_REMOVE_MSG', 'Are you sure that you want to delete the selected station/s?'); this.terms.Add('CTLP_STR_ID_RADIO_REMOVE_MSG_CAPTION', 'Remove Radio Stations'); this.terms.Add('CTLP_STR_ID_RADIO_CLEAR_RECENT_STATIONS_MSG_CAPTION', 'Clear Recent Stations List'); this.terms.Add('CTLP_STR_ID_RADIO_CLEAR_RECENT_STATIONS_MSG', 'Are you sure that you want to clear the recent stations list ?'); this.terms.Add('CTLP_STR_ID_RADIO_CLEAR_RECENT_LIST', 'Clear Recent Stations List'); this.terms.Add('CTLP_STR_ID_RADIO_SETTINGS_TELL_US', 'Tell us what you think about the Radio Player'); //RSS this.terms.Add('CTLP_STR_ID_RSS_REFRESH_TOOLTIP', 'Refresh'); this.terms.Add('CTLP_STR_ID_RSS_DELETE_ALL_ITEMS_TOOLTIP', 'Delete All Items'); this.terms.Add('CTLP_STR_ID_RSS_MARK_ALL_AS_READ_TOOLTIP', 'Mark All Items As Read"'); this.terms.Add('CTLP_STR_ID_RSS_MARK_ALL_AS_UNREAD_TOOLTIP', 'Mark All Items As Unread'); this.terms.Add('CTLP_STR_ID_RSS_ADD_YOUR_COMMET_TO_BOX', 'Add your own comment to this box'); this.terms.Add('CTLP_STR_ID_RSS_OPEN_IN_NEW_TAB', 'Open in New Tab'); this.terms.Add('CTLP_STR_ID_RSS_OPEN_IN_NEW_WINDOW', 'Open in New Window'); this.terms.Add('CTLP_STR_ID_RSS_DELETE_MESSAGE', 'Delete Message'); this.terms.Add('CTLP_STR_ID_RSS_DELETE_ALL_ITEMS_TITLE', 'Delete All Items ?'); this.terms.Add('CTLP_STR_ID_RSS_DELETE_ALL_ITEMS_MESSAGE', 'Are you sure you want to delete all items ?'); this.terms.Add('CTLP_STR_ID_RSS_DELETE_ALL_ITEMS_DONT_ASK_AGAIN', 'Don\'t ask again'); //Multicommunity this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_MENU_COMMUNITY_TOOLBAR_DETECTED", "Community Toolbar Detected"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_MENU_NETWORK", "Search the Conduit Network"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_MENU_OPTIONS", "Edit"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_COMMUNITY_DETECTED_TT", "Subscribe to this community..."); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_OPTIONS_DLG_CAPTION", "Edit"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_OPTIONS_DLG_STATIC", "Here you can choose to hide or remove any of the community toolbars that you've previously added."); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_OPTIONS_DLG_SEARCH_HEADER", "Search the Conduit Network"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_OPTIONS_DLG_SEARCH_BUTT", "Search"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_OPTIONS_DLG_REMOVE_BUTT", "Remove"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_OPTIONS_DLG_MOVE_UP_BUTT", "Move Up"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_OPTIONS_DLG_MOVE_DOWN_BUTT", "Move Down"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_ADD_COMMUNITY_WARNING_INSTALL", "Download and install as a separate toolbar."); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_MENU_COMMUNITY_SWITCH_TO_DETECTED_TOOLBAR", "Switch to -"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_ADD_COMMUNITY_WARNING_REINSTALL", "Reinstall {TOOLBAR_NAME} toolbar"); this.terms.Add("CTLP_STR_ID_MULTI_CHANNEL_CANDIDATE_SEARCH_FOR", "Search the Conduit Network for"); this.terms.Add("CTLP_STR_ID_MULTI_COMMUNITY_ADD_WARNING_DLG_CAPTION", "Add Community Toolbar"); this.terms.Add("CTLP_STR_ID_MULTI_COMMUNITY_ADD_WARNING_DLG_ADD", "Add instantly to my list"); this.terms.Add("CTLP_STR_ID_MULTI_COMMUNITY_ADD_WARNING_DLG_TXT", "You can choose to instantly add the community toolbar to your list of community toolbars, or download and install it as a separate toolbar row on your browser."); this.terms.Add("CTLP_STR_ID_MULTI_COMMUNITY_DELETE_WARNING_DLG_CAPTION", "Remove Community Toolbar"); this.terms.Add("CTLP_STR_ID_MULTI_COMMUNITY_DELETE_WARNING_DLG_TEXT", "Are you sure you want to remove the [TOOLBAR NAME] community toolbar from your list?"); //new truste intermadiate dialog this.terms.Add("CTLP_STR_ID_ADD_COMMUNITY_DLG_TITLE", "Add to My Community Toolbar List"); this.terms.Add("CTLP_STR_ID_ADD_COMMUNITY_DLG_EXPLAIN1", "You have chosen to instantly add a community toolbar to your list."); this.terms.Add("CTLP_STR_ID_ADD_COMMUNITY_DLG_EXPLAIN2", "Click OK to add and switch to the community toolbar."); this.terms.Add("CTLP_STR_ID_ADD_COMMUNITY_DLG_LEARN_MORE", "Learn more (includes Privacy Policy and EULA)"); //Weather Dialog this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_TITLE", "Weather"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_SELECT_LOCATION_TITLE", "Select Location"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_CITY_NOT_FOUND", "City not found (Please type in English)"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_SERVICE_UNAVAILABLE", "The service is temporary unavailable"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_BTN_BACK", "Back"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_BTN_SELECT", "Select"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_BTN_SEARCH", "Search"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_FEEDBACK_LINK_CAPTION", "Feedback"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_SELECT_CITY", "Select a city from the list then click select."); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_WEATHER_FOR", "Weather for"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_CHANGE_LOCATION", "Change location..."); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_EXTENDED_FORCAST", "Extended forecast"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_RIGHT_NOW", "Right now"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_FEELS_LIKE", "Feels like:"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_WEATHER_UNAVAILABLE", "Weather information is temporarily unavailable. Please try again later."); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_EDITBOX_SEARCH_CITY", "Search for a country or city name"); this.terms.Add("CTLP_STR_ID_WEATHER_DIALOG_WEATHER_CHANGE_TO", "Change to"); this.terms.Add("CTLP_STR_ID_WEATHER_TOOLTIP_CAPTION", "The weather in"); this.terms.Add("CTLP_STR_ID_WEATHER_TOOLTIP_SKY", "Sky:"); this.terms.Add("CTLP_STR_ID_DEFAULT_WEATHER_BTN_TOOLTIP", "Get notified of the weather anywhere"); this.terms.Add("CTLP_STR_ID_DEFAULT_WEATHER_BTN_LOADING_TOOLTIP", "Loading weather information"); this.terms.Add("CTLP_STR_ID_DEFAULT_WEATHER_BTN_TEXT", "Weather"); this.terms.Add("CTLP_STR_ID_WEATHER_NO_DATA_TXT", "No Data"); //user menu items this.terms.Add("CTLP_STR_ID_MANAGE_PRIVATE_MENU_CAPTION", "Manage"); this.terms.Add("CTLP_STR_ID_MANAGE_PRIVATE_MENU_DLG_SUB_TITLE", "Stuff you've added"); this.terms.Add("CTLP_STR_ID_MANAGE_PRIVATE_MENU_DLG_EXPLAIN", "You can choose which of these items to keep or remove from the toolbar."); this.terms.Add("CTLP_STR_ID_MANAGE_PRIVATE_MENU_DLG_CAPTION", "Manage added items"); this.terms.Add("CTLP_STR_ID_MANAGE_PRIVATE_MENU_DLG_DELETE_ITEM", "Delete"); this.terms.Add("CTLP_STR_ID_MANAGE_PRIVATE_MENU_ADD_APPROVAL_TITLE", "Add content"); this.terms.Add("CTLP_STR_ID_MANAGE_PRIVATE_MENU_ADD_APPROVAL", "Click OK to add this content to the [COMPONENT NAME] menu\non the [TOOLBAR NAME] community toolbar."); this.terms.Add("CTLP_STR_ID_MANAGE_PRIVATE_MENU_ADD_APPROVAL2", "Click OK to add this content to the [TOOLBAR NAME] community toolbar."); //gadgets this.terms.Add("CTLP_STR_ID_GADGETS_ERROR_TEXT", "Sorry, this feature is experiencing temporary technical problems.Please try again soon."); //personal components this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_EMAIL", "E-mail Notifier"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_WEATHER", "Weather"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_RADIO", "Radio Player"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_INTRO", "Want to add these personalized buttons to your toolbar?"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_INTRO_SINGLE", "Want to add this personalized button to your toolbar?"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_SETTINGS_TITLE_FF", "Please configure the settings below; you can change them at any time."); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_SET_SEARCH_FF", "Set IObitCom customized Web Search as my default"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_SET_HOMEPAGE_FF", "Set my homepage to the IObitCom customized Web Search page"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_BOTTOM_FF", "For more information about the community toolbar, please view our"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_ABORT_INSTALLATION_FF", "Abort installation"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_FINISH_FF", "Finish"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_CONFIRM_UNINSTALL_BODY_FF", "Are you sure you want to abort the installation?\nIf you do, then the community toolbar will not appear\nthe next time you open your browser."); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_WELCOME_ONLY_TITLE_FF", "Congratulations, you now have the IObitCom toolbar installed."); //********* new mystuff ************ this.terms.Add("CTLP_STR_ID_MYSTUFF_ADD_STUFF_TOOLTIP", "Add Stuff: Get cool components for your toolbar"); this.terms.Add("CTLP_STR_ID_MYSTUFF_MANAGE_TOOLTIP", "Move or delete the components you added to your toolbar"); this.terms.Add("CTLP_STR_ID_MYSTUFF_MANAGE_CAPTION", "Manage"); //add component confirm this.terms.Add("CTLP_STR_ID_MYSTUFF_API_ADD_COMPONENT_CONFIRM_TITLE", "Add Toolbar Component"); this.terms.Add("CTLP_STR_ID_MYSTUFF_API_ADD_COMPONENT_CONFIRM_TEXT", "Are you sure you want to add [COMPONENT NAME] to your community toolbar?"); this.terms.Add("CTLP_STR_ID_MYSTUFF_API_ADD_COMPONENT_CONFIRM_TITLE_EXISTS", "Add Toolbar Component"); this.terms.Add("CTLP_STR_ID_MYSTUFF_API_ADD_COMPONENT_CONFIRM_TEXT_EXISTS", "You have already added [COMPONENT NAME] to your community toolbar. Would you like to update it?"); //add alert confirm this.terms.Add("CTLP_STR_ID_MYSTUFF_API_ADD_ALERT_CONFIRM_TITLE", "Add Desktop Alerts"); this.terms.Add("CTLP_STR_ID_MYSTUFF_API_ADD_ALERT_CONFIRM_TEXT", "Are you sure you want to receive [ALERTS NAME]?"); this.terms.Add("CTLP_STR_ID_MYSTUFF_API_ADD_ALERT_CONFIRM_ALERT_DISABLED_TEXT", "To receive [ALERTS NAME], your Alerts setting must be enabled. Would you like us to enable it for you?"); //tooltips this.terms.Add("CTLP_STR_ID_MYSTUFF_ERROR_TOOLTIP_COMP_NOT_EXISTS", "We're sorry, the toolbar component is no longer available."); this.terms.Add("CTLP_STR_ID_MYSTUFF_ERROR_TOOLTIP_TEMP_UNAVAILABLE", "We're sorry, the toolbar component is temporarily unavailable. Please try again soon."); this.terms.Add("CTLP_STR_ID_MYSTUFF_ERROR_TOOLTIP_TECH_ERROR", "There seems to be a problem with the toolbar component. Please try again. If the problem persists,"); this.terms.Add("CTLP_STR_ID_MYSTUFF_ERROR_TOOLTIP_CUSTOMER_SUPPORT_LINK_TEXT", "contact customer support"); this.terms.Add("CTLP_STR_ID_MYSTUFF_ERROR_TOOLTIP_UPGRADE_TOOLBAR_FULL_MSG", "To add the toolbar component, you need to upgrade your community toolbar version and then try adding the component again."); this.terms.Add("CTLP_STR_ID_MYSTUFF_ERROR_TOOLTIP_UPGRADE_TOOLBAR_LINK_TEXT", "Upgrade"); //tooltips titles this.terms.Add("CTLP_STR_ID_MYSTUFF_ERROR_TOOLTIP_TITLE_UNVAVAILABLE", "Component Unavailable"); this.terms.Add("CTLP_STR_ID_MYSTUFF_ERROR_TOOLTIP_TITLE_TEMP_UNAVAILABLE", "Component Temporarily Unavailable"); this.terms.Add("CTLP_STR_ID_MYSTUFF_ERROR_TOOLTIP_TITLE_UPGRADE", "Upgrade Community Toolbar"); //search engine this.terms.Add("CTLP_STR_ID_MYSTUFF_SEARCH_ENGINE_CAPTION", "Toolbar components"); //twitter this.terms.Add("CTLP_STR_ID_TWITTER_REFRESH_TWEETS_TOOLTIP", "Refresh Tweets"); this.terms.Add("CTLP_STR_ID_TWITTER_DELETE_ALL_TWEETS_TOOLTIP", "Delete All Tweets"); this.terms.Add("CTLP_STR_ID_TWITTER_ARE_YOU_SURE_DELETE_ALL_TWEETS", "Are you sure you want to delete all the tweets?"); //privacy this.terms.Add("CTLP_STR_ID_POPUP_BLOCKER_CLEAR_CASHE_APPROVAL_MSGBOX", "You are about to clear your browser's cache. Do you want to continue?"); this.terms.Add("CTLP_STR_ID_POPUP_BLOCKER_CLEAR_HISTORY_APPROVAL_MSGBOX", "You are about to clear your browser's history. Do you want to continue?"); this.terms.Add("CTLP_STR_ID_POPUP_BLOCKER_CLEAR_COOKIES_APPROVAL_MSGBOX", "You are about to delete your browser's cookies. Do you want to continue?"); //facebook this.terms.Add("CTLP_STR_ID_FACEBOOK_COMPONENT_LOGIN_TEXT", "Login"); this.terms.Add("CTLP_STR_ID_FACEBOOK_COMPONENT_LOGGED_OUT_HINT", "Log in to your Facebook toolbar component"); this.terms.Add("CTLP_STR_ID_FACEBOOK_COMPONENT_LOGGED_IN_HINT", "You're logged in to your Facebook toolbar component"); this.terms.Add("CTLP_STR_ID_OPTIONS_DLG_FACEBOOK_COMP_TITLE", "Facebook"); this.terms.Add("CTLP_STR_ID_OPTIONS_DLG_FACEBOOK_COMP_DESCRIPTION", "Open any Facebook page in a click and get alerts with your new messages and updates."); this.terms.Add("CTLP_STR_ID_OPTIONS_DLG_FACEBOOK_SETTINGS_BUTTON", "Facebook Settings..."); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_FACEBOOK_SINGLE", "Add the Facebook button"); this.terms.Add("CTLP_STR_ID_PERSONAL_COMP_DLG_FACEBOOK", "Facebook"); this.terms.Add("CTLP_STR_ID_FACEBOOK_LOGOUT_DIALOG_TITLE", "Facebook | Logout"); this.terms.Add("CTLP_STR_ID_FACEBOOK_LOGOUT_DIALOG_TEXT", "Are you sure you want to log out of your Facebook toolbar component?"); //facebook settings dialog this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_SETTING_TITLE", "Alert Settings"); this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_DLG_TITLE", "Facebook | Settings"); this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_ALERT_INBOX", "New Message"); this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_ALERT_FRIEND_REQUEST", "Friend Request"); this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_ALERT_GROUP", "Group Invitation"); this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_ALERT_EVENTS", "Event Invitation"); this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_ALERT_NEWS_FEED", "News Feed Update"); //this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_DLG_SUBTITLE", "Choose the alerts you wish to recieve"); this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_DLG_SUBTITLE_FIRST", "Would you like to receive alerts from Facebook?"); this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_DLG_SUBTITLE_SECOND", "Make your selections below:"); this.terms.Add("CTLP_STR_ID_FACEBOOK_SETTINGS_CHOOSE_FROM_OPTIONS", "Yes, send me Facebook alerts"); //facebook alerts this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_INBOX_TITLE", "New Message"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_FRIENDS_TITLE", "Friend Request"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_GROUPS_TITLE", "Group Invitation"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_EVENTS_TITLE", "Event Invitation"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_NEWS_FEED_TITLE", "News Feed Update"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_INBOX_GENERAL_HTML", "You have a <a EB_FB_LINK1>new message</a> in your Inbox."); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_INBOX_HTML", "<a EB_FB_LINK1>EB_FB_USER_NAME</a> has sent you a <a EB_FB_LINK2>new message</a>"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_FRIENDS_HTML", "<a EB_FB_LINK1>EB_FB_USER_NAME</a> has sent you a <a EB_FB_LINK2>friend request</a>"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_GROUPS_HTML", "You have been invited to join <a EB_FB_LINK1>EB_FB_GROUP_NAME</a>"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_EVENTS_HTML", "You have been invited to attend <a EB_FB_LINK1>EB_FB_EVENT_NAME</a>"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_HEADER", "[TOOLBAR_NAME] Alerts"); this.terms.Add("CTLP_STR_ID_FACEBOOK_STATUS_GADGET_STATUS_TXT", "Status"); this.terms.Add("CTLP_STR_ID_FACEBOOK_STATUS_GADGET_CLEAR_TXT", "Clear"); this.terms.Add("CTLP_STR_ID_FACEBOOK_STATUS_GADGET_POST_TXT", "Post"); this.terms.Add("CTLP_STR_ID_FACEBOOK_STATUS_GADGET_CANCEL_TXT", "Cancel"); this.terms.Add("CTLP_STR_ID_FACEBOOK_STATUS_GADGET_INPUT_TXT", "What's on your mind?"); this.terms.Add("CTLP_STR_ID_FACEBOOK_ALERT_MORE", "More >>"); }, GetByID: function(key) { if (!this.terms.Contains(key)) return ""; else return this.terms.GetByID(key); } }; LanguagePackDefaults.init(); function LanguagePackDS(xmlLanguagePack) { this.locale = ""; this.lastUpdateTime = 0; var terms = new HashArray(); this.init = function() { this.locale = XML.GetSingleNodeValue(xmlLanguagePack, "LOCALE").toLowerCase(); var newLut = XML.GetSingleNodeValue(xmlLanguagePack, "LAST_UPDATE_TIME", 0); //bug fix, old version saved as LAST_UPDATE var oldLut = XML.GetSingleNodeValue(xmlLanguagePack, "LAST_UPDATE", 0); this.lastUpdateTime = (newLut) ? newLut : oldLut; var xmlTerms = XML.SelectSingleNode(xmlLanguagePack, "TRANSLATED_KEYS"); if (!xmlTerms || xmlTerms.childNodes.length == 0) return; var xmlTerm = null; var key, translation; for (var i = 0; i < xmlTerms.childNodes.length; i++) { xmlTerm = xmlTerms.childNodes[i]; key = XML.GetSingleNodeValue(xmlTerm, "KEY_ID"); translation = XML.GetSingleNodeValue(xmlTerm, "TRANSLATION"); if (key && translation) { terms.Add(key, XML.FromLegalXml(translation)); } } }; this.GetByID = function(key, locale) { if (!locale || locale.toLowerCase() != this.locale || !terms.Contains(key)) return LanguagePackDefaults.GetByID(key); return terms.GetByID(key); }; //get by id without locale this.GetByIDNL = function(key) { return (terms.Contains(key)) ? terms.GetByID(key) : LanguagePackDefaults.GetByID(key); }; if (xmlLanguagePack) this.init(); }; function ComponentsIDs() { this.MainMenu = '100'; this.SearchBox = '101'; this.Highlighter = '102'; this.EMailNotifier = '103'; this.Privacy = '104'; this.Weather = '105'; this.Radio = '107'; this.Facebook = '116'; this.MultiCommunity = '200'; this.Chevron = "201"; this.ChevronMyStuff = "202"; this.MyStuffSplitter = "203"; this.Chat = ''; this.MyStuffAddButton = "204"; this.MyStuffOptionsButton = "205"; }; function GeneralToolbarInfo(XMLGeneralInfo, actingCTID, originalCTID, objToolbarDefaults) { var fix404Flag = false; var WEATHER_COMPONENT_TAG_NAME = "WEATHER"; var EMAIL_COMPONENT_TAG_NAME = "EMAIL_NOTIFIER"; var RADIO_COMPONENT_TAG_NAME = "RADIO_PLAYER"; var PRIVACY_COMPONENT_TAG_NAME = "PRIVACY_COMPONENT"; this.style = null; this.skin = new ToolbarSkin(null, new ToolbarStyle(), null, objToolbarDefaults.chromeName); this.writeToUsCmd = ""; this.toolbarAlignMode = ""; this.toolbarName = ""; this.allowNonPrivacyFunctions = null; //boolean this.displayTrusteSeal = null; //boolean this.webServerUrl = ""; this.myWebServerUrl = ""; this.tellAfriendCmd = ""; this.fixPageNotFoundUrl = ""; this.userComponentsState = new UserComponentsState(); this.myStuffEnabled = true; this.myStuffBlinkBGColor = ""; this.myStuffPublisherMinWidth = ""; this.searchInNewTabEnabled = false; this.searchInNewTabServiceUrl = ""; this._init = function() { var xmlUserComponentsState = XML.SelectSingleNode(XMLGeneralInfo, "USER_COMPONENTS_STATE"); var xmlUserComponentsVisibilityFlags = XML.SelectSingleNode(XMLGeneralInfo, "USER_COMPONENTS_VISIBILITY_FLAGS"); this.handleUserComponents(xmlUserComponentsState, xmlUserComponentsVisibilityFlags); this.style = new ToolbarStyle(XML.SelectSingleNode(XMLGeneralInfo, "FONT")); this.writeToUsCmd = XML.GetSingleNodeValue(XMLGeneralInfo, "WRITE_TO_US_CMD"); this.toolbarAlignMode = XML.GetSingleNodeValue(XMLGeneralInfo, "ALIGN_MODE"); this.toolbarName = XML.GetSingleNodeValue(XMLGeneralInfo, "TOOLBAR_NAME"); this.allowNonPrivacyFunctions = XML.GetSingleNodeValueAsBoolean(XMLGeneralInfo, "ALLOW_NON_PRIVACY_FUNCTIONS", true); this.displayTrusteSeal = XML.GetSingleNodeValueAsBoolean(XMLGeneralInfo, "DISPLAY_TRUSTE_SEAL", false); this.webServerUrl = XML.GetSingleNodeValue(XMLGeneralInfo, "WEB_SERVER_URL", objToolbarDefaults.webServerUrl); this.myWebServerUrl = XML.GetSingleNodeValue(XMLGeneralInfo, "MY_WEB_SERVER_URL"); //tell a friend var xmlTellAfriend = XML.SelectSingleNode(XMLGeneralInfo, "TELL_A_FRIEND"); if (xmlTellAfriend) this.tellAfriendCmd = XML.GetSingleNodeValue(xmlTellAfriend, "CMD"); //mystuff enabled this.myStuffEnabled = XML.GetSingleNodeValueAsBoolean(XMLGeneralInfo, "MY_STUFF_ENABLED", true); //mystuff blink bg color var xpathResult = XMLGeneralInfo.ownerDocument.evaluate("MY_STUFF/BLINK_BG_COLOR", XMLGeneralInfo, null, 2, null); if (xpathResult && xpathResult.stringValue) this.myStuffBlinkBGColor = xpathResult.stringValue; //mystuff publisher min width xpathResult = XMLGeneralInfo.ownerDocument.evaluate("MY_STUFF/PUBLISHER_RESERVED_AREA_PX", XMLGeneralInfo, null, 2, null); if (xpathResult && xpathResult.stringValue) this.myStuffPublisherMinWidth = parseInt(xpathResult.stringValue); //fix page not found 404 var defaultFixPageNotFoundUrl = this.webServerUrl + stringFormat("notfound/?actid={0}&octid={1}&url=EB_MAIN_FRAME_URL", actingCTID, originalCTID); this.fixPageNotFoundUrl = XML.GetSingleNodeValue(XMLGeneralInfo, "FIX_PAGE_NOT_FOUND_ERROR_URL", defaultFixPageNotFoundUrl); this.fixPageNotFoundUrl = URL.AddHTTPProtocol(this.fixPageNotFoundUrl); //replace aliases this.fixPageNotFoundUrl = this.fixPageNotFoundUrl.replace(ToolbarDataParsingXPCOM.consts.aliases.ToolbarID, actingCTID); this.fixPageNotFoundUrl = this.fixPageNotFoundUrl.replace(ToolbarDataParsingXPCOM.consts.aliases.ToolbarOriginalID, originalCTID); //search in new tab var xmlNewTab = XML.SelectSingleNode(XMLGeneralInfo, "SEARCH_IN_TAB_SERVICE"); if (xmlNewTab) { this.searchInNewTabEnabled = XML.GetSingleNodeValueAsBoolean(xmlNewTab, "ENABLED", false); this.searchInNewTabServiceUrl = XML.GetSingleNodeValue(xmlNewTab, "SERVICE_URL"); } //skin info var xmlSkinInfo = XML.SelectSingleNode(XMLGeneralInfo, "SKIN"); this.skin = new ToolbarSkin(xmlSkinInfo, this.style , this.myStuffBlinkBGColor ,objToolbarDefaults.chromeName); }; this.handleUserComponents = function(xmlUserComponentsState, xmlUserComponentsVisibilityFlags) { var oComp = null; oComp = this._getPersonalComponentVisibilityFlags(xmlUserComponentsVisibilityFlags, xmlUserComponentsState, WEATHER_COMPONENT_TAG_NAME); if (oComp) this.userComponentsState.weather = oComp; oComp = this._getPersonalComponentVisibilityFlags(xmlUserComponentsVisibilityFlags, xmlUserComponentsState, RADIO_COMPONENT_TAG_NAME); if (oComp) this.userComponentsState.radio = oComp; oComp = this._getPersonalComponentVisibilityFlags(xmlUserComponentsVisibilityFlags, xmlUserComponentsState, EMAIL_COMPONENT_TAG_NAME); if (oComp) this.userComponentsState.emailNotifier = oComp; oComp = this._getPersonalComponentVisibilityFlags(xmlUserComponentsVisibilityFlags, xmlUserComponentsState, PRIVACY_COMPONENT_TAG_NAME); if (oComp) this.userComponentsState.privacy = oComp; }; this._getPersonalComponentVisibilityFlags = function(xmlFlags, xmlUserComponentsState, tagName) { if (!xmlFlags && !xmlUserComponentsState) return null; var oComponent = null; if (xmlFlags) { var xmlState = XML.SelectSingleNode(xmlFlags, tagName); if (xmlState) { var isAvailable = XML.GetSingleNodeValueAsBoolean(xmlState, "AVAILABLE", null); var isChecked = XML.GetSingleNodeValueAsBoolean(xmlState, "CHECKED", null); oComponent = new UserComponentState(isAvailable, isChecked); } } if (!oComponent) { if (!xmlUserComponentsState) return null; else { oComponent = new UserComponentState(true, null); oComponent.checked = XML.GetSingleNodeValueAsBoolean(xmlUserComponentsState, tagName, true); } } else if (oComponent.checked == null && xmlUserComponentsState) oComponent.checked = XML.GetSingleNodeValueAsBoolean(xmlUserComponentsState, tagName, true); return oComponent; }; if (XMLGeneralInfo) this._init(); }; function LogoIconItem(xmlLogoIcon) { this.tooltip = ""; this.link = ""; this.path = ""; this._init = function() { this.tooltip = XML.GetSingleNodeValue(xmlLogoIcon, "TOOLTIP"); this.link = URL.LegalizeLinkUrl(XML.GetSingleNodeValue(xmlLogoIcon, "LINK")); this.path = URL.AddHTTPProtocol(XML.GetSingleNodeValue(xmlLogoIcon, "PATH")); }; if (xmlLogoIcon) this._init(); }; function MyStuffComponentData() { this.lastUpdateTime = ""; this.lastCheckTime = ""; this.compGuid = ""; this.compInstanceGuid = ""; this.uniqueCompId = ""; this.isDynamic = true; //fills this instance and returns component's xml this.initFromXml = function(xmlMyStuffComponent) { if (!xmlMyStuffComponent) return; this.lastUpdateTime = XML.GetSingleNodeValue(xmlMyStuffComponent, "LAST_UPDATE_TIME"); this.lastCheckTime = XML.GetSingleNodeValue(xmlMyStuffComponent, "LAST_CHECK_TIME"); this.compGuid = XML.GetSingleNodeValue(xmlMyStuffComponent, "COMPONENT_GUID"); this.compInstanceGuid = XML.GetSingleNodeValue(xmlMyStuffComponent, "COMPONENT_INSTANCE_GUID"); this.isDynamic = XML.GetSingleNodeValue(xmlMyStuffComponent, "IS_DYNAMIC"); var xmlComponent = XML.SelectSingleNode(xmlMyStuffComponent, "COMPONENT_XML"); if (xmlComponent.childNodes.length == 1) xmlComponent = xmlComponent.firstChild; else { for (var i = 0; i < xmlComponent.childNodes.length; i++) { if (xmlComponent.childNodes[i].tagName) { xmlComponent = xmlComponent.childNodes[i]; break; } } } this.uniqueCompId = XML.GetSingleNodeValue(xmlComponent, "UNIQUE_COMP_ID"); return xmlComponent; }; this.updateFromResponse = function(objMyStuffRS) { if (!objMyStuffRS) return; this.lastUpdateTime = objMyStuffRS.lastUpdateTime; this.lastCheckTime = Date.parse(Date()); this.isDynamic = true; this.compInstanceGuid = objMyStuffRS.compInstanceGuid; var xmlComponent = objMyStuffRS.xmlComponent; return xmlComponent; }; this.toXml = function(xmlComponent) { var strXml = "<COMPONENT/>"; var xmlDoc = XML.GetXmlDocument(strXml); var xmlRoot = xmlDoc.documentElement; if (this.isDynamic) { xmlRoot.appendChild(XML.CreateXmlTextNode(xmlDoc, "LAST_UPDATE_TIME", this.lastUpdateTime)); xmlRoot.appendChild(XML.CreateXmlTextNode(xmlDoc, "LAST_CHECK_TIME", this.lastCheckTime)); } xmlRoot.appendChild(XML.CreateXmlTextNode(xmlDoc, "COMPONENT_GUID", this.compGuid)); xmlRoot.appendChild(XML.CreateXmlTextNode(xmlDoc, "COMPONENT_INSTANCE_GUID", this.compInstanceGuid)); xmlRoot.appendChild(XML.CreateXmlTextNode(xmlDoc, "IS_DYNAMIC", this.isDynamic.toString())); var xmlCompNode = xmlDoc.createElement("COMPONENT_XML"); xmlCompNode.appendChild(xmlComponent); xmlRoot.appendChild(xmlCompNode); return xmlRoot; }; }; function ToolbarData() { this.publisherItemsHash = null; //settings components this.userItemsHash = null; this.thirdPartyItemsHash = null; this.myStuffItemsHash = null; //key - UniqueCompID this.myStuffDataHash = null; //key - compGuid - for API this.myStuffUniqueCompIdToCompGuidHash = null; this.generalToolbarInfo = null; this.componentsIds = null; //init default LP this.languagePack = new LanguagePackDS(null); this.getItem = function(uniqueCompID) { if (this.publisherItemsHash && this.publisherItemsHash.Count() > 0 && this.publisherItemsHash.Contains(uniqueCompID)) return this.publisherItemsHash.GetByID(uniqueCompID); if (this.userItemsHash && this.userItemsHash.Count() > 0 && this.userItemsHash.Contains(uniqueCompID)) return this.userItemsHash.GetByID(uniqueCompID); if (this.thirdPartyItemsHash && this.thirdPartyItemsHash.Count() > 0 && this.thirdPartyItemsHash.Contains(uniqueCompID)) return this.thirdPartyItemsHash.GetByID(uniqueCompID); if (this.myStuffItemsHash && this.myStuffItemsHash.Count() > 0 && this.myStuffItemsHash.Contains(uniqueCompID)) return this.myStuffItemsHash.GetByID(uniqueCompID); return null; }; this.getEmailNotifierItem = function() { return this.getItem(this.componentsIds.EMailNotifier); }; this.getWeatherItem = function() { return this.getItem(this.componentsIds.Weather); }; this.getPrivacyItem = function() { return this.getItem(this.componentsIds.Privacy); }; this.getRadioItem = function() { return this.getItem(this.componentsIds.Radio); }; this.getFacebookItem = function() { return this.getItem(this.componentsIds.Facebook); }; }; function ToolbarItemData(xmlNode, compType, isPublisher, chromeName, originalCTID, actingCTID) { this.xmlNode = xmlNode; this.compType = compType; this.isPublisher = isPublisher; this.chromeName = chromeName; this.originalCTID = originalCTID; this.actingCTID = actingCTID; }; function Button(objData) { this.text = ""; this.image = ""; this.tooltip = ""; this.type = ""; //for POPHTML this.data = null; this.InitWithXML = function(XMLNode) { var XMLRoot = XMLNode.ownerDocument ? XMLNode : XMLNode.documentElement; var XMLChildNode = null; for (var i = 0; i < XMLRoot.childNodes.length; i++) { var XMLChildNode = XMLRoot.childNodes[i]; if (XMLChildNode.tagName == "DEFAULT_BUTTON_TEXT") { this.text = XML.GetXmlNodeValue(XMLChildNode); } else if (XMLChildNode.tagName == "BUTTON_ICON_URL") { this.image = XML.GetXmlNodeValue(XMLChildNode); if (this.image) { var oManager = DefaultsXPCOM.getManager(objData.chromeName, objData.originalCTID); this.image = oManager.getImageUrl(this.image); } } else if (XMLChildNode.tagName == "BUTTON_TOOLTIP") { this.tooltip = XML.GetXmlNodeValue(XMLChildNode); } else if (XMLChildNode.tagName == "DATA") { this.data = ToolbarDataParsingXPCOM.dataNodeFactory.getDataObject(XMLChildNode); if (this.data.isValid()) this.type = this.data.type; } } }; }; function BaseToolbarItem(objData) { this.objData = objData; this.UniqueCompID = ""; this.CompType = ""; this.DisplayText = ""; this.DisplayIcon = ""; this.isPersonalComponent = false; this.isMustHaveComponents = false; this.personalComponentState = null; this.Permission = ToolbarDataParsingXPCOM.Editable.FULL; this.ShowInChevron = true; this.initCompType = function() { this.CompType = this.objData.compType; }; this.parseCommonData = function() { this.UniqueCompID = XML.GetSingleNodeValue(this.objData.xmlNode, "UNIQUE_COMP_ID", ""); this.DisplayText = XML.GetSingleNodeValue(this.objData.xmlNode, "DISPLAY_TEXT", this.DisplayText); this.DisplayIcon = XML.GetSingleNodeValue(this.objData.xmlNode, "DISPLAY_ICON", this.DisplayIcon); if (this.DisplayIcon) this.DisplayIcon = URL.AddHTTPProtocol(this.DisplayIcon); }; this.parse = function() { //implement in inherited class }; this.parseUserAttributes = function() { if (this.isPersonalComponent) { this.Permission = ToolbarDataParsingXPCOM.Editable.NONE; this.CompType = ToolbarDataParsingXPCOM.ComponentType.Settings; } else { var xmlUserAttributes = XML.SelectSingleNode(this.objData.xmlNode, "USER_ATTRIBUTES"); if (!xmlUserAttributes) return; var permission = XML.GetSingleNodeValue(xmlUserAttributes, "PERMISSION"); if (permission) this.Permission = permission; this.ShowInChevron = XML.GetSingleNodeValueAsBoolean(xmlUserAttributes, "SHOW_IN_CHEVRON", this.ShowInChevron); } }; this.validateUniqueCompID = function() { if (!this.UniqueCompID) this.UniqueCompID = Math.random() * 10; }; this.validateTextAndIcon = function() { //implement in inherited class }; this._getVisiblePrefName = function() { var strPrefName = this.objData.originalCTID + "."; if (!this.isPersonalComponent && this.objData.originalCTID != this.objData.actingCTID) strPrefName += this.objData.actingCTID + "." strPrefName += (this.objData.compType == ToolbarDataParsingXPCOM.ComponentType.MyStuff) ? "MyStuffComponents." : "components."; strPrefName += this.UniqueCompID; return strPrefName; }; this.isShow = function() { if (this.isMustHaveComponents) return true; if (!this.isAvailable) return false; var strPrefName = this._getVisiblePrefName(); var hasUserValue = PrefService.HasUserValue(strPrefName); var userValue = PrefService.GetPref(strPrefName); //regular components if (!this.isPersonalComponent) { if (hasUserValue) return userValue; else if (this.CompType == ToolbarDataParsingXPCOM.ComponentType.ThirdParty) return false; else return true; } //personal components else return this.isShowPersonalComponent(hasUserValue, userValue); }; this.setShowState = function(bIsShown) { var strPrefName = this._getVisiblePrefName(); PrefService.SetPref(strPrefName, bIsShown); }; // +++++++++++++ personal components functions ++++++++++++++++ //is show component (in case of personal component, used internally this.isShowPersonalComponent = function(hasUserValue, userValue) { //not avaliable, don't show if (!this.isAvailable()) return false; //has user value, show according it if (hasUserValue) return userValue; //publisher component, and not disabled by user if (this.objData.isPublisher) return true; var firstTimePrefName = this.objData.originalCTID + "." + LoginPrefConsts.FirstTime; var isFirstTime = (PrefService.GetPref(firstTimePrefName) == true) ? false : true; //don't show personal component, unless it's publisher added, before user accepted welcome dialog if (isFirstTime) return false; //default value, user didn't change it else return this.personalComponentState.checked; }; //is available in options dialog this.isAvailable = function() { if (!this.isPersonalComponent || !this.personalComponentState) return true; if (this.objData.isPublisher) return true; return this.personalComponentState.available; }; this.isShowInPersonalComponentsDialog = function() { if (this.objData.isPublisher) return false; else return this.personalComponentState.available && this.personalComponentState.checked; }; this.isCheckedInPersonalComponentsDialog = function() { if (!this.isShowInPersonalComponentsDialog()) return false; else return this.personalComponentState.checked; }; // +++++++++++++ personal components functions end ++++++++++++++++ this.init = function() { this.initCompType(); this.parseCommonData(); this.parse(); this.parseUserAttributes(); this.validateUniqueCompID(); this.validateTextAndIcon(); }; }; function BrowserItem(objData) { this.objData = objData; this.width = "150"; //default value this.height = "20"; this.url = ""; this.strId = ""; this.parse = function() { var xmlNode = this.objData.xmlNode; //set the attributes this.width = XML.GetSingleNodeValue(xmlNode, "WIDTH"); this.url = XML.GetSingleNodeValue(xmlNode, "URL"); this.url = XML.FromLegalXml(this.url); this.DisplayText = XML.GetSingleNodeValue(xmlNode, "DISPLAY_TEXT"); this.DisplayIcon = XML.GetSingleNodeValue(xmlNode, "DISPLAY_ICON"); this.DisplayIcon = URL.AddHTTPProtocol(this.DisplayIcon); }; this.validateTextAndIcon = function() { if (!this.DisplayText) this.DisplayText = "Browser Component"; if (!this.DisplayIcon) this.DisplayIcon = "chrome://" + this.objData.chromeName + "/skin/minibrowser.png"; }; this.init(); }; BrowserItem.prototype = new BaseToolbarItem(); function ButtonItem(objData) { this.objData = objData; this.button = new Button(objData); this.parse = function() { var xmlNode = this.objData.xmlNode; //set the type var strTagName = xmlNode.tagName; var bSpecialCommandItem = false; switch (strTagName) { case "LINK_BUTTONITEM": this.button.type = "LINK"; break; case "SPECIAL_COMMAND_ITEM": this.button.type = "COMMAND"; bSpecialCommandItem = true; break; case "BUTTON": this.button.type = "BUTTON"; break; } if (bSpecialCommandItem) this.button.data = new ToolbarDataParsingXPCOM.dataObjects.Command(); else { var xmlData = XML.SelectSingleNode(xmlNode, "DATA"); if (xmlData) { this.button.data = ToolbarDataParsingXPCOM.dataNodeFactory.getDataObject(xmlData); this.button.type = this.button.data.type; } else this.button.data = new ToolbarDataParsingXPCOM.dataObjects.Link(); } for (var i = 0; i < xmlNode.childNodes.length; i++) { switch (xmlNode.childNodes[i].tagName) { case "BUTTON_TEXT": case "DEFAULT_BUTTON_TEXT": this.button.text = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "BUTTON_TOOLTIP": this.button.tooltip = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "BUTTON_ICON": case "BUTTON_ICON_URL": this.button.image = XML.GetXmlNodeValue(xmlNode.childNodes[i]); this.button.image = URL.AddHTTPProtocol(this.button.image); break; case "BUTTON_LINK": this.button.data.link = XML.GetXmlNodeValue(xmlNode.childNodes[i]); this.button.data.link = URL.LegalizeLinkUrl(this.button.data.link); break; case "TARGET": this.button.data.target = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "BUTTON_COMMAND_ID": this.button.data.command = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "DISPLAY_TEXT": this.DisplayText = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "DISPLAY_ICON": this.DisplayIcon = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "USER_ATTRIBUTES": var XMLUserAttributes = xmlNode.childNodes[i]; var XMLUserAttribute = null; for (var j = 0; j < XMLUserAttributes.childNodes.length; j++) { XMLUserAttribute = XMLUserAttributes.childNodes[j]; if (XMLUserAttribute.tagName == "PERMISSION") { this.Permission = XML.GetXmlNodeValue(XMLUserAttribute); } else if (XMLUserAttribute.tagName == "SHOW_IN_CHEVRON") { this.ShowInChevron = XML.GetXmlNodeValue(XMLUserAttribute); } } break; } } }; this.validateTextAndIcon = function() { if (!this.DisplayText) this.DisplayText = this.button.text; if (!this.DisplayIcon) this.DisplayIcon = this.button.image; }; this.init(); }; ButtonItem.prototype = new BaseToolbarItem(); function ChatItem(objData) { this.objData = objData; this.button = new Button(objData); //chat specific properties this.serviceUrl = ''; this.serviceIntervalMM = 60; this.defaultRoom = null; this.parse = function() { var xmlNode = this.objData.xmlNode; var xmlChildNode = null; for (var i = 0; i < xmlNode.childNodes.length; i++) { xmlChildNode = xmlNode.childNodes[i]; switch (xmlChildNode.tagName) { case "BUTTON": this.button.InitWithXML(xmlChildNode); var xmlUserAttributes = XML.SelectSingleNode(xmlChildNode, "USER_ATTRIBUTES"); this.UniqueCompID = XML.GetSingleNodeValue(xmlChildNode, "UNIQUE_COMP_ID"); if (xmlUserAttributes) { var XMLUserAttribute = null; for (var j = 0; j < xmlUserAttributes.childNodes.length; j++) { XMLUserAttribute = xmlUserAttributes.childNodes[j]; if (XMLUserAttribute.tagName == "PERMISSION") this.Permission = XML.GetXmlNodeValue(XMLUserAttribute); else if (XMLUserAttribute.tagName == "SHOW_IN_CHEVRON") this.ShowInChevron = XML.GetXmlNodeValue(XMLUserAttribute); } } break; case "SERVICE": this.parseService(xmlChildNode); break; case "DEFAULT_ROOM": this.parseDefaultRoom(xmlChildNode); break; } } //set defaults if (!this.serviceUrl) this.serviceUrl = "http://chat.services.conduit.com/Chat/ChatInfoWebService.asmx/GetChatInfo"; if (!this.serviceIntervalMM) this.serviceIntervalMM = 60 * 24; this.DisplayIcon = this.button.image; this.DisplayText = this.button.text; }; this.parseService = function(xmlService) { this.serviceUrl = XML.GetSingleNodeValue(xmlService, "URL"); this.serviceIntervalMM = XML.GetSingleNodeValueAsInteger(xmlService, "INTERVAL_IN_MM"); }; this.parseDefaultRoom = function(xmlRoom) { var xmlRoomInfo = XML.SelectSingleNode(xmlRoom, "INFO"); this.defaultRoom = new ChatXPCOM.room(xmlRoomInfo); }; this.validateUniqueCompID = function() { if (!this.UniqueCompID) this.UniqueCompID = Math.random() * 10; }; this.init(); }; ChatItem.prototype = new BaseToolbarItem(); function DynamicMenuItem(objData) { this.objData = objData; this.button = new Button(objData); //default value is regular menu(when the arrow and the button are joined) //MAIN_MENU - the button does an event and the arrow open the menu(devided) this.button.type = "BUTTON_MENU"; this.link = ""; //the xml of the menu of this dynamic menu this.menuXml = null; //floats menu items this.arrXmlFloatMenuItems = null; this.IsValidMainMenu = false; this.isMainMenu = false; this.parse = function() { var xmlNode = this.objData.xmlNode; for (var i = 0; i < xmlNode.childNodes.length; i++) { switch (xmlNode.childNodes[i].tagName) { case "TYPE": this.button.type = XML.GetXmlNodeValue(xmlNode.childNodes[i]); if (this.button.type == "MAIN_MENU") { this.isMainMenu = true; this.ShowInChevron = false; } break; case "BUTTON": this.button.InitWithXML(xmlNode.childNodes[i]); break; case "MENU": this.menuXml = xmlNode.childNodes[i]; break; } } }; this.validateTextAndIcon = function() { if (!this.DisplayText) this.DisplayText = this.button.text; if (!this.DisplayIcon) this.DisplayIcon = this.button.image; }; this.ValidateMainMenu = function() { if (this.button.text || this.button.icon) this.IsValidMainMenu = true; if (this.isMainMenu) this.isMustHaveComponents = true; }; this.init(); this.ValidateMainMenu(); }; DynamicMenuItem.prototype = new BaseToolbarItem(); function EMailNotifierItem(objData) { this.objData = objData; this.dynamicMenuItem = null; //default value is 5 minutes this.CheckNewInterval = 5; this.StaredTooltip = ''; this.isPersonalComponent = true; this.isPublisher = objData.isPublisher; this.parse = function() { var xmlNode = this.objData.xmlNode; for (var i = 0; i < xmlNode.childNodes.length; i++) { switch (xmlNode.childNodes[i].tagName) { case "DYNAMIC_MENU": var oData = new ToolbarItemData(xmlNode.childNodes[i], ToolbarDataParsingXPCOM.ComponentType.Settings, objData.isPublisher, objData.chromeName, objData.originalCTID, objData.actingCTID); this.dynamicMenuItem = ToolbarDataParsingXPCOM.toolbarItemsFactory.GetInstance(oData); this.dynamicMenuItem.DisableUsage = true; break; case "CHECK_NEW_EMAILS_INTERVAL": this.CheckNewInterval = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "STARED_TOOLTIP": this.StaredTooltip = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; } } }; this.validateTextAndIcon = function() { if (!this.dynamicMenuItem.button.image) this.dynamicMenuItem.button.image = "chrome://" + this.objData.chromeName + "/skin/email.png"; if (this.dynamicMenuItem && this.dynamicMenuItem.button.image) this.DisplayIcon = this.dynamicMenuItem.button.image; if (this.dynamicMenuItem && this.dynamicMenuItem.button.text) this.DisplayText = this.dynamicMenuItem.button.text; }; this.validateUniqueCompID = function() { if (!this.UniqueCompID) this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.EMailNotifier; }; this.init(); }; EMailNotifierItem.prototype = new BaseToolbarItem(); function ExternalComponentItem(objData) { this.objData = objData; this.type = ""; this.interval = 0; this.link = ""; this.storeLocally = true; this.cacheMode = "TB_CACHE"; this.parse = function() { var xmlNode = this.objData.xmlNode; for (var i = 0; i < xmlNode.childNodes.length; i++) { switch (xmlNode.childNodes[i].tagName) { case "TYPE": this.type = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "INTERVAL": this.interval = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "CACHE_MODE": this.cacheMode = XML.GetXmlNodeValue(xmlNode.childNodes[i], "TB_CACHE"); break; case "EXTERNAL_LINK": this.link = XML.GetXmlNodeValue(xmlNode.childNodes[i]); this.link = URL.AddHTTPProtocol(this.link); break; case "DISPLAY_TEXT": var oDisplayText = XML.GetXmlNodeValue(xmlNode.childNodes[i]); if (oDisplayText) this.DisplayText = oDisplayText; break; case "DISPLAY_ICON": var oDisplayIcon = XML.GetXmlNodeValue(xmlNode.childNodes[i]); if (oDisplayIcon) this.DisplayIcon = oDisplayIcon; this.DisplayIcon = URL.AddHTTPProtocol(this.DisplayIcon); break; } } }; this.validateTextAndIcon = function() { if (!this.DisplayText) this.DisplayText = "External Menu"; if (!this.DisplayIcon) this.DisplayIcon = "chrome://" + this.objData.chromeName + "/skin/minibrowser.png"; }; this.init(); }; ExternalComponentItem.prototype = new BaseToolbarItem(); function FacebookItem(objData) { this.objData = objData; this.serviceUrl = ""; this.serviceIntervalSec = 0; this.fbIconUrl = ""; this.facebookAcceptAllCheck = null; this.facebookFriendReqCheck = null; this.facebookInboxCheck = null; this.facebookGroupsCheck = null; this.facebookEventsCheck = null; this.facebookNewFeedCheck = null; this.isPersonalComponent = true; this.isPublisher = objData.isPublisher; this.parse = function() { var xmlNode = this.objData.xmlNode; this.serviceUrl = XML.GetSingleNodeValue(xmlNode, "FB_SERVICE_URL"); this.fbIconUrl = XML.GetSingleNodeValue(xmlNode, "FB_ICON_URL"); this.serviceIntervalSec = XML.GetSingleNodeValueAsInteger(xmlNode, "FB_SERVICE_INTERVAL_SEC", 24 * 7 * 60 * 60); var xmlAlerts = XML.SelectSingleNode(xmlNode, "ALERTS"); this.parseAlerts(xmlAlerts); }; this.parseAlerts = function(xmlNode) { this.facebookAcceptAllCheck = XML.GetSingleNodeValueAsBoolean(xmlNode, "ACCEPT_ALL", null); this.facebookFriendReqCheck = XML.GetSingleNodeValueAsBoolean(xmlNode, "FRIEND_REQUESTS", null); this.facebookInboxCheck = XML.GetSingleNodeValueAsBoolean(xmlNode, "INBOX", null); this.facebookGroupsCheck = XML.GetSingleNodeValueAsBoolean(xmlNode, "GROUPS", null); this.facebookEventsCheck = XML.GetSingleNodeValueAsBoolean(xmlNode, "EVENTS", null); this.facebookNewFeedCheck = XML.GetSingleNodeValueAsBoolean(xmlNode, "NEWS_FEED", null); }; this.validateUniqueCompID = function() { if (!this.UniqueCompID) this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.Facebook; }; this.init(); }; FacebookItem.prototype = new BaseToolbarItem(); function FeedItem(objData) { this.objData = objData; this.Title = ""; this.FeedURL = ""; this.IconNormalURL = ""; this.Interval = 0; this.LiveMode = false; this.Comments = ""; this.Podcast = false; this.parse = function() { var xmlNode = this.objData.xmlNode; for (var i = 0; i < xmlNode.childNodes.length; i++) { switch (xmlNode.childNodes[i].tagName) { case "TITLE": this.Title = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "LINK": this.FeedURL = XML.GetXmlNodeValue(xmlNode.childNodes[i]); this.FeedURL = XML.FromLegalXml(this.FeedURL); break; case "INTERVAL": this.Interval = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "PODCAST": this.Podcast = XML.GetBooleanXmlNodeValue(xmlNode.childNodes[i]); break; case "ICON_NORMAL_URL": this.IconNormalURL = XML.GetXmlNodeValue(xmlNode.childNodes[i]); this.IconNormalURL = URL.AddHTTPProtocol(this.IconNormalURL); break; case "DISPLAY_TEXT": this.DisplayText = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; case "DISPLAY_ICON": this.DisplayIcon = XML.GetXmlNodeValue(xmlNode.childNodes[i]); this.DisplayIcon = URL.AddHTTPProtocol(this.DisplayIcon); break; case "LIVE_MODE": this.LiveMode = XML.GetBooleanXmlNodeValue(xmlNode.childNodes[i]); break; case "COMMENTS_LINK": this.Comments = XML.GetXmlNodeValue(xmlNode.childNodes[i]); break; } } }; this.validateTextAndIcon = function() { if (!this.DisplayText) this.DisplayText = this.Title; if (!this.DisplayIcon) this.DisplayIcon = this.IconNormalURL; }; this.init(); }; FeedItem.prototype = new BaseToolbarItem(); function HighlighterItem(objData) { this.objData = objData; this.strTooltip = ""; this.DisplayText = "Highlighter"; this.DisplayIcon = "chrome://" + this.objData.chromeName + "/skin/highlighter.png"; this.parse = function() { var xmlNode = this.objData.xmlNode; this.strTooltip = XML.GetSingleNodeValue(xmlNode, "HIGHLIGHT_TOOLTIP"); }; this.validateUniqueCompID = function() { if (!this.UniqueCompID) this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.Highlighter; }; this.init(); }; HighlighterItem.prototype = new BaseToolbarItem(); function LabelItem(objData) { this.objData = objData; this.button = new Button(objData); this.parse = function() { var xmlNode = this.objData.xmlNode; //set the type this.button.type = "LABEL"; var xmlButton = XML.SelectSingleNode(xmlNode, "BUTTON"); if(xmlButton) this.button.InitWithXML(xmlButton); this.DisplayText = XML.GetSingleNodeValue(xmlNode, "DISPLAY_TEXT"); this.DisplayIcon = XML.GetSingleNodeValue(xmlNode, "DISPLAY_ICON"); this.DisplayIcon = URL.AddHTTPProtocol(this.DisplayIcon); }; this.validateTextAndIcon = function() { if (!this.DisplayText && !this.DisplayIcon) { this.DisplayText = this.button.text; this.DisplayIcon = this.button.image; } }; this.init(); }; LabelItem.prototype = new BaseToolbarItem(); function MultiCommunityItem(objData) { this.objData = objData; this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.MultiCommunity; this.CompType = ToolbarDataParsingXPCOM.ComponentType.Settings; this.DisplayIcon = "chrome://" + this.objData.chromeName + "/skin/mc_add_inactive.png"; this.Tooltip = "Community Toolbar Detected"; this.Permission = ToolbarDataParsingXPCOM.Editable.NONE; this.MenuItem1Icon = "chrome://" + this.objData.chromeName + "/skin/mc_add_inactive.png"; this.MenuItem2Icon = "chrome://" + this.objData.chromeName + "/skin/mc_search.png"; this.MenuItem3Icon = "chrome://" + this.objData.chromeName + "/skin/mc_options.png"; this.isMustHaveComponents = true; this.ShowInChevron = false; this.parseUserAttributes = function() { }; this.validateUniqueCompID = function() { }; this.parseCommonData = function() { }; this.parseUserAttributes = function() { }; this.init(); }; MultiCommunityItem.prototype = new BaseToolbarItem(); function MultiFeedItem(objData) { this.objData = objData; this.FeedItems = new Array(); this.MultiFeedButton = null; this.parse = function() { var XMLNode = this.objData.xmlNode; var XMLNodeChild = null; var XMLFeedItemNode = null; for (var i = 0; i < XMLNode.childNodes.length; i++) { XMLNodeChild = XMLNode.childNodes[i]; switch (XMLNodeChild.tagName) { case "LIST_OF_RSS_FEEDS": for (var j = 0; j < XMLNodeChild.childNodes.length; j++) { XMLFeedItemNode = XMLNodeChild.childNodes[j]; if (XMLFeedItemNode.tagName == 'RSS_FEED_ITEM') { var oData = new ToolbarItemData(XMLFeedItemNode, ToolbarDataParsingXPCOM.ComponentType.Settings, objData.isPublisher, objData.chromeName, objData.originalCTID, objData.actingCTID); this.FeedItems.push(ToolbarDataParsingXPCOM.toolbarItemsFactory.GetInstance(oData)); } } break; case "BUTTON": this.MultiFeedButton = new MultiFeedButtonItem(XMLNodeChild); break; case "DISPLAY_TEXT": this.DisplayText = XML.GetXmlNodeValue(XMLNodeChild); break; case "DISPLAY_ICON": this.DisplayIcon = XML.GetXmlNodeValue(XMLNodeChild); this.DisplayIcon = URL.AddHTTPProtocol(this.DisplayIcon); break; } } }; this.validateTextAndIcon = function() { if (!this.DisplayText) this.DisplayText = this.MultiFeedButton.DeafultButtonText; if (!this.DisplayIcon) this.DisplayIcon = this.MultiFeedButton.IconNormalURL; }; this.init(); }; MultiFeedItem.prototype = new BaseToolbarItem(); //object represent multi feed object function MultiFeedButtonItem(XMLNode) { this.DeafultButtonText = ""; this.IconNormalURL = ""; this.ButtonTooltip = ""; this.Create = function(XMLNode) { var XMLNodeChild = null; for (var i = 0; i < XMLNode.childNodes.length; i++) { XMLNodeChild = XMLNode.childNodes[i]; if (XMLNodeChild.tagName == 'DEFAULT_BUTTON_TEXT') this.DeafultButtonText = XML.GetXmlNodeValue(XMLNodeChild); else if (XMLNodeChild.tagName == 'ICON_NORMAL_URL') this.IconNormalURL = XML.GetXmlNodeValue(XMLNodeChild); else if (XMLNodeChild.tagName == 'BUTTON_TOOLTIP') this.ButtonTooltip = XML.GetXmlNodeValue(XMLNodeChild); } }; this.Create(XMLNode); }; function MyStuffButtonItem(objData) { this.objData = objData; this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.MyStuffAddButton; this.CompType = ToolbarDataParsingXPCOM.ComponentType.MyStuff; this.DisplayIcon = "chrome://" + this.objData.chromeName + "/skin/myStuff/add.png"; this.DisplayText = ""; this.Permission = ToolbarDataParsingXPCOM.Editable.NONE; this.isMustHaveComponents = true; this.parseUserAttributes = function() { }; this.validateUniqueCompID = function() { }; this.parseCommonData = function() { }; this.parseUserAttributes = function() { }; this.init(); }; MyStuffButtonItem.prototype = new BaseToolbarItem(); function MyStuffWithOptionsButtonItem(objData) { this.objData = objData; this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.MyStuffOptionsButton; this.CompType = ToolbarDataParsingXPCOM.ComponentType.MyStuff; this.DisplayIcon = "chrome://" + this.objData.chromeName + "/skin/myStuff/add.png"; this.DisplayText = ""; this.optionsIcon = "chrome://" + this.objData.chromeName + "/skin/myStuff/options.png"; this.Permission = ToolbarDataParsingXPCOM.Editable.NONE; this.isMustHaveComponents = true; this.parseUserAttributes = function() { }; this.validateUniqueCompID = function() { }; this.parseCommonData = function() { }; this.parseUserAttributes = function() { }; this.init(); }; MyStuffWithOptionsButtonItem.prototype = new BaseToolbarItem(); function PrivacyItem(objData) { this.objData = objData; this.dynamicMenuItem = null; this.isPersonalComponent = true; var buttonIconUrl = ''; var blockIcon = ''; this.parse = function() { var xmlNode = this.objData.xmlNode; for (var i = 0; i < xmlNode.childNodes.length; i++) { if (xmlNode.childNodes[i].tagName == "DYNAMIC_MENU") { var oData = new ToolbarItemData(xmlNode.childNodes[i], ToolbarDataParsingXPCOM.ComponentType.Settings, objData.isPublisher, objData.chromeName, objData.originalCTID, objData.actingCTID); this.dynamicMenuItem = ToolbarDataParsingXPCOM.toolbarItemsFactory.GetInstance(oData); //private case of firefox - change the defaults: this.dynamicMenuItem.button.text = "Privacy"; buttonIconUrl = this.dynamicMenuItem.button.image; this.dynamicMenuItem.button.tooltip = ""; } else if (xmlNode.childNodes[i].tagName == "POPUP_BLOCKER_BUTTON") { var xmlSubNode = xmlNode.childNodes[i]; for (var j = 0; j < xmlSubNode.childNodes.length; j++) { if (xmlSubNode.childNodes[j].tagName == "BUTTON_ICON_BLOCK_POPUPS") { blockIcon = XML.GetXmlNodeValue(xmlSubNode.childNodes[j]); } } } } if (blockIcon) { this.dynamicMenuItem.button.image = blockIcon; this.DisplayIcon = blockIcon; } else if (buttonIconUrl) { this.dynamicMenuItem.button.image = buttonIconUrl; this.DisplayIcon = buttonIconUrl; } else { this.dynamicMenuItem.button.image = "chrome://" + this.objData.chromeName + "/skin/block.png"; this.DisplayIcon = "chrome://" + this.objData.chromeName + "/skin/block.png"; } }; this.validateUniqueCompID = function() { if (!this.UniqueCompID) this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.Privacy; }; this.init(); }; PrivacyItem.prototype = new BaseToolbarItem(); function RadioItem(objData) { this.objData = objData; this.CompType = ToolbarDataParsingXPCOM.ComponentType.Settings; this.PredefinedListInterval = 0; this.PodcastInterval = 0; this.RadioServerURL = ''; this.EnableIPStations = true; this.xmlSkins = null; this.Skins = null; this.isPersonalComponent = true; this.parse = function() { var xmlNode = this.objData.xmlNode; this.PredefinedListInterval = XML.GetSingleNodeValueAsInteger(xmlNode, "PREDEFINED_LIST_INTERVAL"); this.PodcastInterval = XML.GetSingleNodeValueAsInteger(xmlNode, "PODCAST_INTERVAL"); this.RadioServerURL = XML.GetSingleNodeValue(xmlNode, "RADIO_SERVER_URL"); this.DisplayText = XML.GetSingleNodeValue(xmlNode, "DISPLAY_TEXT"); this.DisplayIcon = URL.AddHTTPProtocol(XML.GetSingleNodeValue(xmlNode, "DISPLAY_ICON")); this.EnableIPStations = XML.GetSingleNodeValueAsBoolean(xmlNode, "ENABLE_IP_STATIONS"); this.xmlSkins = XML.SelectSingleNode(xmlNode, "LIST_OF_SKINS"); }; this.validateUniqueCompID = function() { if (!this.UniqueCompID) this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.Radio; }; this.validateTextAndIcon = function() { if (!this.DisplayText) this.DisplayText = "Radio Player"; if (!this.DisplayIcon) this.DisplayIcon = "chrome://" + this.objData.chromeName + "/skin/radio/RadioPlayChev.ico"; }; this.init(); }; RadioItem.prototype = new BaseToolbarItem(); function SearchBoxItem(objData) { this.objData = objData; var CAN_CHANGE_DEFAULT = "CAN_CHANGE_DEFAULT"; //the xml of all the searches this.searchEnginesXml = null; this.searchSuggestsXml = null; this.canChangeDefault = true; //boolean this.strBgColor = ""; this.CompType = ToolbarDataParsingXPCOM.ComponentType.Settings; this.Permission = ToolbarDataParsingXPCOM.Editable.NONE; this.backToDefault; //boolean this.searchHookUrl = ""; this.DisplayIconPrimary = ""; this.mirrorActivateIconOnRTL = true; this.ShowInChevron = false; this.isMustHaveComponents = true; this.parseUserAttributes = function() { var xmlUserAttributes = XML.SelectSingleNode(this.objData.xmlNode, "USER_ATTRIBUTES"); if (!xmlUserAttributes) return; /* var showInChevron = XML.GetSingleNodeValueAsBoolean(xmlUserAttributes, "SHOW_IN_CHEVRON", null); if (showInChevron != null) this.ShowInChevron = showInChevron;*/ }; this.parse = function() { var xmlNode = this.objData.xmlNode; this.searchEnginesXml = XML.SelectSingleNode(xmlNode, "LIST_OF_SEARCH_ENGINES"); this.searchSuggestsXml = XML.SelectSingleNode(xmlNode, "LIST_OF_SUGGEST_SEARCH_ENGINES"); var canChangeDefault = XML.GetSingleNodeValue(xmlNode, "TYPE", CAN_CHANGE_DEFAULT); this.canChangeDefault = canChangeDefault == CAN_CHANGE_DEFAULT; this.strBgColor = XML.GetSingleNodeValue(xmlNode, "BG_COLOR"); this.backToDefault = XML.GetSingleNodeValueAsBoolean(xmlNode, "BACK_TO_DEFAULT", true); this.DisplayIcon = XML.GetSingleNodeValue(xmlNode, "ICON_SEARCH_ACTIVATE_URL"); this.DisplayIconPrimary = XML.GetSingleNodeValue(xmlNode, "ICON_SEARCH_ACTIVATE_URL_PRIMARY", ""); this.mirrorActivateIconOnRTL = XML.GetSingleNodeValueAsBoolean(xmlNode, "ICON_SEARCH_ACTIVATE_IS_MIRROR_ON_RTL", true); this.DisplayText = XML.GetSingleNodeValue(xmlNode, "SEARCH_ACTIVATE_CAPTION"); this.searchHookUrl = XML.GetSingleNodeValue(xmlNode, "SEARCH_HOOK_URL"); }; this.validateUniqueCompID = function() { if (!this.UniqueCompID) this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.SearchBox; }; this.validateTextAndIcon = function() { this.DisplayIcon = (this.DisplayIconPrimary) ? this.DisplayIconPrimary : this.DisplayIcon; if (!this.DisplayIcon) this.DisplayIcon = "chrome://" + this.objData.chromeName + "/skin/go_btn.gif"; }; this.init(); }; SearchBoxItem.prototype = new BaseToolbarItem(); function SeparatorItem(objData) { this.objData = objData; this.UniqueCompID = ''; this.CompType = objData.compType; this.DisplayText = "Separator"; this.DisplayIcon = "chrome://" + objData.chromeName + "/skin/separator.png"; this.init(); }; SeparatorItem.prototype = new BaseToolbarItem(); function ToggleItem(objData) { this.objData = objData; var buttonIconUrl = ''; var blockIcon = ''; this.buttonOn = new Button(objData); this.buttonOff = new Button(objData); this.button = null; this.scriptOn = ''; this.scriptOff = ''; this.scriptUrl = ''; this.mode = ''; this.parse = function() { var xmlNode = this.objData.xmlNode; var xmlMode = null; var i, j; for (i = 0; i < xmlNode.childNodes.length; i++) { if (xmlNode.childNodes[i].tagName == "DISPLAY_TEXT") this.DisplayText = XML.GetXmlNodeValue(xmlNode.childNodes[i]); else if (xmlNode.childNodes[i].tagName == "DISPLAY_ICON") { this.DisplayIcon = XML.GetXmlNodeValue(xmlNode.childNodes[i]); this.DisplayIcon = URL.AddHTTPProtocol(this.DisplayIcon); } else if (xmlNode.childNodes[i].tagName == "MODE_ON") { xmlMode = xmlNode.childNodes[i]; for (j = 0; j < xmlMode.childNodes.length; j++) { if (xmlMode.childNodes[j].tagName == "BUTTON") this.buttonOn.InitWithXML(xmlMode.childNodes[j]); else if (xmlMode.childNodes[j].tagName == "FUNCTION") this.scriptOn = XML.GetXmlNodeValue(xmlMode.childNodes[j]); } } else if (xmlNode.childNodes[i].tagName == "MODE_OFF") { xmlMode = xmlNode.childNodes[i]; for (j = 0; j < xmlMode.childNodes.length; j++) { if (xmlMode.childNodes[j].tagName == "BUTTON") this.buttonOff.InitWithXML(xmlMode.childNodes[j]); else if (xmlMode.childNodes[j].tagName == "FUNCTION") this.scriptOff = XML.GetXmlNodeValue(xmlMode.childNodes[j]); } } else if (xmlNode.childNodes[i].tagName == "SCRIPT_URL") this.scriptUrl = XML.GetXmlNodeValue(xmlNode.childNodes[i]); else if (xmlNode.childNodes[i].tagName == "MODE") this.mode = XML.GetXmlNodeValue(xmlNode.childNodes[i]); } }; this.validateTextAndIcon = function() { if (!this.buttonOn.text && !this.buttonOn.image) { this.buttonOn.text = this.buttonOff.text; this.buttonOn.image = this.buttonOff.image; } if (!this.DisplayText && !this.DisplayIcon) { this.DisplayText = this.buttonOff.text; this.DisplayIcon = this.buttonOff.image; } if (!this.mode) this.mode = "TEMPORARY"; }; this.init(); }; ToggleItem.prototype = new BaseToolbarItem(); function TwitterItem(objData) { this.objData = objData; this.button = new Button(objData); this.generalUserInfo = null; // objGeneralUserInfo this.arrFollowedUsers = null; //array of objUserInfo this.parse = function() { var xmlNode = this.objData.xmlNode; var xmlButton = XML.SelectSingleNode(xmlNode, "BUTTON"); if (xmlButton) this.button.InitWithXML(xmlButton); //set general user info var xmlGeneralUserInfo = XML.SelectSingleNode(xmlNode, "GENERAL_USER_INFO"); if (xmlGeneralUserInfo) this.generalUserInfo = new TwitterGeneralUserInfo(xmlGeneralUserInfo); //set followed users var xmlFollowedUsers = XML.SelectSingleNode(xmlNode, "FOLLOWED_USERS"); if (xmlFollowedUsers) { var baseUserPageUrl = (this.generalUserInfo && this.generalUserInfo.personalPageBaseUrl) ? this.generalUserInfo.personalPageBaseUrl : "http://twitter.com/@@SCREEN_NAME@@"; var baseRssUrl = (this.generalUserInfo && this.generalUserInfo.rssBaseUrl) ? this.generalUserInfo.rssBaseUrl : "http://twitter.com/statuses/user_timeline/@@ID@@.rss"; var iRssInerval = (this.generalUserInfo && this.generalUserInfo.rssInterval) ? this.generalUserInfo.rssInterval : 25; this.arrFollowedUsers = new Array(); var xmlFollowedUser = null; var objFollowedUser = null; for (var j = 0; j < xmlFollowedUsers.childNodes.length; j++) { xmlFollowedUser = xmlFollowedUsers.childNodes[j]; if (xmlFollowedUser && xmlFollowedUser.tagName && xmlFollowedUser.tagName == "USER") { objFollowedUser = new TwitterUserInfo(xmlFollowedUser, baseUserPageUrl, baseRssUrl, iRssInerval); this.arrFollowedUsers.push(objFollowedUser); } } } }; this.validateTextAndIcon = function() { if (!this.DisplayText && !this.DisplayIcon) { this.DisplayText = this.button.text; this.DisplayIcon = this.button.image; } }; this.init(); }; TwitterItem.prototype = new BaseToolbarItem(); function WeatherItem(objData) { this.objData = objData; var XMLNode = objData.xmlNode; this.Interval = ''; this.Button = new Button(objData); this.ServerURL = ''; this.WebSearchURL = ''; this.isPersonalComponent = true; this.parse = function() { var xmlNode = this.objData.xmlNode; var XMLNodeChild = null; for (var i = 0; i < xmlNode.childNodes.length; i++) { XMLNodeChild = xmlNode.childNodes[i]; if (XMLNodeChild.tagName == "INTERVAL") this.Interval = XML.GetXmlNodeValue(XMLNodeChild); else if (XMLNodeChild.tagName == "BUTTON") this.Button.InitWithXML(XMLNodeChild); else if (XMLNodeChild.tagName == "SERVER_URL") this.ServerURL = XML.GetXmlNodeValue(XMLNodeChild); else if (XMLNodeChild.tagName == "SEARCH_SERVER_URL") this.WebSearchURL = XML.GetXmlNodeValue(XMLNodeChild); else if (XMLNodeChild.tagName == "UNIQUE_COMP_ID") this.UniqueCompID = XML.GetXmlNodeValue(XMLNodeChild); } }; this.validateUniqueCompID = function() { if (!this.UniqueCompID) this.UniqueCompID = ToolbarDataParsingXPCOM.ComponentsID.Weather; }; this.validateTextAndIcon = function() { if (this.Button && this.Button.image) this.DisplayIcon = this.Button.image; if (this.Button && this.Button.text) this.DisplayText = this.Button.text; }; this.init(); }; WeatherItem.prototype = new BaseToolbarItem();function ToolbarSkin(xmlSkin, objStyle, blinkBGColor, chromeName) { this.isInit = false; var getValue = function() { for (var i = 0; i < arguments.length; i++) if (arguments[i]) return arguments[i]; }; this.__defineGetter__("splitterImageUrl", function() { return getValue(_splitterImageUrl.val, null, _splitterImageUrl.def); }); this.__defineGetter__("separatorImageUrl", function() { return getValue(_separatorImageUrl.val, null, _separatorImageUrl.def); }); this.__defineGetter__("dropDownArrowImageUrl", function() { return getValue(_dropDownArrowImageUrl.val, null, _dropDownArrowImageUrl.def); }); this.__defineGetter__("fontColor", function() { return getValue(_fontColor.val, objStyle.color, _fontColor.def); }); this.__defineGetter__("chevronImageUrl", function() { return getValue(_chevronImageUrl.val, null, _chevronImageUrl.def); }); this.__defineGetter__("backgroundImageUrl", function() { return getValue(_background_imageUrl.val, null, _background_imageUrl.def); }); this.__defineGetter__("backgroundColor", function() { return getValue(_background_color.val, null, _background_color.def); }); this.__defineGetter__("highlighterActiveImageUrl", function() { return getValue(_highlighter_activeImageUrl.val, null, _highlighter_activeImageUrl.def); }); this.__defineGetter__("highlighterInactiveImageUrl", function() { return getValue(_highlighter_inactiveImageUrl.val, null, _highlighter_inactiveImageUrl.def); }); this.__defineGetter__("myStuffImageUrl", function() { return getValue(_myStuff_imageUrl.val, null, _myStuff_imageUrl.def); }); this.__defineGetter__("myStuffBlinkColor", function() { return getValue(_myStuff_blinkColor.val, blinkBGColor, _myStuff_blinkColor.def); }); this.__defineGetter__("groupActiveImageUrl", function() { return getValue(_group_activeImageUrl.val, null, _group_activeImageUrl.def); }); this.__defineGetter__("groupInactiveImageUrl", function() { return getValue(_group_inactiveImageUrl.val, null, _group_inactiveImageUrl.def); }); this.__defineGetter__("groupFlashingIconUrl", function() { return getValue(_group_flashingIconUrl.val, null, _group_flashingIconUrl.def); }); var _splitterImageUrl = { "val": null, "def": stringFormat('chrome://{0}/skin/splitter.ico', chromeName) }; var _separatorImageUrl = { "val": null, "def": null }; var _dropDownArrowImageUrl = { "val": null, "def": null }; var _fontColor = { "val": null, "def": null }; var _chevronImageUrl = { "val": null, "def": stringFormat('chrome://{0}/skin/chevron.png', chromeName) }; var _background_imageUrl = { "val": null, "def": null }; var _background_color = { "val": null, "def": null }; var _highlighter_activeImageUrl = { "val": null, "def": stringFormat('chrome://{0}/skin/highlighter.png', chromeName) }; var _highlighter_inactiveImageUrl = { "val": null, "def": stringFormat('chrome://{0}/skin/highlighterDisabled.png', chromeName) }; var _myStuff_imageUrl = { "val": null, "def": stringFormat('chrome://{0}/skin/myStuff/add.png', chromeName) }; var _myStuff_blinkColor = { "val": null, "def": "rgb(255, 214, 89)" }; var _group_activeImageUrl = { "val": null, "def": stringFormat('chrome://{0}/skin/mc_add_active.png', chromeName) }; var _group_inactiveImageUrl = { "val": null, "def": stringFormat('chrome://{0}/skin/mc_add_inactive.png', chromeName) }; var _group_flashingIconUrl = { "val": null, "def": stringFormat('chrome://{0}/skin/mc_add_flashing.gif', chromeName) }; this._init = function() { this.isInit = true; var xmlNode = null; _splitterImageUrl.val = XML.GetSingleNodeValue(xmlSkin, "SPLITTER_IMAGE_URL", null); _separatorImageUrl.val = XML.GetSingleNodeValue(xmlSkin, "SEPARATOR_IMAGE_URL", null); _dropDownArrowImageUrl.val = XML.GetSingleNodeValue(xmlSkin, "DROP_DOWN_ARROW_IMAGE_URL", null); _chevronImageUrl.val = XML.GetSingleNodeValue(xmlSkin, "CHEVRON_IMAGE_URL", null); _fontColor.val = XML.GetSingleNodeValue(xmlSkin, "FONT_COLOR", null); xmlNode = XML.SelectSingleNode(xmlSkin, "BACKGROUND"); if (xmlNode) { _background_imageUrl.val = XML.GetSingleNodeValue(xmlNode, "IMAGE_URL", null); _background_color.val = XML.GetSingleNodeValue(xmlNode, "COLOR", null); } xmlNode = XML.SelectSingleNode(xmlSkin, "HIGHLIGHTER"); if (xmlNode) { _highlighter_activeImageUrl.val = XML.GetSingleNodeValue(xmlNode, "ACTIVE_IMAGE_URL", null); _highlighter_inactiveImageUrl.val = XML.GetSingleNodeValue(xmlNode, "INACTIVE_IMAGE_URL", null); } xmlNode = XML.SelectSingleNode(xmlSkin, "MY_STUFF"); if (xmlNode) { _myStuff_imageUrl.val = XML.GetSingleNodeValue(xmlNode, "IMAGE_URL", null); _myStuff_blinkColor.val = XML.GetSingleNodeValue(xmlNode, "BLINK_COLOR", null); } xmlNode = XML.SelectSingleNode(xmlSkin, "GROUP"); if (xmlNode) { _group_activeImageUrl.val = XML.GetSingleNodeValue(xmlNode, "ACTIVE_IMAGE_URL", null); _group_inactiveImageUrl.val = XML.GetSingleNodeValue(xmlNode, "INACTIVE_IMAGE_URL", null); _group_flashingIconUrl.val = XML.GetSingleNodeValue(xmlNode, "FLASHING_IMAGE_URL", null); } }; this.getStyleString = function() { var styleString = ""; if (this.fontColor) styleString += "color:" + this.fontColor + ";"; return objStyle.getStyleStringWithoutColor() + styleString; }; if (xmlSkin) this._init(); }; function ToolbarStyle(xmlFont) { this.isInit = false; this.fontName = null; this.isBold = null; this.isUnderlined = false; this.isItalic = false; this.fontSize = null; //pt this.color = null; var styleString = ""; var styleString2 = ""; this.getStyleStringWithoutColor = function() { if (!this.isInit) return ""; if (!styleString) { if (this.fontName) styleString += "font-family:" + this.fontName + ";"; if (this.isBold) styleString += "font-weight:bold;"; if (this.isUnderlined) styleString += "text-decoration:underline;"; if (this.isItalic) styleString += "font-style:italic;"; if (this.fontSize) styleString += "font-size:" + this.fontSize + "pt;"; } return styleString; }; this.getStyleString = function() { if (!this.isInit) return ""; if (!styleString2) { if (this.fontName) styleString2 += "font-family:" + this.fontName + ";"; if (this.isBold) styleString2 += "font-weight:bold;"; if (this.isUnderlined) styleString2 += "text-decoration:underline;"; if (this.isItalic) styleString2 += "font-style:italic;"; if (this.fontSize) styleString2 += "font-size:" + this.fontSize + "pt;"; if (this.color) styleString2 += "color:" + this.color + ";"; } return styleString2; }; this._init = function() { this.isInit = true; this.fontName = XML.GetSingleNodeValue(xmlFont, "FONT_NAME", null); this.isBold = XML.GetSingleNodeValueAsBoolean(xmlFont, "BOLD", null); this.isUnderlined = XML.GetSingleNodeValueAsBoolean(xmlFont, "UNDERLINED", null); this.isItalic = XML.GetSingleNodeValueAsBoolean(xmlFont, "ITALIC", null); this.fontSize = XML.GetSingleNodeValue(xmlFont, "SIZE", null); this.color = XML.GetSingleNodeValue(xmlFont, "COLOR", null); }; if (xmlFont) this._init(); }; function UserComponentsState() { this.weather = new UserComponentState(true, true); this.emailNotifier = new UserComponentState(true, true); this.privacy = new UserComponentState(true, false); this.radio = new UserComponentState(true, true); this.facebook = new UserComponentState(true, true); }; function UserComponentState(available, checked) { this.available = available; this.checked = checked; }; function ToolbarDataManager(toolbarVersion, actingCTID, originalCTID, objToolbarDefaults) { var toolbarData = new ToolbarData(); var aSubject = new Object(); aSubject.wrappedJSObject = aSubject; aSubject.originalCTID = originalCTID; aSubject.actingCTID = actingCTID; var chromeName = objToolbarDefaults.chromeName; this.notifySettingObservers = function() { notifyObservers(aSubject, ToolbarDataParsingXPCOM.observerTopic, ToolbarDataParsingXPCOM.observerData.settings); }; this.updateSettings = function(xmlToolbarSettings, bNotifyObservers, isMC) { //settings is already parsed, and this are not new settings from server if (!xmlToolbarSettings) return; var objMCItem = null; if (isMC) { var objData = new ToolbarItemData(null, ToolbarDataParsingXPCOM.ComponentType.Settings, true, chromeName, originalCTID, actingCTID); objMCItem = new MultiCommunityItem(objData); } var settingsParser = new SettingsParser(xmlToolbarSettings, objMCItem, objToolbarDefaults, originalCTID, actingCTID); toolbarData.publisherItemsHash = settingsParser.getItemsHash(); //check if valid, should be at least one publisher component (except the multicommunity component) var invalidCount = (isMC) ? 1 : 0; if (!toolbarData.publisherItemsHash || toolbarData.publisherItemsHash.Count() == invalidCount) return false; toolbarData.generalToolbarInfo = settingsParser.getGeneralToolbarInfo(); toolbarData.componentsIds = settingsParser.getComponentsIDs(); settingsParser = null; if (bNotifyObservers) this.notifySettingObservers(); return true; }; this.updateUserAddedComponents = function(xmlUserComponents, bNotifyObservers) { //parse user added by old API components var userComponentsParser = new UserComponentsParser(xmlUserComponents, chromeName, originalCTID, actingCTID, objToolbarDefaults.knownComponents); toolbarData.userItemsHash = userComponentsParser.getItemsHash(); userComponentsParser = null; if (bNotifyObservers) notifyObservers(aSubject, ToolbarDataParsingXPCOM.observerTopic, ToolbarDataParsingXPCOM.observerData.userAddComponents); }; this.updateThirdPartyComponents = function(xmlThirdPartyComponents, bNotifyObservers) { //parse third party components var thirdPartyComponentsParser = new ThirdPartyComponentsParser(xmlThirdPartyComponents, chromeName, originalCTID, actingCTID, objToolbarDefaults.knownComponents); toolbarData.thirdPartyItemsHash = thirdPartyComponentsParser.getItemsHash(); thirdPartyComponentsParser = null; if (bNotifyObservers) notifyObservers(aSubject, ToolbarDataParsingXPCOM.observerTopic, ToolbarDataParsingXPCOM.observerData.thirdParty); }; this.updateMyStuffComponents = function(arrXmlMyStuffComponents, bNotifyObservers) { //parse myStuff components var myStuffComponentsParser = new MyStuffParser(arrXmlMyStuffComponents, chromeName, originalCTID, actingCTID, objToolbarDefaults.knownComponents); toolbarData.myStuffItemsHash = myStuffComponentsParser.getItemsHash(); toolbarData.myStuffDataHash = myStuffComponentsParser.getDataHash(); toolbarData.myStuffUniqueCompIdToCompGuidHash = myStuffComponentsParser.getUniqueCompIdToCompGuidHash(); myStuffComponentsParser = null; if (bNotifyObservers) notifyObservers(aSubject, ToolbarDataParsingXPCOM.observerTopic, ToolbarDataParsingXPCOM.observerData.myStuff); }; this.updateLanguagePack = function(xmlLanguagePack, bNotifyObservers) { if (!xmlLanguagePack) return; toolbarData.languagePack = new LanguagePackDS(xmlLanguagePack); if (bNotifyObservers) notifyObservers(aSubject, ToolbarDataParsingXPCOM.observerTopic, ToolbarDataParsingXPCOM.observerData.languagePack); }; this.getToolbarData = function() { return toolbarData; }; }; function BaseParser(knownComponents) { this.isKnownComponent = function(xmlComponent) { //patch for older versions prior to 2.3.0.x if (!knownComponents && xmlComponent.tagName == "TWITTER") return false; return !knownComponents || xmlComponent && knownComponents.isKnownComponent(xmlComponent.tagName); }; }; function MyStuffParser(arrXmlMyStuffComponents, chromeName, originalCTID, actingCTID, knownComponents) { BaseParser.call(this, knownComponents); var arrHashMyStuffItems = null; var arrHashMyStuffData = null var arrHashMyStuffUniqueCompIdToCompGuid = null; this.parse = function() { arrHashMyStuffItems = new HashArray(); arrHashMyStuffData = new HashArray(); arrHashMyStuffUniqueCompIdToCompGuid = new HashArray(); var myStuffData = null; var myStuffItem = null; var xmlItem = null; var objToolbarItemData = null var myStuffType = ToolbarDataParsingXPCOM.ComponentType.MyStuff; //add myStuffAdd button item objToolbarItemData = new ToolbarItemData(null, myStuffType, false, chromeName, originalCTID, actingCTID); myStuffItem = (!arrXmlMyStuffComponents || arrXmlMyStuffComponents.length == 0) ? new MyStuffButtonItem(objToolbarItemData) : new MyStuffWithOptionsButtonItem(objToolbarItemData); arrHashMyStuffItems.Add(myStuffItem.UniqueCompID, myStuffItem); if (!arrXmlMyStuffComponents) return; for (var i = 0; i < arrXmlMyStuffComponents.length; i++) { myStuffData = new MyStuffComponentData(); xmlItem = myStuffData.initFromXml(arrXmlMyStuffComponents[i]); if (this.isKnownComponent(xmlItem)) { objToolbarItemData = new ToolbarItemData(xmlItem, myStuffType, false, chromeName, originalCTID, actingCTID); myStuffItem = ToolbarDataParsingXPCOM.toolbarItemsFactory.GetInstance(objToolbarItemData); if (myStuffItem && !arrHashMyStuffData.Contains(myStuffData.compGuid) && !arrHashMyStuffItems.Contains(myStuffItem.UniqueCompID)) { arrHashMyStuffData.Add(myStuffData.compGuid, myStuffData); arrHashMyStuffItems.Add(myStuffItem.UniqueCompID, myStuffItem); arrHashMyStuffUniqueCompIdToCompGuid.Add(myStuffItem.UniqueCompID, myStuffData.compGuid); } } } }; this.parse(); this.getItemsHash = function() { return arrHashMyStuffItems; }; this.getDataHash = function() { return arrHashMyStuffData; }; this.getUniqueCompIdToCompGuidHash = function() { return arrHashMyStuffUniqueCompIdToCompGuid; }; }; MyStuffParser.prototype = new BaseParser(); MyStuffParser.constructor = MyStuffParser; function SettingsParser(xmlToolbarSettings, objMCItem, objToolbarDefaults, originalCTID, actingCTID) { BaseParser.call(this, objToolbarDefaults.knownComponents); var arrHashToolbarItems = new HashArray(); var generalToolbarInfo = null; var strToolbarVersion = objToolbarDefaults.version; var chromeName = objToolbarDefaults.chromeName; var componentsIds = new ComponentsIDs(); //if MC item exists, always add it first if (objMCItem) arrHashToolbarItems.Add(objMCItem.UniqueCompID, objMCItem); var isVersionOk = function(xmlComponent) { try { if (!xmlComponent && !xmlComponent.tagName) return true; var strMaxSupported = null; var strMinSupported = null; var xpathResult = null; xpathResult = xmlComponent.ownerDocument.evaluate("COMPONENT_VERSION_INFO/FF/MAX_VER", xmlComponent, null, 2, null); if (xpathResult) strMaxSupported = xpathResult.stringValue; xpathResult = xmlComponent.ownerDocument.evaluate("COMPONENT_VERSION_INFO/FF/MIN_VER", xmlComponent, null, 2, null); if (xpathResult) strMinSupported = xpathResult.stringValue; if (!strMaxSupported && !strMinSupported) return true; if (strMaxSupported) { var iMaxCheck = compareVersions(strToolbarVersion, strMaxSupported) if (iMaxCheck > 0) return false; } if (strMinSupported) { var iMinCheck = compareVersions(strMinSupported, strToolbarVersion) if (iMinCheck > 0) return false; } return true; } catch (e) { return true; } }; this.setComponentsId = function(oToolbarItem) { var uniqueCompID = oToolbarItem.UniqueCompID; if (oToolbarItem instanceof DynamicMenuItem && oToolbarItem.isMainMenu) componentsIds.MainMenu = uniqueCompID; else if (oToolbarItem instanceof SearchBoxItem) componentsIds.SearchBox = uniqueCompID; else if (oToolbarItem instanceof HighlighterItem) componentsIds.Highlighter = uniqueCompID; else if (oToolbarItem instanceof EMailNotifierItem) componentsIds.EMailNotifier = uniqueCompID; else if (oToolbarItem instanceof PrivacyItem) componentsIds.Privacy = uniqueCompID; else if (oToolbarItem instanceof WeatherItem) componentsIds.Weather = uniqueCompID; else if (oToolbarItem instanceof RadioItem) componentsIds.Radio = uniqueCompID; else if (oToolbarItem instanceof ChatItem) componentsIds.Chat = uniqueCompID; else if (oToolbarItem instanceof FacebookItem) componentsIds.Facebook = uniqueCompID; }; this.parseSettings = function() { var mainMenuItem = null; var xmlComponent = null; var oToolbarItem = null; var objData = null; for (var i = 0; i < xmlToolbarSettings.childNodes.length; i++) { xmlComponent = xmlToolbarSettings.childNodes[i]; if (isVersionOk(xmlComponent) && this.isKnownComponent(xmlComponent)) { objData = new ToolbarItemData(xmlComponent, ToolbarDataParsingXPCOM.ComponentType.Settings, true, chromeName, originalCTID, actingCTID); oToolbarItem = ToolbarDataParsingXPCOM.toolbarItemsFactory.GetInstance(objData); if (oToolbarItem) { //for special components this.setComponentsId(oToolbarItem); arrHashToolbarItems.Add(oToolbarItem.UniqueCompID, oToolbarItem); if (oToolbarItem instanceof DynamicMenuItem && oToolbarItem.isMainMenu) mainMenuItem = oToolbarItem; } } } return mainMenuItem; }; this.init = function() { var arrXmlFloatMenuItems = new Array(); var mainMenuItem = null; var XMLUserSettings = null; var logoIconItem = null; //GENERAL_TOOLBAR_INFO var xmlGeneralToolbarInfo = XML.SelectSingleNode(xmlToolbarSettings, "GENERAL_TOOLBAR_INFO"); generalToolbarInfo = new GeneralToolbarInfo(xmlGeneralToolbarInfo, actingCTID, originalCTID, objToolbarDefaults); //TODO: xmlToolbarSettings.removeChild(xmlGeneralToolbarInfo); //USER_SETTINGS var xmlUserSettings = XML.SelectSingleNode(xmlToolbarSettings, "USER_SETTINGS"); if (xmlUserSettings) { //TODO: xmlToolbarSettings.removeChild(xmlUserSettings); } //LOGOICON var xmlLogoIcon = XML.SelectSingleNode(xmlToolbarSettings, "LOGOICON"); if (xmlLogoIcon) { //TODO: xmlToolbarSettings.removeChild(xmlLogoIcon); logoIconItem = new LogoIconItem(xmlLogoIcon); } //MENUITEM var xmlMenuItem = XML.SelectSingleNode(xmlToolbarSettings, "MENUITEM"); if (xmlMenuItem) { //TODO: xmlToolbarSettings.removeChild(xmlMenuItem); arrXmlFloatMenuItems.push(xmlMenuItem); } //parse settings mainMenuItem = this.parseSettings(); if (mainMenuItem) { this.updateMainMenu(mainMenuItem, arrXmlFloatMenuItems, logoIconItem); } //add missing personal components from USER_SETTINGS flag this.addMissingUserSettingsComponents(xmlUserSettings); //update personal components with personal components object this.updatePersonalComponents(); }; this.updateMainMenu = function(mainMenuItem, arrXmlFloatMenuItems, logoIconItem) { mainMenuItem.arrXmlFloatMenuItems = arrXmlFloatMenuItems; if (!logoIconItem || mainMenuItem.IsValidMainMenu) return; if (logoIconItem.tooltip) mainMenuItem.button.tooltip = logoIconItem.tooltip; if (logoIconItem.link) mainMenuItem.link = logoIconItem.link; if (logoIconItem.path) mainMenuItem.button.image = logoIconItem.path; }; this.addMissingUserSettingsComponents = function(xmlUserSettings) { var xmlComponent = null; var objItem = null; var objItemData = null; //check to add Email notifier if (!arrHashToolbarItems.Contains(componentsIds.EMailNotifier)) { xmlComponent = XML.SelectSingleNode(xmlUserSettings, "EMAIL_NOTIFIER"); if (xmlComponent && isVersionOk(xmlComponent) && this.isKnownComponent(xmlComponent)) { objItemData = new ToolbarItemData(xmlComponent, ToolbarDataParsingXPCOM.ComponentType.Settings, false, chromeName, originalCTID, actingCTID); objItem = new EMailNotifierItem(objItemData); arrHashToolbarItems.Add(objItem.UniqueCompID, objItem); componentsIds.EMailNotifier = objItem.UniqueCompID; } } //check to add Privacy if (!arrHashToolbarItems.Contains(componentsIds.Privacy)) { xmlComponent = XML.SelectSingleNode(xmlUserSettings, "PRIVACY_COMPONENT"); if (xmlComponent && isVersionOk(xmlComponent) && this.isKnownComponent(xmlComponent)) { objItemData = new ToolbarItemData(xmlComponent, ToolbarDataParsingXPCOM.ComponentType.Settings, false, chromeName, originalCTID, actingCTID); objItem = new PrivacyItem(objItemData); arrHashToolbarItems.Add(objItem.UniqueCompID, objItem); componentsIds.Privacy = objItem.UniqueCompID; } } //check to add Radio if (!arrHashToolbarItems.Contains(componentsIds.Radio)) { xmlComponent = XML.SelectSingleNode(xmlUserSettings, "RADIO_PLAYER"); if (xmlComponent && isVersionOk(xmlComponent) && this.isKnownComponent(xmlComponent)) { objItemData = new ToolbarItemData(xmlComponent, ToolbarDataParsingXPCOM.ComponentType.Settings, false, chromeName, originalCTID, actingCTID); objItem = new RadioItem(objItemData); arrHashToolbarItems.Add(objItem.UniqueCompID, objItem); componentsIds.Radio = objItem.UniqueCompID; } } //check to add Radio if (!arrHashToolbarItems.Contains(componentsIds.Weather)) { xmlComponent = XML.SelectSingleNode(xmlUserSettings, "WEATHER"); if (xmlComponent && isVersionOk(xmlComponent) && this.isKnownComponent(xmlComponent)) { objItemData = new ToolbarItemData(xmlComponent, ToolbarDataParsingXPCOM.ComponentType.Settings, false, chromeName, originalCTID, actingCTID); objItem = new WeatherItem(objItemData); arrHashToolbarItems.Add(objItem.UniqueCompID, objItem); componentsIds.Weather = objItem.UniqueCompID; } } //check to add Facebook if (!arrHashToolbarItems.Contains(componentsIds.Facebook)) { xmlComponent = XML.SelectSingleNode(xmlUserSettings, "FACEBOOK_COMP"); if (xmlComponent && isVersionOk(xmlComponent) && this.isKnownComponent(xmlComponent)) { objItemData = new ToolbarItemData(xmlComponent, ToolbarDataParsingXPCOM.ComponentType.Settings, false, chromeName, originalCTID, actingCTID); objItem = new FacebookItem(objItemData); arrHashToolbarItems.Add(objItem.UniqueCompID, objItem); componentsIds.Facebook = objItem.UniqueCompID; } } }; this.updatePersonalComponents = function() { var oWeather = arrHashToolbarItems.GetByID(componentsIds.Weather); var oRadio = arrHashToolbarItems.GetByID(componentsIds.Radio); var oEmailNotifier = arrHashToolbarItems.GetByID(componentsIds.EMailNotifier); var oPrivacy = arrHashToolbarItems.GetByID(componentsIds.Privacy); var oFacebook = arrHashToolbarItems.GetByID(componentsIds.Facebook); if (oWeather) oWeather.personalComponentState = generalToolbarInfo.userComponentsState.weather; if (oRadio) oRadio.personalComponentState = generalToolbarInfo.userComponentsState.radio; if (oEmailNotifier) oEmailNotifier.personalComponentState = generalToolbarInfo.userComponentsState.emailNotifier; if (oPrivacy) oPrivacy.personalComponentState = generalToolbarInfo.userComponentsState.privacy; if (oFacebook) oPrivacy.personalComponentState = generalToolbarInfo.userComponentsState.facebook; }; this.init(); this.getItemsHash = function() { return arrHashToolbarItems; }; this.getGeneralToolbarInfo = function() { return generalToolbarInfo; }; this.getComponentsIDs = function() { return componentsIds; }; }; SettingsParser.prototype = new BaseParser(); SettingsParser.constructor = SettingsParser; function ThirdPartyComponentsParser(xmlThirdPartyComponents, chromeName, originalCTID, actingCTID, knownComponents) { BaseParser.call(this, knownComponents); var arrHashToolbarItems = null; this.parse = function() { arrHashToolbarItems = new HashArray(); var xmlComponent = null; var oToolbarItem = null; var objData = null; for (var i = 0; i < xmlThirdPartyComponents.childNodes.length; i++) { xmlComponent = xmlThirdPartyComponents.childNodes[i]; if (this.isKnownComponent(xmlComponent)) { objData = new ToolbarItemData(xmlComponent, ToolbarDataParsingXPCOM.ComponentType.ThirdParty, false, chromeName, originalCTID, actingCTID); oToolbarItem = ToolbarDataParsingXPCOM.toolbarItemsFactory.GetInstance(objData); if (oToolbarItem) arrHashToolbarItems.Add(oToolbarItem.UniqueCompID, oToolbarItem); } } }; this.getItemsHash = function() { return arrHashToolbarItems; }; if (xmlThirdPartyComponents) this.parse(); }; ThirdPartyComponentsParser.prototype = new BaseParser(); ThirdPartyComponentsParser.constructor = ThirdPartyComponentsParser; function UserComponentsParser(xmlUserComponents, chromeName, originalCTID, actingCTID, knownComponents) { BaseParser.call(this, knownComponents); var arrHashToolbarItems = null; this.parse = function() { arrHashToolbarItems = new HashArray(); var xmlComponent = null; var oToolbarItem = null; var objData = null; for (var i = 0; i < xmlUserComponents.childNodes.length; i++) { xmlComponent = xmlUserComponents.childNodes[i]; if (this.isKnownComponent(xmlComponent)) { objData = new ToolbarItemData(xmlComponent, ToolbarDataParsingXPCOM.ComponentType.UserAdded, false, chromeName, originalCTID, actingCTID); oToolbarItem = ToolbarDataParsingXPCOM.toolbarItemsFactory.GetInstance(objData); if (oToolbarItem) arrHashToolbarItems.Add(oToolbarItem.UniqueCompID, oToolbarItem); } } }; this.getItemsHash = function() { return arrHashToolbarItems; }; if (xmlUserComponents) this.parse(); }; UserComponentsParser.prototype = new BaseParser(); UserComponentsParser.constructor = UserComponentsParser; function DataNodeFactory() { this.getDataObject = function(xmlData) { var type = XML.GetSingleNodeValue(xmlData, "TYPE"); var data = null; var strNode = ""; switch (type) { case ToolbarDataParsingXPCOM.dataNodeTypes.COMMAND: var xpathResult = xmlData.ownerDocument.evaluate("COMMAND/TYPE", xmlData, null, 2, null); if (xpathResult && xpathResult.stringValue == ToolbarDataParsingXPCOM.dataNodeTypes.TOGGLE_COMMAND) { data = new DataNodeToggleCommand(); strNode = ToolbarDataParsingXPCOM.dataNodeTypes.TOGGLE_COMMAND; } else { data = new DataNodeCommand(); strNode = ToolbarDataParsingXPCOM.dataNodeTypes.COMMAND; } break; case ToolbarDataParsingXPCOM.dataNodeTypes.LINK: data = new DataNodeLink(); strNode = ToolbarDataParsingXPCOM.dataNodeTypes.LINK; break; case ToolbarDataParsingXPCOM.dataNodeTypes.POP_HTML: data = new DataNodePopHtml(); strNode = ToolbarDataParsingXPCOM.dataNodeTypes.POP_HTML; break; case ToolbarDataParsingXPCOM.dataNodeTypes.APPLICATION: data = new DataNodeApplication(); strNode = ToolbarDataParsingXPCOM.dataNodeTypes.APPLICATION; break; case ToolbarDataParsingXPCOM.dataNodeTypes.RSS: data = new DataNodeRss(); strNode = ToolbarDataParsingXPCOM.dataNodeTypes.RSS; break; default: break; } if (data) data.init(XML.SelectSingleNode(xmlData, strNode)); return data; }; }; function DataNodeTypes() { this.COMMAND = "COMMAND"; this.TOGGLE_COMMAND = "TOGGLE_COMMAND"; this.LINK = "LINK"; this.POP_HTML = "POP_HTML"; this.APPLICATION = "APPLICATION"; this.RSS = "RSS"; }; function DataNodeApplication() { this.exeAlias = ""; this.params = ""; this.link = ""; this.type = ToolbarDataParsingXPCOM.dataNodeTypes.APPLICATION; this.init = function(xmlApplication) { if (!xmlApplication) return; this.exeAlias = XML.GetSingleNodeValue(xmlApplication, "EXE_ALIAS"); this.params = XML.GetSingleNodeValue(xmlApplication, "PARAMS"); this.link = XML.GetSingleNodeValue(xmlApplication, "APP_NOT_FOUND_URL"); }; this.isValid = function() { if (!this.exeAlias) return false; return true; }; }; DataNodeApplication.prototype = new DataNodeBase(); function DataNodeBase() { this.type = ""; this.init = function() { }; this.isValid = function() { }; } function DataNodeCommand() { this.command = ""; this.type = ToolbarDataParsingXPCOM.dataNodeTypes.COMMAND; this.init = function(xmlCommand) { if (!xmlCommand) return; this.command = XML.GetSingleNodeValue(xmlCommand, "TYPE"); }; this.isValid = function() { if (!this.command) return false; return true; }; }; DataNodeCommand.prototype = new DataNodeBase(); function DataNodeLink() { this.link = ""; this.target = ""; this.type = ToolbarDataParsingXPCOM.dataNodeTypes.LINK; this.init = function(xmlLink) { if (!xmlLink) return; this.link = XML.GetSingleNodeValue(xmlLink, "URL"); this.target = XML.GetSingleNodeValue(xmlLink, "TARGET"); }; this.isValid = function() { if (!this.link) return false; return true; }; }; DataNodeLink.prototype = new DataNodeBase(); function DataNodePopHtml() { //open position types this.openPositionTypes = new Object(); this.openPositionTypes.click = "CLICK"; this.openPositionTypes.center = "CENTER"; this.openPositionTypes.alignment = "ALIGNMENT"; this.openPositionTypes.offset = "OFFSET"; this.openPositionTypes.verticalAlignmentTop = "T"; this.openPositionTypes.verticalAlignmentBottom = "B"; this.openPositionTypes.horizontalAlignmentLeft = "L"; this.openPositionTypes.horizontalAlignmentRight = "R"; this.popHtmlUrl = ""; this.defaultTarget = ""; this.width = ""; this.height = ""; this.offsetX = ""; this.offsetY = ""; this.scrollV = false; this.scrollH = false; this.resizable = true; this.titlebar = true; this.closeOnExternalClick = false; this.closeButton = true; this.saveLocation = true; this.saveSize = true; this.openPositionType = ""; this.openPositionData = new Object(); this.parentElement = null; this.title = ""; this.isUser = false; this.componentId = ""; this.elementId = ""; this.compType = ""; this.source = ""; this.gadgetType = ""; this.facebookGagetType = ""; this.titleIconUrl = ""; this.chatRoomId = ""; this.type = ToolbarDataParsingXPCOM.dataNodeTypes.POP_HTML; this.init = function(xmlPopHtml) { if (!xmlPopHtml) return; this.popHtmlUrl = XML.GetSingleNodeValue(xmlPopHtml, "URL"); this.defaultTarget = XML.GetSingleNodeValue(xmlPopHtml, "DEFAULT_TARGET"); this.width = XML.GetSingleNodeValueAsInteger(xmlPopHtml, "WIDTH"); this.height = XML.GetSingleNodeValueAsInteger(xmlPopHtml, "HEIGHT"); this.offsetX = XML.GetSingleNodeValueAsInteger(xmlPopHtml, "OFFSET_X"); this.offsetY = XML.GetSingleNodeValueAsInteger(xmlPopHtml, "OFFSET_Y"); this.scrollV = XML.GetSingleNodeValueAsBoolean(xmlPopHtml, "V_SCROLL", false); this.scrollH = XML.GetSingleNodeValueAsBoolean(xmlPopHtml, "H_SCROLL", false); this.resizable = XML.GetSingleNodeValueAsBoolean(xmlPopHtml, "RESIZABLE", true); this.titlebar = XML.GetSingleNodeValueAsBoolean(xmlPopHtml, "TITLEBAR", true); this.closeOnExternalClick = XML.GetSingleNodeValueAsBoolean(xmlPopHtml, "CLOSE_ON_EXTERNAL_CLICK", false); this.closeButton = XML.GetSingleNodeValueAsBoolean(xmlPopHtml, "CLOSE_BUTTON", true); this.saveLocation = XML.GetSingleNodeValueAsBoolean(xmlPopHtml, "SAVE_LOCATION", true); this.saveSize = XML.GetSingleNodeValueAsBoolean(xmlPopHtml, "SAVE_RESIZED_SIZE", true); var openPosition = XML.SelectSingleNode(xmlPopHtml, "OPEN_POSITION"); if (openPosition) { this.openPositionType = XML.GetSingleNodeValue(openPosition, "TYPE"); switch (this.openPositionType) { case this.openPositionTypes.alignment: var vAlign = XML.GetSingleNodeValue(openPosition, "VERTICAL"); var hAlign = XML.GetSingleNodeValue(openPosition, "HORIZONTAL"); if (vAlign && vAlign.toLowerCase() == "t") this.openPositionData.vertical = this.openPositionTypes.verticalAlignmentTop; else if (vAlign && vAlign.toLowerCase() == "b") this.openPositionData.vertical = this.openPositionTypes.verticalAlignmentBottom; if (hAlign && hAlign.toLowerCase() == "l") this.openPositionData.horizontal = this.openPositionTypes.horizontalAlignmentLeft; else if (hAlign && hAlign.toLowerCase() == "r") this.openPositionData.horizontal = this.openPositionTypes.horizontalAlignmentRight; break; case this.openPositionTypes.offset: this.openPositionData.offsetX = XML.GetSingleNodeValueAsInteger(openPosition, "X", 0); this.openPositionData.offsetY = XML.GetSingleNodeValueAsInteger(openPosition, "Y", 0); } } if (!this.openPositionType) { this.openPositionType = this.openPositionTypes.alignment; this.openPositionData.vertical = this.openPositionTypes.verticalAlignmentBottom; } }; this.fillPositionFlags = function(openPosition) { if (openPosition.indexOf("click") != -1) { this.openPositionType = this.openPositionTypes.click; } else if (openPosition.indexOf("center") != -1) { this.openPositionType = this.openPositionTypes.center; } else if (openPosition.indexOf("alignment") != -1) { this.openPositionType = this.openPositionTypes.alignment; var arrTemp = openPosition.split(":"); if (arrTemp.length == 2) { var params = arrTemp[1]; if (params.indexOf("t") != -1) this.openPositionData.vertical = this.openPositionTypes.verticalAlignmentTop; if (params.indexOf("b") != -1) this.openPositionData.vertical = this.openPositionTypes.verticalAlignmentBottom; if (params.indexOf("l") != -1) this.openPositionData.horizontal = this.openPositionTypes.horizontalAlignmentLeft; if (params.indexOf("r") != -1) this.openPositionData.horizontal = this.openPositionTypes.horizontalAlignmentRight; } } else if (openPosition.indexOf("offset") != -1) { this.openPositionType = this.openPositionTypes.offset; var arrTemp = openPosition.split(":"); if (arrTemp.length == 2) { var params = arrTemp[1]; params = params.replace(/\(/, "").replace(/\)/, ""); var arrXY = params.split(";"); if (arrXY.length == 2) { this.openPositionData.offsetX = parseInt(arrXY[0]); this.openPositionData.offsetY = parseInt(arrXY[1]); } } } }; this.initFeatures = function(strFeatures) { //default click this.openPositionType = this.openPositionTypes.click; if (!strFeatures) return; var arrFeatures = strFeatures.split(","); var keyValue = ""; for (var i = 0; i < arrFeatures.length; i++) { keyValue = arrFeatures[i].toLowerCase().split("="); switch (keyValue[0]) { case "resizable": this.resizable = parseFeaturedBool(keyValue[1], true); break; case "vscroll": this.scrollV = parseFeaturedBool(keyValue[1], true); break; case "hscroll": this.scrollH = parseFeaturedBool(keyValue[1], true); break; case "titlebar": this.titlebar = parseFeaturedBool(keyValue[1], true); break; case "closeonexternalclick": this.closeOnExternalClick = parseFeaturedBool(keyValue[1], false); break; case "closebutton": this.closeButton = parseFeaturedBool(keyValue[1], true); break; case "savelocation": this.saveLocation = parseFeaturedBool(keyValue[1], true); break; case "saveresizedsize": this.saveSize = parseFeaturedBool(keyValue[1], true); break; case "openposition": this.fillPositionFlags(keyValue[1]); break; } } }; this.isValid = function() { if (!this.popHtmlUrl) return false; return true; }; }; DataNodePopHtml.prototype = new DataNodeBase(); function DataNodeRss() { this.link = ""; this.interval = ""; this.type = ToolbarDataParsingXPCOM.dataNodeTypes.RSS; this.init = function(xmlRss) { if (!xmlRss) return; this.link = XML.GetSingleNodeValue(xmlRss, "URL"); this.interval = XML.GetSingleNodeValue(xmlRss, "INTERVAL"); }; this.isValid = function() { if (!this.link || !this.interval) return false; return true; }; }; DataNodeRss.prototype = new DataNodeBase(); function DataNodeToggleCommand() { this.state0 = new DataNodeToggleCommandState(); this.state1 = new DataNodeToggleCommandState(); this.type = ToolbarDataParsingXPCOM.dataNodeTypes.TOGGLE_COMMAND; this.init = function(xmlToggleCommand) { if (!xmlToggleCommand) return; this.state0.init(XML.SelectSingleNode(xmlToggleCommand, "STATE_0")); this.state1.init(XML.SelectSingleNode(xmlToggleCommand, "STATE_1")); }; this.isValid = function() { if (!this.state0.command || !this.state1.command) return false; return true; }; }; function DataNodeToggleCommandState() { this.command = ""; this.caption = ""; this.iconUrl = ""; this.tooltip = ""; this.init = function(xmlState) { if (!xmlState) return; this.command = XML.GetSingleNodeValue(xmlState, "COMMAND"); this.caption = XML.GetSingleNodeValue(xmlState, "CAPTION"); this.iconUrl = XML.GetSingleNodeValue(xmlState, "ICON_URL"); this.tooltip = XML.GetSingleNodeValue(xmlState, "HINT"); }; }; DataNodeCommand.prototype = new DataNodeBase(); function ToolbarItemsFactory() { this.GetInstance = function(objToolbarItemData) { switch (objToolbarItemData.xmlNode.tagName) { case "DYNAMIC_MENU": return new DynamicMenuItem(objToolbarItemData); case "LINK_BUTTONITEM": case "SPECIAL_COMMAND_ITEM": case "BUTTON": return new ButtonItem(objToolbarItemData); case "BROWSER_COMPONENT": return new BrowserItem(objToolbarItemData); case "SEARCH": return new SearchBoxItem(objToolbarItemData); case "HIGHLIGHTER": return new HighlighterItem(objToolbarItemData); case "RSS_FEED_ITEM": return new FeedItem(objToolbarItemData); case "SEPERATORITEM": return new SeparatorItem(objToolbarItemData); case "PRIVACY_COMPONENT": return new PrivacyItem(objToolbarItemData); case "EXTERNAL_COMPONENT": return new ExternalComponentItem(objToolbarItemData); case "EMAIL_NOTIFIER": return new EMailNotifierItem(objToolbarItemData); case "MULTI_RSS": return new MultiFeedItem(objToolbarItemData); case "WEATHER": return new WeatherItem(objToolbarItemData); case "LABEL": return new LabelItem(objToolbarItemData); case "RADIO_PLAYER": return new RadioItem(objToolbarItemData); case "MULTI_COMMUNITY": return new MultiCommunityItem(objToolbarItemData); case "EMAIL_NOTIFIER_NEW": return new EmailNotifierNewItem(objToolbarItemData); case "TOGGLE_COMPONENT": return new ToggleItem(objToolbarItemData); case "CHAT": return new ChatItem(objToolbarItemData); case "TWITTER": return new TwitterItem(objToolbarItemData); case "FACEBOOK_COMP": return new FacebookItem(objToolbarItemData); default: return null; } }; }; var ToolbarManagerConst = { settingsFilename: "LocalSettings.txt", languagePackFilename: "LanguagePack.xml", thirdPartyFilename: "ThirdPartyComponents.xml", userComponentsFilename: "UserAdditionalComponents.xml", languagePackFilename: "LanguagePack.xml", myStuffFolder: "MyStuffComponents" }; var ToolbarManagerPrefsConsts = { FixPageNotFoundErrorsIsEnabled: "FixPageNotFoundErrors", MyStuffEnabled: "MyStuffEnabled" }; function ToolbarDefaultsDS() { this.settingsUrl = ""; this.loginUrl = ""; this.thirdPartyUrl = ""; this.languagePackUrl = ""; this.webServerUrl = ""; this.myStuffUrl = ""; this.myStuffSearchUrl = ""; this.myStuffEnabled = true; this.isMC = false; this.isGrouping = false; this.version = ""; this.chromeName = ""; this.fix404Enabled = false; this.fix404Checked = false; this.sendValidationData = false; this.alertSource = ""; this.knownComponents = null; this.searchInNewTab = false; }; var MyStuffFunctions = { DEFAULT_PUBLISHER_MIN_WIDTH: 400, setComponentShown: function(myStuffDataHash, myStuffItemsHash, compGuid) { //show it if hidden by user, for user to see that it's added var myStuffData = myStuffDataHash.GetByID(compGuid); var oItem = myStuffItemsHash.GetByID(myStuffData.uniqueCompId); if (oItem && !oItem.isShow()) oItem.setShowState(true); }, getMyStuffComponentFilename: function(compGuid) { return ToolbarManagerConst.myStuffFolder + Dir.sep + compGuid + ".xml"; }, getMyStuffListFilename: function() { return ToolbarManagerConst.myStuffFolder + Dir.sep + "list.json"; }, isSupportedComponent: function(xmlMyStuffComponent, knownComponents) { //test component try { var xmlComponent = XML.SelectSingleNode(xmlMyStuffComponent, "COMPONENT_XML"); //patch for twitter if (!knownComponents && xmlComponent.firstChild.tagName == "TWITTER") return false; if (knownComponents && !knownComponents.isKnownComponent(xmlComponent.firstChild.tagName)) return false; var itemData = new ToolbarItemData(xmlComponent.firstChild, ToolbarDataParsingXPCOM.ComponentType.MyStuff, false, "", "CT", "CT"); var oItem = ToolbarDataParsingXPCOM.toolbarItemsFactory.GetInstance(itemData); return oItem != null; } catch (ex) { Logging.LogToConsole(ex); return true; } }, loadMyStuffComponents: function(oIO) { var arrList = this.readListFileToArray(oIO); if (!arrList || arrList.length == 0) return null; var compGuid = ""; var strFilename = ""; var strMyStuffComponent = ""; var xmlMyStuffComponent = null; var arrXmlComponents = new Array(); for (var i = 0; i < arrList.length; i++) { compGuid = arrList[i]; strFilename = this.getMyStuffComponentFilename(compGuid); strMyStuffComponent = oIO.readToolbarFile(strFilename, false); if (strMyStuffComponent) { xmlMyStuffComponent = XML.GetXmlDocument(strMyStuffComponent); if (xmlMyStuffComponent) { xmlMyStuffComponent = xmlMyStuffComponent.documentElement; arrXmlComponents.push(xmlMyStuffComponent); } } } return arrXmlComponents; }, readListFileToArray: function(oIO) { var strListFilename = this.getMyStuffListFilename(); var strListJson = oIO.readToolbarFile(strListFilename, false); if (!strListJson) return null; var arrList = null; try { arrList = JSON.parse(strListJson); } catch (ex) { Logging.LogToConsole(ex); } return arrList; }, writeListFileFromArray: function(arrList, oIO) { var strJson = (!arrList || arrList.length == 0) ? "" : "[\"" + arrList.join("\",\"") + "\"]"; oIO.writeToolbarFile(strJson, this.getMyStuffListFilename()); }, deleteMyStuffComponent: function(compGuid, oIO) { //delete component file var strFilename = this.getMyStuffComponentFilename(compGuid); oIO.deleteFile(strFilename); //update components list var arrList = this.readListFileToArray(oIO); if (!arrList || arrList.length == 0) return; for (var i = 0; i < arrList.length; i++) { if (arrList[i] == compGuid) { arrList.splice(i, 1); this.writeListFileFromArray(arrList, oIO); break; } } }, updateMyStuffComponents: function(positionsHash, myStuffDataHash, myStuffItemsHash, myStuffUniqueCompIdToCompGuidHash, oIO) { var oData = null; var compFilename = ""; for (var i = 0; i < myStuffDataHash.Count(); i++) { oData = myStuffDataHash.GetByIndex(i); if (!positionsHash.Contains(oData.uniqueCompId)) { compFilename = this.getMyStuffComponentFilename(oData.compGuid); //set component visible before delete this.setComponentShown(myStuffDataHash, myStuffItemsHash, oData.compGuid); oIO.deleteFile(compFilename); } } //create list of compGuid from list of UniqueCompId var arrList = new Array(); var compGuid = ""; for (var i = 0; i < positionsHash.Count(); i++) { compGuid = myStuffUniqueCompIdToCompGuidHash.GetByID(positionsHash.GetByIndex(i)); arrList.push(compGuid); } this.writeListFileFromArray(arrList, oIO); }, onMyStuffResponse: function(myStuffRS, compGuid, myStuffDataHash, oIO, isFromApi, knownComponents) { if (!isFromApi && myStuffRS.flags == ToolbarDataParsingXPCOM.myStuff.responseFlags.DELETED) { this.deleteMyStuffComponent(compGuid, oIO); return; } if (myStuffRS.flags != ToolbarDataParsingXPCOM.myStuff.responseFlags.MODIFIED && isFromApi) return; var myStuffData = (myStuffDataHash) ? myStuffDataHash.GetByID(compGuid) : null; var isNew = false; //new component if (!myStuffData) { myStuffData = new MyStuffComponentData(); myStuffData.compGuid = compGuid; isNew = true; } var xmlComponent = myStuffData.updateFromResponse(myStuffRS); var xmlMyStuffComponent = myStuffData.toXml(xmlComponent); if (!this.isSupportedComponent(xmlMyStuffComponent, knownComponents)) { myStuffRS.flags = ToolbarDataParsingXPCOM.myStuff.responseFlags.UNSUPPORTED; return; } var strFileName = MyStuffFunctions.getMyStuffComponentFilename(compGuid); oIO.writeToolbarFile(XML.GetStringXml(xmlMyStuffComponent), strFileName, false); if (isNew) { var arrList = this.readListFileToArray(oIO); if (!arrList) { arrList = new Array(); arrList.push(compGuid); } else arrList.splice(0, 0, compGuid); this.writeListFileFromArray(arrList, oIO); } }, addMyStuffComponent: function(compGuid, compInstanceGuid, myStuffDataHash, myStuffItemsHash, myStuffManager, oIO, responseCallback) { //exists if (myStuffDataHash && myStuffDataHash.Contains(compGuid)) { this.setComponentShown(myStuffDataHash, myStuffItemsHash, compGuid); //reposition var arrList = this.readListFileToArray(oIO); var i = 0; for (; i < arrList.length; i++) if (arrList[i] == compGuid) break; arrList.splice(i, 1); arrList.splice(0, 0, compGuid); this.writeListFileFromArray(arrList, oIO); return true; } //not exists, get from server else { var objMyStuffData = new MyStuffComponentData(); objMyStuffData.compGuid = compGuid; objMyStuffData.compInstanceGuid = compInstanceGuid; var arrMyStuff = new Array(); arrMyStuff.push(objMyStuffData); myStuffManager.request(arrMyStuff, responseCallback, true); return false; } }, isSuccessFlags: function(flags) { return (flags == ToolbarDataParsingXPCOM.myStuff.responseFlags.NOT_MODIFIED || flags == ToolbarDataParsingXPCOM.myStuff.responseFlags.MODIFIED); }, notifyUIEvent: function(flags, isSuccess, originalCTID) { var win = getWindow(); var thatToolbarManager = win["EBToolbarManager_" + originalCTID]; if(thatToolbarManager && thatToolbarManager.myStuffManager && thatToolbarManager.myStuffManager.onApiAddStuffResponse) thatToolbarManager.myStuffManager.onApiAddStuffResponse(flags, isSuccess); } }; function ToolbarManager(originalCTID, actingCTID, objOnReadyCallback) { var isInit = false; this.originalCTID = originalCTID; this.actingCTID = actingCTID; this.toolbarDefaults = null; this.notifyReadyOnceFunction = (typeof objOnReadyCallback != "undefined") ? objOnReadyCallback : null; this.refCount = 0; var oPrefs = new PrefManager(this.originalCTID, this.actingCTID); var oIO = new IO(this.originalCTID, this.actingCTID); var toolbarDataManager = null; //services manager var settingsManager = null; var loginManager = null; var thirdPartyManager = null; var languagePackManager = null; var myStuffManager = null; this._initManagers = function() { settingsManager = new SettingsManager(this.toolbarDefaults.settingsUrl, this.toolbarDefaults.version, this.originalCTID, this.actingCTID, oPrefs, this.onSettingsModified, this); loginManager = new LoginManager(this.toolbarDefaults.loginUrl, originalCTID, actingCTID, oPrefs, this.toolbarDefaults, this._refreshToolbarAfterFirstLogin, this); thirdPartyManager = new ThirdPartyManager(this.toolbarDefaults.thirdPartyUrl, originalCTID, actingCTID, oPrefs, this.onThirdPartyModified, this); languagePackManager = new LanguagePackManager(this.toolbarDefaults.languagePackUrl, originalCTID, actingCTID, this.toolbarDefaults.version, oPrefs, this.onLanguagePackChange, this); myStuffManager = new MyStuffServiceManager(this.toolbarDefaults.myStuffUrl, oPrefs, this.onMyStuffResponse, this); }; this._loadData = function() { toolbarDataManager = new ToolbarDataManager(this.toolbarDefaults.version, actingCTID, originalCTID, this.toolbarDefaults); this._loadThirdParty(); this._loadUserComponents(false); this._loadMyStuffComponents(false); var bIsReady = this._loadSettings(); this._loadLanguagePack(); }; this._init = function() { this._initManagers(); this._loadData(); }; this.register = function(objToolbarDefaults) { this.refCount++; //on every new window load, check if needed to request those services if (!isInit) { isInit = true; if (!this.toolbarDefaults) this.toolbarDefaults = objToolbarDefaults; this._init(); } else { settingsManager.request(false, false); languagePackManager.request(false, this.getToolbarData().languagePack.lastUpdateTime); } //my stuff this._refreshMyStuff(); loginManager.request(false); }; this.unregister = function() { this.refCount--; if (this.refCount == 0) this.shutdown(); }; this.refresh = function(bInvalidateCache) { settingsManager.request(true, bInvalidateCache); //thirdPartyManager.request(true); this._refreshMyStuff(true); }; this.reloadUserComponents = function(isBroadcast) { this._loadUserComponents(isBroadcast); }; this.requestLogin = function() { loginManager.request(true); }; this.getToolbarData = function() { return toolbarDataManager.getToolbarData(); }; this.getLPKey = function(key) { var locale = oPrefs.GetPref(SettingsPrefConsts.ToolbarLocale, true); return this.getToolbarData().languagePack.GetByID(key, locale); }; this.getLocale = function() { return oPrefs.GetPref(SettingsPrefConsts.ToolbarLocale, true); }; this.shutdown = function() { settingsManager.shutdown(); settingsManager = null; loginManager.shutdown(); loginManager = null; thirdPartyManager.shutdown(); thirdPartyManager = null; myStuffManager.shutdown(); myStuffManager = null; this.refCount = 0; isInit = false; }; this.isReady = function() { return (this.getToolbarData().publisherItemsHash && this.getToolbarData().publisherItemsHash.Count() != 0); }; this.isBuildMC = function() { var bIsGrouping = oPrefs.HasUserValue(SettingsPrefConsts.IsGrouping, false) ? oPrefs.GetPref(SettingsPrefConsts.IsGrouping, false) : this.toolbarDefaults.isGrouping; var bIsMC = oPrefs.HasUserValue(SettingsPrefConsts.IsMulticommunity, false) ? oPrefs.GetPref(SettingsPrefConsts.IsMulticommunity, false) : this.toolbarDefaults.isMC; return (bIsMC || bIsGrouping); }; this.onSettingsModified = function(bSettingsModified, xmlSettings, bLocaleChange, bAlertChannelChanged) { if (bSettingsModified && xmlSettings) { //if manager is created on community switch, first time settings received, is not notified to all toolbars, //but called a function defined in XPCOM to handle new settings received. var bIsValid = toolbarDataManager.updateSettings(xmlSettings, false, this.isBuildMC()); if (!bIsValid) { EBLog("settings are not valid"); return; } oIO.writeToolbarFile(XML.GetStringXml(xmlSettings), ToolbarManagerConst.settingsFilename, true); this._loadMyStuffComponents(false); if (this.notifyReadyOnceFunction) { this.notifyReadyOnceFunction(this); this.notifyReadyOnceFunction = null; } else toolbarDataManager.notifySettingObservers(); this.updateFix404(); this.updateSearchInNewTab(); } if (bLocaleChange) languagePackManager.request(true); if (bAlertChannelChanged) { var arrAlertChannelIds = new Array(); arrAlertChannelIds.push(oPrefs.GetPref(AlertPrefConsts.alertChannelId)); AlertXPCOM.manager.replaceChannelIds(this.toolbarDefaults.alertSource, arrAlertChannelIds); } }; this.onThirdPartyModified = function(xmlThirdParty) { //save file oIO.writeToolbarFile(XML.GetStringXml(xmlThirdParty), ToolbarManagerConst.thirdPartyFilename, true); toolbarDataManager.updateThirdPartyComponents(xmlThirdParty, true); }; this.onLanguagePackChange = function(xmlLanguagePack) { //save to file oIO.writeToolbarFile(XML.GetStringXml(xmlLanguagePack), ToolbarManagerConst.languagePackFilename, true); toolbarDataManager.updateLanguagePack(xmlLanguagePack, true); }; this.updateFix404 = function() { if (!this.toolbarDefaults.fix404Enabled) return; var strUrl = this.getToolbarData().generalToolbarInfo.fixPageNotFoundUrl; var isEnabled = (oPrefs.HasUserValue(ToolbarManagerPrefsConsts.FixPageNotFoundErrorsIsEnabled)) ? oPrefs.GetPref(ToolbarManagerPrefsConsts.FixPageNotFoundErrorsIsEnabled, false) : this.toolbarDefaults.fix404Checked; var isExternal = !URL.IsEqualTopLevelDomain(this.toolbarDefaults.webServerUrl, strUrl); Fix404XPCOM.manager.register(originalCTID, strUrl, isEnabled, isExternal); }; //******************************** Search in new Tab ******************************** // //*********************************************************************************** // this.updateSearchInNewTab = function() { //the toolbar is not familliar with search in new tab functionality if (!this.toolbarDefaults.searchInNewTab) return; //if login is not done yet, not enouph data to init, return if (!oPrefs.HasUserValue(LoginPrefConsts.LastLoginDate, false)) return; var publisherServiceUrl = this.getToolbarData().generalToolbarInfo.searchInNewTabServiceUrl; var isPublisherEnabled = this.getToolbarData().generalToolbarInfo.searchInNewTabEnabled; var isGlobalEnabled = oPrefs.GetPref(LoginPrefConsts.SearchInNewTabEnabled); var isEnabled = isPublisherEnabled && isGlobalEnabled; SearchInNewTabXPCOM.register(originalCTID, actingCTID, this.toolbarDefaults, publisherServiceUrl, isEnabled); }; this.searchInNewTabAvailable = function() { var isPublisherEnabled = this.getToolbarData().generalToolbarInfo.searchInNewTabEnabled; var isGlobalEnabled = oPrefs.GetPref(LoginPrefConsts.SearchInNewTabEnabled); return isPublisherEnabled && isGlobalEnabled; }; //******************************** Search in new Tab end ******************************** // //*********************************************************************************** // this.fix404Checked = function(isChecked) { //get if (typeof isChecked == "undefined") { var value = (oPrefs.HasUserValue(ToolbarManagerPrefsConsts.FixPageNotFoundErrorsIsEnabled)) ? oPrefs.GetPref(ToolbarManagerPrefsConsts.FixPageNotFoundErrorsIsEnabled, false) : this.toolbarDefaults.fix404Checked; return value; } //set else { oPrefs.SetPref(ToolbarManagerPrefsConsts.FixPageNotFoundErrorsIsEnabled, false, isChecked); Fix404XPCOM.manager.setEnabledState(originalCTID, isChecked); } }; this.isLatestVersion = function() { var strLatestVersion = oPrefs.GetPref(LoginPrefConsts.latestVersion); if (!strLatestVersion) return true; return compareVersions(this.toolbarDefaults.version, strLatestVersion) >= 0; }; this._loadSettings = function() { var bIsReady = false; //load settings var strSettings = oIO.readToolbarFile(ToolbarManagerConst.settingsFilename, true); if (strSettings) { var xmlSettings = XML.GetXmlDocument(strSettings); toolbarDataManager.updateSettings(xmlSettings.documentElement, false, this.isBuildMC()); this.updateFix404(); this.updateSearchInNewTab(); settingsManager.request(false, false); //if manager is created on community switch, first time settings received, is not notified to all toolbars, //but called a function defined in XPCOM to handle new settings received. if (this.notifyReadyOnceFunction) { this.notifyReadyOnceFunction(this); this.notifyReadyOnceFunction = null; } bIsReady = true; } else { //try to load from defaults if present, only for main (original) toolbar if (actingCTID == originalCTID) { var defultsManager = DefaultsXPCOM.getManager(this.toolbarDefaults.chromeName, originalCTID); xmlSettings = defultsManager.getAndCopySettingsFile(); if (xmlSettings) toolbarDataManager.updateSettings(xmlSettings.documentElement, false, this.isBuildMC()); } settingsManager.request(true, false); } return bIsReady; }; this._loadThirdParty = function() { //load thirdparty var strThirdParty = oIO.readToolbarFile(ToolbarManagerConst.thirdPartyFilename, true); if (strThirdParty) { var xmlThirdParty = XML.GetXmlDocument(strThirdParty); toolbarDataManager.updateThirdPartyComponents(xmlThirdParty.documentElement, false); thirdPartyManager.request(false); } else thirdPartyManager.request(true); }; this._loadUserComponents = function(isBroadcast) { var strUserComponents = oIO.readToolbarFile(ToolbarManagerConst.userComponentsFilename, false); var xmlUserComponents = (strUserComponents) ? XML.GetXmlDocument(strUserComponents).documentElement : null; toolbarDataManager.updateUserAddedComponents(xmlUserComponents, isBroadcast); }; this._loadLanguagePack = function() { //load language pack var strLanguagePack = oIO.readToolbarFile(ToolbarManagerConst.languagePackFilename, true); if (strLanguagePack) { var xmlLanguagePack = XML.GetXmlDocument(strLanguagePack); toolbarDataManager.updateLanguagePack(xmlLanguagePack, false); languagePackManager.request(false, this.getToolbarData().languagePack.lastUpdateTime); } else languagePackManager.request(true, 0); }; this._loadMyStuffComponents = function(bIsNotify) { var toolbarData = this.getToolbarData(); if (this.myStuffEnabled()) { var arrXmlComponents = MyStuffFunctions.loadMyStuffComponents(oIO); toolbarDataManager.updateMyStuffComponents(arrXmlComponents, bIsNotify); } }; this._refreshMyStuff = function(force) { var myStuffDataHash = this.getToolbarData().myStuffDataHash; if (!myStuffDataHash) this._loadMyStuffComponents(false); if (myStuffDataHash && myStuffDataHash.Count() != 0) myStuffManager.request(myStuffDataHash.IndexerArray, null, false, force); }; //from options dialog this.updateMyStuffComponents = function(positionsHash) { try { var myStuffDataHash = this.getToolbarData().myStuffDataHash; var myStuffUniqueCompIdToCompGuidHash = this.getToolbarData().myStuffUniqueCompIdToCompGuidHash; var myStuffItemsHash = this.getToolbarData().myStuffItemsHash; MyStuffFunctions.updateMyStuffComponents(positionsHash, myStuffDataHash, myStuffItemsHash, myStuffUniqueCompIdToCompGuidHash, oIO); this._loadMyStuffComponents(false); } catch (ex) { Logging.LogToConsole(ex); } }; this._refreshToolbarAfterFirstLogin = function() { this._loadMyStuffComponents(false); var aSubject = new Object(); aSubject.wrappedJSObject = aSubject; aSubject.originalCTID = originalCTID; aSubject.actingCTID = actingCTID; notifyObservers(aSubject, ToolbarDataParsingXPCOM.observerTopic, ToolbarDataParsingXPCOM.observerData.settings); this.updateSearchInNewTab(); }; //api this.addMyStuffComponent = function(compGuid, compInstanceGuid, responseCallback) { var bIsExists = MyStuffFunctions.addMyStuffComponent(compGuid, compInstanceGuid, this.getToolbarData().myStuffDataHash, this.getToolbarData().myStuffItemsHash, myStuffManager, oIO, responseCallback); if (bIsExists) { this._loadMyStuffComponents(true); if (responseCallback) responseCallback(compGuid, true, ToolbarDataParsingXPCOM.myStuff.responseFlags.EXISTS); MyStuffFunctions.notifyUIEvent(ToolbarDataParsingXPCOM.myStuff.responseFlags.EXISTS, true, originalCTID); } }; this.onMyStuffResponse = function(myStuffRS, compGuid, isDone, apiResponseCallback, isFromApi, isNetworkError) { if (!isNetworkError) { MyStuffFunctions.onMyStuffResponse(myStuffRS, compGuid, this.getToolbarData().myStuffDataHash, oIO, isFromApi, this.toolbarDefaults.knownComponents); } var bIsSuccess = MyStuffFunctions.isSuccessFlags(myStuffRS.flags); //if the call was made via async API, call the callback function with flags and compGuid if (apiResponseCallback) apiResponseCallback(compGuid, bIsSuccess, myStuffRS.flags); if (isDone) this._loadMyStuffComponents(true); //if from api, notify to active window to show UI notification of newly added component. if (isFromApi) MyStuffFunctions.notifyUIEvent(myStuffRS.flags, bIsSuccess, originalCTID); }; this.isExistsMyStuffComponent = function(compGuid) { return this.getToolbarData().myStuffDataHash && this.getToolbarData().myStuffDataHash.Contains(compGuid); }; this.getMyStuffSearchUrl = function() { var url = oPrefs.GetPref(LoginPrefConsts.MyStuffSearchUrl, false); if (!url) url = this.toolbarDefaults.myStuffSearchUrl; return url; }; this.myStuffEnabled = function(value) { var statusFromSettings = (this.getToolbarData().generalToolbarInfo) ? this.getToolbarData().generalToolbarInfo.myStuffEnabled : true; var statusFromLogin = (oPrefs.HasUserValue(LoginPrefConsts.MyStuffEnabled, false)) ? oPrefs.GetPref(LoginPrefConsts.MyStuffEnabled, false) : false; var bResult = (statusFromLogin || this.toolbarDefaults.myStuffEnabled) && statusFromSettings; return bResult; }; this.myStuffPublihserMinWidth = function() { if (this.getToolbarData().generalToolbarInfo.myStuffPublisherMinWidth) return this.getToolbarData().generalToolbarInfo.myStuffPublisherMinWidth; if (oPrefs.HasUserValue(LoginPrefConsts.MyStuffPublihserMinWidth)) return oPrefs.GetPref(LoginPrefConsts.MyStuffPublihserMinWidth); return MyStuffFunctions.DEFAULT_PUBLISHER_MIN_WIDTH; }; }; function TrustedDomainsManager() { var prefKey = "TrustedApiDomains"; var defaultTrustedDomains = ["eb.com", "conduit.com", "qasite.com"]; this.saveTrustedDomains = function(arrDomains, originalCTID) { var oPrefs = new PrefManager(originalCTID, originalCTID); oPrefs.SetPref(prefKey, arrDomains.join(","), false); }; this.getTrustedDomains = function(originalCTID) { var oPrefs = new PrefManager(originalCTID, originalCTID); var strDomains = oPrefs.GetPref(prefKey, false); if (!strDomains) return defaultTrustedDomains; else return strDomains.split(","); }; this.isTrustedDomain = function(strFullUrl, originalCTID) { var domain = URL.GetBaseUrlWithoutProtocol(strFullUrl); var arrTrustedDomains = this.getTrustedDomains(originalCTID); for (var i = 0; i < arrTrustedDomains.length; i++) { if (domain.indexOf(arrTrustedDomains[i]) != -1) return true; } return false; }; }; var ToolbarManagerXPCOM = { managersHash: new Array(), getManager: function(originalCTID, actingCTID) { var oManager = null; var hashKey = originalCTID + actingCTID; if (!this.managersHash[hashKey]) { oManager = new ToolbarManager(originalCTID, actingCTID); this.managersHash[hashKey] = oManager; } else oManager = this.managersHash[hashKey]; return oManager; }, addManager: function(oManager) { var hashKey = oManager.originalCTID + oManager.actingCTID; if (this.managersHash[hashKey]) { var oldManager = this.managersHash[hashKey]; oldManager.shutdown(); oldManager = oManager; } else this.managersHash[hashKey] = oManager; }, removeManager: function(oManager) { var hashKey = oManager.originalCTID + oManager.actingCTID; this.managersHash[hashKey] = null; }, isManagerExists: function(originalCTID, actingCTID) { var oManager = null; var hashKey = originalCTID + actingCTID; return this.managersHash[hashKey]; }, toolbarDefaultsData: ToolbarDefaultsDS, isSettingsExists: function(originalCTID, actingCTID) { var oIO = new IO(originalCTID, actingCTID); return oIO.isExistsNotEmpty(ToolbarManagerConst.settingsFilename, true); }, switchToCommunity: function(originalCTID, actingCTID, newCTID) { var oldManager = this.getManager(originalCTID, actingCTID); var thisObj = this; var onSettingsReady = function(oManager) { oldManager.shutdown(); ToolbarManagerXPCOM.removeManager(oldManager); ToolbarManagerXPCOM.addManager(oManager); //set new CTID to prefs var oPrefs = new PrefManager(originalCTID, newCTID); oPrefs.SetPref(SettingsPrefConsts.CTID, newCTID, false); //after this message, toolbar will unload itself, and reload with new manager, that was set yearlier var aSubject = new Object(); aSubject.wrappedJSObject = aSubject; aSubject.originalCTID = originalCTID; aSubject.actingCTID = newCTID; notifyObservers(aSubject, ToolbarDataParsingXPCOM.observerTopic, ToolbarDataParsingXPCOM.observerData.switchCommunity); }; var oManager = new ToolbarManager(originalCTID, newCTID, onSettingsReady); var refCount = oldManager.refCount; oManager.register(oldManager.toolbarDefaults); oManager.refCount = refCount; }, trustedDomains: new TrustedDomainsManager() }; function Truste(strDefaultUrl) { this.isDisplay = false; this.url = strDefaultUrl; this.updateFromSettings = function(xmlGeneralInfo) { this.isDisplay = XML.GetSingleNodeValueAsBoolean(xmlGeneralInfo, "DISPLAY_TRUSTE_SEAL", false); }; this.updateFromLogin = function(xmlAboutBox) { var strUrl = XML.GetSingleNodeValue(xmlAboutBox, "TRUSTE_SEAL_URL"); if(strUrl) this.url = strUrl; }; this.updateUrl = function(strUrl) { this.url = strUrl; }; }; function TrusteManager() { this.hashTrustee = new HashArray(); this.init = function(strCTID, strDefaultUrl) { if (this.hashTrustee.Contains(strCTID)) this.hashTrustee.GetByID(strCTID).updateUrl(strDefaultUrl); else this.hashTrustee.Add(strCTID, new Truste(strDefaultUrl)); }; this.updateFromLogin = function(strCTID, xmlAboutBox) { if (this.hashTrustee.Contains(strCTID)) this.hashTrustee.GetByID(strCTID).updateFromLogin(xmlAboutBox); }; this.updateFromSettings = function(strCTID, xmlGeneralInfo) { var oTruste = this.hashTrustee.GetByID(strCTID); if (!oTruste) return; oTruste.updateFromSettings(xmlGeneralInfo); }; this.getTrusteInfo = function(strCTID) { return this.hashTrustee.GetByID(strCTID); }; }; var TwitterPrefsConsts = { prefix: "CommunityToolbar.twitter.", lastCheckTime: "LastCheckTime" }; function TwitterGeneralUserInfo(xmlNode) { this.baseUrl = ""; this.personalPageBaseUrl = ""; this.interval = 180; this.rssBaseUrl = ""; this.rssInterval = 25; this.init = function(xmlGeneralUserInfo) { if (!xmlGeneralUserInfo) return; var xmlNode = null; for (var i = 0; i < xmlGeneralUserInfo.childNodes.length; i++) { xmlNode = xmlGeneralUserInfo.childNodes[i]; if (xmlNode && xmlNode.tagName) { switch (xmlNode.tagName) { case "USER_INFO_BASE_URL": this.baseUrl = XML.GetXmlNodeValue(xmlNode); break; case "PERSONAL_PAGE_BASE_URL": this.personalPageBaseUrl = XML.GetXmlNodeValue(xmlNode); break; case "USER_INFO_INTERVAL_MM": this.interval = XML.GetIntegerXmlNodeValue(xmlNode, 180); break; case "USER_RSS_BASE_URL": this.rssBaseUrl = XML.GetXmlNodeValue(xmlNode); break; case "USER_RSS_INTERVAL_MM": this.rssInterval = XML.GetIntegerXmlNodeValue(xmlNode, 25); break; default: break; } //switch } //if } //for }; if (xmlNode) this.init(xmlNode); }; function TwitterUserInfo(xmlNode, basePersonalPageUrl, baseRssPageUrl, rssInterval) { var _basePersonalPageUrl = ""; var _baseRssPageUrl = ""; this.UniqueCompID = ""; this.userId = ""; this.screenName = ""; this.displayName = ""; this.url = ""; this.description = ""; this.profileImageUrl = ""; this.utcOffset = 0; this.personalPageUrl = ""; this.FeedURL = ""; this.Interval = 0; //init from localsettings this.init = function(xmlUser, strBasePersonalPageUrl, strBaseRssPageUrl, iRssInterval) { if (!xmlUser) return; var xmlNode = null; for (var i = 0; i < xmlUser.childNodes.length; i++) { xmlNode = xmlUser.childNodes[i]; if (xmlNode && xmlNode.tagName) { switch (xmlNode.tagName) { case "UNIQUE_COMP_ID": this.UniqueCompID = XML.GetXmlNodeValue(xmlNode); break; case "USER_ID": this.userId = XML.GetXmlNodeValue(xmlNode); break; case "SCREEN_NAME": this.screenName = XML.GetXmlNodeValue(xmlNode); break; case "DISPLAY_NAME": this.displayName = XML.GetXmlNodeValue(xmlNode); break; default: break; } //switch } //if } //for _basePersonalPageUrl = strBasePersonalPageUrl; _baseRssPageUrl = strBaseRssPageUrl; this.Interval = iRssInterval; if (this.screenName && _basePersonalPageUrl) this.personalPageUrl = _basePersonalPageUrl.replace(/@@SCREEN_NAME@@/, this.screenName); if (this.userId && _baseRssPageUrl) this.FeedURL = _baseRssPageUrl.replace(/@@ID@@/, this.userId); }; //update from twitter user xml this.update = function(xmlTwitterUser) { if (!xmlTwitterUser) return; var xmlNode = null; for (var i = 0; i < xmlTwitterUser.childNodes.length; i++) { xmlNode = xmlTwitterUser.childNodes[i]; if (xmlNode && xmlNode.tagName) { switch (xmlNode.tagName) { case "name": this.displayName = XML.GetXmlNodeValue(xmlNode); break; case "screen_name": this.screenName = XML.GetXmlNodeValue(xmlNode); break; case "url": this.url = XML.GetXmlNodeValue(xmlNode); break; case "description": this.description = XML.GetXmlNodeValue(xmlNode); break; case "profile_image_url": this.profileImageUrl = XML.GetXmlNodeValue(xmlNode); break; case "utc_offset": this.utcOffset = XML.GetXmlNodeValue(xmlNode); break; default: break; } //switch } //if } //for if (this.screenName && _basePersonalPageUrl) this.personalPageUrl = _basePersonalPageUrl.replace(/@@SCREEN_NAME@@/, this.screenName); }; this.toXmlString = function() { var strXml = "<user/>"; var xmlDoc = XML.GetXmlDocument(strXml); var xmlRoot = xmlDoc.documentElement; var xmlNode = XML.CreateXmlTextNode(xmlDoc, "id", this.userId); xmlRoot.appendChild(xmlNode); xmlNode = XML.CreateXmlTextNode(xmlDoc, "name", this.displayName); xmlRoot.appendChild(xmlNode); xmlNode = XML.CreateXmlTextNode(xmlDoc, "screen_name", this.screenName); xmlRoot.appendChild(xmlNode); xmlNode = XML.CreateXmlTextNode(xmlDoc, "url", this.url); xmlRoot.appendChild(xmlNode); xmlNode = XML.CreateXmlTextNode(xmlDoc, "description", this.description); xmlRoot.appendChild(xmlNode); xmlNode = XML.CreateXmlTextNode(xmlDoc, "profile_image_url", this.profileImageUrl); xmlRoot.appendChild(xmlNode); xmlNode = XML.CreateXmlTextNode(xmlDoc, "utc_offset", this.utcOffset); xmlRoot.appendChild(xmlNode); return XML.GetStringXml(xmlDoc); }; this.isEqual = function(objUser) { if (this.userId != objUser.userId) return false; if (this.screenName != objUser.screenName) return false; if (this.displayName != objUser.displayName) return false; if (this.url != objUser.url) return false; if (this.personalPageUrl != objUser.personalPageUrl) return false; if (this.description != objUser.description) return false; if (this.profileImageUrl != objUser.profileImageUrl) return false; if (this.utcOffset != objUser.utcOffset) return false; return true; }; if (xmlNode) this.init(xmlNode, basePersonalPageUrl, baseRssPageUrl, rssInterval); }; var TwitterIOFunctions = { TWITTER_USERS_FOLDER: "TwitterUsers", getUserFile: function(userId) { var oFile = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsIFile); oFile.append(CommonData.ConduitFolder); oFile.append(this.TWITTER_USERS_FOLDER); oFile.append(userId + ".xml"); return oFile; }, getUserInfoXml: function(userId) { var oFile = this.getUserFile(userId); if (!oFile.exists()) return null; var strXml = File.read(oFile); if (!strXml) return null; var xmlDoc = XML.GetXmlDocument(strXml); if (!XML.IsLegal(xmlDoc)) return null; return xmlDoc.documentElement; }, saveUserInfo: function(oUser) { var oFile = this.getUserFile(oUser.userId); if (!oFile.exists()) File.create(oFile); var strXml = oUser.toXmlString(); File.write(oFile, strXml, null); } }; function TwitterUsersManager() { var _generalUserInfo = null; var _hashUsers = null; var _usersServiceManager = null; //update user object with data from twitter if exists this._fillUserInfo = function(oUser) { var xmlUserInfo = TwitterIOFunctions.getUserInfoXml(oUser.userId); if (xmlUserInfo) oUser.update(xmlUserInfo); }; this._addUsers = function(arrUsers) { //lazy init if (!_hashUsers) _hashUsers = new HashArray(); var oUser = null; var bChanged = false; for (var i = 0; i < arrUsers.length; i++) { oUser = arrUsers[i]; if (!_hashUsers.Contains(oUser.userId)) { //update user object with data from twitter if exists this._fillUserInfo(oUser); _hashUsers.Add(oUser.userId, oUser); bChanged = true; } } return bChanged; }; // +++++++++++++ public functions +++++++++++++ this.registerComponent = function(arrUsers, objGeneralUserInfo) { if (!arrUsers || arrUsers.length == 0) return; var bChanged = this._addUsers(arrUsers); //save general users info _generalUserInfo = objGeneralUserInfo; //lazy init user service manager if (!_usersServiceManager) _usersServiceManager = new TwitterUsersServiceManager(this.onNewUserData, this); if (bChanged) _usersServiceManager.init(_hashUsers, _generalUserInfo); }; this.unregisterComponent = function(uniqueCompId) { /* if (!_hashComponents) return; var hashUsers = _hashComponents[uniqueCompId]; if (!hashUsers) return; //TODO: remove this component's users from service requests hashUsers.Clear(); hashUsers = null;*/ }; this.getUsersInfo = function(arrUsers) { if (!_hashUsers) return null; var arrFullUsers = new Array(); for (var i = 0; i < arrUsers.length; i++) arrFullUsers.push(_hashUsers.GetByID(arrUsers[i].userId)); return arrFullUsers; }; // +++++++++++++ other managers callbacks +++++++++++++ this.onNewUserData = function(strXml, userId) { if (!_hashUsers || !_hashUsers.Contains(userId) || !strXml) return; var oldUser = _hashUsers.GetByID(userId); if (!oldUser) return; //create new twitter user info to check with the old data var xmlUser = XML.GetXmlDocument(strXml); if (!XML.IsLegal(xmlUser)) return; xmlUser = xmlUser.documentElement; var newUser = new TwitterUserInfo(); newUser.userId = userId; newUser.update(xmlUser); //if no change, no need to update if (oldUser.isEqual(newUser)) return; //new data received oldUser.update(xmlUser); //save to xml newlly received user data TwitterIOFunctions.saveUserInfo(oldUser); //notify user info changed, data contains the userId changed notifyObservers(null, TwitterXPCOM.observerTopic, userId); }; }; function TwitterUsersServiceManager(onNewUserInfoCallback, callbackThis) { var _hashTimeoutRef = null; var _userIntervalMS = 0; var _baseRequestUrl = ""; this._getServerRequestFunction = function(userId, that) { var rq = function() { that.serverRequest(userId); }; return rq; }; this._getUserLastCheckTimePrefName = function(userId) { return TwitterPrefsConsts.prefix + "user_" + userId + "." + TwitterPrefsConsts.lastCheckTime; }; this._clearIntervals = function() { if (!_hashTimeoutRef || _hashTimeoutRef.Count() == 0) return; for (var i = 0; i < _hashTimeoutRef.Count(); i++) clearTimeout(_hashTimeoutRef.GetByIndex(i)); _hashTimeoutRef.Clear(); _hashTimeoutRef = null; }; this._getNextCheckInterval = function(userId) { var prefName = this._getUserLastCheckTimePrefName(userId); var strLastCheckDateTime = PrefService.GetPref(prefName); //no last check date time if (!strLastCheckDateTime) return 0; var iLastCheckTimestamp = Date.parse(strLastCheckDateTime); var iNow = Date.parse(Date()); var iNextCheck = _userIntervalMS - (iNow - iLastCheckTimestamp); if (iNextCheck < 0) iNextCheck = 0; return iNextCheck; }; this.serverRequest = function(userId, baseReqUrl) { var strUrl = _baseRequestUrl.replace(/@@ID@@/, userId); var state = new Object(); state.userId = userId; var self = this; EBServerDataURL.HTTPServerRequest(strUrl, null, false, function(strXml, oError, state) { self.serverResponse(strXml, oError, state); }, state); //set last check time to now var prefName = this._getUserLastCheckTimePrefName(userId); PrefService.SetPref(prefName, Date()); //schedual next check timeout var that = this; rqFunc = this._getServerRequestFunction(userId, that); if (_hashTimeoutRef.Contains(userId)) { var refTimeout = _hashTimeoutRef.GetByID(userId); refTimeout = setTimeout(function() { rqFunc(); }, _userIntervalMS); } else _hashTimeoutRef.Add(userId, setTimeout(function() { rqFunc(); }, _userIntervalMS)); }; this.serverResponse = function(strXml, oError, state) { onNewUserInfoCallback.call(callbackThis, strXml, state.userId); }; this.init = function(hashUsers, objGeneralUserData) { this._clearIntervals(); if (!hashUsers || hashUsers.Count() == 0) return; _hashTimeoutRef = new HashArray(); _userIntervalMS = objGeneralUserData.interval * 60 * 1000; _baseRequestUrl = objGeneralUserData.baseUrl; var iNextCheck = 0; var oUser = null; var that = this; var userId = null; var rqFunc = null; for (var i = 0; i < hashUsers.Count(); i++) { oUser = hashUsers.GetByIndex(i); userId = oUser.userId; iNextCheck = this._getNextCheckInterval(userId); rqFunc = this._getServerRequestFunction(userId, that); _hashTimeoutRef.Add(userId, setTimeout(function() { rqFunc(); }, iNextCheck)); } }; }; var TwitterXPCOM = { usersManager: new TwitterUsersManager(), observerTopic: "eb-twitter" }; //Browser Progress Listener var XPCOMEBBrowserProgressListener = { QueryInterface: function(aIID) { if (aIID.equals(Components.interfaces.nsIWebProgressListener) || aIID.equals(Components.interfaces.nsISupportsWeakReference) || aIID.equals(Components.interfaces.nsISupports)) return this; throw Components.results.NS_NOINTERFACE; }, onStateChange: function(aProgress, aRequest, aFlag, aStatus) { var strURL = (aRequest) ? aRequest.name : ""; if (aFlag & Components.interfaces.nsIWebProgressListener.STATE_STOP) { var bIsSuccess = Components.isSuccessCode(aStatus); var responseStatus = 200; var iContentLength = 0; try { var httpChannel = aRequest.QueryInterface(Components.interfaces.nsIHttpChannel); responseStatus = httpChannel.responseStatus; iContentLength = aRequest.QueryInterface(Components.interfaces.nsIChannel).contentLength; } catch (ex) { } if (responseStatus == 404 && iContentLength != -1 && iContentLength <= 512) Fix404XPCOM.manager.on404(aProgress, aRequest, aFlag, aStatus); SearchInNewTabXPCOM.onDocumentLoaded(aProgress.DOMWindow); } return 0; }, onLocationChange: function(aProgress, aRequest, aURI) { //new tab opened if (!aURI || !aURI.spec) SearchInNewTabXPCOM.onNewTabOpened(aProgress.DOMWindow); return 0; }, onProgressChange: function() { return 0; }, onStatusChange: function() { return 0; }, onSecurityChange: function(aProgress, aRequest, aState) { return 0; }, onLinkIconAvailable: function() { return 0; } }; function WebProgressManager() { function _handleRestoreTabs(aEvent) { if (aEvent.originalTarget.linkedBrowser.contentDocument.location.href.indexOf(SearchInNewTabXPCOM.HTML_FILE_NAME) != -1) { SearchInNewTabXPCOM.onNewTabOpened(aEvent.originalTarget.linkedBrowser.contentDocument); } }; this.addProgressListener = function(oBrowser) { if (!oBrowser || oBrowser.hasAttribute(WebProgressXPCOM.EB_FLAG)) return; oBrowser.setAttribute(WebProgressXPCOM.EB_FLAG, true); oBrowser.addProgressListener(XPCOMEBBrowserProgressListener, Components.interfaces.nsIWebProgress.NOTIFY_ALL); //add urlbar listener in order to hide the new tab document url try { var urlBar = getWindow().gURLBar; //already defined if (urlBar.ebData) return; var orig = new Object(); orig.origSetter = urlBar.__lookupSetter__("value"); orig.origGetter = urlBar.__lookupGetter__("value"); urlBar.ebData = orig; function urlSetter(val) { val = (WebProgressXPCOM.isUrlToHide(val)) ? "" : val; this.ebData.origSetter.call(this, val); }; function urlGetter() { var val = this.ebData.origGetter.call(this); return (WebProgressXPCOM.isUrlToHide(val)) ? "" : val; }; urlBar.__defineGetter__("value", urlGetter); urlBar.__defineSetter__("value", urlSetter); } catch (ex) { EBLog(ex); } oBrowser.addEventListener("SSTabRestored", _handleRestoreTabs, false); }; this.removeProgressListener = function(oBrowser) { if (!oBrowser || !oBrowser.hasAttribute(WebProgressXPCOM.EB_FLAG)) return; oBrowser.removeAttribute(WebProgressXPCOM.EB_FLAG); oBrowser.removeProgressListener(XPCOMEBBrowserProgressListener, Components.interfaces.nsIWebProgress.NOTIFY_ALL); try { var urlBar = getWindow().gURLBar; if (!urlBar.ebData) return; urlBar.__defineGetter__("value", urlBar.ebData.origGetter); urlBar.__defineSetter__("value", urlBar.ebData.origSetter); } catch (ex) { EBLog(ex); } document.removeEventListener("SSTabRestored", _handleRestoreTabs, false); }; }; var WebProgressXPCOM = { arrChromeUrlsToHide: ["aboutTabs.htm", "wait.xul"], manager: new WebProgressManager(), EB_FLAG: "EBMainListenerSet", isUrlToHide: function(strUrl) { if (strUrl.indexOf("chrome://") != 0) return false; for (var i = 0; i < this.arrChromeUrlsToHide.length; i++) if (strUrl.indexOf(this.arrChromeUrlsToHide[i]) != -1) return true; return false; } }; var win = getWindow(); if (win) WebProgressXPCOM.manager.addProgressListener(win.gBrowser);