home *** CD-ROM | disk | FTP | other *** search
/ Minami 80 / MINAMI80.iso / Extra / DivXInstaller.exe / $PLUGINSDIR / GoogleToolbarFirefox.msi / xpi / chrome / google-toolbar.jar / content / gtb.js < prev    next >
Text File  |  2006-05-15  |  387KB  |  9,769 lines

  1. // Copyright 2006 Google Inc.
  2. // All Rights Reserved.
  3.  
  4. var GTB_MAIL_PREF_PROVIDERS = "mailto.providers";
  5. var GTB_PREF_OPT_MAIL = "mailto.opt";
  6. var GTB_MAIL_HANDLER_CONFIGURED = "mailto.gmail.configured";
  7. function GTB_MailtoLink(opt_to, opt_cc, opt_bcc, opt_subject, opt_body) {
  8.   this.to = opt_to;
  9.   this.cc = opt_cc;
  10.   this.bcc = opt_bcc;
  11.   this.subject = opt_subject;
  12.   this.body = opt_body}
  13.  
  14. function GTB_MailProvider(opt_url, opt_name, opt_to, opt_cc, opt_bcc, opt_subject, opt_body) {
  15.   this.url = opt_url;
  16.   this.name = opt_name;
  17.   this.to = opt_to;
  18.   this.cc = opt_cc;
  19.   this.bcc = opt_bcc;
  20.   this.subject = opt_subject;
  21.   this.body = opt_body}
  22.  
  23. function GTB_mailtoDump(message) {
  24.   GTB_Dump(GTB_Dump.MT, message)}
  25.  
  26. function GTB_contentAreaClick(event, opt_fieldNormalClicks) {
  27.   var processed = false;
  28.   opt_fieldNormalClicks = !(!opt_fieldNormalClicks);
  29.   try {
  30.     processed = GTB_getToolbar().mailto.onContentAreaClick(event)}
  31.   catch(e) {
  32.     processed = false}
  33.   GTB_mailtoDump("processed: " + processed);
  34.   if(!processed) {
  35.     window.contentAreaClick(event, opt_fieldNormalClicks)}
  36.   else {
  37.     return false}
  38. }
  39.  
  40. function GTB_mailto_FirstRun_onAccept(event) {
  41.   GTB_getPrefs().setBoolPref(GTB_PREF_OPT_MAIL, true)}
  42.  
  43. function GTB_mailto_FirstRun_onCancel(event) {
  44.   GTB_getPrefs().setBoolPref(GTB_PREF_OPT_MAIL, false)}
  45.  
  46. function GTB_Mailto() {
  47.   this.checkURLFlag_ = true;
  48.   var content = document.getElementById("content");
  49.   content.addEventListener("click", GTB_contentAreaClick, true)}
  50.  
  51. GTB_Mailto.prototype.onPageLoad = function(event) {
  52.   GTB_mailtoDump("mailto.onPageLoad");
  53.   var doc = event.target;
  54.   if(this.checkURLFlag_) {
  55.     this.checkURL_(doc)}
  56. }
  57.  
  58. ;
  59. GTB_Mailto.prototype.onGmailURL = function() {
  60.   var psvc = GTB_getPrefs();
  61.   var isMailtoConfigured = psvc.getBoolPrefWithDefault(GTB_MAIL_HANDLER_CONFIGURED, false);
  62.   var useMailto = psvc.getBoolPref(GTB_PREF_OPT_MAIL);
  63.   if(isMailtoConfigured || useMailto) {
  64.     return}
  65.   window.openDialog("chrome://google-toolbar/content/mailto-first-run.xul", "gtbMailtoFirstRun", "modal,centerscreen,chrome,resizable=no", this.languageCode);
  66.   psvc.setBoolPref(GTB_MAIL_HANDLER_CONFIGURED, true)}
  67.  
  68. ;
  69. GTB_Mailto.prototype.checkURL_ = function(doc) {
  70.   var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  71.   var xpcomUrl = ios.newURI(doc.location.href, null, null);
  72.   if(!(xpcomUrl  instanceof Components.interfaces.nsIURL)) {
  73.     return}
  74.   var url = GTB_convertToUrl(xpcomUrl);
  75.   GTB_mailtoDump("testing if gmail url: " + url.host);
  76.   if(this.isGMail_(url.host)) {
  77.     this.onGmailURL()}
  78. }
  79.  
  80. ;
  81. GTB_Mailto.prototype.isGMail_ = function(domain) {
  82.   return GTB_isGoogleDomain(domain) && domain.indexOf("mail.") != -1}
  83.  
  84. ;
  85. GTB_Mailto.prototype.onContentAreaClick = function(event) {
  86.   GTB_mailtoDump("onContentAreaClick");
  87.   var psvc = GTB_getPrefs();
  88.   var useMailto = false;
  89.   if(psvc.getBoolPref(GTB_PREF_OPT_MAIL) && event.button == 0) {
  90.     var linkString;
  91.     var target = null;
  92.     try {
  93.       linkString = event.originalTarget.getAttribute("href").toString();
  94.       target = event.originalTarget}
  95.     catch(e) {
  96.       target = null}
  97.     if(!linkString) {
  98.       try {
  99.         linkString = event.originalTarget.parentNode.getAttribute("href").toString();
  100.         target = event.originalTarget.parentNode}
  101.       catch(e) {
  102.         linkString = "";
  103.         target = null}
  104.     }
  105.     var mailtoStr = linkString.toLowerCase();
  106.     if(mailtoStr.indexOf("mailto:") > -1 && mailtoStr.indexOf("mailto:") < 7 && !target.hasAttribute("onclick")) {
  107.       GTB_mailtoDump("found mailto link");
  108.       useMailto = true;
  109.       this.ComposeDefault_(linkString)}
  110.     else {
  111.       useMailto = false}
  112.   }
  113.   if(useMailto)event.preventDefault();
  114.   return useMailto}
  115.  
  116. ;
  117. GTB_Mailto.prototype.ComposeDefault_ = function(aURI) {
  118.   var psvc = GTB_getPrefs();
  119.   var default_provider = psvc.getStringPref("mailto.default");
  120.   GTB_mailtoDump("Default Provider" + default_provider);
  121.   this.ComposeSelected(aURI, default_provider)}
  122.  
  123. ;
  124. GTB_Mailto.prototype.ComposeSelected = function(aURI, mail_provider) {
  125.   var psvc = GTB_getPrefs();
  126.   var mailProviderUrl = psvc.getStringPref(GTB_MAIL_PREF_PROVIDERS + "." + mail_provider);
  127.   GTB_mailtoDump("Default ProviderURL" + mailProviderUrl);
  128.   var provider = this.parseProvider_(mailProviderUrl);
  129.   GTB_mailtoDump("Get Provider");
  130.   aURI = aURI.split(" ").join("%20");
  131.   var mailto = this.parseMailto_(aURI);
  132.   GTB_mailtoDump("Get mailto");
  133.   var url = this.getUrl_(provider, mailto);
  134.   var browserAccess = new nsBrowserAccess;
  135.   var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  136.   var xpcomUrl = ios.newURI(url, null, null);
  137.   browserAccess.openURI(xpcomUrl, null, nsCI.nsIBrowserDOMWindow.OPEN_DEFAULTWINDOW, null)}
  138.  
  139. ;
  140. GTB_Mailto.prototype.parseMailto_ = function(uri) {
  141.   var re1 = /mailto:(\S*)(\?)(\S*)/i;
  142.   var rv = uri.match(re1);
  143.   if(!rv) {
  144.     var re2 = /mailto:(\S*)/i;
  145.     rv = uri.match(re2)}
  146.   if(!rv || rv[1] == "") {
  147.     return null}
  148.   var mailto = new GTB_MailtoLink;
  149.   mailto.to = rv[1];
  150.   if(rv.length > 3) {
  151.     this.parseParm_(rv[3], mailto)}
  152.   return mailto}
  153.  
  154. ;
  155. GTB_Mailto.prototype.parseParm_ = function(str, obj) {
  156.   var propertyPairs = str.split("&");
  157.   for(var i = 0;i < propertyPairs.length; ++ i) {
  158.     var propertyData = propertyPairs[i].split("=");
  159.     obj[propertyData[0]] = propertyData[1]}
  160. }
  161.  
  162. ;
  163. GTB_Mailto.prototype.parseProvider_ = function(uri) {
  164.   var re = /firetool-mail:(\S*)(\@)(\S*)/;
  165.   var rv = uri.match(re);
  166.   if(!rv || rv[1] == "") {
  167.     return null}
  168.   var provider = new GTB_MailProvider;
  169.   provider.url = rv[1];
  170.   this.parseParm_(rv[3], provider);
  171.   if(provider.name != null) {
  172.     var r = /(\S*)\.(\w*)\.(\w*)\/(\S*)/;
  173.     var se = rv[1].match(r);
  174.     if(se != null && this.notSpam_(provider.name, se[2])) {
  175.       return provider}
  176.   }
  177.   return null}
  178.  
  179. ;
  180. GTB_Mailto.prototype.clearDynaMenu_ = function() {
  181.   var contextPopup = document.getElementById("contentAreaContextMenu");
  182.   var children = contextPopup.childNodes;
  183.   for(var i = children.length - 1;i >= 0; -- i) {
  184.     var id = children[i].getAttribute("id");
  185.     if(id.indexOf("mailto_") >= 0) {
  186.       contextPopup.removeChild(children[i])}
  187.   }
  188. }
  189.  
  190. ;
  191. GTB_Mailto.prototype.loadDynaMenu = function() {
  192.   GTB_mailtoDump("loading Dynamic Menu ...");
  193.   this.clearDynaMenu_();
  194.   var prefs = GTB_getPrefs();
  195.   if(!prefs.getBoolPref(GTB_PREF_OPT_MAIL)) {
  196.     return}
  197.   var mailtoLink = this.getSelectedEmail_();
  198.   var mailto = this.parseMailto_(mailtoLink);
  199.   if(!mailto) {
  200.     return}
  201.   var children = prefs.getNamesOfChildren(GTB_MAIL_PREF_PROVIDERS, {});
  202.   var contextPopup = document.getElementById("contentAreaContextMenu");
  203.   var firstChild = contextPopup.firstChild;
  204.   var menuSeparator = document.createElement("menuseparator");
  205.   menuSeparator.setAttribute("id", "mailto_menuseparator");
  206.   contextPopup.insertBefore(menuSeparator, firstChild);
  207.   firstChild = contextPopup.firstChild;
  208.   if(children.length > 0) {
  209.     for(var i = 0;i < children.length; ++ i) {
  210.       var current = children[i];
  211.       var newElement = document.createElement("menuitem");
  212.       var uri = prefs.getStringPref(GTB_MAIL_PREF_PROVIDERS + "." + current);
  213.       var provider = this.parseProvider_(uri);
  214.       var name = provider.name;
  215.       newElement.setAttribute("id", "mailto_=" + i);
  216.       newElement.setAttribute("label", name);
  217.       newElement.setAttribute("oncommand", "GTB_ComposeSelected('" + mailto + "','" + name + "')");
  218.       contextPopup.insertBefore(newElement, firstChild)}
  219.   }
  220. }
  221.  
  222. ;
  223. GTB_Mailto.prototype.getSelectedEmail_ = function() {
  224.   var elem = document.popupNode;
  225.   var email = null;
  226.   if(elem) {
  227.     if(elem  instanceof Components.interfaces.nsIDOMHTMLAnchorElement && elem.href) {
  228.       email = elem.href.toString()}
  229.     else {
  230.       email = elem.parentNode.toString()}
  231.   }
  232.   return email}
  233.  
  234. ;
  235. GTB_Mailto.prototype.notSpam_ = function(name, domainName) {
  236.   if(domainName == "yahoo" || domainName == "google" || domainName == "msn") {
  237.     return true}
  238.   if(domainName.toLowerCase() == name.toLowerCase()) {
  239.     return true}
  240.   document.writeln(domainName + " " + name);
  241.   return false}
  242.  
  243. ;
  244. GTB_Mailto.prototype.addMailtoContent_ = function(para, value) {
  245.   if(para && value) {
  246.     var str = "&" + para + "=" + value;
  247.     return str}
  248.   else {
  249.     return""}
  250. }
  251.  
  252. ;
  253. GTB_Mailto.prototype.getUrl_ = function(provider, mailto) {
  254.   var url = provider.url + "&" + provider.to + "=" + mailto.to;
  255.   url += this.addMailtoContent_(provider.cc, mailto.cc);
  256.   url += this.addMailtoContent_(provider.bcc, mailto.bcc);
  257.   url += this.addMailtoContent_(provider.subject, mailto.subject);
  258.   url += this.addMailtoContent_(provider.body, mailto.body);
  259.   return url}
  260.  
  261. ;
  262. var GTB_PREF_OPT_IN = "opted_into_advanced_features_1";
  263. var GTB_PREF_ADVANCED_DEFAULT = "button_option.safebrowsing.advancedprotection.default";
  264. var GTB_PREF_REMEMBER_SEARCH_TYPE = "remember_search_type";
  265. var GTB_PREF_GOOGLE_HOME = "google_home";
  266. var GTB_PREF_SC_IGNORE_DUPS = "spell_check_ignore_dups";
  267. var GTB_PREF_SC_IGNORE_DIGITS = "spell_check_ignore_digits";
  268. var GTB_PREF_SC_IGNORE_ALL_CAPS = "spell_check_ignore_all_caps";
  269. var GTB_PREF_SAVE_HISTORY = "search_box_save_history";
  270. var GTB_PREF_SEARCH_ON_SELECT = "search_box_search_on_select";
  271. var GTB_PREF_USE_SUGGEST = "search_box_use_suggest";
  272. var GTB_PREF_AUTO_TRANSLATE = "auto_translate";
  273. var GTB_PREF_FIRST_SEARCH = "first_search";
  274. var GTB_PREF_FIRST_SEARCH_PING_RETRIES = "first_search_ping_retires";
  275. var GTB_PREF_INSTALL_PING_ACKED = "install_ping_acked";
  276. var GTB_PREF_INSTALL_PING_RETRIES = "install_ping_retires";
  277. var GTB_PREF_INSTALL_ID = "install_id";
  278. var GTB_LAST_PING_ATTEMPT = "last_ping_attempt";
  279. var GTB_PREF_AUTO_LINK_NEW_WINDOW = "autolink.new_window";
  280. var GTB_PREF_AUTO_FILL_SHOW_WARNING = "autofill.show_warning";
  281. function GTB_Assert(condition, message) {
  282. }
  283.  
  284. function GTB_Dump(zone, message) {
  285. }
  286.  
  287. function GTB_Prefs() {
  288.   this._registry = null;
  289.   var registryClass = Components.classes["@google.com/regutil;1"];
  290.   if(registryClass != null && Components.interfaces.GTBIRegUtil != null) {
  291.     try {
  292.       this._registry = registryClass.createInstance(Components.interfaces.GTBIRegUtil)}
  293.     catch(e) {
  294.       this._registry = null}
  295.   }
  296. }
  297.  
  298. GTB_Prefs.prototype = {USER_STATS_PREF:"userstats", REGISTRY_PATH:"SOFTWARE\\Google\\Toolbar for Firefox", _NAMESPACE_PREFIX:"google.toolbar.", _stringBundle:null, getLocaleDefault:function(key) {
  299.   if(this._stringBundle == null) {
  300.     this._stringBundle = document.getElementById("gtb-localized_prefs")}
  301.   try {
  302.     var value = this._stringBundle.getString(key + "_default")}
  303.   catch(e) {
  304.     return null}
  305.   if(!value) {
  306.     return null}
  307.   if(value.toLowerCase() == "true" || value.toLowerCase == "t") {
  308.     return"true"}
  309.   if(value.toLowerCase() == "false" || value.toLowerCase == "f") {
  310.     return"false"}
  311.   return value}
  312.  
  313. , setBoolPref:function(key, value) {
  314.   var psvc = this._getPreferences();
  315.   psvc.setBoolPref(this._NAMESPACE_PREFIX + key, value)}
  316.  
  317. , getBoolPref:function(key) {
  318.   var psvc = this._getPreferences();
  319.   try {
  320.     return psvc.getBoolPref(this._NAMESPACE_PREFIX + key)}
  321.   catch(e) {
  322.     var value = this.getLocaleDefault(key);
  323.     if(value == "true") {
  324.       psvc.setBoolPref(this._NAMESPACE_PREFIX + key, true)}
  325.     else if(value == "false") {
  326.       psvc.setBoolPref(this._NAMESPACE_PREFIX + key, false)}
  327.     return psvc.getBoolPref(this._NAMESPACE_PREFIX + key)}
  328. }
  329.  
  330. , getBoolPrefWithDefault:function(key, defaultValue) {
  331.   var psvc = this._getPreferences();
  332.   try {
  333.     return psvc.getBoolPref(this._NAMESPACE_PREFIX + key)}
  334.   catch(e) {
  335.     var value = this.getLocaleDefault(key);
  336.     if(value == "true") {
  337.       psvc.setBoolPref(this._NAMESPACE_PREFIX + key, true)}
  338.     else if(value == "false") {
  339.       psvc.setBoolPref(this._NAMESPACE_PREFIX + key, false)}
  340.     else {
  341.       psvc.setBoolPref(this._NAMESPACE_PREFIX + key, defaultValue)}
  342.     return psvc.getBoolPref(this._NAMESPACE_PREFIX + key)}
  343. }
  344.  
  345. , setStringPref:function(key, value) {
  346.   var psvc = this._getPreferences();
  347.   psvc.setCharPref(this._NAMESPACE_PREFIX + key, value)}
  348.  
  349. , getStringPref:function(key) {
  350.   var psvc = this._getPreferences();
  351.   try {
  352.     return psvc.getCharPref(this._NAMESPACE_PREFIX + key)}
  353.   catch(e) {
  354.     var value = this.getLocaleDefault(key);
  355.     if(value) {
  356.       psvc.setCharPref(this._NAMESPACE_PREFIX + key, value)}
  357.     return psvc.getCharPref(this._NAMESPACE_PREFIX + key)}
  358. }
  359.  
  360. , setLocalMachineString:function(key, value) {
  361.   if(this._registry == null || !this._registry.setLocalMachineString(this.REGISTRY_PATH, key, value)) {
  362.     this.setStringPref(key, value)}
  363. }
  364.  
  365. , getLocalMachineString:function(key) {
  366.   var result = null;
  367.   if(this._registry != null) {
  368.     result = this._registry.getLocalMachineString(this.REGISTRY_PATH, key)}
  369.   if(result == null) {
  370.     try {
  371.       result = this.getStringPref(key)}
  372.     catch(exception) {
  373.       result = null}
  374.   }
  375.   return result}
  376.  
  377. , setLocalMachineInt:function(key, value) {
  378.   if(this._registry == null || !this._registry.setLocalMachineString(this.REGISTRY_PATH, key, value.toString())) {
  379.     this.setIntPref(key, value)}
  380. }
  381.  
  382. , getLocalMachineIntWithDefault:function(key, defaultValue) {
  383.   var result = null;
  384.   if(this._registry != null) {
  385.     var temp = this._registry.getLocalMachineString(this.REGISTRY_PATH, key);
  386.     if(temp != null) {
  387.       result = parseInt(temp)}
  388.   }
  389.   if(result == null) {
  390.     result = this.getIntPrefWithDefault(key, defaultValue)}
  391.   return result}
  392.  
  393. , getLocalMachineInt:function(key) {
  394.   return this.getLocalMachineIntWithDefault(key, null)}
  395.  
  396. , getIntPrefWithDefault:function(key, defaultValue) {
  397.   var psvc = this._getPreferences();
  398.   try {
  399.     return psvc.getIntPref(this._NAMESPACE_PREFIX + key)}
  400.   catch(e) {
  401.     return defaultValue}
  402. }
  403.  
  404. , getIntPref:function(key) {
  405.   return this.getIntPrefWithDefault(key, null)}
  406.  
  407. , setIntPref:function(key, value) {
  408.   var psvc = this._getPreferences();
  409.   try {
  410.     psvc.setIntPref(this._NAMESPACE_PREFIX + key, value);
  411.     return value}
  412.   catch(e) {
  413.     return null}
  414. }
  415.  
  416. , setUnicodePref:function(key, value) {
  417.   var psvc = this._getPreferences();
  418.   var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  419.   str.data = value;
  420.   psvc.setComplexValue(this._NAMESPACE_PREFIX + key, Components.interfaces.nsISupportsString, str)}
  421.  
  422. , getUnicodePref:function(key) {
  423.   var psvc = this._getPreferences();
  424.   return psvc.getComplexValue(this._NAMESPACE_PREFIX + key, Components.interfaces.nsISupportsString).data}
  425.  
  426. , getUnicodePrefWithDefault:function(key, defaultValue) {
  427.   var psvc = this._getPreferences();
  428.   try {
  429.     return psvc.getComplexValue(this._NAMESPACE_PREFIX + key, Components.interfaces.nsISupportsString).data}
  430.   catch(e) {
  431.     var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  432.     str.data = defaultValue;
  433.     psvc.setComplexValue(this._NAMESPACE_PREFIX + key, Components.interfaces.nsISupportsString, str);
  434.     return psvc.getComplexValue(this._NAMESPACE_PREFIX + key, Components.interfaces.nsISupportsString).data}
  435. }
  436.  
  437. , getNamesOfChildren:function(key) {
  438.   var psvc = this._getPreferences();
  439.   var service = Components.classes["@mozilla.org/preferences;1"].getService(Components.interfaces.nsIPrefService);
  440.   var branch = service.getBranch(this._NAMESPACE_PREFIX + key + ".");
  441.   var children = branch.getChildList("", {});
  442.   return children}
  443.  
  444. , resetToDefault:function(key) {
  445.   var psvc = this._getPreferences();
  446.   try {
  447.     psvc.clearUserPref(this._NAMESPACE_PREFIX + key)}
  448.   catch(e) {
  449.   }
  450. }
  451.  
  452. , hasUserValue:function(key) {
  453.   var psvc = this._getPreferences();
  454.   return psvc.prefHasUserValue(this._NAMESPACE_PREFIX + key)}
  455.  
  456. , deleteBranch:function(key) {
  457.   var psvc = this._getPreferences();
  458.   psvc.deleteBranch(this._NAMESPACE_PREFIX + key)}
  459.  
  460. , _getPreferences:function() {
  461.   var psvc = Components.classes["@mozilla.org/preferences;1"].getService(Components.interfaces.nsIPrefBranch);
  462.   return psvc}
  463.  
  464. , _getRegistry:function() {
  465. }
  466.  
  467. , selectValueFromMenu:function(key, menulist) {
  468.   var value = this.getStringPref(key);
  469.   menulist.selectedIndex = 0;
  470.   var item = menulist.selectedItem;
  471.   while(item != null) {
  472.     if(this.getSelection(menulist) == value) {
  473.       return}
  474.     menulist.selectedIndex ++ ;
  475.     item = menulist.selectedItem}
  476.   menulist.selectedIndex = 0;
  477.   this.setStringPref(key, this.getSelection(menulist))}
  478.  
  479. , getSelection:function(menulist) {
  480.   var sel = menulist.selectedItem.value;
  481.   if(sel == null || sel.length == 0) {
  482.     sel = menulist.selectedItem.label}
  483.   return sel}
  484.  
  485. };
  486. function GTB_safeUrlEscape(url, len) {
  487.   url = encodeURIComponent(url).substr(0, len);
  488.   if("%" == url[url.length - 2])url = url.substr(0, url.length - 2);
  489.   else if("%" == url[url.length - 1])url = url.substr(0, url.length - 1);
  490.   return url}
  491.  
  492. ;
  493. function GTB_urlSplit(url) {
  494.   return/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/.exec(url)}
  495.  
  496. function GTB_parseQueryString(query) {
  497.   var args = {};
  498.   if(query) {
  499.     var pairs = query.split("&");
  500.     for(var p in pairs) {
  501.       var tokens = pairs[p].split("=");
  502.       if(tokens) {
  503.         var key = decodeURIComponent(tokens.shift().replace(/[+]/g, " "));
  504.         args[key] = decodeURIComponent(tokens.join("=").replace(/[+]/g, " "))}
  505.     }
  506.   }
  507.   return args}
  508.  
  509. function GTB_isGoogleDomain(domain) {
  510.   var tokens = domain.toLowerCase().split(".");
  511.   for(var i = tokens.length - 1;i >= 0; -- i) {
  512.     var token = tokens[i];
  513.     if(validTldList.indexOf("." + token + ".") == -1) {
  514.       return token == "google"}
  515.   }
  516.   return false}
  517.  
  518. function GTB_isCachedGoogleDomain(url) {
  519.   var query = url.spec.match(/q=cache:\S*/);
  520.   if(query == null) {
  521.     return false}
  522.   var cachedurl = query[0].match(/http:\S*/);
  523.   if(!cachedurl) {
  524.     return false}
  525.   return GTB_isGoogleUrl(cachedurl[0])}
  526.  
  527. function GTB_convertToUrl(url) {
  528.   if(typeof url == "string") {
  529.     var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  530.     url = ios.newURI(url, null, null)}
  531.   return url}
  532.  
  533. function GTB_isGoogleResultUrl(url) {
  534.   url = GTB_convertToUrl(url);
  535.   return url != null && GTB_isGoogleUrl(url) && url.path.substring(0, 7) == "/search"}
  536.  
  537. function GTB_isGoogleDesktopSearchUrl(url) {
  538.   url = GTB_convertToUrl(url);
  539.   return url != null && url.scheme == "http" && (url.host == "127.0.0.1" || url.host == "localhost") && url.port == 4664}
  540.  
  541. function GTB_isGoogleUrl(url) {
  542.   url = GTB_convertToUrl(url);
  543.   return url != null && url.scheme == "http" && (GTB_isGoogleDesktopSearchUrl(url) || GTB_isGoogleDomain(url.host) || GTB_isCachedGoogleDomain(url))}
  544.  
  545. ;
  546. function GTB_NextPrevTooltip() {
  547.   var stringBundle = document.getElementById("google-toolbar-strings");
  548.   this.prevEnabled = stringBundle.getString("prop.google-nextprev.prevenabled.tooltip");
  549.   this.prevDisabled = stringBundle.getString("prop.google-nextprev.prevdisabled.tooltip");
  550.   this.nextEnabled = stringBundle.getString("prop.google-nextprev.nextenabled.tooltip");
  551.   this.nextDisabled = stringBundle.getString("prop.google-nextprev.nextdisabled.tooltip")}
  552.  
  553. function GTB_NP_TabData() {
  554.   this.initialize("")}
  555.  
  556. GTB_NP_TabData.prototype.initialize = function(query) {
  557.   this.query = query;
  558.   this.position = -1;
  559.   this.clickedPosition = -1;
  560.   this.links = [];
  561.   this.linkToPosition = {}}
  562.  
  563. ;
  564. GTB_NP_TabData.prototype.copy = function(otherTabData) {
  565.   if(otherTabData == this) {
  566.     return}
  567.   this.query = otherTabData.query;
  568.   this.position = otherTabData.position;
  569.   this.clickedPosition = otherTabData.clickedPosition;
  570.   this.links = otherTabData.links;
  571.   this.linkToPosition = otherTabData.linkToPosition}
  572.  
  573. ;
  574. function GTB_NextPrev() {
  575.   this.npTooltip = new GTB_NextPrevTooltip;
  576.   GTB_NextPrev.setTooltipText("gtbPrevTooltip", this.npTooltip.prevDisabled);
  577.   GTB_NextPrev.setTooltipText("gtbNextTooltip", this.npTooltip.nextDisabled);
  578.   this.observe = GTB_MessageObserve;
  579.   this.xpcWindowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator)}
  580.  
  581. GTB_NextPrev.setTooltipText = function(id, line1, opt_line2) {
  582.   var tooltip = document.getElementById(id);
  583.   if(tooltip == null) {
  584.     return}
  585.   var descs = tooltip.getElementsByTagName("description");
  586.   if(descs && descs.length == 2) {
  587.     descs[0].value = line1;
  588.     if(opt_line2) {
  589.       descs[1].value = opt_line2;
  590.       descs[1].hidden = false}
  591.     else {
  592.       descs[1].hidden = true}
  593.   }
  594. }
  595.  
  596. ;
  597. GTB_NextPrev.prototype.doPageLoad = function(browser) {
  598.   var button = document.getElementById("gtbNextResult");
  599.   if(!button || !browser)return;
  600.   if(!browser.GTB_NextPrevData) {
  601.     browser.GTB_NextPrevData = new GTB_NP_TabData}
  602.   var tabData = browser.GTB_NextPrevData;
  603.   var doc = browser.contentWindow.document;
  604.   if(GTB_isGoogleResultUrl(doc.location.href)) {
  605.     this._newGoogleResultPage(doc, tabData)}
  606.   else {
  607.     var pos = tabData.linkToPosition[doc.location.href];
  608.     if(pos != null) {
  609.       tabData.position = pos}
  610.   }
  611.   if(browser == GTB_GoogleToolbarOverlay._getCurrentBrowser()) {
  612.     this._updateButtons(tabData)}
  613. }
  614.  
  615. ;
  616. GTB_NextPrev.prototype._newGoogleResultPage = function(doc, tabData) {
  617.   var url_tokens = GTB_urlSplit(doc.location.href);
  618.   var args = GTB_parseQueryString(url_tokens[7]);
  619.   if(!args.q) {
  620.     return}
  621.   tabData.initialize(args.q);
  622.   var links = this._getResultLinks(doc);
  623.   var link;
  624.   for(var pos = 0;link = links[pos]; ++ pos) {
  625.     tabData.links.push(link.href);
  626.     tabData.linkToPosition[link.href] = pos;
  627.     link.setAttribute("__gg_", pos)}
  628.   var win = doc.defaultView;
  629.   if(win) {
  630.     GTB_Dump(GTB_Dump.NP, "nextprev: adding event listener\n");
  631.     win.addEventListener("click", GTB_NP_onPageClick, true)}
  632. }
  633.  
  634. ;
  635. GTB_NextPrev.prototype._getResultLinks = function(doc) {
  636.   var links = doc.getElementsByTagName("a");
  637.   var results = [];
  638.   var link;
  639.   for(var i = 0;link = links[i]; ++ i) {
  640.     var className = link.className;
  641.     if(className) {
  642.       className = " " + className + " ";
  643.       if(className.indexOf(" l ") != -1) {
  644.         results.push(link)}
  645.     }
  646.   }
  647.   if(results.length > 0) {
  648.     return results}
  649.   var paras = doc.getElementsByTagName("p");
  650.   var para;
  651.   for(var p = 0;para = paras[p]; ++ p) {
  652.     var pos = 0;
  653.     var child = para.childNodes[pos];
  654.     while(child && child.nodeType == Node.COMMENT_NODE) {
  655.        ++ pos;
  656.       child = para.childNodes[pos]}
  657.     if(child && child.nodeType == Node.ELEMENT_NODE && "A" == child.nodeName) {
  658.       results.push(child)}
  659.   }
  660.   return results}
  661.  
  662. ;
  663. GTB_NextPrev.prototype.doPageHide = function(event) {
  664.   var doc = event.target;
  665.   var win = doc && doc.defaultView;
  666.   if(win && GTB_isGoogleResultUrl(doc.location.href)) {
  667.     GTB_Dump(GTB_Dump.NP, "nextprev: removing event listener\n");
  668.     win.removeEventListener("click", GTB_NP_onPageClick, true)}
  669. }
  670.  
  671. ;
  672. GTB_NextPrev.prototype._updateButtons = function(tabData) {
  673.   var button = document.getElementById("gtbPreviousResult");
  674.   if(!button)return;
  675.   var tooltip = "";
  676.   if(tabData && tabData.position > 0) {
  677.     tooltip = this.npTooltip.prevEnabled;
  678.     tooltip = tooltip.replace("$lastq;", tabData.query);
  679.     tooltip = tooltip.replace("$lf;", ":");
  680.     tooltip = tooltip.replace("$prev;", "");
  681.     GTB_NextPrev.setTooltipText("gtbPrevTooltip", tooltip, tabData.links[tabData.position - 1]);
  682.     if(button) {
  683.       button.disabled = false;
  684.       button.image = "chrome://google-toolbar/skin/previous.png"}
  685.   }
  686.   else {
  687.     GTB_NextPrev.setTooltipText("gtbPrevTooltip", this.npTooltip.prevDisabled);
  688.     if(button) {
  689.       button.disabled = true;
  690.       button.image = "chrome://google-toolbar/skin/previous_disabled.png"}
  691.   }
  692.   button = document.getElementById("gtbNextResult");
  693.   if(tabData && tabData.position != -1 && tabData.position < tabData.links.length - 1) {
  694.     tooltip = this.npTooltip.nextEnabled;
  695.     tooltip = tooltip.replace("$lastq;", tabData.query);
  696.     tooltip = tooltip.replace("$lf;", ":");
  697.     tooltip = tooltip.replace("$next;", "");
  698.     GTB_NextPrev.setTooltipText("gtbNextTooltip", tooltip, tabData.links[tabData.position + 1]);
  699.     if(button) {
  700.       button.disabled = false;
  701.       button.image = "chrome://google-toolbar/skin/next.png"}
  702.   }
  703.   else {
  704.     GTB_NextPrev.setTooltipText("gtbNextTooltip", this.npTooltip.nextDisabled);
  705.     if(button) {
  706.       button.disabled = true;
  707.       button.image = "chrome://google-toolbar/skin/next_disabled.png"}
  708.   }
  709. }
  710.  
  711. ;
  712. GTB_NextPrev.prototype.doTabSwitch = function(event) {
  713.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  714.   var tabData = browser.GTB_NextPrevData;
  715.   if(!tabData)return;
  716.   this._updateButtons(tabData)}
  717.  
  718. ;
  719. GTB_NextPrev.prototype.doNavigate = function(event, offset) {
  720.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  721.   var tabData = browser.GTB_NextPrevData;
  722.   var newpos = tabData.position + parseInt(offset);
  723.   if(tabData.position != -1 && newpos < tabData.links.length && newpos >= 0) {
  724.     var url = tabData.links[newpos];
  725.     var newBrowser = GTB_GoogleToolbarOverlay.loadUrlWithModifiers(url, event);
  726.     if(!newBrowser)return;
  727.     if(browser != newBrowser) {
  728.       newBrowser.GTB_NextPrevData = new GTB_NP_TabData;
  729.       newBrowser.GTB_NextPrevData.copy(tabData);
  730.       newBrowser.GTB_NextPrevData.position = newpos;
  731.       this._updateButtons(newBrowser.GTB_NextPrevData)}
  732.     else {
  733.       tabData.position = newpos;
  734.       GTB_GoogleToolbarOverlay.nextPrev._updateButtons(tabData)}
  735.   }
  736. }
  737.  
  738. ;
  739. GTB_NextPrev.prototype._maybeUpdateNextPrevData = function(req) {
  740.   var button = document.getElementById("gtbPreviousResult");
  741.   if(!button)return;
  742.   if(!req.loadGroup || !req.loadGroup.groupObserver) {
  743.     return}
  744.   var referrer = null;
  745.   if(req.referrer && req.referrer.spec) {
  746.     referrer = req.referrer.spec}
  747.   if(referrer && GTB_isGoogleResultUrl(referrer)) {
  748.     var groupObs = req.loadGroup.groupObserver;
  749.     groupObs.QueryInterface(Components.interfaces.nsIWebProgress);
  750.     var wbrowser = groupObs.DOMWindow;
  751.     var wm = this.xpcWindowMediator;
  752.     var enumerator = wm.getEnumerator("navigator:browser");
  753.     var win, browser;
  754.     while(enumerator.hasMoreElements()) {
  755.       win = enumerator.getNext();
  756.       browser = win.GTB_GoogleToolbarOverlay._getBrowserFromDoc(wbrowser.document);
  757.       if(browser) {
  758.         break}
  759.     }
  760.     if(!browser) {
  761.       return}
  762.     if(!browser.GTB_NextPrevData) {
  763.       browser.GTB_NextPrevData = new GTB_NP_TabData}
  764.     this._updateNextPrevData(browser.GTB_NextPrevData, referrer)}
  765. }
  766.  
  767. ;
  768. GTB_NextPrev.prototype._updateNextPrevData = function(tabData, referrer) {
  769.   var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
  770.   var enumerator = wm.getEnumerator("navigator:browser");
  771.   while(enumerator.hasMoreElements()) {
  772.     var win = enumerator.getNext();
  773.     var tabBrowser = win.document.getElementById("content");
  774.     var origBrowser;
  775.     for(var b = 0;b < tabBrowser.browsers.length; ++ b) {
  776.       origBrowser = tabBrowser.browsers[b];
  777.       if(origBrowser.contentWindow.document.location.href == referrer) {
  778.         var origData = origBrowser.GTB_NextPrevData;
  779.         tabData.copy(origData);
  780.         tabData.position = origData.clickedPosition;
  781.         var curBrowser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  782.         if(tabData == curBrowser.GTB_NextPrevData) {
  783.           this._updateButtons(tabData)}
  784.         return}
  785.     }
  786.   }
  787. }
  788.  
  789. ;
  790. GTB_NextPrev.prototype.GTB_MESSAGES = {"http-on-modify-request":function(data, subject) {
  791.   subject.QueryInterface(Components.interfaces.nsIHttpChannel);
  792.   if(subject.loadFlags & Components.interfaces.nsIChannel.LOAD_DOCUMENT_URI) {
  793.     GTB_GoogleToolbarOverlay.nextPrev._maybeUpdateNextPrevData(subject)}
  794. }
  795.  
  796. , "GTB_OPTION.button_option.gtbNextPrev":function(data) {
  797.   var toolbar = GTB_getToolbar();
  798.   var browser = toolbar._getCurrentBrowser();
  799.   if("true" == data) {
  800.     toolbar.nextPrev.doPageLoad(browser)}
  801.   else if("false" == data) {
  802.     if(browser.GTB_NextPrevData) {
  803.       browser.GTB_NextPrevData = null}
  804.   }
  805. }
  806.  
  807. };
  808. function GTB_NP_onPageClick(event) {
  809.   var target = event.target;
  810.   while(target) {
  811.     if("A" == target.tagName && target.hasAttribute("__gg_")) {
  812.       var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  813.       var tabData = browser.GTB_NextPrevData;
  814.       var pos = parseInt(target.getAttribute("__gg_"));
  815.       tabData.clickedPosition = pos;
  816.       break}
  817.     target = target.parentNode}
  818. }
  819.  
  820. function GTB_GTO_onPreviousResult(event) {
  821.   GTB_GoogleToolbarOverlay.nextPrev.doNavigate(event, -1)}
  822.  
  823. function GTB_GTO_onNextResult(event) {
  824.   GTB_GoogleToolbarOverlay.nextPrev.doNavigate(event, +1)}
  825.  
  826. ;
  827. function GTB_hitch(obj, meth) {
  828.   return function() {
  829.     return meth.apply(obj, arguments)}
  830.   
  831. }
  832.  
  833. GTB_GoogleToolbar.doSuggestSearch = function() {
  834.   if(GTB_getPrefs().getBoolPref(GTB_PREF_SEARCH_ON_SELECT) && !document.getElementById("gtbGoogleSearchBox").alreadySearched) {
  835.     GTB_GoogleToolbarOverlay.doGoogleSearchType(null, "search", false, false)}
  836. }
  837.  
  838. ;
  839. function GTB_MessageObserve(subject, topic, data) {
  840.   for(var message in this.GTB_MESSAGES) {
  841.     if(message == topic) {
  842.       this.GTB_MESSAGES[message](data, subject);
  843.       return}
  844.   }
  845. }
  846.  
  847. function GTB_getBrowserWindows() {
  848.   var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
  849.   var enumerator = wm.getEnumerator("navigator:browser");
  850.   var browsers = [];
  851.   while(enumerator.hasMoreElements()) {
  852.     browsers.push(enumerator.getNext())}
  853.   return browsers}
  854.  
  855. function GTB_isGoogleToolbarItem(node) {
  856.   return node && node.id && node.id.indexOf("gtb") == 0}
  857.  
  858. function GTB_isGoogleToolbarWrapperItem(node) {
  859.   return node && node.id && node.id.indexOf("wrapper-gtb") == 0}
  860.  
  861. function GTB_GetAllItemsInPalette() {
  862.   var toolbox = document.getElementById("navigator-toolbox");
  863.   var ids = [];
  864.   for(var i = 0;i < toolbox.palette.childNodes.length;i ++ ) {
  865.     if(GTB_isGoogleToolbarItem(toolbox.palette.childNodes[i])) {
  866.       ids.push(toolbox.palette.childNodes[i].id)}
  867.   }
  868.   return ids}
  869.  
  870. function GTB_GetAllItemsInGoogleToolbar() {
  871.   var ids = {};
  872.   var toolbar = document.getElementById("gtbToolbar");
  873.   var child = toolbar.firstChild;
  874.   while(child) {
  875.     if(GTB_isGoogleToolbarItem(child)) {
  876.       ids[child.id] = 1}
  877.     child = child.nextSibling}
  878.   return ids}
  879.  
  880. function GTB_SearchObserver() {
  881. }
  882.  
  883. GTB_SearchObserver.prototype.getSupportedFlavours = function() {
  884.   var flavours = new FlavourSet;
  885.   if(GTB_getToolbar().languageCode != "ru") {
  886.     flavours.appendFlavour("text/html")}
  887.   flavours.appendFlavour("text/unicode");
  888.   return flavours}
  889.  
  890. ;
  891. GTB_SearchObserver.prototype.onDragOver = function(evt, flavour, session) {
  892. }
  893.  
  894. ;
  895. GTB_SearchObserver.prototype.onDrop = function(evt, dropdata, session) {
  896.   if(!dropdata || !dropdata.data || dropdata.data == "") {
  897.     return}
  898.   var searchBox = document.getElementById("gtbGoogleSearchBox");
  899.   if(evt.target != searchBox) {
  900.     return}
  901.   setTimeout(GTB_DragDropLoadSearch, 0, dropdata.data)}
  902.  
  903. ;
  904. function GTB_GetTextContent(node) {
  905.   if(node.nodeType == Node.TEXT_NODE) {
  906.     return node.nodeValue}
  907.   else {
  908.     var str = "";
  909.     for(var i = 0;i < node.childNodes.length;i ++ ) {
  910.       if(node.childNodes[i].nodeName != "SCRIPT") {
  911.         str += GTB_GetTextContent(node.childNodes[i])}
  912.     }
  913.     return str}
  914. }
  915.  
  916. function GTB_DragDropLoadSearch(data) {
  917.   var searchBox = document.getElementById("gtbGoogleSearchBox");
  918.   if(searchBox == null) {
  919.     return}
  920.   var tmpDiv = GTB_GoogleToolbarOverlay._getCurrentDocument().createElement("div");
  921.   tmpDiv.innerHTML = data;
  922.   var str = GTB_GetTextContent(tmpDiv);
  923.   str = str.replace(/[\r\n]/g, "");
  924.   str = Trim(str);
  925.   if(str.length > 0) {
  926.     if(str[0] != '"' && str[0] != "'") {
  927.       if(str[str.length - 1] == "'") {
  928.         str = "'" + str}
  929.       else {
  930.         str = '"' + str}
  931.     }
  932.     if(str[str.length - 1] != str[0]) {
  933.       str = str + str[0]}
  934.   }
  935.   searchBox.value = str;
  936.   var answer = GTB_GoogleToolbarOverlay.highlighter.onSearchTextChanged(str);
  937.   GTB_GoogleToolbarOverlay._enableDisableQueryButtons(answer.hasTerms, answer.hasOps);
  938.   GTB_GTO_onGoogleSearchType(null, GTB_GoogleToolbarOverlay._SEARCH_TYPE)}
  939.  
  940. function GTB_GoogleToolbar() {
  941.   this.prefs = new GTB_Prefs}
  942.  
  943. GTB_GoogleToolbar.prototype._observerService = null;
  944. GTB_GoogleToolbar.prototype.lastQuery = "";
  945. GTB_GoogleToolbar.prototype.autoFill = null;
  946. GTB_GoogleToolbar.prototype.autoLink = null;
  947. GTB_GoogleToolbar.prototype.feedSubscribe = null;
  948. GTB_GoogleToolbar.prototype.autoTranslate = null;
  949. GTB_GoogleToolbar.prototype.chevron = null;
  950. GTB_GoogleToolbar.prototype.customSearch = null;
  951. GTB_GoogleToolbar.prototype.highlighter = null;
  952. GTB_GoogleToolbar.prototype.mailto = null;
  953. GTB_GoogleToolbar.prototype.infoButton = null;
  954. GTB_GoogleToolbar.prototype.upButton = null;
  955. GTB_GoogleToolbar.prototype.spellCheck = null;
  956. GTB_GoogleToolbar.prototype.perTabData = null;
  957. GTB_GoogleToolbar.prototype.npTooltip = null;
  958. GTB_GoogleToolbar.prototype.prefs = null;
  959. GTB_GoogleToolbar.toolboxCustomizeDone = null;
  960. GTB_GoogleToolbar.prototype.pageRank = null;
  961. GTB_GoogleToolbar.prototype.history = null;
  962. GTB_GoogleToolbar.prototype.tabBrowser = null;
  963. GTB_GoogleToolbar.prototype.GTB_MESSAGES = {ALERT:function(data) {
  964.   alert("ALERT: " + data)}
  965.  
  966. , GTB_ADD_BUTTON:function(data) {
  967.   GTB_GoogleToolbarOverlay._addButton(data)}
  968.  
  969. , GTB_REMOVE_BUTTON:function(data) {
  970.   GTB_GoogleToolbarOverlay._removeButton(data)}
  971.  
  972. , GTB_SEARCH_PERFORMED:function(data) {
  973.   GTB_GoogleToolbarOverlay.history.addToHistory(data)}
  974.  
  975. , "GTB_OPTION.remember_search_type":function(data) {
  976.   if(data == "false") {
  977.     GTB_GoogleToolbarOverlay.switchButton("search")}
  978. }
  979.  
  980. , "GTB_OPTION.word_find":function(data) {
  981.   GTB_GoogleToolbarOverlay.highlighter.toggleWordFindEnabled()}
  982.  
  983. , "GTB_OPTION.button_text_level":function(data) {
  984.   GTB_GoogleToolbarOverlay._setButtonTextLevel(data)}
  985.  
  986. , "GTB_OPTION.button_option.gtbPageRank":function(data) {
  987.   if(data != "false") {
  988.     setTimeout(GTB_hitch(GTB_GoogleToolbarOverlay.pageRank, GTB_GoogleToolbarOverlay.pageRank.GPR_getPageRank), 0)}
  989. }
  990.  
  991. , "GTB_OPTION.button_option.safebrowsing.advancedprotection":function(data) {
  992. }
  993.  
  994. , "GTB_OPTION.button_option.safebrowsing.enabled":function(data) {
  995. }
  996.  
  997. , "GTB_AutoFill.new_user_pref":function(data) {
  998.   GTB_GoogleToolbarOverlay.autoFill._autofillUserPreferences = GTB_AutoFillManager.loadUserPreferences();
  999.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  1000.   GTB_GoogleToolbarOverlay.autoFill._highlightFoundFields(browser.GTB_AutoFillData)}
  1001.  
  1002. , "GTB_SpellCheck.reload_dictionary":function(data) {
  1003.   GTB_GoogleToolbarOverlay.spellCheck.userDictionary.reload();
  1004.   GTB_getToolbar().spellCheck.maybeRerun(true)}
  1005.  
  1006. , "GTB_SpellCheck.resetButton":function(data) {
  1007.   GTBSC_setMode(GTBSC_getMode())}
  1008.  
  1009. , "GTB_OPTION.button_option.gtbAutoFill":function(data) {
  1010.   if(data != "false") {
  1011.     GTB_GoogleToolbarOverlay.autoFill.doPageLoad(null)}
  1012. }
  1013.  
  1014. , GPTD_PAGELOAD:function(data) {
  1015. }
  1016.  
  1017. , GTB_TABSWITCH:function(data) {
  1018. }
  1019.  
  1020. , "GTB_OPTION.google_home":function(data) {
  1021.   GTB_Dump(GTB_Dump.PR, "### PAGERANK trace: changing TLD preferences\n");
  1022.   GTB_GoogleToolbarOverlay.pageRank.GPR_getDefaultTld()}
  1023.  
  1024. };
  1025. GTB_GoogleToolbar.prototype.observe = GTB_MessageObserve;
  1026. GTB_GoogleToolbar.prototype.messageObjects = [];
  1027. GTB_GoogleToolbar.prototype.GTB_SEARCH_TYPES = {};
  1028. GTB_GoogleToolbar.prototype._GTB_NEXT_SEARCH_LOOKUP = {};
  1029. GTB_GoogleToolbar.prototype._GTB_PREV_SEARCH_LOOKUP = {};
  1030. GTB_GoogleToolbar.prototype._firstRunShown = false;
  1031. GTB_GoogleToolbar.prototype._searchBoxBeforeCustomize = true;
  1032. GTB_GoogleToolbar.prototype._addSearchType = function(search) {
  1033.   this.GTB_SEARCH_TYPES[search.name] = search}
  1034.  
  1035. ;
  1036. GTB_GoogleToolbar.prototype._initSearchTypes = function() {
  1037.   var stringBundle = document.getElementById("google-toolbar-strings");
  1038.   var searchType;
  1039.   this._addSearchType(GTB_GoogleSearchType("search", "chrome://google-toolbar/skin/search.png", stringBundle));
  1040.   this._addSearchType(GTB_GoogleSearchType("lucky", "chrome://google-toolbar/skin/lucky.png", stringBundle, {lucky:true}));
  1041.   this._addSearchType(GTB_StandardSearchType("images", "chrome://google-toolbar/skin/images.png", stringBundle));
  1042.   this._addSearchType(GTB_StandardSearchType("groups", "chrome://google-toolbar/skin/groups.png", stringBundle));
  1043.   this._addSearchType(GTB_StandardSearchType("news", "chrome://google-toolbar/skin/news.png", stringBundle));
  1044.   this._addSearchType(GTB_StandardSearchType("local", "chrome://google-toolbar/skin/local.png", stringBundle));
  1045.   var func = function(query, home) {
  1046.     return GTB_SearchUrl("www", home, "froogle", query)}
  1047.   
  1048.   ;
  1049.   this._addSearchType(new GTB_SearchType("froogle", "chrome://google-toolbar/skin/froogle.png", stringBundle.getString("prop.gtb.froogle"), stringBundle.getString("prop.gtb.froogle.tip"), func));
  1050.   searchType = {name:"site", image:"chrome://google-toolbar/skin/search-site.png", url:function(query, home) {
  1051.     var url = GTB_GoogleToolbarOverlay._getCurrentLocation().href;
  1052.     var url_tokens = GTB_urlSplit(url);
  1053.     var site = url_tokens[4];
  1054.     return GTB_SearchUrl("www", home, "search", query, {site:site})}
  1055.   
  1056.   };
  1057.   searchType.label = stringBundle.getString("prop.gtb.site");
  1058.   searchType.tip = stringBundle.getString("prop.gtb.site.tip");
  1059.   this._addSearchType(searchType);
  1060.   var l = this.customSearch._searches.length;
  1061.   for(var i = 0;i < l;i ++ ) {
  1062.     this._addSearchType(GTB_CustomSearchType(this.customSearch, i))}
  1063.   this._GTB_PREV_SEARCH_LOOKUP["search"] = "froogle";
  1064.   if(l > 0) {
  1065.     this._GTB_PREV_SEARCH_LOOKUP["search"] = "GTB_Custom_Search_" + (l - 1)}
  1066.   this._GTB_NEXT_SEARCH_LOOKUP["search"] = "site";
  1067.   this._GTB_PREV_SEARCH_LOOKUP["site"] = "search";
  1068.   this._GTB_NEXT_SEARCH_LOOKUP["site"] = "lucky";
  1069.   this._GTB_PREV_SEARCH_LOOKUP["lucky"] = "site";
  1070.   this._GTB_NEXT_SEARCH_LOOKUP["lucky"] = "images";
  1071.   this._GTB_PREV_SEARCH_LOOKUP["images"] = "lucky";
  1072.   this._GTB_NEXT_SEARCH_LOOKUP["images"] = "groups";
  1073.   this._GTB_PREV_SEARCH_LOOKUP["groups"] = "images";
  1074.   this._GTB_NEXT_SEARCH_LOOKUP["groups"] = "news";
  1075.   this._GTB_PREV_SEARCH_LOOKUP["news"] = "groups";
  1076.   this._GTB_NEXT_SEARCH_LOOKUP["news"] = "local";
  1077.   this._GTB_PREV_SEARCH_LOOKUP["local"] = "news";
  1078.   this._GTB_NEXT_SEARCH_LOOKUP["local"] = "froogle";
  1079.   this._GTB_PREV_SEARCH_LOOKUP["froogle"] = "local";
  1080.   this._GTB_NEXT_SEARCH_LOOKUP["froogle"] = "search";
  1081.   if(l > 0) {
  1082.     this._GTB_NEXT_SEARCH_LOOKUP["froogle"] = "GTB_Custom_Search_0"}
  1083.   for(i = 0;i < l;i ++ ) {
  1084.     this._GTB_NEXT_SEARCH_LOOKUP["GTB_Custom_Search_" + i] = "GTB_Custom_Search_" + (i + 1);
  1085.     if(i == l - 1) {
  1086.       this._GTB_NEXT_SEARCH_LOOKUP["GTB_Custom_Search_" + i] = "search"}
  1087.     this._GTB_PREV_SEARCH_LOOKUP["GTB_Custom_Search_" + i] = "GTB_Custom_Search_" + (i - 1);
  1088.     if(i == 0) {
  1089.       this._GTB_PREV_SEARCH_LOOKUP["GTB_Custom_Search_" + i] = "froogle"}
  1090.   }
  1091. }
  1092.  
  1093. ;
  1094. GTB_GoogleToolbar.prototype._SEARCH_TYPE = "search";
  1095. GTB_GoogleToolbar.prototype.languageCode = "en";
  1096. GTB_GoogleToolbar.prototype.availableButtons = {};
  1097. GTB_GoogleToolbar.prototype.buttonOptions = [{checkboxId:"gtbOptionsBrowsingSpellCheckbox", property:"gtbSpellCheck", dependentWidget:"gtbOptionsBrowsingSpellButton"}, {checkboxId:"gtbOptionsBrowsingAutoLinkCheckbox", property:"gtbAutoLink", dependentWidget:"gtbOptionsBrowsingAutoLinkButton"}, {checkboxId:"gtbOptionsBrowsingFeedSubscribeCheckbox", property:"gtbFeedSubscribe", dependentWidget:"gtbOptionsBrowsingFeedSubscribeButton"}, {checkboxId:"gtbOptionsBrowsingAutoFillCheckbox", property:"gtbAutoFill"
  1098. , dependentWidget:"gtbOptionsBrowsingAutoFillButton"}, {checkboxId:"gtbOptionsBrowsingPageRankCheckbox", optIn:true, property:"gtbPageRank"}, {checkboxId:"gtbOptionsBrowsingSafeBrowsingCheckbox", property:"safebrowsing.enabled", dependentWidget:"gtbOptionsBrowsingSafeBrowsingButton"}, {checkboxId:"gtbOptionsMoreHighlightCheckbox", property:"gtbHighlight"}, {checkboxId:"gtbOptionsSearchButtonsSiteCheckbox", property:"gtbSearchSite"}, {checkboxId:"gtbOptionsSearchButtonsLuckyCheckbox", property:"gtbFeelingLucky"
  1099. }, {checkboxId:"gtbOptionsSearchButtonsImagesCheckbox", property:"gtbSearchImages"}, {checkboxId:"gtbOptionsSearchButtonsGroupsCheckbox", property:"gtbSearchGroups"}, {checkboxId:"gtbOptionsSearchButtonsFroogleCheckbox", property:"gtbSearchFroogle"}, {checkboxId:"gtbOptionsMoreNewsCheckbox", property:"gtbSearchNews"}, {checkboxId:"gtbOptionsSearchButtonsLocalCheckbox", property:"gtbSearchLocal"}, {checkboxId:"gtbOptionsMoreBlogThisCheckbox", property:"gtbBlogger"}, {checkboxId:"gtbOptionsMoreUpCheckbox"
  1100. , property:"gtbGoUp"}, {checkboxId:"gtbOptionsMoreOptionsCheckbox", property:"gtbOptions"}, {checkboxId:"gtbOptionsMoreNextPreviousCheckbox", property:"gtbNextPrev"}, {checkboxId:"gtbOptionsMorePageInfoCheckbox", property:"gtbInfo"}, {checkboxId:"gtbOptionsMoreWordFindCheckbox", property:"gtbFindTerms"}];
  1101. GTB_GoogleToolbar.prototype.menuItemIds = {gtbSearchSite:"gtbSearchButtonPopupSite", gtbFeelingLucky:"gtbSearchButtonPopupLucky", gtbSearchImages:"gtbSearchButtonPopupImages", gtbSearchGroups:"gtbSearchButtonPopupGroups", gtbSearchFroogle:"gtbSearchButtonPopupFroogle", gtbSearchNews:"gtbSearchButtonPopupNews", gtbSearchLocal:"gtbSearchButtonPopupLocal"};
  1102. function GTB_sortMenuPopup(menuPopup, opt_startIndex, opt_stopIndex) {
  1103.   if(opt_startIndex == null) {
  1104.     opt_startIndex = 0}
  1105.   if(opt_stopIndex == null) {
  1106.     opt_stopIndex = menuPopup.childNodes.length - 1}
  1107.   var arr = [];
  1108.   for(var i = opt_startIndex;i <= opt_stopIndex;i ++ ) {
  1109.     arr[i - opt_startIndex] = menuPopup.childNodes[i]}
  1110.   var sortFunction = function(x, y) {
  1111.     var result = 0;
  1112.     if(x != null && y != null) {
  1113.       var xLabel = x.getAttribute("label");
  1114.       var yLabel = y.getAttribute("label");
  1115.       if(xLabel != null && yLabel != null) {
  1116.         if(xLabel < yLabel) {
  1117.           result = -1}
  1118.         else if(xLabel > yLabel) {
  1119.           result = 1}
  1120.       }
  1121.     }
  1122.     return result}
  1123.   
  1124.   ;
  1125.   arr.sort(sortFunction);
  1126.   for(i = opt_stopIndex - 1;i >= opt_startIndex;i -- ) {
  1127.     menuPopup.removeChild(menuPopup.childNodes[i])}
  1128.   menuPopup.replaceChild(arr[arr.length - 1], menuPopup.childNodes[opt_startIndex]);
  1129.   for(i = 0;i < opt_stopIndex - opt_startIndex;i ++ ) {
  1130.     menuPopup.insertBefore(arr[i], arr[arr.length - 1])}
  1131. }
  1132.  
  1133. GTB_GoogleToolbar.prototype.autoTransLibAvailable = null;
  1134. GTB_GoogleToolbar.prototype.init = function() {
  1135.   this.tabBrowser = document.getElementById("content");
  1136.   var stringBundle = document.getElementById("gtb-localized_prefs");
  1137.   this.languageCode = stringBundle.getString("lang");
  1138.   var autoXpcomObj = Components.classes["@google.com/autotranslate;1"];
  1139.   this.autoTransLibAvailable = autoXpcomObj != null;
  1140.   GTB_SendDailyPing();
  1141.   window.setInterval(GTB_SendDailyPing, 3600000);
  1142.   this.chevron = new GTB_Chevron;
  1143.   this.chevron.init();
  1144.   var buttonList = stringBundle.getString("buttonList");
  1145.   var localeButtons = buttonList.split(",");
  1146.   for(var i = 0;i < localeButtons.length;i ++ ) {
  1147.     this.availableButtons[localeButtons[i]] = true}
  1148.   var googleSpellCheckMenu = document.getElementById("googleSpellCheckLangMenu");
  1149.   if(googleSpellCheckMenu != null) {
  1150.     GTB_sortMenuPopup(googleSpellCheckMenu, 2)}
  1151.   var paletteItems = GTB_GetAllItemsInPalette();
  1152.   for(i = 0;i < paletteItems.length;i ++ ) {
  1153.     if(!this.availableButtons[paletteItems[i]]) {
  1154.       var button = document.getElementById(paletteItems[i]);
  1155.       if(button && button.parentNode) {
  1156.         GTB_GoogleToolbar.removeFromToolbarAndDefaultSet(button, button.parentNode)}
  1157.       GTB_GoogleToolbar.removeButtonFromPalette(paletteItems[i])}
  1158.     else {
  1159.       try {
  1160.         var button = document.getElementById(paletteItems[i]);
  1161.         var option = GTB_getPrefs().getBoolPref("button_option." + paletteItems[i]);
  1162.         if(button && !option) {
  1163.           this._removeButton(paletteItems[i])}
  1164.         else if(option && !button) {
  1165.           this._addButton(paletteItems[i])}
  1166.       }
  1167.       catch(e) {
  1168.       }
  1169.     }
  1170.   }
  1171.   this.customSearch = new GTB_CustomSearch;
  1172.   this.customSearch.init();
  1173.   var customSearches = this.customSearch._searches;
  1174.   for(var i = 0;i < customSearches.length;i ++ ) {
  1175.     var buttonName = this.customSearch.searchToButtonId(customSearches[i]);
  1176.     this.availableButtons[buttonName] = true}
  1177.   var textLevel = GTB_getPrefs().getStringPref("button_text_level");
  1178.   this._setButtonTextLevel(textLevel);
  1179.   this._observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  1180.   var tabbox = this._getTabBrowser().mTabBox;
  1181.   tabbox.addEventListener("load", GTB_GTO_onPageLoad, true);
  1182.   tabbox.addEventListener("unload", GTB_GTO_onPageUnLoad, true);
  1183.   tabbox.addEventListener("select", GTB_GTO_onTabSwitch, true);
  1184.   tabbox.addEventListener("pageshow", GTB_GTO_onPageShow, true);
  1185.   tabbox.addEventListener("pagehide", GTB_GTO_onPageHide, true);
  1186.   window.addEventListener("popupshowing", GTB_TT_maybeSurpressTooltip, false);
  1187.   window.addEventListener("resize", GTB_hitch(this.chevron, this.chevron.doResize), false);
  1188.   this.perTabData = new GTB_TabManager;
  1189.   this.autoFill = new GTB_AutoFillManager;
  1190.   this.autoFill.init();
  1191.   this.autoTranslate = new GTB_AutoTranslate;
  1192.   this.autoTranslate.init();
  1193.   this.pageRank = new GTB_PageRank;
  1194.   this.pageRank.GPR_startup();
  1195.   this.infoButton = new GTB_InfoButton;
  1196.   this.upButton = new GTB_UpButton;
  1197.   this.nextPrev = new GTB_NextPrev;
  1198.   this.highlighter = new GTB_Highlighter;
  1199.   this.highlighter.init();
  1200.   this.mailto = new GTB_Mailto;
  1201.   this.history = new GTB_SearchHistory;
  1202.   this.history.init();
  1203.   this.suggest = new GTB_Suggest;
  1204.   this.autoLink = new GTB_AutoLink;
  1205.   this.feedSubscribe = new GTB_FeedSubscribe;
  1206.   var tippers = [this.autoLink, this.autoFill, new GTB_TooltipDefault, this.autoTranslate];
  1207.   this.tooltip = new GTB_Tooltip(tippers);
  1208.   this.spellCheck = new GTB_SpellCheck;
  1209.   this.spellCheck.init(this);
  1210.   this.registerMessages(this);
  1211.   this.registerMessages(this.history);
  1212.   this.registerMessages(this.suggest);
  1213.   this.registerMessages(this.nextPrev);
  1214.   this.registerMessages(this.highlighter);
  1215.   this.registerMessages(this.upButton);
  1216.   this.registerMessages(this.infoButton);
  1217.   this.registerMessages(this.autoLink);
  1218.   this.registerMessages(this.feedSubscribe);
  1219.   var contextMenu = document.getElementById("contentAreaContextMenu");
  1220.   contextMenu.addEventListener("popupshowing", GTB_hitch(this.autoTranslate, this.autoTranslate.maybeShowTranslateMenuItem), false);
  1221.   contextMenu.addEventListener("popupshowing", GTB_hitch(this.autoLink, this.autoLink.maybeShowAutoLinkMenuItems), false);
  1222.   this._initSearchTypes();
  1223.   this.switchButton("search");
  1224.   if(window.opener != null) {
  1225.     var openerOverlay = window.opener.GTB_GoogleToolbarOverlay;
  1226.     if(openerOverlay != null) {
  1227.       var searchBox = document.getElementById("gtbGoogleSearchBox");
  1228.       if(searchBox) {
  1229.         searchBox.value = openerOverlay.getSearchText()}
  1230.     }
  1231.   }
  1232.   GTB_GTO_onGoogleSearchInput(null);
  1233.   Components.classes["@google.com/uninstaller;1"].getService(Components.interfaces.nsIObserver);
  1234.   setTimeout(GTB_hitch(this, this.delayedInit), 1);
  1235.   this.handleCustomize()}
  1236.  
  1237. ;
  1238. GTB_GoogleToolbar.prototype.delayedInit = function() {
  1239.   var toolbox = document.getElementById("navigator-toolbox");
  1240.   this.toolboxCustomizeDone = toolbox.customizeDone;
  1241.   toolbox.customizeDone = GTB_hitch(this, this.onToolboxCustomizeDone)}
  1242.  
  1243. ;
  1244. GTB_GoogleToolbar.advancedFeatureData = [{id:"gtbPageRank", option:"button_option.gtbPageRank"}, {option:"button_option.safebrowsing.advancedprotection"}, {option:"button_option.safebrowsing.advancedprotection.default"}];
  1245. GTB_GoogleToolbar.removeButtonFromPalette = function(id) {
  1246.   var toolbox = document.getElementById("navigator-toolbox");
  1247.   var toolbarPalette = toolbox.palette;
  1248.   for(var index = 0;index < toolbarPalette.childNodes.length;index ++ ) {
  1249.     if(toolbarPalette.childNodes[index].id == id) {
  1250.       toolbarPalette.removeChild(toolbarPalette.childNodes[index]);
  1251.       break}
  1252.   }
  1253. }
  1254.  
  1255. ;
  1256. GTB_GoogleToolbar.removeFromToolbarAndDefaultSet = function(button, toolbar) {
  1257.   toolbar.removeChild(button);
  1258.   var toolbox = document.getElementById("navigator-toolbox");
  1259.   var currentSet = toolbar.currentSet;
  1260.   toolbar.setAttribute("currentset", currentSet);
  1261.   toolbox.ownerDocument.persist(toolbar.id, "currentset");
  1262.   var defaultSet = toolbar.getAttribute("defaultset");
  1263.   var r = new RegExp("," + button.id);
  1264.   defaultSet = defaultSet.replace(r, "");
  1265.   toolbar.setAttribute("defaultset", defaultSet);
  1266.   toolbox.ownerDocument.persist(toolbar.id, "defaultset")}
  1267.  
  1268. ;
  1269. GTB_GoogleToolbar.prototype.showFirstRunDialog = function() {
  1270.   this.chevron.doResize();
  1271.   while(!GTB_getPrefs().hasUserValue(GTB_PREF_OPT_IN)) {
  1272.     window.openDialog("chrome://google-toolbar/content/first-run.xul", "gtbFirstRun", "modal,centerscreen,chrome,resizable=no", this.languageCode);
  1273.     if(GTB_getPrefs().hasUserValue(GTB_PREF_OPT_IN)) {
  1274.       GTB_getPrefs().setBoolPref("button_option.gtbPageRank", true);
  1275.       GTB_getPrefs().setBoolPref("button_option.safebrowsing.enabled", true);
  1276.       GTB_getPrefs().setBoolPref("button_option.safebrowsing.advancedprotection", true);
  1277.       GTB_getPrefs().setBoolPref(GTB_PREF_ADVANCED_DEFAULT, true);
  1278.       var optedIn = GTB_getPrefs().getBoolPref(GTB_PREF_OPT_IN);
  1279.       if(!optedIn) {
  1280.         for(var i = 0;i < GTB_GoogleToolbar.advancedFeatureData.length; ++ i) {
  1281.           var feature = GTB_GoogleToolbar.advancedFeatureData[i];
  1282.           GTB_getPrefs().setBoolPref(feature.option, false);
  1283.           if(feature.id == null) {
  1284.             continue}
  1285.           var featureButton = document.getElementById(feature.id);
  1286.           if(featureButton && featureButton.parentNode) {
  1287.             var toolbar = featureButton.parentNode;
  1288.             GTB_GoogleToolbar.removeFromToolbarAndDefaultSet(featureButton, toolbar)}
  1289.         }
  1290.         this.chevron.doResize()}
  1291.     }
  1292.   }
  1293. }
  1294.  
  1295. ;
  1296. GTB_GoogleToolbar.prototype.tearDown = function(event) {
  1297.   while(this.messageObjects.length > 0) {
  1298.     this.unregisterMessages(this.messageObjects.pop())}
  1299. }
  1300.  
  1301. ;
  1302. GTB_GoogleToolbar.prototype.registerMessages = function(obj) {
  1303.   this.messageObjects.push(obj);
  1304.   for(var message in obj.GTB_MESSAGES) {
  1305.     this._observerService.addObserver(obj, message, false)}
  1306. }
  1307.  
  1308. ;
  1309. GTB_GoogleToolbar.prototype.unregisterMessages = function(obj) {
  1310.   for(var message in obj.GTB_MESSAGES) {
  1311.     this._observerService.removeObserver(obj, message)}
  1312. }
  1313.  
  1314. ;
  1315. GTB_GoogleToolbar.prototype.sendMessage = function(mesg, opt_data) {
  1316.   this._observerService.notifyObservers(null, mesg, opt_data)}
  1317.  
  1318. ;
  1319. GTB_GoogleToolbar.prototype._setButtonTextLevel = function(level) {
  1320.   var toolbar = document.getElementById("gtbToolbar");
  1321.   toolbar.setAttribute("mode", level);
  1322.   document.persist("gtbToolbar", "mode");
  1323.   this.chevron.doResize()}
  1324.  
  1325. ;
  1326. GTB_GoogleToolbar.prototype._addButton = function(id) {
  1327.   var button = document.getElementById(id);
  1328.   if(button) {
  1329.     return}
  1330.   var all_ids = GTB_GetAllItemsInPalette();
  1331.   var toolbar_ids = GTB_GetAllItemsInGoogleToolbar();
  1332.   var index = -1;
  1333.   var i = 0;
  1334.   for(i = 0;i < all_ids.length;i ++ ) {
  1335.     if(all_ids[i] == id) {
  1336.       index = i;
  1337.       break}
  1338.   }
  1339.   var beforeElement = null;
  1340.   for(i = index + 1;i < all_ids.length;i ++ ) {
  1341.     if(toolbar_ids[all_ids[i]] == 1) {
  1342.       beforeElement = document.getElementById(all_ids[i]);
  1343.       break}
  1344.   }
  1345.   var toolbar = document.getElementById("gtbToolbar");
  1346.   toolbar.insertItem(id, beforeElement);
  1347.   this.chevron.doResize()}
  1348.  
  1349. ;
  1350. GTB_GoogleToolbar.prototype._removeButton = function(id) {
  1351.   var button = document.getElementById(id);
  1352.   if(!button) {
  1353.     return}
  1354.   button.parentNode.removeChild(button);
  1355.   this.chevron.doResize()}
  1356.  
  1357. ;
  1358. GTB_GoogleToolbar.prototype.addButtons = function(buttons) {
  1359.   for(var i = 0;i < buttons.length;i ++ ) {
  1360.     this.sendMessage("GTB_ADD_BUTTON", buttons[i])}
  1361. }
  1362.  
  1363. ;
  1364. GTB_GoogleToolbar.prototype.removeButtons = function(removeThese) {
  1365.   for(var i = 0;i < removeThese.length;i ++ ) {
  1366.     var button = removeThese[i];
  1367.     this.sendMessage("GTB_REMOVE_BUTTON", button)}
  1368. }
  1369.  
  1370. ;
  1371. GTB_GoogleToolbar._privacyItems = {gtbPageRank:true, "safebrowsing.enabled":true, gtbSpellCheck:true, gtbAutoLink:true};
  1372. GTB_GoogleToolbar.prototype.propogateToolbarChanges = function(restoringDefaults) {
  1373.   var changedToolbox = document.getElementById("navigator-toolbox");
  1374.   var changedToolbar = document.getElementById("gtbToolbar");
  1375.   var browserWindows = GTB_getBrowserWindows();
  1376.   for(var bi = 0, win = null;win = browserWindows[bi]; ++ bi) {
  1377.     var overlay = win.GTB_GoogleToolbarOverlay;
  1378.     if(win == window) {
  1379.       continue}
  1380.     var toolbox = win.document.getElementById("navigator-toolbox");
  1381.     var toolbar = win.document.getElementById("gtbToolbar");
  1382.     if(restoringDefaults) {
  1383.       for(var i = toolbox.childNodes.length - 1;i >= 0;i -- ) {
  1384.         if(toolbox.childNodes[i].hasAttribute("customindex")) {
  1385.           toolbox.removeChild(toolbox.childNodes[i])}
  1386.       }
  1387.       for(var t = 0;t < toolbox.childNodes.size;t ++ ) {
  1388.         var currentToolbar = toolbox.childNodes[t];
  1389.         for(i = currentToolbar.childNodes.length - 1;i >= 0;i -- ) {
  1390.           if(currentToolbar.id != "gtbToolbar") {
  1391.             var item = currentToolbar.childNodes[i];
  1392.             if(GTB_isGoogleToolbarItem(item)) {
  1393.               currentToolbar.removeChild(item)}
  1394.           }
  1395.         }
  1396.       }
  1397.     }
  1398.     var toolboxMode = changedToolbox.getAttribute("mode");
  1399.     var toolboxIconsize = changedToolbox.getAttribute("iconsize");
  1400.     toolbox.setAttribute("mode", toolboxMode);
  1401.     toolbox.setAttribute("iconsize", toolboxIconsize);
  1402.     for(var i = 0;i < changedToolbox.childNodes.length;i ++ ) {
  1403.       var changedToolbar = changedToolbox.childNodes[i];
  1404.       var toolbarId = changedToolbar.id;
  1405.       var toolbarToUpdate = win.document.getElementById(toolbarId);
  1406.       if(changedToolbar.getAttribute("customizable") != "true") {
  1407.         continue}
  1408.       if(toolbarToUpdate) {
  1409.         if(restoringDefaults) {
  1410.           toolbarToUpdate.currentSet = changedToolbar.getAttribute("defaultset");
  1411.           toolbarToUpdate.collapsed = changedToolbar.collapsed}
  1412.         else {
  1413.           toolbarToUpdate.currentSet = changedToolbar.currentSet}
  1414.         toolbarToUpdate.setAttribute("mode", changedToolbar.getAttribute("mode"));
  1415.         toolbarToUpdate.setAttribute("iconsize", changedToolbar.getAttribute("iconsize"))}
  1416.       else if(changedToolbar.hasAttribute("customindex")) {
  1417.         var name = changedToolbar.getAttribute("toolbarname");
  1418.         var set = changedToolbar.currentSet;
  1419.         var toolbarToUpdate = toolbox.appendCustomToolbar(name, set);
  1420.         toolbarToUpdate.setAttribute("mode", changedToolbar.getAttribute("mode"));
  1421.         toolbarToUpdate.setAttribute("iconsize", changedToolbar.getAttribute("iconsize"))}
  1422.     }
  1423.     overlay.updateSearchTextAfterCustomize();
  1424.     if(restoringDefaults) {
  1425.       overlay.restoreDefaultsFixUi()}
  1426.     overlay.handleCustomize();
  1427.     overlay.toolboxCustomizeDone(true)}
  1428. }
  1429.  
  1430. ;
  1431. GTB_GoogleToolbar.prototype.getCustomizeToolbarWindow = function() {
  1432.   var result = null;
  1433.   try {
  1434.     var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator)}
  1435.   catch(e) {
  1436.   }
  1437.   if(windowMediator) {
  1438.     var windowEnumerator = windowMediator.getZOrderDOMWindowEnumerator(null, false);
  1439.     while(windowEnumerator.hasMoreElements()) {
  1440.       var win = windowEnumerator.getNext();
  1441.       if(win && win.document && win.document.documentElement && "CustomizeToolbarWindow" == win.document.documentElement.getAttribute("id")) {
  1442.         result = win;
  1443.         break}
  1444.     }
  1445.   }
  1446.   return result}
  1447.  
  1448. ;
  1449. GTB_GoogleToolbar.prototype.focusCustomizeToolbarWindow = function() {
  1450.   var customizeToolbarWindow = this.getCustomizeToolbarWindow();
  1451.   if(customizeToolbarWindow) {
  1452.     customizeToolbarWindow.focus()}
  1453. }
  1454.  
  1455. ;
  1456. GTB_GoogleToolbar.prototype.onToolboxCustomizeDone = function(aToolboxChanged) {
  1457.   var ids = GTB_GetAllItemsInPalette();
  1458.   var prefs = GTB_getPrefs();
  1459.   if(!document.getElementById("gtbSearchBox") && this._searchBoxBeforeCustomize) {
  1460.     window.openDialog("chrome://google-toolbar/content/confirm-customize.xul", "gtbConfirmCustomize", "modal,centerscreen,chrome,resizable=no")}
  1461.   var toolbar = document.getElementById("gtbToolbar");
  1462.   var currentSet = toolbar.currentSet;
  1463.   toolbar.setAttribute("currentset", currentSet);
  1464.   document.persist(toolbar.id, "currentset");
  1465.   this.propogateToolbarChanges(false);
  1466.   this.handleCustomize();
  1467.   this.updateSearchTextAfterCustomize();
  1468.   for(var i = 0;i < ids.length;i ++ ) {
  1469.     try {
  1470.       var pref = prefs.getBoolPref("button_option." + ids[i])}
  1471.     catch(e) {
  1472.       continue}
  1473.     var element = document.getElementById(ids[i]);
  1474.     if(pref && element == null) {
  1475.       GTB_setBoolPrefWithMessage("button_option." + ids[i], false, this)}
  1476.     else if(element != null) {
  1477.       GTB_setBoolPrefWithMessage("button_option." + ids[i], true, this)}
  1478.   }
  1479.   var mode = toolbar.getAttribute("mode");
  1480.   GTB_setStringPrefWithMessage("button_text_level", mode, this);
  1481.   this.toolboxCustomizeDone(aToolboxChanged)}
  1482.  
  1483. ;
  1484. function GTB_ConfirmCustomize_onCancel() {
  1485.   GTB_getToolbar().doCustomizeCancel()}
  1486.  
  1487. GTB_GoogleToolbar.prototype.doCustomizeCancel = function() {
  1488.   this._addButton("gtbSearchBox");
  1489.   var toolbar = document.getElementById("gtbToolbar");
  1490.   var currentSet = toolbar.currentSet;
  1491.   toolbar.setAttribute("currentset", currentSet);
  1492.   document.persist("gtbToolbar", "currentset")}
  1493.  
  1494. ;
  1495. function GTB_CP_onToolboxCustomizeStarted(event) {
  1496.   GTB_getToolbar().doToolboxCustomizeStarted(event)}
  1497.  
  1498. GTB_GoogleToolbar.prototype.doToolboxCustomizeStarted = function(event) {
  1499.   GTB_GoogleToolbar.applyStyles();
  1500.   var searchbox = document.getElementById("gtbSearchBox");
  1501.   this._searchBoxBeforeCustomize = searchbox ? true : false}
  1502.  
  1503. ;
  1504. GTB_GoogleToolbar.prototype.updateSearchTextAfterCustomize = function() {
  1505.   var searchbox = document.getElementById("gtbGoogleSearchBox");
  1506.   if(!this._searchBoxBeforeCustomize && searchbox) {
  1507.     searchbox.value = "";
  1508.     this.lastQuery = ""}
  1509.   if(this._searchBoxBeforeCustomize && searchbox) {
  1510.     searchbox.value = this.lastQuery}
  1511.   if(this._searchBoxBeforeCustomize && !searchbox) {
  1512.     this.lastQuery = ""}
  1513.   this.highlighter._currentWords = [];
  1514.   var answer = this.highlighter.onSearchTextChanged(this.lastQuery);
  1515.   this._enableDisableQueryButtons(answer.hasTerms, answer.hasOps)}
  1516.  
  1517. ;
  1518. function GTB_CP_onToolboxRestoreDefaults(event) {
  1519.   var toolbar = GTB_getToolbar();
  1520.   setTimeout(GTB_hitch(toolbar, toolbar.doToolboxCustomizeRestoreDefaults), 1)}
  1521.  
  1522. GTB_GoogleToolbar.prototype.doToolboxCustomizeRestoreDefaults = function() {
  1523.   var toolbox = document.getElementById("navigator-toolbox");
  1524.   for(var i = 0;i < toolbox.childNodes.length;i ++ ) {
  1525.     var toolbar = toolbox.childNodes[i];
  1526.     if(toolbar.id != "gtbToolbar") {
  1527.       for(var j = toolbar.childNodes.length - 1;j >= 0;j -- ) {
  1528.         var item = toolbar.childNodes[j];
  1529.         if(GTB_isGoogleToolbarWrapperItem(item)) {
  1530.           toolbar.removeChild(item)}
  1531.       }
  1532.     }
  1533.   }
  1534.   this._setButtonTextLevel("gtb-selective-text");
  1535.   this.propogateToolbarChanges(true);
  1536.   window.focus();
  1537.   this.focusCustomizeToolbarWindow();
  1538.   this.handleCustomize();
  1539.   this.updateSearchTextAfterCustomize();
  1540.   this.restoreDefaultsFixUi()}
  1541.  
  1542. ;
  1543. GTB_GoogleToolbar.prototype.restoreDefaultsFixUi = function() {
  1544.   if(GTB_PageRank.GPR_pageRankEnabled()) {
  1545.     var tabData = GTB_perTabData().getSelectedTabContainer("page_rank");
  1546.     var pr = tabData ? tabData.pageRank : null;
  1547.     this.pageRank.GPR_displayPageRank(pr)}
  1548.   this.spellCheck.initUi();
  1549.   tabData = this._getCurrentBrowser().GTB_AutolinkData;
  1550.   if(tabData) {
  1551.     this.autoLink._updateButton(tabData);
  1552.     this.autoLink.relink()}
  1553.   this.switchButton(this._SEARCH_TYPE)}
  1554.  
  1555. ;
  1556. GTB_GoogleToolbar.prototype.handleCustomize = function() {
  1557.   var toolbar = document.getElementById("gtbToolbar");
  1558.   toolbar.setAttribute("iconsize", "small");
  1559.   var leftResize = document.getElementById("gtbSearchBoxResizeLeft");
  1560.   if(leftResize) {
  1561.     leftResize.handleCustomize()}
  1562.   var rightResize = document.getElementById("gtbSearchBoxResizeRight");
  1563.   if(rightResize) {
  1564.     rightResize.handleCustomize()}
  1565.   var answer = this.highlighter.onSearchTextChanged(this.lastQuery);
  1566.   this._enableDisableQueryButtons(answer.hasTerms, answer.hasOps);
  1567.   var doc = GTB_GoogleToolbarOverlay._getCurrentDocument();
  1568.   GTB_GoogleToolbarOverlay._enableDisableNonHttpOrGoogleButtons(doc.location.href);
  1569.   var searchBox = document.getElementById("gtbGoogleSearchBox");
  1570.   if(searchBox) {
  1571.     GTB_GoogleToolbar.applyStyles();
  1572.     this.suggest.doToggleSuggest(GTB_getPrefs().getBoolPref(GTB_PREF_USE_SUGGEST));
  1573.     this.customSearch.addSearchesToDropDown();
  1574.     var oldValue = searchBox.value;
  1575.     var oldLastQuery = this.lastQuery;
  1576.     this.history.init();
  1577.     searchBox.value = oldValue;
  1578.     this.lastQuery = oldLastQuery;
  1579.     var e;
  1580.     if(searchBox.gtbListeners) {
  1581.       for(e in searchBox.gtbListeners) {
  1582.         searchBox.removeEventListener(e, searchBox.gtbListeners[e], true)}
  1583.     }
  1584.     var searchObserver = new GTB_SearchObserver;
  1585.     searchBox.gtbListeners = {dragover:function(ev) {
  1586.       nsDragAndDrop.dragOver(ev, searchObserver)}
  1587.     
  1588.     , dragdrop:function(ev) {
  1589.       nsDragAndDrop.drop(ev, searchObserver)}
  1590.     
  1591.     };
  1592.     for(e in searchBox.gtbListeners) {
  1593.       searchBox.addEventListener(e, searchBox.gtbListeners[e], true)}
  1594.   }
  1595.   GTB_GTO_onGoogleSearchInput(null)}
  1596.  
  1597. ;
  1598. GTB_GoogleToolbar.prototype._getTabBrowser = function() {
  1599.   var tabBrowser = this.tabBrowser;
  1600.   return tabBrowser}
  1601.  
  1602. ;
  1603. GTB_GoogleToolbar.prototype._getCurrentBrowser = function() {
  1604.   var currentBrowser = this._getTabBrowser().selectedBrowser;
  1605.   return currentBrowser}
  1606.  
  1607. ;
  1608. GTB_GoogleToolbar.prototype._getCurrentWindow = function() {
  1609.   var currentWindow = this._getCurrentBrowser().contentWindow;
  1610.   return currentWindow}
  1611.  
  1612. ;
  1613. GTB_GoogleToolbar.prototype._getCurrentLocation = function() {
  1614.   var currentLocation = this._getCurrentWindow().location;
  1615.   return currentLocation}
  1616.  
  1617. ;
  1618. GTB_GoogleToolbar.prototype._getCurrentDocument = function() {
  1619.   var d = this.tabBrowser.selectedBrowser.contentWindow.document;
  1620.   return d}
  1621.  
  1622. ;
  1623. GTB_GoogleToolbar.prototype._getBrowserFromDoc = function(doc) {
  1624.   var win = doc && doc.defaultView;
  1625.   if(!win) {
  1626.     GTB_Dump(GTB_Dump.TB, "window not found while trying to find doc owner\n");
  1627.     return null}
  1628.   win = win.top;
  1629.   var browsers = this._getTabBrowser().browsers;
  1630.   var browser = null;
  1631.   for(var b = 0;b < browsers.length; ++ b) {
  1632.     if(browsers[b].contentWindow == win) {
  1633.       browser = browsers[b];
  1634.       break}
  1635.   }
  1636.   return browser}
  1637.  
  1638. ;
  1639. GTB_GoogleToolbar.prototype._loadSearchURL = function(url, opt_useNewTab, opt_event) {
  1640.   var loadTarget = null;
  1641.   if(!opt_useNewTab && opt_event && ("click" == opt_event.type || "command" == opt_event.type)) {
  1642.     loadTarget = this.getLoadUrlTarget(opt_event);
  1643.     if(loadTarget == nsCI.nsIBrowserDOMWindow.OPEN_NEWTAB) {
  1644.       opt_useNewTab = true}
  1645.   }
  1646.   var tabbrowser = this._getTabBrowser();
  1647.   if(opt_useNewTab) {
  1648.     tabbrowser.selectedTab = tabbrowser.addTab(url)}
  1649.   else if(loadTarget == nsCI.nsIBrowserDOMWindow.OPEN_NEWWINDOW) {
  1650.     window.openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", url)}
  1651.   else if(GTB_getPrefs().getBoolPref("search_new_tab")) {
  1652.     if(GTB_getPrefs().getBoolPref("select_new_tab")) {
  1653.       tabbrowser.selectedTab = tabbrowser.addTab(url)}
  1654.     else {
  1655.       tabbrowser.addTab(url)}
  1656.   }
  1657.   else {
  1658.     this._getCurrentBrowser().loadURI(url, null, null)}
  1659. }
  1660.  
  1661. ;
  1662. GTB_GoogleToolbar.prototype.loadUrlWithModifiers = function(url, opt_event) {
  1663.   var target = nsCI.nsIBrowserDOMWindow.OPEN_DEFAULTWINDOW;
  1664.   if(opt_event) {
  1665.     target = this.getLoadUrlTarget(opt_event)}
  1666.   if(nsCI.nsIBrowserDOMWindow.OPEN_NEWTAB == target) {
  1667.     var tabbrowser = this._getTabBrowser();
  1668.     tabbrowser.selectedTab = tabbrowser.addTab(url);
  1669.     return tabbrowser.selectedBrowser}
  1670.   else if(nsCI.nsIBrowserDOMWindow.OPEN_NEWWINDOW == target) {
  1671.     var win = window.openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", url);
  1672.     return null}
  1673.   var browser = this._getCurrentBrowser();
  1674.   browser.loadURI(url, null, null);
  1675.   return browser}
  1676.  
  1677. ;
  1678. GTB_GoogleToolbar.prototype.getLoadUrlTarget = function(event) {
  1679.   var platform = GTB_GoogleToolbar.getPlatform();
  1680.   if(event.button == 1 || 2 == platform && event.metaKey || 2 != platform && event.ctrlKey) {
  1681.     return nsCI.nsIBrowserDOMWindow.OPEN_NEWTAB}
  1682.   else if(event.shiftKey) {
  1683.     return nsCI.nsIBrowserDOMWindow.OPEN_NEWWINDOW}
  1684.   return nsCI.nsIBrowserDOMWindow.OPEN_DEFAULTWINDOW}
  1685.  
  1686. ;
  1687. GTB_GoogleToolbar.prototype._nonHttpOrGoogleDisableButtons = {gtbSearchSite:{enabled:"chrome://google-toolbar/skin/search-site.png", disabled:"chrome://google-toolbar/skin/search-site-disabled.png"}};
  1688. GTB_GoogleToolbar.prototype._enableDisableNonHttpOrGoogleButtons = function(url) {
  1689.   url = GTB_convertToUrl(url);
  1690.   var status = !GTB_isGoogleUrl(url) && url.scheme == "http";
  1691.   this._enableDisableButtons(status, this._nonHttpOrGoogleDisableButtons)}
  1692.  
  1693. ;
  1694. GTB_GoogleToolbar.prototype._noTermsDisableButtons = {gtbHighlight:{enabled:"chrome://google-toolbar/skin/highlight.png", disabled:"chrome://google-toolbar/skin/highlight-disabled.png"}};
  1695. GTB_GoogleToolbar.prototype._noTermsOrOpsDisableButtons = {gtbFeelingLucky:{enabled:"chrome://google-toolbar/skin/lucky.png", disabled:"chrome://google-toolbar/skin/lucky-disabled.png"}};
  1696. GTB_GoogleToolbar.prototype._enableDisableQueryButtons = function(hasTerms, hasOps) {
  1697.   this._enableDisableButtons(hasTerms, this._noTermsDisableButtons);
  1698.   this._enableDisableButtons(hasTerms || hasOps, this._noTermsOrOpsDisableButtons)}
  1699.  
  1700. ;
  1701. GTB_GoogleToolbar.prototype._enableDisableButtons = function(status, buttons) {
  1702.   for(var name in buttons) {
  1703.     var button = document.getElementById(name);
  1704.     if(button != null) {
  1705.       button.disabled = !status;
  1706.       var data = buttons[name];
  1707.       var image = data[status ? "enabled" : "disabled"];
  1708.       if(image) {
  1709.         button.image = image}
  1710.     }
  1711.   }
  1712. }
  1713.  
  1714. ;
  1715. GTB_GoogleToolbar.prototype.doGoogleSearch = function(event) {
  1716.   if(event.type == "click" && event.target.nodeName == "menuitem") {
  1717.     return}
  1718.   var forceNewTab = false;
  1719.   var searchType = this._SEARCH_TYPE;
  1720.   if(event.type == "keypress") {
  1721.     if(GTB_getPrefs().getBoolPref(GTB_PREF_REMEMBER_SEARCH_TYPE)) {
  1722.       if(event.keyCode == 38 && event.ctrlKey && this._GTB_PREV_SEARCH_LOOKUP[this._SEARCH_TYPE]) {
  1723.         this.switchButton(this._GTB_PREV_SEARCH_LOOKUP[this._SEARCH_TYPE])}
  1724.       if(event.keyCode == 40 && event.ctrlKey && this._GTB_NEXT_SEARCH_LOOKUP[this._SEARCH_TYPE]) {
  1725.         this.switchButton(this._GTB_NEXT_SEARCH_LOOKUP[this._SEARCH_TYPE])}
  1726.     }
  1727.     if(event.keyCode != 13) {
  1728.       return}
  1729.     if(event.altKey) {
  1730.       forceNewTab = true}
  1731.     if(GTB_LooksLikeUrl(this.getSearchText())) {
  1732.       this._setSuggestAlreadySearched(true);
  1733.       this._loadSearchURL(this.rememberSearchText(), forceNewTab);
  1734.       return}
  1735.     if(event.shiftKey) {
  1736.       searchType = "lucky"}
  1737.   }
  1738.   if(event.type == "command" && event.target.id != "gtbSearchButton") {
  1739.     searchType = "search"}
  1740.   this.doGoogleSearchType(event, searchType, false, forceNewTab)}
  1741.  
  1742. ;
  1743. GTB_GoogleToolbar.prototype._setSuggestAlreadySearched = function(alreadySearched) {
  1744.   var searchBox = document.getElementById("gtbGoogleSearchBox");
  1745.   if(searchBox != null) {
  1746.     searchBox.alreadySearched = alreadySearched}
  1747. }
  1748.  
  1749. ;
  1750. GTB_GoogleToolbar.prototype.doGoogleSearchType = function(event, name, opt_switchableSelection, opt_newTab) {
  1751.   var query = this.rememberSearchText();
  1752.   var search = this.GTB_SEARCH_TYPES[name];
  1753.   this._setSuggestAlreadySearched(true);
  1754.   this._loadSearchURL(search.url(query, this.getGoogleHome()), opt_newTab, event);
  1755.   if(opt_switchableSelection && GTB_getPrefs().getBoolPref(GTB_PREF_REMEMBER_SEARCH_TYPE)) {
  1756.     this.switchButton(search)}
  1757.   if(!GTB_getPrefs().hasUserValue(GTB_PREF_FIRST_SEARCH)) {
  1758.     GTB_getPrefs().setBoolPref(GTB_PREF_FIRST_SEARCH, true)}
  1759.   if(event) {
  1760.     event.preventBubble()}
  1761. }
  1762.  
  1763. ;
  1764. GTB_GoogleToolbar.prototype.switchButton = function(search) {
  1765.   if(typeof search == "string") {
  1766.     search = this.GTB_SEARCH_TYPES[search]}
  1767.   this._SEARCH_TYPE = search.name;
  1768.   var button = document.getElementById("gtbSearchButton");
  1769.   if(button == null) {
  1770.     return}
  1771.   button.image = search.image;
  1772.   button.label = search.label;
  1773.   button.setAttribute("tooltiptext", search.tip);
  1774.   this.chevron.doResize()}
  1775.  
  1776. ;
  1777. GTB_GoogleToolbar.prototype._ignoreClick = false;
  1778. GTB_GoogleToolbar.prototype._removeQueryOperators = function(query) {
  1779.   var return_query = query;
  1780.   var delete_ops = ["allinanchor:", "allintext:", "allintitle:", "allinurl:", /\band\b/gi, "author:", "bphonebook:", "define:", "ext:", "filetype:", "group:", "inanchor:", "insubject:", "intext:", "intitle:", "inurl:", "location:", "lucky:", "movie:", "msgid:", /\bor\b/gi, "phonebook:", "rphonebook:", "safesearch:", "source:", "spell:", "stocks:", "store:", /site:\S+\s*/, /link:\S+\s*/, /related:\S+\s*/];
  1781.   var quoteOffsetsList = [];
  1782.   var curOffset = query.indexOf('"');
  1783.   while(curOffset != -1) {
  1784.     quoteOffsetsList.push(curOffset);
  1785.     curOffset = query.indexOf('"', curOffset + 1)}
  1786.   var operatorReplaceString = function(str, offset, query) {
  1787.     var inScope = false;
  1788.     for(var quoteOffset in quoteOffsetsList) {
  1789.       if(offset < quoteOffsetsList[quoteOffset]) {
  1790.         break}
  1791.       else {
  1792.         inScope = !inScope}
  1793.     }
  1794.     if(inScope == true) {
  1795.       return str}
  1796.     else {
  1797.       return""}
  1798.   }
  1799.   
  1800.   ;
  1801.   var op;
  1802.   for(op in delete_ops) {
  1803.     return_query = return_query.replace(delete_ops[op], operatorReplaceString)}
  1804.   return return_query}
  1805.  
  1806. ;
  1807. GTB_GoogleToolbar.prototype._fillSearchBox = function(doc) {
  1808.   var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  1809.   var xpcomUrl = ios.newURI(doc.location.href, null, null);
  1810.   if(!(xpcomUrl  instanceof Components.interfaces.nsIURL))return;
  1811.   if(!GTB_isGoogleUrl(xpcomUrl)) {
  1812.     return}
  1813.   if(!xpcomUrl.query || xpcomUrl.query.length == 0) {
  1814.     return}
  1815.   var textBox = document.getElementById("gtbGoogleSearchBox");
  1816.   var args = GTB_parseQueryString(xpcomUrl.query);
  1817.   if(xpcomUrl.filePath != "/url" && args && args != {}) {
  1818.     var queryString = args["q"];
  1819.     if(!queryString) {
  1820.       queryString = args["as_q"]}
  1821.     if(queryString && (!textBox || queryString != textBox.value)) {
  1822.       if(textBox) {
  1823.         textBox.value = queryString;
  1824.         this.rememberSearchText()}
  1825.       var answer = this.highlighter.onSearchTextChanged(queryString);
  1826.       this._enableDisableQueryButtons(answer.hasTerms, answer.hasOps)}
  1827.   }
  1828. }
  1829.  
  1830. ;
  1831. GTB_GoogleToolbar.prototype.getGoogleHome = function() {
  1832.   return GTB_getPrefs().getStringPref(GTB_PREF_GOOGLE_HOME)}
  1833.  
  1834. ;
  1835. GTB_GoogleToolbar.prototype.getSearchText = function() {
  1836.   var textBox = document.getElementById("gtbGoogleSearchBox");
  1837.   if(textBox == null) {
  1838.     return""}
  1839.   return textBox.value}
  1840.  
  1841. ;
  1842. GTB_GoogleToolbar.prototype.rememberSearchText = function() {
  1843.   var text = this.getSearchText();
  1844.   this.sendMessage("GTB_SEARCH_PERFORMED", text);
  1845.   return text}
  1846.  
  1847. ;
  1848. GTB_GoogleToolbar.prototype.getHlFlag = function() {
  1849.   return"?hl=" + this.languageCode}
  1850.  
  1851. ;
  1852. GTB_GoogleToolbar.prototype.maybeShowUsage = function(pref, url, opt_flags) {
  1853.   if(!GTB_getPrefs().getBoolPrefWithDefault(pref, false)) {
  1854.     GTB_getPrefs().setBoolPref(pref, true);
  1855.     OptionsDialog.more(window, this.languageCode, url, opt_flags);
  1856.     return true}
  1857.   return false}
  1858.  
  1859. ;
  1860. GTB_GoogleToolbar._eventHack_onFieldKeyPress = function(event) {
  1861.   if(event.keyCode != KeyEvent.DOM_VK_RETURN) {
  1862.     return}
  1863.   var field = event.target;
  1864.   var acfield = field;
  1865.   if("mTextbox"  in  field) {
  1866.     acfield = field.mTextbox}
  1867.   var contractIDKey = acfield.getAttribute("autocompletesearch");
  1868.   var contractID = "@mozilla.org/autocomplete/search;1?name=" + contractIDKey;
  1869.   var searchService = Components.classes[contractID].getService(Components.interfaces.nsIAutoCompleteSearch);
  1870.   acfield.mEnterEvent = null;
  1871.   acfield.onTextEntered(event);
  1872.   searchService.stopSearch()}
  1873.  
  1874. ;
  1875. GTB_GoogleToolbar.applyStyles = function() {
  1876.   var platform = GTB_GoogleToolbar.getPlatform();
  1877.   var googleSearchBox = document.getElementById("gtbGoogleSearchBox");
  1878.   if(!googleSearchBox) {
  1879.     return}
  1880.   var searchBox = googleSearchBox.textBox;
  1881.   searchBox.maxLength = 256;
  1882.   switch(platform) {
  1883.     case 1:searchBox.style.MozAppearance = "none";
  1884.     searchBox.style.border = "none";
  1885.     break;
  1886.     case 2:searchBox.style.marginTop = "1px";
  1887.     break;
  1888.     case 3:var innerBox = document.getAnonymousElementByAttribute(searchBox, "class", "autocomplete-textbox-container");
  1889.     innerBox.style.MozAppearance = "none";
  1890.     innerBox.style.border = "none";
  1891.     googleSearchBox.style.MozAppearance = "menulist-textfield";
  1892.     break}
  1893. }
  1894.  
  1895. ;
  1896. GTB_GoogleToolbar.getPlatform = function() {
  1897.   var platform = Components.classes["@mozilla.org/network/protocol;1?name=http"].getService(Components.interfaces.nsIHttpProtocolHandler).oscpu;
  1898.   if(platform.indexOf("Win") != -1) {
  1899.     return 1}
  1900.   else if(platform.indexOf("Mac") != -1) {
  1901.     return 2}
  1902.   else if(platform.indexOf("Linux") != -1 || platform.indexOf("FreeBSD") != -1) {
  1903.     return 3}
  1904. }
  1905.  
  1906. ;
  1907. function GTB_findContainingWindow(varname) {
  1908.   var candidate = window;
  1909.   while(candidate != null) {
  1910.     if(candidate[varname]) {
  1911.       return candidate}
  1912.     candidate = candidate.opener}
  1913.   try {
  1914.     var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator)}
  1915.   catch(e) {
  1916.     return null}
  1917.   if(windowMediator) {
  1918.     var browser = windowMediator.getMostRecentWindow("navigator:browser");
  1919.     if(browser && browser[varname]) {
  1920.       return browser}
  1921.   }
  1922. }
  1923.  
  1924. function GTB_getToolbar() {
  1925.   var varname = "GTB_GoogleToolbarOverlay";
  1926.   var candidate = GTB_findContainingWindow(varname);
  1927.   if(!candidate) {
  1928.     return null}
  1929.   return candidate[varname]}
  1930.  
  1931. function GTB_getPrefs() {
  1932.   var prefs = GTB_getToolbar().prefs;
  1933.   return prefs}
  1934.  
  1935. function GTB_perTabData() {
  1936.   var ptd = GTB_getToolbar().perTabData;
  1937.   return ptd}
  1938.  
  1939. function GTB_GTO_onfocus(event) {
  1940.   if(!GTB_GoogleToolbarOverlay._firstRunShown) {
  1941.     GTB_GoogleToolbarOverlay._firstRunShown = true;
  1942.     GTB_GoogleToolbarOverlay.showFirstRunDialog()}
  1943. }
  1944.  
  1945. function GTB_GTO_onGoogleSearchInput(event) {
  1946.   var answer = GTB_GoogleToolbarOverlay.highlighter.onSearchTextChanged(null);
  1947.   GTB_GoogleToolbarOverlay._enableDisableQueryButtons(answer.hasTerms, answer.hasOps)}
  1948.  
  1949. function GTB_GTO_onGoogleSearch(event) {
  1950.   GTB_GoogleToolbarOverlay.doGoogleSearch(event)}
  1951.  
  1952. function GTB_GTO_onGoogleSearchType(event, name, opt_switchableSelection, opt_newTab) {
  1953.   GTB_GoogleToolbarOverlay.doGoogleSearchType(event, name, opt_switchableSelection, opt_newTab)}
  1954.  
  1955. function GTB_GTO_onGoogleSearchSelect(event) {
  1956.   if(GTB_getPrefs().getBoolPref(GTB_PREF_SEARCH_ON_SELECT)) {
  1957.     GTB_GTO_onGoogleSearch(event)}
  1958.   var overlay = GTB_getToolbar();
  1959.   var query = overlay.getSearchText();
  1960.   var answer = overlay.highlighter.onSearchTextChanged(query);
  1961.   overlay._enableDisableQueryButtons(answer.hasTerms, answer.hasOps)}
  1962.  
  1963. function GTB_GTO_onSearchBoxMouseDown(event, element) {
  1964.   if(element.hasAttribute("focused")) {
  1965.     GTB_GoogleToolbarOverlay._ignoreClick = true}
  1966.   else {
  1967.     GTB_GoogleToolbarOverlay._ignoreClick = false;
  1968.     element.inputField.setSelectionRange(0, 0)}
  1969. }
  1970.  
  1971. function GTB_GTO_onSearchBoxClick(event, element) {
  1972.   if(!GTB_GoogleToolbarOverlay._ignoreClick && (!element.inputField.selectionStart || !element.inputField.selectionEnd || element.inputField.selectionStart == element.inputField.selectionEnd)) {
  1973.     element.select()}
  1974. }
  1975.  
  1976. function GTB_GTO_onSearchBoxFocusKey(event) {
  1977.   var toolbar = document.getElementById("gtbToolbar");
  1978.   if(toolbar != null) {
  1979.     var element = document.getElementById("gtbGoogleSearchBox");
  1980.     if(element != null && (!element.parentNode || element.parentNode.parentNode != toolbar || !toolbar.collapsed)) {
  1981.       if(!element.inputField.selectionStart || !element.inputField.selectionEnd || element.inputField.selectionStart == element.inputField.selectionEnd) {
  1982.         element.select()}
  1983.       GTB_GoogleToolbarOverlay._ignoreClick = true;
  1984.       element.focus()}
  1985.   }
  1986. }
  1987.  
  1988. function GTB_GTO_onAutoFill(event) {
  1989.   GTB_GoogleToolbarOverlay.autoFill.doAutoFill(event)}
  1990.  
  1991. function GTB_GTO_onBlogger(event) {
  1992.   var htmldoc = GTB_GoogleToolbarOverlay._getCurrentDocument();
  1993.   var title = GTB_safeUrlEscape(htmldoc.title, 1000);
  1994.   var location = GTB_safeUrlEscape(htmldoc.location.href, 256);
  1995.   var text = htmldoc.getSelection();
  1996.   var url;
  1997.   try {
  1998.     url = GTB_getPrefs().getStringPref("blogthis_url")}
  1999.   catch(e) {
  2000.     url = "http://www.blogger.com/blog-this.g?source=toolbar-firefox&u=$1&n=$2&t=$3"}
  2001.   url = url.replace("$1", location);
  2002.   url = url.replace("$2", title);
  2003.   url = url.replace("$3", GTB_safeUrlEscape(text, 2048 - url.length - 4));
  2004.   var target = GTB_GoogleToolbarOverlay.getLoadUrlTarget(event);
  2005.   if(nsCI.nsIBrowserDOMWindow.OPEN_NEWTAB == target) {
  2006.     var tabbrowser = GTB_GoogleToolbarOverlay._getTabBrowser();
  2007.     tabbrowser.selectedTab = tabbrowser.addTab(url)}
  2008.   else {
  2009.     window.open(url, null, "width=500,height=350,toolbar=no,location=no,directores=no,menubar=no,status=yes,scrollbars=yes")}
  2010. }
  2011.  
  2012. function GTB_GTO_onSpellCheck(event) {
  2013.   if(event.type == "click" && event.target.nodeName == "menuitem" || event.type == "command" && event.target.nodeName == "menuitem") {
  2014.     return}
  2015.   GTB_GoogleToolbarOverlay.spellCheck.run()}
  2016.  
  2017. function GTB_GTO_onSpellCheckAutoFix(event) {
  2018.   GTB_GoogleToolbarOverlay.spellCheck.runAutoFix()}
  2019.  
  2020. function GTB_GTO_onGoogleOptions(event) {
  2021.   window.openDialog("chrome://google-toolbar/content/options.xul", "gtbOptions", "modal,centerscreen,chrome,resizable=no");
  2022.   event.preventBubble()}
  2023.  
  2024. function GTB_GTO_onHighlight(event) {
  2025.   GTB_GoogleToolbarOverlay.highlighter.toggle()}
  2026.  
  2027. function GTB_GTO_onFindTerm(event, index) {
  2028.   GTB_GoogleToolbarOverlay.highlighter.findTerm(index, !event.shiftKey);
  2029.   event.preventBubble()}
  2030.  
  2031. function GTB_GTO_onGoogleHomePage(event) {
  2032.   var url = GTB_SearchUrl("www", GTB_GoogleToolbarOverlay.getGoogleHome(), "webhp", "");
  2033.   GTB_GoogleToolbarOverlay.loadUrlWithModifiers(url, event);
  2034.   event.preventBubble()}
  2035.  
  2036. function GTB_GTO_onGoogleClearSearchHist(event) {
  2037.   GTB_GoogleToolbarOverlay.sendMessage("GTB_CLEAR_HISTORY", null);
  2038.   event.preventBubble()}
  2039.  
  2040. function GTB_GTO_onGoogleHelp(event) {
  2041.   var url = "http://www.google.com/support/toolbar" + GTB_GoogleToolbarOverlay.getHlFlag();
  2042.   GTB_GoogleToolbarOverlay.loadUrlWithModifiers(url, event);
  2043.   event.preventBubble()}
  2044.  
  2045. function GTB_GTO_onGooglePrivacy(event) {
  2046.   GTB_FirstRun_onPageRankConfirmHelp();
  2047.   event.preventBubble()}
  2048.  
  2049. function GTB_GTO_onGoogleUninstall(event) {
  2050.   window.openDialog("chrome://google-toolbar/content/uninstall.xul", null, "width=640,height=400", GTB_GoogleToolbarOverlay.languageCode);
  2051.   event.preventBubble()}
  2052.  
  2053. function GTB_GTO_onAboutGoogleToolbar(event) {
  2054.   window.openDialog("chrome://google-toolbar/content/about.xul", "gtbAbout", "modal,centerscreen,chrome,resizable=no");
  2055.   event.preventBubble()}
  2056.  
  2057. function GTB_GTO_onPageLoad(event) {
  2058.   var doc = event.target;
  2059.   var tabBrowser = GTB_GoogleToolbarOverlay._getTabBrowser();
  2060.   var browser;
  2061.   for(var b = 0;b < tabBrowser.browsers.length;b ++ ) {
  2062.     if(tabBrowser.browsers[b].contentWindow.document == doc) {
  2063.       browser = tabBrowser.browsers[b];
  2064.       break}
  2065.   }
  2066.   if(GTB_GoogleToolbarOverlay._getCurrentBrowser() == browser) {
  2067.     GTB_GoogleToolbarOverlay._fillSearchBox(doc);
  2068.     GTB_GoogleToolbarOverlay.highlighter.onPageLoad();
  2069.     GTB_GoogleToolbarOverlay.mailto.onPageLoad(event);
  2070.     GTB_GoogleToolbarOverlay._enableDisableNonHttpOrGoogleButtons(doc.location.href)}
  2071.   GTB_perTabData().onPageLoad(event);
  2072.   GTB_GoogleToolbarOverlay.nextPrev.doPageLoad(browser);
  2073.   GTB_GoogleToolbarOverlay.upButton._setUpButton(event);
  2074.   GTB_GoogleToolbarOverlay.infoButton.onPageChange(event);
  2075.   GTB_GoogleToolbarOverlay.spellCheck.doPageLoad(event);
  2076.   GTB_GoogleToolbarOverlay.pageRank.doPageLoad(event);
  2077.   GTB_GoogleToolbarOverlay.autoLink.doPageLoad(event);
  2078.   GTB_GoogleToolbarOverlay.autoFill.doPageLoad(event);
  2079.   GTB_GoogleToolbarOverlay.feedSubscribe.doPageShowOrLoad(event)}
  2080.  
  2081. function GTB_GTO_onPageUnLoad(event) {
  2082.   GTB_GoogleToolbarOverlay.autoLink.doPageUnload(event);
  2083.   GTB_GoogleToolbarOverlay.feedSubscribe.doPageHideOrUnload(event)}
  2084.  
  2085. function GTB_GTO_onPageShow(event) {
  2086.   if(!event.persisted) {
  2087.     return}
  2088.   var doc = event.target;
  2089.   var tabBrowser = GTB_GoogleToolbarOverlay._getTabBrowser();
  2090.   var browser;
  2091.   for(var b = 0;b < tabBrowser.browsers.length;b ++ ) {
  2092.     if(tabBrowser.browsers[b].contentWindow.document == doc) {
  2093.       browser = tabBrowser.browsers[b];
  2094.       break}
  2095.   }
  2096.   if(GTB_GoogleToolbarOverlay._getCurrentBrowser() == browser) {
  2097.     GTB_GoogleToolbarOverlay._fillSearchBox(doc);
  2098.     GTB_GoogleToolbarOverlay.highlighter.onPageLoad();
  2099.     GTB_GoogleToolbarOverlay._enableDisableNonHttpOrGoogleButtons(doc.location.href)}
  2100.   GTB_GoogleToolbarOverlay.nextPrev.doPageLoad(browser);
  2101.   GTB_GoogleToolbarOverlay.upButton._setUpButton(event);
  2102.   GTB_GoogleToolbarOverlay.infoButton.onPageChange(event);
  2103.   GTB_GoogleToolbarOverlay.spellCheck.doPageLoad(event);
  2104.   GTB_GoogleToolbarOverlay.pageRank.doPageLoad(event);
  2105.   GTB_GoogleToolbarOverlay.autoLink.doPageShow(event);
  2106.   GTB_GoogleToolbarOverlay.autoFill.doPageLoad(event);
  2107.   GTB_GoogleToolbarOverlay.feedSubscribe.doPageShowOrLoad(event)}
  2108.  
  2109. function GTB_GTO_onPageHide(event) {
  2110.   GTB_GoogleToolbarOverlay.spellCheck.doPageHide(event);
  2111.   GTB_GoogleToolbarOverlay.highlighter.doPageHide(event);
  2112.   GTB_GoogleToolbarOverlay.autoLink.doPageHide(event);
  2113.   GTB_GoogleToolbarOverlay.nextPrev.doPageHide(event);
  2114.   GTB_GoogleToolbarOverlay.feedSubscribe.doPageHideOrUnload(event)}
  2115.  
  2116. function GTB_GTO_onTabSwitch(event) {
  2117.   if(event.target == null || event.target.localName != "tabs") {
  2118.     return}
  2119.   var doc = GTB_GoogleToolbarOverlay._getCurrentDocument();
  2120.   GTB_GoogleToolbarOverlay._enableDisableNonHttpOrGoogleButtons(doc.location.href);
  2121.   GTB_GoogleToolbarOverlay.upButton._setUpButton(event);
  2122.   GTB_GoogleToolbarOverlay.infoButton.onPageChange(event);
  2123.   GTB_GoogleToolbarOverlay._fillSearchBox(doc);
  2124.   GTB_GoogleToolbarOverlay.highlighter.onTabSwitch();
  2125.   GTB_GoogleToolbarOverlay.nextPrev.doTabSwitch(event);
  2126.   GPR_onTabSwitch(event);
  2127.   GTB_GoogleToolbarOverlay.autoLink.doTabSwitch(event);
  2128.   GTB_GoogleToolbarOverlay.feedSubscribe.doTabSwitch();
  2129.   GTB_GoogleToolbarOverlay.autoFill.doTabSwitch(event);
  2130.   GTB_GoogleToolbarOverlay.spellCheck.doTabSwitch(event);
  2131.   GTB_GoogleToolbarOverlay.sendMessage("GTB_TABSWITCH", 0)}
  2132.  
  2133. function GTB_GTO_onMouseMove(event) {
  2134.   GTB_GoogleToolbarOverlay.tooltip.doMouseMove(event)}
  2135.  
  2136. function GTB_GTO_onGoogleShowToolbar(opt_event) {
  2137.   GTB_GTO_setGoogleToolbarCollapsed(false);
  2138.   if(opt_event) {
  2139.     opt_event.preventBubble()}
  2140. }
  2141.  
  2142. function GTB_GTO_setGoogleToolbarCollapsed(isCollapsed) {
  2143.   var windows = GTB_getBrowserWindows();
  2144.   for(var win = null, i = 0;win = windows[i]; ++ i) {
  2145.     var toolbar = win.document.getElementById("gtbToolbar");
  2146.     toolbar.collapsed = isCollapsed;
  2147.     win.document.persist(toolbar.id, "collapsed")}
  2148. }
  2149.  
  2150. function GTB_GTO_onSearchButtonPopup(event) {
  2151.   var toolbar = document.getElementById("gtbToolbar");
  2152.   var showToolbarMenuItem = document.getElementById("gtbSearchMenuShowToolbar");
  2153.   var showToolbarSep = document.getElementById("gtbShowToolbarSep");
  2154.   showToolbarMenuItem.hidden = !toolbar.collapsed;
  2155.   showToolbarSep.hidden = !toolbar.collapsed;
  2156.   var gto = GTB_getToolbar();
  2157.   for(var buttonId in gto.menuItemIds) {
  2158.     if(!gto.availableButtons[buttonId]) {
  2159.       var menuItemId = gto.menuItemIds[buttonId];
  2160.       var mi = document.getElementById(menuItemId);
  2161.       mi.hidden = true}
  2162.   }
  2163. }
  2164.  
  2165. function GTB_GTO_replaceSearchBox(useGoogleBox) {
  2166.   var windows = GTB_getBrowserWindows();
  2167.   for(var win = null, i = 0;win = windows[i]; ++ i) {
  2168.     var doc = win.document;
  2169.     var overlay = win.GTB_GoogleToolbarOverlay;
  2170.     var navToolbar = doc.getElementById("nav-bar");
  2171.     var searchBox = doc.getElementById("gtbSearchBox");
  2172.     var searchContainer = doc.getElementById("search-container");
  2173.     if(navToolbar != null) {
  2174.       var origWindow = window;
  2175.       var origDocument = document;
  2176.       window = win;
  2177.       document = doc;
  2178.       try {
  2179.         if(useGoogleBox) {
  2180.           overlay._removeButton("gtbSearchBox");
  2181.           navToolbar.insertItem("gtbSearchBox", null, null, false);
  2182.           if(searchContainer != null) {
  2183.             navToolbar.removeChild(searchContainer)}
  2184.         }
  2185.         else {
  2186.           if(searchContainer == null) {
  2187.             navToolbar.insertItem("search-container", null, null, false)}
  2188.           if(searchBox != null && searchBox.parent == navToolbar) {
  2189.             navToolbar.removeChild(searchBox)}
  2190.           overlay._removeButton("gtbSearchBox");
  2191.           overlay._addButton("gtbSearchBox")}
  2192.       }
  2193.       catch(e) {
  2194.         GTB_Dump(GTB_Dump.TB, e)}
  2195.       overlay.handleCustomize();
  2196.       window = origWindow;
  2197.       document = origDocument}
  2198.   }
  2199. }
  2200.  
  2201. function GTB_GTO_onClickMiddleMouse(event) {
  2202.   if("click" != event.type || 1 != event.button) {
  2203.     return}
  2204.   if(event.currentTarget) {
  2205.     var cmd = event.currentTarget.getAttribute("oncommand");
  2206.     if(cmd && cmd.length > 0) {
  2207.       eval(cmd);
  2208.       var target = event.target;
  2209.       if("menuitem" == target.nodeName && target.parentNode && "menupopup" == target.parentNode.nodeName) {
  2210.         target.parentNode.hidePopup()}
  2211.     }
  2212.   }
  2213. }
  2214.  
  2215. function GTB_AT_onTranslationAlert(value) {
  2216.   GTB_GoogleToolbarOverlay.autoTranslate.showTranslationAlert(value)}
  2217.  
  2218. function GTB_Chevron_onShowMenu(event, menu) {
  2219.   GTB_GoogleToolbarOverlay.chevron.onShowMenu(event, menu)}
  2220.  
  2221. function GTB_AutoFillManager() {
  2222. }
  2223.  
  2224. GTB_AutoFillManager._CONTAINER_TAG = "autofill";
  2225. GTB_AutoFillManager._initRegexp = function() {
  2226.   var regexps = GTB_AutoFillManager._fieldRegexps;
  2227.   for(var j = 0;j < regexps.length; ++ j) {
  2228.     if(!regexps[j].disable && !regexps[j].regexp) {
  2229.       var theRegexp = "";
  2230.       for(var k = 0;k < regexps[j].reg.length; ++ k) {
  2231.         if(k != 0) {
  2232.           theRegexp += "|"}
  2233.         theRegexp += "(\\b" + regexps[j].reg[k] + "\\b)"}
  2234.       regexps[j].regexp = null;
  2235.       if(theRegexp.length > 0) {
  2236.         regexps[j].regexp = new RegExp(theRegexp, "i")}
  2237.     }
  2238.   }
  2239. }
  2240.  
  2241. ;
  2242. GTB_AutoFillManager._stringTrim = function(theString, minimal_trim) {
  2243.   var temp = theString;
  2244.   temp = temp.replace(/\n/g, " ");
  2245.   if(!minimal_trim) {
  2246.     temp = temp.replace(/\ \;/g, " ").replace(/[^\w\s\d#\/-]/g, " ");
  2247.     if(/^\s*[\/-]\s*$/.test(temp)) {
  2248.       return""}
  2249.   }
  2250.   var regexp = /^\s*(.*\S)\s*$/;
  2251.   if(regexp.test(temp)) {
  2252.     return temp.replace(regexp, "$1").replace(/\s\s+/g, " ")}
  2253.   else {
  2254.     return""}
  2255. }
  2256.  
  2257. ;
  2258. GTB_AutoFillManager._decorateInputTags = function(node, tableHead, row, column) {
  2259.   var doc = node && node.ownerDocument;
  2260.   var nodes = doc.evaluate(".//input[@type='text'] | .//select[@type='select-one']", node, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
  2261.   var first = nodes.iterateNext();
  2262.   var node = first;
  2263.   while(node) {
  2264.     node.GTB_AUTOFILL_tableInfo = {tableHead:tableHead, row:row, column:column};
  2265.     node = nodes.iterateNext()}
  2266.   return first != null}
  2267.  
  2268. ;
  2269. GTB_AutoFillManager._lookForText = function(node, allowOptionsTag) {
  2270.   if(node.nodeName == "SCRIPT" || !allowOptionsTag && node.nodeName == "OPTION") {
  2271.     return null}
  2272.   var text = "";
  2273.   if(node.nodeType == Node.TEXT_NODE) {
  2274.     text = GTB_AutoFillManager._stringTrim(node.nodeValue, allowOptionsTag);
  2275.     if(text.length) {
  2276.       return{node:node, text:text}}
  2277.   }
  2278.   text = "";
  2279.   var firstNode = null;
  2280.   var kids = node.childNodes;
  2281.   for(var i = 0;i < kids.length; ++ i) {
  2282.     var result = GTB_AutoFillManager._lookForText(kids[i], allowOptionsTag);
  2283.     if(result) {
  2284.       if(text.length) {
  2285.         text = text + " " + result.text}
  2286.       else {
  2287.         firstNode = result.node;
  2288.         text = result.text}
  2289.       if(text.length > 100) {
  2290.         return{node:firstNode, text:text}}
  2291.     }
  2292.   }
  2293.   if(text.length) {
  2294.     return{node:firstNode, text:text}}
  2295.   else {
  2296.     return null}
  2297. }
  2298.  
  2299. ;
  2300. GTB_AutoFillManager._findOptionsText = function(node, number) {
  2301.   var resultArray = [];
  2302.   var count = 0;
  2303.   for(var i = 0;i < node.options.length; ++ i) {
  2304.     var result = GTB_AutoFillManager._lookForText(node.options[i], true);
  2305.      ++ count;
  2306.     if(result) {
  2307.       resultArray.push(result.text)}
  2308.     else {
  2309.       resultArray.push("")}
  2310.     if(count > number) {
  2311.       break}
  2312.   }
  2313.   return resultArray}
  2314.  
  2315. ;
  2316. GTB_AutoFillManager._findLabelFromSibling = function(node) {
  2317.   var prevWalker = node;
  2318.   while(prevWalker) {
  2319.     var result = GTB_AutoFillManager._lookForText(prevWalker, false);
  2320.     if(result) {
  2321.       return result}
  2322.     prevWalker = prevWalker.previousSibling}
  2323.   return null}
  2324.  
  2325. ;
  2326. GTB_AutoFillManager._findLabelGeneric = function(inputNode, reallySimple) {
  2327.   var parentWalker = inputNode;
  2328.   while(parentWalker && parentWalker.nodeName != "BODY") {
  2329.     var result = GTB_AutoFillManager._findLabelFromSibling(parentWalker.previousSibling);
  2330.     if(result) {
  2331.       return result}
  2332.     if(reallySimple) {
  2333.       return null}
  2334.     parentWalker = parentWalker.parentNode}
  2335.   return null}
  2336.  
  2337. ;
  2338. GTB_AutoFillManager._constructTableInMemory = function(tableHead) {
  2339.   var tableMatrix = [];
  2340.   var rowNum = 0;
  2341.   var tableRows = tableHead.rows;
  2342.   for(var i = 0;i < tableRows.length; ++ i) {
  2343.     var columnNum = 0;
  2344.     var tableColumns = tableRows[i].cells;
  2345.     for(var j = 0;j < tableColumns.length; ++ j) {
  2346.       var tableEntry = tableColumns[j];
  2347.       var columnWidth = 1;
  2348.       if(tableEntry.getAttribute("colspan")) {
  2349.         columnWidth = parseInt(tableEntry.getAttribute("colspan"))}
  2350.       if(tableEntry.getAttribute("rowspan") && parseInt(tableEntry.getAttribute("rowspan")) != 1) {
  2351.         GTB_AutoFillManager._dump("Ignoring the rowspan!\n");
  2352.         continue}
  2353.       var foundInputTags = GTB_AutoFillManager._decorateInputTags(tableEntry, tableHead, rowNum, columnNum);
  2354.       var textResults = null;
  2355.       if(!foundInputTags) {
  2356.         textResults = GTB_AutoFillManager._lookForText(tableEntry, false)}
  2357.       if(textResults || foundInputTags) {
  2358.         for(var k = 0;k < columnWidth; ++ k) {
  2359.           tableMatrix[rowNum + "," + columnNum] = {textData:textResults, hasInputTags:foundInputTags};
  2360.            ++ columnNum}
  2361.       }
  2362.       else {
  2363.         columnNum += columnWidth}
  2364.     }
  2365.      ++ rowNum}
  2366.   return tableMatrix}
  2367.  
  2368. ;
  2369. GTB_AutoFillManager._findTableHead = function(node) {
  2370.   var walker = node;
  2371.   while(walker != null && walker.nodeName != "BODY" && walker.nodeName != "TABLE" && walker.nodeName != "TBODY") {
  2372.     walker = walker.parentNode}
  2373.   if(walker.nodeName != "TABLE" && walker.nodeName != "TBODY") {
  2374.     return null}
  2375.   return walker}
  2376.  
  2377. ;
  2378. GTB_AutoFillManager._findInputNodeInTable = function(inputNode) {
  2379.   var tableHead = GTB_AutoFillManager._findTableHead(inputNode);
  2380.   if(tableHead == null) {
  2381.     return null}
  2382.   var tableMatrix = null;
  2383.   if(tableHead.GTB_AUTOFILL_tableMatrix != null) {
  2384.     tableMatrix = tableHead.GTB_AUTOFILL_tableMatrix}
  2385.   else {
  2386.     tableMatrix = GTB_AutoFillManager._constructTableInMemory(tableHead);
  2387.     if(tableMatrix == null) {
  2388.       return null}
  2389.     tableHead.GTB_AUTOFILL_tableMatrix = tableMatrix}
  2390.   if(inputNode.GTB_AUTOFILL_tableInfo != null) {
  2391.     var row = inputNode.GTB_AUTOFILL_tableInfo.row;
  2392.     var column = inputNode.GTB_AUTOFILL_tableInfo.column;
  2393.     return{table:tableMatrix, row:row, column:column}}
  2394.   GTB_AutoFillManager._dump("Input element not found in table\n");
  2395.   return null}
  2396.  
  2397. ;
  2398. GTB_AutoFillManager._lookupTableElement = function(table, row, column) {
  2399.   return table[row + "," + column]}
  2400.  
  2401. ;
  2402. GTB_AutoFillManager._findLabelsInSameColumn = function(nodeLoc) {
  2403.   var columnResult = null;
  2404.   var startRow = nodeLoc.row - 2;
  2405.   if(startRow < 0) {
  2406.     startRow = 0}
  2407.   for(var i = startRow;i < nodeLoc.row; ++ i) {
  2408.     var result = GTB_AutoFillManager._lookupTableElement(nodeLoc.table, i, nodeLoc.column);
  2409.     if(result) {
  2410.       if(result.hasInputTags) {
  2411.         GTB_AutoFillManager._dump(" +c " + i + " null\n");
  2412.         columnResult = null}
  2413.       else if(result.textData) {
  2414.         GTB_AutoFillManager._dump(" +c " + i + " " + result.textData.text + "\n");
  2415.         columnResult = result.textData}
  2416.     }
  2417.   }
  2418.   return columnResult}
  2419.  
  2420. ;
  2421. GTB_AutoFillManager._findLabelsInSameRow = function(nodeLoc) {
  2422.   var rowResult = null;
  2423.   if(nodeLoc.column == 0) {
  2424.     return null}
  2425.   for(var i = nodeLoc.column - 1;i >= 0; -- i) {
  2426.     var result = GTB_AutoFillManager._lookupTableElement(nodeLoc.table, nodeLoc.row, i);
  2427.     if(result) {
  2428.       if(result.hasInputTags) {
  2429.         GTB_AutoFillManager._dump(" +r " + i + " null\n");
  2430.         return rowResult}
  2431.       else if(result.textData) {
  2432.         GTB_AutoFillManager._dump(" +r " + i + " " + result.textData.text + "\n");
  2433.         rowResult = result.textData}
  2434.     }
  2435.   }
  2436.   return rowResult}
  2437.  
  2438. ;
  2439. GTB_AutoFillManager._findLabelFromTable = function(inputNode) {
  2440.   var columnResults = {text:null, node:null};
  2441.   var rowResults = {text:null, node:null};
  2442.   var findResult = GTB_AutoFillManager._findInputNodeInTable(inputNode);
  2443.   if(findResult == null) {
  2444.     GTB_AutoFillManager._dump("No node found in table\n");
  2445.     return{rowResults:rowResults, columnResults:columnResults}}
  2446.   var result = GTB_AutoFillManager._findLabelsInSameRow(findResult);
  2447.   if(result) {
  2448.     rowResults = result}
  2449.   result = GTB_AutoFillManager._findLabelsInSameColumn(findResult);
  2450.   if(result) {
  2451.     columnResults = result}
  2452.   return{rowResults:rowResults, columnResults:columnResults}}
  2453.  
  2454. ;
  2455. GTB_AutoFillManager._findFormInfo = function(doc) {
  2456.   var results = [];
  2457.   if(!doc || !doc.forms) {
  2458.     return results}
  2459.   var forms = doc.forms;
  2460.   var formsLength = forms.length;
  2461.   for(var i = 0;i < formsLength; ++ i) {
  2462.     var form = forms[i];
  2463.     var formLength = form.length;
  2464.     for(var j = 0;j < formLength; ++ j) {
  2465.       var input = form[j];
  2466.       if(input.name != null && input.name != "" && input.getAttribute("onclick") == null) {
  2467.         var typeName = input.type;
  2468.         if(typeName == "text" || typeName == "select-one") {
  2469.           var newElem = {input:input, type:typeName};
  2470.           results.push(newElem)}
  2471.       }
  2472.     }
  2473.   }
  2474.   return results}
  2475.  
  2476. ;
  2477. GTB_AutoFillManager._dump = function(string) {
  2478. }
  2479.  
  2480. ;
  2481. GTB_AutoFillManager._setTheDropDownSelection = function(input, text, index) {
  2482.   input.selectedIndex = -1;
  2483.   input.selectedIndex = index;
  2484.   if(input.selectedIndex == -1) {
  2485.     input.value = text}
  2486. }
  2487.  
  2488. ;
  2489. GTB_AutoFillManager._chooseDropDownSelection = function(autofillFieldsEntry, userPref, autofillUserPreferences) {
  2490.   var optionsArray = this._findOptionsText(autofillFieldsEntry.input, 1000);
  2491.   if(optionsArray.length == 0) {
  2492.     return null}
  2493.   var userPrefLower = userPref.toLowerCase();
  2494.   var substringMatchIndex = -1;
  2495.   var userPrefRegexp = new RegExp("\\b" + userPrefLower + "\\b");
  2496.   var optionsHash = [];
  2497.   for(var i = 0;i < optionsArray.length; ++ i) {
  2498.     var optionString = optionsArray[i].toLowerCase();
  2499.     optionsHash[optionString] = i;
  2500.     if(optionString == userPrefLower) {
  2501.       return{value:optionsArray[i], index:i}}
  2502.     if(substringMatchIndex == -1 && userPrefRegexp.test(optionString)) {
  2503.       substringMatchIndex = i}
  2504.   }
  2505.   var index = optionsHash[userPrefLower];
  2506.   if(index != null) {
  2507.     return{value:optionsArray[index], index:index}}
  2508.   if(autofillFieldsEntry.fillFieldDataType == "state") {
  2509.     var stateAlt = autofillUserPreferences.stateAlt;
  2510.     if(stateAlt) {
  2511.       var index = optionsHash[stateAlt.toLowerCase()];
  2512.       if(index != null) {
  2513.         return{value:optionsArray[index], index:index}}
  2514.     }
  2515.   }
  2516.   if(autofillFieldsEntry.fillFieldDataType == "country" && userPref == GTB_AutoFillManager.US) {
  2517.     var index = optionsHash["usa"];
  2518.     if(index != null) {
  2519.       return{value:optionsArray[index], index:index}}
  2520.     var index = optionsHash["us"];
  2521.     if(index != null) {
  2522.       return{value:optionsArray[index], index:index}}
  2523.   }
  2524.   if(substringMatchIndex != -1) {
  2525.     index = substringMatchIndex;
  2526.     return{value:optionsArray[index], index:index}}
  2527.   return null}
  2528.  
  2529. ;
  2530. function GTB_AutoFillPreview_onLoad(event) {
  2531.   var matches = window.arguments[0];
  2532.   var rows = document.getElementById("gtbAutoFillPreviewRows");
  2533.   var stringBundle = document.getElementById("google-toolbar-strings");
  2534.   for(var i = 0;i < matches.length;i ++ ) {
  2535.     var match = matches[i];
  2536.     if(match.shown) {
  2537.       continue}
  2538.     var value = "";
  2539.     if(match.entry.inputLabelNode == null) {
  2540.       value = match.value;
  2541.       match.shown = true}
  2542.     else {
  2543.       var inSameGroup = [];
  2544.       for(var j = 0;j < matches.length;j ++ ) {
  2545.         if(match.entry.inputLabelNode == matches[j].entry.inputLabelNode && (match.entry.match == "generic" || matches[j].entry.match == "generic" || match.entry.match == matches[j].entry.match)) {
  2546.           inSameGroup.push(matches[j])}
  2547.       }
  2548.       for(var j = 0;j < inSameGroup.length;j ++ ) {
  2549.         value += inSameGroup[j].value + " ";
  2550.         inSameGroup[j].shown = true}
  2551.       GTB_AutoFillManager._dump("For " + match.entry.inputLabelText + ", computed value is " + value)}
  2552.     var labelText = "";
  2553.     var displayName = match.entry.regexpEntry.displayName;
  2554.     if(displayName.length) {
  2555.       labelText = stringBundle.getString(displayName)}
  2556.     else {
  2557.       labelText = match.entry.inputLabelText}
  2558.     var row = document.createElement("row");
  2559.     var label = document.createElement("label");
  2560.     label.setAttribute("value", labelText);
  2561.     row.appendChild(label);
  2562.     label = document.createElement("label");
  2563.     label.setAttribute("value", value);
  2564.     row.appendChild(label);
  2565.     rows.appendChild(row)}
  2566. }
  2567.  
  2568. function GTB_AutoFillPreview_onAccept(event) {
  2569.   var retVal = window.arguments[1];
  2570.   retVal.accepted = true}
  2571.  
  2572. function GTB_AutoFillWarning_onLoad(event) {
  2573.   var shown = window.arguments[0];
  2574.   var checkbox = document.getElementById("gtbAutoFillWarningDoNotShow");
  2575.   if(!shown) {
  2576.     checkbox.checked = true}
  2577. }
  2578.  
  2579. function GTB_AutoFillWarning_onDone(accepted) {
  2580.   var checkbox = document.getElementById("gtbAutoFillWarningDoNotShow");
  2581.   var retVal = window.arguments[1];
  2582.   retVal.accepted = accepted;
  2583.   retVal.show = !checkbox.checked}
  2584.  
  2585. GTB_AutoFillManager._AUTOFILL_PREF = "AUTOFILL_Preferences";
  2586. GTB_AutoFillManager._DEFAULT_PREFERENCES = {highlight:true};
  2587. GTB_AutoFillManager.saveUserPreferences = function(theData) {
  2588.   var saveString = "";
  2589.   for(var i in theData) {
  2590.     if(saveString != "") {
  2591.       saveString += "\n"}
  2592.     saveString += i;
  2593.     saveString += "\n";
  2594.     saveString += theData[i]}
  2595.   GTB_getPrefs().setUnicodePref(GTB_AutoFillManager._AUTOFILL_PREF, saveString)}
  2596.  
  2597. ;
  2598. GTB_AutoFillManager._patchUpBool = function(array, name) {
  2599.   if(array[name] && array[name] != "false") {
  2600.     return true}
  2601.   else {
  2602.     return false}
  2603. }
  2604.  
  2605. ;
  2606. GTB_AutoFillManager.loadUserPreferences = function() {
  2607.   var restoreString = GTB_getPrefs().getUnicodePrefWithDefault(GTB_AutoFillManager._AUTOFILL_PREF, "");
  2608.   if(restoreString == "") {
  2609.     return GTB_AutoFillManager._DEFAULT_PREFERENCES}
  2610.   var splitStringArray = restoreString.split("\n");
  2611.   if(splitStringArray.length % 2 != 0) {
  2612.     return GTB_AutoFillManager._DEFAULT_PREFERENCES}
  2613.   var result = [];
  2614.   for(var i = 0;i < splitStringArray.length;i += 2) {
  2615.     result[splitStringArray[i]] = splitStringArray[i + 1]}
  2616.   result.highlight = GTB_AutoFillManager._patchUpBool(result, "highlight");
  2617.   for(var type in GTB_AutoFillOpts._PHONE_TYPES) {
  2618.     var typeString = GTB_AutoFillOpts._PHONE_TYPES[type];
  2619.     result["defaultPhone" + typeString] = GTB_AutoFillManager._patchUpBool(result, "defaultPhone" + typeString);
  2620.     result["alternativePhone" + typeString] = GTB_AutoFillManager._patchUpBool(result, "alternativePhone" + typeString)}
  2621.   return result}
  2622.  
  2623. ;
  2624. GTB_AutoFillManager.prototype._autofillFields = [];
  2625. GTB_AutoFillManager.prototype._autofillUserPreferences = GTB_AutoFillManager.TEST_PREFS;
  2626. GTB_AutoFillManager.prototype.init = function() {
  2627.   GTB_AutoFillManager._initRegexp();
  2628.   this._autofillUserPreferences = GTB_AutoFillManager.loadUserPreferences();
  2629.   GTB_AutoFillOpts._fixupUserPref(this._autofillUserPreferences)}
  2630.  
  2631. ;
  2632. GTB_AutoFillManager.prototype._startTime = 0;
  2633. GTB_AutoFillManager.prototype.doPageLoad = function(event) {
  2634.   if(!document.getElementById("gtbAutoFill"))return;
  2635.   if(!window.toolbar.visible)return;
  2636.   var doc = null;
  2637.   if(event) {
  2638.     doc = event.target}
  2639.   else {
  2640.     doc = GTB_GoogleToolbarOverlay._getCurrentDocument()}
  2641.   var browser = GTB_GoogleToolbarOverlay._getBrowserFromDoc(doc);
  2642.   if(!browser)return;
  2643.   this._parseThePageForAutofillFields(doc);
  2644.   browser.GTB_AutoFillData = this._autofillFields;
  2645.   var found = this._highlightFoundFields(browser.GTB_AutoFillData);
  2646.   if(browser == GTB_GoogleToolbarOverlay._getCurrentBrowser()) {
  2647.     this._enableAutoFillIcon(found)}
  2648. }
  2649.  
  2650. ;
  2651. GTB_AutoFillManager.prototype.doTabSwitch = function(event) {
  2652.   if(!document.getElementById("gtbAutoFill"))return;
  2653.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  2654.   if(browser.GTB_AutoFillData) {
  2655.     var found = this._highlightFoundFields(browser.GTB_AutoFillData);
  2656.     this._enableAutoFillIcon(found)}
  2657.   else {
  2658.     this._enableAutoFillIcon(false)}
  2659. }
  2660.  
  2661. ;
  2662. GTB_AutoFillManager.prototype.doAutoFill = function(event) {
  2663.   if(!document.getElementById("gtbAutoFill"))return;
  2664.   GTB_GoogleToolbarOverlay.maybeShowUsage("autofill_used", OptionsDialog.MORE_URL_AUTOFILL);
  2665.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  2666.   var found = this._fillTheFields(browser.GTB_AutoFillData, event.shiftKey);
  2667.   if(!found) {
  2668.     window.openDialog("chrome://google-toolbar/content/options-auto-fill.xul", "gtbAutoFillOptions", "modal,centerscreen,chrome,resizable=no");
  2669.     this._fillTheFields(browser.GTB_AutoFillData, event.shiftKey)}
  2670. }
  2671.  
  2672. ;
  2673. function GTB_AutoFillMatch(entry, value) {
  2674.   this.entry = entry;
  2675.   this.value = value}
  2676.  
  2677. function GTB_AutoFillMatchDropDown(entry, value, index) {
  2678.   this.entry = entry;
  2679.   this.value = value;
  2680.   this.index = index}
  2681.  
  2682. GTB_AutoFillManager.prototype._fillTheFields = function(autofillFields, showPreview) {
  2683.   var found = false;
  2684.   var matches = [];
  2685.   var i;
  2686.   for(i = 0;i < autofillFields.length; ++ i) {
  2687.     var autofillFieldsEntry = autofillFields[i];
  2688.     var regexpEntry = autofillFieldsEntry.regexpEntry;
  2689.     GTB_AutoFillManager._dump(autofillFieldsEntry.inputLabelText + ", " + autofillFieldsEntry.inputLabelNode + "  " + regexpEntry.reg[0] + "\n");
  2690.     var fieldType = autofillFieldsEntry.fillFieldDataType;
  2691.     var fillData = this._autofillUserPreferences[fieldType];
  2692.     if(fillData && fillData.length > 0) {
  2693.       found = true;
  2694.       if(autofillFieldsEntry.input.type == "select-one") {
  2695.         var dropDown = GTB_AutoFillManager._chooseDropDownSelection(autofillFieldsEntry, fillData, this._autofillUserPreferences);
  2696.         if(dropDown != null) {
  2697.           matches.push(new GTB_AutoFillMatchDropDown(autofillFieldsEntry, dropDown.value, dropDown.index))}
  2698.       }
  2699.       else {
  2700.         if(autofillFieldsEntry.fillFieldDataType == "state" && (autofillFieldsEntry.input.size && autofillFieldsEntry.input.size <= 5 || autofillFieldsEntry.input.maxLength > 0 && autofillFieldsEntry.input.maxLength <= 5) && this._autofillUserPreferences.stateAbbrev && this._autofillUserPreferences.stateAbbrev.length == 2) {
  2701.           matches.push(new GTB_AutoFillMatch(autofillFieldsEntry, this._autofillUserPreferences.stateAbbrev))}
  2702.         else if(autofillFieldsEntry.fillFieldDataType == "fullName" && this._autofillUserPreferences.fullName && this._autofillUserPreferences.fullName.length > autofillFieldsEntry.input.maxLength) {
  2703.           matches.push(new GTB_AutoFillMatch(autofillFieldsEntry, this._autofillUserPreferences.firstLastName))}
  2704.         else {
  2705.           matches.push(new GTB_AutoFillMatch(autofillFieldsEntry, fillData))}
  2706.       }
  2707.     }
  2708.   }
  2709.   if(showPreview) {
  2710.     var retVal = {accepted:false};
  2711.     window.openDialog("chrome://google-toolbar/content/auto-fill-preview.xul", "gtbAutoFillPreview", "modal,centerscreen,resizable=no", matches, retVal);
  2712.     if(!retVal.accepted) {
  2713.       return found}
  2714.   }
  2715.   else {
  2716.     var shown = GTB_getPrefs().hasUserValue(GTB_PREF_AUTO_FILL_SHOW_WARNING);
  2717.     var showWarning = GTB_getPrefs().getBoolPrefWithDefault(GTB_PREF_AUTO_FILL_SHOW_WARNING, true);
  2718.     if(showWarning) {
  2719.       var ret = {accepted:false, show:null};
  2720.       window.openDialog("chrome://google-toolbar/content/auto-fill-warning.xul", "gtbAutoFillWarning", "modal,centerscreen,resizable=no", shown, ret);
  2721.       GTB_getPrefs().setBoolPref(GTB_PREF_AUTO_FILL_SHOW_WARNING, ret.show);
  2722.       if(!ret.accepted) {
  2723.         return found}
  2724.     }
  2725.   }
  2726.   for(var i = 0;i < matches.length;i ++ ) {
  2727.     var match = matches[i];
  2728.     if(match.entry.input.type == "select-one") {
  2729.       GTB_AutoFillManager._setTheDropDownSelection(match.entry.input, match.value, match.index)}
  2730.     else {
  2731.       match.entry.input.value = match.value}
  2732.   }
  2733.   return found}
  2734.  
  2735. ;
  2736. GTB_AutoFillManager._tooltiptext = null;
  2737. GTB_AutoFillManager.getToolTipText = function() {
  2738.   if(GTB_AutoFillManager._tooltiptext == null) {
  2739.     var stringBundle = document.getElementById("google-toolbar-strings");
  2740.     GTB_AutoFillManager._tooltiptext = stringBundle.getString("google-autofill.input.tooltiptext")}
  2741.   return GTB_AutoFillManager._tooltiptext}
  2742.  
  2743. ;
  2744. GTB_AutoFillManager.prototype._highlightFoundFields = function(autofillFields) {
  2745.   var found = false;
  2746.   for(var i = 0;i < autofillFields.length; ++ i) {
  2747.     var autofillFieldsEntry = autofillFields[i];
  2748.     if(autofillFieldsEntry.fillFieldDataType == null) {
  2749.       continue}
  2750.     found = true;
  2751.     if(this._autofillUserPreferences.highlight) {
  2752.       if(!autofillFieldsEntry.originalColor) {
  2753.         if(autofillFieldsEntry.input.style.backgroundColor) {
  2754.           autofillFieldsEntry.originalColor = autofillFieldsEntry.input.style.backgroundColor}
  2755.         else {
  2756.           autofillFieldsEntry.originalColor = "#FFFFFF"}
  2757.       }
  2758.       autofillFieldsEntry.input.style.backgroundColor = "#FFFFA0"}
  2759.     else if(autofillFieldsEntry.originalColor) {
  2760.       autofillFieldsEntry.input.style.backgroundColor = autofillFieldsEntry.originalColor}
  2761.     autofillFieldsEntry.input.tooltiptext = GTB_AutoFillManager.getToolTipText()}
  2762.   return found}
  2763.  
  2764. ;
  2765. GTB_AutoFillManager.prototype._enableAutoFillIcon = function(enable) {
  2766.   var autofillIcon = document.getElementById("gtbAutoFill");
  2767.   if(autofillIcon) {
  2768.     if(enable) {
  2769.       autofillIcon.image = "chrome://google-toolbar/skin/auto-fill.png";
  2770.       autofillIcon.disabled = false}
  2771.     else {
  2772.       autofillIcon.image = "chrome://google-toolbar/skin/auto-fill-off.png";
  2773.       autofillIcon.disabled = true}
  2774.   }
  2775. }
  2776.  
  2777. ;
  2778. GTB_AutoFillManager.prototype._findAndFillMatchingECML = function(formInfoText, formInfoNode, formInfo, matchString) {
  2779.   var regexps = GTB_AutoFillManager._fieldRegexps;
  2780.   for(var j = 0;j < regexps.length; ++ j) {
  2781.     var ecml = regexps[j].ecml;
  2782.     if(!regexps[j].disable && formInfoText.toLowerCase().lastIndexOf(ecml) != -1 && (!regexps[j].type || regexps[j].type == formInfo.type)) {
  2783.       GTB_AutoFillManager._dump("using " + matchString + ": " + ecml + " matching " + formInfoText + "\n");
  2784.       var label = GTB_AutoFillManager._findLabelGeneric(formInfo.input, false);
  2785.       var text = formInfoText;
  2786.       if(label) {
  2787.         text = label.text}
  2788.       var newElement = {input:formInfo.input, inputLabelText:text, inputLabelNode:formInfoNode, match:matchString, regexpEntry:regexps[j]};
  2789.       this._autofillFields.push(newElement);
  2790.       return true}
  2791.   }
  2792.   return false}
  2793.  
  2794. ;
  2795. GTB_AutoFillManager.prototype._findAndFillMatchingRegexp = function(formInfoText, formInfoNode, formInfo, matchString) {
  2796.   var regexps = GTB_AutoFillManager._fieldRegexps;
  2797.   for(var j = 0;j < regexps.length; ++ j) {
  2798.     var regexp = regexps[j].regexp;
  2799.     if(!regexps[j].disable && regexp != null && (!regexps[j].type || regexps[j].type == formInfo.type) && regexp.test(formInfoText)) {
  2800.       var label = GTB_AutoFillManager._findLabelGeneric(formInfo.input, false);
  2801.       var text = formInfoText;
  2802.       if(label) {
  2803.         text = label.text}
  2804.       var newElement = {input:formInfo.input, inputLabelText:text, inputLabelNode:formInfoNode, match:matchString, regexpEntry:regexps[j]};
  2805.       GTB_AutoFillManager._dump("using " + matchString + " for text:" + formInfoText + ", regexp:" + regexp + "\n");
  2806.       this._autofillFields.push(newElement);
  2807.       return true}
  2808.   }
  2809.   return false}
  2810.  
  2811. ;
  2812. GTB_AutoFillManager.prototype._parseThePageForAutofillFields = function(doc) {
  2813.   this._startTime = (new Date).getTime();
  2814.   this._autofillFields = [];
  2815.   var formInfo = GTB_AutoFillManager._findFormInfo(doc);
  2816.   GTB_AutoFillManager._dump("Found " + formInfo.length + " input elements to explore\n");
  2817.   var formItem;
  2818.   for(var i = 0;formItem = formInfo[i]; ++ i) {
  2819.     var runningTime = (new Date).getTime() - this._startTime;
  2820.     if(runningTime > 1000) {
  2821.       GTB_AutoFillManager._dump("Running time too long: " + runningTime + "ms\n");
  2822.       break}
  2823.     if(formItem.input.offsetHeight == 0 || formItem.input.offsetWidth == 0) {
  2824.       GTB_AutoFillManager._dump("Excluding " + formItem.input.name + " for zero length\n");
  2825.       continue}
  2826.     if(this._findAndFillMatchingECML(formItem.input.name, null, formItem, "ecml")) {
  2827.       continue}
  2828.     if(formItem.input.type == "select-one") {
  2829.       var optionsResult = GTB_AutoFillManager._findOptionsText(formItem.input, 4);
  2830.       if(optionsResult.length > 0) {
  2831.         var optionsString = optionsResult.join(" ");
  2832.         if(this._findAndFillMatchingRegexp(optionsString, null, formItem, "option")) {
  2833.           continue}
  2834.       }
  2835.     }
  2836.     var simpleResult = GTB_AutoFillManager._findLabelGeneric(formItem.input, true);
  2837.     if(simpleResult) {
  2838.       GTB_AutoFillManager._dump(" " + formItem.input.name + " s-> " + simpleResult.text + "\n");
  2839.       if(this._findAndFillMatchingRegexp(simpleResult.text, simpleResult.node, formItem, "generic")) {
  2840.         continue}
  2841.     }
  2842.     var tableResult = GTB_AutoFillManager._findLabelFromTable(formItem.input);
  2843.     if(tableResult.rowResults.text && this._findAndFillMatchingRegexp(tableResult.rowResults.text, tableResult.rowResults.node, formItem, "row")) {
  2844.       continue}
  2845.     if(tableResult.columnResults.text && this._findAndFillMatchingRegexp(tableResult.columnResults.text, tableResult.columnResults.node, formItem, "column")) {
  2846.       continue}
  2847.     var genericResult = GTB_AutoFillManager._findLabelGeneric(formItem.input, false);
  2848.     if(genericResult) {
  2849.       GTB_AutoFillManager._dump(" " + formItem.input.name + " g-> " + genericResult.text + "\n");
  2850.       if(this._findAndFillMatchingRegexp(genericResult.text, genericResult.node, formItem, "generic")) {
  2851.         continue}
  2852.     }
  2853.   }
  2854.   GTB_Dump(GTB_Dump.AF, "AF Running time: " + ((new Date).getTime() - this._startTime) + "\n");
  2855.   this._findTextToFillIn()}
  2856.  
  2857. ;
  2858. GTB_AutoFillManager.prototype._findTextToFillIn = function() {
  2859.   var autofillFieldsLen = this._autofillFields.length;
  2860.   for(var i = 1;i < autofillFieldsLen;i ++ ) {
  2861.     var curData = this._autofillFields[i].regexpEntry.fillData[0][0];
  2862.     if(curData == "defaultPhoneExt") {
  2863.       var prevData = this._autofillFields[i - 1].regexpEntry.fillData[0][0];
  2864.       if(prevData.lastIndexOf("PhoneAll") != -1) {
  2865.         this._autofillFields[i].fillFieldDataType = curData.replace("default", prevData.substring(0, prevData.length - "PhoneAll".length))}
  2866.     }
  2867.   }
  2868.   for(var i = 0;i < autofillFieldsLen; ++ i) {
  2869.     if(this._autofillFields[i].fillFieldDataType) {
  2870.       continue}
  2871.     var labelNode = this._autofillFields[i].inputLabelNode;
  2872.     var match = this._autofillFields[i].match;
  2873.     if(labelNode == null) {
  2874.       this._autofillFields[i].fillFieldDataType = this._autofillFields[i].regexpEntry.fillData[0][0];
  2875.       continue}
  2876.     var autofillFieldsEntry;
  2877.     var inSameGroup = [];
  2878.     for(var j = 0;j < autofillFieldsLen; ++ j) {
  2879.       autofillFieldsEntry = this._autofillFields[j];
  2880.       if(labelNode == autofillFieldsEntry.inputLabelNode && (match == "generic" || autofillFieldsEntry.match == match || autofillFieldsEntry.match == "generic")) {
  2881.         inSameGroup.push(autofillFieldsEntry)}
  2882.     }
  2883.     var countGroup = inSameGroup.length - 1;
  2884.     for(j = 0;j < inSameGroup.length; ++ j) {
  2885.       autofillFieldsEntry = inSameGroup[j];
  2886.       var regexpEntry = autofillFieldsEntry.regexpEntry;
  2887.       var countElem = j;
  2888.       if(regexpEntry.fillData.length > countGroup && regexpEntry.fillData[countGroup].length > countElem - 1) {
  2889.         autofillFieldsEntry.fillFieldDataType = regexpEntry.fillData[countGroup][countElem]}
  2890.     }
  2891.   }
  2892.   for(var i = 1;i < autofillFieldsLen; ++ i) {
  2893.     if(this._autofillFields[i].fillFieldDataType == "addressLine2" && this._autofillFields[i - 1].fillFieldDataType == "address") {
  2894.       this._autofillFields[i - 1].fillFieldDataType = "addressLine1"}
  2895.   }
  2896. }
  2897.  
  2898. ;
  2899. GTB_AutoFillManager.prototype._debugWrongFieldFound = function() {
  2900. }
  2901.  
  2902. ;
  2903. GTB_AutoFillManager.prototype._debugCheckHasData = function(regexpEntry, autofillFieldsEntry, countGroup, countElem) {
  2904. }
  2905.  
  2906. ;
  2907. GTB_AutoFillManager.prototype.getTooltipBody = function(parent, offset, target) {
  2908.   if(parent.nodeType == Node.ELEMENT_NODE) {
  2909.     var gp = parent.parentNode;
  2910.     if(parent.tagName == "div" && gp) {
  2911.       if(gp.nodeType == Node.ELEMENT_NODE && gp.tagName == "INPUT" && gp.tooltiptext) {
  2912.         var desc = document.createElement("description");
  2913.         desc.appendChild(document.createTextNode(gp.tooltiptext));
  2914.         return[desc]}
  2915.     }
  2916.   }
  2917.   return null}
  2918.  
  2919. ;
  2920. GTB_AutoFillManager.prototype._debugVerifyTestFields = function() {
  2921. }
  2922.  
  2923. ;
  2924. function GTB_AutoFillOpts() {
  2925. }
  2926.  
  2927. GTB_AutoFillOpts._PREFERENCE_DIALOG_FIELDS = ["fullName", "email", "defaultPhone", "alternativePhone", "addressLine1", "addressLine2", "addressLine3", "city", "state", "zipcode", "country"];
  2928. GTB_AutoFillOpts._PREF_PREFIX = "GTB_Autofill_Pref_";
  2929. GTB_AutoFillOpts._NAME_SUFFIX = ["JR", "SR", "II", "III", "IV", "V", "PHD", "MD"];
  2930. GTB_AutoFillOpts._LASTNAME_PREFIX = ["mac", "mc", "maol", "mael", "ui", "ni", "nic", "bean", "von", "van", "de", "het", "t", "der"];
  2931. GTB_AutoFillOpts._PHONE_TAGS = ["default", "alternative", "work", "home", "cell"];
  2932. GTB_AutoFillOpts._PHONE_TYPES = ["Work", "Home", "Cell"];
  2933. GTB_AutoFillOpts._PHONE_NUMBER_MAX_LENGTH = 20;
  2934. GTB_AutoFillOpts._PHONE_NUMBER_MIN_LENGTH = 5;
  2935. GTB_AutoFillOpts._readPref = function(attr) {
  2936.   return document.getElementById(GTB_AutoFillOpts._PREF_PREFIX + attr)}
  2937.  
  2938. ;
  2939. GTB_AutoFillOpts._writePref = function(attr, val) {
  2940.   document.getElementById(GTB_AutoFillOpts._PREF_PREFIX + attr).value = val}
  2941.  
  2942. ;
  2943. GTB_AutoFillOpts._checkPhoneNumber = function(number, typeString) {
  2944.   var stringBundle = document.getElementById("google-toolbar-strings");
  2945.   var retVal = true;
  2946.   if(number.length > GTB_AutoFillOpts._PHONE_NUMBER_MAX_LENGTH) {
  2947.     var errorString = stringBundle.getString("prop.gtb.autofill.phonenumbertoolong");
  2948.     errorString = errorString.replace("%s", typeString);
  2949.     alert(errorString);
  2950.     retVal = false}
  2951.   if(number.length < GTB_AutoFillOpts._PHONE_NUMBER_MIN_LENGTH) {
  2952.     var errorString = stringBundle.getString("prop.gtb.autofill.phonenumbertooshort");
  2953.     errorString = errorString.replace("%s", typeString);
  2954.     alert(errorString);
  2955.     retVal = false}
  2956.   if(!/\d/.test(number)) {
  2957.     var errorString = stringBundle.getString("prop.gtb.autofill.phonenumbernodigits");
  2958.     errorString = errorString.replace("%s", typeString);
  2959.     alert(errorString);
  2960.     retVal = false}
  2961.   return retVal}
  2962.  
  2963. ;
  2964. GTB_AutoFillOpts._sanityCheckPhoneNumbers = function(userPref) {
  2965.   var foundDefaultType = false;
  2966.   var foundAlternativeType = false;
  2967.   var retVal = true;
  2968.   var stringBundle = document.getElementById("google-toolbar-strings");
  2969.   var typeString = stringBundle.getString("prop.gtb.autofill.defaultphone");
  2970.   retVal &= !userPref["defaultPhoneAll"] || GTB_AutoFillOpts._checkPhoneNumber(userPref["defaultPhoneAll"], typeString);
  2971.   var typeString = stringBundle.getString("prop.gtb.autofill.alternativephone");
  2972.   retVal &= !userPref["alternativePhoneAll"] || GTB_AutoFillOpts._checkPhoneNumber(userPref["alternativePhoneAll"], typeString);
  2973.   for(var type in GTB_AutoFillOpts._PHONE_TYPES) {
  2974.     var typeString = GTB_AutoFillOpts._PHONE_TYPES[type];
  2975.     foundDefaultType |= userPref["defaultPhone" + typeString];
  2976.     foundAlternativeType |= userPref["alternativePhone" + typeString];
  2977.     if(userPref["defaultPhone" + typeString] && userPref["defaultPhone" + typeString] == userPref["alternativePhone" + typeString]) {
  2978.       alert(stringBundle.getString("prop.gtb.autofill.selectdifferenttypes"));
  2979.       retVal = false}
  2980.   }
  2981.   if(userPref["defaultPhoneAll"] && !foundDefaultType) {
  2982.     alert(stringBundle.getString("prop.gtb.autofill.selectdefaulttype"));
  2983.     retVal = false}
  2984.   if(userPref["alternativePhoneAll"] && !foundAlternativeType) {
  2985.     alert(stringBundle.getString("prop.gtb.autofill.selectalternativetype"));
  2986.     retVal = false}
  2987.   return retVal}
  2988.  
  2989. ;
  2990. function GTB_AutoFillOptions_onDialogOK(event) {
  2991.   var userPref = [];
  2992.   for(var i = 0;i < GTB_AutoFillOpts._PREFERENCE_DIALOG_FIELDS.length; ++ i) {
  2993.     var key = GTB_AutoFillOpts._PREFERENCE_DIALOG_FIELDS[i];
  2994.     var pref = GTB_AutoFillOpts._readPref(key).value;
  2995.     pref = pref.replace(/^\s*(.*\S)\s*$/, "$1");
  2996.     pref = pref.replace(/\s\s+/g, " ");
  2997.     if(key == "defaultPhone" || key == "alternativePhone") {
  2998.       userPref[key + "All"] = pref}
  2999.     else {
  3000.       userPref[key] = pref}
  3001.   }
  3002.   userPref.highlight = GTB_AutoFillOpts._readPref("highlight").checked == true;
  3003.   for(var type in GTB_AutoFillOpts._PHONE_TYPES) {
  3004.     var typeString = GTB_AutoFillOpts._PHONE_TYPES[type];
  3005.     userPref["defaultPhone" + typeString] = GTB_AutoFillOpts._readPref("defaultPhone" + typeString).selected;
  3006.     userPref["alternativePhone" + typeString] = GTB_AutoFillOpts._readPref("alternativePhone" + typeString).selected}
  3007.   if(!GTB_AutoFillOpts._sanityCheckPhoneNumbers(userPref)) {
  3008.     return false}
  3009.   GTB_AutoFillOpts._fixupUserPref(userPref);
  3010.   GTB_getToolbar().sendMessage("GTB_AutoFill.new_user_pref", true)}
  3011.  
  3012. GTB_AutoFillOpts._parsePhoneNumber = function(userPref, tag) {
  3013.   var phone = userPref[tag + "PhoneAll"];
  3014.   var phoneParse = phone.replace(/[^0-9]/g, "");
  3015.   if(phoneParse.length == 11 && phoneParse.charAt(0) == "1") {
  3016.     phoneParse = phoneParse.substr(1, 10)}
  3017.   if(phoneParse.length >= 10) {
  3018.     userPref[tag + "PhoneArea"] = phoneParse.substr(0, 3);
  3019.     userPref[tag + "PhonePrefix"] = phoneParse.substr(3, 3);
  3020.     userPref[tag + "PhoneSuffix"] = phoneParse.substr(6, 4);
  3021.     userPref[tag + "PhoneExt"] = phoneParse.substr(10);
  3022.     userPref[tag + "Phone"] = userPref[tag + "PhonePrefix"] + userPref[tag + "PhoneSuffix"]}
  3023.   userPref[tag + "PhoneAll"] = phone}
  3024.  
  3025. ;
  3026. GTB_AutoFillOpts._fixupUserPref = function(userPref) {
  3027.   for(var i = 0;i < GTB_AutoFillOpts._PREFERENCE_DIALOG_FIELDS.length; ++ i) {
  3028.     var key = GTB_AutoFillOpts._PREFERENCE_DIALOG_FIELDS[i];
  3029.     if(!userPref[key]) {
  3030.       userPref[key] = ""}
  3031.   }
  3032.   for(var tag in GTB_AutoFillOpts._PHONE_TAGS) {
  3033.     var tagString = GTB_AutoFillOpts._PHONE_TAGS[tag];
  3034.     if(!userPref[tagString + "PhoneAll"]) {
  3035.       userPref[tagString + "PhoneAll"] = ""}
  3036.   }
  3037.   userPref.firstName = "";
  3038.   userPref.middleName = "";
  3039.   userPref.middleInit = "";
  3040.   userPref.lastName = "";
  3041.   userPref.firstLastName = "";
  3042.   if(userPref.fullName.length > 0) {
  3043.     var parsedName = userPref.fullName;
  3044.     parsedName = parsedName.replace(/,/g, " ");
  3045.     parsedName = parsedName.replace(/ +/g, " ");
  3046.     var namesArray = parsedName.split(" ");
  3047.     userPref.firstName = namesArray[0];
  3048.     userPref.firstLastName = userPref.firstName;
  3049.     if(namesArray.length > 1) {
  3050.       var lastIndex = namesArray.length - 1;
  3051.       userPref.lastName = namesArray[lastIndex];
  3052.       var lastWord = namesArray[lastIndex].replace(/\./g, "").toUpperCase();
  3053.       for(var i = 0;i < GTB_AutoFillOpts._NAME_SUFFIX.length;i ++ ) {
  3054.         if(lastWord == GTB_AutoFillOpts._NAME_SUFFIX[i]) {
  3055.           lastIndex -- ;
  3056.           userPref.lastName = namesArray[lastIndex];
  3057.           break}
  3058.       }
  3059.       if(lastIndex >= 2) {
  3060.         var penultimateWord = namesArray[lastIndex - 1].toLowerCase();
  3061.         for(var i = 0;i < GTB_AutoFillOpts._LASTNAME_PREFIX.length;i ++ ) {
  3062.           if(penultimateWord == GTB_AutoFillOpts._LASTNAME_PREFIX[i]) {
  3063.             var prefix = namesArray[lastIndex - 1];
  3064.             lastIndex -- ;
  3065.             userPref.lastName = prefix + " " + userPref.lastName;
  3066.             break}
  3067.         }
  3068.       }
  3069.       for(var i = 1;i < lastIndex;i ++ ) {
  3070.         if(i != 1) {
  3071.           userPref.middleName += " " + namesArray[i]}
  3072.         else {
  3073.           userPref.middleName += namesArray[i]}
  3074.       }
  3075.       userPref.firstLastName += " " + userPref.lastName}
  3076.   }
  3077.   if(userPref.middleName.length > 0) {
  3078.     userPref.middleInit = userPref.middleName.charAt(0)}
  3079.   userPref.address = "";
  3080.   userPref.addressFull = "";
  3081.   if(userPref.addressLine1 != "" || userPref.addressLine2 != "" || userPref.addressLine3 != "") {
  3082.     userPref.address = userPref.addressLine1 + " " + userPref.addressLine2 + " " + userPref.addressLine3}
  3083.   if(userPref.addressLine1 != "" || userPref.city != "" || userPref.state != "") {
  3084.     userPref.addressFull = userPref.addressLine1 + " " + userPref.city + ", " + userPref.state}
  3085.   userPref.zipshort = userPref.zipcode;
  3086.   var dash = userPref.zipcode.indexOf("-");
  3087.   if(dash != -1) {
  3088.     userPref.zipshort = userPref.zipcode.substr(0, dash);
  3089.     userPref.zipext = userPref.zipcode.substr(dash + 1)}
  3090.   var stateLower = userPref.state.toLowerCase();
  3091.   for(i = 0;i < GTB_AutoFillManager.STATES.length; ++ i) {
  3092.     if(GTB_AutoFillManager.STATES[i] == stateLower) {
  3093.       if(i % 2 == 0) {
  3094.         userPref.stateAlt = GTB_AutoFillManager.STATES[i + 1]}
  3095.       else {
  3096.         userPref.stateAlt = GTB_AutoFillManager.STATES[i - 1]}
  3097.       if(userPref.stateAlt.length == 2) {
  3098.         userPref.stateAbbrev = userPref.stateAlt.toUpperCase()}
  3099.       else {
  3100.         userPref.stateAbbrev = userPref.state.toUpperCase()}
  3101.       break}
  3102.   }
  3103.   for(var type in GTB_AutoFillOpts._PHONE_TYPES) {
  3104.     var typeString = GTB_AutoFillOpts._PHONE_TYPES[type];
  3105.     if(userPref["alternativePhone" + typeString]) {
  3106.       userPref[typeString.toLowerCase() + "PhoneAll"] = userPref["alternativePhoneAll"];
  3107.       break}
  3108.   }
  3109.   for(var type in GTB_AutoFillOpts._PHONE_TYPES) {
  3110.     var typeString = GTB_AutoFillOpts._PHONE_TYPES[type];
  3111.     if(userPref["defaultPhone" + typeString]) {
  3112.       userPref[typeString.toLowerCase() + "PhoneAll"] = userPref["defaultPhoneAll"];
  3113.       break}
  3114.   }
  3115.   for(var tag in GTB_AutoFillOpts._PHONE_TAGS) {
  3116.     GTB_AutoFillOpts._parsePhoneNumber(userPref, GTB_AutoFillOpts._PHONE_TAGS[tag])}
  3117.   GTB_AutoFillManager.saveUserPreferences(userPref);
  3118.   return true}
  3119.  
  3120. ;
  3121. GTB_AutoFillOpts._setCountryMenu = function() {
  3122.   function createMenuItem(countryMenu, label, index) {
  3123.     var theMenuitem = document.createElement("menuitem");
  3124.     theMenuitem.setAttribute("label", label);
  3125.     theMenuitem.setAttribute("index", index);
  3126.     theMenuitem.setAttribute("value", label);
  3127.     countryMenu.firstChild.appendChild(theMenuitem)}
  3128.   
  3129.   var countryMenu = document.getElementById(GTB_AutoFillOpts._PREF_PREFIX + "country");
  3130.   for(var i = 0;i < GTB_AutoFillManager.COUNTRIES.length; ++ i) {
  3131.     createMenuItem(countryMenu, GTB_AutoFillManager.COUNTRIES[i], i)}
  3132. }
  3133.  
  3134. ;
  3135. function GTB_AutoFillOptions_onDialogLoadSettings(event) {
  3136.   var userPref = GTB_AutoFillManager.loadUserPreferences();
  3137.   GTB_AutoFillOpts._setCountryMenu();
  3138.   for(var i = 0;i < GTB_AutoFillOpts._PREFERENCE_DIALOG_FIELDS.length; ++ i) {
  3139.     var key = GTB_AutoFillOpts._PREFERENCE_DIALOG_FIELDS[i];
  3140.     if(userPref[key] && userPref[key].length > 0) {
  3141.       GTB_AutoFillOpts._writePref(key, userPref[key])}
  3142.   }
  3143.   if(userPref.phoneAll && userPref.phoneAll.length > 0) {
  3144.     GTB_AutoFillOpts._writePref("defaultPhone", userPref.phoneAll)}
  3145.   if(userPref.defaultPhoneAll && userPref.defaultPhoneAll.length > 0) {
  3146.     GTB_AutoFillOpts._writePref("defaultPhone", userPref.defaultPhoneAll)}
  3147.   if(userPref.alternativePhoneAll && userPref.alternativePhoneAll.length > 0) {
  3148.     GTB_AutoFillOpts._writePref("alternativePhone", userPref.alternativePhoneAll)}
  3149.   for(var type in GTB_AutoFillOpts._PHONE_TYPES) {
  3150.     var typeString = GTB_AutoFillOpts._PHONE_TYPES[type];
  3151.     if(userPref["defaultPhone" + typeString]) {
  3152.       var element = document.getElementById("GTB_Autofill_Pref_defaultPhone" + typeString);
  3153.       element.radioGroup.selectedItem = element}
  3154.     if(userPref["alternativePhone" + typeString]) {
  3155.       var element = document.getElementById("GTB_Autofill_Pref_alternativePhone" + typeString);
  3156.       element.radioGroup.selectedItem = element}
  3157.   }
  3158.   document.getElementById("GTB_Autofill_Pref_highlight").checked = userPref.highlight}
  3159.  
  3160. GTB_AutoFillManager.TEST_PREFS = {title:"title", firstName:"firstName", middleInit:"middleInitial", middleName:"middleName", lastName:"lastName", fullName:"name", company:"company", email:"email", address:"address", addressLine1:"address1", addressLine2:"address2", addressLine3:"address3", addressFull:"addressFull", suite:"suite", city:"city", state:"state", province:"province", country:"country", zipcode:"zip", defaultPhoneAll:"phoneNumber", defaultPhoneArea:"area", defaultPhone:"phone", defaultPhonePrefix:
  3161. "prefix", defaultPhoneSuffix:"suffix", defaultPhoneExt:"extension", cardName:"cardholder", cardType:"cardType", cardNumber:"cardNumber", cardNumber1:"cardNumber1", cardNumber2:"cardNumber2", cardNumber3:"cardNumber3", cardNumber4:"cardNumber4", cardExpMonth:"expirationMonth", cardExpYear:"expirationYear", dob:"birth", dobDay:"birthDay", dobMonth:"birthMonth", dobYear:"birthYear", highlight:true};
  3162. GTB_AutoFillManager._fieldRegexps = [{fillData:[["title"]], disable:true, reg:["title"], displayName:"", ecml:"name_prefix"}, {fillData:[["firstName"], ["firstName", "lastName"]], reg:["first name", "fname", "initials"], ecml:"name_first", displayName:"prop.gtb.autofill.firstname", type:"text"}, {fillData:[["middleInit"]], reg:["m ?i", "initial"], displayName:"prop.gtb.autofill.middleinitial", type:"text"}, {fillData:[["middleName"]], reg:["middle"], ecml:"name_middle", displayName:"prop.gtb.autofill.middlename"
  3163. , type:"text"}, {fillData:[["lastName"]], reg:["last name", "lname", "surname"], ecml:"name_last", displayName:"prop.gtb.autofill.lastname", type:"text"}, {fillData:[["fullName"]], reg:["^[\\W\\s]*name", "full name", "recipient ?s? name", "attention", "attn", "to name", "my name"], displayName:"prop.gtb.autofill.fullname", type:"text"}, {fillData:[["email"]], reg:["e[ -]?mail"], ecml:"online_email", displayName:"prop.gtb.autofill.email", type:"text"}, {fillData:[["addressLine1"]], reg:["line ?1", 
  3164. "address ?1", "street ?1"], ecml:"street_line1", displayName:"prop.gtb.autofill.primaryaddressline1", type:"text"}, {fillData:[["addressLine2"]], reg:["line ?2", "address ?2", "street ?2"], ecml:"street_line2", displayName:"prop.gtb.autofill.primaryaddressline2", type:"text"}, {fillData:[["addressLine3"]], reg:["line ?3", "address ?3", "street ?3"], ecml:"street_line3", displayName:"prop.gtb.autofill.primaryaddressline3", type:"text"}, {fillData:[["address"], ["addressLine1", "addressLine2"], ["addressLine1"
  3165. , "addressLine2", "addressLine3"]], reg:["address", "street"], displayName:"prop.gtb.autofill.primaryaddress", type:"text"}, {fillData:[["suite"]], reg:["apt", "suite", "unit"], disable:true, displayName:"", type:"text"}, {fillData:[["city"], ["city", "state"], ["city", "state", "zipcode"]], reg:["city"], ecml:"city", displayName:"prop.gtb.autofill.primaryaddresscity", type:"text"}, {fillData:[["zipcode"], ["zipshort", "zipext"]], reg:["zip", "postal code"], ecml:"postalcode", displayName:"prop.gtb.autofill.primaryaddresspostalcode"
  3166. , type:"text"}, {fillData:[["state"]], reg:["alabama", "state"], ecml:"stateprov", displayName:"prop.gtb.autofill.primaryaddressstate", type:"select-one"}, {fillData:[["state"]], reg:["state"], ecml:"stateprov", displayName:"prop.gtb.autofill.primaryaddressstate", type:"text"}, {fillData:[["province"]], disable:true, displayName:"prop.gtb.autofill.primaryaddressstate", reg:["province", "region"]}, {fillData:[["country"]], reg:["afghanistan", "united states", "country"], ecml:"countrycode", displayName:
  3167. "prop.gtb.autofill.primaryaddresscountry", type:"select-one"}, {fillData:[["country"]], reg:["country"], ecml:"countrycode", displayName:"prop.gtb.autofill.primaryaddresscountry", type:"text"}, {fillData:[["addressFull"]], reg:[], ecml:"near", displayName:"prop.gtb.autofill.primaryaddress", type:"text"}, {fillData:[["company"]], disable:true, reg:["company"], ecml:"company", displayName:"", type:"text"}, {fillData:[["workPhoneAll"], ["workPhoneArea", "workPhone"], ["workPhoneArea", "workPhonePrefix"
  3168. , "workPhoneSuffix"], ["workPhoneArea", "workPhonePrefix", "workPhoneSuffix", "workPhoneExt"]], reg:["(work|business|office|daytime) (phone|telephone)"], displayName:"prop.gtb.autofill.workphone", type:"text"}, {fillData:[["homePhoneAll"], ["homePhoneArea", "homePhone"], ["homePhoneArea", "homePhonePrefix", "homePhoneSuffix"], ["homePhoneArea", "homePhonePrefix", "homePhoneSuffix", "homePhoneExt"]], reg:["(home|residence|evening) (phone|telephone)"], displayName:"prop.gtb.autofill.homephone", type:
  3169. "text"}, {fillData:[["cellPhoneAll"], ["cellPhoneArea", "cellPhone"], ["cellPhoneArea", "cellPhonePrefix", "cellPhoneSuffix"], ["cellPhoneArea", "cellPhonePrefix", "cellPhoneSuffix", "cellPhoneExt"]], reg:["(cell|mobile) (phone|telephone)"], displayName:"prop.gtb.autofill.cellphone", type:"text"}, {fillData:[["alternativePhoneAll"], ["alternativePhoneArea", "alternativePhone"], ["alternativePhoneArea", "alternativePhonePrefix", "alternativePhoneSuffix"], ["alternativePhoneArea", "alternativePhonePrefix"
  3170. , "alternativePhoneSuffix", "alternativePhoneExt"]], reg:["(alternative|alternate|second|secondary|another) (phone|telephone)"], displayName:"prop.gtb.autofill.alternativephone", type:"text"}, {fillData:[["defaultPhoneAll"], ["defaultPhoneArea", "defaultPhone"], ["defaultPhoneArea", "defaultPhonePrefix", "defaultPhoneSuffix"], ["defaultPhoneArea", "defaultPhonePrefix", "defaultPhoneSuffix", "defaultPhoneExt"]], reg:["(default |primary )?(phone|telephone)"], ecml:"phone_number", displayName:"prop.gtb.autofill.defaultphone"
  3171. , type:"text"}, {fillData:[["defaultPhoneArea"]], reg:["area"], displayName:"prop.gtb.autofill.phonearea", type:"text"}, {fillData:[["defaultPhoneExt"]], reg:["ext", "extension"], displayName:"prop.gtb.autofill.phoneext", type:"text"}, {fillData:[["cardName"]], disable:true, reg:["cardholder ?s? name", "card holder"], ecml:"card_name", displayName:"", type:"text"}, {fillData:[["cardType"]], disable:true, reg:["visa", "credit card"], ecml:"card_type", displayName:"", type:"select-one"}, {fillData:
  3172. [["cardNumber"], [], [], ["cardNumber1", "cardNumber2", "cardNumber3", "cardNumber4"]], disable:true, reg:["card number", "card no", "card #", "account number"], ecml:"card_number", displayName:"", type:"text"}, {fillData:[["cardExpMonth"]], disable:true, reg:["expiration month"], displayName:"", ecml:"card_expdate_month"}, {fillData:[["cardExpYear"]], disable:true, reg:["expiration year"], displayName:"", ecml:"card_expdate_year"}, {fillData:[[], ["cardExpMonth", "cardExpYear"]], disable:true, displayName:
  3173. "", reg:["expiration"]}, {fillData:[["dobYear"]], disable:true, displayName:"", reg:["birth.*year", "year.*birth"]}, {fillData:[["dobDay"], ["dobMonth", "dobDay"], ["dobMonth", "dobDay", "dobYear"]], disable:true, displayName:"", reg:["birth"]}];
  3174. GTB_AutoFillManager.STATES = ["alabama", "al", "alaska", "ak", "arizona", "az", "arkansas", "ar", "california", "ca", "colorado", "co", "connecticut", "ct", "delaware", "de", "district of columbia", "dc", "florida", "fl", "georgia", "ga", "hawaii", "hi", "idaho", "id", "illinois", "il", "indiana", "in", "iowa", "ia", "kansas", "ks", "kentucky", "ky", "louisiana", "la", "maine", "me", "maryland", "md", "massachusetts", "ma", "michigan", "mi", "minnesota", "mn", "mississippi", "ms", "missouri", "mo"
  3175. , "montana", "mt", "nebraska", "ne", "nevada", "nv", "new hampshire", "nh", "new jersey", "nj", "new mexico", "nm", "new york", "ny", "north carolina", "nc", "north dakota", "nd", "ohio", "oh", "oklahoma", "ok", "oregon", "or", "pennsylvania", "pa", "puerto rico", "pr", "rhode island", "ri", "south carolina", "sc", "south dakota", "sd", "tennessee", "tn", "texas", "tx", "utah", "ut", "vermont", "vt", "virginia", "va", "washington", "wa", "west virginia", "wv", "wisconsin", "wi", "wyoming", "wy"];
  3176.  
  3177. GTB_AutoFillManager.US = "United States";
  3178. GTB_AutoFillManager.COUNTRIES = [GTB_AutoFillManager.US, "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Antigua and Barbuda", "Argentina", "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", "Bosnia-Herzegovina", "Botswana", "Brazil", "British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cambodia", "Cameroon", "Canada", 
  3179. "Cape Verde", "Cayman Islands", "Central Africa", "Chad", "Chile", "China", "Colombia", "Comoros", "Congo", "Congo Dem. Rep.", "Costa Rica", "Croatia", "Cuba", "Cyprus", "Czech Republic", "Denmark", "Djibouti", "Dominica", "Dominican Republic", "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", "Ethiopia", "Faroe Islands", "Fiji", "Finland", "France", "French Guiana", "French Polynesia", "Gabon", "Gambia", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece"
  3180. , "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guernsey and Alderney", "Guinea", "Guinea Bissau", "Guyana", "Haiti", "Honduras", "Hong Kong", "Hungary", "Iceland", "India", "Indonesia", "Iran", "Iraq", "Ireland", "Isle of Man", "Israel", "Italy", "Ivory Coast", "Jamaica", "Japan", "Jersey", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Korea North", "Korea South", "Kuwait", "Kyrgyzstan", "Laos", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg"
  3181. , "Macedonia", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands", "Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia", "Moldova", "Monaco", "Mongolia", "Morocco", "Mozambique", "Myanmar", "Namibia", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria", "Northern Mariana Islands", "Norway", "Oman", "Pakistan", "Palestine", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines"
  3182. , "Poland", "Portugal", "Puerto Rico", "Qatar", "Romania", "Russia", "Rwanda", "Reunion", "Sahara", "Saint Kitts and Nevis", "Saint Lucia", "Saint Vincent", "Samoa", "Sao Tome and Principe", "Saudi Arabia", "Senegal", "Serbia and Montenegro", "Seychelles", "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "Spain", "Sri Lanka", "Sudan", "Suriname", "Swaziland", "Sweden", "Switzerland", "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand", "Togo", 
  3183. "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "U.S. Virgin Islands", "Uruguay", "Uzbekistan", "Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Yemen", "Zambia", "Zimbabwe"];
  3184. function GTB_AL_RemoveFromArray(arr, pos) {
  3185.   var value;
  3186.   for(var i = pos;value = arr[i + 1]; ++ i) {
  3187.     arr[i] = value}
  3188.   arr.pop()}
  3189.  
  3190. function GTB_AL_MatchFinder() {
  3191.   this.docRange = null;
  3192.   this.startRange = null;
  3193.   this.stopRange = null;
  3194.   this.text = null;
  3195.   this.findRange = null}
  3196.  
  3197. GTB_AL_MatchFinder.prototype.firstMatch = function(doc, text, isCaseSensitive) {
  3198.   if(!doc)return null;
  3199.   this.text = text;
  3200.   var body = doc.body;
  3201.   var docRange = doc.createRange();
  3202.   docRange.selectNode(body);
  3203.   this.docRange = docRange;
  3204.   var startRange = docRange.cloneRange();
  3205.   startRange.collapse(true);
  3206.   this.startRange = startRange;
  3207.   var stopRange = docRange.cloneRange();
  3208.   stopRange.collapse(false);
  3209.   this.stopRange = stopRange;
  3210.   var objectName = "@mozilla.org/embedcomp/rangefind;1";
  3211.   var findRange = Components.classes[objectName].createInstance();
  3212.   if(findRange != null && findRange  instanceof Components.interfaces.nsIFind) {
  3213.     findRange.caseSensitive = isCaseSensitive;
  3214.     findRange.findBackwards = false;
  3215.     this.findRange = findRange;
  3216.     return this.nextMatch(startRange)}
  3217.   return null}
  3218.  
  3219. , GTB_AL_MatchFinder.prototype.nextMatch = function(startRange) {
  3220.   startRange = startRange.cloneRange();
  3221.   startRange.collapse(false);
  3222.   return this.findRange.Find(this.text, this.docRange, startRange, this.stopRange)}
  3223.  
  3224. ;
  3225. function GTB_AL_Token(type, offset, contents, node) {
  3226.   this.type = type;
  3227.   this.offset = offset;
  3228.   this.contents = contents;
  3229.   this.node = node;
  3230.   this._isNumeric = null;
  3231.   if(contents != null) {
  3232.     this.length = contents.length}
  3233.   else {
  3234.     this.length = null}
  3235.   this.visited = false}
  3236.  
  3237. GTB_AL_Token.prototype.isNumeric = function() {
  3238.   if(this._isNumeric == null)this._isNumeric = /^\d+$/.test(this.contents);
  3239.   return this._isNumeric}
  3240.  
  3241. ;
  3242. GTB_AL_Token.prototype.toString = function() {
  3243.   return"[type:   " + this.type + ", offset:   " + this.offset + ", node:   " + this.node + ", isNumeric:  " + this.isNumeric() + ", length:   " + this.length + "\ncontents:" + this.contents + "]\n\n"}
  3244.  
  3245. ;
  3246. function GTB_AL_Tokenizer() {
  3247. }
  3248.  
  3249. GTB_AL_Tokenizer.TYPE_OPEN_SCOPE = 0;
  3250. GTB_AL_Tokenizer.TYPE_CLOSE_SCOPE = 1;
  3251. GTB_AL_Tokenizer.TYPE_NO_SCOPE = 2;
  3252. GTB_AL_Tokenizer.TYPE_TEXT = 3;
  3253. GTB_AL_Tokenizer.dumpTree = function(d, n) {
  3254.   GTB_Dump(GTB_Dump.AL, n + "\t" + d + "\n");
  3255.   if(d.nodeType == Node.ELEMENT_NODE) {
  3256.     for(var i = d.firstChild;i != null;i = i.nextSibling) {
  3257.       GTB_AL_Tokenizer.dumpTree(i, n + 1)}
  3258.   }
  3259. }
  3260.  
  3261. ;
  3262. GTB_AL_Tokenizer.tokenizeRange = function(r, retVal) {
  3263.   var start = r.startContainer;
  3264.   var end = r.endContainer;
  3265.   if(start.nodeType == Node.TEXT_NODE && start == end) {
  3266.     GTB_AL_Tokenizer._tokenizeText(start.nodeValue.substring(r.startOffset, r.endOffset), start, retVal, r.startOffset);
  3267.     return retVal}
  3268.   var curNode, endNode;
  3269.   if(start.nodeType == Node.TEXT_NODE) {
  3270.     curNode = start;
  3271.     GTB_AL_Tokenizer._tokenizeText(curNode.nodeValue.substring(r.startOffset), curNode, retVal, r.startOffset)}
  3272.   else if(start.nodeType == Node.ELEMENT_NODE) {
  3273.     if(r.startOffset == start.childNodes.length) {
  3274.       curNode = GTB_AL_Tokenizer.nextNodeSibling(start)}
  3275.     else {
  3276.       curNode = start.childNodes[r.startOffset]}
  3277.   }
  3278.   else {
  3279.     curNode = start}
  3280.   if(end.nodeType == Node.TEXT_NODE) {
  3281.     endNode = end}
  3282.   else if(end.nodeType == Node.ELEMENT_NODE) {
  3283.     if(r.endOffset == end.childNodes.length) {
  3284.       endNode = GTB_AL_Tokenizer.nextNodeSibling(end)}
  3285.     else {
  3286.       endNode = end.childNodes[r.endOffset]}
  3287.   }
  3288.   else {
  3289.     endNode = end}
  3290.   while(curNode != endNode) {
  3291.     if(curNode.nodeType == Node.TEXT_NODE) {
  3292.       GTB_AL_Tokenizer._tokenizeText(curNode.nodeValue, curNode, retVal, 0)}
  3293.     curNode = GTB_AL_Tokenizer.nextNode(curNode)}
  3294.   if(endNode && endNode.nodeType == Node.TEXT_NODE) {
  3295.     GTB_AL_Tokenizer._tokenizeText(endNode.nodeValue.substring(0, r.endOffset), endNode, retVal, 0)}
  3296.   return retVal}
  3297.  
  3298. ;
  3299. GTB_AL_Tokenizer.nextNode = function(node) {
  3300.   if(node.childNodes && node.childNodes.length > 0) {
  3301.     return node.childNodes[0]}
  3302.   return GTB_AL_Tokenizer.nextNodeSibling(node)}
  3303.  
  3304. ;
  3305. GTB_AL_Tokenizer.prevNode = function(node) {
  3306.   if(node.childNodes && node.childNodes.length > 0) {
  3307.     return node.childNodes[node.childNodes.length - 1]}
  3308.   return GTB_AL_Tokenizer.prevNodeSibling(node)}
  3309.  
  3310. ;
  3311. GTB_AL_Tokenizer.nextNodeSibling = function(node) {
  3312.   while(node && node.nextSibling == null) {
  3313.     node = node.parentNode}
  3314.   return node ? node.nextSibling : null}
  3315.  
  3316. ;
  3317. GTB_AL_Tokenizer.prevNodeSibling = function(node) {
  3318.   while(node && node.previousSibling == null) {
  3319.     node = node.parentNode}
  3320.   return node ? node.previousSibling : null}
  3321.  
  3322. ;
  3323. GTB_AL_Tokenizer.TOKEN_REGEX = (new RegExp).compile(/([^\x30-\x39\x41-\x5a\x61-\x7a\xc0-\xff]+)/);
  3324. GTB_AL_Tokenizer._tokenizeText = function(text, node, retVal, offsetAdjustment) {
  3325.   var tokens = text.split(GTB_AL_Tokenizer.TOKEN_REGEX);
  3326.   var offsetCounter = offsetAdjustment;
  3327.   for(var i = 0;i < tokens.length; ++ i) {
  3328.     var t = tokens[i];
  3329.     if(t.length == 0)continue;
  3330.     retVal.push(new GTB_AL_Token(GTB_AL_Tokenizer.TYPE_TEXT, offsetCounter, t, node));
  3331.     offsetCounter += t.length}
  3332. }
  3333.  
  3334. ;
  3335. function GTB_AL_RangeExpander() {
  3336. }
  3337.  
  3338. GTB_AL_RangeExpander.RANGE_INVALID_TAGS = {SCRIPT:true, INPUT:true, TEXTAREA:true, HEAD:true};
  3339. GTB_AL_RangeExpander.WINDOW_SIZE = 100;
  3340. GTB_AL_RangeExpander.ITERATIONS = 10;
  3341. GTB_AL_RangeExpander.expandRange = function(range) {
  3342.   var currentContainer = range.startContainer;
  3343.   while(currentContainer != null) {
  3344.     if(currentContainer.nodeName  in  GTB_AL_RangeExpander.RANGE_INVALID_TAGS) {
  3345.       return null}
  3346.     currentContainer = currentContainer.parentNode}
  3347.   GTB_AL_RangeExpander._expandRangeForward(range);
  3348.   GTB_AL_RangeExpander._expandRangeBackward(range);
  3349.   return range}
  3350.  
  3351. ;
  3352. GTB_AL_RangeExpander._expandRangeForward = function(range) {
  3353.   var iterations = GTB_AL_RangeExpander.ITERATIONS;
  3354.   var remainingSize = GTB_AL_RangeExpander.WINDOW_SIZE;
  3355.   while(iterations --  > 0 && remainingSize > 0) {
  3356.     var node = range.endContainer;
  3357.     var offset = range.endOffset;
  3358.     if(node.nodeType == Node.TEXT_NODE) {
  3359.       var txtLen = node.nodeValue.length;
  3360.       if(offset + remainingSize > txtLen) {
  3361.         range.setEnd(node, txtLen);
  3362.         node = GTB_AL_Tokenizer.nextNode(node);
  3363.         remainingSize -= txtLen - offset}
  3364.       else {
  3365.         range.setEnd(node, offset + remainingSize);
  3366.         return}
  3367.     }
  3368.     else if(node.nodeType == Node.ELEMENT_NODE) {
  3369.       var len = node.childNodes.length;
  3370.       if(offset < len && len > 0) {
  3371.         node = node.childNodes[offset]}
  3372.       else if(offset >= len) {
  3373.         node = GTB_AL_Tokenizer.nextNodeSibling(node)}
  3374.     }
  3375.     if(!node || node.nodeName  in  GTB_AL_RangeExpander.RANGE_INVALID_TAGS) {
  3376.       return}
  3377.     range.setEnd(node, 0)}
  3378. }
  3379.  
  3380. ;
  3381. GTB_AL_RangeExpander._expandRangeBackward = function(range) {
  3382.   var iterations = GTB_AL_RangeExpander.ITERATIONS / 2;
  3383.   var remainingSize = GTB_AL_RangeExpander.WINDOW_SIZE;
  3384.   while(iterations --  > 0 && remainingSize > 0) {
  3385.     var node = range.startContainer;
  3386.     var offset = range.startOffset;
  3387.     if(node.nodeType == Node.TEXT_NODE) {
  3388.       if(offset - remainingSize < 0) {
  3389.         node = GTB_AL_RangeExpander._prevChildNode(node);
  3390.         if(!node) {
  3391.           return}
  3392.         remainingSize -= offset;
  3393.         if(node.nodeType == Node.TEXT_NODE) {
  3394.           range.setStart(node, node.nodeValue.length)}
  3395.         else {
  3396.           range.setStart(node, 0)}
  3397.       }
  3398.       else {
  3399.         range.setStart(node, offset - remainingSize);
  3400.         return}
  3401.     }
  3402.     else {
  3403.       var len = node.childNodes.length;
  3404.       if(offset < len && len > 0) {
  3405.         node = node.childNodes[offset]}
  3406.       node = GTB_AL_RangeExpander._prevChildNode(node);
  3407.       if(!node) {
  3408.         return}
  3409.       range.setStart(node, 0)}
  3410.   }
  3411. }
  3412.  
  3413. ;
  3414. GTB_AL_RangeExpander._prevChildNode = function(node) {
  3415.   node = GTB_AL_Tokenizer.prevNode(node);
  3416.   if(!node || node.nodeName  in  GTB_AL_RangeExpander.RANGE_INVALID_TAGS) {
  3417.     return null}
  3418.   while(node && node.childNodes.length > 0) {
  3419.     node = GTB_AL_Tokenizer.prevNode(node);
  3420.     if(!node || node.nodeName  in  GTB_AL_RangeExpander.RANGE_INVALID_TAGS) {
  3421.       return null}
  3422.   }
  3423.   return node}
  3424.  
  3425. ;
  3426. function GTB_AL_Scanner(triggers, matcherFxns, validFxn, isCaseSensitive, prefKey, parent) {
  3427.   this.triggerDict = {};
  3428.   for(var i = 0;i < triggers.length;i ++ ) {
  3429.     var trigger = triggers[i];
  3430.     if(!isCaseSensitive) {
  3431.       trigger = trigger.toLowerCase()}
  3432.     this.triggerDict[triggers[i]] = true}
  3433.   this.captures = matcherFxns;
  3434.   this.isValid = validFxn;
  3435.   this.isCaseSensitive = isCaseSensitive;
  3436.   this.prefKey = prefKey;
  3437.   this.parent = parent}
  3438.  
  3439. GTB_AL_Scanner.prototype.checkTokens = function(tokenlist, insertions, tabData) {
  3440.   var token;
  3441.   for(var i = 0;token = tokenlist[i]; ++ i) {
  3442.     if(token.visited)continue;
  3443.     var tokenText = token.contents;
  3444.     if(!tokenText) {
  3445.       continue}
  3446.     if(this.possibleMatch(tokenText)) {
  3447.       var matches = this.getMatches(tokenlist, i);
  3448.       if(matches.length > 0) {
  3449.         var match;
  3450.         for(var j = 0;match = matches[j]; ++ j) {
  3451.           var urlparts = ["hl=" + GTB_GoogleToolbarOverlay.languageCode, "lt=" + this.prefKey, "q=" + encodeURIComponent(match.contents)];
  3452.           if(this.prefKey == "isbn" || this.prefKey == "vin") {
  3453.             var provNum = GTB_getPrefs().getStringPref("autolink." + this.prefKey);
  3454.             var provName = this.parent.getProviderName(this.prefKey, provNum);
  3455.             urlparts = urlparts.concat(["lpi=" + provNum])}
  3456.           var url = "http://www.google.com/tbproxy/redir?" + urlparts.join("&");
  3457.           var range = document.createRange();
  3458.           range.setStart(match.startToken.node, match.startToken.offset);
  3459.           range.setEnd(match.endToken.node, match.endToken.offset + match.endToken.length);
  3460.           var duplicate = false;
  3461.           for(var ins = 0;ins < insertions.length; ++ ins) {
  3462.             var otherRange = insertions[ins].range;
  3463.             if(0 == range.compareBoundaryPoints(range.START_TO_START, otherRange) && 0 == range.compareBoundaryPoints(range.END_TO_END, otherRange)) {
  3464.               duplicate = true;
  3465.               break}
  3466.           }
  3467.           if(!duplicate) {
  3468.             var displayValue = match.contents;
  3469.             insertions.push(new GTB_AL_InsertionObject(range, url, provName, displayValue, this.prefKey))}
  3470.         }
  3471.       }
  3472.     }
  3473.   }
  3474. }
  3475.  
  3476. ;
  3477. GTB_AL_Scanner.prototype.possibleMatch = function(tokenText) {
  3478.   if(this.isCaseSensitive) {
  3479.     return this.triggerDict[tokenText] != null}
  3480.   return this.triggerDict[tokenText.toLowerCase()] != null}
  3481.  
  3482. ;
  3483. GTB_AL_Scanner.prototype.getMatches = function(tokenlist, pos) {
  3484.   var curPos;
  3485.   var result;
  3486.   var i;
  3487.   var j;
  3488.   var matches = [];
  3489.   for(i = 1;i < 64; ++ i) {
  3490.     curPos = pos + i;
  3491.     if(curPos >= tokenlist.length) {
  3492.       break}
  3493.     for(j = 0;j < this.captures.length; ++ j) {
  3494.       result = this.captures[j](tokenlist, curPos);
  3495.       if(result && this.isValid(result.contents)) {
  3496.         matches.push(result)}
  3497.     }
  3498.     tokenlist[curPos].visited = true}
  3499.   for(i = 1;i < 64; ++ i) {
  3500.     curPos = pos - i;
  3501.     if(curPos < 0) {
  3502.       break}
  3503.     for(j = 0;j < this.captures.length; ++ j) {
  3504.       result = this.captures[j](tokenlist, curPos);
  3505.       if(result && this.isValid(result.contents)) {
  3506.         matches.push(result)}
  3507.     }
  3508.     tokenlist[curPos].visited = true}
  3509.   return matches}
  3510.  
  3511. ;
  3512. function GTB_AL_Match(startToken, endToken, contents) {
  3513.   this.startToken = startToken;
  3514.   this.endToken = endToken;
  3515.   this.contents = contents}
  3516.  
  3517. function GTB_AL_getChecksum(value, ndigits, multipliers) {
  3518.   var sum = 0;
  3519.   for(var i = 0;i < value.length - 1; ++ i) {
  3520.     if(GTB_AL_isDigit(value[i])) {
  3521.       sum += multipliers[i] * (value.charCodeAt(i) - 48)}
  3522.   }
  3523.   return sum}
  3524.  
  3525. function GTB_AL_getCheckDigit(value) {
  3526.   return value.charCodeAt(value.length - 1) - 48}
  3527.  
  3528. function GTB_AL_isDigit(value) {
  3529.   return/^\d+$/.test(value)}
  3530.  
  3531. function GTB_AL_Request(tabData, url, parent) {
  3532.   this.tabData = tabData;
  3533.   this.candidates = [];
  3534.   this.url = url;
  3535.   this.length = 0;
  3536.   this.parent = parent}
  3537.  
  3538. GTB_AL_Request.prototype.addRequest = function(tokenlist) {
  3539.   var candidate = new GTB_AL_RequestCandidate(tokenlist);
  3540.   var duplicate = false;
  3541.   for(var c = 0;c < this.candidates.length; ++ c) {
  3542.     var otherRange = this.candidates[c].range;
  3543.     var range = candidate.range;
  3544.     if(0 == range.compareBoundaryPoints(range.START_TO_START, otherRange) && 0 == range.compareBoundaryPoints(range.END_TO_END, otherRange)) {
  3545.       duplicate = true;
  3546.       break}
  3547.   }
  3548.   if(!duplicate && candidate.text.length + this.length <= 32000) {
  3549.     this.candidates.push(candidate)}
  3550. }
  3551.  
  3552. ;
  3553. GTB_AL_Request.prototype.sendAutolinkRequest = function() {
  3554.   if(this.candidates.length > 0) {
  3555.     var texts = [];
  3556.     this.candidates.sort(GTB_AL_RequestCandidateCompare);
  3557.     for(var c in this.candidates) {
  3558.       var candidate = this.candidates[c];
  3559.       texts.push(candidate.text)}
  3560.     this.sendText = texts.join("\n");
  3561.     this._sendAutolinkRequest(this.sendText)}
  3562.   else {
  3563.     this.parent._showLinks(this.tabData)}
  3564. }
  3565.  
  3566. ;
  3567. GTB_AL_Request.prototype._sendAutolinkRequest = function(text) {
  3568.   var request = new XMLHttpRequest;
  3569.   var self = this;
  3570.   request.onreadystatechange = function(ev) {
  3571.     if(4 == request.readyState) {
  3572.       var status = -1;
  3573.       try {
  3574.         status = request.status}
  3575.       catch(e) {
  3576.       }
  3577.       if(200 == status) {
  3578.         var items = request.responseXML.getElementsByTagName("items");
  3579.         for(var i = 0;i < items.length; ++ i) {
  3580.           self._insertLink(items[i])}
  3581.         self.candidates = [];
  3582.         self.sendText = ""}
  3583.       else {
  3584.         GTB_Dump(GTB_Dump.AL, "request to autolink server failed")}
  3585.       self.parent._showLinks(self.tabData);
  3586.       request.onreadystatechange = null}
  3587.   }
  3588.   
  3589.   ;
  3590.   var provNum = GTB_getPrefs().getStringPref("autolink.map");
  3591.   var query_string = ["url=" + encodeURIComponent(this.url), "hl=" + GTB_GoogleToolbarOverlay.languageCode, "map=" + provNum].join("&");
  3592.   request.open("POST", "https://www.google.com/tbproxy/autolink?" + query_string, true);
  3593.   request.setRequestHeader("X-CompressionType", "none");
  3594.   request.setRequestHeader("Pragma", "no-cache");
  3595.   request.send(text)}
  3596.  
  3597. ;
  3598. GTB_AL_Request.prototype._insertLink = function(itemxml) {
  3599.   var type, begin, end, url, text;
  3600.   var insertions = this.tabData.getInsertionsUnsafe();
  3601.   var nodes = itemxml.getElementsByTagName("type");
  3602.   if(nodes.length == 1)type = nodes[0].getAttribute("data");
  3603.   if(type == "postal_address") {
  3604.     nodes = itemxml.getElementsByTagName("begin");
  3605.     if(nodes.length == 1)begin = parseInt(nodes[0].getAttribute("int"));
  3606.     nodes = itemxml.getElementsByTagName("end");
  3607.     if(nodes.length == 1)end = parseInt(nodes[0].getAttribute("int"));
  3608.     nodes = itemxml.getElementsByTagName("url");
  3609.     if(nodes.length == 1)url = nodes[0].getAttribute("data");
  3610.     nodes = itemxml.getElementsByTagName("text");
  3611.     if(nodes.length == 1)text = nodes[0].getAttribute("data");
  3612.     if(this.sendText.substring(begin, end).indexOf("\n") == -1) {
  3613.       var startToken = this._getToken(begin);
  3614.       var endToken = this._getToken(end - 1);
  3615.       if(startToken && endToken) {
  3616.         var range = document.createRange();
  3617.         range.setStart(startToken.node, startToken.offset);
  3618.         var offset = Math.min(endToken.node.length, endToken.offset + endToken.length);
  3619.         if(1 == range.comparePoint(endToken.node, offset)) {
  3620.           range.setEnd(endToken.node, offset);
  3621.           var provNum = GTB_getPrefs().getStringPref("autolink.map");
  3622.           var provider = this.parent.getProviderName("map", provNum);
  3623.           var match = new GTB_AL_InsertionObject(range, url, provider, text, "map");
  3624.           if(!this.isDuplicateLink(match, insertions)) {
  3625.             insertions.push(match)}
  3626.         }
  3627.       }
  3628.     }
  3629.   }
  3630. }
  3631.  
  3632. ;
  3633. GTB_AL_Request.prototype.isDuplicateLink = function(match, insertions) {
  3634.   var range = match.range;
  3635.   for(var i = 0;i < insertions.length;i ++ ) {
  3636.     var otherRange = insertions[i].range;
  3637.     if(range.compareBoundaryPoints(range.START_TO_START, otherRange) >= 0 && range.compareBoundaryPoints(range.END_TO_END, otherRange) <= 0) {
  3638.       return true}
  3639.     if(range.compareBoundaryPoints(range.START_TO_START, otherRange) <= 0 && range.compareBoundaryPoints(range.END_TO_END, otherRange) >= 0) {
  3640.       insertions[i] = match;
  3641.       return true}
  3642.   }
  3643.   return false}
  3644.  
  3645. ;
  3646. GTB_AL_Request.prototype._getToken = function(offset) {
  3647.   var c = 0;
  3648.   var pos = 0;
  3649.   while(!(pos <= offset && offset <= pos + this.candidates[c].text.length)) {
  3650.     pos += this.candidates[c].text.length + 1;
  3651.      ++ c}
  3652.   var candidate = this.candidates[c];
  3653.   var t = 0;
  3654.   while(!(pos <= offset && offset <= pos + candidate.tokens[t].contents.length)) {
  3655.     pos += candidate.tokens[t].length + 1;
  3656.      ++ t}
  3657.   return candidate.tokens[t]}
  3658.  
  3659. ;
  3660. function GTB_AL_RequestCandidate(tokenlist) {
  3661.   this.tokens = [];
  3662.   this.range = document.createRange();
  3663.   var words = [];
  3664.   for(var t in tokenlist) {
  3665.     var token = tokenlist[t];
  3666.     if(token.type == GTB_AL_Tokenizer.TYPE_TEXT && token.contents.search(GTB_AL_Tokenizer.TOKEN_REGEX) == -1) {
  3667.       this.tokens.push(token);
  3668.       words.push(token.contents)}
  3669.   }
  3670.   if(this.tokens.length > 0) {
  3671.     this.range.setStart(this.tokens[0].node, this.tokens[0].offset);
  3672.     this.range.collapse(true)}
  3673.   this.text = words.join(" ")}
  3674.  
  3675. function GTB_AL_RequestCandidateCompare(lhs, rhs) {
  3676.   return lhs.range.compareBoundaryPoints(lhs.range.START_TO_START, rhs.range)}
  3677.  
  3678. function GTB_AL_InsertionObject(range, url, displaySite, displayValue, type) {
  3679.   this.range = range;
  3680.   this.linkURL = url;
  3681.   this.displaySite = displaySite;
  3682.   this.displayValue = displayValue;
  3683.   this.type = type;
  3684.   this.id = null;
  3685.   this.isLinkable = this._checkForLinks()}
  3686.  
  3687. GTB_AL_InsertionObject.prototype.toString = function() {
  3688.   return this.linkURL + ": " + this.range + "\n" + this.displayValue + ":" + this.type}
  3689.  
  3690. ;
  3691. GTB_AL_InsertionObject.prototype._checkForLinks = function() {
  3692.   var curNode = this.range.startContainer;
  3693.   var endNode = this.range.endContainer;
  3694.   while(curNode != endNode) {
  3695.     if(curNode.nodeName == "A") {
  3696.       return false}
  3697.     curNode = GTB_AL_Tokenizer.nextNode(curNode)}
  3698.   curNode = this.range.startContainer;
  3699.   while(curNode.nodeName != "BODY") {
  3700.     if(curNode.nodeName == "A")return false;
  3701.     curNode = curNode.parentNode}
  3702.   curNode = this.range.endContainer;
  3703.   while(curNode.nodeName != "BODY") {
  3704.     if(curNode.nodeName == "A")return false;
  3705.     curNode = curNode.parentNode}
  3706.   return true}
  3707.  
  3708. ;
  3709. GTB_AL_InsertionObject.prototype.selectAndFocus = function() {
  3710.   var doc = this.range.startContainer.ownerDocument;
  3711.   var win = doc && doc.defaultView;
  3712.   var link = doc && doc.getElementById(this.id);
  3713.   if(!doc || !win) {
  3714.     return false}
  3715.   var sel = win.getSelection();
  3716.   var range;
  3717.   if(link) {
  3718.     range = doc.createRange();
  3719.     range.selectNode(link)}
  3720.   else {
  3721.     range = this.range}
  3722.   if(link) {
  3723.     link.focus()}
  3724.   else {
  3725.     var focusNode = range.startContainer;
  3726.     while(focusNode.nodeType != Node.ELEMENT_NODE) {
  3727.       focusNode = focusNode.parentNode}
  3728.     var pt = GetPageOffset(focusNode);
  3729.     win.scrollTo(pt.x, pt.y - 20)}
  3730.   changeSelectionColor(false);
  3731.   sel.removeAllRanges();
  3732.   sel.addRange(range);
  3733.   return true}
  3734.  
  3735. ;
  3736. GTB_AL_InsertionObject.prototype.insertAutolink = function(id) {
  3737.   var target = GTB_AutoLink.getTarget();
  3738.   if(this.isLinkable) {
  3739.     var anchorNode = this.range.startContainer.ownerDocument.createElement("a");
  3740.     anchorNode.href = this.linkURL;
  3741.     anchorNode.target = target;
  3742.     anchorNode.style.backgroundColor = "#C0D4EE";
  3743.     anchorNode.style.color = "blue";
  3744.     anchorNode.id = id;
  3745.     this.id = id;
  3746.     var docfrag = this.range.extractContents();
  3747.     anchorNode.appendChild(docfrag);
  3748.     this.range.insertNode(anchorNode)}
  3749. }
  3750.  
  3751. ;
  3752. GTB_AL_InsertionObject.prototype.removeAutolink = function() {
  3753.   if(!this.isLinkable)return;
  3754.   var doc = this.range.startContainer.ownerDocument;
  3755.   var link = doc && doc.getElementById(this.id);
  3756.   if(!link) {
  3757.     return}
  3758.   var range = doc.createRange();
  3759.   range.selectNodeContents(link);
  3760.   var placeholderStart = doc.createElement("span");
  3761.   placeholderStart.style.display = "none";
  3762.   link.parentNode.insertBefore(placeholderStart, link);
  3763.   var placeholderEnd = doc.createElement("span");
  3764.   placeholderEnd.style.display = "none";
  3765.   if(link.nextSibling) {
  3766.     link.parentNode.insertBefore(placeholderEnd, link.nextSibling)}
  3767.   else {
  3768.     link.parentNode.appendChild(placeholderEnd)}
  3769.   link.parentNode.replaceChild(range.extractContents(), link);
  3770.   this.range = doc.createRange();
  3771.   this.range.setStartAfter(placeholderStart);
  3772.   this.range.setEndBefore(placeholderEnd);
  3773.   placeholderStart.parentNode.removeChild(placeholderStart);
  3774.   placeholderEnd.parentNode.removeChild(placeholderEnd)}
  3775.  
  3776. ;
  3777. function GTB_AL_Strings() {
  3778.   var strings = document.getElementById("google-toolbar-strings");
  3779.   var propPrefix = "prop.google-autolink.";
  3780.   this.AUTOLINK = strings.getString(propPrefix + "label");
  3781.   this.TOOLTIP_TITLE = strings.getString(propPrefix + "tooltip-title");
  3782.   this.NO_ITEMS = strings.getString(propPrefix + "no-items");
  3783.   this.ITEM_LINKED = strings.getString(propPrefix + "item-linked");
  3784.   this.ITEMS_LINKED = strings.getString(propPrefix + "items-linked");
  3785.   this.NO_MORE_ITEMS = strings.getString(propPrefix + "no-more-items");
  3786.   this.BUTTON_TOOLTIP = strings.getString(propPrefix + "button-tooltip");
  3787.   this.TOOLTIP_BODY = {map:strings.getString(propPrefix + "tooltip-map"), vin:strings.getString(propPrefix + "tooltip-vin"), isbn:strings.getString(propPrefix + "tooltip-isbn"), ups:strings.getString(propPrefix + "tooltip-ups"), fedex_ground:strings.getString(propPrefix + "tooltip-fedex-ground"), fedex_express:strings.getString(propPrefix + "tooltip-fedex-express"), usps:strings.getString(propPrefix + "tooltip-usps")};
  3788.   this.PROMO = {map:strings.getString(propPrefix + "promo-map"), vin:strings.getString(propPrefix + "promo-vin"), isbn:strings.getString(propPrefix + "promo-isbn"), ups:strings.getString(propPrefix + "promo-package"), fedex_ground:strings.getString(propPrefix + "promo-package"), fedex_express:strings.getString(propPrefix + "promo-package"), usps:strings.getString(propPrefix + "promo-package")};
  3789.   this.PROMO_TOOLTIP = {map:strings.getString(propPrefix + "promo-map-tip"), vin:strings.getString(propPrefix + "promo-vin-tip"), isbn:strings.getString(propPrefix + "promo-isbn-tip"), ups:strings.getString(propPrefix + "promo-package-tip"), fedex_ground:strings.getString(propPrefix + "promo-package-tip"), fedex_express:strings.getString(propPrefix + "promo-package-tip"), usps:strings.getString(propPrefix + "promo-package-tip")};
  3790.   this.DROPDOWN = {map:strings.getString(propPrefix + "dropdown-map"), vin:strings.getString(propPrefix + "dropdown-vin"), isbn:strings.getString(propPrefix + "dropdown-isbn"), ups:strings.getString(propPrefix + "dropdown-ups"), fedex_ground:strings.getString(propPrefix + "dropdown-fedex-ground"), fedex_express:strings.getString(propPrefix + "dropdown-fedex-express"), usps:strings.getString(propPrefix + "dropdown-usps")};
  3791.   this.PROVIDERS = {};
  3792.   for(var type in GTB_AutoLink.providerIndices) {
  3793.     var values = GTB_AutoLink.providerIndices[type];
  3794.     var value;
  3795.     for(var i = 0;value = values[i]; ++ i) {
  3796.       this.PROVIDERS[type + value] = strings.getString(propPrefix + "providers." + type + "." + value)}
  3797.   }
  3798. }
  3799.  
  3800. function GTB_AL_TabData(doc, autoLink) {
  3801.   this.document = doc;
  3802.   this._insertions = [];
  3803.   this.requester = new GTB_AL_Request(this, doc.location.href, autoLink);
  3804.   this.linkStatus = 0;
  3805.   this.position = 0;
  3806.   this.runningTime = 0}
  3807.  
  3808. GTB_AL_TabData.prototype.getInsertionsSafe = function(opt_updateButton) {
  3809.   var size = this._insertions.length;
  3810.   var ins;
  3811.   for(var i = 0;ins = this._insertions[i]; ++ i) {
  3812.     var elt = ins.range.startContainer.ownerDocument;
  3813.     if(1 == this.linkStatus && ins.isLinkable) {
  3814.       elt = elt && elt.getElementById(ins.id)}
  3815.     else if(1 != this.linkStatus && Trim(ins.range.toString()) == "") {
  3816.       elt = null}
  3817.     if(!elt) {
  3818.       GTB_AL_RemoveFromArray(this._insertions, i);
  3819.        -- i}
  3820.   }
  3821.   if(size != this._insertions.length) {
  3822.     GTB_GoogleToolbarOverlay.autoLink._updateButton(this)}
  3823.   return this._insertions}
  3824.  
  3825. ;
  3826. GTB_AL_TabData.prototype.getInsertionsUnsafe = function() {
  3827.   return this._insertions}
  3828.  
  3829. ;
  3830. function GTB_AutoLink() {
  3831.   this.strings = new GTB_AL_Strings;
  3832.   this.matchFinder = new GTB_AL_MatchFinder;
  3833.   this.scanners = this._makeScanners();
  3834.   this.menuItemTimer = null;
  3835.   this.observe = GTB_MessageObserve}
  3836.  
  3837. GTB_AutoLink.getTarget = function() {
  3838.   var target = "_blank";
  3839.   if(!GTB_getPrefs().getBoolPref(GTB_PREF_AUTO_LINK_NEW_WINDOW)) {
  3840.     target = "_top"}
  3841.   return target}
  3842.  
  3843. ;
  3844. GTB_AutoLink.prototype._spliceInsertions = function(insertions) {
  3845.   var insertOrder = [];
  3846.   var i, insertion;
  3847.   for(i = 0;insertion = insertions[i]; ++ i) {
  3848.     insertOrder.push([i, insertion])}
  3849.   insertOrder.sort(function(lhs, rhs) {
  3850.     var range = rhs[1].range;
  3851.     return range.compareBoundaryPoints(range.START_TO_START, lhs[1].range)}
  3852.   
  3853.   );
  3854.   var insertPair, id;
  3855.   for(i = 0;insertPair = insertOrder[i]; ++ i) {
  3856.     insertion = insertPair[1];
  3857.     id = "_goog_" + insertPair[0];
  3858.     insertion.insertAutolink(id)}
  3859. }
  3860.  
  3861. ;
  3862. GTB_AutoLink.prototype._scanBody = function(doc, tabData) {
  3863.   if(!doc || !doc.body)return;
  3864.   var foundTriggers = this._preScan(doc, tabData);
  3865.   var startTime = (new Date).getTime();
  3866.   var runningTime = 0;
  3867.   var remainingTime = 1000 - tabData.runningTime;
  3868.   for(var key in foundTriggers) {
  3869.     var preScanResult = foundTriggers[key];
  3870.     var scanner = preScanResult.scanner;
  3871.     var trigger = preScanResult.word;
  3872.     var match = this.matchFinder.firstMatch(doc, trigger, scanner.isCaseSensitive);
  3873.     while(match != null) {
  3874.       var expandedRange = GTB_AL_RangeExpander.expandRange(match);
  3875.       if(expandedRange == null) {
  3876.         match = this.matchFinder.nextMatch(match);
  3877.         continue}
  3878.       var tokenlist = GTB_AL_Tokenizer.tokenizeRange(expandedRange, []);
  3879.       scanner.checkTokens(tokenlist, tabData.getInsertionsUnsafe(), tabData);
  3880.       match = this.matchFinder.nextMatch(expandedRange);
  3881.       runningTime = (new Date).getTime() - startTime;
  3882.       if(runningTime > remainingTime)break}
  3883.     runningTime = (new Date).getTime() - startTime;
  3884.     if(runningTime > remainingTime)break}
  3885.   var endTime = (new Date).getTime();
  3886.   var timeDiff = endTime - startTime;
  3887.   tabData.runningTime += timeDiff;
  3888.   GTB_Dump(GTB_Dump.AL, "autolink time: " + tabData.runningTime + "\n");
  3889.   this._updateButton(tabData)}
  3890.  
  3891. ;
  3892. GTB_AutoLink.prototype.doAutoLinkButton = function() {
  3893.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  3894.   GTB_GoogleToolbarOverlay.maybeShowUsage("autolink_used", OptionsDialog.MORE_URL_AUTOLINK);
  3895.   var tabData = browser.GTB_AutolinkData;
  3896.   if(1 == tabData.linkStatus) {
  3897.     this._selectInsertion(tabData, tabData.position)}
  3898.   else {
  3899.     tabData.requester.sendAutolinkRequest()}
  3900. }
  3901.  
  3902. ;
  3903. GTB_AutoLink.prototype._showLinks = function(tabData) {
  3904.   if(1 == tabData.linkStatus)return;
  3905.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  3906.   var insertions = tabData.getInsertionsSafe(true);
  3907.   if(insertions) {
  3908.     if(insertions.length > 0) {
  3909.       this._spliceInsertions(insertions)}
  3910.     tabData.linkStatus = 1;
  3911.     tabData.position = 0;
  3912.     if(browser.GTB_AutolinkData == tabData) {
  3913.       this._updateButton(tabData);
  3914.       this._notifyUser(insertions.length)}
  3915.   }
  3916. }
  3917.  
  3918. ;
  3919. GTB_AutoLink.prototype._updateButton = function(tabData) {
  3920.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  3921.   if(browser.GTB_AutolinkData != tabData) {
  3922.     return}
  3923.   var autoLinkIcon = document.getElementById("gtbAutoLink");
  3924.   if(autoLinkIcon == null) {
  3925.     return}
  3926.   var oldTooltipText = autoLinkIcon.tooltipText;
  3927.   var insertions = tabData.getInsertionsUnsafe();
  3928.   if(insertions.length == 0 && tabData.requester.candidates.length == 0) {
  3929.     this._disableAutoLinkButton()}
  3930.   else if(insertions.length == 0 && tabData.requester.candidates.length > 0) {
  3931.     autoLinkIcon.image = "chrome://google-toolbar/skin/autolink.png";
  3932.     autoLinkIcon.tooltipText = this.strings.BUTTON_TOOLTIP;
  3933.     autoLinkIcon.label = this.strings.AUTOLINK;
  3934.     autoLinkIcon.disabled = false;
  3935.     autoLinkIcon.type = "button"}
  3936.   else {
  3937.     autoLinkIcon.image = "chrome://google-toolbar/skin/autolink.png";
  3938.     var type = insertions[0].type;
  3939.     autoLinkIcon.tooltipText = this.strings.PROMO_TOOLTIP[type];
  3940.     autoLinkIcon.label = this.strings.PROMO[type];
  3941.     autoLinkIcon.disabled = false;
  3942.     if(0 == tabData.requester.candidates.length || 1 == tabData.linkStatus) {
  3943.       autoLinkIcon.type = "menu-button"}
  3944.     else {
  3945.       autoLinkIcon.type = "button"}
  3946.   }
  3947.   if(oldTooltipText != autoLinkIcon.tooltipText) {
  3948.     GTB_GoogleToolbarOverlay.chevron.doResize()}
  3949. }
  3950.  
  3951. ;
  3952. GTB_AutoLink.prototype._disableAutoLinkButton = function() {
  3953.   var autoLinkIcon = document.getElementById("gtbAutoLink");
  3954.   autoLinkIcon.image = "chrome://google-toolbar/skin/autolink-off.png";
  3955.   autoLinkIcon.tooltipText = this.strings.NO_ITEMS;
  3956.   autoLinkIcon.label = this.strings.AUTOLINK;
  3957.   autoLinkIcon.disabled = true;
  3958.   autoLinkIcon.type = "button"}
  3959.  
  3960. ;
  3961. GTB_AutoLink.prototype._notifyUser = function(num_items) {
  3962.   var autoLinkIcon = document.getElementById("gtbAutoLink");
  3963.   var msg;
  3964.   if(0 == num_items) {
  3965.     msg = this.strings.NO_ITEMS}
  3966.   else if(1 == num_items) {
  3967.     msg = this.strings.ITEM_LINKED.replace("%i", 1)}
  3968.   else {
  3969.     msg = this.strings.ITEMS_LINKED.replace("%i", num_items)}
  3970.   GTB_TT_XULTooltipAlert(autoLinkIcon, msg, true)}
  3971.  
  3972. ;
  3973. GTB_AutoLink.prototype.doUpdatePopupMenu = function(menu) {
  3974.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  3975.   var tabData = browser.GTB_AutolinkData;
  3976.   var i;
  3977.   var items = menu.getElementsByTagName("menuitem");
  3978.   while(items.length > 3) {
  3979.     items[0].removeEventListener("click", GTB_AL_onButtonMenuCommand, false);
  3980.     menu.removeChild(items[0])}
  3981.   var separator = menu.getElementsByTagName("menuseparator")[0];
  3982.   var menuLabels = {};
  3983.   var insertions = tabData.getInsertionsSafe(true);
  3984.   var insertion;
  3985.   for(i = 0;insertion = insertions[i]; ++ i) {
  3986.     var linkType = insertion.type;
  3987.     if("ups" == linkType || "fedex_express" == linkType || "fedex" == linkType || "fedex_ground" == linkType || "usps" == linkType) {
  3988.       linkType = "package"}
  3989.     var mi = document.createElement("menuitem");
  3990.     var labelText = this._getLabelFromMatch(insertion);
  3991.     var dupCheckKey = labelText.toLowerCase();
  3992.     if(!menuLabels[dupCheckKey]) {
  3993.       mi.setAttribute("label", labelText);
  3994.       mi.index = i;
  3995.       mi.setAttribute("class", "menuitem-iconic");
  3996.       mi.setAttribute("image", "chrome://google-toolbar/skin/autolink-" + linkType + ".png");
  3997.       menu.insertBefore(mi, separator);
  3998.       mi.addEventListener("click", GTB_AL_onButtonMenuCommand, false);
  3999.       menuLabels[dupCheckKey] = true}
  4000.   }
  4001.   var menuItem = document.getElementById("gtbAutoLinkMenuRemove");
  4002.   menuItem.hidden = 1 != tabData.linkStatus;
  4003.   menuItem = document.getElementById("gtbAutoLinkMenuAdd");
  4004.   menuItem.hidden = 1 == tabData.linkStatus;
  4005.   if(0 == tabData.linkStatus) {
  4006.     this._showLinks(tabData)}
  4007. }
  4008.  
  4009. ;
  4010. GTB_AutoLink.prototype._getLabelFromMatch = function(match) {
  4011.   var labelText = match.displayValue.replace("\n", "");
  4012.   return this.strings.DROPDOWN[match.type].replace("%7", labelText)}
  4013.  
  4014. ;
  4015. GTB_AutoLink.prototype.doMaybeLoadAutolink = function(event) {
  4016.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  4017.   var menuitem = event.target;
  4018.   if(menuitem.index != null) {
  4019.     this._selectInsertion(browser.GTB_AutolinkData, menuitem.index);
  4020.     var insertions = browser.GTB_AutolinkData.getInsertionsUnsafe();
  4021.     if(insertions && insertions[menuitem.index]) {
  4022.       var url = insertions[menuitem.index].linkURL;
  4023.       var where = GTB_GoogleToolbarOverlay.getLoadUrlTarget(event);
  4024.       var browserAccess = new nsBrowserAccess;
  4025.       var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  4026.       var xpcomUrl = ios.newURI(url, null, null);
  4027.       browserAccess.openURI(xpcomUrl, null, where, null);
  4028.       var button = document.getElementById("gtbAutoLink");
  4029.       if(button.getAttribute("open")) {
  4030.         button.removeAttribute("open")}
  4031.     }
  4032.   }
  4033. }
  4034.  
  4035. ;
  4036. GTB_AutoLink.prototype.doMaybeSetLinkFocusTimer = function(menuitem) {
  4037.   var index = menuitem.index;
  4038.   if(index != null) {
  4039.     var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  4040.     var match = browser.GTB_AutolinkData.getInsertionsUnsafe()[index];
  4041.     this.menuItemTimer = setTimeout(GTB_hitch(match, match.selectAndFocus), 400)}
  4042. }
  4043.  
  4044. ;
  4045. GTB_AutoLink.prototype.doClearMenuFocusTimer = function() {
  4046.   if(this.menuItemTimer) {
  4047.     window.clearTimeout(this.menuItemTimer)}
  4048. }
  4049.  
  4050. ;
  4051. GTB_AutoLink.prototype._selectInsertion = function(tabData, i) {
  4052.   var insertions = tabData.getInsertionsSafe(true);
  4053.   var win, sel;
  4054.   if(i >= insertions.length) {
  4055.     GTB_TT_XULTooltipAlert(document.getElementById("gtbAutoLink"), this.strings.NO_MORE_ITEMS, true);
  4056.     win = GTB_GoogleToolbarOverlay._getCurrentWindow();
  4057.     sel = win.getSelection();
  4058.     sel.removeAllRanges();
  4059.     tabData.position = 0}
  4060.   else if(i < insertions.length) {
  4061.     this._showLinks(tabData);
  4062.     insertions[i].selectAndFocus();
  4063.     tabData.position = i + 1}
  4064. }
  4065.  
  4066. ;
  4067. GTB_AutoLink.prototype.doPageLoad = function(event) {
  4068.   var button = document.getElementById("gtbAutoLink");
  4069.   if(!button)return;
  4070.   var doc = event.target;
  4071.   var browser = GTB_GoogleToolbarOverlay._getBrowserFromDoc(doc);
  4072.   if(!browser) {
  4073.     return}
  4074.   var win = browser.contentWindow;
  4075.   if(!browser.GTB_AutolinkData || browser.GTB_AutolinkData.document != win.document) {
  4076.     browser.GTB_AutolinkData = new GTB_AL_TabData(win.document, this)}
  4077.   var tabData = browser.GTB_AutolinkData;
  4078.   if(doc.location.href.indexOf("http:") == 0 && win.document.location.href.indexOf("http:") == 0) {
  4079.     window.setTimeout(GTB_hitch(this, this._scanBody), 500, doc, tabData)}
  4080.   this._updateButton(tabData)}
  4081.  
  4082. ;
  4083. GTB_AutoLink.prototype.doPageShow = function(event) {
  4084.   this.doPageLoad(event)}
  4085.  
  4086. ;
  4087. GTB_AutoLink.prototype.doPageHide = function(event) {
  4088.   var doc = event.target;
  4089.   var browser = GTB_GoogleToolbarOverlay._getBrowserFromDoc(doc);
  4090.   if(!browser)return;
  4091.   this.clearState(browser)}
  4092.  
  4093. ;
  4094. GTB_AutoLink.prototype.doPageUnload = function(event) {
  4095.   var doc = event.target;
  4096.   var browser = GTB_GoogleToolbarOverlay._getBrowserFromDoc(doc);
  4097.   if(!browser || !browser.GTB_AutolinkData)return;
  4098.   var tabData = browser.GTB_AutolinkData;
  4099.   if(tabData.document != doc) {
  4100.     this._removeDocLinks(doc, tabData)}
  4101. }
  4102.  
  4103. ;
  4104. GTB_AutoLink.prototype._removeDocLinks = function(doc, tabData) {
  4105.   var insertion;
  4106.   var i;
  4107.   var insertions = tabData.getInsertionsSafe();
  4108.   for(i = insertions.length - 1;i >= 0; -- i) {
  4109.     insertion = insertions[i];
  4110.     if(insertion.range.startContainer.ownerDocument == doc) {
  4111.       GTB_AL_RemoveFromArray(insertions, i)}
  4112.   }
  4113.   if(1 == tabData.linkStatus) {
  4114.     this._removeLinks(insertions)}
  4115.   tabData.linkStatus = 0;
  4116.   var candidates = tabData.requester.candidates;
  4117.   var candidate;
  4118.   var keepCandidates = [];
  4119.   for(i = 0;candidate = candidates[i]; ++ i) {
  4120.     if(candidate.range.startContainer.ownerDocument != doc) {
  4121.       keepCandidates.push(candidate)}
  4122.   }
  4123.   tabData.requester.candidates = keepCandidates;
  4124.   tabData.runningTime = 0;
  4125.   this._updateButton(tabData)}
  4126.  
  4127. ;
  4128. GTB_AutoLink.prototype.doTabSwitch = function(event) {
  4129.   var button = document.getElementById("gtbAutoLink");
  4130.   if(!button)return;
  4131.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  4132.   var tabData = browser.GTB_AutolinkData;
  4133.   if(tabData && tabData.document == browser.contentWindow.document) {
  4134.     this._updateButton(tabData)}
  4135.   else {
  4136.     if(tabData) {
  4137.       this._removeDocLinks(tabData.document, tabData)}
  4138.     this._disableAutoLinkButton()}
  4139. }
  4140.  
  4141. ;
  4142. function GTB_AL_PrescanResult(word, scanner) {
  4143.   this.word = word;
  4144.   this.scanner = scanner}
  4145.  
  4146. GTB_AutoLink.TOKEN_REGEX = (new RegExp).compile(/[^\x30-\x39\x41-\x5a\x61-\x7a\xc0-\xff]+/);
  4147. GTB_AutoLink.prototype._preScan = function(doc, tabData) {
  4148.   var startTime = new Date;
  4149.   var i;
  4150.   var found = {};
  4151.   if(tabData.runningTime > 1000) {
  4152.     return found}
  4153.   if(!doc || !doc.body) {
  4154.     return found}
  4155.   var body = "";
  4156.   try {
  4157.     body = doc.body.innerHTML.replace(/<.*?>/g, " ")}
  4158.   catch(e) {
  4159.   }
  4160.   if(body.length > 32000) {
  4161.     body = body.substring(0, 32000)}
  4162.   var words = body.split(GTB_AutoLink.TOKEN_REGEX);
  4163.   var lcwords = body.toLowerCase().split(GTB_AutoLink.TOKEN_REGEX);
  4164.   var len = words.length;
  4165.   var word;
  4166.   for(var s in this.scanners) {
  4167.     var scanner = this.scanners[s];
  4168.     if(scanner.isCaseSensitive) {
  4169.       for(i = 0;i < len; ++ i) {
  4170.         word = words[i];
  4171.         if(true == scanner.triggerDict[word]) {
  4172.           found[word + scanner.prefKey] = new GTB_AL_PrescanResult(word, scanner)}
  4173.       }
  4174.     }
  4175.     else {
  4176.       for(i = 0;i < len; ++ i) {
  4177.         word = lcwords[i];
  4178.         if(true == scanner.triggerDict[word]) {
  4179.           found[word + scanner.prefKey] = new GTB_AL_PrescanResult(word, scanner)}
  4180.       }
  4181.     }
  4182.   }
  4183.   var endTime = new Date;
  4184.   var diff = endTime.getTime() - startTime.getTime();
  4185.   tabData.runningTime += diff;
  4186.   return found}
  4187.  
  4188. ;
  4189. GTB_AutoLink.GOOG_PATTERN = /^_goog_\d+$/;
  4190. GTB_AutoLink.prototype.getMatchFromClick = function(target) {
  4191.   var elt = target;
  4192.   while(elt) {
  4193.     if(elt.id) {
  4194.       var regexed = GTB_AutoLink.GOOG_PATTERN.exec(elt.id);
  4195.       if(regexed) {
  4196.         var id = regexed[0];
  4197.         var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  4198.         var insertions = browser.GTB_AutolinkData.getInsertionsUnsafe();
  4199.         var insertion;
  4200.         for(var i = 0;insertion = insertions[i]; ++ i) {
  4201.           if(insertion.id == id) {
  4202.             return insertion}
  4203.         }
  4204.         return null}
  4205.     }
  4206.     elt = elt.parentNode}
  4207.   return null}
  4208.  
  4209. ;
  4210. GTB_AutoLink.prototype.getTooltipBody = function(parent, offset, target) {
  4211.   var match = this.getMatchFromClick(parent.parentNode);
  4212.   if(match == null) {
  4213.     return null}
  4214.   var contents = [];
  4215.   var img = document.createElement("image");
  4216.   img.setAttribute("src", "chrome://google-toolbar/skin/autolink.png");
  4217.   img.style.verticalAlign = "middle";
  4218.   var desc = document.createElement("description");
  4219.   desc.style.fontWeight = "bold";
  4220.   desc.appendChild(img);
  4221.   desc.appendChild(document.createTextNode(this.strings.TOOLTIP_TITLE));
  4222.   contents.push(desc);
  4223.   var body = this.strings.TOOLTIP_BODY[match.type];
  4224.   body = body.replace(/%8/, match.displaySite);
  4225.   body = body.replace(/%7/, match.displayValue);
  4226.   var lines = body.split("\n");
  4227.   for(var i in lines) {
  4228.     desc = document.createElement("description");
  4229.     desc.appendChild(document.createTextNode(lines[i]));
  4230.     contents.push(desc)}
  4231.   return contents}
  4232.  
  4233. ;
  4234. GTB_AutoLink.providerIndices = {map:["0", "1", "2"], isbn:["0", "1", "2", "3", "7"], vin:["0", "1"]};
  4235. GTB_AutoLink.prototype.maybeShowAutoLinkMenuItems = function() {
  4236.   var target = gContextMenu.target;
  4237.   var match = this.getMatchFromClick(target);
  4238.   if(match == null) {
  4239.     document.getElementById("gtbAutoLinkContextMenu").hidden = true;
  4240.     return}
  4241.   else {
  4242.     var key = match.type;
  4243.     document.getElementById("gtbAutoLinkContextMenu").hidden = false;
  4244.     var i = 0;
  4245.     var list = GTB_AutoLink.providerIndices[key];
  4246.     var item;
  4247.     if(list) {
  4248.       var existingPref = GTB_getPrefs().getStringPref("autolink." + key);
  4249.       for(;i < list.length; ++ i) {
  4250.         item = document.getElementById("gtbAutoLinkMenuItemProvider" + i);
  4251.         item.hidden = false;
  4252.         var thisIndex = list[i];
  4253.         item.label = this.getProviderName(key, thisIndex);
  4254.         if(thisIndex == existingPref) {
  4255.           item.setAttribute("checked", true)}
  4256.         else {
  4257.           item.setAttribute("checked", false)}
  4258.       }
  4259.       document.getElementById("gtbAutoLinkMenuItemPackage").hidden = true}
  4260.     else {
  4261.       item = document.getElementById("gtbAutoLinkMenuItemPackage");
  4262.       item.label = this._getLabelFromMatch(match);
  4263.       item.hidden = false}
  4264.     for(;i < 5; ++ i) {
  4265.       item = document.getElementById("gtbAutoLinkMenuItemProvider" + i);
  4266.       item.hidden = true}
  4267.   }
  4268. }
  4269.  
  4270. ;
  4271. GTB_AutoLink.prototype.doChangePref = function(idx) {
  4272.   var target = gContextMenu.target;
  4273.   var match = this.getMatchFromClick(target);
  4274.   var type = match.type;
  4275.   var list = GTB_AutoLink.providerIndices[type];
  4276.   var newProvNum = list[idx];
  4277.   GTB_getPrefs().setStringPref("autolink." + type, newProvNum);
  4278.   this.relink();
  4279.   if(GTB_getPrefs().getBoolPref(GTB_PREF_AUTO_LINK_NEW_WINDOW)) {
  4280.     openNewWindowWith(match.linkURL, null, false, null)}
  4281.   else {
  4282.     GTB_GoogleToolbarOverlay._getCurrentBrowser().loadURI(match.linkURL, null, null)}
  4283. }
  4284.  
  4285. ;
  4286. GTB_AutoLink.prototype.getProviderName = function(type, index) {
  4287.   return this.strings.PROVIDERS[type + index]}
  4288.  
  4289. ;
  4290. GTB_AutoLink.prototype.doOpenPrefs = function() {
  4291.   window.openDialog("chrome://google-toolbar/content/options-auto-link.xul", "gtbAutoLinkOptions", "modal,centerscreen,chrome,resizable=no")}
  4292.  
  4293. ;
  4294. GTB_AutoLink.prototype.doRemoveLinks = function() {
  4295.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  4296.   if(1 == browser.GTB_AutolinkData.linkStatus) {
  4297.     var insertions = browser.GTB_AutolinkData.getInsertionsSafe();
  4298.     this._removeLinks(insertions)}
  4299.   browser.GTB_AutolinkData.linkStatus = 2}
  4300.  
  4301. ;
  4302. GTB_AutoLink.prototype._removeLinks = function(insertions) {
  4303.   var insertion;
  4304.   for(var i = 0;insertion = insertions[i]; ++ i) {
  4305.     insertion.removeAutolink()}
  4306. }
  4307.  
  4308. ;
  4309. GTB_AutoLink.prototype.doShowLinks = function() {
  4310.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  4311.   this._showLinks(browser.GTB_AutolinkData)}
  4312.  
  4313. ;
  4314. GTB_AutoLink.prototype.relink = function() {
  4315.   var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
  4316.   var enumerator = wm.getEnumerator("navigator:browser");
  4317.   while(enumerator.hasMoreElements()) {
  4318.     var curWindow = enumerator.getNext();
  4319.     var tabBrowser = curWindow.GTB_GoogleToolbarOverlay._getTabBrowser();
  4320.     for(var b = 0;b < tabBrowser.browsers.length; ++ b) {
  4321.       var browser = tabBrowser.browsers[b];
  4322.       this._relinkBrowser(browser)}
  4323.   }
  4324. }
  4325.  
  4326. ;
  4327. GTB_AutoLink.prototype._relinkBrowser = function(browser) {
  4328.   var tabData = browser.GTB_AutolinkData;
  4329.   if(tabData) {
  4330.     var insertions = tabData.getInsertionsSafe();
  4331.     var ins;
  4332.     for(var i = 0;ins = insertions[i]; ++ i) {
  4333.       var doc = ins.range.startContainer.ownerDocument;
  4334.       if(ins.type  in  GTB_AutoLink.providerIndices) {
  4335.         var provNum = GTB_getPrefs().getStringPref("autolink." + ins.type);
  4336.         var provName = this.getProviderName(ins.type, provNum);
  4337.         ins.linkURL = ins.linkURL.replace(/lpi=\d/, "lpi=" + provNum);
  4338.         ins.displaySite = provName}
  4339.       if(1 == tabData.linkStatus) {
  4340.         var link = doc && doc.getElementById(ins.id);
  4341.         if(link) {
  4342.           if(ins.type  in  GTB_AutoLink.providerIndices) {
  4343.             link.href = ins.linkURL}
  4344.           link.target = GTB_AutoLink.getTarget()}
  4345.       }
  4346.     }
  4347.   }
  4348. }
  4349.  
  4350. ;
  4351. GTB_AutoLink.prototype.scanAllFrames = function(win) {
  4352.   var docs = [];
  4353.   var windows = [win];
  4354.   var frame, i, curWin;
  4355.   while(windows.length > 0) {
  4356.     curWin = windows.shift();
  4357.     docs.unshift(curWin.document);
  4358.     for(i = 0;frame = curWin.frames[i]; ++ i) {
  4359.       windows.push(frame)}
  4360.   }
  4361.   var doc;
  4362.   for(i = 0;doc = docs[i]; ++ i) {
  4363.     this.doPageLoad({target:doc})}
  4364. }
  4365.  
  4366. ;
  4367. GTB_AutoLink.prototype.clearState = function(browser) {
  4368.   var tabData = browser.GTB_AutolinkData;
  4369.   if(tabData) {
  4370.     if(1 == tabData.linkStatus) {
  4371.       this._removeLinks(tabData.getInsertionsSafe())}
  4372.     browser.removeAttribute("GTB_AutolinkData")}
  4373. }
  4374.  
  4375. ;
  4376. GTB_AutoLink._isOneOrTwoSpaces = function(tokenlist, pos) {
  4377.   var t = tokenlist[pos];
  4378.   if(t) {
  4379.     var c = t.contents;
  4380.     return c == " " || c == "  "}
  4381.   return false}
  4382.  
  4383. ;
  4384. GTB_AutoLink._isValidFedexNumberSection = function(token) {
  4385.   return token.length == 4 && token.isNumeric()}
  4386.  
  4387. ;
  4388. GTB_AutoLink._uspsNumberGroupCapture = function(tokenlist, pos, token_sizes) {
  4389.   var startToken = tokenlist[pos];
  4390.   var thisToken;
  4391.   var inProgress = "";
  4392.   for(var i = 0;i < token_sizes.length; ++ i) {
  4393.     thisToken = tokenlist[pos];
  4394.     pos += 2;
  4395.     if(thisToken && thisToken.length == token_sizes[i] && thisToken.isNumeric()) {
  4396.       inProgress += thisToken.contents}
  4397.     else {
  4398.       return null}
  4399.   }
  4400.   return new GTB_AL_Match(startToken, thisToken, inProgress)}
  4401.  
  4402. ;
  4403. GTB_AutoLink._addressScannerCheckTokens = function(tokenlist, insertions, tabData) {
  4404.   for(var i = 0;i < tokenlist.length; ++ i) {
  4405.     var tokenText = tokenlist[i].contents;
  4406.     if(!tokenText) {
  4407.       continue}
  4408.     if(this.possibleMatch(tokenText)) {
  4409.       tabData.requester.addRequest(tokenlist);
  4410.       break}
  4411.   }
  4412. }
  4413.  
  4414. ;
  4415. GTB_AutoLink.prototype._makeScanners = function() {
  4416.   var isOneOrTwoSpaces = GTB_AutoLink._isOneOrTwoSpaces;
  4417.   var isbnScanner = new GTB_AL_Scanner(["isbn", "book", "publication"], [function(tokenlist, pos) {
  4418.     var thisToken = tokenlist[pos];
  4419.     if(thisToken.length == 10) {
  4420.       return new GTB_AL_Match(thisToken, thisToken, thisToken.contents)}
  4421.   }
  4422.   
  4423.   , function(tokenlist, pos) {
  4424.     var startToken = tokenlist[pos];
  4425.     var thisToken = tokenlist[pos ++ ];
  4426.     if(thisToken.length == 1 && thisToken.isNumeric()) {
  4427.       var inProgress = thisToken.contents;
  4428.       if(tokenlist[pos] && tokenlist[pos ++ ].contents == "-") {
  4429.         thisToken = tokenlist[pos ++ ];
  4430.         if(thisToken && thisToken.isNumeric() && thisToken.length <= 6 && thisToken.length >= 2) {
  4431.           inProgress += thisToken.contents;
  4432.           if(tokenlist[pos] && tokenlist[pos ++ ].contents == "-") {
  4433.             thisToken = tokenlist[pos ++ ];
  4434.             if(thisToken && thisToken.isNumeric() && thisToken.length <= 6 && thisToken.length >= 2) {
  4435.               inProgress += thisToken.contents;
  4436.               if(tokenlist[pos] && tokenlist[pos ++ ].contents == "-") {
  4437.                 thisToken = tokenlist[pos ++ ];
  4438.                 if(thisToken && thisToken.length == 1) {
  4439.                   inProgress += thisToken.contents;
  4440.                   return new GTB_AL_Match(startToken, thisToken, inProgress)}
  4441.               }
  4442.             }
  4443.           }
  4444.         }
  4445.       }
  4446.     }
  4447.   }
  4448.   
  4449.   ], function(c) {
  4450.     var mult = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  4451.     var checksum = GTB_AL_getChecksum(c, 9, mult) % 11;
  4452.     var checkdigit = GTB_AL_getCheckDigit(c);
  4453.     if(checksum == 10) {
  4454.       return c[c.length - 1].toLowerCase() == "x"}
  4455.     else {
  4456.       return checksum == checkdigit}
  4457.   }
  4458.   
  4459.   , false, "isbn", this);
  4460.   var isValidNumberSection = GTB_AutoLink._isValidFedexNumberSection;
  4461.   var fedexExpressScanner = new GTB_AL_Scanner(["fedex", "fed"], [function(tokenlist, pos) {
  4462.     var thisToken = tokenlist[pos];
  4463.     if(thisToken.length == 12 && thisToken.isNumeric()) {
  4464.       return new GTB_AL_Match(thisToken, thisToken, thisToken.contents)}
  4465.     return null}
  4466.   
  4467.   , function(tokenlist, pos) {
  4468.     var startPos = pos;
  4469.     var number = "";
  4470.     if(isValidNumberSection(tokenlist[pos ++ ])) {
  4471.       number += tokenlist[pos - 1].contents;
  4472.       if(isOneOrTwoSpaces(tokenlist, pos ++ )) {
  4473.         if(isValidNumberSection(tokenlist[pos ++ ])) {
  4474.           number += tokenlist[pos - 1].contents;
  4475.           if(isOneOrTwoSpaces(tokenlist, pos ++ )) {
  4476.             if(isValidNumberSection(tokenlist[pos])) {
  4477.               number += tokenlist[pos].contents;
  4478.               return new GTB_AL_Match(tokenlist[startPos], tokenlist[pos], number)}
  4479.           }
  4480.         }
  4481.       }
  4482.     }
  4483.     return null}
  4484.   
  4485.   ], function(c) {
  4486.     var mult = [3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1];
  4487.     var checksum = GTB_AL_getChecksum(c, 11, mult) % 11 % 10;
  4488.     var checkdigit = GTB_AL_getCheckDigit(c);
  4489.     return checksum == checkdigit}
  4490.   
  4491.   , false, "fedex_express", this);
  4492.   var fedexGroundScanner = new GTB_AL_Scanner(["fedex", "fed"], [function(tokenlist, pos) {
  4493.     var thisToken = tokenlist[pos];
  4494.     if(thisToken.length == 15 && thisToken.isNumeric()) {
  4495.       return new GTB_AL_Match(thisToken, thisToken, thisToken.contents)}
  4496.     return null}
  4497.   
  4498.   , function(tokenlist, pos) {
  4499.     var startPos = pos;
  4500.     var number = "";
  4501.     if(isValidNumberSection(tokenlist[pos ++ ])) {
  4502.       number += tokenlist[pos - 1].contents;
  4503.       if(isOneOrTwoSpaces(tokenlist, pos ++ )) {
  4504.         if(isValidNumberSection(tokenlist[pos ++ ])) {
  4505.           number += tokenlist[pos - 1].contents;
  4506.           if(isOneOrTwoSpaces(tokenlist, pos ++ )) {
  4507.             if(isValidNumberSection(tokenlist[pos ++ ])) {
  4508.               number += tokenlist[pos - 1].contents;
  4509.               if(isOneOrTwoSpaces(tokenlist, pos ++ )) {
  4510.                 if(tokenlist[pos].length == 3 && tokenlist[pos].isNumeric()) {
  4511.                   number += tokenlist[pos].contents;
  4512.                   return new GTB_AL_Match(tokenlist[startPos], tokenlist[pos], number)}
  4513.               }
  4514.             }
  4515.           }
  4516.         }
  4517.       }
  4518.     }
  4519.     return null}
  4520.   
  4521.   ], function(c) {
  4522.     var mult = [9, 7, 9, 7, 9, 7, 9, 7, 9, 7, 9, 7, 9, 7];
  4523.     var checksum = GTB_AL_getChecksum(c, 14, mult) % 10;
  4524.     var checkdigit = GTB_AL_getCheckDigit(c);
  4525.     return checksum == checkdigit}
  4526.   
  4527.   , false, "fedex_ground", this);
  4528.   var isAlphaOrNumeric = /[0-9a-zA-Z]+/;
  4529.   var upsScanner = new GTB_AL_Scanner(["ups"], [function(tokenlist, pos) {
  4530.     var thisToken = tokenlist[pos];
  4531.     if(thisToken.length == 18 && isAlphaOrNumeric.test(thisToken.contents)) {
  4532.       return new GTB_AL_Match(thisToken, thisToken, thisToken.contents)}
  4533.     return null}
  4534.   
  4535.   , function(tokenlist, pos) {
  4536.     var longToken = tokenlist[pos];
  4537.     var shortToken = tokenlist[pos + 2];
  4538.     if(shortToken && longToken.length == 17 && shortToken.length == 1 && isAlphaOrNumeric.test(longToken) && isAlphaOrNumeric.test(shortToken)) {
  4539.       var num = longToken.contents + shortToken.contents;
  4540.       return new GTB_AL_Match(longToken, shortToken, num)}
  4541.     return null}
  4542.   
  4543.   , function(tokenlist, pos) {
  4544.     var startToken = tokenlist[pos];
  4545.     var thisToken;
  4546.     var inProgress = "";
  4547.     var token_sizes = [2, 3, 3, 2, 4, 3, 1];
  4548.     for(var i = 0;i < token_sizes.length; ++ i) {
  4549.       thisToken = tokenlist[pos];
  4550.       pos += 2;
  4551.       if(thisToken && thisToken.length == token_sizes[i] && isAlphaOrNumeric.test(thisToken.contents)) {
  4552.         inProgress += thisToken.contents}
  4553.       else {
  4554.         return null}
  4555.     }
  4556.     return new GTB_AL_Match(startToken, thisToken, inProgress)}
  4557.   
  4558.   ], function(c) {
  4559.     if(c.charAt(0) == "1" && c.charAt(1).toLowerCase() == "z" && isAlphaOrNumeric.test(c) && c.length == 18) {
  4560.       return true}
  4561.     return false}
  4562.   
  4563.   , false, "ups", this);
  4564.   var numberGroupCapture = GTB_AutoLink._uspsNumberGroupCapture;
  4565.   var uspsScanner = new GTB_AL_Scanner(["usps"], [function(tokenlist, pos) {
  4566.     var thisToken = tokenlist[pos];
  4567.     if(thisToken.contents.indexOf("91") != 0) {
  4568.       return null}
  4569.     if(thisToken.length == 22 && thisToken.isNumeric()) {
  4570.       return new GTB_AL_Match(thisToken, thisToken, thisToken.contents)}
  4571.     return numberGroupCapture(tokenlist, pos, [4, 4, 4, 4, 4, 2])}
  4572.   
  4573.   , function(tokenlist, pos) {
  4574.     var thisToken = tokenlist[pos];
  4575.     if(thisToken.length == 20 && thisToken.isNumeric()) {
  4576.       return new GTB_AL_Match(thisToken, thisToken, thisToken.contents)}
  4577.     return numberGroupCapture(tokenlist, pos, [4, 4, 4, 4, 4])}
  4578.   
  4579.   , function(tokenlist, pos) {
  4580.     var startToken = tokenlist[pos ++ ];
  4581.     if(!startToken.isNumeric() && startToken.length == 2) {
  4582.       if(isOneOrTwoSpaces(tokenlist, pos ++ )) {
  4583.         var num = numberGroupCapture(tokenlist, pos, [9]);
  4584.         if(num) {
  4585.           pos += 1}
  4586.         else {
  4587.           var num = numberGroupCapture(tokenlist, pos, [3, 3, 3]);
  4588.           if(!num) {
  4589.             num = numberGroupCapture(tokenlist, pos, [4, 4, 1])}
  4590.           pos += 5}
  4591.         if(num) {
  4592.           var contents = num.contents;
  4593.           if(isOneOrTwoSpaces(tokenlist, pos ++ ) && tokenlist[pos]) {
  4594.             var lastContents = tokenlist[pos].contents;
  4595.             if(lastContents == "US" || lastContents == "XX") {
  4596.               return new GTB_AL_Match(startToken, tokenlist[pos], startToken.contents + " " + contents + " " + lastContents)}
  4597.           }
  4598.         }
  4599.       }
  4600.     }
  4601.     return null}
  4602.   
  4603.   ], function(c) {
  4604.     if(c.length > 19) {
  4605.       var mult = [3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3];
  4606.       var checksum = GTB_AL_getChecksum(c, 21, mult);
  4607.       var checkdigit = GTB_AL_getCheckDigit(c);
  4608.       return(checksum + checkdigit) % 10 == 0}
  4609.     else {
  4610.       c = c.substring(3, 12);
  4611.       var mult_mod10 = [1, 3, 1, 3, 1, 3, 1, 3];
  4612.       if((GTB_AL_getChecksum(c, 8, mult_mod10) + GTB_AL_getCheckDigit(c)) % 10 == 0)return true;
  4613.       var mult_mod11 = [8, 6, 4, 2, 3, 5, 9, 7];
  4614.       var mod = GTB_AL_getChecksum(c, 8, mult_mod11) % 11;
  4615.       var dig = GTB_AL_getCheckDigit(c);
  4616.       return mod == 0 && dig == 5 || mod == 1 && dig == 0 || 11 - mod == dig}
  4617.   }
  4618.   
  4619.   , false, "usps", this);
  4620.   var isAlphanumeric = /\d\D|\D\d/;
  4621.   var vinLookup = [1, 2, 3, 4, 5, 6, 7, 8, -1, 1, 2, 3, 4, 5, -1, 7, -1, 9, 2, 3, 4, 5, 6, 7, 8, 9];
  4622.   var vinScanner = new GTB_AL_Scanner(["vin", "vehicle", "auto", "car", "bus", "pickup", "truck", "suv", "bike", "moto", "numbers", "number"], [function(tokenlist, pos) {
  4623.     var thisToken = tokenlist[pos];
  4624.     if(thisToken.length == 17 && isAlphanumeric.test(thisToken.contents)) {
  4625.       return new GTB_AL_Match(thisToken, thisToken, thisToken.contents)}
  4626.     return null}
  4627.   
  4628.   ], function(c) {
  4629.     var mult = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];
  4630.     var sum = 0;
  4631.     c = c.toLowerCase();
  4632.     for(var i = 0;i < c.length; ++ i) {
  4633.       var dig = c.charAt(i);
  4634.       var digit = c.charCodeAt(i);
  4635.       var digitValue = null;
  4636.       if(GTB_AL_isDigit(dig)) {
  4637.         digitValue = parseInt(dig)}
  4638.       else {
  4639.         if(digit < 97 || digit > 122) {
  4640.           return false}
  4641.         digit = digit - 97;
  4642.         digitValue = vinLookup[digit]}
  4643.       sum += mult[i] * digitValue}
  4644.     sum = sum % 11;
  4645.     var checkChar = c.charCodeAt(8);
  4646.     if(sum == 10) {
  4647.       return checkChar == 120}
  4648.     else {
  4649.       return sum == parseInt(checkChar - 48)}
  4650.   }
  4651.   
  4652.   , false, "vin", this);
  4653.   var addressStateScanner = new GTB_AL_Scanner(["Alabama", "AL", "Alaska", "AK", "American Samoa", "AS", "Arizona", "AZ", "Arkansas", "AR", "California", "CA", "Colorado", "CO", "Connecticut", "CT", "Delaware", "DE", "District Of Columbia", "DC", "Federated States of Micronesia", "FM", "Florida", "FL", "Georgia", "GA", "Guam", "GU", "Hawaii", "HI", "Idaho", "ID", "Illinois", "IL", "Indiana", "IN", "Iowa", "IA", "Kansas", "KS", "Kentucky", "KY", "Louisiana", "LA", "Maine", "ME", "Marshall Islands"
  4654.   , "MH", "Maryland", "MD", "Massachusetts", "MA", "Michigan", "MI", "Minnesota", "MN", "Mississippi", "MS", "Missouri", "MO", "Montana", "MT", "Nebraska", "NE", "Nevada", "NV", "New Hampshire", "NH", "New Jersey", "NJ", "New Mexico", "NM", "New York", "NY", "North Carolina", "NC", "North Dakota", "ND", "Northern Mariana Islands", "MP", "Ohio", "OH", "Oklahoma", "OK", "Oregon", "OR", "Palau", "PW", "Pennsylvania", "PA", "Puerto Rico", "PR", "Rhode Island", "RI", "South Carolina", "SC", "South Dakota"
  4655.   , "SD", "Tennessee", "TN", "Texas", "TX", "Utah", "UT", "Vermont", "VT", "Virgin Islands", "VI", "Virginia", "VA", "Washington", "WA", "West Virginia", "WV", "Wisconsin", "WI", "Wyoming", "WY"], [], null, true, null, this);
  4656.   var addressStreetScanner = new GTB_AL_Scanner(["street", "st", "ave", "road", "avenue", "rd", "san", "blvd", "dr", "drive", "new", "york", "west", "east", "north", "south", "ct", "park", "way", "los", "city", "parkway", "beach", "main", "boulevard", "santa", "se", "ne", "sw", "nw"], [], null, false, null, this);
  4657.   addressStateScanner.checkTokens = GTB_AutoLink._addressScannerCheckTokens;
  4658.   addressStreetScanner.checkTokens = GTB_AutoLink._addressScannerCheckTokens;
  4659.   return[upsScanner, fedexGroundScanner, fedexExpressScanner, uspsScanner, vinScanner, isbnScanner, addressStateScanner, addressStreetScanner]}
  4660.  
  4661. ;
  4662. GTB_AutoLink.prototype.GTB_MESSAGES = {"GTB_OPTION.button_option.gtbAutoLink":function(data) {
  4663.   var toolbar = GTB_getToolbar();
  4664.   if("true" == data) {
  4665.     var win = toolbar._getCurrentWindow();
  4666.     toolbar.autoLink.scanAllFrames(win)}
  4667.   else if("false" == data) {
  4668.     var browsers = toolbar._getTabBrowser().browsers;
  4669.     var browser;
  4670.     for(var b = 0;browser = browsers[b]; ++ b) {
  4671.       toolbar.autoLink.clearState(browser)}
  4672.   }
  4673. }
  4674.  
  4675. };
  4676. function GTB_AL_onAutoLink(event) {
  4677.   if(event.type == "click" && event.target.nodeName == "menuitem") {
  4678.     return}
  4679.   GTB_GoogleToolbarOverlay.autoLink.doAutoLinkButton()}
  4680.  
  4681. function GTB_AL_onRemoveLinks(event) {
  4682.   GTB_GoogleToolbarOverlay.autoLink.doRemoveLinks()}
  4683.  
  4684. function GTB_AL_onAddLinks(event) {
  4685.   GTB_GoogleToolbarOverlay.autoLink.doShowLinks()}
  4686.  
  4687. function GTB_AL_onOpenPrefs(event) {
  4688.   GTB_GoogleToolbarOverlay.autoLink.doOpenPrefs()}
  4689.  
  4690. function GTB_AL_onChangePref(idx) {
  4691.   GTB_GoogleToolbarOverlay.autoLink.doChangePref(idx)}
  4692.  
  4693. function GTB_AL_onButtonMenuPopupShowing(event) {
  4694.   GTB_GoogleToolbarOverlay.autoLink.doUpdatePopupMenu(event.target)}
  4695.  
  4696. function GTB_AL_onButtonMenuCommand(event) {
  4697.   if("click" == event.type && 1 != event.button) {
  4698.     return}
  4699.   GTB_GoogleToolbarOverlay.autoLink.doMaybeLoadAutolink(event);
  4700.   event.preventBubble()}
  4701.  
  4702. function GTB_AL_onButtonMenuMouseOver(event) {
  4703.   var target = event.target;
  4704.   if(target.nodeName == "menuitem") {
  4705.     GTB_GoogleToolbarOverlay.autoLink.doMaybeSetLinkFocusTimer(target)}
  4706. }
  4707.  
  4708. function GTB_AL_onButtonMenuMouseOut(event) {
  4709.   GTB_GoogleToolbarOverlay.autoLink.doClearMenuFocusTimer()}
  4710.  
  4711. function GTB_AL_onOpenUrl(url) {
  4712.   if(GTB_getPrefs().getBoolPref(GTB_PREF_AUTO_LINK_NEW_WINDOW)) {
  4713.     openNewWindowWith(url, null, false, null)}
  4714.   else {
  4715.     GTB_GoogleToolbarOverlay._getCurrentBrowser().loadURI(url, null, null)}
  4716. }
  4717.  
  4718. function DictFileDownloadObserver(translator) {
  4719.   this.translator = translator}
  4720.  
  4721. DictFileDownloadObserver.prototype = {onDownloadComplete:function(downloader, request, ctxt, status, result) {
  4722.   this.translator.dictFileDownloading = false;
  4723.   this.translator.dictFileDownloads ++ ;
  4724.   var failure = null;
  4725.   if(!Components.isSuccessCode(status)) {
  4726.     failure = "unable to download dict file!"}
  4727.   else if(!this.translator.dictFileTmpLocation.exists()) {
  4728.     failure = "new dict file not found!"}
  4729.   else if(this.translator.dictFileLocation.exists()) {
  4730.     failure = "unable to remove old dict file!"}
  4731.   if(failure == null) {
  4732.     try {
  4733.       this.translator.dictFileTmpLocation.copyTo(null, this.translator.dictFileLocation.leafName)}
  4734.     catch(e) {
  4735.     }
  4736.     GTB_Assert(this.translator.dictFileTmpLocation.exists(), "after move, tmp file doesn't exist!");
  4737.     GTB_Assert(this.translator.dictFileLocation.exists(), "after move, dict file doesn't exist!");
  4738.     if(this.translator.dictFileLocation.exists() && this.translator.dictFileLocation.isReadable()) {
  4739.       this.translator.dictFileReady = true}
  4740.     else {
  4741.       this.translator.dictFileReady = false}
  4742.   }
  4743.   else {
  4744.     this.translator.dictFileReady = false}
  4745. }
  4746.  
  4747. };
  4748. function GTB_AutoTranslate() {
  4749. }
  4750.  
  4751. GTB_AutoTranslate.prototype = {TRANSLATE_TERM:"", NO_TRANSLATION:"", DOWNLOAD_FAILED:"", GTB_DATA_DIR:"GoogleToolbarData", TMP_DICT_FILE:"dict.tmp", FINAL_DICT_FILE:"dict.dat", MAX_FAILED_DOWNLOADS:10, dictFileDownloads:null, dictFileDownloading:null, dictFileReady:null, dictFileLocation:null, dictFileTmpLocation:null, init:function() {
  4752.   var stringBundle = document.getElementById("google-toolbar-strings");
  4753.   this.TRANSLATE_TERM = stringBundle.getString("google-translate.translateTerm");
  4754.   this.NO_TRANSLATION = stringBundle.getString("google-translate.noTranslation");
  4755.   this.DOWNLOAD_FAILED = stringBundle.getString("google-translate.disableWarning");
  4756.   GTB_GoogleToolbarOverlay.registerMessages(this);
  4757.   var dirsvc = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  4758.   this.dictFileLocation = dirsvc.get("ProfD", Components.interfaces.nsIFile);
  4759.   GTB_Assert(this.dictFileLocation.exists(), "no profile directory!");
  4760.   this.dictFileLocation.append(this.GTB_DATA_DIR);
  4761.   if(!this.dictFileLocation.exists()) {
  4762.     this.dictFileLocation.create(1, parseInt("0700", 8))}
  4763.   this.dictFileTmpLocation = this.dictFileLocation.clone();
  4764.   this.dictFileLocation.append(this.FINAL_DICT_FILE);
  4765.   this.dictFileTmpLocation.append(this.TMP_DICT_FILE);
  4766.   this.dictFileDownloads = 0;
  4767.   if(this.dictFileTmpLocation.exists()) {
  4768.     try {
  4769.       this.dictFileTmpLocation.remove(false)}
  4770.     catch(e) {
  4771.     }
  4772.   }
  4773.   this.dictFileDownloading = false;
  4774.   this.dictFileReady = this.dictFileLocation.exists()}
  4775.  
  4776. , getCurrWindow:function() {
  4777.   return document.getElementById("content").selectedBrowser.contentWindow}
  4778.  
  4779. , observe:GTB_MessageObserve, GTB_MESSAGES:{"GTB_OPTION.auto_translate":function(data) {
  4780.   if("false" == data) {
  4781.     GTB_GoogleToolbarOverlay.autoTranslate.deleteDictFile()}
  4782. }
  4783.  
  4784. }, deleteDictFile:function() {
  4785.   this.dictFileReady = false;
  4786.   try {
  4787.     this.dictFileTmpLocation.remove(false)}
  4788.   catch(e) {
  4789.   }
  4790.   try {
  4791.     this.dictFileLocation.remove(false)}
  4792.   catch(e) {
  4793.   }
  4794. }
  4795.  
  4796. , downloadToLangDict:function(to_lang) {
  4797.   if(this.dictFileDownloading)return;
  4798.   this.dictFileDownloading = true;
  4799.   this.deleteDictFile();
  4800.   var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  4801.   var downloader = Components.classes["@mozilla.org/network/downloader;1"].createInstance(Components.interfaces.nsIDownloader);
  4802.   var url = "http://google.com/tools/toolbar/intl/" + to_lang + "/googledict.dat";
  4803.   var channel = ios.newChannel(url, null, null);
  4804.   var observer = new DictFileDownloadObserver(this);
  4805.   downloader.init(observer, this.dictFileTmpLocation);
  4806.   channel.asyncOpen(downloader, null)}
  4807.  
  4808. , getTranslation:function(text) {
  4809.   if(this.dictFileDownloads > this.MAX_FAILED_DOWNLOADS) {
  4810.     alert(this.DOWNLOAD_FAILED);
  4811.     GTB_getPrefs().setBoolPref(GTB_PREF_AUTO_TRANSLATE, false);
  4812.     this.dictFileDownloads = 0;
  4813.     return}
  4814.   var from_lang = "en";
  4815.   var to_lang = GTB_getPrefs().getStringPref("autotranslate_to_lang");
  4816.   if(!this.dictFileReady && !this.dictFileDownloading) {
  4817.     this.downloadToLangDict(to_lang)}
  4818.   if(this.dictFileReady && GTB_GoogleToolbarOverlay.autoTransLibAvailable) {
  4819.     var xpcomobj = Components.classes["@google.com/autotranslate;1"];
  4820.     var autotrans = xpcomobj.createInstance(Components.interfaces.GTBIAutoTranslate);
  4821.     var langpair = from_lang + "2" + to_lang;
  4822.     var translation = autotrans.getTranslation(text, langpair);
  4823.     if(translation) {
  4824.       return translation}
  4825.     else {
  4826.       return""}
  4827.   }
  4828.   else {
  4829.     var host = GTB_GoogleToolbarOverlay.getGoogleHome();
  4830.     var lang = from_lang + "|" + to_lang;
  4831.     var url = GTB_DictionaryUrl(host, text, lang, GTB_GoogleToolbarOverlay.languageCode);
  4832.     var request = new XMLHttpRequest;
  4833.     request.open("GET", url, false);
  4834.     request.send(null);
  4835.     var response = "";
  4836.     if(request.status == 200) {
  4837.       response = request.responseText}
  4838.     return response}
  4839. }
  4840.  
  4841. , _enabled:function() {
  4842.   return GTB_GoogleToolbarOverlay.autoTransLibAvailable && GTB_getPrefs().getBoolPref(GTB_PREF_AUTO_TRANSLATE)}
  4843.  
  4844. , getTooltipBody:function(parent, offset, target) {
  4845.   if(!this._enabled()) {
  4846.     return null}
  4847.   if(parent.parentNode != target) {
  4848.     return null}
  4849.   if(parent.nodeType != Node.TEXT_NODE) {
  4850.     return null}
  4851.   var container = parent.parentNode;
  4852.   if(container) {
  4853.     var foundNode = false;
  4854.     for(var c = container.firstChild;c != null;c = c.nextSibling) {
  4855.       if(c == parent) {
  4856.         foundNode = true;
  4857.         break}
  4858.     }
  4859.     if(!foundNode) {
  4860.       return null}
  4861.   }
  4862.   var range = parent.ownerDocument.createRange();
  4863.   range.selectNode(parent);
  4864.   var str = range.toString();
  4865.   if(offset < 0 || offset >= str.length) {
  4866.     return null}
  4867.   var start = offset;
  4868.   var end = offset + 1;
  4869.   var valid_chars = /\w/;
  4870.   if(!valid_chars.test(str.substring(start, start + 1))) {
  4871.     return null}
  4872.   while(start > 0) {
  4873.     if(valid_chars.test(str.substring(start - 1, start))) {
  4874.       start -- }
  4875.     else {
  4876.       break}
  4877.   }
  4878.   while(end < str.length) {
  4879.     if(valid_chars.test(str.substring(end, end + 1))) {
  4880.       end ++ }
  4881.     else {
  4882.       break}
  4883.   }
  4884.   var text = str.substring(start, end);
  4885.   var translation = this.getTranslation(text);
  4886.   if(translation != "") {
  4887.     var str_to_display = text + ": " + translation;
  4888.     var desc = document.createElement("description");
  4889.     var img = document.createElement("image");
  4890.     img.setAttribute("src", "chrome://google-toolbar/skin/translator.png");
  4891.     img.style.verticalAlign = "middle";
  4892.     desc.appendChild(img);
  4893.     desc.appendChild(document.createTextNode(str_to_display));
  4894.     return[desc]}
  4895. }
  4896.  
  4897. , maybeShowTranslateMenuItem:function() {
  4898.   var menuItem = document.getElementById("gtbAutoTranslateMenuItem");
  4899.   if(!this._enabled()) {
  4900.     menuItem.hidden = true;
  4901.     return}
  4902.   var text = this.getCurrWindow().getSelection();
  4903.   if(!/^\W*([a-zA-Z]+)\W*$/.test(text)) {
  4904.     text = ""}
  4905.   else {
  4906.     text = RegExp.$1}
  4907.   if(menuItem) {
  4908.     if(text == "") {
  4909.       menuItem.hidden = true}
  4910.     else {
  4911.       menuItem.value = text;
  4912.       var localized_str = this.TRANSLATE_TERM;
  4913.       menuItem.label = localized_str.replace("&term;", text);
  4914.       menuItem.hidden = text == ""}
  4915.   }
  4916. }
  4917.  
  4918. , showTranslationAlert:function(text) {
  4919.   var translation = this.getTranslation(text);
  4920.   if(translation != "") {
  4921.     translation = text + ": " + translation}
  4922.   else {
  4923.     var localized_str = this.NO_TRANSLATION;
  4924.     translation = localized_str.replace("&term;", text)}
  4925.   alert(translation)}
  4926.  
  4927. };
  4928. function GTB_Chevron() {
  4929. }
  4930.  
  4931. GTB_Chevron.prototype = {_menus:[], _buttons:[], _nonWindowEventsBlocked:false, _unblockNonWindowEvents:function() {
  4932.   this._nonWindowEventsBlocked = false}
  4933.  
  4934. , _addLookup:function(buttonName, menuName) {
  4935.   this._menus[buttonName] = menuName;
  4936.   this._buttons[menuName] = buttonName}
  4937.  
  4938. , init:function() {
  4939.   this._addLookup("gtbSearchButton", "gtbSearchButtonPopup");
  4940.   this._addLookup("gtbInfo", "gtbInfoPopup");
  4941.   this._addLookup("gtbSpellCheck", "gtbSpellCheckPopup");
  4942.   this._addLookup("gtbAutoLink", "gtbAutoLinkMenu");
  4943.   this._addLookup("gtbFeedSubscribe", "gtbFeedSubscribeMenu");
  4944.   this._addLookup("gtbGoUp", "gtbGoUpPopup");
  4945.   this._addLookup("gtbGoogleMenu", "gtbGoogleMenuPopup")}
  4946.  
  4947. , _getChevronElements:function() {
  4948.   var toolbar = document.getElementById("gtbToolbar");
  4949.   var items = [];
  4950.   var item;
  4951.   for(var i = 0;item = toolbar.childNodes[i]; ++ i) {
  4952.     if(item.id == "gtbNextPrev" || item.id == "gtbFindTerms") {
  4953.       var itemChild;
  4954.       for(var j = 0;itemChild = item.childNodes[j]; ++ j) {
  4955.         if(itemChild.nodeName == "hbox") {
  4956.           var hbox = itemChild;
  4957.           for(var k = 0;k < hbox.childNodes.length;k ++ ) {
  4958.             items.push(hbox.childNodes[k])}
  4959.         }
  4960.         else if(itemChild.nodeName != "tooltip" && itemChild.nodeName != "label") {
  4961.           items.push(itemChild)}
  4962.       }
  4963.     }
  4964.     else if(item.nodeName != "tooltip" && item.nodeType != Node.TEXT_NODE) {
  4965.       items.push(item)}
  4966.   }
  4967.   return items}
  4968.  
  4969. , onShowMenu:function(event, menu) {
  4970.   var children = menu.childNodes;
  4971.   var index = 0;
  4972.   for(var i = children.length - 1;i >= 0; -- i) {
  4973.     index = children[i].getAttribute("index");
  4974.     if(index) {
  4975.       var cmenu = children[i].firstChild;
  4976.       if(cmenu && cmenu.nodeName == "menupopup") {
  4977.         var button = document.getElementById(this._buttons[cmenu.id]);
  4978.         if(button) {
  4979.           button.appendChild(children[i].firstChild)}
  4980.       }
  4981.     }
  4982.     menu.removeChild(children[i])}
  4983.   var items = this._getChevronElements();
  4984.   index = 0;
  4985.   for(i = 0;i < items.length;i ++ ) {
  4986.     var item = items[i];
  4987.     if(item.collapsed && !item.hidden) {
  4988.       if(item.localName == "toolbarseparator") {
  4989.         if(menu.firstChild) {
  4990.           var sep = document.createElement("menuseparator");
  4991.           menu.appendChild(sep)}
  4992.         continue}
  4993.       if(!GTB_isGoogleToolbarItem(item) && item.localName != "toolbarbutton") {
  4994.         continue}
  4995.       if(item.id == "gtbSearchBox") {
  4996.         item = document.getElementById("gtbSearchButton")}
  4997.       var menuItem = null;
  4998.       if("menu" == item.type || "menu-button" == item.type) {
  4999.         menuItem = document.createElement("menu");
  5000.         menuItem.setAttribute("class", "menu-iconic");
  5001.         if(item.attributes["oncommand"] && !item.disabled) {
  5002.           menuItem.setAttribute("onclick", item.attributes["oncommand"].value)}
  5003.       }
  5004.       else {
  5005.         menuItem = document.createElement("menuitem");
  5006.         menuItem.setAttribute("class", "menuitem-iconic");
  5007.         if(item.attributes["oncommand"]) {
  5008.           menuItem.setAttribute("oncommand", item.attributes["oncommand"].value)}
  5009.       }
  5010.       if(item.id == "gtbPageRank") {
  5011.         var image = document.getElementById("gtbPageRankImage");
  5012.         menuItem.setAttribute("image", image.attributes["src"].value);
  5013.         menuItem.setAttribute("tooltiptext", image.tooltipText);
  5014.         menuItem.setAttribute("disabled", true)}
  5015.       else {
  5016.         menuItem.setAttribute("label", item.label);
  5017.         if(item.image) {
  5018.           menuItem.setAttribute("image", item.image)}
  5019.         else {
  5020.           var style = document.defaultView.getComputedStyle(item, "");
  5021.           menuItem.style.listStyleImage = style["listStyleImage"];
  5022.           menuItem.style.MozImageRegion = style["MozImageRegion"]}
  5023.         menuItem.setAttribute("disabled", item.disabled);
  5024.         var tooltip = null;
  5025.         var descs = null;
  5026.         if(item.id == "gtbNextResult") {
  5027.           tooltip = document.getElementById("gtbNextTooltip");
  5028.           descs = tooltip.getElementsByTagName("description");
  5029.           menuItem.setAttribute("tooltiptext", descs[0].value)}
  5030.         else if(item.id == "gtbPreviousResult") {
  5031.           tooltip = document.getElementById("gtbPrevTooltip");
  5032.           descs = tooltip.getElementsByTagName("description");
  5033.           menuItem.setAttribute("tooltiptext", descs[0].value)}
  5034.         else {
  5035.           menuItem.setAttribute("tooltiptext", item.tooltipText)}
  5036.       }
  5037.       if("menu" == item.type || "menu-button" == item.type) {
  5038.         var popup = document.getElementById(this._menus[item.id]);
  5039.         if(popup) {
  5040.           menuItem.appendChild(popup)}
  5041.       }
  5042.       menuItem.setAttribute("index", index);
  5043.       if(GTB_isGoogleToolbarItem(item)) {
  5044.         menuItem.id = "gtbChevronMenu" + item.id}
  5045.       menu.appendChild(menuItem)}
  5046.   }
  5047. }
  5048.  
  5049. , _getWidth:function(element) {
  5050.   try {
  5051.     var style = document.defaultView.getComputedStyle(element, "")}
  5052.   catch(e) {
  5053.     return 0}
  5054.   var leftMargin = style.getPropertyValue("margin-left");
  5055.   if(leftMargin) {
  5056.     leftMargin = Math.round(parseFloat(leftMargin))}
  5057.   else {
  5058.     leftMargin = 0}
  5059.   var rightMargin = style.getPropertyValue("margin-right");
  5060.   if(rightMargin) {
  5061.     rightMargin = Math.round(parseFloat(rightMargin))}
  5062.   else {
  5063.     rightMargin = 0}
  5064.   if(element.localName == "toolbarspring") {
  5065.     return leftMargin + rightMargin}
  5066.   else if(element.id == "urlbar-container" || element.id == "personal-bookmarks") {
  5067.     return leftMargin + rightMargin + 100}
  5068.   return element.boxObject.width + leftMargin + rightMargin}
  5069.  
  5070. , doResize:function(opt_event) {
  5071.   if(opt_event && opt_event.target != document && opt_event.target != window) {
  5072.     if(this._nonWindowEventsBlocked) {
  5073.       return}
  5074.     else {
  5075.       this._nonWindowEventsBlocked = true;
  5076.       setTimeout(GTB_hitch(this, this._unblockNonWindowEvents), 500)}
  5077.   }
  5078.   var chevron = document.getElementById("gtbChevron");
  5079.   chevron.collapsed = false;
  5080.   var chevronWidth = chevron.boxObject.width;
  5081.   var toolbar = document.getElementById("gtbToolbar");
  5082.   var totalSize = toolbar.boxObject.width;
  5083.   var roomLeft = totalSize;
  5084.   var items = this._getChevronElements();
  5085.   var lastVisible = null;
  5086.   for(var i = 0;i < items.length;i ++ ) {
  5087.     if(items[i].id != "gtbChevron" && !items[i].hidden) {
  5088.       lastVisible = items[i].id}
  5089.   }
  5090.   var overflowed = false;
  5091.   var atEnd = false;
  5092.   for(i = 0;i < items.length;i ++ ) {
  5093.     var item = items[i];
  5094.     if(item.id == "gtbChevron") {
  5095.       continue}
  5096.     item.collapsed = false;
  5097.     roomLeft -= this._getWidth(item);
  5098.     if(item.id == lastVisible) {
  5099.       atEnd = true}
  5100.     var roomNeeded = atEnd ? 0 : chevronWidth;
  5101.     if(roomLeft < roomNeeded) {
  5102.       overflowed = true}
  5103.     if(overflowed && item.id == "gtbSearchBox") {
  5104.       var searchBox = document.getElementById("gtbGoogleSearchBox");
  5105.       var sbStyle = document.defaultView.getComputedStyle(searchBox, "");
  5106.       var currentWidth = parseInt(sbStyle["width"]);
  5107.       var minWidth = parseInt(sbStyle["minWidth"]);
  5108.       var resizeBy = roomNeeded - roomLeft;
  5109.       var canResizeBy = currentWidth - minWidth;
  5110.       if(canResizeBy >= resizeBy) {
  5111.         var style = document.defaultView.getComputedStyle(item, "");
  5112.         var oldWidth = parseInt(style["width"]);
  5113.         var newWidth = oldWidth - resizeBy;
  5114.         item.setAttribute("width", newWidth);
  5115.         continue}
  5116.     }
  5117.     item.collapsed = overflowed;
  5118.     if(this._menus[item.id] && !item.collapsed) {
  5119.       var found = false;
  5120.       for(var j = 0;j < item.childNodes.length;j ++ ) {
  5121.         var child = item.childNodes[j];
  5122.         if(child.id == this._menus[item.id]) {
  5123.           found = true}
  5124.       }
  5125.       if(!found) {
  5126.         var popup = document.getElementById(this._menus[item.id]);
  5127.         if(popup != null) {
  5128.           item.appendChild(popup)}
  5129.       }
  5130.     }
  5131.   }
  5132.   chevron.collapsed = !overflowed}
  5133.  
  5134. };
  5135. function GTB_CustomSearch() {
  5136. }
  5137.  
  5138. GTB_CustomSearch.prototype = {_GmailSearch:{title:"Gmail", tip:"Gmail", url:"http://gmail.google.com/gmail?search=query&view=tl&start=0&init=1&fs=1&q={query}", site:"http://gmail.google.com/", searchId:"Gmail", priority:"0", icon:"data:image/x-icon,%00%00%01%00%01%00%10%10%00%00%01%00%20%00h%04%00%00%16%00%00%00%28%00%00%00%10%00%00%00%20%00%00%00%01%00%20%00%00%00%00%00%00%00%00%00%13%0B%00%00%13%0B%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%0088%DA%FF88%DA%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%E2%E2%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%E2%E2%FF%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%A7%A7%F9%FF%E2%E2%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%E2%E2%FF%FF%A7%A7%F9%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%E2%E2%FF%FF%A7%A7%F9%FF%E2%E2%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%81%81%F2%FF%81%81%F2%FF%FF%FF%FF%FF%FF%FF%FF%FF%E2%E2%FF%FF%A7%A7%F9%FF%E2%E2%FF%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%FF%FF%FF%FF%E2%E2%FF%FF%A7%A7%F9%FF%B6%B6%FF%FF%81%81%F2%FFZZ%E9%FFZZ%E9%FF%81%81%F2%FF%B6%B6%FF%FF%A7%A7%F9%FF%E2%E2%FF%FF%FF%FF%FF%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%FF%FF%FF%FF%FF%FF%FF%FF%B6%B6%FF%FF%81%81%F2%FFZZ%E9%FF88%DA%FF88%DA%FFZZ%E9%FF%81%81%F2%FF%B6%B6%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%FF%FF%FF%FF%FF%FF%FF%FF%81%81%F2%FFZZ%E9%FF88%DA%FF%B6%B6%FF%FF%B6%B6%FF%FF88%DA%FFZZ%E9%FF%81%81%F2%FF%FF%FF%FF%FF%FF%FF%FF%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%FF%FF%FF%FF%81%81%F2%FFZZ%E9%FF88%DA%FF%B6%B6%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%B6%B6%FF%FF88%DA%FFZZ%E9%FF%81%81%F2%FF%FF%FF%FF%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%81%81%F2%FFZZ%E9%FF88%DA%FF%B6%B6%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%B6%B6%FF%FF88%DA%FFZZ%E9%FF%81%81%F2%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%B6%B6%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%B6%B6%FF%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF88%DA%FF%81%81%F2%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%A7%A7%F9%FF%81%81%F2%FF88%DA%FF88%DA%FF88%DA%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%FF%FF%00%00%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%FF%FF%00%00%FF%FF%00%00%FF%FF%00%00"
  5139. }, _searches:[], comparePriorities:function(a, b) {
  5140.   if(a.priority < b.priority)return-1;
  5141.   if(a.priority > b.priority)return 1;
  5142.   if(a.searchId < b.searchId)return-1;
  5143.   if(a.searchId > b.searchId)return 1;
  5144.   return 0}
  5145.  
  5146. , init:function() {
  5147.   var cs = Components.classes["@google.com/customsearch;1"];
  5148.   if(cs) {
  5149.     var obj = cs.createInstance(Components.interfaces.GTBICustomSearch);
  5150.     if(obj) {
  5151.       while(obj.searchId) {
  5152.         var newsearch = {};
  5153.         var searchId = obj.searchId.toLowerCase();
  5154.         var prefix = searchId.substr(0, 5);
  5155.         if(prefix == "hkcu_" || prefix == "hklm_")searchId = searchId.substr(5);
  5156.         newsearch["searchId"] = searchId;
  5157.         newsearch["priority"] = "0";
  5158.         while(obj.attr) {
  5159.           var attr = obj.attr.toLowerCase();
  5160.           if(attr == "icon") {
  5161.             var value = obj.value;
  5162.             if(!obj.isBinary) {
  5163.               value = window.atob(obj.value)}
  5164.             newsearch[attr] = "data:image/x-icon," + escape(value)}
  5165.           else if(!obj.isBinary) {
  5166.             newsearch[attr] = obj.value;
  5167.             if(attr == "title") {
  5168.               newsearch[attr] = newsearch[attr].replace("&", "")}
  5169.           }
  5170.           obj.nextAttr()}
  5171.         if(newsearch.icon == null) {
  5172.           newsearch.icon = "chrome://google-toolbar/skin/custom-unknown.png"}
  5173.         this._searches.push(newsearch);
  5174.         obj.nextSearch()}
  5175.       obj.finish()}
  5176.   }
  5177.   if(GTB_GoogleToolbarOverlay.languageCode == "en") {
  5178.     var addGmail = true;
  5179.     for(var i = 0;i < this._searches.length;i ++ ) {
  5180.       if(this._searches[i].searchId == "gmail") {
  5181.         addGmail = false;
  5182.         break}
  5183.     }
  5184.     if(addGmail) {
  5185.       this._searches.push(this._GmailSearch)}
  5186.   }
  5187.   this._searches.sort(this.comparePriorities);
  5188.   var toolbox = document.getElementById("navigator-toolbox");
  5189.   var toolbarPalette = toolbox.palette;
  5190.   var beforeThis = null;
  5191.   for(var index = 0;index < toolbarPalette.childNodes.length;index ++ ) {
  5192.     if(toolbarPalette.childNodes[index].id == "gtbNextPrev") {
  5193.       beforeThis = toolbarPalette.childNodes[index];
  5194.       break}
  5195.   }
  5196.   for(var i = 0;i < this._searches.length;i ++ ) {
  5197.     var search = this._searches[i];
  5198.     var button = document.createElement("toolbarbutton");
  5199.     button.setAttribute("id", this.searchToButtonId(search));
  5200.     button.setAttribute("oncommand", 'GTB_GTO_onGoogleSearchType(event, "GTB_Custom_Search_' + i + '")');
  5201.     button.setAttribute("onclick", "GTB_GTO_onClickMiddleMouse(event);");
  5202.     button.setAttribute("image", search.icon);
  5203.     button.setAttribute("label", search.title);
  5204.     button.setAttribute("class", "gtb-toolbarbutton");
  5205.     if(this._searches[i].tip) {
  5206.       button.setAttribute("tooltiptext", search.tip)}
  5207.     else {
  5208.       button.setAttribute("tooltiptext", search.title)}
  5209.     button = toolbarPalette.insertBefore(button, beforeThis);
  5210.     var prefName = "button_option." + button.id;
  5211.     var prefs = GTB_getPrefs();
  5212.     var on = prefs.getBoolPrefWithDefault(prefName, false);
  5213.     if(on) {
  5214.       var inserted = false;
  5215.       for(var t = 0;t < toolbox.childNodes.length;t ++ ) {
  5216.         var toolbar = toolbox.childNodes[t];
  5217.         var currentSet = toolbar.getAttribute("currentset");
  5218.         if(currentSet.indexOf(button.id) != -1) {
  5219.           var buttonList = currentSet.split(",");
  5220.           var passedButton = false;
  5221.           var nextButton = null;
  5222.           for(var b = 0;b < buttonList.length;b ++ ) {
  5223.             if(passedButton) {
  5224.               nextButton = document.getElementById(buttonList[b]);
  5225.               if(nextButton) {
  5226.                 break}
  5227.             }
  5228.             if(buttonList[b] == button.id) {
  5229.               passedButton = true}
  5230.           }
  5231.           toolbar.insertItem(button.id, nextButton);
  5232.           inserted = true;
  5233.           break}
  5234.       }
  5235.       if(!inserted) {
  5236.         GTB_getToolbar()._addButton(button.id)}
  5237.     }
  5238.   }
  5239. }
  5240.  
  5241. , onCustomSearch:function(event, index) {
  5242.   var userText = GTB_GoogleToolbarOverlay.rememberSearchText();
  5243.   userText = userText == null ? "" : userText;
  5244.   var site = this.getCustomSearchURL(index, userText);
  5245.   GTB_GoogleToolbarOverlay._loadSearchURL(site);
  5246.   event.preventBubble()}
  5247.  
  5248. , getCustomSearchURL:function(index, userText) {
  5249.   var search = this._searches[index];
  5250.   var url = search.url == null ? "" : search.url;
  5251.   var site = search.site == null ? "" : search.site;
  5252.   if(userText != "" || site == "") {
  5253.     var home = GTB_GoogleToolbarOverlay.getGoogleHome();
  5254.     home = home.replace(/.*google\./, "");
  5255.     url = url.replace("{0}", home);
  5256.     url = url.replace("{domain}", home);
  5257.     var encodedSearch = encodeURIComponent(userText);
  5258.     url = url.replace("{1}", encodedSearch);
  5259.     url = url.replace("{query}", encodedSearch);
  5260.     site = url.replace(/[{][^}]*[}]/, "")}
  5261.   return site}
  5262.  
  5263. , searchToCheckboxId:function(search) {
  5264.   return"gtbCustomSearch_" + search.title}
  5265.  
  5266. , searchToButtonId:function(search) {
  5267.   return"gtbCustomButton" + search.title}
  5268.  
  5269. , addSearchesToDropDown:function() {
  5270.   var sep = document.getElementById("gtbCustomSearchSep");
  5271.   var nextSep = document.getElementById("gtbShowToolbarSep");
  5272.   var i;
  5273.   if(sep != null && nextSep != null) {
  5274.     if(sep.nextSibling == nextSep) {
  5275.       var menu = sep.parentNode;
  5276.       if(this._searches.length == 0) {
  5277.         menu.removeChild(sep)}
  5278.       else {
  5279.         for(i = 0;i < this._searches.length;i ++ ) {
  5280.           var customItem = document.createElement("menuitem");
  5281.           customItem.setAttribute("class", "menuitem-iconic");
  5282.           customItem.setAttribute("label", this._searches[i].title);
  5283.           if(this._searches[i].tip) {
  5284.             customItem.setAttribute("tooltiptext", this._searches[i].tip)}
  5285.           else {
  5286.             customItem.setAttribute("tooltiptext", this._searches[i].title)}
  5287.           customItem.setAttribute("image", this._searches[i].icon);
  5288.           customItem.setAttribute("oncommand", 'GTB_GTO_onGoogleSearchType(event, "GTB_Custom_Search_' + i + '", true)');
  5289.           customItem.setAttribute("onclick", "GTB_GTO_onClickMiddleMouse(event);");
  5290.           menu.insertBefore(customItem, nextSep)}
  5291.       }
  5292.     }
  5293.   }
  5294. }
  5295.  
  5296. };
  5297. function GTB_makeGoogleDefaultSearch(win) {
  5298.   if(win != null) {
  5299.     var dirSvc = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  5300.     var plugDir = dirSvc.get("SrchPlugns", Components.interfaces.nsILocalFile);
  5301.     var googleSrc = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  5302.     googleSrc.initWithPath(plugDir.path);
  5303.     googleSrc.appendRelativePath("google.src");
  5304.     var googleGif = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  5305.     googleGif.initWithPath(plugDir.path);
  5306.     googleGif.appendRelativePath("google.gif");
  5307.     if(win.document != null) {
  5308.       var searchbar = win.document.getElementById("searchbar");
  5309.       if(searchbar != null) {
  5310.         searchbar.setAttribute("searchengine", "engine://" + escape(googleSrc.path));
  5311.         searchbar.setAttribute("src", "file:///" + escape(googleGif.path))}
  5312.     }
  5313.   }
  5314.   var psvc = Components.classes["@mozilla.org/preferences;1"].getService(Components.interfaces.nsIPrefBranch);
  5315.   psvc.setCharPref("browser.search.defaultenginename", "Google");
  5316.   psvc.setCharPref("browser.search.defaulturl", "http://www.google.com/search?lr=&ie=UTF-8&oe=UTF-8&q=");
  5317.   psvc.setCharPref("browser.search.selectedEngine", "Google")}
  5318.  
  5319. function GTB_FirstRun_onAccept() {
  5320.   var enRadio = document.getElementById("gtbFirstRunEnablePageRank");
  5321.   var disRadio = document.getElementById("gtbFirstRunDisablePageRank");
  5322.   var en = enRadio.selected;
  5323.   var dis = disRadio.selected;
  5324.   if(!(en || dis)) {
  5325.     return false}
  5326.   var googleSearchDefault = document.getElementById("gtbFirstRunGoogleSearchDefault");
  5327.   if(googleSearchDefault.checked) {
  5328.     GTB_makeGoogleDefaultSearch(window.opener)}
  5329.   var allowGoogleCheckbox = document.getElementById("gtbFirstRunAllowGoogleExtensions");
  5330.   if(allowGoogleCheckbox.checked) {
  5331.     var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  5332.     var pm = Components.classes["@mozilla.org/permissionmanager;1"].getService(Components.interfaces.nsIPermissionManager);
  5333.     if(pm && ios) {
  5334.       var uri = ios.newURI("http://tools.google.com/", null, null);
  5335.       pm.add(uri, "install", Components.interfaces.nsIPermissionManager.ALLOW_ACTION)}
  5336.   }
  5337.   GTB_getPrefs().setBoolPref(GTB_PREF_OPT_IN, en);
  5338.   GTB_getPrefs().setStringPref(GTB_PREF_GOOGLE_HOME, GTB_FirstRun_googleHome());
  5339.   return true}
  5340.  
  5341. var GTB_TOOLBAR_FIRSTRUN_MOREINFO_OPTIONS = "chrome,width=800,height=600,resizable=yes,scrollbars=yes";
  5342. function GTB_FirstRun_onToolbarPrivacyPolicy() {
  5343.   var lang = window.arguments[0];
  5344.   GTB_FirstRun_showToolbarPrivacyPolicy(lang, GTB_TOOLBAR_FIRSTRUN_MOREINFO_OPTIONS)}
  5345.  
  5346. function GTB_FirstRun_onPageRankConfirmHelp() {
  5347.   var stringBundle = document.getElementById("gtb-localized_prefs");
  5348.   var lang = stringBundle.getString("lang");
  5349.   GTB_FirstRun_showToolbarPrivacyPolicy(lang)}
  5350.  
  5351. function GTB_FirstRun_showToolbarPrivacyPolicy(lang, opt_options) {
  5352.   var url = "http://www.google.com/support/toolbar/?quick=privacy";
  5353.   url += "&v=2.0f&hl=";
  5354.   url += lang;
  5355.   if(opt_options) {
  5356.     window.open(url, "gtbToolbarPrivacyPolicy", opt_options)}
  5357.   else {
  5358.     window.open(url, "gtbToolbarPrivacyPolicy")}
  5359. }
  5360.  
  5361. function GTB_FirstRun_onGooglePrivacyPolicy() {
  5362.   var stringBundle = document.getElementById("gtb-localized_prefs");
  5363.   var lang = stringBundle.getString("lang");
  5364.   GTB_FirstRun_showGooglePrivacyPolicy(lang)}
  5365.  
  5366. function GTB_FirstRun_showGooglePrivacyPolicy(lang) {
  5367.   var url = "http://www.google.com/privacy.html";
  5368.   window.open(url, "gtbGooglePrivacyPolicy", GTB_TOOLBAR_FIRSTRUN_MOREINFO_OPTIONS)}
  5369.  
  5370. function GTB_FirstRun_onToolbarLimitedInformation() {
  5371.   var stringBundle = document.getElementById("gtb-localized_prefs");
  5372.   var lang = stringBundle.getString("lang");
  5373.   GTB_FirstRun_showToolbarLimitedInformation(lang)}
  5374.  
  5375. function GTB_FirstRun_showToolbarLimitedInformation(lang) {
  5376.   var url = "http://www.google.com/support/toolbar/bin/answer.py?answer=34798&hl=";
  5377.   url += lang;
  5378.   window.open(url, "gtbToolbarLimitedInformation", GTB_TOOLBAR_FIRSTRUN_MOREINFO_OPTIONS)}
  5379.  
  5380. function GTB_FirstRun_onLoad(event) {
  5381.   var menulist = document.getElementById("gtbFirstRunWhichGoogleList");
  5382.   GTB_getPrefs().selectValueFromMenu(GTB_PREF_GOOGLE_HOME, menulist);
  5383.   var dialog = document.getElementById("gtbFirstRun");
  5384.   var button = dialog.getButton("accept");
  5385.   button.disabled = true;
  5386.   var handler = function() {
  5387.     button.disabled = false}
  5388.   
  5389.   ;
  5390.   var enable = document.getElementById("gtbFirstRunEnablePageRank");
  5391.   var disable = document.getElementById("gtbFirstRunDisablePageRank");
  5392.   enable.addEventListener("command", handler, true);
  5393.   disable.addEventListener("command", handler, true)}
  5394.  
  5395. function GTB_FirstRun_googleHome() {
  5396.   var menulist = document.getElementById("gtbFirstRunWhichGoogleList");
  5397.   var whichGoogle = menulist.selectedItem;
  5398.   var site = whichGoogle.label;
  5399.   return site}
  5400.  
  5401. function GTB_Highlighter() {
  5402. }
  5403.  
  5404. GTB_Highlighter.prototype = {_GOOGLE_TOOLBAR_ID:"google-toolbar-hilite-", _MAX_TERMS:10, _TERM_BUTTON_TOOLTIP:null, observe:GTB_MessageObserve, GTB_MESSAGES:{"GTB_OPTION.button_option.gtbHighlight":function(data) {
  5405.   if("false" == data) {
  5406.     GTB_getToolbar().highlighter.unhighlight()}
  5407.   else {
  5408.     GTB_getToolbar().highlighter.updateUiToHighlightFlag()}
  5409. }
  5410.  
  5411. , "GTB_OPTION.button_option.gtbFindTerms":function(data) {
  5412.   if("true" == data) {
  5413.     GTB_getToolbar().highlighter._currentWords = [];
  5414.     GTB_getToolbar().highlighter.onSearchTextChanged()}
  5415. }
  5416.  
  5417. }, init:function() {
  5418.   var stringBundle = document.getElementById("google-toolbar-strings");
  5419.   this._TERM_BUTTON_TOOLTIP = stringBundle.getString("prop.google-term.tooltip")}
  5420.  
  5421. , _highlightFlag:false, _currentWords:[], _HIGHLIGHT_COLORS:["Yellow", "Cyan", "Fuchsia", "Chartreuse", "Dodgerblue"], updateUiToHighlightFlag:function() {
  5422.   var button = this._getHighlightButton();
  5423.   if(button != null) {
  5424.     button.checked = this._highlightFlag;
  5425.     var highlightIcon = this._highlightFlag ? "highlight-on.png" : "highlight.png";
  5426.     button.setAttribute("image", "chrome://google-toolbar/skin/" + highlightIcon)}
  5427. }
  5428.  
  5429. , toggle:function() {
  5430.   this._highlightFlag = !this._highlightFlag;
  5431.   this.updateUiToHighlightFlag();
  5432.   if(document.getElementById("gtbFindTerms")) {
  5433.     for(var index = 0;index < this._MAX_TERMS;index ++ ) {
  5434.       var termButton = this._getHighlightTermButton(index);
  5435.       var wordFindIcon = "find.png";
  5436.       if(this._highlightFlag) {
  5437.         wordFindIcon = "find-" + this._HIGHLIGHT_COLORS[index % this._HIGHLIGHT_COLORS.length].toLowerCase() + ".png"}
  5438.       termButton.setAttribute("image", "chrome://google-toolbar/skin/" + wordFindIcon)}
  5439.   }
  5440.   if(this._highlightFlag) {
  5441.     this._highlight()}
  5442.   else {
  5443.     this._unhighlight()}
  5444. }
  5445.  
  5446. , onPageLoad:function() {
  5447.   if(this._highlightFlag) {
  5448.     this._highlight()}
  5449. }
  5450.  
  5451. , onTabSwitch:function() {
  5452.   if(this._highlightFlag) {
  5453.     this._highlight()}
  5454.   else {
  5455.     this._unhighlight()}
  5456. }
  5457.  
  5458. , _getSearchTextBox:function() {
  5459.   var searchTextBox = document.getElementById("gtbGoogleSearchBox");
  5460.   return searchTextBox}
  5461.  
  5462. , _getSearchTextValue:function() {
  5463.   var searchTextBox = this._getSearchTextBox();
  5464.   if(searchTextBox == null) {
  5465.     return""}
  5466.   return searchTextBox.value}
  5467.  
  5468. , _selectText:function(text) {
  5469. }
  5470.  
  5471. , _isWhitespace:function(ch) {
  5472.   return/^\s$/.test(ch)}
  5473.  
  5474. , _isPunctuation:function(ch) {
  5475.   return/[`~!@#$%^&\*()-+={}\[\]|\\:;\"<>,\.\?\/]/.test(ch)}
  5476.  
  5477. , _isWordCharacter:function(ch) {
  5478.   if(ch == null || typeof ch != "string" || ch.length != 1) {
  5479.     return false}
  5480.   var code = ch.charCodeAt(0);
  5481.   return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 97 && code <= 122 || code >= 138 && code <= 142 || code >= 154 && code <= 159 || code >= 192 && code <= 255}
  5482.  
  5483. , _beginsWith:function(str, pref) {
  5484.   return str.substring(0, pref.length).toUpperCase() == pref.toUpperCase()}
  5485.  
  5486. , _extractCommandString:function(input, command) {
  5487.   var result = ["", input, false];
  5488.   var inQuotes = false;
  5489.   for(var i = 0;i < input.length; ++ i) {
  5490.     if(inQuotes) {
  5491.       if(input[i] == '"') {
  5492.         inQuotes = false}
  5493.     }
  5494.     else {
  5495.       if(input[i] == '"') {
  5496.         inQuotes = true}
  5497.       else if(i == 0 || this._isWhitespace(input[i - 1])) {
  5498.         if(this._beginsWith(input.substring(i), command)) {
  5499.           result[0] = input.substring(i + command.length);
  5500.           result[1] = input.substring(0, i);
  5501.           result[2] = true;
  5502.           break}
  5503.       }
  5504.     }
  5505.   }
  5506.   return result}
  5507.  
  5508. , _tokenizeSearchQuery:function(input) {
  5509.   var tokens = [];
  5510.   var state = 0;
  5511.   for(var i = 0;i < input.length; ++ i) {
  5512.     var ch = input[i];
  5513.     if(state == 0) {
  5514.       if(ch == '"') {
  5515.         tokens.push(["", true]);
  5516.         state = 2}
  5517.       else if(!this._isWhitespace(ch) && !this._isPunctuation(ch)) {
  5518.         tokens.push([ch, false]);
  5519.         state = 1}
  5520.     }
  5521.     else if(state == 1) {
  5522.       if(this._isWhitespace(ch) || this._isPunctuation(ch)) {
  5523.         state = 0}
  5524.       else {
  5525.         tokens[tokens.length - 1][0] += ch}
  5526.     }
  5527.     else if(state == 2) {
  5528.       if(ch == '"') {
  5529.         state = 0}
  5530.       else {
  5531.         tokens[tokens.length - 1][0] += ch}
  5532.     }
  5533.   }
  5534.   return tokens}
  5535.  
  5536. , _removeOperators:function(tokens) {
  5537.   var results = [];
  5538.   for(var i = 0;i < tokens.length; ++ i) {
  5539.     var token = tokens[i][0];
  5540.     if(tokens[i][1]) {
  5541.       if(token.length > 0) {
  5542.         results.push(token)}
  5543.       continue}
  5544.     if(token.toUpperCase() == "OR") {
  5545.       continue}
  5546.     if(token[0] == "-") {
  5547.       continue}
  5548.     if(token == "*" || token == "/" || token == "^" || token == "%") {
  5549.       continue}
  5550.     if(/\d+\.\.\.\d+/.test(token)) {
  5551.       continue}
  5552.     if(token[0] == "~") {
  5553.       token = token.substring(1)}
  5554.     results.push(token)}
  5555.   return results}
  5556.  
  5557. , _normalizeSpacing:function(tokens) {
  5558.   var results = [];
  5559.   for(var i = 0;i < tokens.length; ++ i) {
  5560.     var token = tokens[i];
  5561.     token = token.replace(/^\s+/, "");
  5562.     token = token.replace(/\s+$/, "");
  5563.     token = token.replace(/\s+/g, " ");
  5564.     if(token.length > 0) {
  5565.       results.push(token)}
  5566.   }
  5567.   return results}
  5568.  
  5569. , _removeDuplicates:function(list) {
  5570.   var member = function(array, item) {
  5571.     for(var index in array) {
  5572.       if(item == array[index]) {
  5573.         return true}
  5574.     }
  5575.     return false}
  5576.   
  5577.   ;
  5578.   var result = [];
  5579.   for(var i = 0;i < list.length; ++ i) {
  5580.     if(!member(result, list[i])) {
  5581.       result.push(list[i])}
  5582.   }
  5583.   return result}
  5584.  
  5585. , _splitUpSearchQuery:function(query) {
  5586.   var tokens = [];
  5587.   tokens = this._tokenizeSearchQuery(query);
  5588.   tokens = this._removeOperators(tokens);
  5589.   tokens = this._normalizeSpacing(tokens);
  5590.   return this._removeDuplicates(tokens)}
  5591.  
  5592. , _sameWordList:function(a, b) {
  5593.   var result = a.length == b.length;
  5594.   var index = 0;
  5595.   while(result && index < a.length) {
  5596.     result = a[index] == b[index];
  5597.     index ++ }
  5598.   return result}
  5599.  
  5600. , _getHighlightTermButton:function(index) {
  5601.   var button = document.getElementById("gtbFindTerm" + index);
  5602.   return button}
  5603.  
  5604. , _onCurrentWordsChanged:function(newWords, oldWords) {
  5605.   if(document.getElementById("gtbFindTerms") == null) {
  5606.     return}
  5607.   var tooltip = this._TERM_BUTTON_TOOLTIP;
  5608.   for(var index = 0;index < this._MAX_TERMS;index ++ ) {
  5609.     var button = this._getHighlightTermButton(index);
  5610.     var isHidden = index >= newWords.length;
  5611.     button.hidden = isHidden;
  5612.     if(!isHidden && newWords[index] != oldWords[index]) {
  5613.       button.label = newWords[index];
  5614.       button.tooltipText = tooltip.replace("$term;", newWords[index])}
  5615.   }
  5616.   GTB_GoogleToolbarOverlay.chevron.doResize()}
  5617.  
  5618. , _checkSearchWordList:function(opt_text) {
  5619.   var text = opt_text != null ? opt_text : this._getSearchTextValue();
  5620.   GTB_getToolbar().lastQuery = text;
  5621.   var newText = GTB_GoogleToolbarOverlay._removeQueryOperators(text);
  5622.   var words = this._splitUpSearchQuery(newText);
  5623.   if(!this._sameWordList(words, this._currentWords)) {
  5624.     this._onCurrentWordsChanged(words, this._currentWords);
  5625.     this._currentWords = words}
  5626.   return{hasTerms:words.length > 0, hasOps:text != newText}}
  5627.  
  5628. , _replaceSearchNewLines:function() {
  5629.   var textbox = this._getSearchTextBox();
  5630.   if(textbox) {
  5631.     var value = textbox.value;
  5632.     if(textbox && /[\n\r]/.test(value)) {
  5633.       value = value.replace(/[\n\r]/g, " ");
  5634.       textbox.value = value}
  5635.   }
  5636. }
  5637.  
  5638. , toggleWordFindEnabled:function() {
  5639.   this._onCurrentWordsChanged(this._currentWords, this._currentWords)}
  5640.  
  5641. , _isSearchTextBoxEmpty:function() {
  5642.   var text = this._getSearchTextValue();
  5643.   return text.length == 0}
  5644.  
  5645. , onSearchTextChanged:function(opt_text) {
  5646.   this._replaceSearchNewLines();
  5647.   return this._checkSearchWordList(opt_text)}
  5648.  
  5649. , findTerm:function(index, forward) {
  5650.   this.findTermText(this._currentWords[index], forward)}
  5651.  
  5652. , findTermText:function(text, forward) {
  5653.   if(getBrowser().findString == text) {
  5654.     if(forward) {
  5655.       findNext()}
  5656.     else {
  5657.       findPrevious()}
  5658.   }
  5659.   else {
  5660.     find(text);
  5661.     if(!forward) {
  5662.       findPrevious()}
  5663.   }
  5664. }
  5665.  
  5666. , _getHighlightButton:function() {
  5667.   var button = document.getElementById("gtbHighlight");
  5668.   return button}
  5669.  
  5670. , _highlightRange:function(range, color, id) {
  5671.   GTB_Dump(GTB_Dump.HI, "highlighting: " + id);
  5672.   var startContainer = range.startContainer;
  5673.   var spanNode = startContainer.ownerDocument.createElement("layer");
  5674.   spanNode.style.backgroundColor = color;
  5675.   spanNode.style.color = "black";
  5676.   spanNode.id = id;
  5677.   var docfrag = range.extractContents();
  5678.   spanNode.appendChild(docfrag);
  5679.   range.insertNode(spanNode);
  5680.   return spanNode}
  5681.  
  5682. , unhighlight:function() {
  5683.   if(this._highlightFlag) {
  5684.     this.toggle()}
  5685. }
  5686.  
  5687. , doPageHide:function(event) {
  5688.   if(event.persisted) {
  5689.     this._unhighlight()}
  5690. }
  5691.  
  5692. , _unhighlight:function() {
  5693.   var count = 0;
  5694.   var win = GTB_GoogleToolbarOverlay._getCurrentWindow();
  5695.   while(this._unhighlightWindow(win, count)) {
  5696.     count ++ }
  5697.   GTB_Dump(GTB_Dump.HI, "Last count unhighlighted: " + count)}
  5698.  
  5699. , _unhighlightWindow:function(win, count) {
  5700.   var result = false;
  5701.   if(win != null) {
  5702.     var doc = win.document;
  5703.     doc.normalize();
  5704.     if(win.frames != null) {
  5705.       for(var i = 0;i < win.frames.length;i ++ ) {
  5706.         if(this._unhighlightWindow(win.frames[i], count)) {
  5707.           result = true}
  5708.       }
  5709.     }
  5710.     if(!result) {
  5711.       var layer = doc.getElementById(this._GOOGLE_TOOLBAR_ID + count);
  5712.       while(layer != null) {
  5713.         var parent = layer.parentNode;
  5714.         var children = layer.childNodes;
  5715.         for(var index = children.length - 1;index >= 0;index -- ) {
  5716.           parent.insertBefore(children[0], layer)}
  5717.         parent.removeChild(layer);
  5718.         result = true;
  5719.         layer = doc.getElementById(this._GOOGLE_TOOLBAR_ID + count)}
  5720.     }
  5721.   }
  5722.   return result}
  5723.  
  5724. , _highlight:function() {
  5725.   this._unhighlight();
  5726.   var count = 0;
  5727.   for(var index = 0;index < this._currentWords.length;index ++ ) {
  5728.     var numHighlight = this._highlightWindow(GTB_GoogleToolbarOverlay._getCurrentWindow(), this._currentWords[index], this._HIGHLIGHT_COLORS[index % this._HIGHLIGHT_COLORS.length], count);
  5729.     count += numHighlight}
  5730.   GTB_Dump(GTB_Dump.HI, "Number of ranges highlighted: " + count)}
  5731.  
  5732. , _isNodeInputNodeOrChildOf:function(node) {
  5733.   if(node.nodeName.toUpperCase() == "INPUT") {
  5734.     return true}
  5735.   if(node.parentNode != null) {
  5736.     return this._isNodeInputNodeOrChildOf(node.parentNode)}
  5737.   return false}
  5738.  
  5739. , _highlightWindow:function(win, text, color, idIndex) {
  5740.   GTB_Dump(GTB_Dump.HI, "Highlighting: " + text);
  5741.   var count = 0;
  5742.   if(win.frames != null) {
  5743.     for(var i = 0;i < win.frames.length;i ++ ) {
  5744.       var numHighlight = this._highlightWindow(win.frames[i], text, color, idIndex + count);
  5745.       count += numHighlight}
  5746.   }
  5747.   var doc = win.document;
  5748.   if(doc != null) {
  5749.     var body = doc.body;
  5750.     if(body != null) {
  5751.       var docRange = doc.createRange();
  5752.       docRange.selectNode(body);
  5753.       var startRange = docRange.cloneRange();
  5754.       startRange.collapse(true);
  5755.       var stopRange = docRange.cloneRange();
  5756.       stopRange.collapse(false);
  5757.       var findRange = Components.classes["@mozilla.org/embedcomp/rangefind;1"].createInstance();
  5758.       if(findRange != null && findRange  instanceof Components.interfaces.nsIFind) {
  5759.         findRange.caseSensitive = false;
  5760.         findRange.findBackwards = false;
  5761.         var result = findRange.Find(text, docRange, startRange, stopRange);
  5762.         while(null != result) {
  5763.           if(result.endContainer != null && result.startContainer != null && result.endContainer.nodeType == Node.TEXT_NODE && result.startContainer.nodeType == Node.TEXT_NODE && !this._isNodeInputNodeOrChildOf(result.startContainer) && !this._isNodeInputNodeOrChildOf(result.endContainer)) {
  5764.             var startChar = null;
  5765.             if(result.startOffset > 0) {
  5766.               startChar = result.startContainer.nodeValue.charAt(result.startOffset - 1)}
  5767.             var endChar = result.endContainer.nodeValue.charAt(result.endOffset);
  5768.             if(!this._isWordCharacter(startChar) && !this._isWordCharacter(endChar)) {
  5769.               var spanNode = this._highlightRange(result, color, this._GOOGLE_TOOLBAR_ID + (idIndex + count));
  5770.               startRange.selectNode(spanNode);
  5771.               count ++ }
  5772.             else {
  5773.               startRange = result}
  5774.           }
  5775.           else {
  5776.             startRange = result}
  5777.           startRange.collapse(false);
  5778.           result = findRange.Find(text, docRange, startRange, stopRange)}
  5779.       }
  5780.     }
  5781.   }
  5782.   return count}
  5783.  
  5784. };
  5785. function GTB_InfoButton() {
  5786.   var stringBundle = document.getElementById("google-toolbar-strings");
  5787.   this._TOOLTIP_NO_INFO = stringBundle.getString("prop.google-info.noinfo");
  5788.   this._TOOLTIP_MORE_INFO = stringBundle.getString("prop.google-info.moreinfo");
  5789.   this._TOOLTIP_CACHE = stringBundle.getString("prop.info.cache.tooltip");
  5790.   this._TOOLTIP_SIMILAR = stringBundle.getString("prop.info.related.tooltip");
  5791.   this._TOOLTIP_BACKLINKS = stringBundle.getString("prop.info.backlinks.tooltip");
  5792.   this._TOOLTIP_TRANSLATE = stringBundle.getString("prop.info.translate.tooltip");
  5793.   try {
  5794.     var localeBundle = document.getElementById("gtb-localized_prefs");
  5795.     var available = localeBundle.getString("page_translate_available");
  5796.     if(available != "true") {
  5797.       var translateItem = document.getElementById("gtbInfoTranslate");
  5798.       if(translateItem && translateItem.parentNode) {
  5799.         translateItem.parentNode.removeChild(translateItem)}
  5800.     }
  5801.   }
  5802.   catch(e) {
  5803.   }
  5804. }
  5805.  
  5806. GTB_InfoButton.prototype = {observe:GTB_MessageObserve, GTB_MESSAGES:{"GTB_OPTION.button_option.gtbInfo":function(data) {
  5807.   if("true" == data) {
  5808.     try {
  5809.       var localeBundle = document.getElementById("gtb-localized_prefs");
  5810.       var available = localeBundle.getString("page_translate_available");
  5811.       if(available != "true") {
  5812.         var translateItem = document.getElementById("gtbInfoTranslate");
  5813.         if(translateItem && translateItem.parentNode) {
  5814.           translateItem.parentNode.removeChild(translateItem)}
  5815.       }
  5816.     }
  5817.     catch(e) {
  5818.     }
  5819.     GTB_getToolbar().infoButton.onPageChange(null)}
  5820. }
  5821.  
  5822. }, init:function() {
  5823. }
  5824.  
  5825. , onPageChange:function(event) {
  5826.   var infoButton = document.getElementById("gtbInfo");
  5827.   if(infoButton == null) {
  5828.     return}
  5829.   if(event && event.type != "load" && event.type != "pageshow" && event.type != "select") {
  5830.     return}
  5831.   if(event && (event.type == "load" || event.type == "pageshow")) {
  5832.     var contentWindow = GTB_GoogleToolbarOverlay._getCurrentWindow();
  5833.     if(contentWindow.document != event.originalTarget) {
  5834.       return}
  5835.   }
  5836.   var currentUrl = GTB_GoogleToolbarOverlay._getCurrentLocation().href;
  5837.   var infoAvailable = this._urlIndexable(currentUrl);
  5838.   if(!infoAvailable) {
  5839.     infoButton.disabled = true;
  5840.     infoButton.tooltipText = this._TOOLTIP_NO_INFO;
  5841.     infoButton.image = "chrome://google-toolbar/skin/info-disabled.png"}
  5842.   if(infoAvailable) {
  5843.     infoButton.disabled = false;
  5844.     var tooltip = this._TOOLTIP_MORE_INFO;
  5845.     tooltip = tooltip.replace("$url;", currentUrl);
  5846.     infoButton.tooltipText = tooltip;
  5847.     infoButton.image = "chrome://google-toolbar/skin/info.png"}
  5848. }
  5849.  
  5850. , doShowMenu:function(event) {
  5851.   var docLocation = GTB_GoogleToolbarOverlay._getCurrentLocation();
  5852.   var url = this._getInfoUrl(docLocation.href);
  5853.   var cacheItem = document.getElementById("gtbInfoCache");
  5854.   cacheItem.tooltipText = this._TOOLTIP_CACHE.replace("$infourl;", url);
  5855.   var similarItem = document.getElementById("gtbInfoSimilar");
  5856.   similarItem.tooltipText = this._TOOLTIP_SIMILAR.replace("$url;", url);
  5857.   var backlinksItem = document.getElementById("gtbInfoBacklinks");
  5858.   backlinksItem.tooltipText = this._TOOLTIP_BACKLINKS.replace("$infourl;", url);
  5859.   var translateItem = document.getElementById("gtbInfoTranslate");
  5860.   if(translateItem) {
  5861.     translateItem.tooltipText = this._TOOLTIP_TRANSLATE}
  5862. }
  5863.  
  5864. , _urlIndexable:function(url) {
  5865.   if(url.length == 0) {
  5866.     return false}
  5867.   if(url.indexOf(" ") != -1) {
  5868.     return false}
  5869.   var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  5870.   var xpcomUrl = ios.newURI(url, null, null);
  5871.   if(!(xpcomUrl  instanceof Components.interfaces.nsIURL)) {
  5872.     return false}
  5873.   if(xpcomUrl.scheme != "http") {
  5874.     return false}
  5875.   if(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/.exec(xpcomUrl.host)) {
  5876.     return true}
  5877.   var tld = xpcomUrl.host.substring(xpcomUrl.host.lastIndexOf("."), xpcomUrl.host.length);
  5878.   return validTldList.indexOf(tld) != -1}
  5879.  
  5880. , _getInfoUrl:function(browserUrl) {
  5881.   if(browserUrl.length == 0 || browserUrl.indexOf(" ") != -1) {
  5882.     return browserUrl}
  5883.   var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  5884.   var xpcomUrl = ios.newURI(browserUrl, null, null);
  5885.   if(!(xpcomUrl  instanceof Components.interfaces.nsIURL)) {
  5886.     return browserUrl}
  5887.   if(!GTB_isGoogleUrl(xpcomUrl)) {
  5888.     return browserUrl}
  5889.   if(!xpcomUrl.query || xpcomUrl.query.length == 0) {
  5890.     return browserUrl}
  5891.   var args = GTB_parseQueryString(xpcomUrl.query);
  5892.   if(!args || args == {}) {
  5893.     return browserUrl}
  5894.   if(args.q && args.q.indexOf("related:") == 0) {
  5895.     return args.q.replace("related:", "")}
  5896.   if(args.q && args.q.indexOf("link:") == 0) {
  5897.     return args.q.replace("link:", "")}
  5898.   if(xpcomUrl.host == "translate.google.com" && args && args.u) {
  5899.     return decodeURIComponent(args.u)}
  5900.   return browserUrl}
  5901.  
  5902. , _gwsRequestInfo:function(event, infoOperation) {
  5903.   var home = GTB_GoogleToolbarOverlay.getGoogleHome();
  5904.   var docLocation = GTB_GoogleToolbarOverlay._getCurrentLocation();
  5905.   var url = this._getInfoUrl(docLocation.href);
  5906.   GTB_GoogleToolbarOverlay.loadUrlWithModifiers(GTB_InfoUrl(home, infoOperation, url), event);
  5907.   event.preventBubble()}
  5908.  
  5909. , doCachedSnapshot:function(event) {
  5910.   this._gwsRequestInfo(event, "cache:")}
  5911.  
  5912. , doSimilarPages:function(event) {
  5913.   this._gwsRequestInfo(event, "related:")}
  5914.  
  5915. , doBackwardLinks:function(event) {
  5916.   this._gwsRequestInfo(event, "link:")}
  5917.  
  5918. , doTranslatePage:function(event) {
  5919.   var docLocation = GTB_GoogleToolbarOverlay._getCurrentLocation();
  5920.   var url = this._getInfoUrl(docLocation.href);
  5921.   var lang = GTB_GoogleToolbarOverlay.languageCode;
  5922.   GTB_GoogleToolbarOverlay.loadUrlWithModifiers(GTB_TranslateUrl(lang, url), event);
  5923.   event.preventBubble()}
  5924.  
  5925. };
  5926. function GTB_IB_onShowMenu(event) {
  5927.   GTB_GoogleToolbarOverlay.infoButton.doShowMenu(event)}
  5928.  
  5929. function GTB_SC_onSelectLangPref(event, lang) {
  5930.   GTB_GoogleToolbarOverlay.spellCheck.setLangPref(event, lang)}
  5931.  
  5932. function GTB_IB_onCachedSnapshot(event) {
  5933.   GTB_GoogleToolbarOverlay.infoButton.doCachedSnapshot(event)}
  5934.  
  5935. function GTB_IB_onSimilarPages(event) {
  5936.   GTB_GoogleToolbarOverlay.infoButton.doSimilarPages(event)}
  5937.  
  5938. function GTB_IB_onBackwardLinks(event) {
  5939.   GTB_GoogleToolbarOverlay.infoButton.doBackwardLinks(event)}
  5940.  
  5941. function GTB_IB_onTranslatePage(event) {
  5942.   GTB_GoogleToolbarOverlay.infoButton.doTranslatePage(event)}
  5943.  
  5944. function GTB_setBoolPrefWithMessage(name, value, gto) {
  5945.   GTB_getPrefs().setBoolPref(name, value);
  5946.   var message = "GTB_OPTION." + name;
  5947.   gto.sendMessage(message, value)}
  5948.  
  5949. function GTB_setStringPrefWithMessage(name, value, gto) {
  5950.   GTB_getPrefs().setStringPref(name, value);
  5951.   var message = "GTB_OPTION." + name;
  5952.   gto.sendMessage(message, value)}
  5953.  
  5954. function OptionsDialog() {
  5955.   this._overlay = null;
  5956.   this._options = null}
  5957.  
  5958. OptionsDialog.MORE_URL_PAGERANK = "http://www.google.com/support/toolbar/bin/answer.py?answer=14293&hl={LANG}";
  5959. OptionsDialog.MORE_URL_SAFEBROWSING = "http://www.google.com/support/toolbar/bin/answer.py?answer=34798&hl={LANG}";
  5960. OptionsDialog.MORE_URL_SPELLCHECK = "http://google.com/tools/firefox/toolbar/FT2/intl/{LANG}/spellcheckintro";
  5961. OptionsDialog.MORE_URL_WORDTRANSLATOR = "http://google.com/tools/firefox/toolbar/FT2/intl/{LANG}/translationintro.html";
  5962. OptionsDialog.MORE_URL_AUTOFILL = "http://google.com/tools/firefox/toolbar/FT2/intl/{LANG}/afintro.html";
  5963. OptionsDialog.MORE_URL_AUTOLINK = "http://google.com/tools/firefox/toolbar/FT2/intl/{LANG}/autolinkintro.html";
  5964. OptionsDialog.MORE_URL_FEEDSUBSCRIBE = "http://google.com/tools/firefox/toolbar/FT2/intl/{LANG}/subscribeintro.html";
  5965. OptionsDialog.MORE_URL_MAILTO = "http://google.com/tools/firefox/toolbar/FT2/intl/{LANG}/gmailtointro.html";
  5966. OptionsDialog.MORE_URL_BUTTONLAYOUT = "http://www.google.com/support/toolbar/bin/answer.py?answer=24897&hl={LANG}";
  5967. OptionsDialog.PAGE_RANK_WINDOW_FLAGS = "dependent=no,width=800,height=600,scrollbars=yes,resizable=yes,location=no";
  5968. OptionsDialog.MORE_WINDOW_FLAGS = "dependent=no,width=600,height=420,scrollbars=yes,resizable=yes,personalbar=no,location=no";
  5969. OptionsDialog.MORE_WINDOW_FLAGS_MODAL = OptionsDialog.MORE_WINDOW_FLAGS + ",modal";
  5970. OptionsDialog.MORE_WINDOW_NAME = "gtbOptionsMore";
  5971. OptionsDialog.more = function(win, lang, urlTemplate, opt_flags) {
  5972.   if(!opt_flags) {
  5973.     opt_flags = OptionsDialog.MORE_WINDOW_FLAGS}
  5974.   win.open(this.localize(urlTemplate, lang), OptionsDialog.MORE_WINDOW_NAME, opt_flags)}
  5975.  
  5976. ;
  5977. OptionsDialog.localize = function(template, lang) {
  5978.   return template.replace(/{LANG}/, lang)}
  5979.  
  5980. ;
  5981. OptionsDialog.prototype.onTranslateOptions = function(event) {
  5982.   window.openDialog("chrome://google-toolbar/content/options-translation.xul", "gtbTranslationOptions", "modal,centerscreen,chrome,resizable=no");
  5983.   event.preventBubble()}
  5984.  
  5985. ;
  5986. OptionsDialog.prototype.onRestoreDefaults = function(event) {
  5987.   window.openDialog("chrome://google-toolbar/content/restore-defaults.xul", "gtbRestoreDefaults", "modal,centerscreen,chrome,resizable=no");
  5988.   event.preventBubble()}
  5989.  
  5990. ;
  5991. OptionsDialog.prototype.onMailOptions = function(event) {
  5992.   window.openDialog("chrome://google-toolbar/content/options-mail.xul", "gtbMailOptions", "modal,centerscreen,chrome,resizable=no");
  5993.   event.preventBubble()}
  5994.  
  5995. ;
  5996. OptionsDialog.prototype.onLayoutOptions = function(event) {
  5997.   window.openDialog("chrome://google-toolbar/content/options-layouts.xul", "gtbLayoutOptions", "modal,centerscreen,chrome,resizable=no");
  5998.   event.preventBubble();
  5999.   window.focus()}
  6000.  
  6001. ;
  6002. OptionsDialog.prototype.onSpellingOptions = function(event) {
  6003.   window.openDialog("chrome://google-toolbar/content/options-spelling.xul", "gtbSpellingOptions", "modal,centerscreen,chrome,resizable=no");
  6004.   event.preventBubble()}
  6005.  
  6006. ;
  6007. OptionsDialog.prototype.onSafeBrowsingOptions = function(event) {
  6008.   window.openDialog("chrome://tb-amulet-of-protection/content/protection-preferences.xul", "gtbSafeBrowsingOptions", "modal,centerscreen,chrome,resizable=no");
  6009.   event.preventBubble()}
  6010.  
  6011. ;
  6012. OptionsDialog.prototype.onAutoLinkOptions = function(event) {
  6013.   window.openDialog("chrome://google-toolbar/content/options-auto-link.xul", "gtbAutoLinkOptions", "modal,centerscreen,chrome,resizable=no");
  6014.   event.preventBubble()}
  6015.  
  6016. ;
  6017. OptionsDialog.prototype.onFeedSubscribeOptions = function(event) {
  6018.   window.openDialog("chrome://google-toolbar/content/options-subscribe.xul", "gtbFeedSubscribeOptions", "modal,centerscreen,chrome,resizable=no");
  6019.   event.preventBubble()}
  6020.  
  6021. ;
  6022. OptionsDialog.prototype.onAutoFillOptions = function(event) {
  6023.   window.openDialog("chrome://google-toolbar/content/options-auto-fill.xul", "gtbAutoFillOptions", "modal,centerscreen,chrome,resizable=no");
  6024.   event.preventBubble()}
  6025.  
  6026. ;
  6027. OptionsDialog.prototype.persistAllToolbars = function() {
  6028.   var toolbox = null;
  6029.   var windows = GTB_getBrowserWindows();
  6030.   for(var b = 0, win = null;win = windows[b]; ++ b) {
  6031.     toolbox = win.document.getElementById("navigator-toolbox");
  6032.     if(toolbox) {
  6033.       this.persistToolbars(win, toolbox)}
  6034.     win.document.persist("gtbToolbar", "collapsed")}
  6035. }
  6036.  
  6037. ;
  6038. OptionsDialog.prototype.persistToolbars = function(win, toolbox) {
  6039.   var oldGToolboxChanged = gToolboxChanged;
  6040.   gToolboxChanged = true;
  6041.   var oldGToolbox = gToolbox;
  6042.   gToolbox = toolbox;
  6043.   var oldGToolboxDocument = gToolboxDocument;
  6044.   gToolboxDocument = win.document;
  6045.   persistCurrentSets();
  6046.   gToolboxChanged = oldGToolboxChanged;
  6047.   gToolbox = oldGToolbox;
  6048.   gToolboxDocument = oldGToolboxDocument}
  6049.  
  6050. ;
  6051. OptionsDialog.prototype.onDialogAccept = function(event) {
  6052.   for(var i = 0;i < this._options.length;i ++ ) {
  6053.     this._options[i].onApply(this._overlay)}
  6054.   if(window.name == "gtbOptions") {
  6055.     GTB_getToolbar().handleCustomize();
  6056.     this.persistAllToolbars()}
  6057.   event.preventBubble()}
  6058.  
  6059. ;
  6060. OptionsDialog.prototype._getToolboxWindow = function() {
  6061.   var currentWindow = window.opener;
  6062.   var toolbox;
  6063.   while(currentWindow != null) {
  6064.     toolbox = currentWindow.document.getElementById("navigator-toolbox");
  6065.     if(toolbox != null) {
  6066.       break}
  6067.     currentWindow = currentWindow.opener}
  6068.   return currentWindow}
  6069.  
  6070. ;
  6071. OptionsDialog.prototype.resetLayout = function() {
  6072.   var lastQuery = this._overlay.lastQuery;
  6073.   var currentWindow = this._getToolboxWindow();
  6074.   var doc = currentWindow.document;
  6075.   var toolbox = currentWindow.document.getElementById("navigator-toolbox");
  6076.   var googletoolbar = null;
  6077.   var i, j;
  6078.   for(i = 0;i < toolbox.childNodes.length;i ++ ) {
  6079.     var toolbar = toolbox.childNodes[i];
  6080.     for(j = toolbar.childNodes.length - 1;j >= 0;j -- ) {
  6081.       if(GTB_isGoogleToolbarItem(toolbar.childNodes[j])) {
  6082.         var prefName = "button_option." + toolbar.childNodes[j].id;
  6083.         GTB_getPrefs().setBoolPref(prefName, false)}
  6084.       if(toolbar.id == "gtbToolbar") {
  6085.         toolbar.removeChild(toolbar.childNodes[j])}
  6086.     }
  6087.     if(toolbar.id == "gtbToolbar") {
  6088.       googletoolbar = toolbar}
  6089.   }
  6090.   var defaultSet = googletoolbar.getAttribute("defaultset");
  6091.   var defaults = defaultSet.split(",");
  6092.   for(i = 0;i < defaults.length;i ++ ) {
  6093.     this._overlay._addButton(defaults[i]);
  6094.     GTB_getPrefs().setBoolPref("button_option." + defaults[i], true)}
  6095.   this._overlay.restoreDefaultsFixUi();
  6096.   this._overlay.lastQuery = lastQuery;
  6097.   var searchbox = doc.getElementById("gtbGoogleSearchBox");
  6098.   searchbox.value = this._overlay.lastQuery;
  6099.   var answer = this._overlay.highlighter.onSearchTextChanged(this._overlay.lastQuery);
  6100.   this._overlay._enableDisableQueryButtons(answer.hasTerms, answer.hasOps);
  6101.   this._overlay.propogateToolbarChanges(true);
  6102.   GTB_GTO_replaceSearchBox(false);
  6103.   GTB_GTO_setGoogleToolbarCollapsed(false);
  6104.   this.persistToolbars(currentWindow, toolbox);
  6105.   this._overlay.handleCustomize()}
  6106.  
  6107. ;
  6108. OptionsDialog.prototype.onRestoreDefaultsAccept = function(event) {
  6109.   this.resetLayout();
  6110.   this._overlay.sendMessage("GTB_SpellCheck.resetButton", null);
  6111.   for(var i = 0;i < this._options.length;i ++ ) {
  6112.     this._options[i].restoreDefaults(this._overlay)}
  6113.   var advancedProtectionDefault = GTB_getPrefs().getBoolPrefWithDefault(GTB_PREF_ADVANCED_DEFAULT, false);
  6114.   GTB_getPrefs().setBoolPref("button_option.safebrowsing.advancedprotection", advancedProtectionDefault);
  6115.   event.preventBubble()}
  6116.  
  6117. ;
  6118. OptionsDialog.prototype.getGoogleVar = function(varname) {
  6119.   if(window.opener[varname]) {
  6120.     return window.opener[varname]}
  6121.   if(window.opener.opener && window.opener.opener[varname]) {
  6122.     return window.opener.opener[varname]}
  6123.   try {
  6124.     var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator)}
  6125.   catch(e) {
  6126.     return null}
  6127.   if(windowMediator) {
  6128.     var browser = windowMediator.getMostRecentWindow("navigator:browser");
  6129.     if(browser) {
  6130.       return browser[varname]}
  6131.   }
  6132. }
  6133.  
  6134. ;
  6135. function MenulistOption(menulistId, property, opt_default) {
  6136.   this._property = property;
  6137.   this._default = opt_default;
  6138.   if(!this._default) {
  6139.     this._default = GTB_getPrefs().getLocaleDefault(property)}
  6140.   this._menulist = null;
  6141.   if(menulistId != null) {
  6142.     this._menulist = document.getElementById(menulistId);
  6143.     GTB_getPrefs().selectValueFromMenu(this._property, this._menulist)}
  6144. }
  6145.  
  6146. MenulistOption.prototype.onApply = function(gto) {
  6147.   if(this._menulist == null) {
  6148.     return}
  6149.   var oldValue = GTB_getPrefs().getStringPref(this._property);
  6150.   var newValue = GTB_getPrefs().getSelection(this._menulist);
  6151.   if(oldValue != newValue) {
  6152.     GTB_getPrefs().setStringPref(this._property, newValue);
  6153.     var message = "GTB_OPTION." + this._property;
  6154.     gto.sendMessage(message, newValue);
  6155.     if(typeof this.doApply == "function") {
  6156.       this.doApply(newValue, gto)}
  6157.   }
  6158. }
  6159.  
  6160. ;
  6161. MenulistOption.prototype.restoreDefaults = function(gto) {
  6162.   var oldValue = GTB_getPrefs().getStringPref(this._property);
  6163.   if(this._default != null) {
  6164.     GTB_getPrefs().setStringPref(this._property, this._default)}
  6165.   else {
  6166.     GTB_getPrefs().resetToDefault(this._property)}
  6167.   var newValue = GTB_getPrefs().getStringPref(this._property);
  6168.   if(this._menulist != null) {
  6169.     GTB_getPrefs().selectValueFromMenu(this._property, this._menulist)}
  6170.   if(oldValue != newValue) {
  6171.     var message = "GTB_OPTION." + this._property;
  6172.     gto.sendMessage(message, newValue);
  6173.     if(typeof this.doApply == "function") {
  6174.       this.doApply(newValue, gto)}
  6175.   }
  6176. }
  6177.  
  6178. ;
  6179. function BooleanOption() {
  6180.   BooleanOption.prototype._checkbox = null;
  6181.   BooleanOption.prototype._property = null;
  6182.   BooleanOption.prototype._default = null}
  6183.  
  6184. BooleanOption.prototype.onApply = function(gto) {
  6185.   if(this._checkbox == null) {
  6186.     return}
  6187.   var oldValue = GTB_getPrefs().getBoolPref(this._property);
  6188.   var newValue = this._checkbox.checked;
  6189.   if(oldValue != newValue) {
  6190.     GTB_getPrefs().setBoolPref(this._property, newValue);
  6191.     if(typeof this.doApply == "function") {
  6192.       this.doApply(newValue, gto)}
  6193.     gto.sendMessage("GTB_OPTION." + this._property, newValue)}
  6194. }
  6195.  
  6196. ;
  6197. BooleanOption.prototype.restoreDefaults = function(gto) {
  6198.   var oldValue = GTB_getPrefs().getBoolPref(this._property);
  6199.   if(this._default != null) {
  6200.     GTB_getPrefs().setBoolPref(this._property, this._default)}
  6201.   else {
  6202.     GTB_getPrefs().resetToDefault(this._property)}
  6203.   var newValue = GTB_getPrefs().getBoolPref(this._property);
  6204.   if(this._checkbox != null) {
  6205.     this._checkbox.checked = newValue}
  6206.   if(oldValue != newValue) {
  6207.     var message = "GTB_OPTION." + this._property;
  6208.     gto.sendMessage(message, newValue);
  6209.     if(typeof this.doApply == "function") {
  6210.       this.doApply(newValue, gto)}
  6211.   }
  6212. }
  6213.  
  6214. ;
  6215. BooleanOption.prototype._getCurrentValue = function() {
  6216.   return GTB_getPrefs().getBoolPref(this._property)}
  6217.  
  6218. ;
  6219. BooleanOption.prototype.dependentWidget = function(widgetName) {
  6220.   var dw = document.getElementById(widgetName);
  6221.   var idw = this._checkbox;
  6222.   dw.disabled = !idw.checked;
  6223.   idw.addEventListener("CheckboxStateChange", function(event) {
  6224.     dw.disabled = !idw.checked;
  6225.     event.preventBubble()}
  6226.   
  6227.   , true)}
  6228.  
  6229. ;
  6230. function ButtonOption(checkboxId, property, opt_default) {
  6231.   this._checkbox = document.getElementById(checkboxId);
  6232.   this._property = "button_option." + property;
  6233.   this._checkbox.checked = this._getCurrentValue();
  6234.   this._default = opt_default;
  6235.   if(!this._default) {
  6236.     var def_val = GTB_getPrefs().getLocaleDefault(this._property);
  6237.     if(def_val == "true") {
  6238.       this._default = true}
  6239.     if(def_val == "false") {
  6240.       this._default = false}
  6241.   }
  6242. }
  6243.  
  6244. ButtonOption.prototype = new BooleanOption;
  6245. ButtonOption.prototype.doApply = function(newValue, gto) {
  6246.   var button = [this._property.replace("button_option.", "")];
  6247.   if(newValue) {
  6248.     gto.addButtons(button)}
  6249.   else {
  6250.     gto.removeButtons(button)}
  6251. }
  6252.  
  6253. ;
  6254. function CheckboxOption(checkboxId, property, opt_default) {
  6255.   this._property = property;
  6256.   this._default = opt_default;
  6257.   if(!this._default) {
  6258.     var def_val = GTB_getPrefs().getLocaleDefault(property);
  6259.     if(def_val == "true") {
  6260.       this._default = true}
  6261.     else if(def_val == "false") {
  6262.       this._default = false}
  6263.   }
  6264.   if(checkboxId != null) {
  6265.     this._checkbox = document.getElementById(checkboxId);
  6266.     this._checkbox.checked = this._getCurrentValue()}
  6267. }
  6268.  
  6269. CheckboxOption.prototype = new BooleanOption;
  6270. function GTB_Option_createMainOptionsDialog() {
  6271.   var optionsDialog = new OptionsDialog;
  6272.   optionsDialog._confirmedOptIn = false;
  6273.   optionsDialog.onLoad = function(event) {
  6274.     this._overlay = GTB_getToolbar();
  6275.     var searchNewTab = new CheckboxOption("gtbOptionsSearchResultsToNewTabCheckbox", "search_new_tab");
  6276.     var translatorButton = new CheckboxOption("gtbOptionsBrowsingWordTranslatorCheckbox", GTB_PREF_AUTO_TRANSLATE);
  6277.     translatorButton.dependentWidget("gtbOptionsBrowsingWordTranslatorButton");
  6278.     if(this._overlay.languageCode != "en") {
  6279.       var container = document.getElementById("gtbOptionsAutoLinkContainer");
  6280.       container.hidden = true;
  6281.       container = document.getElementById("gtbOptionsAutoFillContainer");
  6282.       container.hidden = true}
  6283.     if(!(this._overlay.languageCode == "en" || this._overlay.languageCode == "ja")) {
  6284.       var suggestBox = document.getElementById("gtbOptionsUseSuggestCheckbox");
  6285.       suggestBox.hidden = true}
  6286.     var optionalButtons = [["gtbSearchNews", "gtbOptionsMoreNewsCheckbox"], ["gtbSearchFroogle", "gtbOptionsSearchButtonsFroogleCheckbox"], ["gtbSearchLocal", "gtbOptionsSearchButtonsLocalCheckbox"]];
  6287.     var i, buttonIds;
  6288.     for(i = 0;buttonIds = optionalButtons[i]; ++ i) {
  6289.       if(!this._overlay.availableButtons[buttonIds[0]]) {
  6290.         var buttonElt = document.getElementById(buttonIds[1]);
  6291.         buttonElt.hidden = true}
  6292.     }
  6293.     if(!this._overlay.autoTransLibAvailable) {
  6294.       var container = document.getElementById("gtbOptionsWordTranslatorContainer");
  6295.       container.hidden = true}
  6296.     var translatorSuboption = new MenulistOption(null, "autotranslate_to_lang");
  6297.     translatorSuboption.doApply = function(newValue, gto) {
  6298.       gto.autoTranslate.downloadToLangDict(newValue)}
  6299.     
  6300.     ;
  6301.     this._options = [new CheckboxOption("gtbOptionsMailCheckbox", GTB_PREF_OPT_MAIL), new CheckboxOption("gtbOptionsSearchSaveHistoryCheckbox", GTB_PREF_SAVE_HISTORY), new CheckboxOption("gtbOptionsSearchOnSelectCheckbox", GTB_PREF_SEARCH_ON_SELECT), searchNewTab, translatorButton, new CheckboxOption("gtbOptionsUseSuggestCheckbox", GTB_PREF_USE_SUGGEST), new CheckboxOption("gtbOptionsSearchRememberTypeCheckbox", GTB_PREF_REMEMBER_SEARCH_TYPE), new MenulistOption("gtbOptionsSearchWhichGoogleList", 
  6302.     "google_home"), new MenulistOption("gtbOptionsMoreButtonTextList", "button_text_level"), new CheckboxOption(null, GTB_PREF_SC_IGNORE_DUPS), new CheckboxOption(null, GTB_PREF_SC_IGNORE_ALL_CAPS), new CheckboxOption(null, GTB_PREF_SC_IGNORE_DIGITS), translatorSuboption, new CheckboxOption(null, GTB_PREF_AUTO_LINK_NEW_WINDOW), new MenulistOption(null, "autolink.map"), new MenulistOption(null, "autolink.isbn"), new MenulistOption(null, "autolink.vin"), new MenulistOption(null, GTB_FS_PREF_CURRENT)
  6303.     , new MenulistOption(null, "spell_check.lang")];
  6304.     for(i = 0;i < this._overlay.buttonOptions.length;i ++ ) {
  6305.       var info = this._overlay.buttonOptions[i];
  6306.       var buttonOption = new ButtonOption(info.checkboxId, info.property);
  6307.       if(info.dependentWidget) {
  6308.         buttonOption.dependentWidget(info.dependentWidget)}
  6309.       if(info.optIn) {
  6310.         buttonOption._default = GTB_getPrefs().getBoolPref(GTB_PREF_OPT_IN)}
  6311.       this._options.push(buttonOption)}
  6312.     var container = document.getElementById("gtbOptionsCustomSearchContainer");
  6313.     var GTB_cs = this._overlay.customSearch;
  6314.     var customSearches = GTB_cs._searches;
  6315.     if(customSearches.length == 0) {
  6316.       var label = document.getElementById("gtbOptionsCustomSearchListLabel");
  6317.       label.hidden = true}
  6318.     for(i = 0;i < customSearches.length;i ++ ) {
  6319.       var search = customSearches[i];
  6320.       var checkboxId = GTB_cs.searchToCheckboxId(search);
  6321.       var buttonId = GTB_cs.searchToButtonId(search);
  6322.       var checkbox = document.createElement("checkbox");
  6323.       checkbox.setAttribute("id", checkboxId);
  6324.       checkbox.setAttribute("label", search.title);
  6325.       container.appendChild(checkbox);
  6326.       this._options.push(new ButtonOption(checkboxId, buttonId, false))}
  6327.   }
  6328.   
  6329.   ;
  6330.   optionsDialog.onDialogHelp = function(event, lang) {
  6331.     var url = "http://www.google.com/support/toolbar?hl=";
  6332.     url += this._overlay.languageCode;
  6333.     window.opener.open(url, "gtbOptionsDialogHelpWindow", "width=800,height=600,resizable=yes,scrollbars=yes")}
  6334.   
  6335.   ;
  6336.   optionsDialog.onPageRankMore = function(event) {
  6337.     this.more(OptionsDialog.MORE_URL_PAGERANK, OptionsDialog.PAGE_RANK_WINDOW_FLAGS)}
  6338.   
  6339.   ;
  6340.   optionsDialog.onSafeBrowsingMore = function(event) {
  6341.     this.more(OptionsDialog.MORE_URL_SAFEBROWSING, OptionsDialog.PAGE_RANK_WINDOW_FLAGS)}
  6342.   
  6343.   ;
  6344.   optionsDialog.onSpellCheckMore = function(event) {
  6345.     this.more(OptionsDialog.MORE_URL_SPELLCHECK)}
  6346.   
  6347.   ;
  6348.   optionsDialog.onWordTranslatorMore = function(event) {
  6349.     this.more(OptionsDialog.MORE_URL_WORDTRANSLATOR)}
  6350.   
  6351.   ;
  6352.   optionsDialog.onAutoFillMore = function(event) {
  6353.     this.more(OptionsDialog.MORE_URL_AUTOFILL)}
  6354.   
  6355.   ;
  6356.   optionsDialog.onAutoLinkMore = function(event) {
  6357.     this.more(OptionsDialog.MORE_URL_AUTOLINK)}
  6358.   
  6359.   ;
  6360.   optionsDialog.onFeedSubscribeMore = function(event) {
  6361.     this.more(OptionsDialog.MORE_URL_FEEDSUBSCRIBE)}
  6362.   
  6363.   ;
  6364.   optionsDialog.onButtonLayoutMore = function(event) {
  6365.     this.more(OptionsDialog.MORE_URL_BUTTONLAYOUT)}
  6366.   
  6367.   ;
  6368.   optionsDialog.onMailtoCheckMore = function(event) {
  6369.     this.more(OptionsDialog.MORE_URL_MAILTO)}
  6370.   
  6371.   ;
  6372.   optionsDialog.more = function(urlTemplate, opt_flags) {
  6373.     OptionsDialog.more(window.opener, this._overlay.languageCode, urlTemplate, opt_flags)}
  6374.   
  6375.   ;
  6376.   return optionsDialog}
  6377.  
  6378. function GTB_Option_createSpellingOptionsDialog() {
  6379.   var optionsDialog = new OptionsDialog;
  6380.   optionsDialog.onLoad = function(event) {
  6381.     this._overlay = GTB_getToolbar();
  6382.     this._options = [new CheckboxOption("gtbOptionsSpellingIgnoreRepeatedCheckbox", GTB_PREF_SC_IGNORE_DUPS), new CheckboxOption("gtbOptionsSpellingIgnoreAllCapsCheckbox", GTB_PREF_SC_IGNORE_ALL_CAPS), new CheckboxOption("gtbOptionsSpellingIgnoreDigitsCheckbox", GTB_PREF_SC_IGNORE_DIGITS)]}
  6383.   
  6384.   ;
  6385.   return optionsDialog}
  6386.  
  6387. function GTB_Option_createLayoutOptionsDialog() {
  6388.   var optionsDialog = new OptionsDialog;
  6389.   optionsDialog.onLoad = function(event) {
  6390.     this._overlay = GTB_getToolbar();
  6391.     var radioGroup = document.getElementById("gtbOptionsLayoutRadio");
  6392.     if(radioGroup != null) {
  6393.       radioGroup.addEventListener("command", LayoutRadioCommand, false);
  6394.       var win = this._getToolboxWindow();
  6395.       var googleToolbar = win.document.getElementById("gtbToolbar");
  6396.       var isCollapsed = googleToolbar.collapsed;
  6397.       var searchBox = win.document.getElementById("gtbSearchBox");
  6398.       var isOnNavbar = false;
  6399.       if(searchBox && searchBox.parentNode) {
  6400.         isOnNavbar = searchBox.parentNode.id == "nav-bar"}
  6401.       var value = "classic";
  6402.       if(isOnNavbar && isCollapsed) {
  6403.         value = "spacesaver"}
  6404.       else if(isOnNavbar) {
  6405.         value = "combined"}
  6406.       radioGroup.value = value;
  6407.       UpdateImageFromRadioState();
  6408.       var radios = radioGroup.getElementsByTagName("radio");
  6409.       for(var r = 0, radio = null;radio = radios[r]; ++ r) {
  6410.         if(radio.value == radioGroup.value) {
  6411.           radioGroup.selectedIndex = r}
  6412.       }
  6413.     }
  6414.   }
  6415.   
  6416.   ;
  6417.   optionsDialog.onDialogAccept = function(event) {
  6418.     var radioGroup = document.getElementById("gtbOptionsLayoutRadio");
  6419.     if(radioGroup != null) {
  6420.       this.resetLayout();
  6421.       var layout = radioGroup.value;
  6422.       var collapsed = layout == "spacesaver";
  6423.       GTB_GTO_setGoogleToolbarCollapsed(collapsed);
  6424.       var replaceSearchBox = layout != "classic";
  6425.       GTB_GTO_replaceSearchBox(replaceSearchBox);
  6426.       this.persistAllToolbars()}
  6427.   }
  6428.   
  6429.   ;
  6430.   function UpdateImageFromRadioState() {
  6431.     var radioGroup = document.getElementById("gtbOptionsLayoutRadio");
  6432.     var image = document.getElementById("gtbOptionsLayoutImage");
  6433.     if(radioGroup != null && image != null) {
  6434.       switch(radioGroup.value) {
  6435.         case "classic":image.src = "chrome://google-toolbar/skin/layout-classic.png";
  6436.         break;
  6437.         case "combined":image.src = "chrome://google-toolbar/skin/layout-combined.png";
  6438.         break;
  6439.         case "spacesaver":image.src = "chrome://google-toolbar/skin/layout-space-saver.png";
  6440.         break;
  6441.         default:break}
  6442.     }
  6443.   }
  6444.   
  6445.   function LayoutRadioCommand(event) {
  6446.     UpdateImageFromRadioState()}
  6447.   
  6448.   return optionsDialog}
  6449.  
  6450. function GTB_Option_createTranslationOptionsDialog() {
  6451.   var optionsDialog = new OptionsDialog;
  6452.   optionsDialog.onLoad = function(event) {
  6453.     this._overlay = GTB_getToolbar();
  6454.     var gtbOptionsMenuPopup = document.getElementById("gtbOptionsTranslationLanguageMenuPopup");
  6455.     if(gtbOptionsMenuPopup != null) {
  6456.       GTB_sortMenuPopup(gtbOptionsMenuPopup)}
  6457.     var self = this;
  6458.     var option = new MenulistOption("gtbOptionsTranslationLanguageMenulist", "autotranslate_to_lang");
  6459.     option.doApply = function(newValue, gto) {
  6460.       gto.autoTranslate.downloadToLangDict(newValue)}
  6461.     
  6462.     ;
  6463.     setTimeout(function() {
  6464.       self._options = [option]}
  6465.     
  6466.     , 0)}
  6467.   
  6468.   ;
  6469.   return optionsDialog}
  6470.  
  6471. function GTB_Option_createAutoLinkOptionsDialog() {
  6472.   var optionsDialog = new OptionsDialog;
  6473.   optionsDialog.onLoad = function(event) {
  6474.     this._overlay = GTB_getToolbar();
  6475.     var self = this;
  6476.     setTimeout(function() {
  6477.       self._options = [new CheckboxOption("gtbOptionsAutoLinkNewWindow", GTB_PREF_AUTO_LINK_NEW_WINDOW), new MenulistOption("gtbOptionsAutoLinkMapsMenulist", "autolink.map"), new MenulistOption("gtbOptionsAutoLinkIsbnMenulist", "autolink.isbn"), new MenulistOption("gtbOptionsAutoLinkVinMenulist", "autolink.vin")]}
  6478.     
  6479.     , 0);
  6480.     this.baseDialogAccept = this.onDialogAccept;
  6481.     this.onDialogAccept = function(event) {
  6482.       this.baseDialogAccept(event);
  6483.       var autoLink = this._overlay.autoLink;
  6484.       if(autoLink) {
  6485.         autoLink.relink()}
  6486.     }
  6487.     
  6488.   }
  6489.   
  6490.   ;
  6491.   return optionsDialog}
  6492.  
  6493. function GTB_Option_createFeedSubscribeOptionsDialog() {
  6494.   var optionsDialog = new OptionsDialog;
  6495.   optionsDialog.addMenuElement = function(agg) {
  6496.     var newel = document.createElement("menuitem");
  6497.     newel.setAttribute("label", agg.title);
  6498.     newel.setAttribute("tooltiptext", agg.desc);
  6499.     newel.setAttribute("value", agg.id);
  6500.     var agglist = document.getElementById("gtbOptionsFeedSubscribeAggregatorsPopup");
  6501.     agglist.insertBefore(newel, null)}
  6502.   
  6503.   ;
  6504.   optionsDialog.onLoad = function(event) {
  6505.     this._overlay = GTB_getToolbar();
  6506.     var aggs = GTB_FS_getAggMgr().loadAggregatorsFromPrefs();
  6507.     for(var idx = 0;idx < aggs.length;idx ++ ) {
  6508.       this.addMenuElement(aggs[idx])}
  6509.     GTB_FS_getAggMgr().maybeInitCurrentAggregator();
  6510.     var self = this;
  6511.     setTimeout(function() {
  6512.       self._options = [new MenulistOption("gtbOptionsFeedSubscribeAggregatorsMenulist", GTB_FS_PREF_CURRENT)]}
  6513.     
  6514.     , 0);
  6515.     this.baseDialogAccept = this.onDialogAccept;
  6516.     this.onDialogAccept = function(event) {
  6517.       GTB_FS_Dump("Received onDialogAccept for Subscribe Settings");
  6518.       this.baseDialogAccept(event)}
  6519.     
  6520.   }
  6521.   
  6522.   ;
  6523.   return optionsDialog}
  6524.  
  6525. var _GPTD_PREFIX = "GPTD__data__";
  6526. var _GPTD_TAG_PROP = _GPTD_PREFIX + "tagged";
  6527. var _GPTD_DEBUG = false;
  6528. function GPTD_dump(s) {
  6529. }
  6530.  
  6531. function GTB_TabManager() {
  6532.   this._tabBrowser = document.getElementById("content");
  6533.   this._numOpenTabs = 0;
  6534.   this._keys = new Object;
  6535.   var browsers = this._tabBrowser.browsers;
  6536.   for(var i = 0;i < browsers.length;i ++ ) {
  6537.     this._initNewTab(browsers[i])}
  6538. }
  6539.  
  6540. GTB_TabManager.prototype = {makeContainers:function(key) {
  6541.   if(this._keys[key] != null) {
  6542.     throw new Error("containers already exist for key '" + key + "'");}
  6543.   this._keys[key] = true;
  6544.   var browsers = this._tabBrowser.browsers;
  6545.   for(var i = 0;i < browsers.length;i ++ ) {
  6546.     this._addContainerToBrowser(browsers[i], key)}
  6547.   return this.getContainers(key)}
  6548.  
  6549. , getContainers:function(key) {
  6550.   if(this._keys[key] == null) {
  6551.     throw new Error("containers do not exist for key '" + key + "'");}
  6552.   var containers = new Array;
  6553.   var browsers = this._tabBrowser.browsers;
  6554.   for(var i = 0;i < browsers.length;i ++ ) {
  6555.     var browser = browsers[i];
  6556.     if(browser[_GPTD_TAG_PROP] == null) {
  6557.       this._initNewTab(browser)}
  6558.     var tabData = browser[_GPTD_PREFIX + key];
  6559.     if(typeof tabData != "object" || tabData == null) {
  6560.       throw new Error("container does not exist for key '" + key + "' (tab index " + i + ")");}
  6561.     containers.push(tabData)}
  6562.   return containers}
  6563.  
  6564. , destroyContainers:function(key) {
  6565.   if(this._keys[key] == null) {
  6566.     throw new Error("containers do not exist for key '" + key + "'");}
  6567.   delete this._keys[key];
  6568.   var browsers = this._tabBrowser.browsers;
  6569.   for(var i = 0;i < browsers.length;i ++ ) {
  6570.     browsers[i].removeAttribute(_GPTD_PREFIX + key)}
  6571. }
  6572.  
  6573. , getSelectedTabIndex:function() {
  6574.   return this._tabBrowser.mTabBox.selectedIndex}
  6575.  
  6576. , getSelectedTabContainer:function(key) {
  6577.   var containers = this.getContainers(key);
  6578.   var idx = this.getSelectedTabIndex();
  6579.   return containers[idx]}
  6580.  
  6581. , onPageLoad:function(event) {
  6582.   var contentDocument = event.target;
  6583.   if(!contentDocument) {
  6584.     return}
  6585.   if(contentDocument.nodeName != "#document") {
  6586.     GTB_Dump(GTB_Dump.PT, "GPTD ignoring page load since it is not a document -- it is " + contentDocument.nodeName + "\n");
  6587.     return}
  6588.   var browser;
  6589.   var browsers = this._tabBrowser.browsers;
  6590.   var tabIndex = null;
  6591.   for(var i = 0;i < browsers.length;i ++ ) {
  6592.     if(browsers[i].contentDocument == contentDocument) {
  6593.       browser = browsers[i];
  6594.       tabIndex = i;
  6595.       break}
  6596.   }
  6597.   if(tabIndex == null) {
  6598.     return}
  6599.   if(browser[_GPTD_TAG_PROP] == null) {
  6600.     this._initNewTab(browser)}
  6601.   var message = "GPTD_PAGELOAD";
  6602.   var optData = tabIndex.toString();
  6603.   GTB_GoogleToolbarOverlay.sendMessage(message, optData)}
  6604.  
  6605. , onPageUnload:function(event) {
  6606.   var browser = event.currentTarget;
  6607.   var browser_str = browser.toString();
  6608.   if(this._tabBrowser.browsers.length < this._numOpenTabs) {
  6609.     this._numOpenTabs -- }
  6610. }
  6611.  
  6612. , _initNewTab:function(browser) {
  6613.   GPTD_dump("we've got a new browser tab " + browser.toString());
  6614.   this._numOpenTabs ++ ;
  6615.   this._addContainersToBrowser(browser);
  6616.   browser[_GPTD_TAG_PROP] = true;
  6617.   browser.addEventListener("unload", function(event) {
  6618.     GTB_perTabData().onPageUnload(event)}
  6619.   
  6620.   , true)}
  6621.  
  6622. , _addContainersToBrowser:function(browser) {
  6623.   for(var key in this._keys) {
  6624.     this._addContainerToBrowser(browser, key)}
  6625. }
  6626.  
  6627. , _addContainerToBrowser:function(browser, key) {
  6628.   var prefixed_key = _GPTD_PREFIX + key;
  6629.   if(browser[prefixed_key] != null) {
  6630.     throw new Error("container already exists for key '" + key + "' in browser " + browser.toString());}
  6631.   GPTD_dump("adding key '" + key + "' to tab " + browser.toString());
  6632.   browser[prefixed_key] = new Object}
  6633.  
  6634. };
  6635. function GTB_SearchUrl(prefix, host, restrict, query, opt_options) {
  6636.   var queryParts = [];
  6637.   queryParts.push("sourceid=navclient-ff");
  6638.   queryParts.push("ie=UTF-8");
  6639.   var installWeek = GTB_GetInstallWeek();
  6640.   var brand = GTB_getPrefs().getLocalMachineString("brand");
  6641.   if(brand == null)brand = "GGGL";
  6642.   queryParts.push("rls=" + brand + "," + brand + ":" + installWeek + "," + brand + ":" + GTB_GoogleToolbarOverlay.languageCode);
  6643.   if(opt_options && opt_options.lucky) {
  6644.     queryParts.push("btnI=I")}
  6645.   if(query && query != "") {
  6646.     var encoded = encodeURIComponent(query).replace(/\%20/g, "+");
  6647.     if(opt_options && opt_options.site != null) {
  6648.       encoded = "site:" + encodeURIComponent(opt_options.site) + "+" + encoded}
  6649.     queryParts.push("q=" + encoded)}
  6650.   return GTB_ComposeUrl(prefix, host, restrict, queryParts)}
  6651.  
  6652. function GTB_GetInstallWeek() {
  6653.   var installTime = GTB_getPrefs().getLocalMachineString("installtime");
  6654.   if(installTime == null) {
  6655.     var today = new Date;
  6656.     installTime = today.getTime().toString();
  6657.     GTB_getPrefs().setLocalMachineString("installtime", installTime)}
  6658.   var installDate = new Date;
  6659.   installDate.setTime(parseFloat(installTime));
  6660.   var newYearDate = new Date;
  6661.   newYearDate.setFullYear(parseInt(installDate.getFullYear()), 1, 1);
  6662.   var delta = installDate.getTime() - newYearDate.getTime();
  6663.   var week = Math.floor(delta / 604800000) + 1;
  6664.   return installDate.getFullYear() + "-" + week}
  6665.  
  6666. function GTB_ComposeUrl(prefix, host, restrict, searchStringTerms) {
  6667.   var parts = [];
  6668.   parts.push("http://");
  6669.   parts.push(prefix);
  6670.   parts.push(host.substr(3));
  6671.   parts.push("/");
  6672.   parts.push(restrict);
  6673.   parts.push("?");
  6674.   parts.push(searchStringTerms.join("&"));
  6675.   return parts.join("")}
  6676.  
  6677. function GTB_DictionaryUrl(host, text, lang, hl) {
  6678.   var queryParts = [];
  6679.   queryParts.push("sourceid=navclient-ff");
  6680.   queryParts.push("ie=UTF-8");
  6681.   queryParts.push("oe=UTF-8");
  6682.   queryParts.push("text=" + text);
  6683.   queryParts.push("langpair=" + lang);
  6684.   queryParts.push("hl=" + hl);
  6685.   queryParts.push("sig=8" + GTB_PageRank.GPR_awesomeHash(text));
  6686.   return GTB_ComposeUrl("www", host, "tbproxy/dictionary", queryParts)}
  6687.  
  6688. function GTB_InfoUrl(host, op, url) {
  6689.   var queryParts = [];
  6690.   queryParts.push("sourceid=navclient-ff");
  6691.   queryParts.push("ie=UTF-8");
  6692.   queryParts.push("q=" + op + encodeURIComponent(url));
  6693.   return GTB_ComposeUrl("www", host, "search", queryParts)}
  6694.  
  6695. function GTB_TranslateUrl(lang, url) {
  6696.   var queryParts = [];
  6697.   queryParts.push("sourceid=navclient-ff");
  6698.   queryParts.push("hl=" + lang);
  6699.   queryParts.push("u=" + encodeURIComponent(url));
  6700.   return GTB_ComposeUrl("translate", "www.google.com", "translate", queryParts)}
  6701.  
  6702. function GTB_SearchType(name, image, label, tip, url) {
  6703.   this.name = name;
  6704.   this.image = image;
  6705.   this.label = label;
  6706.   this.tip = tip;
  6707.   this.url = url}
  6708.  
  6709. GTB_SearchType.prototype.name = null;
  6710. GTB_SearchType.prototype.image = null;
  6711. GTB_SearchType.prototype.url = null;
  6712. function GTB_GoogleSearchType(name, image, bundle, opt_options) {
  6713.   var label = bundle.getString("prop.gtb." + name);
  6714.   var tip = bundle.getString("prop.gtb." + name + ".tip");
  6715.   return new GTB_SearchType(name, image, label, tip, function(query, home) {
  6716.     return GTB_SearchUrl("www", home, "search", query, opt_options)}
  6717.   
  6718.   )}
  6719.  
  6720. function GTB_StandardSearchType(name, image, bundle) {
  6721.   var label = bundle.getString("prop.gtb." + name);
  6722.   var tip = bundle.getString("prop.gtb." + name + ".tip");
  6723.   return new GTB_SearchType(name, image, label, tip, function(query, home) {
  6724.     return GTB_SearchUrl(name, home, name, query)}
  6725.   
  6726.   )}
  6727.  
  6728. function GTB_CustomSearchType(cs, index) {
  6729.   var customSearch = cs._searches[index];
  6730.   var lambda = function(query, home) {
  6731.     return cs.getCustomSearchURL(index, query)}
  6732.   
  6733.   ;
  6734.   var label = customSearch.title;
  6735.   var tip = customSearch.tip;
  6736.   if(!tip) {
  6737.     tip = label}
  6738.   return new GTB_SearchType("GTB_Custom_Search_" + index, customSearch.icon, label, tip, lambda)}
  6739.  
  6740. var validTldList = ".com.edu.net.org.gov.mil.jp.de.au.in.uk.fr.ca.dk.it.cn.kr.int.arpa.nato.biz.name.museum.pro.aero.coop.info.ac.ad.ae.af.ag.ai.al.am.an.ao.aq.ar.as.at.au.aw.az.ba.bb.bd.be.bf.bg.bh.bi.bj.bm.bn.bo.br.bs.bt.bv.bw.by.bz.ca.cc.cd.cf.cg.ch.ci.ck.cl.cm.cn.co.cr.cu.cv.cx.cy.cz.de.dj.dk.dm.do.dz.ec.ee.eg.eh.er.es.et.fi.fj.fk.fm.fo.fr.ga.gd.ge.gf.gg.gh.gi.gl.gm.gn.gp.gq.gr.gs.gt.gu.gw.gy.hk.hm.hn.hr.ht.hu.id.ie.il.im.in.io.iq.ir.is.it.je.jm.jo.jp.ke.kg.kh.ki.km.kn.kp.kr.kw.ky.kz.la.lb.lc.li.lk.lr.ls.lt.lu.lv.ly.ma.mc.md.mg.mh.mk.ml.mm.mn.mo.mp.mq.mr.ms.mt.mu.mv.mw.mx.my.mz.na.nc.ne.nf.ng.ni.nl.no.np.nr.nu.nz.om.pa.pe.pf.pg.ph.pk.pl.pm.pn.pr.ps.pt.pw.py.qa.re.ro.ru.rw.sa.sb.sc.sd.se.sg.sh.si.sj.sk.sl.sm.sn.so.sr.st.sv.sy.sz.tc.td.tf.tg.th.tj.tk.tm.tn.to.tp.tr.tt.tv.tw.tz.ua.ug.uk.um.us.uy.uz.va.vc.ve.vg.vi.vn.vu.wf.ws.ye.yt.yu.za.zm.zw."
  6741. ;
  6742. function GTB_LooksLikeUrl(str) {
  6743.   if(str.search(/\s/) != -1) {
  6744.     return false}
  6745.   if(str.indexOf("http://") == 0 || str.indexOf("https://") == 0 || str.indexOf("ftp://") == 0) {
  6746.     return true}
  6747.   var hostnameEnd = str.indexOf("/");
  6748.   if(hostnameEnd == -1) {
  6749.     hostnameEnd = str.length}
  6750.   var hostname = str.substr(0, hostnameEnd);
  6751.   if(hostname.search(/[^_a-zA-Z0-9\*\-\.]/) != -1) {
  6752.     return false}
  6753.   var lastDot = hostname.lastIndexOf(".");
  6754.   if(lastDot == -1) {
  6755.     return false}
  6756.   var tld = hostname.substring(lastDot, hostname.length);
  6757.   if(validTldList.indexOf(tld + ".") == -1) {
  6758.     return false}
  6759.   return true}
  6760.  
  6761. function GTB_IsOnline() {
  6762.   var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  6763.   if(ioService.offline) {
  6764.     return false}
  6765.   try {
  6766.     var connectClass = Components.classes["@google.com/connectutil;1"];
  6767.     if(!connectClass) {
  6768.       return true}
  6769.     var connectUtil = connectClass.createInstance(Components.interfaces.GTBIConnectUtil);
  6770.     if(!connectUtil) {
  6771.       return true}
  6772.     return connectUtil.isOnline()}
  6773.   catch(e) {
  6774.     return true}
  6775. }
  6776.  
  6777. function GTB_GenerateId() {
  6778.   var id = "";
  6779.   var values = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
  6780.   for(var index = 0;index < 44;index ++ ) {
  6781.     id += values[Math.floor(Math.random() * values.length)]}
  6782.   return id}
  6783.  
  6784. function GTB_GetId() {
  6785.   var id = null;
  6786.   var id = GTB_getPrefs().getLocalMachineString("id");
  6787.   if(id) {
  6788.     GTB_getPrefs().setStringPref(GTB_PREF_INSTALL_ID, id);
  6789.     return id}
  6790.   try {
  6791.     id = GTB_getPrefs().getStringPref(GTB_PREF_INSTALL_ID)}
  6792.   catch(exception) {
  6793.     id = null}
  6794.   if(id)return id;
  6795.   id = GTB_GenerateId();
  6796.   GTB_getPrefs().setStringPref(GTB_PREF_INSTALL_ID, id);
  6797.   GTB_getPrefs().setLocalMachineString("id", id);
  6798.   return id}
  6799.  
  6800. function GTB_ComposeDailyPingUrl() {
  6801.   var firstsearch = "";
  6802.   if(GTB_getPrefs().hasUserValue(GTB_PREF_FIRST_SEARCH)) {
  6803.     if(GTB_getPrefs().getBoolPref(GTB_PREF_FIRST_SEARCH)) {
  6804.       if(GTB_getPrefs().getLocalMachineString("sentfs")) {
  6805.         GTB_getPrefs().setBoolPref(GTB_PREF_FIRST_SEARCH, false)}
  6806.       else {
  6807.         var numTries = GTB_getPrefs().getIntPrefWithDefault(GTB_PREF_FIRST_SEARCH_PING_RETRIES, 0);
  6808.         if(numTries < 14) {
  6809.           firstsearch = "fs=1&";
  6810.           GTB_getPrefs().setIntPref(GTB_PREF_FIRST_SEARCH_PING_RETRIES, numTries + 1)}
  6811.       }
  6812.     }
  6813.   }
  6814.   var install = "";
  6815.   if(!GTB_getPrefs().getBoolPrefWithDefault(GTB_PREF_INSTALL_PING_ACKED, false)) {
  6816.     if(GTB_getPrefs().getLocalMachineString("sent")) {
  6817.       GTB_getPrefs().setBoolPref(GTB_PREF_INSTALL_PING_ACKED, true)}
  6818.     else {
  6819.       var numTries = GTB_getPrefs().getIntPrefWithDefault(GTB_PREF_INSTALL_PING_RETRIES, 0);
  6820.       if(numTries < 14) {
  6821.         install = "install=1&";
  6822.         GTB_getPrefs().setIntPref(GTB_PREF_INSTALL_PING_RETRIES, numTries + 1)}
  6823.     }
  6824.   }
  6825.   var home = GTB_getPrefs().getStringPref(GTB_PREF_GOOGLE_HOME);
  6826.   var homePrefix = "www.google.";
  6827.   var tld = home.slice(homePrefix.length, home.length);
  6828.   var guid = GTB_GetId();
  6829.   var brand = GTB_getPrefs().getLocalMachineString("brand");
  6830.   if(brand == null)brand = "GGGL";
  6831.   var url = "http://www.google.com/tools/toolbar/service/update?as=tbff&id=" + guid + "&" + install + firstsearch + "version=2.0.20060515&hl=" + GTB_GoogleToolbarOverlay.languageCode + "&tbbrand=" + brand + "&sd=" + tld + "&os=" + encodeURIComponent(window.navigator.platform) + "&browser=" + encodeURIComponent(window.navigator.productSub);
  6832.   return url}
  6833.  
  6834. function GTB_SendDailyPing() {
  6835.   try {
  6836.     var lastPing = parseFloat(GTB_getPrefs().getStringPref(GTB_LAST_PING_ATTEMPT));
  6837.     var now = new Date;
  6838.     if(now.valueOf() - lastPing < 86400000) {
  6839.       return}
  6840.   }
  6841.   catch(e) {
  6842.   }
  6843.   if(!GTB_IsOnline()) {
  6844.     return}
  6845.   try {
  6846.     var xmlhttp = new XMLHttpRequest;
  6847.     var dailyPingUrl = GTB_ComposeDailyPingUrl();
  6848.     xmlhttp.open("GET", dailyPingUrl, true);
  6849.     new PROT_CookieStripper(xmlhttp.channel)}
  6850.   catch(exception) {
  6851.     return}
  6852.   xmlhttp.onreadystatechange = function() {
  6853.     try {
  6854.       if(xmlhttp.readyState == 4) {
  6855.         if(xmlhttp.status == 200) {
  6856.           var response = xmlhttp.responseText;
  6857.           if(response != null) {
  6858.             var url = null;
  6859.             var version = null;
  6860.             var lines = response.split("\n");
  6861.             for(var index in lines) {
  6862.               var line = lines[index];
  6863.               var keyvalue = line.split(": ");
  6864.               if(keyvalue.length == 2) {
  6865.                 switch(keyvalue[0]) {
  6866.                   case "Url":url = keyvalue[1];
  6867.                   break;
  6868.                   case "Version":version = keyvalue[1];
  6869.                   break;
  6870.                   case "Protocol":GTB_getPrefs().setBoolPref(GTB_PREF_INSTALL_PING_ACKED, true);
  6871.                   GTB_getPrefs().setLocalMachineString("sent", "1");
  6872.                   if(GTB_getPrefs().hasUserValue(GTB_PREF_FIRST_SEARCH) && GTB_getPrefs().getBoolPref(GTB_PREF_FIRST_SEARCH)) {
  6873.                     GTB_getPrefs().setBoolPref(GTB_PREF_FIRST_SEARCH, false);
  6874.                     GTB_getPrefs().setLocalMachineString("sentfs", "1")}
  6875.                 }
  6876.               }
  6877.             }
  6878.             if(version != null && version != "2.0.20060515" && url != null && true) {
  6879.               GTB_DoXpiInstall(url)}
  6880.           }
  6881.         }
  6882.       }
  6883.     }
  6884.     catch(exception) {
  6885.     }
  6886.   }
  6887.   
  6888.   ;
  6889.   try {
  6890.     xmlhttp.setRequestHeader("Accept", "*/*");
  6891.     xmlhttp.send(null);
  6892.     var now = new Date;
  6893.     GTB_getPrefs().setStringPref(GTB_LAST_PING_ATTEMPT, now.valueOf().toString())}
  6894.   catch(exception) {
  6895.   }
  6896.   var cookieService = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService);
  6897.   var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  6898.   var google = ios.newURI("http://www.google.com", null, null);
  6899.   var cookieString = cookieService.getCookieString(google, null);
  6900.   if(cookieString == null || cookieString.toUpperCase().indexOf("TB=2") == -1) {
  6901.     try {
  6902.       var cookieRequest = new XMLHttpRequest;
  6903.       cookieRequest.open("GET", "http://www.google.com/url?sa=p&pref=tb&pval=2&q=", true);
  6904.       cookieRequest.send(null);
  6905.       cookieRequest.onload = function() {
  6906.       }
  6907.       
  6908.     }
  6909.     catch(e) {
  6910.     }
  6911.   }
  6912. }
  6913.  
  6914. function GTB_DoXpiInstall(xpiUrl) {
  6915.   try {
  6916.     var dir = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
  6917.     dir.append("extensions");
  6918.     dir.append("staged-xpis");
  6919.     dir.append("{3112ca9c-de6d-4884-a869-9855de68056c}");
  6920.     if(dir.exists()) {
  6921.       dir.remove(true)}
  6922.   }
  6923.   catch(e) {
  6924.   }
  6925.   var manager = Components.classes["@mozilla.org/xpinstall/install-manager;1"].createInstance(Components.interfaces.nsIXPInstallManager);
  6926.   if(manager != null) {
  6927.     var items = [xpiUrl];
  6928.     var installProgress = {onStateChange:function(index, state, value) {
  6929.     }
  6930.     
  6931.     , onProgress:function(index, value, maxValue) {
  6932.     }
  6933.     
  6934.     };
  6935.     manager.initManagerFromChrome(items, items.length, installProgress)}
  6936. }
  6937.  
  6938. function PROT_CookieStripper(channel) {
  6939.   this.topic_ = "http-on-modify-request";
  6940.   this.channel_ = channel;
  6941.   var Cc = Components.classes;
  6942.   var Ci = Components.interfaces;
  6943.   this.observerService_ = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  6944.   this.observerService_.addObserver(this, this.topic_, false);
  6945.   var twentySeconds = 20000;
  6946.   this.alarm_ = setTimeout(GTB_hitch(this, this.stopObserving), twentySeconds)}
  6947.  
  6948. PROT_CookieStripper.prototype.observe = function(subject, topic, data) {
  6949.   if(topic != this.topic_ || subject != this.channel_)return;
  6950.   this.channel_.QueryInterface(Components.interfaces.nsIHttpChannel);
  6951.   this.channel_.setRequestHeader("Cookie", "", false);
  6952.   clearTimeout(this.alarm_);
  6953.   this.stopObserving()}
  6954.  
  6955. ;
  6956. PROT_CookieStripper.prototype.stopObserving = function() {
  6957.   this.observerService_.removeObserver(this, this.topic_);
  6958.   this.channel_ = (this.alarm_ = (this.observerService_ = null))}
  6959.  
  6960. ;
  6961. PROT_CookieStripper.prototype.QueryInterface = function(iid) {
  6962.   var Ci = Components.interfaces;
  6963.   if(iid.equals(Ci.nsISupports) || iid.equals(Ci.nsIObserve))return this;
  6964.   throw Components.results.NS_ERROR_NO_INTERFACE;}
  6965.  
  6966. ;
  6967. var GTBSC_MENU_PREFIX = "gtbspellmenu";
  6968. var GTBSC_POPUPMENU_ID = "gtbSpellcheckPopup";
  6969. var GTBSC_MISSPELL_SPAN_PREFIX = "gtbmisp";
  6970. var GTBSC_EDIT = "sc_edit";
  6971. var GTBSC_CHECK = "sc_check";
  6972. var GTBSC_PREF_PREFIX = "spell_check.";
  6973. var GTBSC_DICT_PREF_PREFIX = GTBSC_PREF_PREFIX + "dictionary.";
  6974. var GTBSC_CONTAINER_TAG = "spell_check";
  6975. function GTBSC_dump(s) {
  6976. }
  6977.  
  6978. function GetPageOffset(el) {
  6979.   var x = el.offsetLeft;
  6980.   var y = el.offsetTop;
  6981.   if(el.offsetParent != null) {
  6982.     var pos = GetPageOffset(el.offsetParent);
  6983.     x += pos.x;
  6984.     y += pos.y}
  6985.   return{x:x, y:y}}
  6986.  
  6987. function TrimLeft(str) {
  6988.   return str.replace(/^\s+/, "")}
  6989.  
  6990. function TrimRight(str) {
  6991.   return str.replace(/\s+$/, "")}
  6992.  
  6993. function Trim(str) {
  6994.   return TrimRight(TrimLeft(str))}
  6995.  
  6996. function getElementByIdAcrossFrames(win, id) {
  6997.   var el;
  6998.   if(win && win.document) {
  6999.     el = win.document.getElementById(id);
  7000.     if(el) {
  7001.       return el}
  7002.   }
  7003.   if(win && win.frames) {
  7004.     for(var i = 0;i < win.frames.length;i ++ ) {
  7005.       el = getElementByIdAcrossFrames(win.frames[i], id);
  7006.       if(el) {
  7007.         return el}
  7008.     }
  7009.   }
  7010.   return el}
  7011.  
  7012. function GTBSC_GetAnonymousDivFromTextbox(textbox) {
  7013.   var div = null;
  7014.   try {
  7015.     div = textbox.QueryInterface(Components.interfaces.nsIDOMNSEditableElement).editor.rootElement;
  7016.     if(div) {
  7017.       return div}
  7018.   }
  7019.   catch(e) {
  7020.   }
  7021.   var acs = Components.classes["@google.com/anonymous-content-service;1"].getService(Components.interfaces.GTBIAnonymousContentService);
  7022.   var nodes = null;
  7023.   try {
  7024.     nodes = acs.getAnonymousContent(textbox)}
  7025.   catch(e) {
  7026.   }
  7027.   if(nodes) {
  7028.     div = nodes.getNext()}
  7029.   return div}
  7030.  
  7031. function GTBSC_RemoveSpansFromTextbox(node) {
  7032.   var doc = node.ownerDocument;
  7033.   var textToAppend = "";
  7034.   for(var child = node.childNodes.length - 1;child >= 0;child -- ) {
  7035.     if(node.childNodes[child].nodeType == Node.TEXT_NODE) {
  7036.       textToAppend = node.childNodes[child].nodeValue + textToAppend;
  7037.       node.removeChild(node.childNodes[child])}
  7038.     else if(node.childNodes[child].nodeName.toLowerCase() == "span" && (GTBSC_startsWith(node.childNodes[child].id, GTBSC_MISSPELL_SPAN_PREFIX) || GTBSC_startsWith(node.childNodes[child].id, "gtbunch"))) {
  7039.       textToAppend = node.childNodes[child].firstChild.nodeValue + textToAppend;
  7040.       node.removeChild(node.childNodes[child])}
  7041.     else if(node.childNodes[child].nodeName.toLowerCase() == "input") {
  7042.       textToAppend = node.childNodes[child].value + textToAppend;
  7043.       node.removeChild(node.childNodes[child])}
  7044.     else if(node.childNodes[child].nodeName.toLowerCase() == "br" && textToAppend != "") {
  7045.       if(node.childNodes[child].nextSibling) {
  7046.         node.insertBefore(doc.createTextNode(textToAppend), node.childNodes[child].nextSibling)}
  7047.       else {
  7048.         node.appendChild(doc.createTextNode(textToAppend))}
  7049.       textToAppend = ""}
  7050.     else {
  7051.       if(textToAppend != "") {
  7052.         if(node.childNodes[child].nextSibling) {
  7053.           node.insertBefore(doc.createTextNode(textToAppend), node.childNodes[child].nextSibling)}
  7054.         else {
  7055.           node.appendChild(doc.createTextNode(textToAppend))}
  7056.         textToAppend = ""}
  7057.       GTBSC_RemoveSpansFromTextbox(node.childNodes[child])}
  7058.   }
  7059.   if(textToAppend != "") {
  7060.     if(node.childNodes.length > 0) {
  7061.       node.insertBefore(doc.createTextNode(textToAppend), node.childNodes[0])}
  7062.     else {
  7063.       node.appendChild(doc.createTextNode(textToAppend))}
  7064.   }
  7065. }
  7066.  
  7067. function GTBSC_startsWith(largerString, smallerString) {
  7068.   if(largerString.length < smallerString.length) {
  7069.     return false}
  7070.   if(largerString.substring(0, smallerString.length) == smallerString) {
  7071.     return true}
  7072.   return false}
  7073.  
  7074. function GTBSC_getMode() {
  7075.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7076.   var mode = tabData.mode;
  7077.   if(!mode)mode = GTBSC_EDIT;
  7078.   return mode}
  7079.  
  7080. function GTBSC_setMode(mode) {
  7081.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7082.   tabData.mode = mode;
  7083.   if(mode == GTBSC_CHECK) {
  7084.     GTB_SpellCheck._toggleSpellCheckButton(true)}
  7085.   else {
  7086.     GTB_SpellCheck._toggleSpellCheckButton(false)}
  7087. }
  7088.  
  7089. function GTBSC_getIsAutoFix() {
  7090.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7091.   var isAutoFix = tabData.isAutoFix;
  7092.   if(isAutoFix == null)isAutoFix = false;
  7093.   return isAutoFix}
  7094.  
  7095. function GTBSC_setIsAutoFix(isAutoFix) {
  7096.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7097.   tabData.isAutoFix = isAutoFix;
  7098.   if(isAutoFix) {
  7099.     GTB_SpellCheck._toggleAutoFixLabel(true)}
  7100.   else {
  7101.     GTB_SpellCheck._toggleAutoFixLabel(false)}
  7102. }
  7103.  
  7104. function GTBSC_getTextareasAcrossFrames(win, textareasByFrame) {
  7105.   if(win && win.document) {
  7106.     textareasByFrame[textareasByFrame.length] = win.document.getElementsByTagName("textarea")}
  7107.   if(win && win.frames) {
  7108.     for(var i = 0;i < win.frames.length;i ++ ) {
  7109.       textareasByFrame = GTBSC_getTextareasAcrossFrames(win.frames[i], textareasByFrame)}
  7110.   }
  7111.   return textareasByFrame}
  7112.  
  7113. function GTBSC_getTextinputsAcrossFrames(win, textinputsByFrame) {
  7114.   if(win && win.document) {
  7115.     textinputsByFrame[textinputsByFrame.length] = win.document.getElementsByTagName("input")}
  7116.   if(win && win.frames) {
  7117.     for(var i = 0;i < win.frames.length;i ++ ) {
  7118.       textinputsByFrame = GTBSC_getTextinputsAcrossFrames(win.frames[i], textinputsByFrame)}
  7119.   }
  7120.   return textinputsByFrame}
  7121.  
  7122. function GTBSC_getDesignModeDocs(win, designmode) {
  7123.   if(win && win.document && win.document.body) {
  7124.     var dm = win.document.designMode;
  7125.     if(dm == "on") {
  7126.       designmode[designmode.length] = win.document.body}
  7127.   }
  7128.   if(win && win.frames) {
  7129.     for(var i = 0;i < win.frames.length;i ++ ) {
  7130.       designmode = GTBSC_getDesignModeDocs(win.frames[i], designmode)}
  7131.   }
  7132.   return designmode}
  7133.  
  7134. function GTBSC_getSpellText(win, switchToCheckMode) {
  7135.   var blocks = new GTBSC_TextBlockifier;
  7136.   win.focus();
  7137.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7138.   tabData.textareas = [];
  7139.   tabData.textinputs = [];
  7140.   tabData.designmode = [];
  7141.   var textareasByFrame = GTBSC_getTextareasAcrossFrames(win, []);
  7142.   var textinputsByFrame = GTBSC_getTextinputsAcrossFrames(win, []);
  7143.   var designModeDocs = GTBSC_getDesignModeDocs(win, []);
  7144.   var blockIndex, tabDataIndex;
  7145.   for(var frame = 0;frame < textareasByFrame.length;frame ++ ) {
  7146.     var textareas = textareasByFrame[frame];
  7147.     for(var i = 0;i < textareas.length;i ++ ) {
  7148.       if(textareas[i].disabled || textareas[i].readOnly) {
  7149.         continue}
  7150.       tabDataIndex = tabData.textareas.length;
  7151.       blockIndex = blocks.addBlock(textareas[i].value, tabDataIndex, 1);
  7152.       if(switchToCheckMode) {
  7153.         GTBSC_toggleBoxToCheckMode(textareas[i], blockIndex, 1)}
  7154.       tabData.textareas[tabDataIndex] = textareas[i]}
  7155.   }
  7156.   for(var frame = 0;frame < textinputsByFrame.length;frame ++ ) {
  7157.     var textinputs = textinputsByFrame[frame];
  7158.     for(i = 0;i < textinputs.length;i ++ ) {
  7159.       if(textinputs[i].type == "text") {
  7160.         if(textinputs[i].disabled || textinputs[i].readOnly) {
  7161.           continue}
  7162.         tabDataIndex = tabData.textinputs.length;
  7163.         blockIndex = blocks.addBlock(textinputs[i].value, tabDataIndex, 0);
  7164.         if(switchToCheckMode) {
  7165.           GTBSC_toggleBoxToCheckMode(textinputs[i], blockIndex, 0)}
  7166.         tabData.textinputs[tabDataIndex] = textinputs[i]}
  7167.     }
  7168.   }
  7169.   for(var i = 0;i < designModeDocs.length;i ++ ) {
  7170.     var allText = GTBSC_getNodeText(designModeDocs[i]);
  7171.     blockIndex = blocks.addBlock(allText, i, 2);
  7172.     if(switchToCheckMode) {
  7173.       GTBSC_toggleBoxToCheckMode(designModeDocs[i], blockIndex, 2)}
  7174.     tabData.designmode[tabData.designmode.length] = designModeDocs[i]}
  7175.   return blocks}
  7176.  
  7177. function GTBSC_toggleBoxToCheckMode(editBox, blockIndex, inputBoxType) {
  7178.   var doc = editBox.ownerDocument;
  7179.   var win = doc && doc.defaultView;
  7180.   if(!win) {
  7181.     GTB_Dump(GTB_Dump.SC, "unable to get editbox window");
  7182.     return}
  7183.   var computed_style = win.getComputedStyle(editBox, "");
  7184.   if(computed_style) {
  7185.     editBox.setAttribute("GTB_oldBackgroundColor", computed_style["backgroundColor"]);
  7186.     editBox.setAttribute("GTB_oldColor", computed_style["color"]);
  7187.     editBox.style["backgroundColor"] = "#e8f1ff";
  7188.     editBox.style["color"] = "black";
  7189.     if(2 == inputBoxType) {
  7190.       if(editBox.ownerDocument) {
  7191.         editBox.ownerDocument.designMode = "off"}
  7192.     }
  7193.     else {
  7194.       editBox.readOnly = true}
  7195.     editBox.addEventListener("click", GTBSC_showStopSpellCheckMenu, false)}
  7196. }
  7197.  
  7198. function GTBSC_toggleToEdit() {
  7199.   var win = GTB_getToolbar()._getCurrentWindow();
  7200.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7201.   if(tabData.editWord) {
  7202.     tabData.editWord.removeEditBox()}
  7203.   var textareas = [];
  7204.   var input, i;
  7205.   for(i = 0;input = tabData.textareas[i]; ++ i) {
  7206.     textareas.push(input)}
  7207.   for(i = 0;input = tabData.textinputs[i]; ++ i) {
  7208.     if(input.type == "text") {
  7209.       textareas.push(input)}
  7210.   }
  7211.   var designmode = tabData.designmode;
  7212.   var div;
  7213.   for(var i = 0;i < textareas.length;i ++ ) {
  7214.     textareas[i].style.backgroundColor = textareas[i].getAttribute("GTB_oldBackgroundColor");
  7215.     textareas[i].style.color = textareas[i].getAttribute("GTB_oldColor");
  7216.     textareas[i].removeAttribute("GTB_oldBackgroundColor");
  7217.     textareas[i].removeAttribute("GTB_oldColor");
  7218.     textareas[i].readOnly = false;
  7219.     textareas[i].removeEventListener("click", GTBSC_showStopSpellCheckMenu, false);
  7220.     div = GTBSC_GetAnonymousDivFromTextbox(textareas[i]);
  7221.     if(div) {
  7222.       GTBSC_RemoveSpansFromTextbox(div)}
  7223.   }
  7224.   for(var k = 0;k < designmode.length;k ++ ) {
  7225.     designmode[k].style.backgroundColor = designmode[k].getAttribute("GTB_oldBackgroundColor");
  7226.     designmode[k].style.color = designmode[k].getAttribute("GTB_oldColor");
  7227.     designmode[k].removeAttribute("GTB_oldBackgroundColor");
  7228.     designmode[k].removeAttribute("GTB_oldColor");
  7229.     if(designmode[k].ownerDocument) {
  7230.       try {
  7231.         designmode[k].ownerDocument.designMode = "on"}
  7232.       catch(e) {
  7233.       }
  7234.     }
  7235.     designmode[k].removeEventListener("click", GTBSC_showStopSpellCheckMenu, false);
  7236.     GTBSC_RemoveSpansFromTextbox(designmode[k])}
  7237.   win.focus();
  7238.   GTBSC_setIsAutoFix(false);
  7239.   GTBSC_setMode(GTBSC_EDIT)}
  7240.  
  7241. function GTBSC_getNodeText(node) {
  7242.   var text = [];
  7243.   for(var c = 0;c < node.childNodes.length;c ++ ) {
  7244.     var child = node.childNodes[c];
  7245.     text[text.length] = GTBSC_getNodeText(child)}
  7246.   if(node.nodeType == 3) {
  7247.     text[text.length] = node.nodeValue}
  7248.   if(node.tagName) {
  7249.     if(node.tagName == "INPUT") {
  7250.       text[text.length] = Trim(node.value)}
  7251.     if(node.tagName == "BR") {
  7252.       text[text.length] = "\n"}
  7253.   }
  7254.   return text.join("")}
  7255.  
  7256. function GTBSC_appendText(node, text) {
  7257.   var doc = node.ownerDocument;
  7258.   node.appendChild(doc.createTextNode(text))}
  7259.  
  7260. function GTBSC_setDefaultStyle(node) {
  7261.   node.style.font = "normal normal normal 100% serif";
  7262.   node.style.border = "0";
  7263.   node.style.position = "static";
  7264.   node.style.background = "transparent none";
  7265.   node.style.margin = "0";
  7266.   node.style.padding = "0";
  7267.   node.style.whitespace = "normal";
  7268.   node.style.textAlign = "left";
  7269.   node.style.textIndent = 0;
  7270.   node.style.textTransform = "none";
  7271.   node.style.color = "#000";
  7272.   node.style.textDecoration = "none";
  7273.   node.style.cursor = "default"}
  7274.  
  7275. function GTBSC_spanAroundText(node, text, opt_beforeNode) {
  7276.   var doc = GTB_getToolbar()._getCurrentDocument();
  7277.   var span = doc.createElement("span");
  7278.   GTBSC_setDefaultStyle(span);
  7279.   GTBSC_appendText(span, text);
  7280.   if(opt_beforeNode) {
  7281.     node.insertBefore(span, opt_beforeNode)}
  7282.   else {
  7283.     node.appendChild(span)}
  7284.   return span}
  7285.  
  7286. function GTBSC_createMisspellSpan(node, endIndex, misspelled, id, indexes) {
  7287.   var doc = node.ownerDocument;
  7288.   for(var i = 0;i < node.childNodes.length;i ++ ) {
  7289.     if(node.childNodes[i].nodeType == Node.TEXT_NODE) {
  7290.       var textStart = indexes.currentIndex;
  7291.       indexes.currentIndex += node.childNodes[i].nodeValue.length;
  7292.       var textEnd = indexes.currentIndex;
  7293.       if(textEnd > indexes.startIndex) {
  7294.         var textNode1Val = node.childNodes[i].nodeValue.substring(0, indexes.startIndex - textStart);
  7295.         var textNode2Val = node.childNodes[i].nodeValue.substr(endIndex - textStart);
  7296.         var misspelledText = node.childNodes[i].nodeValue.substring(indexes.startIndex - textStart, endIndex - indexes.startIndex);
  7297.         if(endIndex - indexes.startIndex < misspelled.length) {
  7298.           node.childNodes[i].nodeValue = textNode2Val}
  7299.         else {
  7300.           node.childNodes[i].nodeValue = textNode1Val;
  7301.           var newTextNode = doc.createTextNode(textNode2Val);
  7302.           if(node.childNodes[i].nextSibling) {
  7303.             node.insertBefore(newTextNode, node.childNodes[i].nextSibling)}
  7304.           else {
  7305.             node.appendChild(newTextNode)}
  7306.           var misspellSpan = GTBSC_spanAroundText(node, misspelled, newTextNode);
  7307.           GTBSC_setMisspellStyle(misspellSpan);
  7308.           misspellSpan.id = GTBSC_MISSPELL_SPAN_PREFIX + "_" + id;
  7309.           misspellSpan.addEventListener("click", GTBSC_spellListSuggestions, false);
  7310.           i += 2}
  7311.         if(textEnd >= endIndex) {
  7312.           return true}
  7313.         else {
  7314.           indexes.startIndex += misspelledText.length}
  7315.       }
  7316.     }
  7317.     else if(node.childNodes[i].nodeName.toLowerCase() == "span" && GTBSC_startsWith(node.childNodes[i].id, GTBSC_MISSPELL_SPAN_PREFIX)) {
  7318.       indexes.currentIndex += node.childNodes[i].firstChild.nodeValue.length}
  7319.     else if(node.childNodes[i].nodeName.toLowerCase() == "br") {
  7320.       indexes.currentIndex ++ }
  7321.     else {
  7322.       if(GTBSC_createMisspellSpan(node.childNodes[i], endIndex, misspelled, id, indexes)) {
  7323.         return true}
  7324.     }
  7325.   }
  7326.   return false}
  7327.  
  7328. function GTBSC_editWordBox(misspellSpan) {
  7329.   this.misspellSpan = misspellSpan;
  7330.   var doc = misspellSpan.ownerDocument;
  7331.   this.editBox = doc.createElement("input");
  7332.   this.editBox.type = "text";
  7333.   this.editBox.size = parseInt(misspellSpan.firstChild.data.length) + 10;
  7334.   this.editBox.value = misspellSpan.firstChild.data;
  7335.   this.onKeydown = GTB_hitch(this, this.doKeydown);
  7336.   this.onKeypress = GTB_hitch(this, this.doKeypress);
  7337.   this.editBox.addEventListener("click", GTBSC_stopPropagation, false);
  7338.   this.editBox.addEventListener("keydown", this.onKeydown, false);
  7339.   this.editBox.addEventListener("keypress", this.onKeypress, false);
  7340.   misspellSpan.parentNode.insertBefore(this.editBox, misspellSpan);
  7341.   misspellSpan.style.display = "none";
  7342.   this.editBox.focus()}
  7343.  
  7344. GTBSC_editWordBox.prototype._removeEventListeners = function() {
  7345.   this.editBox.removeEventListener("click", GTBSC_stopPropagation, false);
  7346.   this.editBox.removeEventListener("keydown", this.onKeydown, false);
  7347.   this.editBox.removeEventListener("keypress", this.onKeypress, false)}
  7348.  
  7349. ;
  7350. GTBSC_editWordBox.prototype.doKeydown = function(ev) {
  7351.   if(ev.keyCode == KeyEvent.DOM_VK_RETURN) {
  7352.     ev.preventDefault();
  7353.     this.removeEditBox()}
  7354. }
  7355.  
  7356. ;
  7357. GTBSC_editWordBox.prototype.doKeypress = function(ev) {
  7358.   if(ev.keyCode == KeyEvent.DOM_VK_ESCAPE) {
  7359.     this.removeEditBox()}
  7360. }
  7361.  
  7362. ;
  7363. GTBSC_editWordBox.prototype.removeEditBox = function() {
  7364.   this._removeEventListeners();
  7365.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7366.   var idComponents = this.misspellSpan.id.split("_");
  7367.   var originalWord = tabData.originalWords[idComponents[1]];
  7368.   this.misspellSpan.firstChild.data = this.editBox.value;
  7369.   var color = "green";
  7370.   if(this.editBox.value == originalWord) {
  7371.     color = "red"}
  7372.   this.misspellSpan.style.color = color;
  7373.   this.misspellSpan.style.display = "";
  7374.   this.editBox.parentNode.removeChild(this.editBox);
  7375.   tabData.editWord = null}
  7376.  
  7377. ;
  7378. function GTBSC_stopPropagation(event) {
  7379.   event.stopPropagation();
  7380.   event.target.focus()}
  7381.  
  7382. function GTBSC_showStopSpellCheckMenu(event) {
  7383.   var stringBundle = document.getElementById("google-toolbar-strings");
  7384.   var popup = GTBSC_createPopupMenu(GTBSC_POPUPMENU_ID);
  7385.   popup.addEventListener("command", GTBSC_toggleToEdit, false);
  7386.   var menuitem = document.createElement("menuitem");
  7387.   popup.appendChild(menuitem);
  7388.   var editingDisabledString = stringBundle.getString("prop.gtb.spelling.editingdisabled");
  7389.   menuitem.setAttribute("label", editingDisabledString);
  7390.   menuitem.setAttribute("disabled", true);
  7391.   popup.appendChild(document.createElement("menuseparator"));
  7392.   menuitem = document.createElement("menuitem");
  7393.   popup.appendChild(menuitem);
  7394.   var stopCheckingString = stringBundle.getString("prop.gtb.spelling.stopchecking");
  7395.   menuitem.setAttribute("label", stopCheckingString);
  7396.   var anchor = GTB_getToolbar()._getCurrentBrowser();
  7397.   document.popupNode = anchor;
  7398.   var xpos = event.screenX - anchor.boxObject.screenX + anchor.boxObject.x;
  7399.   var ypos = event.screenY - anchor.boxObject.screenY + anchor.boxObject.y;
  7400.   popup.showPopup(anchor, xpos, ypos, "popup")}
  7401.  
  7402. function GTBSC_createPopupMenu(id) {
  7403.   var popup = document.getElementById(id);
  7404.   if(!popup) {
  7405.     var popup = document.createElement("popup");
  7406.     var popupset = document.getElementById("mainPopupSet");
  7407.     popupset.appendChild(popup);
  7408.     popup.setAttribute("id", id)}
  7409.   else {
  7410.     while(popup.hasChildNodes()) {
  7411.       popup.removeChild(popup.firstChild)}
  7412.     popup.removeEventListener("command", GTBSC_toggleToEdit, false);
  7413.     popup.removeEventListener("command", GTBSC_onCommandSuggestion, false)}
  7414.   return popup}
  7415.  
  7416. function GTBSC_showAlertMessage(msg) {
  7417.   GTB_TT_XULTooltipAlert(GTB_SpellCheck._getSpellCheckButton(), msg, false)}
  7418.  
  7419. function GTBSC_setMisspellStyle(misspellSpan) {
  7420.   var parent = misspellSpan.parentNode;
  7421.   while(parent && parent.nodeName.toLowerCase() != "input" && parent.nodeName.toLowerCase() != "textarea") {
  7422.     parent = parent.parentNode}
  7423.   if(parent) {
  7424.     var doc = misspellSpan.ownerDocument;
  7425.     var computed_style = doc.defaultView.getComputedStyle(parent, "");
  7426.     misspellSpan.style.font = computed_style.font}
  7427.   misspellSpan.style.color = "red";
  7428.   misspellSpan.style.textDecoration = "underline";
  7429.   misspellSpan.style.fontWeight = "bold";
  7430.   misspellSpan.style.cursor = "pointer"}
  7431.  
  7432. function GTBSC_setDimmedSpanStyle(uncheckedSpan) {
  7433.   var parent = uncheckedSpan.parentNode;
  7434.   while(parent && parent.nodeName.toLowerCase() != "input" && parent.nodeName.toLowerCase() != "textarea") {
  7435.     parent = parent.parentNode}
  7436.   if(parent) {
  7437.     var doc = uncheckedSpan.ownerDocument;
  7438.     var computed_style = doc.defaultView.getComputedStyle(parent, "");
  7439.     uncheckedSpan.style.font = computed_style.font}
  7440.   uncheckedSpan.style.color = "#AAA"}
  7441.  
  7442. function GTBSC_correctAllInstances(tabData, correctWord) {
  7443.   var win = GTB_getToolbar()._getCurrentWindow();
  7444.   var positions = tabData.misspelledWords.getWordValues(correctWord);
  7445.   for(var i in positions) {
  7446.     var thisSpan = getElementByIdAcrossFrames(win, GTBSC_MISSPELL_SPAN_PREFIX + "_" + positions[i]);
  7447.     GTBSC_removeMisspellStyle(thisSpan);
  7448.     thisSpan.removeEventListener("click", GTBSC_spellListSuggestions, false)}
  7449. }
  7450.  
  7451. function GTBSC_removeMisspellStyle(misspellSpan) {
  7452.   misspellSpan.style.color = "black";
  7453.   misspellSpan.style.textDecoration = "";
  7454.   misspellSpan.style.fontWeight = "";
  7455.   misspellSpan.style.cursor = "default"}
  7456.  
  7457. function GTBSC_spellListSuggestions(event) {
  7458.   if(event.button == 0) {
  7459.     var win = GTB_getToolbar()._getCurrentWindow();
  7460.     var misspellSpan = event.target;
  7461.     var idComponents = misspellSpan.id.split("_");
  7462.     var id = idComponents[1];
  7463.     var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7464.     var suggestions = tabData.suggestions[parseInt(id)];
  7465.     var popup = GTBSC_createPopupMenu(GTBSC_POPUPMENU_ID);
  7466.     popup.setAttribute("spanId", id);
  7467.     popup.addEventListener("command", GTBSC_onCommandSuggestion, false);
  7468.     var stringBundle = document.getElementById("google-toolbar-strings");
  7469.     var menuitem;
  7470.     if(suggestions.length == 0) {
  7471.       menuitem = document.createElement("menuitem");
  7472.       popup.appendChild(menuitem);
  7473.       var noSuggestionString = stringBundle.getString("prop.gtb.spelling.nosuggestions");
  7474.       menuitem.setAttribute("label", noSuggestionString);
  7475.       menuitem.setAttribute("disabled", "true")}
  7476.     else {
  7477.       var suggestion;
  7478.       for(var i = 0;suggestion = suggestions[i]; ++ i) {
  7479.         menuitem = document.createElement("menuitem");
  7480.         popup.appendChild(menuitem);
  7481.         menuitem.setAttribute("label", suggestion)}
  7482.     }
  7483.     popup.appendChild(document.createElement("menuseparator"));
  7484.     menuitem = document.createElement("menuitem");
  7485.     popup.appendChild(menuitem);
  7486.     var editString = stringBundle.getString("prop.gtb.spelling.edit");
  7487.     menuitem.setAttribute("label", editString);
  7488.     menuitem.setAttribute("id", GTBSC_MENU_PREFIX + "_edit");
  7489.     if("red" == misspellSpan.style.color) {
  7490.       menuitem = document.createElement("menuitem");
  7491.       popup.appendChild(menuitem);
  7492.       var ignoreAllMsg = stringBundle.getString("prop.gtb.spelling.ignoreall");
  7493.       menuitem.setAttribute("label", ignoreAllMsg);
  7494.       menuitem.setAttribute("id", GTBSC_MENU_PREFIX + "_ignoreall");
  7495.       menuitem = document.createElement("menuitem");
  7496.       popup.appendChild(menuitem);
  7497.       var dictAddMsg = stringBundle.getString("prop.gtb.spelling.dictadd");
  7498.       menuitem.setAttribute("label", dictAddMsg);
  7499.       menuitem.setAttribute("id", GTBSC_MENU_PREFIX + "_dictadd")}
  7500.     else {
  7501.       menuitem = document.createElement("menuitem");
  7502.       popup.appendChild(menuitem);
  7503.       var revertMsg = stringBundle.getString("prop.gtb.spelling.revert");
  7504.       var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7505.       var originalWord = tabData.originalWords[id];
  7506.       menuitem.setAttribute("label", revertMsg.replace("%s", originalWord));
  7507.       menuitem.setAttribute("id", GTBSC_MENU_PREFIX + "_revert")}
  7508.     var misspellPos = GetPageOffset(misspellSpan);
  7509.     var parentPos = GetPageOffset(misspellSpan.parentNode);
  7510.     var nodeOffsetX = -event.layerX + misspellPos.x - parentPos.x;
  7511.     var nodeOffsetY = -event.layerY + misspellPos.y - parentPos.y + misspellSpan.offsetHeight + 2;
  7512.     var anchor = GTB_getToolbar()._getCurrentBrowser();
  7513.     document.popupNode = anchor;
  7514.     var xpos = event.screenX - anchor.boxObject.screenX + anchor.boxObject.x;
  7515.     var ypos = event.screenY - anchor.boxObject.screenY + anchor.boxObject.y;
  7516.     popup.showPopup(anchor, xpos + nodeOffsetX, ypos + nodeOffsetY, "popup");
  7517.     event.stopPropagation()}
  7518. }
  7519.  
  7520. function GTBSC_onCommandSuggestion(event) {
  7521.   var id = event.target.id;
  7522.   var popup = this;
  7523.   var win = GTB_getToolbar()._getCurrentWindow();
  7524.   var misspellSpanId = popup.getAttribute("spanId", id);
  7525.   var misspellSpan = getElementByIdAcrossFrames(win, GTBSC_MISSPELL_SPAN_PREFIX + "_" + misspellSpanId);
  7526.   if(id == GTBSC_MENU_PREFIX + "_edit") {
  7527.     GTBSC_editMisspelledWord(misspellSpan)}
  7528.   else if(id == GTBSC_MENU_PREFIX + "_ignoreall") {
  7529.     GTBSC_addWordToWhitelist(misspellSpan.firstChild.data)}
  7530.   else if(id == GTBSC_MENU_PREFIX + "_dictadd") {
  7531.     GTBSC_addWordToDictionary(misspellSpan.firstChild.data)}
  7532.   else if(id == GTBSC_MENU_PREFIX + "_revert") {
  7533.     GTBSC_revertToOriginal(misspellSpan, misspellSpanId)}
  7534.   else {
  7535.     GTBSC_spellAcceptCorrection(misspellSpan, event.target.label)}
  7536. }
  7537.  
  7538. function GTBSC_addWordToWhitelist(word) {
  7539.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7540.   tabData.whitelist.addWord(word);
  7541.   GTBSC_correctAllInstances(tabData, word)}
  7542.  
  7543. function GTBSC_addWordToDictionary(word) {
  7544.   GTB_getToolbar().spellCheck.userDictionary.addWord(word);
  7545.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7546.   GTBSC_correctAllInstances(tabData, word);
  7547.   GTB_getToolbar().spellCheck.userDictionary.save();
  7548.   GTB_getToolbar().sendMessage("GTB_SpellCheck.reload_dictionary", null)}
  7549.  
  7550. function GTBSC_editMisspelledWord(misspellSpan) {
  7551.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7552.   if(tabData.editWord) {
  7553.     try {
  7554.       tabData.editWord.removeEditBox()}
  7555.     catch(e) {
  7556.     }
  7557.     tabData.editWord = null}
  7558.   tabData.editWord = new GTBSC_editWordBox(misspellSpan)}
  7559.  
  7560. function GTBSC_spellAcceptCorrection(misspellSpan, correctWord) {
  7561.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7562.   tabData.whitelist.addWord(correctWord);
  7563.   tabData.whitelist.removeWord(misspellSpan.firstChild.data);
  7564.   misspellSpan.firstChild.data = correctWord;
  7565.   misspellSpan.style.color = "green"}
  7566.  
  7567. function GTBSC_revertToOriginal(misspellSpan, idIndex) {
  7568.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7569.   var originalWord = tabData.originalWords[idIndex];
  7570.   GTB_Assert(tabData.misspelledWords.hasWord(originalWord), "word " + originalWord + " is not one of the misspelled words");
  7571.   misspellSpan.firstChild.data = originalWord;
  7572.   misspellSpan.style.color = "red"}
  7573.  
  7574. function GTBSC_TextBlockifier() {
  7575.   this.separator = "\n";
  7576.   this.allText = "";
  7577.   this.blockOffsets = [];
  7578.   this.blockLengths = [];
  7579.   this.blockType = [];
  7580.   this.blockTextboxIndex = []}
  7581.  
  7582. GTBSC_TextBlockifier.prototype.addBlock = function(text, index, inputType) {
  7583.   if(this.allText.length > 0) {
  7584.     this.allText += this.separator}
  7585.   var block_index = this.blockOffsets.length;
  7586.   this.blockOffsets[block_index] = this.allText.length;
  7587.   this.blockLengths[block_index] = String(text).length;
  7588.   this.blockTextboxIndex[block_index] = index;
  7589.   this.blockType[block_index] = inputType;
  7590.   this.allText += text;
  7591.   return block_index}
  7592.  
  7593. ;
  7594. GTBSC_TextBlockifier.prototype.getText = function() {
  7595.   return this.allText}
  7596.  
  7597. ;
  7598. GTBSC_TextBlockifier.prototype.getTextLength = function() {
  7599.   return this.allText.length}
  7600.  
  7601. ;
  7602. GTBSC_TextBlockifier.prototype.globalToLocal = function(global) {
  7603.   GTB_Assert(global >= 0 && global < this.getTextLength(), "The requested global index " + global + " is invalid");
  7604.   var offset;
  7605.   var block;
  7606.   for(var i = 1;i < this.blockOffsets.length;i ++ ) {
  7607.     if(this.blockOffsets[i] > global) {
  7608.       block = i - 1;
  7609.       offset = global - this.blockOffsets[i - 1];
  7610.       return new GTBSC_BlockAndLocalOffset(block, offset)}
  7611.   }
  7612.   block = this.blockOffsets.length - 1;
  7613.   offset = global - this.blockOffsets[block];
  7614.   return new GTBSC_BlockAndLocalOffset(block, offset)}
  7615.  
  7616. ;
  7617. GTBSC_TextBlockifier.prototype.localToGlobal = function(block, offset) {
  7618.   return parseInt(this.blockOffsets[block]) + parseInt(offset)}
  7619.  
  7620. ;
  7621. GTBSC_TextBlockifier.prototype.divForBlock = function(blockNum, tabData) {
  7622.   var type = this.blockType[blockNum];
  7623.   var realBlockNum = this.blockTextboxIndex[blockNum];
  7624.   var textbox;
  7625.   var div;
  7626.   if(type == 1) {
  7627.     textbox = tabData.textareas[realBlockNum];
  7628.     div = GTBSC_GetAnonymousDivFromTextbox(textbox)}
  7629.   else if(type == 0) {
  7630.     textbox = tabData.textinputs[realBlockNum];
  7631.     div = GTBSC_GetAnonymousDivFromTextbox(textbox)}
  7632.   else if(type == 2) {
  7633.     textbox = tabData.designmode[realBlockNum];
  7634.     div = textbox}
  7635.   return new GTBSC_TextboxAndDiv(textbox, div)}
  7636.  
  7637. ;
  7638. function GTBSC_BlockAndLocalOffset(block, offset) {
  7639.   this.block = block;
  7640.   this.offset = offset}
  7641.  
  7642. function GTBSC_TextboxAndDiv(textbox, div) {
  7643.   this.textbox = textbox;
  7644.   this.div = div}
  7645.  
  7646. function GTBSC_ParseStatus(blocks, text, currentBlock, currentIndex) {
  7647.   this.blocks = blocks;
  7648.   this.text = text;
  7649.   this.currentBlock = currentBlock;
  7650.   this.currentIndex = currentIndex}
  7651.  
  7652. function GTBSC_MisspellIndexes(startIndex, currentIndex) {
  7653.   this.startIndex = startIndex;
  7654.   this.currentIndex = currentIndex}
  7655.  
  7656. function GTBSC_Correction(offset, length, confidence, suggestions) {
  7657.   this.offset = offset;
  7658.   this.length = length;
  7659.   this.confidence = confidence;
  7660.   if(suggestions == "") {
  7661.     this.suggestions = []}
  7662.   else {
  7663.     this.suggestions = suggestions.split("\t")}
  7664. }
  7665.  
  7666. function GTBSC_SpellResponse(xmlDoc, rawText) {
  7667.   this._xmlDoc = xmlDoc;
  7668.   this._rawText = rawText;
  7669.   this.corrections = [];
  7670.   this._error = null;
  7671.   this._clipped = null;
  7672.   this._charsChecked = null;
  7673.   this._suggestedLang = null;
  7674.   this._parse()}
  7675.  
  7676. GTBSC_SpellResponse.prototype._parse = function() {
  7677.   var spellResultNode = this._xmlDoc.documentElement;
  7678.   this._error = parseInt(spellResultNode.getAttribute("error"));
  7679.   this._clipped = parseInt(spellResultNode.getAttribute("clipped"));
  7680.   this._charsChecked = parseInt(spellResultNode.getAttribute("charschecked"));
  7681.   this._suggestedLang = spellResultNode.getAttribute("suggestedlang");
  7682.   if(spellResultNode.hasChildNodes()) {
  7683.     var children = spellResultNode.childNodes;
  7684.     for(var i = 0;i < children.length;i ++ ) {
  7685.       var cNode = children[i];
  7686.       if(cNode.nodeName != "c")continue;
  7687.       var offset = parseInt(cNode.getAttribute("o"));
  7688.       var length = parseInt(cNode.getAttribute("l"));
  7689.       var confidence = parseInt(cNode.getAttribute("s"));
  7690.       var suggestions = "";
  7691.       if(cNode.hasChildNodes()) {
  7692.         suggestions = cNode.firstChild.nodeValue}
  7693.       this.corrections[this.corrections.length] = new GTBSC_Correction(offset, length, confidence, suggestions)}
  7694.   }
  7695.   var stringBundle = document.getElementById("google-toolbar-strings");
  7696.   if(this._error != 0) {
  7697.     var errorString = stringBundle.getString("prop.gtb.spelling.servererror");
  7698.     alert(errorString);
  7699.     GTB_Dump(GTB_Dump.SC, errorString + "\nServer error: " + this._error)}
  7700.   if(this._clipped == 1) {
  7701.     var clippedString = stringBundle.getString("prop.gtb.spelling.errorsclipped");
  7702.     clippedString = clippedString.replace("%d", this.corrections.length);
  7703.     alert(clippedString);
  7704.     GTB_Dump(GTB_Dump.SC, clippedString)}
  7705.   else if(this._clipped == 2) {
  7706.     var clippedString = stringBundle.getString("prop.gtb.spelling.textclipped");
  7707.     alert(clippedString);
  7708.     GTB_Dump(GTB_Dump.SC, clippedString)}
  7709. }
  7710.  
  7711. ;
  7712. function GTBSC_SpellRequest(spellText) {
  7713.   this._spellText = spellText;
  7714.   this._textAlreadyClipped = false;
  7715.   this._ignoreDups = GTB_getPrefs().getBoolPref(GTB_PREF_SC_IGNORE_DUPS);
  7716.   this._ignoreDigits = GTB_getPrefs().getBoolPref(GTB_PREF_SC_IGNORE_DIGITS);
  7717.   this._ignoreAllCaps = GTB_getPrefs().getBoolPref(GTB_PREF_SC_IGNORE_ALL_CAPS)}
  7718.  
  7719. GTBSC_SpellRequest.prototype._buildXmlDoc = function() {
  7720.   var xmlDoc = document.implementation.createDocument("", "", null);
  7721.   var spellRequestElt = xmlDoc.createElement("spellrequest");
  7722.   var textElt = xmlDoc.createElement("text");
  7723.   var textNode = xmlDoc.createTextNode(this._spellText);
  7724.   textElt.appendChild(textNode);
  7725.   spellRequestElt.setAttribute("textalreadyclipped", self.textAlreadyClipped ? "1" : "0");
  7726.   spellRequestElt.setAttribute("ignoredups", this._ignoreDups ? "1" : "0");
  7727.   spellRequestElt.setAttribute("ignoredigits", this._ignoreDigits ? "1" : "0");
  7728.   spellRequestElt.setAttribute("ignoreallcaps", this._ignoreAllCaps ? "1" : "0");
  7729.   spellRequestElt.appendChild(textElt);
  7730.   xmlDoc.appendChild(spellRequestElt);
  7731.   return xmlDoc}
  7732.  
  7733. ;
  7734. GTBSC_SpellRequest.prototype._buildUrl = function() {
  7735.   var spellcheckUrl = "https://www.google.com/tbproxy/spell";
  7736.   var language = GTB_getPrefs().getStringPref(GTBSC_PREF_PREFIX + "lang");
  7737.   if(language == "auto") {
  7738.     language = GTB_getPrefs().getStringPref(GTBSC_PREF_PREFIX + "last_lang")}
  7739.   var hl = GTB_getToolbar().languageCode;
  7740.   var args = [];
  7741.   args.push("lang=" + language);
  7742.   args.push("hl=" + hl);
  7743.   return spellcheckUrl + "?" + args.join("&")}
  7744.  
  7745. ;
  7746. GTBSC_SpellRequest.prototype.send = function(allowSuggestLang) {
  7747.   var requestXmlDoc = this._buildXmlDoc();
  7748.   var serializer = new XMLSerializer;
  7749.   var requestBody = serializer.serializeToString(requestXmlDoc);
  7750.   var xmlhttp = new XMLHttpRequest;
  7751.   var asynchronous = true;
  7752.   var spellRequestUrl = this._buildUrl();
  7753.   xmlhttp.open("POST", spellRequestUrl, asynchronous);
  7754.   xmlhttp.onreadystatechange = function() {
  7755.     if(xmlhttp.readyState == 4) {
  7756.       if(xmlhttp.status != 200) {
  7757.         var stringBundle = document.getElementById("google-toolbar-strings");
  7758.         var errorString = stringBundle.getString("prop.gtb.spelling.noconnection");
  7759.         alert(errorString);
  7760.         GTB_Dump(GTB_Dump.SC, errorString);
  7761.         return}
  7762.       var responseXmlDoc = xmlhttp.responseXML;
  7763.       if(responseXmlDoc == null) {
  7764.         var parser = new DOMParser;
  7765.         responseXmlDoc = parser.parseFromString(xmlhttp.responseText, "text/xml")}
  7766.       else {
  7767.         GTB_Dump(GTB_Dump.SC, "spell server has been fixed!")}
  7768.       var response = new GTBSC_SpellResponse(responseXmlDoc, xmlhttp.responseText);
  7769.       GTBSC_handleResult(response, allowSuggestLang)}
  7770.   }
  7771.   
  7772.   ;
  7773.   xmlhttp.setRequestHeader("Accept", "text/html");
  7774.   xmlhttp.setRequestHeader("Accept", "text/xml");
  7775.   xmlhttp.setRequestHeader("Content-Type", "text/xml");
  7776.   xmlhttp.setRequestHeader("Content-Length", requestBody.length);
  7777.   xmlhttp.send(requestBody)}
  7778.  
  7779. ;
  7780. function GTBSC_handleResult(response, allowSuggestLang) {
  7781.   var win = GTB_getToolbar()._getCurrentWindow();
  7782.   if(GTBSC_getMode() == GTBSC_EDIT) {
  7783.     return}
  7784.   var language = GTB_getPrefs().getStringPref(GTBSC_PREF_PREFIX + "lang");
  7785.   var autodetectLanguage = false;
  7786.   if(language == "auto") {
  7787.     language = GTB_getPrefs().getStringPref(GTBSC_PREF_PREFIX + "last_lang");
  7788.     autodetectLanguage = true}
  7789.   var suggestedLanguage = response._suggestedLang;
  7790.   if(allowSuggestLang && suggestedLanguage != null) {
  7791.     if(suggestedLanguage.length == 2 && suggestedLanguage != language && (autodetectLanguage || GTBSC_ShouldChangeSpellLang(language, suggestedLanguage))) {
  7792.       if(!autodetectLanguage) {
  7793.         GTB_getPrefs().setStringPref(GTBSC_PREF_PREFIX + "lang", suggestedLanguage);
  7794.         GTB_SpellCheck._setLangMenuSelection(suggestedLanguage);
  7795.         GTB_SpellCheck._setLanguageSpecificTooltip(suggestedLanguage)}
  7796.       GTB_getPrefs().setStringPref(GTBSC_PREF_PREFIX + "last_lang", suggestedLanguage);
  7797.       GTBSC_toggleToEdit();
  7798.       GTB_getToolbar().spellCheck.run(true);
  7799.       return}
  7800.   }
  7801.   GTB_getPrefs().setStringPref(GTBSC_PREF_PREFIX + "last_lang", language);
  7802.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7803.   tabData.misspelledWords.clear();
  7804.   tabData.originalWords = [];
  7805.   tabData.autofixSuggestions.clear();
  7806.   tabData.suggestions = {};
  7807.   if(response.corrections.length == 0) {
  7808.     var stringBundle = document.getElementById("google-toolbar-strings");
  7809.     var spellingOkMsg = stringBundle.getString("prop.gtb.spelling.noerrors");
  7810.     GTBSC_showAlertMessage(spellingOkMsg);
  7811.     GTBSC_setMode(GTBSC_EDIT);
  7812.     GTBSC_setIsAutoFix(false);
  7813.     return}
  7814.   var textBlocks = GTBSC_getSpellText(win, true);
  7815.   var parseStatus = new GTBSC_ParseStatus(textBlocks, textBlocks.getText(), 0, 0);
  7816.   var total_misspelled = 0;
  7817.   for(var i = 0;i < response.corrections.length;i ++ ) {
  7818.     var c = response.corrections[i];
  7819.     GTBSC_updateParseStatus(parseStatus, c.offset - parseStatus.currentIndex);
  7820.     var blockInfo = parseStatus.blocks.globalToLocal(c.offset);
  7821.     var blockInfoEnd;
  7822.     var blockInfoEndIndex = parseInt(c.offset) + parseInt(c.length);
  7823.     if(blockInfoEndIndex == parseStatus.blocks.getTextLength()) {
  7824.       blockInfoEnd = blockInfo}
  7825.     else {
  7826.       blockInfoEnd = parseStatus.blocks.globalToLocal(blockInfoEndIndex)}
  7827.     var misspelled = parseStatus.text.substring(c.offset, c.offset + c.length);
  7828.     tabData.originalWords[tabData.originalWords.length] = misspelled;
  7829.     if(!GTB_getToolbar().spellCheck.userDictionary.hasWord(misspelled) && !tabData.whitelist.hasWord(misspelled)) {
  7830.       total_misspelled ++ ;
  7831.       if(c.confidence && c.suggestions.length > 0) {
  7832.         tabData.autofixSuggestions.addWordValue(c.suggestions[0], "" + i)}
  7833.       tabData.misspelledWords.addWordValue(misspelled, "" + i);
  7834.       var textboxInfo = parseStatus.blocks.divForBlock(parseStatus.currentBlock, tabData);
  7835.       var div = textboxInfo.div;
  7836.       if(div) {
  7837.         var offset = c.offset - parseStatus.blocks.blockOffsets[parseStatus.currentBlock];
  7838.         var indexes = new GTBSC_MisspellIndexes(offset, 0);
  7839.         GTBSC_createMisspellSpan(div, offset + c.length, misspelled, i, indexes);
  7840.         tabData.suggestions[i] = c.suggestions}
  7841.     }
  7842.     parseStatus.currentIndex = c.offset + c.length;
  7843.     if(parseStatus.currentIndex != parseStatus.blocks.getTextLength()) {
  7844.       if(parseStatus.blocks.globalToLocal(parseStatus.currentIndex).offset == parseStatus.blocks.blockLengths[parseStatus.currentBlock]) {
  7845.         parseStatus.currentBlock ++ ;
  7846.         parseStatus.currentIndex ++ }
  7847.     }
  7848.   }
  7849.   if(response._clipped != 0) {
  7850.     var lastCheckedBlockInfo = parseStatus.blocks.globalToLocal(response._charsChecked + 1);
  7851.     var div = parseStatus.blocks.divForBlock(lastCheckedBlockInfo.block, tabData).div;
  7852.     GTBSC_dimUncheckedText(div, lastCheckedBlockInfo.offset);
  7853.     for(var blockNum = lastCheckedBlockInfo.block + 1;blockNum < parseStatus.blocks.blockLengths.length;blockNum ++ ) {
  7854.       var div = parseStatus.blocks.divForBlock(blockNum, tabData).div;
  7855.       GTBSC_dimUncheckedText(div, 0)}
  7856.   }
  7857.   if(parseStatus.currentIndex < parseStatus.text.length - 1) {
  7858.     GTBSC_updateParseStatus(parseStatus, parseStatus.text.length - parseStatus.currentIndex)}
  7859.   if(total_misspelled == 0) {
  7860.     GTBSC_toggleToEdit();
  7861.     var stringBundle = document.getElementById("google-toolbar-strings");
  7862.     var spellingOkMsg = stringBundle.getString("prop.gtb.spelling.noerrors");
  7863.     GTBSC_showAlertMessage(spellingOkMsg);
  7864.     return}
  7865.   if(GTBSC_getIsAutoFix()) {
  7866.     GTBSC_autofixAllMisspellings()}
  7867. }
  7868.  
  7869. function GTBSC_dimUncheckedText(node, offset) {
  7870.   var currentOffset = 0;
  7871.   for(var i = 0;i < node.childNodes.length;i ++ ) {
  7872.     var childNode = node.childNodes[i];
  7873.     var offsetInChild = offset < currentOffset ? 0 : offset - currentOffset;
  7874.     if(childNode.nodeType == Node.TEXT_NODE) {
  7875.       if(offset < currentOffset + childNode.nodeValue.length) {
  7876.         var markedText = childNode.nodeValue.substring(offsetInChild);
  7877.         var unmarkedText = childNode.nodeValue.substring(0, offsetInChild);
  7878.         var newTextSpan = GTBSC_spanAroundText(node, markedText, childNode.nextSibling);
  7879.         childNode.nodeValue = unmarkedText;
  7880.         newTextSpan.id = "gtbunch_" + node.id + "_" + currentOffset;
  7881.         GTBSC_setDimmedSpanStyle(newTextSpan);
  7882.         if(offsetInChild == 0) {
  7883.           childNode.removeNode()}
  7884.         else {
  7885.           i ++ }
  7886.       }
  7887.       currentOffset += childNode.nodeValue.length}
  7888.     else if(node.nodeName.toLowerCase() == "br") {
  7889.       currentOffset ++ }
  7890.     else {
  7891.       currentOffset += GTBSC_dimUncheckedText(childNode, offsetInChild)}
  7892.   }
  7893.   return currentOffset}
  7894.  
  7895. function GTBSC_autofixAllMisspellings() {
  7896.   var win = GTB_getToolbar()._getCurrentWindow();
  7897.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7898.   var autofixSuggestions = tabData.autofixSuggestions.getWordsAsArray();
  7899.   for(var i = 0;i < autofixSuggestions.length;i ++ ) {
  7900.     var suggestion = autofixSuggestions[i];
  7901.     var positions = tabData.autofixSuggestions.getWordValues(suggestion);
  7902.     for(var j = 0;j < positions.length;j ++ ) {
  7903.       var misspelled = tabData.originalWords[positions[j]];
  7904.       var misspellSpan = getElementByIdAcrossFrames(win, GTBSC_MISSPELL_SPAN_PREFIX + "_" + positions[j]);
  7905.       if(GTB_getToolbar().spellCheck.userDictionary.hasWord(misspelled) || tabData.whitelist.hasWord(misspelled) || misspelled != misspellSpan.firstChild.data) {
  7906.         continue}
  7907.       misspellSpan.firstChild.data = suggestion;
  7908.       misspellSpan.style.color = "green"}
  7909.   }
  7910. }
  7911.  
  7912. function GTBSC_revertAutofixChanges() {
  7913.   var win = GTB_getToolbar()._getCurrentWindow();
  7914.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7915.   var originalWords = tabData.originalWords;
  7916.   for(var i = 0;i < originalWords.length;i ++ ) {
  7917.     var misspellSpan = getElementByIdAcrossFrames(win, GTBSC_MISSPELL_SPAN_PREFIX + "_" + i);
  7918.     if(misspellSpan) {
  7919.       GTBSC_revertToOriginal(misspellSpan, i)}
  7920.   }
  7921. }
  7922.  
  7923. function GTBSC_updateParseStatus(parseStatus, length) {
  7924.   var blocks = parseStatus.blocks;
  7925.   var endBlock;
  7926.   var endBlockIndex = parseInt(parseStatus.currentIndex) + parseInt(length);
  7927.   if(endBlockIndex == blocks.getTextLength()) {
  7928.     endBlock = blocks.blockLengths.length - 1}
  7929.   else {
  7930.     endBlock = blocks.globalToLocal(endBlockIndex).block}
  7931.   while(parseStatus.currentBlock < endBlock) {
  7932.     parseStatus.currentBlock ++ ;
  7933.     length = length - (blocks.blockOffsets[parseStatus.currentBlock] - parseStatus.currentIndex);
  7934.     parseStatus.currentIndex = blocks.blockOffsets[parseStatus.currentBlock]}
  7935.   parseStatus.currentIndex = parseStatus.currentIndex + length}
  7936.  
  7937. function GTBSC_getLocalizedLanuage(langCode) {
  7938.   var readableLangMap = {auto:"auto", da:"danish", de:"german", en:"english", es:"spanish", fr:"french", it:"italian", nl:"dutch", pl:"polish", pt:"portuguese", fi:"finnish", sv:"swedish"};
  7939.   var stringBundle = document.getElementById("google-toolbar-strings");
  7940.   var locLang = stringBundle.getString("prop.gtb.spelling.lang." + readableLangMap[langCode]);
  7941.   return locLang}
  7942.  
  7943. function GTBSC_getLocalizedTooltip(langCode) {
  7944.   var stringBundle = document.getElementById("google-toolbar-strings");
  7945.   var locLang = GTBSC_getLocalizedLanuage(langCode);
  7946.   var tooltipText = stringBundle.getString("prop.gtb.spelling.tooltip");
  7947.   tooltipText = tooltipText.replace("%s", locLang);
  7948.   return tooltipText}
  7949.  
  7950. function GTB_SpellCheck() {
  7951. }
  7952.  
  7953. GTB_SpellCheck.prototype.initUi = function() {
  7954.   var langPref = GTB_getPrefs().getStringPref(GTBSC_PREF_PREFIX + "lang");
  7955.   GTB_SpellCheck._setLangMenuSelection(langPref);
  7956.   GTB_SpellCheck._setLanguageSpecificTooltip(langPref)}
  7957.  
  7958. ;
  7959. GTB_SpellCheck.prototype.init = function(gto) {
  7960.   this.overlay = gto;
  7961.   this.initUi();
  7962.   try {
  7963.     GTB_getPrefs().getStringPref(GTBSC_PREF_PREFIX + "last_lang")}
  7964.   catch(e) {
  7965.     var langPref = GTB_getPrefs().getStringPref(GTBSC_PREF_PREFIX + "lang");
  7966.     GTB_getPrefs().setStringPref(GTBSC_PREF_PREFIX + "last_lang", langPref)}
  7967.   this.userDictionary = new GTBSC_UserDictionary;
  7968.   this.userDictionary.init();
  7969.   this.onDocSubmit_ = GTB_hitch(this, this.doDocSubmit_);
  7970.   document.addEventListener("submit", this.onDocSubmit_, false);
  7971.   this.onUnload_ = GTB_hitch(this, this.doUnload_);
  7972.   window.addEventListener("unload", this.onUnload_, false);
  7973.   GTB_perTabData().makeContainers(GTBSC_CONTAINER_TAG);
  7974.   this.GTB_MESSAGES = {GTB_TABSWITCH:function(data) {
  7975.     var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  7976.     if(tabData.mode == GTBSC_CHECK) {
  7977.       GTB_SpellCheck._toggleSpellCheckButton(true)}
  7978.     else {
  7979.       GTB_SpellCheck._toggleSpellCheckButton(false)}
  7980.   }
  7981.   
  7982.   , "GTB_OPTION.button_option.gtbSpellCheck":function(data) {
  7983.     if("true" == data) {
  7984.       GTB_getToolbar().spellCheck.initUi()}
  7985.   }
  7986.   
  7987.   };
  7988.   this.observe = GTB_MessageObserve;
  7989.   gto.registerMessages(this)}
  7990.  
  7991. ;
  7992. GTB_SpellCheck.prototype.doUnload_ = function(event) {
  7993.   window.removeEventListener("unload", this.onUnload_, false);
  7994.   document.removeEventListener("submit", this.onDocSubmit_, false)}
  7995.  
  7996. ;
  7997. GTB_SpellCheck.prototype.doDocSubmit_ = function(event) {
  7998.   var mode = GTBSC_getMode();
  7999.   if(mode == GTBSC_CHECK) {
  8000.     GTBSC_toggleToEdit()}
  8001. }
  8002.  
  8003. ;
  8004. GTB_SpellCheck.prototype.run = function(opt_disallowSuggestLang) {
  8005.   GTB_getToolbar().maybeShowUsage("spellcheck_used", OptionsDialog.MORE_URL_SPELLCHECK);
  8006.   var spellText;
  8007.   var win = this.overlay._getCurrentWindow();
  8008.   var mode = GTBSC_getMode();
  8009.   if(mode == GTBSC_CHECK) {
  8010.     GTBSC_toggleToEdit();
  8011.     return}
  8012.   GTBSC_setMode(GTBSC_CHECK);
  8013.   var blocks = GTBSC_getSpellText(win, false);
  8014.   spellText = blocks.getText();
  8015.   if(spellText.length == 0) {
  8016.     var stringBundle = document.getElementById("google-toolbar-strings");
  8017.     var blankFormFieldsMsg = blocks.blockOffsets.length > 0 ? stringBundle.getString("prop.gtb.spelling.notext") : stringBundle.getString("prop.gtb.spelling.nofields");
  8018.     GTBSC_showAlertMessage(blankFormFieldsMsg);
  8019.     GTBSC_setMode(GTBSC_EDIT);
  8020.     return}
  8021.   var request = new GTBSC_SpellRequest(spellText);
  8022.   var allowSuggestLang = opt_disallowSuggestLang == null ? true : false;
  8023.   request.send(allowSuggestLang)}
  8024.  
  8025. ;
  8026. GTB_SpellCheck.prototype.maybeRerun = function() {
  8027.   if(GTBSC_getMode() == GTBSC_CHECK) {
  8028.     GTBSC_toggleToEdit();
  8029.     GTB_getToolbar().spellCheck.run()}
  8030. }
  8031.  
  8032. ;
  8033. GTB_SpellCheck.prototype.runAutoFix = function() {
  8034.   var isAutoFix = GTBSC_getIsAutoFix();
  8035.   if(isAutoFix) {
  8036.     GTBSC_revertAutofixChanges();
  8037.     GTBSC_setIsAutoFix(false)}
  8038.   else {
  8039.     GTBSC_setIsAutoFix(true);
  8040.     if(GTBSC_getMode() == GTBSC_CHECK) {
  8041.       GTBSC_autofixAllMisspellings()}
  8042.     else {
  8043.       GTB_getToolbar().spellCheck.run()}
  8044.   }
  8045. }
  8046.  
  8047. ;
  8048. GTB_SpellCheck.prototype.doTabSwitch = function(event) {
  8049.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  8050.   if(tabData.whitelist) {
  8051.     return}
  8052.   else {
  8053.     this.doPageParse()}
  8054. }
  8055.  
  8056. ;
  8057. GTB_SpellCheck.prototype.doPageLoad = function(event) {
  8058.   var content = document.getElementById("content");
  8059.   var browsers = content.browsers;
  8060.   var index = content.mTabBox.selectedIndex;
  8061.   var browser = browsers[index];
  8062.   var same = event.target == browser.contentDocument;
  8063.   if(!same)return;
  8064.   this.doPageParse()}
  8065.  
  8066. ;
  8067. GTB_SpellCheck.prototype.doPageParse = function() {
  8068.   GTBSC_setMode(GTBSC_EDIT);
  8069.   var tabData = GTB_perTabData().getSelectedTabContainer(GTBSC_CONTAINER_TAG);
  8070.   if(tabData.whitelist == null) {
  8071.     tabData.whitelist = new GTBSC_WordList}
  8072.   else {
  8073.     tabData.whitelist.clear()}
  8074.   if(tabData.misspelledWords == null) {
  8075.     tabData.misspelledWords = new GTBSC_WordList}
  8076.   if(tabData.originalWords == null) {
  8077.     tabData.originalWords = []}
  8078.   if(tabData.autofixSuggestions == null) {
  8079.     tabData.autofixSuggestions = new GTBSC_WordList}
  8080.   tabData.textareas = [];
  8081.   tabData.textinputs = [];
  8082.   tabData.designmode = [];
  8083.   tabData.popupMenuId = null}
  8084.  
  8085. ;
  8086. GTB_SpellCheck.prototype.doPageHide = function(event) {
  8087.   if(event.persisted) {
  8088.     var mode = GTBSC_getMode();
  8089.     if(mode == GTBSC_CHECK) {
  8090.       GTBSC_toggleToEdit()}
  8091.   }
  8092. }
  8093.  
  8094. ;
  8095. GTB_SpellCheck.prototype.setLangPref = function(event, lang) {
  8096.   GTB_SpellCheck._setLangMenuSelection(lang);
  8097.   GTB_SpellCheck._setLanguageSpecificTooltip(lang);
  8098.   GTB_getPrefs().setStringPref(GTBSC_PREF_PREFIX + "lang", lang);
  8099.   event.preventBubble();
  8100.   if(GTBSC_getMode() == GTBSC_CHECK) {
  8101.     GTBSC_toggleToEdit()}
  8102.   this.run(false)}
  8103.  
  8104. ;
  8105. GTB_SpellCheck._setLangMenuSelection = function(langCode) {
  8106.   var menupopup = document.getElementById("googleSpellCheckLangMenu");
  8107.   if(menupopup == null) {
  8108.     return}
  8109.   var menuitems = menupopup.getElementsByTagName("menuitem");
  8110.   var langCodeMap = {auto:"auto", danish:"da", german:"de", english:"en", spanish:"es", french:"fr", italian:"it", dutch:"nl", polish:"pl", portuguese:"pt", finnish:"fi", swedish:"sv"};
  8111.   for(var i = 0;i < menuitems.length;i ++ ) {
  8112.     var menuitem = menuitems[i];
  8113.     var language = menuitem.id.split(".").pop();
  8114.     var itemLang = langCodeMap[language];
  8115.     menuitem.setAttribute("tooltiptext", GTBSC_getLocalizedTooltip(itemLang));
  8116.     if(langCode == itemLang) {
  8117.       menuitem.setAttribute("checked", "true")}
  8118.     else {
  8119.       menuitem.setAttribute("checked", "false")}
  8120.   }
  8121. }
  8122.  
  8123. ;
  8124. GTB_SpellCheck._setLanguageSpecificTooltip = function(langPref) {
  8125.   var button = GTB_SpellCheck._getSpellCheckButton();
  8126.   if(button) {
  8127.     button.setAttribute("tooltiptext", GTBSC_getLocalizedTooltip(langPref))}
  8128. }
  8129.  
  8130. ;
  8131. GTB_SpellCheck._getSpellCheckButton = function() {
  8132.   var button = document.getElementById("gtbSpellCheck");
  8133.   return button}
  8134.  
  8135. ;
  8136. GTB_SpellCheck._toggleSpellCheckButton = function(checked) {
  8137.   var button = GTB_SpellCheck._getSpellCheckButton();
  8138.   if(button == null) {
  8139.     return}
  8140.   button.setAttribute("checked", checked);
  8141.   var stringBundle = document.getElementById("google-toolbar-strings");
  8142.   if(checked) {
  8143.     var stopLabel = stringBundle.getString("prop.gtb.spelling.button.stop.label");
  8144.     button.setAttribute("label", stopLabel);
  8145.     button.setAttribute("tooltiptext", stopLabel)}
  8146.   else {
  8147.     button.setAttribute("label", stringBundle.getString("prop.gtb.spelling.button.check.label"));
  8148.     var langPref = GTB_getPrefs().getStringPref(GTBSC_PREF_PREFIX + "lang");
  8149.     GTB_SpellCheck._setLanguageSpecificTooltip(langPref)}
  8150. }
  8151.  
  8152. ;
  8153. GTB_SpellCheck._toggleAutoFixLabel = function(autoFixOn) {
  8154.   var autoFixMenuItem = document.getElementById("googleSpellCheckAutoFix");
  8155.   if(autoFixMenuItem == null) {
  8156.     return}
  8157.   var stringBundle = document.getElementById("google-toolbar-strings");
  8158.   if(autoFixOn) {
  8159.     autoFixMenuItem.setAttribute("label", stringBundle.getString("prop.gtb.spelling.autofix.revert.label"))}
  8160.   else {
  8161.     autoFixMenuItem.setAttribute("label", stringBundle.getString("prop.gtb.spelling.autofix.start.label"))}
  8162. }
  8163.  
  8164. ;
  8165. function GTBSC_WordList(opt_initWords) {
  8166.   this._words = {};
  8167.   this._length = 0;
  8168.   if(opt_initWords != null) {
  8169.     for(var i = 0;i < opt_initWords.length;i ++ ) {
  8170.       this.addWord(opt_initWords[i])}
  8171.   }
  8172. }
  8173.  
  8174. GTBSC_WordList.prototype.getWordsAsArray = function() {
  8175.   var words = [];
  8176.   for(var word in this._words) {
  8177.     words.push(word)}
  8178.   return words}
  8179.  
  8180. ;
  8181. GTBSC_WordList.prototype.getLength = function() {
  8182.   return this._length}
  8183.  
  8184. ;
  8185. GTBSC_WordList.prototype.addWord = function(word) {
  8186.   if(this.hasWord(word)) {
  8187.     return false}
  8188.   if(!this.isValidWord(word)) {
  8189.     return false}
  8190.   this._words[word] = "1";
  8191.   this._length ++ ;
  8192.   return true}
  8193.  
  8194. ;
  8195. GTBSC_WordList.prototype.addWordValue = function(word, value) {
  8196.   if(!this.isValidValue(value)) {
  8197.     return false}
  8198.   if(this.hasWord(word)) {
  8199.     var valueToAdd = ":" + value;
  8200.     this._words[word] += valueToAdd}
  8201.   else {
  8202.     this._words[word] = value;
  8203.     this._length ++ }
  8204.   return true}
  8205.  
  8206. ;
  8207. GTBSC_WordList.prototype.removeWord = function(word) {
  8208.   if(!this.hasWord(word)) {
  8209.     return false}
  8210.   if(!this.isValidWord(word)) {
  8211.     return false}
  8212.   delete this._words[word];
  8213.   this._length -- ;
  8214.   return true}
  8215.  
  8216. ;
  8217. GTBSC_WordList.prototype.clear = function() {
  8218.   this._words = {};
  8219.   this._length = 0}
  8220.  
  8221. ;
  8222. GTBSC_WordList.prototype.hasWord = function(word) {
  8223.   return this._words[word] != null}
  8224.  
  8225. ;
  8226. GTBSC_WordList.prototype.getWordValues = function(word) {
  8227.   var values = this._words[word];
  8228.   return values.split(":")}
  8229.  
  8230. ;
  8231. GTBSC_WordList.prototype.isValidWord = function(word) {
  8232.   if(typeof word != "string") {
  8233.     return false}
  8234.   if(word == "") {
  8235.     return false}
  8236.   return true}
  8237.  
  8238. ;
  8239. GTBSC_WordList.prototype.isValidValue = function(value) {
  8240.   if(typeof value != "string") {
  8241.     return false}
  8242.   if(value.indexOf(":") != -1) {
  8243.     return false}
  8244.   return true}
  8245.  
  8246. ;
  8247. GTBSC_WordList.prototype.toString = function() {
  8248.   var wordListString = "";
  8249.   for(var word in this._words) {
  8250.     wordListString += word + ","}
  8251.   wordListString = wordListString.substring(0, wordListString.length - 1);
  8252.   return wordListString}
  8253.  
  8254. ;
  8255. function GTBSC_UserDictionary() {
  8256. }
  8257.  
  8258. GTBSC_UserDictionary.prototype = {init:function() {
  8259.   this._wordList = null;
  8260.   this._readFromPrefs()}
  8261.  
  8262. , addWord:function(word) {
  8263.   if(!this._isValidWord(word)) {
  8264.     return false}
  8265.   return this._wordList.addWord(word)}
  8266.  
  8267. , removeWord:function(word) {
  8268.   if(!this._isValidWord(word)) {
  8269.     return false}
  8270.   return this._wordList.removeWord(word)}
  8271.  
  8272. , hasWord:function(word) {
  8273.   return this._wordList.hasWord(word)}
  8274.  
  8275. , getLength:function() {
  8276.   return this._wordList.getLength()}
  8277.  
  8278. , getWordsAsArray:function() {
  8279.   return this._wordList.getWordsAsArray()}
  8280.  
  8281. , toString:function() {
  8282.   return this._wordList.toString()}
  8283.  
  8284. , save:function() {
  8285.   this._writeToPrefs()}
  8286.  
  8287. , reload:function() {
  8288.   this._readFromPrefs()}
  8289.  
  8290. , _isValidWord:function(word) {
  8291.   if(word.indexOf(",") != -1) {
  8292.     return false}
  8293.   return this._wordList.isValidWord(word)}
  8294.  
  8295. , _readFromPrefs:function() {
  8296.   var words;
  8297.   var prefName = GTBSC_DICT_PREF_PREFIX + "words";
  8298.   try {
  8299.     words = GTB_getPrefs().getStringPref(prefName)}
  8300.   catch(e) {
  8301.     this._wordList = new GTBSC_WordList;
  8302.     this._writeToPrefs();
  8303.     return}
  8304.   if(words == "") {
  8305.     this._wordList = new GTBSC_WordList;
  8306.     return}
  8307.   this._wordList = new GTBSC_WordList(words.split(","));
  8308.   GTB_Assert(typeof this._wordList == "object" && this._wordList.getLength() > 0, "GTBSC_UserDictionary: this._wordList is not an array with length > 0");
  8309.   GTBSC_dump("dumping " + this._wordList.getLength() + " words");
  8310.   var words = this._wordList.getWordsAsArray();
  8311.   for(var i = 0;i < words.length;i ++ ) {
  8312.   }
  8313. }
  8314.  
  8315. , _writeToPrefs:function() {
  8316.   var prefName = GTBSC_DICT_PREF_PREFIX + "words";
  8317.   GTBSC_dump("saving " + this._wordList.getLength() + " words to pref " + prefName + ":\n" + this.toString());
  8318.   GTB_getPrefs().setStringPref(prefName, this.toString())}
  8319.  
  8320. };
  8321. function GTBSC_ShouldChangeSpellLang(checkedLang, suggestedLang) {
  8322.   var params = {inz:{checkedLang:checkedLang, suggestedLang:suggestedLang}, out:null};
  8323.   window.openDialog("chrome://google-toolbar/content/spellcheck-language.xul", "gtbGoogleSpellingSuggLang", "modal,centerscreen,chrome,resizable=no", params);
  8324.   return params.out}
  8325.  
  8326. function GTB_SC_suggLangDialogInit(event) {
  8327.   var params = window.arguments[0];
  8328.   var checkedLangCode = params.inz.checkedLang;
  8329.   var suggestedLangCode = params.inz.suggestedLang;
  8330.   var checkedLang = GTBSC_getLocalizedLanuage(checkedLangCode);
  8331.   var suggestedLang = GTBSC_getLocalizedLanuage(suggestedLangCode);
  8332.   var stringBundle = document.getElementById("google-toolbar-strings");
  8333.   var differentMsg = stringBundle.getString("prop.gtb.spelling.different.msg");
  8334.   differentMsg = differentMsg.replace("%s", checkedLang);
  8335.   differentMsg = differentMsg.replace("%s", suggestedLang);
  8336.   differentMsg = differentMsg.replace("%s", suggestedLang);
  8337.   var dialogDesc0 = document.getElementById("gtbGoogleSpellingSuggLangDesc0");
  8338.   var dialogDesc1 = document.getElementById("gtbGoogleSpellingSuggLangDesc1");
  8339.   var msgParts = differentMsg.split("\n\n");
  8340.   dialogDesc0.value = msgParts[0];
  8341.   dialogDesc1.value = msgParts[1];
  8342.   var differentChange = stringBundle.getString("prop.gtb.spelling.different.change");
  8343.   differentChange = differentChange.replace("%s", suggestedLang);
  8344.   var buttonChange = document.getElementById("gtbGoogleSpellingSuggLangChange");
  8345.   buttonChange.label = differentChange;
  8346.   var differentKeep = stringBundle.getString("prop.gtb.spelling.different.keep");
  8347.   differentKeep = differentKeep.replace("%s", checkedLang);
  8348.   var buttonKeep = document.getElementById("gtbGoogleSpellingSuggLangKeep");
  8349.   buttonKeep.label = differentKeep}
  8350.  
  8351. function GTB_SC_suggLangDialogDoChange() {
  8352.   var params = window.arguments[0];
  8353.   params.out = true;
  8354.   return true}
  8355.  
  8356. function GTB_SC_suggLangDialogDoKeep() {
  8357.   var params = window.arguments[0];
  8358.   params.out = false;
  8359.   return true}
  8360.  
  8361. function GTB_PageRank() {
  8362.   this.GPR_fetcher = new GPR_XMLFetcher(this)}
  8363.  
  8364. GTB_PageRank.prototype.GPR_contentArea = null;
  8365. GTB_PageRank.GPR_INFO_COLON_URL = "toolbarqueries.google.";
  8366. GTB_PageRank.prototype.GPR_defaultTld = null;
  8367. GTB_PageRank.GPR_extraQueryParams = {sourceid:"navclient-ff", features:"Rank", client:"navclient-auto-ff"};
  8368. GTB_PageRank.GPR_HASH_SEED = "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. Yes, I'm talking to you, scammer.";
  8369. GTB_PageRank.prototype.GPR_hasPr = null;
  8370. GTB_PageRank.prototype.GPR_noPr = null;
  8371. GTB_PageRank.prototype.GPR_resolvedIp = null;
  8372. GTB_PageRank.prototype.GPR_sendTime = null;
  8373. GTB_PageRank.prototype.GPR_queryTime = null;
  8374. GTB_PageRank.prototype.GPR_queryStatus = null;
  8375. function GPR_DNSLookUpHandler(pr) {
  8376.   this.pr = pr}
  8377.  
  8378. GPR_DNSLookUpHandler.prototype = {QueryInterface:function(iid) {
  8379.   if(iid.equals(Components.interfaces.nsISupports) || iid.equals(Components.interfaces.nsIDNSListener)) {
  8380.     return this}
  8381.   throw Components.results.NS_NOINTERFACE;}
  8382.  
  8383. , onLookupComplete:function(request, record, status) {
  8384.   this.pr.GPR_resolvedIp = record.getNextAddrAsString()}
  8385.  
  8386. };
  8387. function GPR_XMLFetcher(pr) {
  8388.   this.pr = pr;
  8389.   this._request = new XMLHttpRequest}
  8390.  
  8391. GPR_XMLFetcher.prototype = {_callback:null, get:function(page) {
  8392.   this._request.onreadystatechange = null;
  8393.   this._request.abort();
  8394.   this._request = new XMLHttpRequest;
  8395.   var asynchronous = true;
  8396.   this._request.open("GET", page, asynchronous);
  8397.   var self = this;
  8398.   this._request.onreadystatechange = function() {
  8399.     self.readyStateChange(self)}
  8400.   
  8401.   ;
  8402.   this.pr.GPR_sendTime = new Date;
  8403.   this._request.send(null)}
  8404.  
  8405. , readyStateChange:function(fetcher) {
  8406.   if(fetcher._request.readyState == 4) {
  8407.     fetcher.pr.GPR_handleResponse(fetcher._request.responseText)}
  8408. }
  8409.  
  8410. };
  8411. GTB_PageRank.prototype.GPR_fetcher = null;
  8412. GTB_PageRank.prototype.GPR_getDefaultTld = function() {
  8413.   var home = GTB_getPrefs().getStringPref(GTB_PREF_GOOGLE_HOME);
  8414.   var homePrefix = "www.google.";
  8415.   this.GPR_defaultTld = home.slice(homePrefix.length, home.length);
  8416.   GTB_Dump(GTB_Dump.PR, "### PAGERANK trace: Found TLD: " + this.GPR_defaultTld + "\n")}
  8417.  
  8418. ;
  8419. GTB_PageRank.prototype.GPR_startup = function() {
  8420.   GTB_Dump(GTB_Dump.PR, "### PAGERANK trace: Initialization\n");
  8421.   this.GPR_contentArea = document.getElementById("content");
  8422.   var strings = document.getElementById("google-toolbar-strings");
  8423.   this.GPR_hasPr = strings.getString("prop.google-pr.havepr");
  8424.   this.GPR_noPr = strings.getString("prop.google-pr.nopr");
  8425.   this.GPR_getDefaultTld();
  8426.   this.GPR_resolveDns();
  8427.   GTB_perTabData().makeContainers("page_rank");
  8428.   GPR_TEST("!GTB_PageRank.GPR_canFetchPRFor('https://www.example.com')");
  8429.   GPR_TEST("!GTB_PageRank.GPR_canFetchPRFor('http://www')");
  8430.   GPR_TEST("!GTB_PageRank.GPR_canFetchPRFor('http://10.0.0.10')");
  8431.   GPR_TEST("!GTB_PageRank.GPR_canFetchPRFor('http://192.168.0.1')");
  8432.   GPR_TEST("!GTB_PageRank.GPR_canFetchPRFor('http://127.0.0.1')");
  8433.   GPR_TEST("GTB_PageRank.GPR_canFetchPRFor('http://google.com')");
  8434.   GPR_TEST("GTB_PageRank.GPR_canFetchPRFor('http://google.info')");
  8435.   GPR_TEST("GTB_PageRank.GPR_canFetchPRFor('http://172.24.0.7')");
  8436.   GPR_TEST('GTB_PageRank.GPR_extractResponse("blah\t\t Rank_1:1:7\tblah")==7');
  8437.   GPR_TEST("GTB_PageRank.GPR_extractResponse('blah\t\t\tblah')==null")}
  8438.  
  8439. ;
  8440. function GPR_onTabSwitch(event) {
  8441.   GTB_GoogleToolbarOverlay.pageRank.doTabSwitch(event)}
  8442.  
  8443. GTB_PageRank.prototype.doTabSwitch = function(event) {
  8444.   if(!GTB_PageRank.GPR_pageRankEnabled()) {
  8445.     return}
  8446.   var tabData = GTB_perTabData().getSelectedTabContainer("page_rank");
  8447.   var undefined;
  8448.   if(tabData.pageRank == undefined) {
  8449.     GTB_Dump(GTB_Dump.PR, "### PAGERANK trace: undefined in tab switch, fetching\n");
  8450.     this.GPR_getPageRank();
  8451.     return}
  8452.   this.GPR_displayPageRank(tabData.pageRank);
  8453.   GTB_Dump(GTB_Dump.PR, "### PAGERANK trace: switching tabs, rank: " + tabData.pageRank + "\n")}
  8454.  
  8455. ;
  8456. GTB_PageRank.prototype.GPR_resolveDns = function() {
  8457.   var dnsListener = new GPR_DNSLookUpHandler(this);
  8458.   var dns = Components.classes["@mozilla.org/network/dns-service;1"].getService(Components.interfaces.nsIDNSService);
  8459.   var toolbarName = GTB_PageRank.GPR_INFO_COLON_URL + this.GPR_defaultTld;
  8460.   var eventQ = null;
  8461.   try {
  8462.     var nsIEventQueueService = Components.interfaces.nsIEventQueueService;
  8463.     var eqService = Components.classes["@mozilla.org/event-queue-service;1"].getService(nsIEventQueueService);
  8464.     eventQ = eqService.getSpecialEventQueue(nsIEventQueueService.UI_THREAD_EVENT_QUEUE)}
  8465.   catch(e) {
  8466.   }
  8467.   dns.asyncResolve(toolbarName, 0, dnsListener, eventQ);
  8468.   if(this.GPR_resolvedIp != null) {
  8469.     GTB_Dump(GTB_Dump.PR, "Resolved: " + this.GPR_resolvedIp + "\n")}
  8470. }
  8471.  
  8472. ;
  8473. GTB_PageRank.prototype.GPR_latencyInfo = function() {
  8474.   if(this.GPR_queryStatus == null) {
  8475.     return""}
  8476.   var googleIp = "googleip=" + this.GPR_queryStatus + ";" + this.GPR_resolvedIp + ";" + this.GPR_queryTime + "&";
  8477.   return googleIp}
  8478.  
  8479. ;
  8480. GTB_PageRank.prototype.GPR_getPageRank = function() {
  8481.   var page = this.GPR_contentArea.contentWindow.location.href;
  8482.   if(!GTB_PageRank.GPR_canFetchPRFor(page)) {
  8483.     this.GPR_displayPageRank(null);
  8484.     var tabData = GTB_perTabData().getSelectedTabContainer("page_rank");
  8485.     tabData.pageRank = null;
  8486.     return}
  8487.   var hash = "8" + GTB_PageRank.GPR_awesomeHash(page);
  8488.   var url = "http://" + GTB_PageRank.GPR_INFO_COLON_URL + this.GPR_defaultTld + "/search?";
  8489.   for(var param in GTB_PageRank.GPR_extraQueryParams) {
  8490.     url += param + "=" + GTB_PageRank.GPR_extraQueryParams[param] + "&"}
  8491.   url += this.GPR_latencyInfo();
  8492.   url += "ch=" + hash + "&q=info:" + encodeURIComponent(page);
  8493.   GTB_Dump(GTB_Dump.PR, "### PAGERANK trace: URL: " + url + "\n");
  8494.   this.GPR_queryStatus = "P";
  8495.   this.GPR_fetcher.get(url)}
  8496.  
  8497. ;
  8498. GTB_PageRank.prototype.doPageLoad = function(event) {
  8499.   if(event.originalTarget != this.GPR_contentArea.contentDocument) {
  8500.     return}
  8501.   if(!GTB_PageRank.GPR_pageRankEnabled()) {
  8502.     return}
  8503.   this.GPR_getPageRank();
  8504.   this.GPR_resolveDns()}
  8505.  
  8506. ;
  8507. GTB_PageRank.GPR_pageRankEnabled = function() {
  8508.   var button = document.getElementById("gtbPageRank");
  8509.   return button != null}
  8510.  
  8511. ;
  8512. GTB_PageRank.GPR_awesomeHash = function(value) {
  8513.   var kindOfThingAnIdiotWouldHaveOnHisLuggage = 16909125;
  8514.   for(var i = 0;i < value.length;i ++ ) {
  8515.     kindOfThingAnIdiotWouldHaveOnHisLuggage ^= GTB_PageRank.GPR_HASH_SEED.charCodeAt(i % GTB_PageRank.GPR_HASH_SEED.length) ^ value.charCodeAt(i);
  8516.     kindOfThingAnIdiotWouldHaveOnHisLuggage = kindOfThingAnIdiotWouldHaveOnHisLuggage >>> 23 | kindOfThingAnIdiotWouldHaveOnHisLuggage << 9}
  8517.   return GTB_PageRank.GPR_hexEncodeU32(kindOfThingAnIdiotWouldHaveOnHisLuggage)}
  8518.  
  8519. ;
  8520. GTB_PageRank.GPR_hexEncodeU32 = function(num) {
  8521.   var result = GTB_PageRank.GPR_toHex8(num >>> 24);
  8522.   result += GTB_PageRank.GPR_toHex8(num >>> 16 & 255);
  8523.   result += GTB_PageRank.GPR_toHex8(num >>> 8 & 255);
  8524.   return result + GTB_PageRank.GPR_toHex8(num & 255)}
  8525.  
  8526. ;
  8527. GTB_PageRank.GPR_toHex8 = function(num) {
  8528.   return(num < 16 ? "0" : "") + num.toString(16)}
  8529.  
  8530. ;
  8531. GTB_PageRank.GPR_newURI = function(spec) {
  8532.   var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  8533.   return ios.newURI(spec, null, null)}
  8534.  
  8535. ;
  8536. GTB_PageRank.GPR_canFetchPRFor = function(page) {
  8537.   var uri = GTB_PageRank.GPR_newURI(page);
  8538.   var host = uri.asciiHost;
  8539.   if(uri.scheme != "http" || uri.username || uri.password) {
  8540.     return false}
  8541.   if(/\.[a-zA-Z]{2,4}$/.test(host)) {
  8542.     return true}
  8543.   if(/^(\d{1,3}\.){3}\d{1,3}$/.test(host) && host.indexOf("10.0.0.") != 0 && host.indexOf("172.16.") != 0 && host.indexOf("192.168.") != 0 && host.indexOf("127.0.0.") != 0 && host.indexOf("0.0.0.") != 0 && host.indexOf("192.0.") != 0 && host.indexOf("1.") != 0)return true;
  8544.   return false}
  8545.  
  8546. ;
  8547. GTB_PageRank.prototype.GPR_handleResponse = function(responseText) {
  8548.   var arrivalTime = new Date;
  8549.   this.GPR_queryTime = arrivalTime.getTime() - this.GPR_sendTime.getTime();
  8550.   var tabData = GTB_perTabData().getSelectedTabContainer("page_rank");
  8551.   var pr = GTB_PageRank.GPR_extractResponse(responseText);
  8552.   if(pr < 0 || pr > 10) {
  8553.     this.GPR_queryStatus = "U"}
  8554.   else {
  8555.     this.GPR_queryStatus = "O"}
  8556.   tabData.pageRank = pr;
  8557.   this.GPR_displayPageRank(pr);
  8558.   GTB_Dump(GTB_Dump.PR, "\n### PAGERANK trace: Response text: " + responseText);
  8559.   GTB_Dump(GTB_Dump.PR, "\n### PAGERANK trace: Retrieval time: " + this.GPR_queryTime + " ms, rank: " + pr + "\n")}
  8560.  
  8561. ;
  8562. GTB_PageRank.GPR_extractResponse = function(responseText) {
  8563.   if(responseText && responseText.match(/Rank_1:\d+:(\d+)/))return RegExp.$1;
  8564.   return null}
  8565.  
  8566. ;
  8567. GTB_PageRank.prototype.GPR_displayPageRank = function(pr) {
  8568.   var button = document.getElementById("gtbPageRank");
  8569.   if(button != null) {
  8570.     var tooltip = pr == null ? this.GPR_noPr : this.GPR_hasPr.replace(/\$pagerank;/, pr);
  8571.     button.setAttribute("tooltiptext", tooltip);
  8572.     var image = document.getElementById("gtbPageRankImage");
  8573.     if(image != null) {
  8574.       var imageUrl = "chrome://google-toolbar/skin/page-rank-";
  8575.       imageUrl += pr == null ? "unknown" : pr;
  8576.       imageUrl += ".png";
  8577.       image.setAttribute("src", imageUrl);
  8578.       image.setAttribute("tooltiptext", tooltip)}
  8579.   }
  8580. }
  8581.  
  8582. ;
  8583. function GPR_TEST(str) {
  8584.   GTB_Assert(eval(str), "TEST FAILED: " + str + "\n")}
  8585.  
  8586. function GTB_Uninstall_onLoad(event) {
  8587.   var frame = document.getElementById("gtbFormFrame");
  8588.   var src = "http://google.com/tools/firefox/toolbar/FT2/intl/" + window.arguments[0] + "/uninstall.html";
  8589.   frame.setAttribute("src", src)}
  8590.  
  8591. function GTB_UninstallExtension(guid) {
  8592.   var manager = Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager);
  8593.   var dummy = manager.datasource;
  8594.   if("uninstallExtension"  in  manager) {
  8595.     manager.uninstallExtension("{" + guid + "}")}
  8596.   else if("uninstallItem"  in  manager) {
  8597.     manager.uninstallItem("{" + guid + "}")}
  8598.   else {
  8599.     return false}
  8600.   dummy = null;
  8601.   return true}
  8602.  
  8603. function GTB_Uninstall_showDialog() {
  8604.   var stringBundle = document.getElementById("google-toolbar-strings");
  8605.   var mesg = stringBundle.getString("google-uninstall.finalMessage");
  8606.   window.alert(mesg)}
  8607.  
  8608. function GTB_Uninstall_onAccept() {
  8609.   var frame = document.getElementById("gtbFormFrame");
  8610.   var doc = frame.contentDocument;
  8611.   var form = doc.FeedbackForm;
  8612.   if(form != null) {
  8613.     form.submit()}
  8614.   GTB_getPrefs().setBoolPref("uninstall_pending", true);
  8615.   var uninstalled = false;
  8616.   try {
  8617.     var uninstall = Components.classes["@google.com/uninstallutil;1"].createInstance(Components.interfaces.GTBIUninstallUtil);
  8618.     if(uninstall.msiUninstall()) {
  8619.       uninstalled = true;
  8620.       GTB_Uninstall_showDialog()}
  8621.   }
  8622.   catch(e) {
  8623.     uninstalled = false}
  8624.   if(!uninstalled) {
  8625.     if(GTB_UninstallExtension("3112ca9c-de6d-4884-a869-9855de68056c")) {
  8626.       GTB_Uninstall_showDialog()}
  8627.   }
  8628. }
  8629.  
  8630. function GTB_UpButton() {
  8631.   this.observe = GTB_MessageObserve;
  8632.   var stringBundle = document.getElementById("google-toolbar-strings");
  8633.   this._UP_BUTTON_ENABLED_TOOLTIP = stringBundle.getString("prop.google-up.enabledtooltip");
  8634.   this._UP_BUTTON_DISABLED_TOOLTIP = stringBundle.getString("prop.google-up.disabledtooltip");
  8635.   this._UP_MENU_MAX_SIZE = 10}
  8636.  
  8637. GTB_UpButton._fixSlash = function(url, removeTrailingSlash) {
  8638.   if(removeTrailingSlash && url.charAt(url.length - 1) == "/") {
  8639.     url = url.substring(0, url.length - 1)}
  8640.   else if(!removeTrailingSlash && url.charAt(url.length - 1) != "/") {
  8641.     url = url + "/"}
  8642.   return url}
  8643.  
  8644. ;
  8645. GTB_UpButton.prototype.GTB_MESSAGES = {"GTB_OPTION.button_option.gtbGoUp":function(data) {
  8646.   if("true" == data) {
  8647.     GTB_getToolbar().upButton._setUpButton(null)}
  8648. }
  8649.  
  8650. };
  8651. GTB_UpButton.prototype._urlTruncateFilename = function(xpcomUrl) {
  8652.   xpcomUrl.query = "";
  8653.   xpcomUrl.ref = "";
  8654.   if(xpcomUrl.fileName != "") {
  8655.     xpcomUrl.fileName = "";
  8656.     return xpcomUrl.spec}
  8657.   return null}
  8658.  
  8659. ;
  8660. GTB_UpButton.prototype._urlTruncateDirectory = function(xpcomUrl) {
  8661.   var dir = xpcomUrl.directory;
  8662.   if(dir[dir.length - 1] == "/") {
  8663.     dir = dir.substring(0, dir.length - 1)}
  8664.   var lastSlash = dir.lastIndexOf("/");
  8665.   if(lastSlash != -1) {
  8666.     dir = dir.substring(0, lastSlash);
  8667.     xpcomUrl.filePath = dir;
  8668.     return xpcomUrl.spec}
  8669.   else if(dir != "") {
  8670.     xpcomUrl.directory = "";
  8671.     return xpcomUrl.spec}
  8672.   return null}
  8673.  
  8674. ;
  8675. GTB_UpButton.prototype._urlTruncateHostname = function(xpcomUrl) {
  8676.   if(xpcomUrl.scheme == "http" || xpcomUrl.scheme == "https") {
  8677.     var host = xpcomUrl.host;
  8678.     var hostList = host.split(".");
  8679.     if(hostList.length <= 2 || hostList.length == 3 && hostList[0] == "www") {
  8680.       return null}
  8681.     if(!isNaN(parseInt(hostList[hostList.length - 1]))) {
  8682.       return null}
  8683.     if(hostList[hostList.length - 1].length == 2 && hostList[hostList.length - 2].length <= 3) {
  8684.       if(hostList.length == 4 && hostList[0] == "www") {
  8685.         return null}
  8686.       hostList[hostList.length - 2] += "." + hostList[hostList.length - 1];
  8687.       hostList.pop()}
  8688.     host = "www." + hostList[hostList.length - 2] + "." + hostList[hostList.length - 1];
  8689.     xpcomUrl.host = host;
  8690.     return xpcomUrl.spec}
  8691. }
  8692.  
  8693. ;
  8694. GTB_UpButton.prototype._urlAbove = function(url, removeTrailingSlash) {
  8695.   if(url.length == 0) {
  8696.     return null}
  8697.   var xpcomUrl = GTB_convertToUrl(url);
  8698.   if(!(xpcomUrl  instanceof Components.interfaces.nsIURL))return null;
  8699.   switch(xpcomUrl.scheme) {
  8700.     case "ftp":case "gopher":case "http":case "https":case "file":break;
  8701.     default:return null}
  8702.   var aboveUrl = this._urlTruncateFilename(xpcomUrl);
  8703.   if(aboveUrl != null) {
  8704.     return GTB_UpButton._fixSlash(aboveUrl, removeTrailingSlash)}
  8705.   aboveUrl = this._urlTruncateDirectory(xpcomUrl);
  8706.   if(aboveUrl != null) {
  8707.     return GTB_UpButton._fixSlash(aboveUrl, removeTrailingSlash)}
  8708.   aboveUrl = this._urlTruncateHostname(xpcomUrl);
  8709.   if(aboveUrl != null) {
  8710.     return GTB_UpButton._fixSlash(aboveUrl, removeTrailingSlash)}
  8711.   return null}
  8712.  
  8713. ;
  8714. GTB_UpButton.prototype._eventAffectsUpButton = function(event) {
  8715.   var upButton = document.getElementById("gtbGoUp");
  8716.   if(upButton == null) {
  8717.     return false}
  8718.   if(event.type == "load" || event.type == "pageshow") {
  8719.     var contentWindow = GTB_GoogleToolbarOverlay._getCurrentWindow();
  8720.     if(contentWindow.document == event.originalTarget) {
  8721.       return true}
  8722.   }
  8723.   if(event.type == "select") {
  8724.     return true}
  8725.   return false}
  8726.  
  8727. ;
  8728. GTB_UpButton.prototype._setUpButton = function(event) {
  8729.   if(event && !this._eventAffectsUpButton(event)) {
  8730.     return}
  8731.   var upButton = document.getElementById("gtbGoUp");
  8732.   if(upButton == null) {
  8733.     return}
  8734.   var docLocation = GTB_GoogleToolbarOverlay._getCurrentLocation();
  8735.   var urlAbove = null;
  8736.   if(docLocation != null) {
  8737.     urlAbove = this._urlAbove(docLocation.href, true)}
  8738.   if(urlAbove != null) {
  8739.     upButton.disabled = false;
  8740.     upButton.image = "chrome://google-toolbar/skin/up.png";
  8741.     var tooltip = this._UP_BUTTON_ENABLED_TOOLTIP;
  8742.     tooltip = tooltip.replace("$up;", urlAbove);
  8743.     upButton.tooltipText = tooltip;
  8744.     if(upButton.collapsed) {
  8745.       var menu = document.getElementById("gtbChevronMenu" + upButton.id);
  8746.       if(menu) {
  8747.         menu.setAttribute("disabled", false);
  8748.         menu.setAttribute("image", upButton.image);
  8749.         menu.setAttribute("onclick", upButton.attributes["oncommand"].value)}
  8750.     }
  8751.   }
  8752.   else {
  8753.     upButton.disabled = true;
  8754.     upButton.image = "chrome://google-toolbar/skin/up-disabled.png";
  8755.     upButton.tooltipText = this._UP_BUTTON_DISABLED_TOOLTIP;
  8756.     if(upButton.collapsed) {
  8757.       var menu = document.getElementById("gtbChevronMenu" + upButton.id);
  8758.       if(menu) {
  8759.         menu.setAttribute("disabled", true);
  8760.         menu.setAttribute("image", upButton.image);
  8761.         menu.setAttribute("onclick", null)}
  8762.     }
  8763.   }
  8764. }
  8765.  
  8766. ;
  8767. GTB_UpButton.prototype.onUpMenuClick = function(event) {
  8768.   var url = event.target.getAttribute("label");
  8769.   GTB_UpButton._fixSlash(url, false);
  8770.   GTB_GoogleToolbarOverlay.loadUrlWithModifiers(url, event);
  8771.   event.preventBubble()}
  8772.  
  8773. ;
  8774. GTB_UpButton.prototype.onUpdateUpMenu = function(event) {
  8775.   var menu = event.target;
  8776.   var children = menu.childNodes;
  8777.   var index = 0;
  8778.   for(var i = children.length - 1;i >= 0; -- i) {
  8779.     index = children[i].getAttribute("index");
  8780.     if(index) {
  8781.       menu.removeChild(children[i])}
  8782.   }
  8783.   var docLocation = GTB_GoogleToolbarOverlay._getCurrentLocation();
  8784.   var nextUrl = this._urlAbove(docLocation.href, true);
  8785.   index = 0;
  8786.   while(index < this._UP_MENU_MAX_SIZE && nextUrl != null) {
  8787.     var menuItem = document.createElement("menuitem");
  8788.     menuItem.setAttribute("label", nextUrl);
  8789.     menuItem.setAttribute("index", index);
  8790.     menu.appendChild(menuItem);
  8791.     var favUrl = this._getFaviconUrl(nextUrl);
  8792.     if(favUrl) {
  8793.       dump(favUrl + "\n");
  8794.       menuItem.setAttribute("class", "menuitem-iconic");
  8795.       menuItem.setAttribute("image", favUrl)}
  8796.     nextUrl = this._urlAbove(nextUrl, true);
  8797.     index ++ }
  8798. }
  8799.  
  8800. ;
  8801. GTB_UpButton.prototype._getFaviconUrl = function(url) {
  8802.   var xpcomUrl = GTB_convertToUrl(url);
  8803.   if(!(xpcomUrl  instanceof Components.interfaces.nsIURL))return null;
  8804.   if(xpcomUrl.scheme.substring(0, 4) != "http") {
  8805.     return}
  8806.   return xpcomUrl.scheme + "://" + xpcomUrl.hostPort + "/favicon.ico"}
  8807.  
  8808. ;
  8809. GTB_UpButton.prototype.onGoUp = function(event) {
  8810.   if(event.type == "click" && event.target.nodeName == "menuitem") {
  8811.     return}
  8812.   var docLocation = GTB_GoogleToolbarOverlay._getCurrentLocation();
  8813.   if(docLocation != null && docLocation.href != null && docLocation.href.length > 0) {
  8814.     var above = this._urlAbove(docLocation.href, false);
  8815.     GTB_GoogleToolbarOverlay.loadUrlWithModifiers(above, event)}
  8816. }
  8817.  
  8818. ;
  8819. function GTB_UB_onPopupShowing(event) {
  8820.   return GTB_GoogleToolbarOverlay.upButton.onUpdateUpMenu(event)}
  8821.  
  8822. function GTB_UB_onPopupCommand(event) {
  8823.   GTB_GoogleToolbarOverlay.upButton.onUpMenuClick(event)}
  8824.  
  8825. function GTB_UB_onButtonCommand(event) {
  8826.   GTB_GoogleToolbarOverlay.upButton.onGoUp(event)}
  8827.  
  8828. function UserStats() {
  8829.   this.reset();
  8830.   this.deserialize()}
  8831.  
  8832. UserStats.prototype.reset = function() {
  8833.   this._map = {}}
  8834.  
  8835. ;
  8836. UserStats.prototype.readUserStatsString = function() {
  8837.   var value = GTB_getPrefs().getStringPref(GTB_getPrefs().USER_STATS_PREF);
  8838.   if(null == value) {
  8839.     value = ""}
  8840.   return value}
  8841.  
  8842. ;
  8843. UserStats.prototype.readUserStats = function() {
  8844.   this.reset();
  8845.   var temp = this.readUserStatsString();
  8846.   var tempMap = temp.split(",");
  8847.   for(var index in tempMap) {
  8848.     var keyValueMap = value.split("=");
  8849.     var key = keyValueMap[0];
  8850.     try {
  8851.       var value = parseInt(keyValueMap[1]);
  8852.       this._map[key] = value}
  8853.     catch(ex) {
  8854.     }
  8855.   }
  8856. }
  8857.  
  8858. ;
  8859. UserStats.prototype.writeUserStats = function() {
  8860.   var temp = "";
  8861.   var first = true;
  8862.   for(var index in this._map) {
  8863.     if(!first) {
  8864.       temp += ","}
  8865.     temp += temp + index + "=" + this._map[index]}
  8866.   this.writeUserStatsString(temp)}
  8867.  
  8868. ;
  8869. UserStats.prototype.writeUserStatsString = function(value) {
  8870.   GTB_getPrefs().setStringPref(GTB_getPrefs().USER_STATS_PREF, value)}
  8871.  
  8872. ;
  8873. UserStats.prototype.onClickButton = function(item) {
  8874.   if(null != this._map[item]) {
  8875.     this._map[item] += 1}
  8876.   else {
  8877.     this._map[item] = 1}
  8878. }
  8879.  
  8880. ;
  8881. function GTB_SearchHistory() {
  8882.   this.observe = GTB_MessageObserve;
  8883.   var self = this;
  8884.   this.GTB_MESSAGES = {"GTB_OPTION.search_box_save_history":function(data) {
  8885.     self.doToggleSave(data)}
  8886.   
  8887.   , GTB_CLEAR_HISTORY:function(data) {
  8888.     self.clearHistory()}
  8889.   
  8890.   , GTB_UPDATED_CURRENTSET:function(data) {
  8891.     self.init()}
  8892.   
  8893.   }}
  8894.  
  8895. GTB_SearchHistory._HISTORY_PREF = "search_box_history";
  8896. GTB_SearchHistory._HISTORY_MAX_ELEMENTS = 20;
  8897. GTB_SearchHistory._restoreMenuListFromGoogleProperty = function(menulist, name) {
  8898.   menulist.selectedIndex = -1;
  8899.   menulist.removeAllItems();
  8900.   var pref = GTB_getPrefs().getUnicodePref(name);
  8901.   if(pref === "") {
  8902.     return}
  8903.   var items = pref.split("\n");
  8904.   for(var i = 0;i < items.length;i ++ ) {
  8905.     menulist.appendItem(items[i])}
  8906. }
  8907.  
  8908. ;
  8909. GTB_SearchHistory._canonicalize = function(text) {
  8910.   if(text == null) {
  8911.     return text}
  8912.   return Trim(text).toLowerCase()}
  8913.  
  8914. ;
  8915. GTB_SearchHistory._isSameQuery = function(query1, query2) {
  8916.   return GTB_SearchHistory._canonicalize(query1) == GTB_SearchHistory._canonicalize(query2)}
  8917.  
  8918. ;
  8919. GTB_SearchHistory._getSearchMenuList = function() {
  8920.   var menulist = document.getElementById("gtbGoogleSearchBox");
  8921.   return menulist}
  8922.  
  8923. ;
  8924. GTB_SearchHistory.prototype._history = "";
  8925. GTB_SearchHistory.prototype.GTB_MESSAGES = null;
  8926. GTB_SearchHistory.prototype.init = function() {
  8927.   var menulist = GTB_SearchHistory._getSearchMenuList();
  8928.   this._history = GTB_getPrefs().getUnicodePrefWithDefault(GTB_SearchHistory._HISTORY_PREF, "");
  8929.   if(menulist) {
  8930.     GTB_SearchHistory._restoreMenuListFromGoogleProperty(menulist, GTB_SearchHistory._HISTORY_PREF)}
  8931. }
  8932.  
  8933. ;
  8934. GTB_SearchHistory.prototype._historyCache = function(text) {
  8935.   if(text !== "") {
  8936.     if(this._history != "") {
  8937.       var items = this._history.split("\n");
  8938.       var dup = false;
  8939.       var newHistory = [text];
  8940.       var max = GTB_SearchHistory._HISTORY_MAX_ELEMENTS;
  8941.       for(var i = 0;i < items.length && newHistory.length < max;i ++ ) {
  8942.         if(!GTB_SearchHistory._isSameQuery(items[i], text)) {
  8943.           newHistory.push(items[i])}
  8944.         else {
  8945.           dup = true}
  8946.       }
  8947.       this._history = newHistory.join("\n")}
  8948.     else {
  8949.       this._history = text}
  8950.     if(GTB_getPrefs().getBoolPref(GTB_PREF_SAVE_HISTORY)) {
  8951.       GTB_getPrefs().setUnicodePref(GTB_SearchHistory._HISTORY_PREF, this._history)}
  8952.   }
  8953. }
  8954.  
  8955. ;
  8956. GTB_SearchHistory.addHistoryMenuItem = function(menulist, text) {
  8957.   var items = menulist.getElementsByTagName("menuitem");
  8958.   var count = items.length;
  8959.   for(var i = 0;i < count;i ++ ) {
  8960.     if(GTB_SearchHistory._isSameQuery(items[i].getAttribute("label"), text)) {
  8961.       return false}
  8962.   }
  8963.   var item = menulist.insertItemAt(0, text);
  8964.   item.label = text;
  8965.   return true}
  8966.  
  8967. ;
  8968. GTB_SearchHistory.prototype.addToHistory = function(text) {
  8969.   if(text === "") {
  8970.     return}
  8971.   this._historyCache(text);
  8972.   var menulist = GTB_SearchHistory._getSearchMenuList();
  8973.   if(menulist == null) {
  8974.     return}
  8975.   if(GTB_SearchHistory.addHistoryMenuItem(menulist, text)) {
  8976.     var popup = menulist.menupopup;
  8977.     if(popup) {
  8978.       popup.setAttribute("maxheight", "200")}
  8979.   }
  8980. }
  8981.  
  8982. ;
  8983. GTB_SearchHistory.prototype.doToggleSave = function(newValue) {
  8984.   if(!newValue || newValue == "false") {
  8985.     GTB_getPrefs().setUnicodePref(GTB_SearchHistory._HISTORY_PREF, "")}
  8986.   else {
  8987.     GTB_getPrefs().setUnicodePref(GTB_SearchHistory._HISTORY_PREF, this._history)}
  8988. }
  8989.  
  8990. ;
  8991. GTB_SearchHistory.prototype.clearHistory = function() {
  8992.   var menulist = GTB_SearchHistory._getSearchMenuList();
  8993.   if(menulist) {
  8994.     menulist.selectedIndex = -1;
  8995.     menulist.removeAllItems()}
  8996.   this._history = "";
  8997.   GTB_getPrefs().setUnicodePref(GTB_SearchHistory._HISTORY_PREF, "");
  8998.   var overlay = GTB_getToolbar();
  8999.   var answer = overlay.highlighter.onSearchTextChanged();
  9000.   overlay._enableDisableQueryButtons(answer.hasTerms, answer.hasOps)}
  9001.  
  9002. ;
  9003. function GTB_Suggest() {
  9004.   this.observe = GTB_MessageObserve;
  9005.   var self = this;
  9006.   this.GTB_MESSAGES = {"GTB_OPTION.search_box_use_suggest":function(data) {
  9007.     self.doToggleSuggest(data)}
  9008.   
  9009.   };
  9010.   this.doToggleSuggest(GTB_getPrefs().getBoolPref(GTB_PREF_USE_SUGGEST))}
  9011.  
  9012. GTB_Suggest.prototype.doToggleSuggest = function(newValue) {
  9013.   var googleSearchBox = document.getElementById("gtbGoogleSearchBox");
  9014.   if(googleSearchBox) {
  9015.     var searchBox = googleSearchBox.textBox;
  9016.     if(!newValue || newValue == "false") {
  9017.       searchBox.setAttribute("disableautocomplete", true);
  9018.       searchBox.removeEventListener("keypress", GTB_GoogleToolbar._eventHack_onFieldKeyPress, false)}
  9019.     else {
  9020.       searchBox.setAttribute("disableautocomplete", false);
  9021.       searchBox.addEventListener("keypress", GTB_GoogleToolbar._eventHack_onFieldKeyPress, false)}
  9022.   }
  9023. }
  9024.  
  9025. ;
  9026. function GTB_Tooltip(tippers) {
  9027.   this._toolTippers = [];
  9028.   for(var i = 0;i < tippers.length;i ++ ) {
  9029.     this._toolTippers.push(tippers[i])}
  9030.   this._rangeParent = null;
  9031.   this._rangeOffset = 0}
  9032.  
  9033. GTB_Tooltip.GTB_TOOLTIP_ID = "aHTMLTooltip";
  9034. GTB_Tooltip.prototype.maybeShowTooltip = function(tipElement) {
  9035.   var menu = document.getElementById("contentAreaContextMenu");
  9036.   if(0 != menu.boxObject.screenX || 0 != menu.boxObject.screenY) {
  9037.     return false}
  9038.   var parent = this._rangeParent;
  9039.   var offset = this._rangeOffset;
  9040.   if(parent == null) {
  9041.     return false}
  9042.   var match = null;
  9043.   var tts = this._toolTippers;
  9044.   for(var ttNum = 0;ttNum < tts.length; ++ ttNum) {
  9045.     match = tts[ttNum].getTooltipBody(parent, offset, tipElement);
  9046.     if(match != null) {
  9047.       break}
  9048.   }
  9049.   if(match == null) {
  9050.     return false}
  9051.   if(match.length > 0) {
  9052.     GTB_Tooltip._updateTooltip(match)}
  9053.   return true}
  9054.  
  9055. ;
  9056. GTB_Tooltip._updateTooltip = function(match) {
  9057.   var tooltip = document.getElementById(GTB_Tooltip.GTB_TOOLTIP_ID);
  9058.   tooltip.removeAttribute("label");
  9059.   while(tooltip.hasChildNodes()) {
  9060.     tooltip.removeChild(tooltip.firstChild)}
  9061.   for(var c in match) {
  9062.     tooltip.appendChild(match[c])}
  9063.   tooltip.width = "";
  9064.   tooltip.height = "";
  9065.   tooltip.sizeTo(tooltip.boxObject.width, tooltip.boxObject.height);
  9066.   tooltip.isGoogleTooltip = true}
  9067.  
  9068. ;
  9069. GTB_Tooltip.prototype.doMouseMove = function(event) {
  9070.   this.updateCursorPosition(event);
  9071.   GTB_Tooltip.maybeHideTooltip(event)}
  9072.  
  9073. ;
  9074. GTB_Tooltip.prototype.updateCursorPosition = function(event) {
  9075.   this._rangeParent = event.rangeParent;
  9076.   this._rangeOffset = event.rangeOffset}
  9077.  
  9078. ;
  9079. GTB_Tooltip.maybeHideTooltip = function() {
  9080.   var tooltip = document.getElementById(GTB_Tooltip.GTB_TOOLTIP_ID);
  9081.   if(tooltip.isGoogleTooltip) {
  9082.     tooltip.hidePopup()}
  9083. }
  9084.  
  9085. ;
  9086. function GTB_TooltipDefault() {
  9087. }
  9088.  
  9089. GTB_TooltipDefault.prototype.getTooltipBody = function(parent, offset, tipElement) {
  9090.   if(FillInHTMLTooltip(tipElement)) {
  9091.     var tooltip = document.getElementById(GTB_Tooltip.GTB_TOOLTIP_ID);
  9092.     while(tooltip.hasChildNodes()) {
  9093.       tooltip.removeChild(tooltip.firstChild)}
  9094.     tooltip.width = "";
  9095.     tooltip.height = "";
  9096.     tooltip.sizeTo(tooltip.boxObject.width, tooltip.boxObject.height);
  9097.     tooltip.isGoogleTooltip = false;
  9098.     return[]}
  9099.   return null}
  9100.  
  9101. ;
  9102. function GTB_TT_XULTooltipAlert(node, msg, setWindowStatus) {
  9103.   if(!node) {
  9104.     return}
  9105.   var tooltip = document.getElementById("gtbBtnTooltip");
  9106.   if(tooltip.timeout) {
  9107.     window.clearTimeout(tooltip.timeout);
  9108.     if(tooltip.statusMsg) {
  9109.       window.status = tooltip.statusMsg;
  9110.       tooltip.statusMsg = null}
  9111.   }
  9112.   var descs = tooltip.getElementsByTagName("description");
  9113.   if(descs && descs.length == 1) {
  9114.     descs[0].setAttribute("value", msg)}
  9115.   document.popupNode = node;
  9116.   tooltip.showPopup(node, node.boxObject.screenX + 10, node.boxObject.screenY + node.boxObject.height, "tooltip");
  9117.   if(setWindowStatus) {
  9118.     var toolbar = document.getElementById("gtbToolbar");
  9119.     var name = toolbar.getAttribute("toolbarname");
  9120.     var statusbar = document.getElementById("statusbar-display");
  9121.     if(statusbar && statusbar.label) {
  9122.       tooltip.statusMsg = statusbar.label}
  9123.     window.status = name + ": " + msg}
  9124.   tooltip.timeout = window.setTimeout(GTB_TT_hideTooltip, 2000, tooltip)}
  9125.  
  9126. function GTB_TT_hideTooltip(tooltip) {
  9127.   tooltip.hidePopup();
  9128.   if(tooltip.statusMsg) {
  9129.     window.status = tooltip.statusMsg;
  9130.     tooltip.statusMsg = null}
  9131.   tooltip.timeout = null}
  9132.  
  9133. function GTB_TT_maybeSurpressTooltip(event) {
  9134.   var tt = document.tooltipNode;
  9135.   if(tt) {
  9136.     var parentId = tt.parentNode && tt.parentNode.id;
  9137.     if(parentId && parentId.substr(0, 3) == "gtb" && "menuitem" == tt.nodeName && tt.getAttribute("tooltiptext") == "") {
  9138.       event.preventDefault()}
  9139.     var btnTooltip = document.getElementById("gtbBtnTooltip");
  9140.     if(btnTooltip) {
  9141.       btnTooltip.hidePopup()}
  9142.   }
  9143. }
  9144.  
  9145. var GTB_FS_PREF_AGGREGATORS = "subscribe.aggregators";
  9146. var GTB_FS_PREF_AGGREGATORS_PREFIX = "subscribe.aggregators.";
  9147. var GTB_FS_PREF_CURRENT = "subscribe.aggregatorid";
  9148. var GTB_FS_PREF_DEFAULT = "subscribe.defaultid";
  9149. var GTB_FS_PREF_LAST_REFRESHED = "subscribe.lastrefreshed";
  9150. function GTB_FS_getFS() {
  9151.   return GTB_getToolbar().feedSubscribe}
  9152.  
  9153. function GTB_FS_getAggMgr() {
  9154.   return GTB_FS_getFS().aggregatorsManager}
  9155.  
  9156. function GTB_FS_Dump(text) {
  9157.   GTB_Dump(GTB_Dump.FS, "[GTB_FS]>>> " + text + "\n")}
  9158.  
  9159. function GTB_FeedSubscribe() {
  9160.   GTB_FS_Dump("Initialization");
  9161.   this.strings = new GTB_FS_Strings;
  9162.   this.aggregatorsManager = new GTB_FS_AggregatorsManager;
  9163.   this.aggregatorsManager.refreshAggregatorsFromWeb();
  9164.   this.observe = GTB_MessageObserve;
  9165.   var browser = GTB_GoogleToolbarOverlay._getTabBrowser();
  9166.   browser.addEventListener("DOMLinkAdded", GTB_FS_onDomLinkAdded, false);
  9167.   this.updateButtonState()}
  9168.  
  9169. GTB_FeedSubscribe.prototype.doPageHideOrUnload = function(event) {
  9170.   var button = document.getElementById("gtbFeedSubscribe");
  9171.   if(!button) {
  9172.     return}
  9173.   GTB_FS_Dump("received doPageHideOrUnload");
  9174.   var doc = event.target;
  9175.   if(doc && doc.location) {
  9176.     GTB_FS_Dump("Target = " + doc.location.href)}
  9177.   var browser = GTB_GoogleToolbarOverlay._getBrowserFromDoc(doc);
  9178.   if(browser) {
  9179.     GTB_FS_Dump("Browser.contentDocument = " + browser.contentDocument.location.href);
  9180.     if(event.target == browser.contentDocument && browser.GTB_feedLocator) {
  9181.       GTB_FS_Dump("Found feed locator for the browser, setting to null");
  9182.       browser.GTB_feedLocator = null;
  9183.       this.updateButtonState()}
  9184.   }
  9185.   else {
  9186.     GTB_FS_Dump("Browser not available, can't clean up feed information")}
  9187. }
  9188.  
  9189. ;
  9190. GTB_FeedSubscribe.prototype.doTabSwitch = function() {
  9191.   GTB_FS_Dump("Received doTabSwitch");
  9192.   this.updateButtonState()}
  9193.  
  9194. ;
  9195. GTB_FeedSubscribe.prototype.doDomLinkAdded = function(event) {
  9196.   var button = document.getElementById("gtbFeedSubscribe");
  9197.   if(!button) {
  9198.     return}
  9199.   GTB_FS_Dump("Received doDomLinkAdded");
  9200.   var safeGetProperty = function(obj, propname) {
  9201.     return Components.lookupMethod(obj, propname).call(obj)}
  9202.   
  9203.   ;
  9204.   var targetDoc = safeGetProperty(event.target, "ownerDocument");
  9205.   var browser = GTB_GoogleToolbarOverlay._getBrowserFromDoc(targetDoc);
  9206.   if(browser.GTB_feedLocator == null) {
  9207.     GTB_FS_Dump("Allocating feed locator for current browser (onDomLinkAdded)");
  9208.     browser.GTB_feedLocator = new GTB_FS_FeedLocator}
  9209.   var feedFound = browser.GTB_feedLocator.addLinkIfFeed(event.target, targetDoc, true);
  9210.   if(feedFound && browser == GTB_GoogleToolbarOverlay._getCurrentBrowser()) {
  9211.     this.updateButtonState()}
  9212. }
  9213.  
  9214. ;
  9215. GTB_FeedSubscribe.prototype.doPageShowOrLoad = function(event) {
  9216.   var button = document.getElementById("gtbFeedSubscribe");
  9217.   if(!button) {
  9218.     return}
  9219.   GTB_FS_Dump("received doPageShowOrLoad");
  9220.   var doc = event.target;
  9221.   var browser = GTB_GoogleToolbarOverlay._getBrowserFromDoc(doc);
  9222.   if(browser.GTB_feedLocator == null) {
  9223.     GTB_FS_Dump("Allocating feed locator for current browser (doPageLoad)");
  9224.     browser.GTB_feedLocator = new GTB_FS_FeedLocator}
  9225.   var feedsFound = browser.GTB_feedLocator.locateFeeds(doc, false);
  9226.   if(feedsFound) {
  9227.     this.updateButtonState()}
  9228. }
  9229.  
  9230. ;
  9231. GTB_FeedSubscribe.prototype.numberOfFeedsFound = function() {
  9232.   var result = 0;
  9233.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  9234.   if(browser.GTB_feedLocator && browser.GTB_feedLocator.feedsList) {
  9235.     result = browser.GTB_feedLocator.feedsList.length}
  9236.   return result}
  9237.  
  9238. ;
  9239. GTB_FeedSubscribe.prototype.updateButtonState = function() {
  9240.   GTB_FS_Dump("Updating subscribe button state");
  9241.   var subscribeButton = document.getElementById("gtbFeedSubscribe");
  9242.   if(subscribeButton) {
  9243.     if(this.numberOfFeedsFound() > 0) {
  9244.       GTB_FS_Dump("enabling button");
  9245.       subscribeButton.disabled = false;
  9246.       subscribeButton.image = "chrome://google-toolbar/skin/subscribe.png";
  9247.       if(this.numberOfFeedsFound() > 1) {
  9248.         subscribeButton.type = "menu";
  9249.         subscribeButton.label = this.strings.SUBSCRIBE_LABEL + "  "}
  9250.       else {
  9251.         subscribeButton.type = "menu-button";
  9252.         subscribeButton.label = this.strings.SUBSCRIBE_LABEL}
  9253.     }
  9254.     else {
  9255.       window.setTimeout(GTB_hitch(this, this._updateButtonStateDelayed), 50)}
  9256.   }
  9257. }
  9258.  
  9259. ;
  9260. GTB_FeedSubscribe.prototype._updateButtonStateDelayed = function() {
  9261.   if(this.numberOfFeedsFound() == 0) {
  9262.     var subscribeButton = document.getElementById("gtbFeedSubscribe");
  9263.     GTB_FS_Dump("disabling button");
  9264.     subscribeButton.disabled = true;
  9265.     subscribeButton.image = "chrome://google-toolbar/skin/subscribe-off.png"}
  9266. }
  9267.  
  9268. ;
  9269. GTB_FeedSubscribe.prototype.doUpdatePopupMenu = function(menu) {
  9270.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  9271.   var fl = browser.GTB_feedLocator;
  9272.   GTB_FS_Dump("doUpdatePopupMenu: adding " + fl.feedsList.length + " feeds to pup-up menu");
  9273.   var items = menu.getElementsByTagName("menuitem");
  9274.   while(items.length > 1) {
  9275.     menu.removeChild(items[0])}
  9276.   fl.processForDisplay();
  9277.   var separator = menu.getElementsByTagName("menuseparator")[0];
  9278.   for(var i = 0;i < fl.feedsList.length;i ++ ) {
  9279.     var feed = fl.feedsList[i];
  9280.     var mi = document.createElement("menuitem");
  9281.     var labelText = this.strings.SUBSCRIBE_TO;
  9282.     labelText = labelText.replace("&feedTitle;", feed.displayTitle);
  9283.     mi.setAttribute("label", labelText);
  9284.     mi.GTB_FS_index = i;
  9285.     menu.insertBefore(mi, separator)}
  9286.   GTB_FS_Dump("Added " + fl.feedsList.length + " feeds to menu")}
  9287.  
  9288. ;
  9289. GTB_FeedSubscribe.prototype.doOpenPrefs = function() {
  9290.   window.openDialog("chrome://google-toolbar/content/options-subscribe.xul", "gtbFeedSubscribeOptions", "modal,centerscreen,chrome,resizable=no")}
  9291.  
  9292. ;
  9293. GTB_FeedSubscribe.prototype.performSubscribe = function(feed) {
  9294.   var aggUrl = GTB_FS_getAggMgr().loadCurrentAggregator().url;
  9295.   if(aggUrl == "LiveBookmarksUrl") {
  9296.     BookmarksUtils.addLivemark("", feed.url, feed.contentTitle)}
  9297.   else {
  9298.     var targetUrl = aggUrl.replace(/%feed%/, feed.url);
  9299.     var browserAccess = new nsBrowserAccess;
  9300.     var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  9301.     var xpcomUrl = ios.newURI(targetUrl, null, null);
  9302.     browserAccess.openURI(xpcomUrl, null, nsCI.nsIBrowserDOMWindow.OPEN_DEFAULTWINDOW, null)}
  9303. }
  9304.  
  9305. ;
  9306. GTB_FeedSubscribe.prototype.doSubscribeButtonClicked = function() {
  9307.   GTB_GoogleToolbarOverlay.maybeShowUsage("subscribe_used", OptionsDialog.MORE_URL_FEEDSUBSCRIBE);
  9308.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  9309.   var fl = browser.GTB_feedLocator;
  9310.   fl.processForDisplay();
  9311.   this.performSubscribe(fl.feedsList[0])}
  9312.  
  9313. ;
  9314. GTB_FeedSubscribe.prototype.doFeedClicked = function(menuitem) {
  9315.   GTB_GoogleToolbarOverlay.maybeShowUsage("subscribe_used", OptionsDialog.MORE_URL_FEEDSUBSCRIBE, OptionsDialog.MORE_WINDOW_FLAGS_MODAL);
  9316.   var browser = GTB_GoogleToolbarOverlay._getCurrentBrowser();
  9317.   if(menuitem.GTB_FS_index != null) {
  9318.     var feed = browser.GTB_feedLocator.feedsList[menuitem.GTB_FS_index];
  9319.     this.performSubscribe(feed)}
  9320. }
  9321.  
  9322. ;
  9323. GTB_FeedSubscribe.prototype.doToggleSubscribeButton = function(data) {
  9324.   var toolbar = GTB_getToolbar();
  9325.   var browsers = toolbar._getTabBrowser().browsers;
  9326.   for(var i = 0;i < browsers.length;i ++ ) {
  9327.     var browser = browsers[i];
  9328.     browser.GTB_feedLocator = null;
  9329.     if(data == "true" && browser.contentDocument) {
  9330.       GTB_FS_Dump("Allocating feed locator for tab " + i);
  9331.       browser.GTB_feedLocator = new GTB_FS_FeedLocator;
  9332.       window.setTimeout(GTB_hitch(this, this._locateFeedsTimeout), 0, browser)}
  9333.   }
  9334. }
  9335.  
  9336. ;
  9337. GTB_FeedSubscribe.prototype._locateFeedsTimeout = function(browser) {
  9338.   browser.GTB_feedLocator.locateFeeds(browser.contentDocument, true);
  9339.   if(browser == GTB_GoogleToolbarOverlay._getCurrentBrowser()) {
  9340.     this.updateButtonState()}
  9341. }
  9342.  
  9343. ;
  9344. GTB_FeedSubscribe.prototype.GTB_MESSAGES = {"GTB_OPTION.button_option.gtbFeedSubscribe":function(data) {
  9345.   GTB_FS_Dump("Received message GTB_OPTION.button_option.gtbFeedSubscribe, data = " + data);
  9346.   GTB_FS_getFS().doToggleSubscribeButton(data)}
  9347.  
  9348. };
  9349. function GTB_FS_Strings() {
  9350.   var strings = document.getElementById("google-toolbar-strings");
  9351.   var propPrefix = "google-feedsubscribe.";
  9352.   this.SUBSCRIBE_TO = strings.getString(propPrefix + "subscribeTo");
  9353.   this.LIVEBOOKMARKS_TITLE = strings.getString(propPrefix + "liveBookmarksTitle");
  9354.   this.LIVEBOOKMARKS_DESC = strings.getString(propPrefix + "liveBookmarksDesc");
  9355.   this.SUBSCRIBE_LABEL = strings.getString(propPrefix + "subscribeLabel")}
  9356.  
  9357. function GTB_FS_onDomLinkAdded(event) {
  9358.   GTB_GoogleToolbarOverlay.feedSubscribe.doDomLinkAdded(event)}
  9359.  
  9360. function GTB_FS_onFeedSubscribe(event) {
  9361.   GTB_FS_Dump("Received GTB_FS_onFeedSubscribe");
  9362.   if(event.type == "click" && event.target.nodeName == "menuitem") {
  9363.     return}
  9364.   GTB_GoogleToolbarOverlay.feedSubscribe.doSubscribeButtonClicked()}
  9365.  
  9366. function GTB_FS_onOpenPrefs(event) {
  9367.   GTB_FS_Dump("Received GTB_FS_onOpenPrefs");
  9368.   GTB_GoogleToolbarOverlay.feedSubscribe.doOpenPrefs(event);
  9369.   event.preventBubble()}
  9370.  
  9371. function GTB_FS_onButtonMenuPopupShowing(event) {
  9372.   GTB_GoogleToolbarOverlay.feedSubscribe.doUpdatePopupMenu(event.target)}
  9373.  
  9374. function GTB_FS_onButtonMenuCommand(event) {
  9375.   GTB_FS_Dump("Received GTB_FS_onButtonMenuCommand");
  9376.   GTB_GoogleToolbarOverlay.feedSubscribe.doFeedClicked(event.target);
  9377.   event.preventBubble()}
  9378.  
  9379. function GTB_FS_Aggregator() {
  9380.   this.id = "";
  9381.   this.title = "";
  9382.   this.desc = "";
  9383.   this.url = "";
  9384.   this.order = -1}
  9385.  
  9386. GTB_FS_Aggregator.prototype.saveToPref = function() {
  9387.   var prefs = GTB_getPrefs();
  9388.   if(this.id !== "") {
  9389.     prefs.setStringPref(GTB_FS_PREF_AGGREGATORS_PREFIX + this.id + ".id", this.id);
  9390.     prefs.setUnicodePref(GTB_FS_PREF_AGGREGATORS_PREFIX + this.id + ".title", this.title);
  9391.     prefs.setUnicodePref(GTB_FS_PREF_AGGREGATORS_PREFIX + this.id + ".desc", this.desc);
  9392.     prefs.setUnicodePref(GTB_FS_PREF_AGGREGATORS_PREFIX + this.id + ".url", this.url);
  9393.     prefs.setStringPref(GTB_FS_PREF_AGGREGATORS_PREFIX + this.id + ".order", this.order.toString())}
  9394. }
  9395.  
  9396. ;
  9397. GTB_FS_Aggregator.prototype.fromXML = function(xmlNode) {
  9398.   var attrs = xmlNode.attributes;
  9399.   if(attrs.getNamedItem("id") && attrs.getNamedItem("id").value !== "") {
  9400.     this.id = attrs.getNamedItem("id").value;
  9401.     if(attrs.getNamedItem("title")) {
  9402.       this.title = attrs.getNamedItem("title").value}
  9403.     if(attrs.getNamedItem("desc")) {
  9404.       this.desc = attrs.getNamedItem("desc").value}
  9405.     if(attrs.getNamedItem("url")) {
  9406.       this.url = attrs.getNamedItem("url").value}
  9407.     return true}
  9408.   return false}
  9409.  
  9410. ;
  9411. GTB_FS_Aggregator.prototype.fromPref = function(id) {
  9412.   var prefs = GTB_getPrefs();
  9413.   this.id = id;
  9414.   this.title = prefs.getUnicodePref(GTB_FS_PREF_AGGREGATORS_PREFIX + id + ".title");
  9415.   this.url = prefs.getUnicodePref(GTB_FS_PREF_AGGREGATORS_PREFIX + id + ".url");
  9416.   this.desc = prefs.getUnicodePref(GTB_FS_PREF_AGGREGATORS_PREFIX + id + ".desc");
  9417.   this.order = parseInt(prefs.getStringPref(GTB_FS_PREF_AGGREGATORS_PREFIX + id + ".order"))}
  9418.  
  9419. ;
  9420. GTB_FS_Aggregator.prototype.toString = function() {
  9421.   return"Aggregator (id=" + this.id + ", url=" + this.url + ")"}
  9422.  
  9423. ;
  9424. function GTB_FS_Feed(url) {
  9425.   this.title = "";
  9426.   this.contentTitle = "";
  9427.   this.displayTitle = "";
  9428.   this.url = url;
  9429.   this.content = "";
  9430.   this.type = ""}
  9431.  
  9432. GTB_FS_Feed.prototype.toString = function() {
  9433.   return"feed [url=" + this.url + ", title=" + this.title + "]"}
  9434.  
  9435. ;
  9436. GTB_FS_Feed.prototype.setContent = function(content) {
  9437.   this.content = content;
  9438.   var titleElements = content.getElementsByTagName("title");
  9439.   if(titleElements.length > 0) {
  9440.     this.contentTitle = titleElements[0].textContent}
  9441. }
  9442.  
  9443. ;
  9444. function GTB_FS_FeedLocator() {
  9445.   this.feedsList = [];
  9446.   this.feedsProcessed = false}
  9447.  
  9448. GTB_FS_FeedLocator.prototype.toString = function() {
  9449.   return"GTB_FS_FeedLocator: feeds=" + this.feedsList.length}
  9450.  
  9451. ;
  9452. GTB_FS_FeedLocator.prototype.getAbsoluteUri = function(uri, doc) {
  9453.   var link = doc.createElement("a");
  9454.   link.href = uri;
  9455.   return link.href}
  9456.  
  9457. ;
  9458. GTB_FS_FeedLocator.prototype.numberOfFeedsPending = function() {
  9459.   var result = 0;
  9460.   for(var i = 0;i < this.feedsList.length;i ++ ) {
  9461.     if(this.feedsList[i].content == "") {
  9462.       result ++ }
  9463.   }
  9464.   return result}
  9465.  
  9466. ;
  9467. GTB_FS_FeedLocator.prototype.processForDisplay = function() {
  9468.   if(this.feedsProcessed == true) {
  9469.     return}
  9470.   var allContentTitlesAvailable = true;
  9471.   var allContentTitlesUnique = true;
  9472.   var contentTitles = {};
  9473.   var resultFeeds = [];
  9474.   for(var i = 0;i < this.feedsList.length;i ++ ) {
  9475.     var feed = this.feedsList[i];
  9476.     if(feed.contentTitle === "") {
  9477.       allContentTitlesAvailable = false;
  9478.       break}
  9479.     if(!(feed.contentTitle  in  contentTitles)) {
  9480.       contentTitles[feed.contentTitle] = feed.type;
  9481.       resultFeeds.push(feed)}
  9482.     else if(contentTitles[feed.contentTitle] == feed.type) {
  9483.       allContentTitlesUnique = false;
  9484.       resultFeeds.push(feed)}
  9485.     else {
  9486.       GTB_FS_Dump(feed + " was determined to be a different format of another feed, dropping")}
  9487.   }
  9488.   if(allContentTitlesAvailable) {
  9489.     this.feedsList = resultFeeds;
  9490.     this.feedsProcessed = true}
  9491.   for(i = 0;i < this.feedsList.length;i ++ ) {
  9492.     if(allContentTitlesAvailable) {
  9493.       if(allContentTitlesUnique) {
  9494.         this.feedsList[i].displayTitle = this.feedsList[i].contentTitle}
  9495.       else {
  9496.         this.feedsList[i].displayTitle = this.feedsList[i].contentTitle + " - " + this.feedsList[i].title}
  9497.     }
  9498.     else {
  9499.       if(this.feedsList[i].title == "") {
  9500.         this.feedsList[i].displayTitle = this.feedsList[i].url}
  9501.       else {
  9502.         this.feedsList[i].displayTitle = this.feedsList[i].title}
  9503.     }
  9504.   }
  9505. }
  9506.  
  9507. ;
  9508. GTB_FS_FeedLocator.prototype.locateFeeds = function(doc, checkAlternates) {
  9509.   this.processContent(doc);
  9510.   this.processAnchors(doc);
  9511.   if(checkAlternates == true) {
  9512.     this.processAlternates(doc)}
  9513.   return this.feedsList.length > 0}
  9514.  
  9515. ;
  9516. GTB_FS_FeedLocator.prototype.processContent = function(doc) {
  9517.   if(this.isFeedDescription(doc)) {
  9518.     var href = doc.location.href;
  9519.     if(href.toLowerCase().indexOf("http://") != 0) {
  9520.       GTB_FS_Dump("Skipping current doc since it's not http, href=" + href);
  9521.       return}
  9522.     var feed = new GTB_FS_Feed(href);
  9523.     feed.setContent(doc);
  9524.     this.addFeed(feed)}
  9525. }
  9526.  
  9527. ;
  9528. GTB_FS_FeedLocator.prototype.processAlternates = function(doc) {
  9529.   var links = doc.getElementsByTagName("link");
  9530.   for(var i = 0;i < links.length;i ++ ) {
  9531.     this.addLinkIfFeed(links[i], doc, true)}
  9532. }
  9533.  
  9534. ;
  9535. GTB_FS_FeedLocator.prototype.processAnchors = function(doc) {
  9536.   var anchors = doc.getElementsByTagName("a");
  9537.   for(var i = 0;i < anchors.length;i ++ ) {
  9538.     this.addLinkIfFeed(anchors[i], doc, false)}
  9539. }
  9540.  
  9541. ;
  9542. GTB_FS_FeedLocator.prototype.addLinkIfFeed = function(link, doc, requireAlternate) {
  9543.   var FEED_MIME_TYPES = {"application/rss+xml":"rss", "text/xml":"???", "application/atom+xml":"atom", "application/x.atom+xml":"atom", "application/x-atom+xml":"atom"};
  9544.   var rel = link.getAttribute("rel");
  9545.   var type = link.getAttribute("type");
  9546.   var href = link.getAttribute("href");
  9547.   var title = link.getAttribute("title");
  9548.   if(!href || !type) {
  9549.     return false}
  9550.   if(requireAlternate) {
  9551.     var isAlternate = false;
  9552.     if(rel) {
  9553.       var rels = rel.split(/\s+/);
  9554.       for(var j = 0;j < rels.length;j ++ ) {
  9555.         if(rels[j].toLowerCase() == "alternate") {
  9556.           isAlternate = true}
  9557.       }
  9558.     }
  9559.     if(!isAlternate) {
  9560.       GTB_FS_Dump("rel attribute does not contain 'alternate' for href=" + href + ", skipping");
  9561.       return false}
  9562.   }
  9563.   if(href.toLowerCase().indexOf("javascript:") != -1) {
  9564.     GTB_FS_Dump("Skipping link since it's javascript, href=" + href);
  9565.     return false}
  9566.   type = type.toLowerCase();
  9567.   if(!FEED_MIME_TYPES[type]) {
  9568.     GTB_FS_Dump("Skipping link since its type is not indicating feed, href=" + href + ", type=" + type);
  9569.     return false}
  9570.   var absoluteUri = this.getAbsoluteUri(href, doc);
  9571.   if(absoluteUri.toLowerCase().indexOf("http://") != 0) {
  9572.     GTB_FS_Dump("Skipping link since it's not http, href=" + absoluteUri);
  9573.     return false}
  9574.   var feed = new GTB_FS_Feed(absoluteUri);
  9575.   if(title) {
  9576.     feed.title = title}
  9577.   if(type) {
  9578.     feed.type = type}
  9579.   this.addFeed(feed);
  9580.   return true}
  9581.  
  9582. ;
  9583. GTB_FS_FeedLocator.prototype.isFeedDescription = function(doc) {
  9584.   if(doc.getElementsByTagName("html").length > 0) {
  9585.     return false}
  9586.   return(doc.getElementsByTagName("rss").length || doc.getElementsByTagName("channel").length || doc.getElementsByTagName("feed").length) > 0}
  9587.  
  9588. ;
  9589. GTB_FS_FeedLocator.prototype.addFeed = function(feed) {
  9590.   for(var i = 0;i < this.feedsList.length;i ++ ) {
  9591.     if(this.feedsList[i].url == feed.url) {
  9592.       GTB_FS_Dump(feed + " already exists, skipping");
  9593.       return}
  9594.   }
  9595.   this.feedsProcessed = false;
  9596.   this.feedsList.push(feed);
  9597.   GTB_FS_Dump("Added " + feed);
  9598.   if(feed.content === "") {
  9599.     var feedLocator = this;
  9600.     var request = new XMLHttpRequest;
  9601.     request.feed = feed;
  9602.     request.open("GET", feed.url, true);
  9603.     request.setRequestHeader("X-moz", "prefetch");
  9604.     function handleReadyStateChange() {
  9605.       if(request.readyState == 4 && request.status == 200 && request.responseXML) {
  9606.         if(feedLocator.isFeedDescription(request.responseXML)) {
  9607.           feed.setContent(request.responseXML);
  9608.           if(feedLocator.numberOfFeedsPending() == 0) {
  9609.             feedLocator.processForDisplay();
  9610.             GTB_FS_getFS().updateButtonState()}
  9611.         }
  9612.       }
  9613.     }
  9614.     
  9615.     ;
  9616.     request.onreadystatechange = handleReadyStateChange;
  9617.     try {
  9618.       request.send(null)}
  9619.     catch(err) {
  9620.       GTB_FS_Dump("XMLHttpRequest failed for " + feed + ", ignoring")}
  9621.   }
  9622. }
  9623.  
  9624. ;
  9625. function GTB_FS_AggregatorsManager() {
  9626. }
  9627.  
  9628. GTB_FS_AggregatorsManager.prototype.loadCurrentAggregator = function() {
  9629.   var prefs = GTB_getPrefs();
  9630.   var result = null;
  9631.   try {
  9632.     this.maybeInitCurrentAggregator();
  9633.     var currentId = prefs.getStringPref(GTB_FS_PREF_CURRENT);
  9634.     var agg = new GTB_FS_Aggregator;
  9635.     agg.fromPref(currentId);
  9636.     result = agg}
  9637.   catch(exc) {
  9638.   }
  9639.   if(result == null) {
  9640.     GTB_FS_Dump("Current setting isn't available, reporting first aggregator");
  9641.     var aggs = this.loadAggregatorsFromPrefs();
  9642.     result = aggs[0]}
  9643.   return result}
  9644.  
  9645. ;
  9646. GTB_FS_AggregatorsManager.prototype.loadAggregatorsFromPrefs = function() {
  9647.   var aggs = [];
  9648.   var prefs = GTB_getPrefs();
  9649.   var children = prefs.getNamesOfChildren(GTB_FS_PREF_AGGREGATORS, {});
  9650.   if(children.length > 0) {
  9651.     for(var i = 0;i < children.length;i ++ ) {
  9652.       var current = children[i];
  9653.       if(current.indexOf(".id") == current.length - ".id".length) {
  9654.         var id = prefs.getStringPref(GTB_FS_PREF_AGGREGATORS_PREFIX + current);
  9655.         var agg = new GTB_FS_Aggregator;
  9656.         agg.fromPref(id);
  9657.         aggs.push(agg)}
  9658.     }
  9659.     aggs.sort(function(a, b) {
  9660.       if(a.order > b.order)return 1;
  9661.       if(a.order < b.order)return-1;
  9662.       return 0}
  9663.     
  9664.     );
  9665.     GTB_FS_Dump("Loaded " + aggs.length + " aggregators from preferences")}
  9666.   else {
  9667.     GTB_FS_Dump("No aggregators in preferences, reporting default aggregator");
  9668.     var agg = new GTB_FS_Aggregator;
  9669.     agg.id = "LiveBookmarks";
  9670.     agg.url = "LiveBookmarksUrl";
  9671.     agg.desc = GTB_FS_getFS().strings.LIVEBOOKMARKS_DESC;
  9672.     agg.title = GTB_FS_getFS().strings.LIVEBOOKMARKS_TITLE;
  9673.     agg.order = 0;
  9674.     aggs.push(agg)}
  9675.   return aggs}
  9676.  
  9677. ;
  9678. GTB_FS_AggregatorsManager.prototype.isRefreshNeeded = function() {
  9679.   var prefs = GTB_getPrefs();
  9680.   var lastRefreshed = null;
  9681.   try {
  9682.     lastRefreshed = new Date(prefs.getStringPref(GTB_FS_PREF_LAST_REFRESHED))}
  9683.   catch(exc) {
  9684.     lastRefreshed = new Date(1990, 1, 1)}
  9685.   var currentDate = new Date;
  9686.   var diffMilliseconds = currentDate.valueOf() - lastRefreshed.valueOf();
  9687.   if(diffMilliseconds >= 86400000) {
  9688.     return true}
  9689.   GTB_FS_Dump("Last aggregators list refresh was done just " + diffMilliseconds + " milliseconds ago, will not refresh now");
  9690.   return false}
  9691.  
  9692. ;
  9693. GTB_FS_AggregatorsManager.prototype.refreshAggregatorsFromWeb = function() {
  9694.   if(this.isRefreshNeeded()) {
  9695.     GTB_FS_Dump("Requesting aggregators list from server");
  9696.     var prefs = GTB_getPrefs();
  9697.     var url;
  9698.     try {
  9699.       url = prefs.getStringPref("subscribe.aggregatorURL")}
  9700.     catch(e) {
  9701.       url = "http://google.com/tools/firefox/toolbar/FT2/intl/{LANG}/aggregators.xml"}
  9702.     prefs = null;
  9703.     url = url.replace(/{LANG}/, GTB_getToolbar().languageCode);
  9704.     var request = new XMLHttpRequest;
  9705.     request.open("GET", url, true);
  9706.     request.setRequestHeader("Cache-Control", "no-cache");
  9707.     request.onreadystatechange = function(aEvt) {
  9708.       if(request.readyState == 4 && request.status == 200 && request.responseXML) {
  9709.         var aggNodes = request.responseXML.getElementsByTagName("aggregator");
  9710.         if(aggNodes && aggNodes.length >= 1) {
  9711.           var prefs = GTB_getPrefs();
  9712.           prefs.deleteBranch(GTB_FS_PREF_AGGREGATORS);
  9713.           for(var i = 0;i < aggNodes.length;i ++ ) {
  9714.             var agg = new GTB_FS_Aggregator;
  9715.             if(agg.fromXML(aggNodes[i])) {
  9716.               agg.order = i;
  9717.               agg.saveToPref()}
  9718.           }
  9719.           var defaultNodes = request.responseXML.getElementsByTagName("default");
  9720.           if(defaultNodes.length > 0) {
  9721.             var defaultId = defaultNodes[0].textContent;
  9722.             prefs.setStringPref(GTB_FS_PREF_DEFAULT, defaultId);
  9723.             GTB_FS_Dump("Received default aggregator, id=" + defaultId)}
  9724.           var currentDate = new Date;
  9725.           prefs.setStringPref(GTB_FS_PREF_LAST_REFRESHED, currentDate.toString());
  9726.           GTB_FS_Dump("Successfully refreshed aggregators list, total " + aggNodes.length + " aggregators")}
  9727.       }
  9728.     }
  9729.     
  9730.     ;
  9731.     request.send(null)}
  9732. }
  9733.  
  9734. ;
  9735. GTB_FS_AggregatorsManager.prototype.isValidAggregator = function(id) {
  9736.   var prefs = GTB_getPrefs();
  9737.   try {
  9738.     prefs.getUnicodePref(GTB_FS_PREF_AGGREGATORS_PREFIX + id + ".url")}
  9739.   catch(err) {
  9740.     return false}
  9741.   return true}
  9742.  
  9743. ;
  9744. GTB_FS_AggregatorsManager.prototype.maybeInitCurrentAggregator = function() {
  9745.   var prefs = GTB_getPrefs();
  9746.   var currentId = prefs.getStringPref(GTB_FS_PREF_CURRENT);
  9747.   if(this.isValidAggregator(currentId) == false) {
  9748.     currentId = prefs.getStringPref(GTB_FS_PREF_DEFAULT);
  9749.     if(this.isValidAggregator(currentId) == false) {
  9750.       currentId = "LiveBookmarks"}
  9751.     prefs.setStringPref(GTB_FS_PREF_CURRENT, currentId);
  9752.     GTB_FS_Dump("Initialized current aggregator pref, id=" + currentId)}
  9753. }
  9754.  
  9755. ;
  9756. function PROTTB_thisFirefoxIsSafeBrowsingCompatible() {
  9757.   var compatible = false;
  9758.   try {
  9759.     var Cc = Components.classes;
  9760.     var appContext = Cc["@google.com/tbsafebrowsing/application;1"].getService();
  9761.     appContext = appContext.wrappedJSObject.appContext;
  9762.     if(appContext.PROT_Application.isCompatibleWithThisFirefox())compatible = true}
  9763.   catch(e) {
  9764.   }
  9765.   return compatible}
  9766.  
  9767. ;
  9768.  
  9769.