// ==UserScript==
// @name        SEObar
// @version     6.08 for Opera 10.50 +
// @date        2011-10-12
// @author      Mike Samokhvalov <mikivanch@gmail.com>
// @download    http://www.puzzleclub.ru/files/seobar/seobar6.js
// @exclude     file://*
// @exclude     ftp://*
// @exclude     http://localhost/*
// @exclude     http://www.alexa.com/*
// ==/UserScript==

  var ujs_seob = {

    /////////////////////////////////////////////////////////////////
    // variable settings. read the note

    //display the information on panel
    bPanel: true,
    // display the information in status bar
    bStatusbar: true,

    // minimizing the panel disables the script while maximizing enables it;
    // if set to false the script is enabled in the 'Settings' section.
    bDisableScriptByPanelCollapse: true,

    // diplay (true) or not (false) the extra informatin of Yandex.ru
    // in status bar
    showYandexInfoInStatusbar: false,

    // Regular expression URL filter
    // Example (include an index pages only): /\/$|index\.[a-z]{3,5}$|default\.[a-z]{3,5}$/i
    includeUrlFilter: null,
    // Example (exclude a pages with the "?" symbol): /\?/
    excludeUrlFilter: null,

    // delay (ms.) before questioning Alexa and Google after the page is loaded.
    requestDelay: 1500,

    // the symbol for grouping numbers (eg. 1,673,433 - are grouped by comma)
    digitGroupingSymbol: ' ', // eg.: 1 673 433

    undefinedRank: 'n/a',
    unrequestedRank: '?',

    fontSize: '11px',
    fontFamily: 'verdana, arial, helvetica, sans-serif',
    sectionHeaderFontSize: '14px',

    // delete frames after receiving the infromation
    removeFrames: true,

    // specifies the non-existing domain's name where the SEObar stores it's settings
    fakeDomain: '0.0.0.0',

    // key's name where the SEObar stores it's settings
    preferencesKey: 'SEObar_preferences',
    // key's name where the the current domain's info is stored.
    domainKey: 'SEObar_domain',
    // key's name where the SEObar's state is stored.
    stateKey: 'SEObar_state',
    switchStatusbarState: true,

    // Directories
    maxDirectoryResults: 5,

    // Tools
    // URL of the whois service; %s - placeholder for the domain name
    whoisUrl: 'http://whois.domaintools.com/%s',

    // Domain ratings
    // Storage time in minutes
    domainRatingStorageTime: 1440, // 1 day
    domainRatingKey: 'SEObar_domain_ratings',

    busyIndicator: {
      image: 'data:image/gif;base64,R0lGODlhEAAQAMQAAP///+7u7t3d3bu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREQARAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBwAQACwAAAAAEAAQAAAFdyAkQgGJJOWoQgIjBM8jkKsoPEzgyMGsCjPDw7ADpkQBxRDmSCRetpRA6Rj4kFBkgLC4IlUGhbNQIwXOYYWCXDufzYPDMaoKGBoKb886OjAKdgZAAgQkfCwzAgsDBAUCgl8jAQkHEAVkAoA1AgczlyIDczUDA2UhACH5BAUHABAALAAAAAAPABAAAAVjICSO0IGIATkqIiMKDaGKC8Q49jPMYsE0hQdrlABCGgvT45FKiRKQhWA0mPKGPAgBcTjsspBCAoH4gl+FmXNEUEBVAYHToJAVZK/XWoQQDAgBZioHaX8igigFKYYQVlkCjiMhACH5BAUHABAALAAAAAAQAA8AAAVgICSOUGGQqIiIChMESyo6CdQGdRqUENESI8FAdFgAFwqDISYwPB4CVSMnEhSej+FogNhtHyfRQFmIol5owmEta/fcKITB6y4choMBmk7yGgSAEAJ8JAVDgQFmKUCCZnwhACH5BAUHABAALAAAAAAQABAAAAViICSOYkGe4hFAiSImAwotB+si6Co2QxvjAYHIgBAqDoWCK2Bq6A40iA4yYMggNZKwGFgVCAQZotFwwJIF4QnxaC9IsZNgLtAJDKbraJCGzPVSIgEDXVNXA0JdgH6ChoCKKCEAIfkEBQcAEAAsAAAAABAADgAABUkgJI7QcZComIjPw6bs2kINLB5uW9Bo0gyQx8LkKgVHiccKVdyRlqjFSAApOKOtR810StVeU9RAmLqOxi0qRG3LptikAVQEh4UAACH5BAUHABAALAAAAAAQABAAAAVxICSO0DCQKBQQonGIh5AGB2sYkMHIqYAIN0EDRxoQZIaC6bAoMRSiwMAwCIwCggRkwRMJWKSAomBVCc5lUiGRUBjO6FSBwWggwijBooDCdiFfIlBRAlYBZQ0PWRANaSkED1oQYHgjDA8nM3kPfCmejiEAIfkEBQcAEAAsAAAAABAAEAAABWAgJI6QIJCoOIhFwabsSbiFAotGMEMKgZoB3cBUQIgURpFgmEI0EqjACYXwiYJBGAGBgGIDWsVicbiNEgSsGbKCIMCwA4IBCRgXt8bDACkvYQF6U1OADg8mDlaACQtwJCEAIfkEBQcAEAAsAAABABAADwAABV4gJEKCOAwiMa4Q2qIDwq4wiriBmItCCREHUsIwCgh2q8MiyEKODK7ZbHCoqqSjWGKI1d2kRp+RAWGyHg+DQUEmKliGx4HBKECIMwG61AgssAQPKA19EAxRKz4QCVIhACH5BAUHABAALAAAAAAQABAAAAVjICSOUBCQqHhCgiAOKyqcLVvEZOC2geGiK5NpQBAZCilgAYFMogo/J0lgqEpHgoO2+GIMUL6p4vFojhQNg8rxWLgYBQJCASkwEKLC17hYFJtRIwwBfRAJDk4ObwsidEkrWkkhACH5BAUHABAALAAAAQAQAA8AAAVcICSOUGAGAqmKpjis6vmuqSrUxQyPhDEEtpUOgmgYETCCcrB4OBWwQsGHEhQatVFhB/mNAojFVsQgBhgKpSHRTRxEhGwhoRg0CCXYAkKHHPZCZRAKUERZMAYGMCEAIfkEBQcAEAAsAAABABAADwAABV0gJI4kFJToGAilwKLCST6PUcrB8A70844CXenwILRkIoYyBRk4BQlHo3FIOQmvAEGBMpYSop/IgPBCFpCqIuEsIESHgkgoJxwQAjSzwb1DClwwgQhgAVVMIgVyKCEAIfkECQcAEAAsAAAAABAAEAAABWQgJI5kSQ6NYK7Dw6xr8hCw+ELC85hCIAq3Am0U6JUKjkHJNzIsFAqDqShQHRhY6bKqgvgGCZOSFDhAUiWCYQwJSxGHKqGAE/5EqIHBjOgyRQELCBB7EAQHfySDhGYQdDWGQyUhADs=',
      text: '...',
      useImage: false
    },

    toolsGeneralButtons: [
      {
        name: 'Whois',
        action: function(){window.open(ujs_seob.whoisUrl.replace(/%s{1}/, location.protocol + '//' + location.host));}
      },

      {
        name: 'Robots.txt',
        action: function(){window.open(location.protocol + '//' + location.host + '/robots.txt');}
      },

      {
        name: 'Google cache',
        action: function(){window.open('http://google.com/search?q=cache:' + location.href);}
      },

      {
        name: 'Yandex cache',
        action: function(){window.open('http://hghltd.yandex.net/yandbtm?url=' + encodeURIComponent(location.href));}
      },

      /*
      {
        name: 'SmartPageRank',
        action: function(){window.open('http://www.smartpagerank.com/result.php?domain=' + location.hostname);}
      },

      {
        name: 'SEOmoz',
        action: function(){window.open('http://www.seomoz.org/page-strength/' + location.href);}
      },
      */

      {
        name: 'Multi PR',
        title: 'Multi Datacenter Page Rank',
        action: function(){ujs_seob.multiDatacenterPR();}
      }
    ],

    /////////////////////////////////////////////////////////////////
    // permanent settings. do not edit

    version: {
      exact: '6.08.00',
      string: '6.08 for Opera 10.50 +',
      date: 'October 12, 2011',
      author: 'Mike Samokhvalov',
      email: 'mikivanch@gmail.com',
      homepage: 'http://www.puzzleclub.ru/files/seobar/',
      discussion: [
        ['english', 'http://my.opera.com/community/forums/topic.dml?id=178339', 'my.opera.com'],
        ['russian', 'http://operafan.net/forum/index.php?topic=1451.0', 'operafan.net']
      ]
    },

    languages: {
      en: {
        languageTitle: 'English',

        hide: 'Hide',
        show: 'Show',
        close: 'Close',
        refresh: 'Refresh',
        ratings: 'Ratings',
        tools: 'Tools',
        options: 'Options',
        more: 'Show hidden',
        less: 'Hide',
        ok: 'OK',
        cancel: 'Cancel',

        highlight: 'Highlight',
        example: 'Example',

        loadingWait: 'Loading, please wait.',

        panels: {
          main: 'Main',
          indexedPages: 'Indexed Pages',
          backwardLinks: 'Backward Links',
          directories: 'Directories',
          other: 'Other',
          update: 'Update'
        },

        optionsPanel: {
          disableScript: 'Disable script',

          storeDomainRatings: 'Store domain ratings',
          storeDomainRatingsText: 'Keep domain ratings in cookies to minimize the use of traffic. By default the ratings are updated 1 each day.',

          checkFakeGooglePR: 'Check fake Google PR',

          hElements: 'Elements',
          hDisplay: 'Display',
          hAlways: 'Always',
          hByRequest: 'By request',
          hNever: 'Never',
          hButtons: 'Buttons',

          hPosition: 'Position',
          fixed: 'Fixed',
          absolute: 'Absolute',

          hLanguage: 'Language',

          deleteData: 'Delete SEObar\'s data',
          storageDomain: 'Storage domain'
        },

        toolsPanel: {
          general: 'General',
          linkStatistics: 'Link Statistics',
          metaTags: 'Meta Tags',
          httpHeaders: 'HTTP Headers'
        },

        links: {
          total: 'Total Links',
          internal: 'Internal',
          subdomain: 'Subdomain',
          external: 'External',
          text: 'Text',
          image: 'Image'
        },

        seobar: {
          version: 'Version',
          date: 'Date',
          author: 'Author',
          homepage: 'Homepage',
          discussion: 'Discussion',
          english: 'English',
          russian: 'Russian',

          onOffButton: 'Seobar on/off button',
          onOffText: 'Drag and drop one of the buttons to your toolbar.',

          checkForUpdates: 'Check for updates',
          installed: 'New version of SEOBAR was installed. Do you want to delete an old data (recommended)?'
        },

        update: {
          available: 'Update available',
          unavailable: 'There are no new updates available.',
          download: 'Download',
          information: 'Information about this update'
        }
      }
    },

    lng: {},

    currentLanguage: 'en',

    SEObarState: true,

    anchorAttribute: {
      name: 'seobar',
      value: '1'
    },

    urlFilter: /\.(jpg|jpeg|gif|png|tif|tiff|bmp|txt|js|css|swf|pdf)$/i,

    style: {
      highlight: 'color: #000 !important; border: 1px dotted #000 !important; padding: 2px !important; display: inline-block !important;',
      noindex: 'background: #c8d0e7 !important; ',
      nofollow: 'background: #d2e7c7 !important; ',
      external: 'background: #eedfc1 !important; ',

      scrollbar: ''
    },

    frameStyle: 'img, embed, object {display: none !important;} iframe {content: "Frame";}',

    storage: new ujs_Storage('SEObar_storage'),
    urlToken: '#SEObar_frame_',
    busyRank: '...',
    getNextValueDelay: 10000, // milliseconds
    busyWaitDelay: 120000, // milliseconds

    elements: {
      main: [],
      indexedPages: [],
      backwardLinks: [],
      directories: [],
      other: [],
      update: []
    },

    // Show more/less button
    more: {
      main: false,
      indexedPages: false,
      backwardLinks: false,
      directories: false,
      other: false
    },

    // storage: frame id
    sFrameId: 'SEObar_storage_frame',
    panelId: 'SEObar_panel',
    mainStyleId: 'SEObar_main_style',
    highlightStyleId: 'SEObar_highlight_style',

    // Tools
    highlightNoindex: false,
    highlightNofollow: false,
    highlightExternalLinks: false,
    httpHeaders: '',

    currentToolTab: 0,
    bTools: false,
    currentRatingTab: 0,
    bRatings: false,
    bShowOptions: false,
    bCollapsedPanel: false,

    googleFrame: null,

    bInit: false,

    // options
    opFormId: 'SEObar_panel_options_form',

    op: [
      [false, 'SEObar_options_disable_script'],   // 0 Disable Script (true, false)
      [true, 'SEObar_options_store_ratings'],     // 1 Store Domain Ratings (true, false)
      [true, 'SEObar_options_check_fake_pr']      // 2 Check Fake PR (true, false)
    ],

    panelBtn: [
      {title: "ratings", value: 'R', display: 0},
      {title: "tools", value: 'T', display: 0},
      {title: "refresh", value: '&#8629;', display: 0},
      {title: "options", display: 0, nohide: false}
    ],

    opPosition: [
      [1, 'SEObar_options_location'],   // 0 Panel Location 1 (0 - Top Left, 1 - Top Right, 2 - Bottom Left, 3 - Bottom Right)
      [0, 'SEObar_options_position']    // 1 Panel Position (0 - fixed, 1 - absolute)
    ],

    mergeObjects: function(o1, o2)
    {
      for(var i in o2)
      {
        if(typeof(o2[i]) == 'object' && o1[i] && typeof(o1[i]) == 'object')
          ujs_seob.mergeObjects(o1[i], o2[i]);
        else
          o1[i] = o2[i];
      }
    },

    setLanguage: function(lng)
    {
      if(!lng)
        lng = 'en';

      if(lng != ujs_seob.currentLanguage || !ujs_seob.lng)
      {
        ujs_seob.lng = {};
        ujs_seob.mergeObjects(ujs_seob.lng, ujs_seob.languages.en);
      }

      if(lng && ujs_seob.languages[lng])
      {
        ujs_seob.mergeObjects(ujs_seob.lng, ujs_seob.languages[lng]);
        ujs_seob.currentLanguage = lng;
      }
      else
        ujs_seob.currentLanguage = 'en';
    },

    getDomainName: function(host)
    {
      var domain = host;
      var i = domain.indexOf('www.');
      if(i != -1)
        domain = domain.substr(i + 4);

      return domain;
    },

    getDomainNameFromUrl: function(url)
    {
      var d = url.match(/^http:\/\/([^\s\/]+)/i);
      if(d && d.length > 1)
        return d[1];

      return url;
    },

    postMessage: function(msg, doc, wnd)
    {
      window.postMessage ? wnd.postMessage(msg, '*') : doc.postMessage(msg, '*');
    },

    getMainDomainName: function(domain)
    {
      if(!domain.match(/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}/))
        return domain;

      var a = domain.split('.');
      var l = a.length;

      if(l == 2)
        return domain;

      return (a[l - 2] + '.' + a[l - 1]);
    },

    getFormElementByName: function(name)
    {
      if(!document.forms)
        return null;

      for(var i = 0; i < document.forms.length; i++)
      {
        if(document.forms[i][name])
          return document.forms[i][name];
      }

      return null;
    },

    getElementsByClassName: function(className, tagName, parent)
    {
      if(!parent)
        parent = document;

      var e = parent.getElementsByClassName(className);
      if(!tagName)
        return e;

      tagName = tagName.toUpperCase();

      var r = new Array();
      for(var i = 0; i < e.length; i++)
      {
        if(e[i].tagName == tagName)
          r.push(e[i]);
      }

      return r;
    },

    getParentElement: function(obj, id, className, tagName)
    {
      if(!obj || !obj.parentNode)
        return null;

      tagName = tagName.toLowerCase();

      var r = [];
      var re = new RegExp("(^|\\s+)" + className + "(\\s+|$)");

      var parent = obj;
      while(parent && parent != document.body && parent != document.documentElement)
      {
        parent = parent.parentNode;

        if(id && (!parent.id || id != parent.id))
          continue;

        if(className && (!parent.className || parent.className.search(re) == -1))
          continue;

        if(!tagName || tagName == parent.tagName.toLowerCase())
          return parent;
      };

      return null;
    },

    appendStyle: function(id, css)
    {
      var s = document.createElement('style');
      s.id = id;
      s.setAttribute('type', 'text/css');
      s.setAttribute('style', 'display:none !important;');
      s.appendChild(document.createTextNode(css));
      document.documentElement.appendChild(s);
    },

    createStyle: function()
    {
      var font = (
        'font-family: ' + ujs_seob.fontFamily + ' !important;'
        + 'font-size: ' + ujs_seob.fontSize + ' !important;'
      );

      var loc = '';
      switch(ujs_seob.opPosition[0][0])
      {
        case 0:
          loc = 'top:0 !important; bottom:auto !important; left:0 !important; right:auto !important;';
          break;
        case 1:
          loc = 'top:0 !important; bottom:auto !important; left:auto !important; right:0 !important;';
          break;
        case 2:
          loc = 'top:auto !important; bottom:0 !important; left:0 !important; right:auto !important;';
          break;
        case 3:
          loc = 'top:auto !important; bottom:0 !important; left:auto !important; right:0 !important;';
          break;
        default:
          loc = 'top:0 !important; bottom:auto !important; left:auto !important; right:0 !important;';
      }

      var pos = 'position: fixed !important;';
      if(ujs_seob.opPosition[1][0] == 1)
        pos = 'position: absolute !important;';


      var input = ujs_seob.getInputStyle();

      var css = (
        "#SEObar_panel, #SEObar_panel * {color: black !important; background-image: none !important; border: none !important; outline: none !important;" + font + " font-weight: normal !important; margin: auto !important; width: auto !important; height: auto !important; float: none !important; word-spacing: normal !important; white-space: normal !important; text-align: left !important; text-indent: 0 !important;} "
        +"#SEObar_panel {" + loc + pos + " background: white !important; border: 1px solid black !important; border-radius: 3px; padding: 3px !important; z-index: 9999 !important; display: block !important; text-align: right !important; vertical-align: middle !important;} "
        +"#SEObar_panel div#SEObar_panel_box {text-align: right !important; vertical-align: middle !important;} "
        +"#SEObar_panel img {vertical-align: middle !important;} "
        +"#SEObar_panel a:link, #SEObar_panel a:visited {background: white !important; text-decoration: none !important; line-height: normal !important;} "
        +"#SEObar_panel a:hover, #SEObar_panel a:active {background: white !important; color: #0000cc !important; text-decoration: none !important; line-height: normal !important;} "
        +"#SEObar_panel b {background: white !important; color: #404040 !important; line-height: normal !important; font-weight: bold !important;} "
        +"#SEObar_panel .right {text-align: right !important;} "
        +"#SEObar_panel .line {border-top: 1px solid #d0d0d0 !important; font-size: 0 !important; margin: 0 0 10px 0 !important; padding: 0 !important; display: block !important; width: 100% !important;} "
        +"#SEObar_panel input {display: inline !important;} "
        +"#SEObar_panel input[type=checkbox] {" + input + "} "
        +"#SEObar_panel input[type=radio] {" + input + "} "
        +"#SEObar_panel input[type=button] {background: white !important; border: 1px solid #a0a0a0 !important; border-radius: 3px; text-align: center !important; vertical-align: middle !important; padding: 1px 10px !important; min-width: 90px !important;} "
        +"#SEObar_panel input.SEObar_panel_btn {background: white !important; border: 1px solid #a0a0a0 !important; border-radius: 3px; min-width: 60px !important; height: 17px !important; padding: 0 2px !important;} "
        +"#SEObar_panel input.SEObar_panel_btn[selected] {background: #f0f0f0 !important;} "
        +"#SEObar_panel input.SEObar_panel_sbtn {background: white !important; border: 1px solid #a0a0a0 !important; border-radius: 3px; min-width: 16px !important; width: 16px !important; height: 17px !important; padding: 0 !important; line-height: normal !important;} "
        +"#SEObar_panel input.SEObar_panel_sbtn[selected] {background: #f0f0f0 !important;} "
        +"#SEObar_panel .pointer {cursor: pointer !important;} "
        +"#SEObar_panel_addon {background: white !important; border-top: 1px solid #a0a0a0 !important; padding: 6px !important; margin-top: 4px !important; text-align: left !important;} "
        +"#SEObar_panel_addon div#SEObar_panel_addon_h2 {color: #404040 !important; background: #f0f0f0 !important; border: 1px solid #d0d0d0 !important; border-radius: 3px; font-size: " + ujs_seob.sectionHeaderFontSize + " !important; font-weight: bold !important; margin-bottom: 10px !important; padding: 3px 3px !important; text-align: center !important; display: block !important;} "
        +"#SEObar_panel_addon a:link, #SEObar_panel_addon a:visited {color: #0000cc !important; text-decoration: underline !important; } "
        +"#SEObar_panel_addon a:hover, #SEObar_panel_addon a:active {color: #f06200 !important; text-decoration: underline !important;} "
        +"#SEObar_panel_addon form {background: white !important; padding: 0 !important;} "
        +"#SEObar_panel_addon label {background: white !important; display: inline !important; vertical-align: middle !important;} "
        +"#SEObar_panel_addon input {vertical-align: middle !important;} "
        +"#SEObar_panel_addon div.overflow {height: 186px !important; overflow: auto !important; padding: 0 20px 0 0 !important; border: 1px solid #d0d0d0 !important;} "
        +"#SEObar_panel_addon div.overflow table {margin: -1px 0 0 -1px !important; min-width: 360px !important;} "
        +"#SEObar_panel_addon div.overflow table th {text-align: center !important; vertical-align: middle !important; font-weight: bold !important; background-color: #f0f0f0 !important;} "
        +"#SEObar_panel_addon table {background: white !important; empty-cells: show !important; border-collapse: collapse !important; padding: 0 !important;} "
        +"#SEObar_panel_addon table.main td {background: white !important; padding-left: 10px !important; vertical-align: top !important;} "
        +"#SEObar_panel_addon table.main td.left {padding-left: 0 !important;} "
        +"#SEObar_panel_addon table.options {margin: auto !important} "
        +"#SEObar_panel_addon table.options th, #SEObar_panel_addon table.options td {background: white !important; border: 1px solid #d0d0d0 !important; padding: 2px 6px !important;} "
        +"#SEObar_panel_addon table.options td.SEObar_panel_subhdr {color: #0000cc !important; background: #fafafa !important;} "
        +"#SEObar_panel_addon .SEObar_panel_gray_text {color: #808080 !important;} "
        +"#SEObar_opt_pos_box {margin-top: 5px !important;} "
        +"#SEObar_opt_loc_box {float: left !important; margin-right: 30px !important; text-align: center !important;} "
        +"#SEObar_opt_loc_box .SEObar_disp_1{display: inline-block !important; border: 3px solid #d0d0d0 !important; border-radius: 5px; background: #f0f0f0 !important;} "
        +"#SEObar_opt_loc_box .SEObar_disp_2{margin: 0 auto !important; width: 8px !important; height: 8px !important; background: #d0d0d0 !important; overflow: hidden !important;} "
        +"#SEObar_opt_loc_box .SEObar_disp_3{width: 30px !important; height: 3px !important; background: #d0d0d0 !important; overflow: hidden !important;} "
        +"#SEObar_opt_loc_box input.SEObar_r {margin-left: 30px !important;} "
        +"#SEObar_opt_pos {float: left !important; padding: 2px 0 !important;} "
        +"#SEObar_panel_addon .SEObar_clear {font-size: 0 !important; height: 0 !important; clear: both !important;} "

        +"#SEObar_panel_addon ul#SEObar_tabs {background: white !important; list-style: none !important; padding: 0 5px !important; margin: 0 !important;} "
        +"#SEObar_panel_addon ul#SEObar_tabs li {background: white !important; float: left !important; border: 1px solid #d0d0d0 !important; border-radius: 3px 3px 0 0; border-left: none !important; border-bottom-width: 0 !important; margin: 0 !important; padding: 0 !important; line-height: normal !important;} "
        +"#SEObar_panel_addon ul#SEObar_tabs li.first_tab {border-left: 1px solid #d0d0d0 !important;} "
        +"#SEObar_panel_addon ul#SEObar_tabs a {color: #000 !important; background: #f0f0f0 !important; text-decoration: none !important; display: block !important; padding: 1px 10px !important; text-align: center !important;} "
        +"#SEObar_panel_addon ul#SEObar_tabs a:hover {background: #fff !important;} "
        +"#SEObar_panel_addon ul#SEObar_tabs #selected_tab a {position: relative !important; top: 1px !important; background: white !important;} "
        +"#SEObar_panel_addon div#tab_content {border: 1px solid #d0d0d0 !important; border-radius: 3px; clear: both !important; padding: 10px !important; margin-left: 0 !important; line-height: 1.4 !important; width: 450px !important; height: auto !important; max-height: 300px !important; min-height: 100px !important; overflow: auto !important;}  "
        +"#SEObar_panel_addon div#tab_content table {margin: 0 !important; width: 100% !important;} "
        +"#SEObar_panel_addon div#tab_content table td {background: white !important; padding: 1px 10px !important; vertical-align: top !important; border: 1px solid #e0e0e0 !important; width: auto !important; line-height: 1.8 !important;} "
        +"#SEObar_panel_addon div#tab_content table td.hdr {color: #404040 !important; max-width: 33% !important; white-space: nowrap !important; font-weight: bold !important;} "
        +"#SEObar_panel_addon div#tab_content table td:last-child  {width: 100% !important;} "
        +"#SEObar_panel_addon div#tab_content table td.separator {border-left: none !important; border-right: none !important;} "
        +"#SEObar_panel_addon div#tab_content table.noborder td {border: none !important;} "
        +"#SEObar_panel_addon div#tab_content table.noborder td:first-child {padding-left: 0 !important;} "
        +"#SEObar_panel_addon div#tab_content table.noborder td:last-child {padding-right: 0 !important;} "
        +"#SEObar_panel_addon div#tab_content div.float_cnt {margin: 0 0 0 -10px !important; clear: both !important;} "
        +"#SEObar_panel_addon div#tab_content .float_obj {display: block !important; float: left !important; margin: 3px 0 0 10px !important;} "
      );
      ujs_seob.appendStyle(ujs_seob.mainStyleId, css);
    },

    getInputStyle: function()
    {
      var s = '', bg = 'color: #000 !important; background-color: transparent !important;';

      var input = document.createElement('input');
      input.setAttribute('type', 'checkbox');
      input.setAttribute('style', 'display:none !important;');
      input = document.documentElement.appendChild(input);

      if(input.currentStyle.backgroundColor != 'transparent')
        s = bg;

      input.parentNode.removeChild(input);
      return s;
    },

    parseQuery: function()
    {
      var k = new Array();
      var re = /[?&]([^=]+)(?:=([^&]*))?/g;
      while(m = re.exec(window.location.search))
      {
        if(m[1] && m[2])
          k[m[1]] = m[2];
        else if(m[1])
          k[m[1]] = '';
      };
      return k;
    },

    getAnchorAttribute: function()
    {
      return ujs_seob.anchorAttribute.name + '="' + ujs_seob.anchorAttribute.value + '"';
    },

    addElement: function(element)
    {
      if(element.frame.url)
        element.frame.url += ujs_seob.urlToken + element.frame.frameToken;

      if(element.frame.deleteFrame == undefined)
        element.frame.deleteFrame = ujs_seob.removeFrames;

      if(element.frame.style == undefined)
        element.frame.style = ujs_seob.frameStyle;

      var f = new ujs_seobarFrame();
      for(var i in element.frame)
        f[i] = element.frame[i];

      element.frame = f;

      if(!element.parse)
        element.parse = ujs_seob.parseData;

      if(!element.format)
        element.format = ujs_seob.formatData;
    },

    addElementToMainPanel: function(element)
    {
      if(!element.parse)
        element.parse = ujs_seob.parseMaindata;

      if(!element.format)
        element.format = ujs_seob.formatMainData;

      if(!element.formatStatusbar)
        element.formatStatusbar = ujs_seob.formatStatusbar;

      ujs_seob.addElement(element);
      element.frame.getDataFunction = ujs_seob.getMainRatings;
      ujs_seob.elements.main.push(element);
    },

    addElementToIndexedPagesPanel: function(element)
    {
      ujs_seob.addElement(element);
      element.frame.getDataFunction = ujs_seob.getIndexedPagesRatings;
      ujs_seob.elements.indexedPages.push(element);
    },

    addElementToBackwardLinksPanel: function(element)
    {
      ujs_seob.addElement(element);
      element.frame.getDataFunction = ujs_seob.getBackwardLinksRatings;
      ujs_seob.elements.backwardLinks.push(element);
    },

    addElementToDirectoriesPanel: function(element)
    {
      ujs_seob.addElement(element);
      element.frame.getDataFunction = ujs_seob.getDirectoriesRatings;
      ujs_seob.elements.directories.push(element);
    },

    addElementOtherPanel: function(element)
    {
      ujs_seob.addElement(element);
      element.frame.getDataFunction = ujs_seob.getOtherRatings;
      ujs_seob.elements.other.push(element);
    },

    isEmpty: function(d)
    {
      if(!d && typeof(d) != 'number')
        return true;

      return false;
    },

    parseData: function(element, data)
    {
      if(ujs_seob.isEmpty(data))
        element.data[0].value = ujs_seob.undefinedRank;
      else
        element.data[0].value = data;

      ujs_seob.setPanelData();

      for(var i = 0; i < element.data.length; i++)
      {
        if(element.data[i].store)
        {
          ujs_seob.saveDomainInfo();
          break;
        }
      }
    },

    parseMaindata: function(element, data)
    {
      ujs_seob.parseData(element, data);
      ujs_seob.setStatusbarData();
    },

    formatData: function(element, mode)
    {
      var d = null;
      if(element.data[0].display <= mode)
      {
        if(!ujs_seob.isEmpty(element.data[0].value))
        {
          if(element.data[0].value == ujs_seob.busyRank)
            d = ujs_seob.getBusyIndicator();
          else
            d = element.data[0].value;
        }
        else
          d = ujs_seob.unrequestedRank;
      }

      return d;
    },

    formatMainData: function(element, mode)
    {
      var a = '', res = null;
      if(element.data[0].display <= mode)
      {
        if(element.data[0].value == ujs_seob.busyRank)
          a = ujs_seob.getBusyIndicator();

        if(!ujs_seob.isEmpty(element.data[0].value))
          a = element.data[0].value;
        else
          a = ujs_seob.unrequestedRank;

        var res = '<b>' + element.title + '</b>:&nbsp;';
        if(element.frame.checkUrl)
          res += '<a href="' + element.frame.checkUrl + '" ' + ujs_seob.anchorAttribute.name + '="' + ujs_seob.anchorAttribute.value + '">' + a + '</a>';
        else
          res += a;
      }

      return res;
    },

    formatStatusbar: function(element, mode)
    {
      if(element.data[0].display <= mode)
        return element.title + ': ' + element.data[0].value;

      return null;
    },

    initMainElements: function()
    {
      var url = window.location.href;
      var protocol = window.location.protocol;
      var host = window.location.host;
      var domain = ujs_seob.getDomainName(host);


      ///////////////////////////////////////////////////////////////
      // Alexa
      var alexa = {
        title: 'Alexa',

        data: [
          {title: 'Alexa rank', value: '', display: 0, store: true},
          {title: 'Alexa domain name', value: '', display: 0, store: true}
        ],

        parse: function(element, data){
          var d = data.split(element.frame.dataSeparator);
          if(d.length > 0)
            element.data[0].value = d[0];
          if(d.length > 1)
            element.data[1].value = d[1];

          if(ujs_seob.isEmpty(element.data[0].value))
            element.data[0].value = ujs_seob.undefinedRank;

          ujs_seob.setStatusbarData();
          ujs_seob.setPanelData();
          ujs_seob.saveDomainInfo();
        },

        format: function(element, mode){
          var a = '';
          if(element.data[0].display <= mode)
          {
            if(element.data[0].value == ujs_seob.busyRank)
              a = ujs_seob.getBusyIndicator();

            if(!ujs_seob.isEmpty(element.data[0].value))
              a = element.data[0].value;
            else
              a = ujs_seob.unrequestedRank;

            if(element.data[1].display <= mode)
            {
              if(element.data[1].value)
                a += ' | ' + element.data[1].value;
            }

            a = '<b>' + element.title + '</b>:&nbsp;<a href="' + element.frame.checkUrl + '" ' + ujs_seob.getAnchorAttribute() + '>' + a + '</a>';
          }

          return a;
        },

        frame: {
          msgPrefix: 'SEObar_Alexa_Rank',
          frameId: 'SEObar_alexa_frame',
          frameToken: 'AlexaRank',
          url: 'http://xml.alexa.com/data?cli=10&dat=nsa&url=' + escape(url),
          checkUrl: 'http://www.alexa.com/data/details/main?url=' + protocol + '//' + host,
          domain: '',
          style: '',
          isObjectLoaded: function(){return false;},

          getDataFromDocumentFunction: function(frame){
            var rank = '';
            var popularity = document.getElementsByTagName('POPULARITY');
            if(popularity && popularity.length > 0)
            {
              rank = popularity.item(0).attributes.getNamedItem('TEXT').nodeValue;
              if(rank)
                rank = ujs_seob.groupDigits(rank);

              var domain = popularity.item(0).attributes.getNamedItem('URL').nodeValue;
              if(domain)
              {
                if(domain.charAt(domain.length - 1) == '/')
                  domain = domain.substr(0, domain.length - 1);

                rank += frame.dataSeparator + domain;
              }
            }
            return rank;
          }
        }
      };

      ujs_seob.addElementToMainPanel(alexa);


      ///////////////////////////////////////////////////////////////
      // Google
      var google = {
        title: 'Google',

        data: [
          {title: 'Google page rank', value: '', display: 0, store: false},
          {title: '', value: '', display: -1, store: false} // Google real url (fake pr checker)
        ],

        parse: function(element, data){
          if(data.indexOf('|') != -1)
          {
            var p = data.split('|');
            if(p.length > 0)
              element.data[0].value = p[0];
            if(p.length > 1)
              element.data[1].value = p[1];
          }
          else
            element.data[0].value = data;

          if(ujs_seob.isEmpty(element.data[0].value))
            element.data[0].value = ujs_seob.undefinedRank;

          ujs_seob.setStatusbarData();
          ujs_seob.setPanelData();
        },

        format: function(element, mode){
          var res = '';
          if(element.data[0].display <= mode)
          {
            if(element.data[0].value == ujs_seob.busyRank)
              a = ujs_seob.getBusyIndicator();

            if(!ujs_seob.isEmpty(element.data[0].value))
            {
              a = element.data[0].value;
              if(a != ujs_seob.getBusyIndicator() && a != ujs_seob.unrequestedRank)
                ujs_seob.removeObject(element.frame.frameId);
            }
            else
              a = ujs_seob.unrequestedRank;

            var url1 = 'http://www.google.com/search?hl=en&q=info:' + encodeURIComponent(window.location.href) + '&btnG=Search';
            var url2 = 'http://google.com/search?hl=en&q=cache:' + encodeURIComponent(window.location.href);
            var onclick = 'ujs_seob.checkForFakePR(\u0027' + url1 + '\u0027, \u0027' + url2 + '\u0027);'

            var res = '';
            if(element.data[1].value)
              res = '<b class="pointer" style="color:#f00 !important;" title="Fake PR! Real URL: ' + element.data[1].value + '" onclick="' + onclick + '">' + element.title + '</b>:&nbsp;';
            else
              res = '<b class="pointer" onclick="' + onclick + '">' + element.title + '</b>:&nbsp;';

            res += '<a href="' + element.frame.checkUrl + '" ' + ujs_seob.getAnchorAttribute() + '>' + a + '</a>';
            return res;
          }

          return res;
        },

        frame: {
          msgPrefix: 'SEObar_Google_PR',
          frameId: 'SEObar_google_frame',
          frameToken: 'GooglePR',
          url: '',
          checkUrl: '',
          domain: 'toolbarqueries.google.com',
          style: '',
          deleteFrame: ujs_seob.op[2][0],
          isObjectLoaded: function(){return false;},

          getDataFromDocumentFunction: function(frame){
            frame.autoPostMessage = false;
            var url = location.hash.replace(/^#+/g, '');
            
            ujs_seob.request(url, function(r){
              var data = '';
              var rank = '';
              
              if(r.responseText)
              {            
                var rank = r.responseText;
                if(rank)
                {
                  var res = rank.match(/Rank_\d{1}:\d{1}:([\d]+)/);
                  rank = '';
                  if(res && res.length > 1)
                  {
                    rank = res[1];
                  }
                }
                
                var msg = frame.msgPrefix + frame.msg + frame.msgSeparator + frame.frameToken;
                msg += frame.msgSeparator + rank;
                ujs_seob.postMessage(msg, window.parent.document, window.parent);
              }  

              if(window.location.host.indexOf(frame.domain) >= 0 &&
                window.location.hash.indexOf(ujs_seob.urlToken + frame.frameToken) >= 0)
              {
                if(ujs_seob.op[2][0])
                {
                  var q = location.href.match(/(?:\?|&)q=([^\s\"'&#]+)/i);
                  if(q && q.length > 1)
                  {
                    //frame.autoPostMessage = false;

                    var url = 'http://' + location.host + '/search?hl=en&q=' + q[1] + '&btnG=Search';
                    ujs_seob.request(url, function(r){
                      var data = '';
                      if(r.responseText)
                      {                        
                        var u = r.responseText.match(/\<a\s+(?:[^\<\>\r\n]+\s+)*href=[\"\']?([^\s\"\']+)[\"\']?\s+(?:[^\<\>\r\n]+\s+)*class=[\"\']?l[\"\']?[\s\>\/]/i);
                        if(u && u.length > 1)
                          u = u[1];

                        if(u)
                        {
                          var a1 = document.createElement('a');
                          if(u.search(/^http:\/\//i) == -1)
                            a1.href = 'http://' + u;
                          else
                            a1.href = u;

                          var u1 = a1.host + '/' + a1.pathname;
                          u1 = u1.replace(/^(www\.)?/i, '');

                          var a2 = document.createElement('a');
                          var u2 = unescape(q[1]).replace(/^info:?/i, '');
                          if(u2.search(/^http:\/\//i) == -1)
                            a2.href = 'http://' + u2;
                          else
                            a2.href = u2;

                          u2 = a2.host + '/' + a2.pathname;
                          u2 = u2.replace(/^(www\.)?/i, '');

                          if(u1.toLowerCase() != u2.toLowerCase())
                            data = rank + '|' + u;
                        }
                      }

                      if(!data)
                        data = rank + '|';

                      frame.deleteFrame = ujs_seob.removeFrames;
                      var msg = frame.msgPrefix + frame.msg + frame.msgSeparator + frame.frameToken;
                      if(data)
                      {
                        data = encodeURIComponent(data);
                      }
                      msg += frame.msgSeparator + data;
                      ujs_seob.postMessage(msg, window.parent.document, window.parent);
                    });
                  }
                }
              }
              else
              {
                frame.deleteFrame = ujs_seob.removeFrames;
                var msg = frame.msgPrefix + frame.msg + frame.msgSeparator + frame.frameToken;
                msg += frame.msgSeparator + '';
                ujs_seob.postMessage(msg, window.parent.document, window.parent);
              }
            });
          }
        }
      };

      function gpr_toHex8(n){return(n<16?"0":"")+n.toString(16);}
      function gpr_hexEncodeU32(n){var r=gpr_toHex8(n>>>24);r+=gpr_toHex8(n>>>16&255);r+=gpr_toHex8(n>>>8&255);r+=gpr_toHex8(n&255);return r;}
      function gpr_ch(value){var hashSeed="Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. Yes, I'm talking to you, scammer.";var p=16909125;for(var i=0;i<value.length;i++){p^=hashSeed.charCodeAt(i%hashSeed.length)^value.charCodeAt(i);p=p>>>23|p<<9;}return "8"+gpr_hexEncodeU32(p);};

      google.frame.gpr_toHex8 = gpr_toHex8;
      google.frame.gpr_hexEncodeU32 = gpr_hexEncodeU32;
      google.frame.gpr_ch = gpr_ch;

      google.frame.getSrc=function(host, url){return 'http://' + host + '/tbr?client=navclient-auto&ch=' + gpr_ch(url) + '&features=Rank&q=info:' + escape(url);}
      google.frame.checkUrl = google.frame.getSrc('toolbarqueries.google.com', url);
      google.frame.url = 'http://toolbarqueries.google.com/search#' + google.frame.checkUrl;

      google.frame.createFrame = function(frame){
        var gDiv = document.createElement('DIV');
        gDiv.setAttribute('style', 'display: none !important;');
        var gFrame = '<iframe src="' + frame.url + '"';
        gFrame += ' id="' + frame.frameId  + '" width="0" height="0" frameborder="0" scrolling="no">';
        gDiv.innerHTML = gFrame;
        document.documentElement.appendChild(gDiv);
      };

      ujs_seob.addElementToMainPanel(google);
      ujs_seob.googleFrame = google.frame;


      ///////////////////////////////////////////////////////////////
      // Yandex
      var yandex = {
        title: 'Yandex',

        data: [
          {title: 'Yandex tCY value', value: '', display: 0, store: true},
          {title: 'Yandex rank', value: '', display: 0, store: true},
          {title: 'Yandex additional info', value: '', display: 0, store: false},
          {title: '', value: '', display: -1, store: true} // Yandex real url
        ],

        parse: function(element, data){
          var d = data.split('#'), tcy = '', info = '';
          if(d.length > 0)
          {
            tcy = d[0].split('|');
            if(tcy.length > 0)
              element.data[0].value = tcy[0];
            if(tcy.length > 1)
              element.data[1].value = tcy[1];
            if(tcy.length > 2)
            {
              var d1 = tcy[2].replace(/^www\./i, '');
              var d1 = d1.replace(/\:\d+$/, '');
              var d1 = d1.toLowerCase();

              var d2 = window.location.hostname.replace(/^www\./i, '');
              d2 = d2.toLowerCase();

              if(d1 != d2)
                element.data[3].value = tcy[2];
            }
          }
          if(d.length > 1)
            element.data[2].value = d[1];

          if(ujs_seob.isEmpty(element.data[0].value))
            element.data[0].value = ujs_seob.undefinedRank;

          if(ujs_seob.isEmpty(element.data[1].value))
            element.data[1].value = ujs_seob.undefinedRank;

          ujs_seob.setStatusbarData();
          ujs_seob.setPanelData();
          ujs_seob.saveDomainInfo();
        },

        formatText: function(element, mode){
          var v = '', r = '';
          if(element.data[0].display <= mode)
          {
            if(element.data[0].value == ujs_seob.busyRank)
              return ujs_seob.getBusyIndicator();

            if(!ujs_seob.isEmpty(element.data[0].value))
              v = element.data[0].value;
            else
              v = ujs_seob.unrequestedRank;
          }

          if(element.data[1].display <= mode)
          {
            if(element.data[1].value == ujs_seob.busyRank)
              return ujs_seob.getBusyIndicator();

            if(!ujs_seob.isEmpty(element.data[1].value))
              r = element.data[1].value;
            else
              r = ujs_seob.unrequestedRank;
          }

          if(v == ujs_seob.unrequestedRank && v == r)
            return ujs_seob.unrequestedRank;

          if(v && r)
            return v + ' | ' + r;
          else if(v)
            return v;
          else (r)
            return r;

          return '';
        },

        format: function(element, mode){
          var a = element.formatText(element, mode);
          var res = '';

          if(a)
          {
            var url = 'http://search.yaca.yandex.ru/yca/cy/ch/' + ujs_seob.getDomainName(window.location.host) + '/';
            var onclick = 'var w = window.open(); w.location.href = \x27' + url + '\x27';

            res = '<b class="pointer" onclick="' + onclick + '">' + element.title + '</b>:&nbsp;';
            if(element.data[3].value)
              res = '<b class="pointer" style="color:#f00 !important;" title="Fake tCY! Real domain: ' + element.data[3].value + '" onclick="' + onclick + '">' + element.title + '</b>:&nbsp;';

            res += '<a href="' + element.frame.checkUrl + '"';
            if(element.data[2].value && element.data[2].display <= mode)
              res += ' title="' + element.data[2].value + '" ';

            res += ujs_seob.getAnchorAttribute() + '>' + a + '</a>';
          }
          return res;
        },

        formatStatusbar: function(element, mode){
          var a = element.formatText(element, mode);
          if(a)
          {
            var res = element.title + ': ' + a;
            if(element.data[2].value && element.data[2].display <= mode)
              res += ' [' + element.data[2].value + ']';

            return res;
          }

          return '';
        },

        frame: {
          msgPrefix: 'SEObar_Yandex_tCY',
          frameId: 'SEObar_yandex_frame',
          frameToken: 'YandexTCY',
          url: '',
          checkUrl: 'http://www.yandex.ru/cy?base=0&host=' + protocol + '//' + host,
          domain: 'bar-navig.yandex.ru',
          style: '',
          isObjectLoaded: function(){return false;},

          getDataFromDocumentFunction: function(frame){
            var rank = '';
            var obj = document.getElementsByTagName('tcy');
            if(obj && obj.length > 0)
            {
              var res = obj.item(0).attributes.getNamedItem('value').nodeValue;
              if(res)
              {
                rank = ujs_seob.groupDigits(res);

                res = obj.item(0).attributes.getNamedItem('rang').nodeValue;
                if(res)
                {
                  rank += '|' + res;
                }

                obj = document.getElementsByTagName('url');
                if(obj && obj.length > 0)
                {
                  var real_domain = obj.item(0).attributes.getNamedItem('domain').nodeValue;
                  if(real_domain)
                  {
                    rank += '|' + real_domain;
                  }
                }

                obj = document.getElementsByTagName('textinfo');
                if(obj && obj.length > 0)
                {
                  res = obj.item(0).childNodes[0].nodeValue;
                  if(res)
                  {
                    var info = res.split('\n');
                    if(info.length > 0)
                    {
                      res = '';
                      var sep = '';
                      for(var i = 0; i < info.length; i++)
                      {
                        if(info[i])
                        {
                          res += sep + info[i];
                          sep = ' | ';
                        }
                      }
                    }

                    rank += '#' + res;
                  }
                }
              }
            }
            else
            {
              var img = document.getElementsByTagName('img');
              if(img && img.length > 0)
              {
                img = img[0];
                var r = '', i = '';

                if(img.src)
                {
                  var t = img.src.match(/yandex\.ru\/bar\/i\/pr\/pr(\d+)\.gif/i);
                  if(t && t.length > 1)
                    r = t[1];
                }

                if(img.title)
                {
                  var i = img.title.match(/[\u0442\u0422][\u0435\u0415][\u043c\u041c][\u0430\u0410][\u0442\u0422][\u0438\u0418][\u0447\u0427][\u0435\u0415][\u0441\u0421][\u043a\u041a][\u0438\u0418][\u0439\u0419]\s+[\u0438\u0418][\u0446\u0426]\s*-\s*(\d+)(?:\s*[\u0442\u0422][\u0435\u0415][\u043c\u041c][\u0430\u0410]:\s*(.+)\s*[\u0438\u0418][\u0441\u0421][\u0442\u0422][\u043e\u041e][\u0447\u0427][\u043d\u041d][\u0438\u0418][\u043a\u041a]:)?/i);
                  if(i && i.length > 1)
                  {
                    rank = ujs_seob.groupDigits(i[1]);
                    if(r)
                      rank += '|' + r;

                    if(i.length > 2)
                      rank += '#' + i[2];
                  }
                }
              }
            }

            if(!rank)
              frame.deleteFrame = false;

            return rank;
          }
        }
      };

      yandex.frame.updateUrl = function(frame){
        frame.url = 'http://bar-navig.yandex.ru/u?ver=4.0.0&show=1&rnd=' + (new Date()).getTime() + Math.random() + '&url=' + escape(url) + ujs_seob.urlToken + frame.frameToken;
      };

      ujs_seob.addElementToMainPanel(yandex);
    },


    initIndexedPagesElements: function()
    {
      var url = window.location.href;
      var protocol = window.location.protocol;
      var host = window.location.host;
      var domain = ujs_seob.getDomainName(host);


      ///////////////////////////////////////////////////////////////
      // Google
      var google = {
        title: 'Google',

        data: [{title: 'Google', value: '', display: 0, store: true}],

        frame: {
          msgPrefix: 'SEObar_index_Google',
          frameId: 'SEObar_index_google_frame',
          frameToken: 'indexGoogle',
          url: '',
          checkUrl: 'http://www.google.com/search?hl=en&lr=&q=site%3A' + host + '&btnG=Search',
          domain: 'www.google.com',
          isObjectLoaded: function(){
            if(document.getElementById('res')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementById('resultStats');
            if(obj)
            {
              var txt = obj.innerText;
              var res = txt.match(/(?:about\s*)?([\d,]+)\s+result/i);
              if(res && res.length > 1)
              {
                info = res[1].replace(/,+/g, '');
                info = ujs_seob.groupDigits(info);
              }
            }
            return info;
          }
        }
      };

      google.frame.url = google.frame.checkUrl;
      ujs_seob.addElementToIndexedPagesPanel(google);


      ///////////////////////////////////////////////////////////////
      // Yahoo!
      var yahoo = {
        title: 'Yahoo!',

        data: [{title: 'Yahoo!', value: '', display: 0, store: true}],

        frame: {
          msgPrefix: 'SEObar_index_Yahoo',
          frameId: 'SEObar_index_yahoo_frame',
          frameToken: 'indexYahoo',
          url: '',
          checkUrl: 'http://search.yahoo.com/search?p=' + host,
          domain: 'search.yahoo.com',
          isObjectLoaded: function(){
            if(document.getElementById('web')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementById('resultCount');
            if(obj)
            {
              info = obj.innerText.match(/([\d,\x20]+)/i);
              if(info && info.length > 1)
              {
                info = info[1].replace(/[\x20,]+/g, '');
                info = ujs_seob.groupDigits(info);
              }
            }
            return info;
          }
        }
      };

      yahoo.frame.url = yahoo.frame.checkUrl;
      ujs_seob.addElementToIndexedPagesPanel(yahoo);


      ///////////////////////////////////////////////////////////////
      // Bing Indexed Pages
      var bing = {
        title: 'Bing',

        data: [{title: 'Bing', value: '', display: 0, store: true}],

        frame: {
          msgPrefix: 'SEObar_index_Bing',
          frameId: 'SEObar_index_bing_frame',
          frameToken: 'indexBing',
          url: '',
          checkUrl: 'http://www.bing.com/search?q=site%3A' + host + '&setlang=en-US&go=Search&form=QBRE',
          domain: 'www.bing.com',
          isObjectLoaded: function(){
            if(document.getElementById('results')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementById('count');
            if(obj && obj.innerText)
            {
              var r = /of\s*([\d,\s]+)/i.exec(obj.innerText)
              if(r && r.length > 1)
              {
                info = r[1].replace(/[\s,]+/g, '');
                info = ujs_seob.groupDigits(info);
              }
            }
            return info;
          }
        }
      };

      bing.frame.url = bing.frame.checkUrl;
      ujs_seob.addElementToIndexedPagesPanel(bing);


      ///////////////////////////////////////////////////////////////
      // Yandex Indexed Pages
      var yandex = {
        title: 'Yandex',

        data: [{title: 'Yandex', value: '', display: 0, store: true}],

        frame: {
          msgPrefix: 'SEObar_index_Yandex',
          frameId: 'SEObar_index_yandex_frame',
          frameToken: 'indexYandex',
          url: '',
          checkUrl: 'http://yandex.ru/yandsearch?surl=' + host + '&pag=u&numdoc=50&rd=0',
          domain: 'yandex.ru',
          isObjectLoaded: function(){
            var obj = ujs_seob.getElementsByClassName('moreInfo', 'div');
            if(obj && obj.length > 0) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var t = document.title;
            if(t)
            {
              var rank = t.match(/[\u043d\u041d][\u0430\u0410][\u0448\u0428][\u043b\u041b](?:[\u043e\u041e]|[\u0430\u0410]|[\u0438\u0418])[\u0441\u0421][\u044c\u042c]\s*(\d+)/i);
              if(!rank)
                rank = t.match(/[\u043d\u041d][\u0430\u0410][\u0448\u0428](?:[\u0435\u0415]|[\u0451\u0401])[\u043b\u041b][\u0441\u0421][\u044f\u042f]\s*(\d+)/i);

              if(rank && rank.length > 1)
              {
                rank = rank[1];
                if(t.search(/[\u0442\u0422][\u044b\u042b][\u0441\u0421]/i) != -1)
                  rank += '000';
                else if(t.search(/[\u043c\u041c][\u043b\u041b][\u043d\u041d]/i) != -1)
                  rank += '000000';

                info += ujs_seob.groupDigits(rank.toString());
              }
            }
            return info;
          }
        }
      };

      yandex.frame.url = yandex.frame.checkUrl;
      ujs_seob.addElementToIndexedPagesPanel(yandex);


      ///////////////////////////////////////////////////////////////
      // Rambler Indexed Pages
      var rambler = {
        title: 'Rambler',

        data: [{title: 'Rambler', value: '', display: 0, store: true}],

        frame: {
          msgPrefix: 'SEObar_index_Rambler',
          frameId: 'SEObar_index_rambler_frame',
          frameToken: 'indexRambler',
          url: '',
          checkUrl: 'http://www.rambler.ru/novasearch?set=www&query=' + host + '&pagelen=50&sort=0',
          domain: 'www.rambler.ru',
          isObjectLoaded: function(){
            var e = ujs_seob.getElementsByClassName('search-results', '', null);
            if(e && e.length > 0) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var e = ujs_seob.getElementsByClassName('report', 'div');
            if(e && e.length > 0)
            {
              var t = e[0].innerText;
              t = t.match(/\u0438\u0437\s*([\d\s\.,]+)\s*(\u0442\u044b\u0441|\u043c\u043b\u043d)?/i);
              if(t && t.length > 1)
              {
                 var r = t[1].replace(/[\s\.,]/ig, '');
                 r = parseInt(r);
                 if(!isNaN(r))
                 {
                   info = r.toString();
                   if(t.length > 2)
                   {
                     if(t[2] == '\u0442\u044b\u0441')
                      info += '000';
                     else if(t[2] == '\u043c\u043b\u043d')
                      info += '000000';
                   }

                   info = ujs_seob.groupDigits(info);

                 }
              }
            }

            return info;
          }
        }
      };

      rambler.frame.url = rambler.frame.checkUrl;
      ujs_seob.addElementToIndexedPagesPanel(rambler);
    },

    initBackwardLinksElements: function()
    {
      var url = window.location.href;
      var protocol = window.location.protocol;
      var host = window.location.host;
      var domain = ujs_seob.getDomainName(host);


      ///////////////////////////////////////////////////////////////
      // Google
      var google = {
        title: 'Google',

        data: [{title: 'Google', value: '', display: 0, store: true}],

        frame: {
          msgPrefix: 'SEObar_link_Google',
          frameId: 'SEObar_link_google_frame',
          frameToken: 'linkGoogle',
          url: '',
          checkUrl: 'http://www.google.com/search?hl=en&q=link%3A' + host + '&btnG=Search',
          domain: 'www.google.com',
          isObjectLoaded: function(){
            if(document.getElementById('res')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementById('resultStats');
            if(obj)
            {
              var txt = obj.innerText;
              var res = txt.match(/(?:about\s*)?([\d,]+)\s+result/i);
              if(res && res.length > 1)
              {
                info = res[1].replace(/,+/g, '');
                info = ujs_seob.groupDigits(info);
              }
            }
            return info;
          }
        }
      };

      google.frame.url = google.frame.checkUrl;
      ujs_seob.addElementToBackwardLinksPanel(google);


      ///////////////////////////////////////////////////////////////
      // Yahoo! URL
      var yahooUrl = {
        title: 'Yahoo! (URL)',

        data: [{title: 'Yahoo! URL', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_link_YahooUrl',
          frameId: 'SEObar_link_yahoourl_frame',
          frameToken: 'linkYahooUrl',
          url: '',
          checkUrl: 'http://search.yahoo.com/search?p=link%3A' + escape(url) + '+-site%3A' + domain + '&prssweb=Search&ei=UTF-8&x=wrt',
          domain: 'search.yahoo.com',
          isObjectLoaded: function(){
            if(document.getElementById('web')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementById('resultCount');
            if(obj)
            {
              info = obj.innerText.match(/([\d,\x20]+)/i);
              if(info && info.length > 1)
              {
                info = info[1].replace(/[\x20,]+/g, '');
                info = ujs_seob.groupDigits(info);
              }
            }
            return info;
          }
        }
      };

      yahooUrl.frame.url = yahooUrl.frame.checkUrl;
      ujs_seob.addElementToBackwardLinksPanel(yahooUrl);


      ///////////////////////////////////////////////////////////////
      // Yahoo! Domain Backward Links
      var yahooDomain = {
        title: 'Yahoo! (domain)',

        data: [{title: 'Yahoo! domain', value: '', display: 0, store: true}],

        frame: {
          msgPrefix: 'SEObar_link_YahooDomain',
          frameId: 'SEObar_link_yahoodomain_frame',
          frameToken: 'linkYahooDomain',
          url: '',
          checkUrl: 'http://search.yahoo.com/search?p=linkdomain%3A' + domain + '+-site%3A' + domain + '&prssweb=Search&ei=UTF-8&x=wrt',
          domain: 'search.yahoo.com',
          isObjectLoaded: function(){
            if(document.getElementById('web')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementById('resultCount');
            if(obj)
            {
              info = obj.innerText.match(/([\d,\x20]+)/i);
              if(info && info.length > 1)
              {
                info = info[1].replace(/[\x20,]+/g, '');
                info = ujs_seob.groupDigits(info);
              }
            }
            return info;
          }
        }
      };

      yahooDomain.frame.url = yahooDomain.frame.checkUrl;
      ujs_seob.addElementToBackwardLinksPanel(yahooDomain);
    },

    initDirectoriesElements: function()
    {
      var url = window.location.href;
      var protocol = window.location.protocol;
      var host = window.location.host;
      var domain = ujs_seob.getDomainName(host);

      var style = 'img, embed, object {display: none !important;}';
      style += ' iframe {content: "Frame";}';


      ///////////////////////////////////////////////////////////////
      // DMOZ
      var dmoz = {
        title: 'DMOZ',

        data: [{title: 'DMOZ', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_DMOZ',
          frameId: 'SEObar_dmoz_frame',
          frameToken: 'DMOZ',
          url: '',
          checkUrl: 'http://search.dmoz.org/cgi-bin/search?search=' + domain + '&all=no&cat=&t=s',
          domain: 'search.dmoz.org',
          isObjectLoaded: function(){
            if(document.getElementById('search')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementsByTagName('ol');
            if(obj && obj.length > 0)
            {
              var ol = obj[0];
              if(obj.length > 1)
                ol = obj[1];

              var u1 = '', u2 = '';
              var s = ujs_seob.getFormElementByName('search');
              if(s && s.value)
                u1 = s.value;
              else
                return info;

              u2 = 'http://www.' + u1 + '/';
              u1 = 'http://' + u1 + '/';

              var count = 0, sep = '';
              var li = ol.getElementsByTagName('li');
              for(var i = 0; i < li.length; i++)
              {
                var a = li.item(i).getElementsByTagName('a');
                if(a.length >= 3)
                {
                  var d = a.item(0).href.toString();
                  if(d.charAt(d.length - 1) != '/')
                    d += '/';
                  if(d.indexOf(u1) == 0 || d.indexOf(u2) == 0)
                  {
                    count++;
                    if(count > ujs_seob.maxDirectoryResults)
                    {
                      info += sep + '...';
                      break;
                    }

                    info += sep;
                    info += count.toString() + ') ';
                    info += '<a href="' + a.item(1).href + '"';
                    info += ' title="';

                    d = li.item(i).innerText;
                    if(d)
                    {
                      d = d.split('\n');
                      if(d && d.length > 0)
                      {
                        info += d[0].replace(/\x22/g, '&quot;');
                      }
                    }

                    info += '">';
                    info += a.item(1).innerText;
                    info += '</a>';
                    sep = '<br />';
                  }
                }
              }
            }
            return info;
          }
        }
      };

      dmoz.frame.url = dmoz.frame.checkUrl;
      ujs_seob.addElementToDirectoriesPanel(dmoz);


      ///////////////////////////////////////////////////////////////
      // Yahoo! Directory
      var yahoo = {
        title: 'Yahoo!',

        data: [{title: 'Yahoo! directory', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_Yahoo_Dir',
          frameId: 'SEObar_yahoodir_frame',
          frameToken: 'YahooDir',
          url: '',
          checkUrl: 'http://search.yahoo.com/search/dir?p=' + domain + '&ei=UTF-8&x=drt',
          domain: 'search.yahoo.com',
          isObjectLoaded: function(){
            if(document.getElementById('yschssbx')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementById('yschsp');
            if(!obj)
              return info;

            var u1 = obj.value;
            u1 = u1.replace(/"+/g, '');
            var u2 = 'www.' + u1;

            var parent = document.getElementById('yschweb');
            if(!parent)
              parent = document;

            var rubrics = new Array();

            var ol = parent.getElementsByTagName('ol');
            if(ol && ol.length > 0)
            {
              ol = ol[0];
              var li = ol.getElementsByTagName('li');

              var count = 0, sep = '';

              for(var i = 0; i < li.length; i++)
              {
                var href='', text = '', desc = '';

                var em = ujs_seob.getElementsByClassName('yschurl', 'em', li[i]);
                if(em && em.length > 0)
                {
                  var d = em[0].innerText.replace(/(:\d+)?\/.*/, '');
                  if(d == u1 || d == u2)
                  {
                    var yschabstr = ujs_seob.getElementsByClassName('yschabstr', 'div', li[i]);
                    if(yschabstr && yschabstr.length > 0)
                    {
                      desc = yschabstr[0].innerText;
                    }

                    var yschdircat = ujs_seob.getElementsByClassName('yschdircat', 'div', li[i]);
                    if(yschdircat && yschdircat.length > 0)
                    {
                      var a = yschdircat[0].getElementsByTagName('a');
                      if(a && a.length > 0)
                      {
                        a = a[0];
                        var href = a.href;
                        if(href)
                        {
                          var ind = href.indexOf('**');
                          if(ind >= 0)
                          {
                            href = href.substr(ind + 2);
                          }
                          href = unescape(href);
                          text = a.innerText;
                        }
                      }
                    }
                  }
                }

                if(href && text && !rubrics[text])
                {
                  count++;
                  rubrics[text] = 1;
                  if(count > ujs_seob.maxDirectoryResults)
                  {
                    info += sep + '...';
                    break;
                  }

                  info += sep + count.toString() + ') ';
                  info += '<a href="' + href +'" title="' + desc + '">' + text + '</a>';
                  sep = '<br />';
                }
              }
            }

            return info;
          }
        }
      };

      yahoo.frame.url = yahoo.frame.checkUrl;
      ujs_seob.addElementToDirectoriesPanel(yahoo);


      ///////////////////////////////////////////////////////////////
      // Yandex Catalog
      var yandex = {
        title: 'Yandex',

        data: [{title: 'Yandex catalogue', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_YaCa',
          frameId: 'SEObar_yaca_frame',
          frameToken: 'YaCa',
          url: '',
          checkUrl: 'http://search.yaca.yandex.ru/yca/cy/ch/' + domain + '/',
          domain: 'search.yaca.yandex.ru',
          isObjectLoaded: function(){
            var obj = ujs_seob.getElementsByClassName('content', 'table');
            if(obj && obj.length > 0) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = ujs_seob.getElementsByClassName('path2root', 'div');
            if(obj && obj.length > 0)
            {
              var a = obj[0].getElementsByTagName('a');
              var sep = '';
              for(var j = 0; j < a.length; j++)
              {
                info += sep;
                info += a.item(j).outerHTML;
                sep = ' / ';
              }
            }
            return info;
          }
        }
      };

      yandex.frame.url = yandex.frame.checkUrl;
      ujs_seob.addElementToDirectoriesPanel(yandex);


      ///////////////////////////////////////////////////////////////
      // Rambler Top100
      var rambler = {
        title: 'Rambler',

        data: [{title: 'Rambler Top100', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_Rambler_Top100',
          frameId: 'SEObar_ratop100_frame',
          frameToken: 'RamblerTop100',
          url: '',
          checkUrl: 'http://www.rambler.ru/cgi-bin/counter_search?words=' + domain,
          domain: 'www.rambler.ru',
          isObjectLoaded: function(){
            var obj = ujs_seob.getElementsByClassName('bottomSearchTable', 'div');
            if(obj && obj.lenght > 0) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var rubrics = ujs_seob.getElementsByClassName('rubrics', 'div');
            if(rubrics && rubrics.length > 0)
            {
              var a = rubrics[0].getElementsByTagName('a');
              var sep = '', count = 0;
              for(var i = 0; i < a.length; i++)
              {
                if(a[i].href && a[i].href.search(/\/cgi-bin\/counter_search\?/i) != -1)
                {
                  count++;
                  if(count > ujs_seob.maxDirectoryResults)
                  {
                    info += sep + '...';
                    break;
                  }

                  info += sep + '<a href="' + a[i].href + '">' + a[i].innerText + '</a>';
                  var next = a[i].nextSibling;
                  if(next && next.nodeType == '3')
                    info += next.nodeValue;

                  sep = '<br>';
                }
              }
            }

            return info;
          }
        }
      };

      rambler.frame.url = rambler.frame.checkUrl;
      ujs_seob.addElementToDirectoriesPanel(rambler);
    },

    initOtherElements: function()
    {
      var url = window.location.href;
      var protocol = window.location.protocol;
      var host = window.location.host;
      var domain = ujs_seob.getDomainName(host);


      ///////////////////////////////////////////////////////////////
      // Technorati
      var technorati = {
        title: 'Technorati',

        data: [{title: 'Technorati', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_other_Technorati',
          frameId: 'SEObar_other_technorati_frame',
          frameToken: 'otherTechnorati',
          url: '',
          checkUrl: 'http://technorati.com/search/' + escape(url),
          domain: 'technorati.com',
          isObjectLoaded: function(){
            if(document.getElementById('top-paginator')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementById('search-results');
            if(obj)
            {
              var h = obj.getElementsByTagName('h1');
              if(h && h.length > 0)
              {
                h = h[0];
                if(h.innerText)
                {
                  var res = h.innerText.match(/posts\s+relating\s+to\s+[^\(]+\(\s*([\d,]+)\s*\)/i);
                  if(res && res.length > 1)
                  {
                    info = res[1].replace(/,+/g, '');
                    info = ujs_seob.groupDigits(info);
                  }
                }
              }
            }
            return info;
          }
        }
      };

      technorati.frame.url = technorati.frame.checkUrl;
      ujs_seob.addElementOtherPanel(technorati);


      ///////////////////////////////////////////////////////////////
      // del.icio.us
      var delicious = {
        title: 'del.icio.us',

        data: [{title: 'del.icio.us', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_other_Delicious',
          frameId: 'SEObar_other_delicious_frame',
          frameToken: 'otherDelicious',
          url: 'http://feeds.delicious.com/v2/js/urlinfo/data?url=' + encodeURIComponent(url),
          checkUrl: 'http://delicious.com/url/' + encodeURIComponent(url),
          domain: 'delicious.com',
          deleteFrame: false,
          isObjectLoaded: function(){return true;},

          getDataFromDocumentFunction: function(frame){
            ujs_seob.request(location.href.replace(/\/js\//i, '/json/'), function(r){
              var info = '';

              if(r.responseText && r.responseText.search(/^[\[\{]/) != -1)
              {
                var data = eval('(' + r.responseText + ')');
                if(data)
                {
                  if(data.length > 0)
                    data = data[0];

                  if(data.total_posts)
                    info = data.total_posts;
                }
              }

              frame.deleteFrame = ujs_seob.removeFrames;
              var msg = frame.msgPrefix + frame.msg + frame.msgSeparator + frame.frameToken;
              if(info)
              {
                info = encodeURIComponent(info);
              }
              msg += frame.msgSeparator + info;
              ujs_seob.postMessage(msg, window.parent.document, window.parent);
            });

            return '...';
          }
        }
      };

      ujs_seob.addElementOtherPanel(delicious);


      ///////////////////////////////////////////////////////////////
      // Digg
      var digg = {
        title: 'Digg',

        data: [{title: 'Digg', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_other_Digg',
          frameId: 'SEObar_other_digg_frame',
          frameToken: 'otherDigg',
          url: '',
          checkUrl: 'http://digg.com/search?s=' + encodeURIComponent(url) + '&submit=Search&section=all&type=all&area=all&sort=new',
          domain: 'digg.com',
          isObjectLoaded: function(){
            if(document.getElementById('footer')) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var pages = 0;
            var obj = ujs_seob.getElementsByClassName('pages', 'div');
            if(obj && obj.length > 0)
            {
              var a = obj[0].getElementsByTagName('a');
              for(var j = a.length - 1; j >= 0; j--)
              {
                if(a[j].innerText && a[j].innerText.search(/^\s*[\d,]+\s*$/) != -1)
                {
                  var res = a[j].innerText.match(/([\d,]+)/);
                  if(res && res.length > 1)
                  {
                    pages = res[1].replace(/,+/g, '');
                    pages = parseInt(pages);
                    if(isNaN(pages))
                      pages = 0;
                  }
                  break;
                }
              }
            }

            var results = 0;
            obj = ujs_seob.getElementsByClassName('news-body', 'div');
            if(obj && obj.length > 0)
              results = obj.length;

            if(results > 0)
            {
              if(pages > 1)
              {
                results *= (pages - 1);
                results = '> ' + results.toString();
              }
              results = results.toString();
              info = results;
            }
            return info;
          }
        }
      };

      digg.frame.url = digg.frame.checkUrl;
      ujs_seob.addElementOtherPanel(digg);


      ///////////////////////////////////////////////////////////////
      // Google's Cache
      var googleCache = {
        title: 'Google\'s cache',

        data: [{title: 'Google\'s cache', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_other_GoogleCache',
          frameId: 'SEObar_other_googlecache_frame',
          frameToken: 'otherGoogleCache',
          url: '',
          checkUrl: 'http://google.com/search?hl=en&q=cache:' + encodeURIComponent(url),
          domain: '',
          isObjectLoaded: function(){
            var h = document.getElementsByTagName('head');
            if(h && h.length > 0) return true;
            return false;
          },

          getDataFromDocumentFunction: function(frame){
            var info = '';
            var obj = document.getElementsByTagName('div');
            if(obj && obj.length > 0)
            {
              if(obj[0].innerText && obj[0].innerText.search(/as it appeared on/i) != -1)
              {
                var res = obj[0].innerText.match(/as it appeared on\s*([\w\x20\:-]+)/i);
                if(res && res.length > 1)
                {
                  info = res[1];
                }
              }
            }
            return info;
          }
        }
      };

      googleCache.frame.url = googleCache.frame.checkUrl;
      ujs_seob.addElementOtherPanel(googleCache);


      ///////////////////////////////////////////////////////////////
      // Wayback Machine
      var waybackMachine = {
        title: 'Wayback machine',

        data: [{title: 'Wayback machine', value: '', display: 0, store: false}],

        frame: {
          msgPrefix: 'SEObar_other_WaybackMachine',
          frameId: 'SEObar_other_waybackmachine_frame',
          frameToken: 'otherWaybackMachine',
          url: '',
          checkUrl: 'http://web.archive.org/archive_request_ng?collection=web&url=' + encodeURIComponent(url) + '&Submit=Take+Me+Back',
          domain: 'web.archive.org',
          isObjectLoaded: function(){return false;},

          getDataFromDocumentFunction: function(frame){
            var info = '';

            var t = ujs_seob.getElementsByClassName('mainBody', 'td');
            var from = '';

            for(var i = t.length - 1; i >= 0; i--)
            {
              var a = t[i].getElementsByTagName('a');
              if(a && a.length > 0 && a[0].innerText)
                from = a[0].innerText;
            }

            var to = '';
            for(var i = 0; i < t.length; i++)
            {
              var a = t[i].getElementsByTagName('a');
              if(a && a.length > 0 && a[a.length - 1].innerText)
                to = a[a.length - 1].innerText;
            }

            if(from || to)
            {
              info = from ? from : '?';
              info += ' - ';
              info += to ? to : '?';
            }
            return info;
          }
        }
      };

      waybackMachine.frame.url = waybackMachine.frame.checkUrl;
      ujs_seob.addElementOtherPanel(waybackMachine);
    },

    initUpdateElements: function()
    {
      var url = window.location.href;
      var protocol = window.location.protocol;
      var host = window.location.host;
      var domain = ujs_seob.getDomainName(host);


      ///////////////////////////////////////////////////////////////
      // SEOBAR UPDATE
      var update = {
        title: '',

        data: [{title: '', value: '', display: -1, store: false}],

        frame: {
          msgPrefix: 'SEObar_update',
          frameId: 'SEObar_update_frame',
          frameToken: 'update',
          url: 'http://www.puzzleclub.ru/files/seobar/update.html?rnd=' + (new Date()).getTime() + Math.random(),
          checkUrl: '',
          domain: 'www.puzzleclub.ru',
          style: '',
          deleteFrame: false,
          isObjectLoaded: function(){return true;},

          getDataFromDocumentFunction: function(frame){
            var url = 'http://www.puzzleclub.ru/files/seobar/seobar6_version.js?rnd=' + (new Date()).getTime() + Math.random();
            ujs_seob.request(url, function(r){
              var info = '';

              if(r.responseText)
              {
                var vi = eval('(' + r.responseText + ')');
                if(vi.SEObarUpdateVersion)
                {
                  var bUpdate = false;
                  var ver1 = ujs_seob.version.exact.split('.');
                  var ver2 = vi.SEObarUpdateVersion.split('.');
                  var l = ver1.length;
                  if(l > ver2.length)
                    l = ver2.length;

                  for(var i = 0; i < l; i++)
                  {
                    var v1 = parseInt(ver1[i]);
                    if(isNaN(v1))
                      v1 = 0;

                    var v2 = parseInt(ver2[i]);
                    if(isNaN(v2))
                      v2 = 0;

                    if(v2 > v1)
                    {
                      bUpdate = true;
                      break;
                    }
                    else if(v1 > v2)
                      break;
                  }

                  var info = '<br /><br />';

                  var params = {
                    'SEObarUpdateVersionString': '',
                    'SEObarUpdateDate': '',
                    'SEObarUpdateUrl': '',
                    'SEObarDownloadUrl': '',
                    'SEObarUpdateInfo': new Array(),
                    'SEObarUpdateImportantInfo': ''
                  };

                  for(var i in params)
                  {
                    if(!vi[i])
                      vi[i]= params[i];
                  }

                  if(bUpdate)
                  {
                    info += '<b>' + ujs_seob.lng.update.available + '</b><br />';
                    info += ujs_seob.lng.seobar.version + ': ' + vi.SEObarUpdateVersionString + '<br />';
                    info += ujs_seob.lng.seobar.date + ': ' + vi.SEObarUpdateDate + '<br />';
                    info += ujs_seob.lng.update.download + ': ' + vi.SEObarUpdateUrl + '<br /><br />';
                    info += '<input type="button" value="' + ujs_seob.lng.update.download + '" onclick="var wnd=window.open(\'' + vi.SEObarDownloadUrl + '\');" />';


                    if(vi.SEObarUpdateInfo)
                    {
                      info += '<br /><br /><b>' + ujs_seob.lng.update.information + ':</b>';
                      for(var i = 0; i < vi.SEObarUpdateInfo.length; i++)
                      {
                        info += '<br />' + vi.SEObarUpdateInfo[i];
                      }
                    }
                  }
                  else
                  {
                    info += ujs_seob.lng.update.unavailable;
                    if(vi.SEObarUpdateImportantInfo)
                      info += '<br /><br />' + vi.SEObarUpdateImportantInfo;
                  }
                }
              }

              frame.deleteFrame = ujs_seob.removeFrames;
              var msg = frame.msgPrefix + frame.msg + frame.msgSeparator + frame.frameToken;
              if(info)
              {
                info = encodeURIComponent(info);
              }
              msg += frame.msgSeparator + info;
              ujs_seob.postMessage(msg, window.parent.document, window.parent);
            });
            return '<br />...';
          }
        }
      };

      ujs_seob.addElement(update);
      update.frame.getDataFunction = ujs_seob.getUpdateInfo;
      ujs_seob.elements.update.push(update);
    },

    initElements: function()
    {
      ujs_seob.initMainElements();
      ujs_seob.initIndexedPagesElements();
      ujs_seob.initBackwardLinksElements();
      ujs_seob.initDirectoriesElements();
      ujs_seob.initOtherElements();
      ujs_seob.initUpdateElements();

      ujs_seob.initPlugins();

      for(var i in ujs_seob.elements)
      {
        var a = [];
        for(var j = 0; j < ujs_seob.elements[i].length; j++)
        {
          var title = ujs_seob.elements[i][j].title.replace(/[\x20\-]+/g, '_').replace(/\W/ig, '').toLowerCase();
          if(a[title])
          {
            for(var k = 2; k < 12; k++)
            {
              if(!a[title + '_' + k])
              {
                title += '_' + k;
                break;
              }
            }
          }

          a[title] = 1;
          ujs_seob.elements[i][j].storageTitle = title;
        }
      }
    },

    initPlugins: function()
    {
      var plugins = window.ujs_seob_plugins;
      if(plugins && plugins.length > 0)
      {
        for(var i in plugins)
        {
          switch(plugins[i].panel)
          {
            case 'main':
              ujs_seob.addElementToMainPanel(plugins[i]);
              break;

            case 'indexedPages':
              ujs_seob.addElementToIndexedPagesPanel(plugins[i]);
              break;

            case 'backwardLinks':
              ujs_seob.addElementToBackwardLinksPanel(plugins[i]);
              break;

            case 'directories':
              ujs_seob.addElementToDirectoriesPanel(plugins[i]);
              break;

            case 'other':
              ujs_seob.addElementOtherPanel(plugins[i]);
              break;
          }
        }
      }
    },

    removeObject: function(id)
    {
      var obj = document.getElementById(id);
      if(obj)
        obj.parentNode.removeChild(obj);
    },


    toggleOptionsSections: function(obj, from, to)
    {
      var v = obj.value, stDisplay = '';
      if(escape(v) == '%u2212')
      {
        stDisplay = 'none';
        v = '+';
      }
      else
      {
        v = unescape('%u2212');
      }

      var tbl = document.getElementById('SEObar_panel_addon_options_rep');
      if(tbl)
      {
        var tr = tbl.getElementsByTagName('tr');
        if(tr && tr.length > 0)
        {
          if(from < 0)
            from = 0;
          if(to >= tr.length)
            to = tr.length - 1;

          for(var i = from; i <= to; i++)
          {
            tr[i].style.display = stDisplay;
          }
          obj.value = v;
        }
      }
    },

    toggleObj: function(id)
    {
      var obj = document.getElementById(id);
      if(!obj)
        return -1;

      if(obj.style.display == 'none')
      {
        obj.style.display = '';
        return 1;
      }
      else
      {
        obj.style.display = 'none';
        return 0;
      }
    },

    toggleTextarea: function(id, text)
    {
      var res = ujs_seob.toggleObj(id);
      if(res == 1)
        return '(Hide)';
      else if(res == 0)
        return '(Show)';
      else
        return text;
    },

    closeSEObar: function()
    {
      ujs_seob.removeObject(ujs_seob.panelId);
      ujs_seob.removeObject(ujs_seob.mainStyleId);
      ujs_seob.removeObject(ujs_seob.highlightStyleId);
    },

    getInputHtml: function(p, l)
    {
      var html = '<input';
      for(var i in p)
      {
        html += ' ' + i + '="' + p[i] + '"';
      }
      html += ' />';

      if(l)
      {
        var l1 = '<label', l2 = '</label>';
        for(var i in l)
        {
          if(i != 'text')
            l1 += ' ' + i + '="' + l[i] + '"';
        }

        l1 += '>';

        if(l['text'])
          l2 = '&nbsp;' + l['text'] + l2;

        html = l1 + html + l2;
      }

      return html;
    },

    getNbsp: function(len)
    {
      var s = '';
      for(var i = 0; i < len; i++)
        s += '&nbsp;';

      return s;
    },

    elementInputName: function(panel, eIndex, dIndex)
    {
      return 'ujs_seob_element_' + panel + "_" + eIndex + "_" + dIndex;
    },

    buttonInputName: function(index)
    {
      return 'ujs_seob_btn_' + index;
    },

    getOptions: function(btnOptions, btnClose)
    {
      var res = btnOptions + '&nbsp;' + btnClose;

      var disableScript = ujs_seob.getInputHtml({type:'checkbox',name:ujs_seob.op[0][1],value:1}, {style:'display: none !important;',text:ujs_seob.lng.optionsPanel.disableScript});

      if(!ujs_seob.bDisableScriptByPanelCollapse)
      {
        disableScript = ujs_seob.getInputHtml({type:'checkbox',name:ujs_seob.op[0][1],value:1}, {text:ujs_seob.lng.optionsPanel.disableScript}) + ujs_seob.getNbsp(10);
      }

      var storeRatings = ujs_seob.getInputHtml({type:'checkbox',name:ujs_seob.op[1][1],value:1}, {title:ujs_seob.lng.optionsPanel.storeDomainRatingsText,text:ujs_seob.lng.optionsPanel.storeDomainRatings});
      var checkFakePR = ujs_seob.getInputHtml({type:'checkbox',name:ujs_seob.op[2][1],value:1}, {text:ujs_seob.lng.optionsPanel.checkFakeGooglePR});

      var panelLocation = ujs_seob.getInputHtml({type:'radio',name:ujs_seob.opPosition[0][1]});
      var panelLocationR = ujs_seob.getInputHtml({type:'radio',name:ujs_seob.opPosition[0][1],class:'SEObar_r'});
      var panelPosition = ujs_seob.getInputHtml({type:'radio',name:ujs_seob.opPosition[1][1]});

      var options = '<div id="SEObar_panel_addon">'
        +'<form name="' + ujs_seob.opFormId + '" method="get" action="" onsubmit="return false;">'
        +disableScript
        +storeRatings
        +'<br><br>'  + checkFakePR
        +'<br /><br />'
        +'<div class="overflow" style="' + ujs_seob.style.scrollbar + '">'
        +'<table class="options" id="SEObar_panel_addon_options_rep"><tr><th rowspan="2">' + ujs_seob.lng.optionsPanel.hElements + '</th><th colspan="3">' + ujs_seob.lng.optionsPanel.hDisplay + '</th></tr>'
        +'<tr><th>' + ujs_seob.lng.optionsPanel.hAlways + '</th><th>' + ujs_seob.lng.optionsPanel.hByRequest + '</th><th>' + ujs_seob.lng.optionsPanel.hNever + '</th></tr>';

      var rows = 2;
      for(var i in ujs_seob.elements)
      {
        var html = '', count = 0;
        for(var j = 0; j < ujs_seob.elements[i].length; j++)
        {
          for(var k = 0; k < ujs_seob.elements[i][j].data.length; k++)
          {
            var d = ujs_seob.elements[i][j].data[k];
            if(d.display >= 0)
            {
              html += '<tr><td>' + d.title.replace(/\s/g, '&nbsp;').replace(/\"/g, '&quot;').replace(/\</g, '&lt;').replace(/\>/g, '&gt;') + '</td>';
              var attr = {type:"radio",name:ujs_seob.elementInputName(i, j, k)};
              for(var m = 0; m < 3; m++)
              {
                if(m == ujs_seob.elements[i][j].data[k].display)
                  attr.checked = 1;
                else if(attr.checked)
                  delete attr['checked'];

                html += '<td>' + ujs_seob.getInputHtml(attr) + '</td>';
              }
              html += '</tr>';

              count++;
            }
          }
        }

        if(html)
        {
          rows++;
          options += '<tr><td colspan="4" class="SEObar_panel_subhdr"><input type="button" value="&minus;" class="SEObar_panel_sbtn" onclick="javascript:ujs_seob.toggleOptionsSections(this, ' + rows + ', ' + (rows + count - 1) + ');"/>&nbsp;' + ujs_seob.lng.panels[i] + '&nbsp</td></tr>';
          options += html;
          html = '';
          rows += count;
        }
      }

      rows++;
      options += '<tr><td colspan="4" class="SEObar_panel_subhdr"><input type="button" value="&minus;" class="SEObar_panel_sbtn" onclick="javascript:ujs_seob.toggleOptionsSections(this, ' + rows + ', ' + (rows + ujs_seob.panelBtn.length) + ');"/>&nbsp;' + ujs_seob.lng.optionsPanel.hButtons + '</td></tr>'
      for(var i = 0; i < ujs_seob.panelBtn.length; i++)
      {
        options += '<tr><td>' + ujs_seob.panelBtn[i].title + '</td>';
        var attr = {type:"radio",name:ujs_seob.buttonInputName(i)};
        for(var j = 0; j < 3; j++)
        {
          if(j == 2 && ujs_seob.panelBtn[i].nohide == false)
            options += '<td></td>';
          else
          {
            if(j == ujs_seob.panelBtn[i].display)
              attr.checked = 1;
            else if(attr.checked)
              delete attr['checked'];

            options += '<td>' + ujs_seob.getInputHtml(attr) + '</td>';
          }
        }
      }

      options += '</table></div>'
        +'<br /><b>' + ujs_seob.lng.optionsPanel.hPosition + '</b>'
        +'<div id="SEObar_opt_pos_box">'
        +'<div id="SEObar_opt_loc_box">'
        +'<div class="SEObar_disp_1">' + panelLocation + panelLocationR + '<br /><br />' + panelLocation + panelLocationR + '</div>'
        +'<div class="SEObar_disp_2">&nbsp;</div><div class="SEObar_disp_3">&nbsp;</div>'
        +'</div>'
        +'<div id="SEObar_opt_pos"><label>' + panelPosition + '&nbsp;' + ujs_seob.lng.optionsPanel.fixed + '</label><br /><br /><label>' + panelPosition + '&nbsp;' + ujs_seob.lng.optionsPanel.absolute + '</label></div>'
        +'<div class="SEObar_clear"></div></div><br />';

      var lang = '', len = '';
      for(var i in ujs_seob.languages)
      {
        var text = ujs_seob.languages[i].languageTitle;
        if(!text) text = i;
        lang += '<option value="' + i + '"';
        if(i == ujs_seob.currentLanguage) lang += ' selected="1"';
        lang += '>' + text + '&nbsp;</option>';
        len++;
      }

      if(len > 1)
      {
        options += '<br /><b>' + ujs_seob.lng.optionsPanel.hLanguage + ':</b> <select name="language" size="1">' + lang + '</select><br /><br />';
      }

      options += '<div class="line"></div>'
        +'<div class="right">'
        +'<input type="button" value="' + ujs_seob.lng.optionsPanel.deleteData + '" title="" onclick="ujs_seob.deleteData();" style="float: left !important;" title="You should delete the data if any script malfunctions occur or when updating the script."/>'
        +'<input type="button" value="' + ujs_seob.lng.ok + '" class="SEObar_panel_btn" onMouseUp="ujs_seob.saveOptions();ujs_seob.bShowOptions=false;ujs_seob.setPanelData();ujs_seob.setStatusbarData();" />&nbsp;'
        +'<input type="button" value="' + ujs_seob.lng.cancel + '" class="SEObar_panel_btn" onMouseUp="ujs_seob.bShowOptions=false;ujs_seob.setPanelData();ujs_seob.setStatusbarData();" />'
        +'</div>'
        +'<br /><span class="SEObar_panel_gray_text">' + ujs_seob.lng.optionsPanel.storageDomain + ': ' + ujs_seob.fakeDomain + '</span>'
        +'</form></div>';

      res += options;
      return res;
    },

    getRatingTabs: function()
    {
      var tabs = new Array('', '', '', '', '');
      tabs[ujs_seob.currentRatingTab] = ' id="selected_tab"';
      var ratings = '<div id="SEObar_panel_addon_h2">' + ujs_seob.lng.ratings + '</div>';

      var aa = ujs_seob.anchorAttribute.name + '="' + ujs_seob.anchorAttribute.value + '"';
      ratings += '<ul id="SEObar_tabs">';
      ratings += '<li' + tabs[1] + ' class="first_tab"><a href="#" ' + aa + ' onMouseUp="ujs_seob.currentRatingTab = 1; ujs_seob.setPanelData(); ujs_seob.getIndexedPagesRatings();">' + ujs_seob.lng.panels.indexedPages + '</a></li>';
      ratings += '<li' + tabs[2] + '><a href="#" ' + aa + ' onMouseUp="ujs_seob.currentRatingTab = 2; ujs_seob.setPanelData(); ujs_seob.getBackwardLinksRatings();">' + ujs_seob.lng.panels.backwardLinks + '</a></li>';
      ratings += '<li' + tabs[3] + '><a href="#" ' + aa + ' onMouseUp="ujs_seob.currentRatingTab = 3; ujs_seob.setPanelData(); ujs_seob.getDirectoriesRatings();">' + ujs_seob.lng.panels.directories + '</a></li>';
      ratings += '<li' + tabs[4] + '><a href="#" ' + aa + ' onMouseUp="ujs_seob.currentRatingTab = 4; ujs_seob.setPanelData(); ujs_seob.getOtherRatings();">' + ujs_seob.lng.panels.other + '</a></li>';
      ratings += '</ul>';

      ratings += '<div id="tab_content" style="' + ujs_seob.style.scrollbar + '">';

      switch(ujs_seob.currentRatingTab)
      {
        case 0:
          break;
        case 1:
          if(ujs_seob.bInitRatings)
          {
            ujs_seob.bInitRatings = false;
            ujs_seob.getIndexedPagesRatings();
          }
          ratings += ujs_seob.getIndexedPages();
          break;
        case 2:
          if(ujs_seob.bInitRatings)
          {
            ujs_seob.bInitRatings = false;
            ujs_seob.getBackwardLinksRatings();
          }
          ratings += ujs_seob.getBackwardLinks();
          break;
        case 3:
          if(ujs_seob.bInitRatings)
          {
            ujs_seob.bInitRatings = false;
            ujs_seob.getDirectoriesRatings();
          }
          ratings += ujs_seob.getDirectories();
          break;
        case 4:
          if(ujs_seob.bInitRatings)
          {
            ujs_seob.bInitRatings = false;
            ujs_seob.getOtherRatings();
          }
          ratings += ujs_seob.getOther();
          break;
        default:
          ujs_seob.currentRatingTab = 0;
          ujs_seob.setPanelData();
          break;
      }
      ratings += '</div>';

      return '<div id="SEObar_panel_addon">' + ratings + '</div>';
    },

    getToolTabs: function()
    {
      var tabs = new Array('', '', '', '', '', '');
      tabs[ujs_seob.currentToolTab] = ' id="selected_tab"';
      var tools = '';
      tools += '<div id="SEObar_panel_addon_h2">' + ujs_seob.lng.tools + '</div>';

      var aa = ujs_seob.anchorAttribute.name + '="' + ujs_seob.anchorAttribute.value + '"';
      tools += '<ul id="SEObar_tabs">';
      tools += '<li' + tabs[0] + ' class="first_tab"><a href="#" ' + aa + ' onMouseUp="ujs_seob.currentToolTab = 0; ujs_seob.setPanelData();">' + ujs_seob.lng.toolsPanel.general + '</a></li>';
      tools += '<li' + tabs[1] + '><a href="#" ' + aa + ' onMouseUp="ujs_seob.currentToolTab = 1; ujs_seob.setPanelData();">' + ujs_seob.lng.toolsPanel.linkStatistics + '</a></li>';
      tools += '<li' + tabs[2] + '><a href="#" ' + aa + ' onMouseUp="ujs_seob.currentToolTab = 2; ujs_seob.setPanelData();">' + ujs_seob.lng.toolsPanel.metaTags + '</a></li>';
      tools += '<li' + tabs[3] + '><a href="#" ' + aa + ' onMouseUp="ujs_seob.currentToolTab = 3; ujs_seob.getHttpHeaders();">' + ujs_seob.lng.toolsPanel.httpHeaders + '</a></li>';
      tools += '<li' + tabs[4] + '><a href="#" ' + aa + ' onMouseUp="ujs_seob.currentToolTab = 4; ujs_seob.setPanelData();">SEObar</a></li>';
      tools += '</ul>';

      tools += '<div id="tab_content" style="' + ujs_seob.style.scrollbar + '">';

      switch(ujs_seob.currentToolTab)
      {
        case 0:
          tools += '<table class="noborder">';
          // noindex
          var checked = '';
          if(ujs_seob.highlightNoindex)
          {
            checked = 'checked';
          }
          tools += '<tr><td class="hdr"><label><input type="checkbox" value="noindex" ' + checked + ' onclick="ujs_seob.highlightNoindex = this.checked; ujs_seob.preferences.save(); ujs_seob.highlightElements();">&nbsp;' + ujs_seob.lng.highlight + '&nbsp;&quot;noindex&quot;</label></td>';
          tools += '<td><span style="' + ujs_seob.style.noindex + ujs_seob.style.highlight + '">[' + ujs_seob.lng.example + ']</span></td></tr>';
          // nofollow
          checked = '';
          if(ujs_seob.highlightNofollow)
          {
            checked = 'checked';
          }
          tools += '<tr><td class="hdr"><label><input type="checkbox" value="nofollow" ' + checked + ' onclick="ujs_seob.highlightNofollow = this.checked; ujs_seob.preferences.save(); ujs_seob.highlightElements();">&nbsp;' + ujs_seob.lng.highlight + '&nbsp;&quot;nofollow&quot;</label></td>';
          tools += '<td><span style="' + ujs_seob.style.nofollow + ujs_seob.style.highlight + '">[' + ujs_seob.lng.example + ']</span></td></tr>';
          // external links
          checked = '';
          if(ujs_seob.highlightExternalLinks)
          {
            checked = 'checked';
          }
          tools += '<td class="hdr"><label><input type="checkbox" value="external_links" ' + checked + ' onclick="ujs_seob.highlightExternalLinks = this.checked; ujs_seob.preferences.save(); ujs_seob.highlightElements();">&nbsp;' + ujs_seob.lng.highlight + '&nbsp;external&nbsp;links</label></td>';
          tools += '<td><span style="' + ujs_seob.style.external + ujs_seob.style.highlight + '">[' + ujs_seob.lng.example + ']</span></td></tr>';
          tools += '</table><br /><br />';

          if(ujs_seob.toolsGeneralButtons)
          {
            var btns = ujs_seob.toolsGeneralButtons;
            if(btns.length > 0)
            {
              tools += '<div class="float_cnt">';
              for(var i = 0; i < btns.length; i++)
              {
                var title = btns[i].title ? btns[i].title : '';
                tools += '<input type="button" class="float_obj" value="' + btns[i].name + '" title="' + title + '" onMouseUp="ujs_seob.toolsGeneralButtons[' + i + '].action()">';
              }
              tools += '</div>';
            }
          }

          break;
        case 1:
          tools += ujs_seob.getLinkStatistics();
          break;
        case 2:
          tools += ujs_seob.getMetaTags();
          break;
        case 3:
          tools += ujs_seob.httpHeaders;
          break;
        case 4:
          tools += ujs_seob.getSeobarInfo() + ujs_seob.elements.update[0].data[0].value;
          break;
        default:
          ujs_seob.currentToolTab = 0;
          ujs_seob.setPanelData();
          break;
      }
      tools += '</div>';

      return '<div id="SEObar_panel_addon">' + tools + '</div>';
    },

    getMainPanelHtml: function(mode)
    {
      var ratings = '';

      for(var i = 0; i < ujs_seob.elements.main.length; i++)
      {
        ratings += ujs_seob.elements.main[i].format(ujs_seob.elements.main[i], mode) + '&nbsp;&nbsp;&nbsp;';
      }

      return ratings;
    },

    getPanelHtml: function(panel)
    {
      var mode = ujs_seob.getTh(ujs_seob.more[panel]);

      var res = '<table>';
      for(var i = 0; i < ujs_seob.elements[panel].length; i++)
      {
        var val = ujs_seob.elements[panel][i].format(ujs_seob.elements[panel][i], mode);
        if(val != null)
        {
          res += '<tr><td class="hdr">' + ujs_seob.elements[panel][i].title + '</td><td>';
          res += '<a href="' + ujs_seob.elements[panel][i].frame.getUrl() + '" ' + ujs_seob.getAnchorAttribute() + '>' + val + '</a></td></tr>';
        }
      }
      res += '</table>';
      res += ujs_seob.getRatingsPanelButtons(panel);

      return res;
    },

    getIndexedPages: function()
    {
      return ujs_seob.getPanelHtml('indexedPages');
    },

    getBackwardLinks: function()
    {
      return ujs_seob.getPanelHtml('backwardLinks');
    },

    getDirectories: function()
    {
      return ujs_seob.getPanelHtml('directories');
    },

    getOther: function()
    {
      return ujs_seob.getPanelHtml('other');
    },

    setPanelData: function()
    {
      if(!ujs_seob.bPanel)
        return;

      var p = document.getElementById(ujs_seob.panelId);
      if(!p)
        return;

      p.innerHTML = '';

      var d = '';
      var grip = ujs_seob.getGripBtn();
      var btnOptions = ujs_seob.getOptionsBtn();
      var btnClose = '<input type="button" value="&times;" class="SEObar_panel_sbtn" title="' + ujs_seob.lng.close + '" onMouseUp="javascript: ujs_seob.closeSEObar()" />';

      if(ujs_seob.bShowOptions)
      {
        var box = document.createElement('div');
        box.id = 'SEObar_panel_box';
        box.innerHTML = ujs_seob.getOptions(btnOptions, btnClose);
        p.appendChild(box);
        ujs_seob.setFormValues();
        return;
      }

      if(ujs_seob.bCollapsedPanel)
      {
        var box = document.createElement('div');
        box.id = 'SEObar_panel_box';
        box.innerHTML = grip;
        p.appendChild(box);
         return;
      }

      var btnMoreLess = '';
      if(ujs_seob.isMoreLessBtnRequired('main'))
        btnMoreLess = ujs_seob.getMoreLessBtn();

      var th = ujs_seob.getTh(ujs_seob.more.main);
      d = grip + '&nbsp;';
      d += ujs_seob.getMainPanelHtml(th);

      if(ujs_seob.panelBtn[2].display <= th) // refresh
      {
        d += '<input type="button" value="&#8629;" class="SEObar_panel_sbtn" title="' + ujs_seob.lng.refresh + '" onMouseUp="ujs_seob.refreshRatings(\'main\')" />&nbsp;';
      }

      if(ujs_seob.panelBtn[0].display <= th) // ratings
      {
        d += ujs_seob.getRatingsBtn() + '&nbsp;';
      }

      if(ujs_seob.panelBtn[1].display <= th) // tools
      {
        d += ujs_seob.getToolsBtn() + '&nbsp;';
      }

      if(ujs_seob.panelBtn[3].display <= th) // options
      {
        d += btnOptions;
      }

      d += btnMoreLess;

      d += btnClose;

      if(this.bRatings)
      {
        d += ujs_seob.getRatingTabs();
      }
      else if(this.bTools)
      {
        d += ujs_seob.getToolTabs();
      }

      var box = document.createElement('div');
      box.id = 'SEObar_panel_box';
      box.innerHTML = d;
      p.appendChild(box);
    },

    setStatusbarData: function()
    {
      if(!ujs_seob.bStatusbar)
        return;

      if(ujs_seob.op[0][0])
      {
        window.defaultStatus = '';
        return;
      }

      var res = '', sep = '', mode = ujs_seob.getTh(ujs_seob.more.main);
      with(ujs_seob.elements)
      {
        for(var i = 0; i < main.length; i++)
        {
          if(main[i].formatStatusbar)
          {
            var v = main[i].formatStatusbar(main[i], mode);
            if(v)
            {
              res += sep + v;
              sep = '   ';
            }
          }
        }
      }

      if(res)
          window.defaultStatus = res;
    },

    getTh: function(more)
    {
      return more ? 1 : 0;
    },

    isMoreLessBtnRequired: function(panel)
    {
      if(!panel || !ujs_seob.elements[panel])
        return false;

      for(var i = 0; i < ujs_seob.elements[panel].length; i++)
      {
        for(var j = 0; j < ujs_seob.elements[panel][i].data.length; j++)
        {
          if(ujs_seob.elements[panel][i].data[j].display == 1)
            return true;
        }
      }

      if(panel == 'main')
      {
        for(var i = 0; i < ujs_seob.panelBtn.length; i++)
        {
          if(ujs_seob.panelBtn[i].display == 1)
            return true;
        }
      }

      return false;
    },

    getMoreLessBtn: function()
    {
      var v = '&laquo;', t = ujs_seob.lng.more;
      if(ujs_seob.more.main)
      {
        v = '&raquo;';
        t = ujs_seob.lng.less;
      }
      return '<input type="button" value="' + v + '" class="SEObar_panel_sbtn" title="' + t + '" onMouseUp="ujs_seob.onMoreLessData(\'main\')" />&nbsp;';
    },

    getRatingsPanelButtons: function(panel)
    {
      var v = ujs_seob.lng.more;
      if(ujs_seob.more[panel])
      {
        v = ujs_seob.lng.less;
      }
      var ret = '<br /><div class="right">'
      ret += '<input type="button" value="' + ujs_seob.lng.refresh + '" class="SEObar_panel_btn" onMouseUp="ujs_seob.refreshRatings(\'' + panel + '\');" />';

      if(ujs_seob.isMoreLessBtnRequired(panel))
      {
        ret += '&nbsp;';
        ret += '<input type="button" value="' + v + '" class="SEObar_panel_btn" onMouseUp="ujs_seob.onMoreLessData(\'' + panel + '\');" />'
      }
      ret += '</div>';

      return ret;
    },

    getGripBtn: function()
    {
      var v = '&minus;', t = ujs_seob.lng.hide;
      if(ujs_seob.bCollapsedPanel)
      {
        v = '+';
        t = ujs_seob.lng.show;
      }
      return '<input type="button" value="' + v + '" class="SEObar_panel_sbtn" title="' + t + '" onMouseUp="ujs_seob.onExpandCollapsePanel()" />';
    },

    getOptionsBtn: function()
    {
      var sel = '';
      if(ujs_seob.bShowOptions)
        sel = 'selected';

      return '<input type="button" value="' + ujs_seob.lng.options + '" class="SEObar_panel_btn" ' + sel + ' onMouseUp="ujs_seob.onOptions()" />&nbsp;';
    },

    getRatingsBtn: function()
    {
      var sel = '';
      if(ujs_seob.bRatings)
        sel = 'selected';

      return '<input type="button" value="R" title="' + ujs_seob.lng.ratings + '" class="SEObar_panel_sbtn" ' + sel + ' onMouseUp="ujs_seob.onRatings()" />';
    },

    getToolsBtn: function()
    {
      var sel = '';
      if(ujs_seob.bTools)
        sel = 'selected';

      return '<input type="button" value="T" title="' + ujs_seob.lng.tools + '" class="SEObar_panel_sbtn" ' + sel + ' onMouseUp="ujs_seob.onTools()" />';
    },

    onExpandCollapsePanel: function()
    {
      ujs_seob.bCollapsedPanel = !ujs_seob.bCollapsedPanel;
      if(ujs_seob.bDisableScriptByPanelCollapse)
        ujs_seob.op[0][0] = ujs_seob.bCollapsedPanel;

      if(!ujs_seob.op[0][0])
      {
        ujs_seob.getMainRatings();
      }

      ujs_seob.setPanelData();
      ujs_seob.setStatusbarData();
      ujs_seob.preferences.save();
    },

    onMoreLessData: function(panel)
    {
      ujs_seob.more[panel] = !ujs_seob.more[panel];

      if(ujs_seob.more[panel])
      {
        ujs_seob.getRatings(panel);
      }

      ujs_seob.setPanelData();

      if(panel == 'main')
        ujs_seob.setStatusbarData();
    },

    onOptions: function()
    {
      ujs_seob.bShowOptions = !ujs_seob.bShowOptions;
      ujs_seob.setPanelData();
      ujs_seob.setStatusbarData();
    },

    onRatings: function()
    {
      ujs_seob.bTools = false;
      ujs_seob.bRatings = !ujs_seob.bRatings;

      ujs_seob.setPanelData();
      ujs_seob.setStatusbarData();
    },

    onTools: function()
    {
      ujs_seob.bRatings = false;
      ujs_seob.bTools = !ujs_seob.bTools;

      ujs_seob.setPanelData();
      ujs_seob.setStatusbarData();
    },

    setFormValues: function()
    {
      var f = document.forms[ujs_seob.opFormId];
      if(!f)
        return;

      f.elements[ujs_seob.op[0][1]].checked = ujs_seob.op[0][0];
      f.elements[ujs_seob.op[1][1]].checked = ujs_seob.op[1][0];
      f.elements[ujs_seob.op[2][1]].checked = ujs_seob.op[2][0];

      for(var i = 0; i < ujs_seob.opPosition.length; i++)
      {
        f.elements[ujs_seob.opPosition[i][1]][ujs_seob.opPosition[i][0]].checked = true;
      }
    },

    saveOptions: function()
    {
      var f = document.forms[ujs_seob.opFormId];
      if(f)
      {
        ujs_seob.op[0][0] = f.elements[ujs_seob.op[0][1]].checked;
        ujs_seob.op[1][0] = f.elements[ujs_seob.op[1][1]].checked;
        ujs_seob.op[2][0] = f.elements[ujs_seob.op[2][1]].checked;
        if(f.elements.language)
          ujs_seob.setLanguage(f.elements.language.value);

        for(var i in ujs_seob.elements)
        {
          for(var j = 0; j < ujs_seob.elements[i].length; j++)
          {
            for(var k = 0; k < ujs_seob.elements[i][j].data.length; k++)
            {
              var d = ujs_seob.elements[i][j].data[k];
              if(d.display >= 0)
              {
                var e = f.elements[ujs_seob.elementInputName(i, j, k)];
                for(var m = 0; m < e.length; m++)
                {
                  if(e[m].checked)
                  {
                    ujs_seob.elements[i][j].data[k].display = m;
                    break;
                  }
                }
              }
            }
          }
        }

        for(var i = 0; i < ujs_seob.panelBtn.length; i++)
        {
          var e = f.elements[ujs_seob.buttonInputName(i)];
          for(var j = 0; j < e.length; j++)
          {
            if(e[j].checked)
            {
              ujs_seob.panelBtn[i].display = j;
              break;
            }
          }
        }

        var loc = ujs_seob.opPosition[0][0];
        var pos = ujs_seob.opPosition[1][0];

        for(var i = 0; i < ujs_seob.opPosition.length; i++)
        {
          var e = f.elements[ujs_seob.opPosition[i][1]];

          for(var j = 0; j < e.length; j++)
          {
            if(e[j].checked)
            {
              ujs_seob.opPosition[i][0] = j;
            }
          }
        }

        if(loc != ujs_seob.opPosition[0][0])
          ujs_seob.setPanelLocation();

        if(pos != ujs_seob.opPosition[1][0])
          ujs_seob.setPanelPosition();
      }

      ujs_seob.preferences.save();
    },

    setPanelLocation: function()
    {
      var p = document.getElementById(ujs_seob.panelId);
      if(!p)
        return;

      var sa = 'auto !important', s0 = '0 !important';
      switch(ujs_seob.opPosition[0][0])
      {
        case 0:
          p.style.top = s0;
          p.style.bottom = sa;
          p.style.left = s0;
          p.style.right = sa;
          break;
        case 1:
          p.style.top = s0;
          p.style.bottom = sa;
          p.style.left = sa;
          p.style.right = s0;
          break;
        case 2:
          p.style.top = sa;
          p.style.bottom = s0;
          p.style.left = s0;
          p.style.right = sa;
          break;
        case 3:
          p.style.top = sa;
          p.style.bottom = s0;
          p.style.left = sa;
          p.style.right = s0;
          break;
        default:
          p.style.top = s0;
          p.style.bottom = sa;
          p.style.left = s0;
          p.style.right = sa;
      }
    },

    setPanelPosition: function()
    {
      var p = document.getElementById(ujs_seob.panelId);
      if(!p)
        return;

      if(ujs_seob.opPosition[1][0] == 1)
        p.style.position = 'absolute !important';
      else
        p.style.position = 'fixed !important';
    },

    getDataFromStorage: function(data, id)
    {
      if(id == ujs_seob.stateKey)
      {
        if(!data)
        {
          ujs_seob.storage.loadData(ujs_seob.preferencesKey, ujs_seob.preferencesKey);
          return;
        }

        ujs_seob.SEObarState = (data == 'false') ? false : true;
        ujs_seob.storage.loadData(ujs_seob.preferencesKey, ujs_seob.preferencesKey);
      }
      else if(id == ujs_seob.preferencesKey)
      {
        if(!data)
        {
          ujs_seob.storage.loadData(ujs_seob.domainKey, ujs_seob.domainKey);
          return;
        }

        ujs_seob.preferences.load(data);
        ujs_seob.storage.loadData(ujs_seob.domainKey, ujs_seob.domainKey);
      }
      else if(id == ujs_seob.domainKey)
      {
        if(ujs_seob.op[1][0])
        {
          ujs_seob.loadDomainRatings();
          ujs_seob.init();
          return;
        }

        ujs_seob.loadDomainInfo(data);
        ujs_seob.init();
      }
    },

    switchState: function()
    {
      ujs_seob.SEObarState = !ujs_seob.SEObarState;

      ujs_seob.storage.saveData(ujs_seob.SEObarState, ujs_seob.stateKey);

      if(!ujs_seob.SEObarState)
        ujs_seob.closeSEObar();
      else
      {
        ujs_seob.bInit = false;
        ujs_seob.init();
      }
    },

    preferences: {
      main: ['ujs_seob.version.exact', 'ujs_seob.bCollapsedPanel', 'ujs_seob.op[0][0]', 'ujs_seob.op[1][0]', 'ujs_seob.op[2][0]', 'ujs_seob.highlightNoindex', 'ujs_seob.highlightNofollow', 'ujs_seob.highlightExternalLinks', 'ujs_seob.currentLanguage'],

      save: function()
      {
        var v1 = [];
        for(var i = 0; i < ujs_seob.preferences.main.length; i++)
        {
          v1.push(eval(ujs_seob.preferences.main[i]));
        }

        var v2 = {};
        for(var i in ujs_seob.elements)
        {
          var o = null;
          for(var j = 0; j < ujs_seob.elements[i].length; j++)
          {
            var a = [];
            for(var k = 0; k < ujs_seob.elements[i][j].data.length; k++)
            {
              var d = ujs_seob.elements[i][j].data[k];
              if(d.display >= 0)
                a.push(d.display);
            }

            if(a.length > 0)
            {
              if(!o)            
                o = {};
              
              o[ujs_seob.elements[i][j].storageTitle] = a;
            }  
          }
          
          if(o)
            v2[i] = o;
        }

        v2 = ujs_seob.serialize(v2);

        var v3 = [];
        for(var i = 0; i < ujs_seob.panelBtn.length; i++)
        {
          v3.push(ujs_seob.panelBtn[i].display);
        }

        v4 = [];
        for(var i = 0; i < ujs_seob.opPosition.length; i++)
        {
          v4.push(ujs_seob.opPosition[i][0]);
        }

        ujs_seob.storage.saveData(v1.join(',') + '\t' + v2 + '\t' + v3.join(',') + '\t' + v4.join(','), ujs_seob.preferencesKey);
      },

      load: function(data)
      {
        if(!data)
          return;

        data = data.split('\t');
        if(!data || data.length == 0)
          return;

        v = data[0];
        if(!v)
          return;

        v = v.split(',');
        if(v.length != ujs_seob.preferences.main.length)
          return;

        if(v[0] != ujs_seob.version.exact)
        {
          if(confirm(ujs_seob.lng.seobar.installed))
          {
            ujs_seob.deleteData();
            return;
          }
        }

        for(var i = 1; i < v.length; i++)
        {
          try
          {
            eval(ujs_seob.preferences.main[i] + '=' + v[i]);
          }
          catch(e)
          {
            eval(ujs_seob.preferences.main[i] + '="' + v[i] + '"');
          }
        }

        ujs_seob.setLanguage(ujs_seob.currentLanguage);

        if(data.length > 1)
        {
          v = data[1];
          if(v)
          {
            v = ujs_seob.unserialize(v);
            for(var i in ujs_seob.elements)
            {
              if(v[i])
              {
                for(var j = 0; j < ujs_seob.elements[i].length; j++)
                {
                  var t = ujs_seob.elements[i][j].storageTitle;
                  if(v[i][t] && v[i][t].length > 0)
                  {
                    var index = 0;
                    for(var k = 0; k < ujs_seob.elements[i][j].data.length; k++)
                    {
                      var d = ujs_seob.elements[i][j].data[k];
                      if(d.display >= 0)
                      {
                        d.display = v[i][t][index];
                        index++;
                      }
                    }
                  }
                }
              }
            }
          }
        }

        if(data.length > 2)
        {
          v = data[2];
          if(v)
          {
            v = v.split(',');
            var index = 0;
            for(var i = 0; i < ujs_seob.panelBtn.length && index < v.length; i++)
            {
              v[index] = parseInt(v[index]);
              if(!isNaN(v[index]))
                ujs_seob.panelBtn[i].display = v[index];

              index++;
            }
          }
        }

        if(data.length > 3)
        {
          v = data[3];
          if(v)
          {
            v = v.split(',');
            if(v.length == ujs_seob.opPosition.length)
            {
              for(var i = 0; i < ujs_seob.opPosition.length; i++)
              {
                v[i] = parseInt(v[i]);
                if(!isNaN(v[i]))
                  ujs_seob.opPosition[i][0] = v[i];
              }
            }
          }
        }
      }
    },
    
    serializeDomainRatings: function()
    {
      var v = {};
      for(var i in ujs_seob.elements)
      {
        var o = null;
        for(var j = 0; j < ujs_seob.elements[i].length; j++)
        {
          var a = [];
          for(var k = 0; k < ujs_seob.elements[i][j].data.length; k++)
          {
            var d = ujs_seob.elements[i][j].data[k];
            if(d.store)
              a.push(d.value);
          }

          if(a.length > 0)
          {
            if(!o)            
              o = {};
              
            o[ujs_seob.elements[i][j].storageTitle] = a;
          }   
        }
        
        if(o)        
          v[i] = o;
      }

      return ujs_seob.serialize(v);
    },
    
    unserializeDomainRatings: function(str)
    {
      if(!str)
        return;
        
      v = ujs_seob.unserialize(str);
      for(var i in ujs_seob.elements)
      {
        if(v[i])
        {
          for(var j = 0; j < ujs_seob.elements[i].length; j++)
          {
            var t = ujs_seob.elements[i][j].storageTitle;
            if(v[i][t] && v[i][t].length > 0)
            {
              var index = 0;
              for(var k = 0; k < ujs_seob.elements[i][j].data.length; k++)
              {
                var d = ujs_seob.elements[i][j].data[k];
                if(d.store)
                {
                  d.value = v[i][t][index];
                  index++;
                }
              }
            }
          }
        }
      }
    },

    saveDomainInfo: function()
    {
      if(ujs_seob.op[1][0])
      {
        ujs_seob.saveDomainRatings();
        return;
      }
      
      var v = ujs_seob.serializeDomainRatings();      
      if(v)
        ujs_seob.storage.saveData(location.host + '\t' + v, ujs_seob.domainKey);
    },

    loadDomainInfo: function(data)
    {
      if(!data)
        return;

      v = data.split('\t', 2);
      if(v && v.length == 2 && v[0] == location.host)
        ujs_seob.unserializeDomainRatings(v[1]);
    },

    deleteData: function()
    {
      ujs_seob.storage.deleteData(ujs_seob.stateKey);
      ujs_seob.storage.deleteData(ujs_seob.preferencesKey);
      ujs_seob.storage.deleteData(ujs_seob.domainKey);
    },

    saveDomainRatings: function()
    {
      var v = ujs_seob.serializeDomainRatings();
      if(v)
      {
        var exp = new Date();
        var msec = exp.getTime();
        msec += ujs_seob.domainRatingStorageTime * 60000;
        exp = new Date(msec);
        ujs_seob.setCookie(ujs_seob.domainRatingKey, v, exp, location.host);
      }
    },

    loadDomainRatings: function()
    {
      var v = ujs_seob.getCookie(ujs_seob.domainRatingKey);
      if(!v)
        return;
        
      ujs_seob.unserializeDomainRatings(v);
    },

    init: function()
    {
      if(!ujs_seob.SEObarState)
        return;

      if(ujs_seob.bInit)
        return;

      ujs_seob.bInit = true;

      if(ujs_seob.bDisableScriptByPanelCollapse)
        ujs_seob.op[0][0] = ujs_seob.bCollapsedPanel;

      if(ujs_seob.bPanel)
      {
        ujs_seob.createStyle();
        // create panel
        var panel = document.createElement('DIV');
        panel.id = ujs_seob.panelId;
        document.documentElement.appendChild(panel);
        ujs_seob.setPanelData();
      }

      if(ujs_seob.bStatusbar)
      {
        ujs_seob.setStatusbarData();
      }

      ujs_seob.highlightElements();

      if(ujs_seob.op[0][0])
        return;

      ujs_seob.getMainRatings();
    },

    getNextValue: function(panel, data, id)
    {
      if(data.value != ujs_seob.busyRank)
        return;

      ujs_seob.getRatings(panel, '', id);
    },

    stopBusyIndicator: function(data)
    {
      if(data.value != ujs_seob.busyRank)
        return;

      data.value = '';
      ujs_seob.setPanelData();
    },

    setBusyState: function(panel, data, id)
    {
      with(ujs_seob)
      {
        data.value = busyRank;
        setPanelData();
        setTimeout(getNextValue, getNextValueDelay, panel, data, id);
        setTimeout(stopBusyIndicator, busyWaitDelay, data);
      }
    },

    getRatings: function(panel, data, id)
    {
      var mode = ujs_seob.getTh(ujs_seob.more[panel]);

      if(!id || id < 0)
        id = 0;

      with(ujs_seob)
      {
        if(typeof(id) == 'number')
        {
          if(id >= elements[panel].length)
            return;

          if(elements[panel][id].data[0].display <= mode && !elements[panel][id].data[0].value)
          {
            setBusyState(panel, elements[panel][id].data[0], id + 1);
            getInfoFromFrame(elements[panel][id].frame);
          }
          else
          {
            getRatings(panel, '', id + 1);
          }
          return;
        }
        else
        {
          for(var i = 0; i < elements[panel].length; i++)
          {
            if(id == elements[panel][i].frame.frameToken)
            {
              elements[panel][i].parse(elements[panel][i], data);
              getRatings(panel, '', i + 1);
              return;
            }
          }
        }
      }
    },

    getMainRatings: function(data, id)
    {
      ujs_seob.getRatings('main', data, id);
    },

    getIndexedPagesRatings: function(data, id)
    {
      ujs_seob.getRatings('indexedPages', data, id);
    },

    getBackwardLinksRatings: function(data, id)
    {
      ujs_seob.getRatings('backwardLinks', data, id);
    },

    getDirectoriesRatings: function(data, id)
    {
      ujs_seob.getRatings('directories', data, id);
    },

    getOtherRatings: function(data, id)
    {
      ujs_seob.getRatings('other', data, id);
    },

    getUpdateInfo: function(data, id)
    {
      if(!id)
      {
        ujs_seob.getInfoFromFrame(ujs_seob.elements.update[0].frame);
      }
      else if(id == ujs_seob.elements.update[0].frame.frameToken)
      {
        if(data != undefined)
          ujs_seob.elements.update[0].data[0].value = data;

        ujs_seob.setPanelData();
      }
    },

    refreshRatings: function(panel)
    {
      for(var i = 0; i < ujs_seob.elements[panel].length; i++)
      {
        for(var j = 0; j < ujs_seob.elements[panel][i].data.length; j++)
        {
          ujs_seob.elements[panel][i].data[j].value = '';
        }
      }

      ujs_seob.setPanelData();
      ujs_seob.getRatings(panel);
    },

    getInfoFromFrame: function(frameObj)
    {
      var obj = document.getElementById(frameObj.frameId);
      if(obj)
        frameObj.getData(frameObj.frameToken);
      else
        frameObj.createFrame(frameObj);
    },

    groupDigits: function(number)
    {
      if(number.length <= 3)
        return number;

      var r = number.length % 3;
      var n = Math.floor(number.length / 3);
      var i = 0;

      var res = '';
      if(r > 0)
      {
        res += number.substr(i, r);
        i += r;
        res += ujs_seob.digitGroupingSymbol;
      }

      var sep = '';
      for(var k = 0; k < n; k++)
      {
        res += sep;
        sep = ujs_seob.digitGroupingSymbol;
        res += number.substr(i, 3);
        i += 3;
      }

      return res;
    },

    reloadImage: function(src)
    {
      if(!src)
        return;

      var img = new Image();
      img.src = src;

      if(src.search(/data\/image/i) != -1)
      {
        ujs_seob.request(src, function(r){});
        return;
      }
      else
      {
        var f = document.createElement('iframe');
        f.src = img.src;
        f.width = 0;
        f.height = 0;
        f.frameBorder = 'no';
        f.scrolling = 'no';
        f.onload = function(){
          this.parentNode.removeChild(this);
        };
        document.documentElement.appendChild(f);
      }
    },

    getBusyIndicator: function()
    {
      if(ujs_seob.busyIndicator.useImage)
      {
        ujs_seob.reloadImage(ujs_seob.busyIndicator.image);
        return '<img alt="wait" title="" src="' + ujs_seob.busyIndicator.image + '" />';
      }
      else
        return ujs_seob.busyIndicator.text;
    },

    highlightElements: function()
    {
      var extAtName = 'external';
      var extAtValue = '1';
      var ext = 'a[' + extAtName + '="' + extAtValue + '"]';

      var child = '{color: inherit !important; background: inherit !important;}';
      var css = '';
      if(ujs_seob.highlightNoindex)
      {
        css += 'noindex {' + ujs_seob.style.noindex + ujs_seob.style.highlight + '} ';
        css += 'noindex * ' + child + ' ';
      }

      if(ujs_seob.highlightNofollow)
      {
        css += '*[rel*="nofollow"] {' + ujs_seob.style.nofollow + ujs_seob.style.highlight + '} ';
        css += ext + '[rel*="nofollow"] {' + ujs_seob.style.nofollow + ujs_seob.style.highlight + '} ';
        css += '*[rel*="nofollow"] * ' + child + ' ';
        css += ext + '[rel*="nofollow"] * ' + child + ' ';
      }

      if(ujs_seob.highlightExternalLinks)
      {
        css += ext + ' {' + ujs_seob.style.external + ujs_seob.style.highlight + '}';
        css += ext + ' * ' + child;
      }

      var style = document.getElementById(ujs_seob.highlightStyleId);
      if(style)
      {
        style.innerText = css;
      }
      else
      {
        ujs_seob.appendStyle(ujs_seob.highlightStyleId, css);
      }

      if(ujs_seob.highlightExternalLinks)
      {
        var a = document.getElementsByTagName('a');

        var domain = ujs_seob.getDomainName(document.location.hostname);
        domain = domain.toLowerCase();

        mdomain = ujs_seob.getMainDomainName(domain);
        if(mdomain)
          mdomain = mdomain.toLowerCase();

        for(var i = a.length - 1; i >= 0; i--)
        {
          if(a[i].getAttribute(ujs_seob.anchorAttribute.name, false) != ujs_seob.anchorAttribute.value &&
          a[i].getAttribute(extAtName, false) != extAtValue)
          {
            if(a[i].hostname)
            {
              var d = ujs_seob.getDomainName(a[i].hostname);
              d = d.toLowerCase();
              if(d != domain)
              {
                if(mdomain)
                {
                  var m = ujs_seob.getMainDomainName(d);
                  if(m)
                  {
                    m = m.toLowerCase();
                    if(m != mdomain)
                    {
                      a[i].setAttribute(extAtName, extAtValue, false);
                    }
                  }
                  else
                    a[i].setAttribute(extAtName, extAtValue, false);
                }
                else
                  a[i].setAttribute(extAtName, extAtValue, false);
              }
            }
          }
        }
      }
    },

    getMetaTags: function()
    {
      var txt = '';
      var title = document.getElementsByTagName('title');
      if(title && title.length > 0)
      {
        txt += '<tr><td class="hdr">Title</td><td>';
        txt += title[0].innerHTML + '</td></tr>';
      }

      var meta = document.getElementsByTagName('meta');
      for(var i = 0; i < meta.length; i++)
      {
        var at1 = meta[i].getAttribute('http-equiv', false);
        var at2 = 'content';
        if(!at1)
        {
          at1 = meta[i].getAttribute('name', false);
          at2 = 'content';
        }

        if(at1)
        {
          txt += '<tr><td class="hdr">' + at1 + '</td><td>';
          txt += meta[i].getAttribute(at2, false) + '</td></tr>';
        }
      }

      if(txt)
        return '<table>' + txt + '</table>';
      else
        return 'There is no information to display.';
    },

    getLinkStatistics: function()
    {
      var links = [
        [0, ujs_seob.lng.links.total],
        [0, ujs_seob.lng.links.internal],
        [0, ujs_seob.lng.links.subdomain],
        [0, ujs_seob.lng.links.external],
        [0, ujs_seob.lng.links.text],
        [0, ujs_seob.lng.links.image],
        [0, 'Nofollow'],
        [0, 'Noindex']
      ];

      var ext = [
        [0, ujs_seob.lng.links.text],
        [0, ujs_seob.lng.links.image],
        [0, 'Nofollow'],
        [0, 'Noindex']
      ];

      var a = document.getElementsByTagName('a');
      links[0][0] = a.length;

      var domain = ujs_seob.getDomainName(document.location.hostname);
      domain = domain.toLowerCase();

      mdomain = ujs_seob.getMainDomainName(domain);
      if(mdomain)
        mdomain = mdomain.toLowerCase();

      for(var i = a.length - 1; i >= 0; i--)
      {
        if(a[i].getAttribute(ujs_seob.anchorAttribute.name, false) == ujs_seob.anchorAttribute.value)
          links[0][0]--;
        else
        {
          var ex = false;
          if(a[i].hostname)
          {
            var d = ujs_seob.getDomainName(a[i].hostname);
            d = d.toLowerCase();
            if(d == domain)
              links[1][0]++; // internal
            else
            {
              if(mdomain)
              {
                var m = ujs_seob.getMainDomainName(d);
                if(m)
                {
                  m = m.toLowerCase();
                  if(m == mdomain)
                    links[2][0]++; // subdomain
                  else
                  {
                    links[3][0]++; // external
                    ex = true;
                  }
                }
                else
                {
                  links[3][0]++; // external
                  ex = true;
                }
              }
              else
              {
                links[3][0]++; // external
                ex = true;
              }
            }
          }
          else
            links[1][0]++; // internal

          if(a[i].innerHTML.match(/<img[^>]+>/i))
          {
            links[5][0]++; // image
            if(ex)
              ext[1][0]++; // external image
          }

          if(a[i].rel && a[i].rel.toLowerCase().indexOf('nofollow') != -1)
          {
            links[6][0]++; // nofollow
            if(ex)
              ext[2][0]++; // external nofollow
          }

          var parent = ujs_seob.getParentElement(a[i], '', '', 'noindex');
          if(parent)
          {
            links[7][0]++; // noindex
            if(ex)
              ext[3][0]++; // external noindex
          }
        }
      }

      links[4][0] = links[0][0] - links[5][0];
      ext[0][0] = links[3][0] - ext[1][0];

      var coef = 100;

      var stat = '<table><tr>';
      stat += '<tr><td class="hdr">' + links[0][1] + '</td><td>' + links[0][0] + '</td><tr>';

      for(var i = 0; i < ext.length; i++)
        links[3][1] += '<br /><span>-&nbsp;' + ext[i][1] + '</span>';


      for(var i = 1; i < links.length; i++)
      {
        stat += '<tr><td class="hdr">' + links[i][1] + '</td><td>' + links[i][0] + ' (';
        stat += ujs_seob.getPercentValue(links[0][0], links[i][0], coef).toString() + '%)';

        if(i == 3) // external
        {
          for(var j = 0; j < ext.length; j++)
          {
            stat += '<br />' + ext[j][0] + ' (';
            stat += ujs_seob.getPercentValue(links[3][0], ext[j][0], coef).toString() + '%)';
          }
        }

        stat += '</td></tr>';
      }

      stat += '</table>';

      return stat;
    },

    getHttpHeaders: function()
    {
      ujs_seob.httpHeaders = ujs_seob.lng.loadingWait;
      ujs_seob.setPanelData();
      ujs_seob.requestHeaders(true);
    },

    requestHeaders: function(bCheckStatusText)
    {
      var bCheck = bCheckStatusText;

      ujs_seob.request(location.href, function(r){
        if(bCheck && r.statusText != undefined && !r.statusText)
        {
          ujs_seob.requestHeaders(false);
          return;
        }

        ujs_seob.httpHeaders = 'Status: ' +  r.status;
        if(r.statusText)
          ujs_seob.httpHeaders += ' ' + r.statusText;

        ujs_seob.httpHeaders += '<br /><br /><table>';

        var a = r.getAllResponseHeaders().split('\n');
        for(var i = 0; i < a.length; i++)
        {
          if(a[i] && a[i] != '\n' && a[i] != '\r\n' && a[i] != '\r')
          {
            var ind = a[i].indexOf(':');
            if(ind >= 0)
            {
              ujs_seob.httpHeaders += '<tr><td class="hdr">' + a[i].substring(0, ind);
              ujs_seob.httpHeaders += '</td><td>' + a[i].substr(ind + 1) + '</td></tr>';
            }
            else
            {
              alert(a[i].length + '\n' + escape(a[i]))
              ujs_seob.httpHeaders += '<tr><td colspan="2" class="hdr">' + a[i] + '</td></tr>';
            }
          }
        }

        ujs_seob.httpHeaders += '</table>';
        ujs_seob.setPanelData();
      }, 'GET', '', '', '', '', {"Content-Type": "text/html"});
    },

    getSeobarInfo: function()
    {
      var mail = ujs_seob.version.email + '?subject=SEObar ' + ujs_seob.version.string;
      mail = 'mailto:' + escape(mail);
      mail = '<a href="' + mail + '">' + ujs_seob.version.email + '</a>';

      var homepage = '<a href="javascript:void(0);" ';
      homepage += 'onMouseUp="javascript:var wnd=window.open(\'' + ujs_seob.version.homepage + '\');">';
      homepage += ujs_seob.version.homepage + '</a>';
      var info = '<table>';
      info += '<tr><td class="hdr">' + ujs_seob.lng.seobar.version + '</td><td>' + ujs_seob.version.string + '</td></tr>';
      info += '<tr><td class="hdr">' + ujs_seob.lng.seobar.date + '</td><td>' + ujs_seob.version.date + '</td></tr>';
      info += '<tr><td class="hdr">' + ujs_seob.lng.seobar.author + '</td><td>' + ujs_seob.version.author + '</td></tr>';
      info += '<tr><td class="hdr">E-Mail</td><td>' + mail + '</td></tr>';
      info += '<tr><td class="hdr">' + ujs_seob.lng.seobar.homepage + '</td><td>' + homepage + '</td></tr>';
      var discussion = '', sep = '';;
      for(var i = 0; i < ujs_seob.version.discussion.length; i++)
      {
        var d = '';
        if(ujs_seob.version.discussion[i].length == 3)
        {
          var l = ujs_seob.version.discussion[i][0];
          d += (ujs_seob.lng.seobar[l] ? ujs_seob.lng.seobar[l] : l)  + ': ';
          d += '<a href="' + ujs_seob.version.discussion[i][1] + '">';
          d += ujs_seob.version.discussion[i][2] + '</a>';
        }
        if(d)
        {
          discussion += sep + d;
          sep = '<br />';
        }
      }
      if(discussion)
        info += '<tr><td class="hdr">' + ujs_seob.lng.seobar.discussion + '</td><td>' + discussion + '</td></tr>';


      info += '</table><br />';

      var icons = ['Panel Widgets', 'Top10', 'Panel Info', 'Trust Unknown', 'View', 'Resume transfer', 'Panel Bookmarks', 'Smiley Cool', 'Smiley Pacman', 'Opera Logo'];

      info += '<div id="SEObar_stapler_buttons_box" style="border: 1px solid #e0e0e0 !important; padding: 0 !important;">';
      info += '<div class="SEObar_stapler_buttons_hdr" style="background-color: #f0f0f0 !important; border-bottom: 1px solid #e0e0e0 !important; padding: 3px 10px !important;">' + ujs_seob.lng.seobar.onOffButton + '</div>';
      info += '<div id="SEObar_stapler_buttons" style="padding: 3px 10px !important; vertical-align: middle !important; line-height: 1.6 !important;">';

      for(var i = 0; i < icons.length; i++)
      {
        info += '<a href="opera:/button/Go%20to%20page,%22javascript:if(window.ujs_seob%20&&%20window.ujs_seob.switchState){ujs_seob.switchState();}%22,,SEObar,%22' + escape(icons[i]) + '%22"';
        info += ' class="SEObar_stapler_button" title="' + icons[i] + '"';
        info += ' style="display: inline-block !important; margin-right: 20px !important; text-decoration: none !important; border: none !important;';
        info += " background-image: -o-skin('" + icons[i] + "') !important; width: -o-skin !important; height: -o-skin !important;";
        info += '"> </a>';
      }
      info += '<br />' + ujs_seob.lng.seobar.onOffText;
      info += '</div></div><br />';

      info += '<input type="button" value="' + ujs_seob.lng.seobar.checkForUpdates + '" onMouseUp="ujs_seob.getUpdateInfo()" />';

      return info;
    },

    getPercentValue: function(whole, part, coefficient)
    {
      if(whole == 0 || part == 0)
        return 0;

      if(coefficient == 0)
        coefficient = 1;

      var p = ((part / whole) * 100) * coefficient;
      p = Math.round(p);
      p = p / coefficient;
      return p;
    },

    setCookie: function(name, value, expires, domain)
    {
      value = value ? escape(value) : '';
      domain = domain ? domain : '';
      expires = expires ? expires.toGMTString() : '';

      setTimeout(function(){document.cookie = name + '=' + value + '; domain=' + domain + '; path=/; expires=' + expires;}, 10);
    },


    getCookie: function(name)
    {
      var prefix = name + '=';
      var i1 = document.cookie.indexOf(prefix);
      if (i1 == -1)
        return null;

      var i2 = document.cookie.indexOf(";", i1 + prefix.length);
      if (i2 == -1)
        i2 = document.cookie.length;

      var len = prefix.length;

      return unescape(document.cookie.substring(i1 + len, i2));
    },

    deleteCookie: function(name, domain)
    {
      domain = domain ? domain : '';
      setTimeout(function(){document.cookie = name + '=; domain=' + domain + '; path=/; expires=' + new Date((new Date).getTime()-1e11).toGMTString();}, 10);
    },

    isOpera10: function()
    {
      if(typeof(window.opera.version) == 'function' && window.opera.version() >= 10)
      {
        return true;
      }
      return false;
    },

    checkForFakePR: function(url1, url2)
    {
      var w = window.open();
      with(w.document)
      {
        write(
          '<html><head><title>Fake PR Check</title><style type="text/css">\n'
          +'body,body * {color:#000;background-color:#fff;font-family:' + ujs_seob.fontFamily + ';font-size:13px;margin:0;padding:0;}\n'
          +'a{color:#3060c0;text-decoration:none;} p{margin-bottom:1em;}'
          +'div#main{text-align: center; padding:5px 0;} div#cnt{border:1px solid #fff;margin:0 auto;padding:10px;width:780px;text-align:center;}\n'
          +'h1{color:#404040;font-size:16pt;font-weight:normal;text-align:center;margin-bottom:1em;}\n'
          +'</style></head><body><div id="main"><div id="cnt"><h1>Fake PR Check</h1>\n'
          +'<p><a href="' + url1 + '">' + url1 + '</a><br><br>\n'
          +'<iframe src="' + url1 + '" width="100%" height="300" frameborder="1" scrolling="yes"></iframe></p><br><br>\n'
          +'<p><a href="' + url2 + '">' + url2 + '</a><br><br>\n'
          +'<iframe src="' + url2 + '" width="100%" height="300" frameborder="1" scrolling="yes"></iframe></p>\n'
          +'<div></div></body></html>'
        );
      }
    },

    multiDatacenterPR: function()
    {
      var w = window.open();
      with(w.document)
      {
        write(
          '<html><head><title>Multi Datacenter Page Rank</title><style type="text/css">\n'
          +'body,body * {color:#000;background-color:#fff;border:none;font-family:' + ujs_seob.fontFamily + ';font-size:13px;margin:0;padding:0;}\n'
          +'a{color:#3060c0;text-decoration:none;} table{empty-cells:show;border-collapse:collapse;}\np{margin-bottom:1em;}'
          +'div#main{text-align: center; padding:5px 0;} div#cnt{border:1px solid #fff;margin:0 auto;padding:10px;width:680px;text-align:center;}\n'
          +'h1{color:#404040;font-size:16pt;font-weight:normal;text-align:center;margin-bottom:1em;}\n'
          +'.dc{margin:0 auto; width: 360px;} .dc th,td{border:1px solid #d0d0d0;padding:3px 10px;vertical-align: middle;}\n'
          +'.dc td iframe{display:block;margin:-3px auto;} .dc th{background-color:#e5e5e5;} .dc tr.even{background-color:#f5f5f5;}\n'
          +'</style><script type="text/javascript">\n'
          +'var dc1=["www.google.com","toolbarqueries.google.com","64.233.161.104","64.233.167.104","72.14.203.104","64.233.171.104","64.233.179.104","64.233.183.104","64.233.185.104","64.233.187.104","64.233.189.104","64.233.161.99","66.102.9.104","66.102.11.104","66.249.89.104","66.249.93.104","72.14.247.104","72.14.255.104","209.85.129.104","209.85.133.104","209.85.135.104","209.85.139.104","209.85.143.104","72.14.207.184","216.239.51.104","72.14.221.18"];\n'
          +'var dc2=["72.14.221.93","72.14.221.99","209.85.129.18","209.85.129.19","209.85.129.44","209.85.129.80","209.85.129.81","209.85.129.83","209.85.129.84","209.85.129.99","209.85.129.100","209.85.129.101","209.85.129.102","209.85.129.104","209.85.129.107","209.85.129.115","64.233.161.18","64.233.161.19","64.233.161.44","64.233.161.80","64.233.161.81","64.233.161.83","64.233.161.84","64.233.161.91","64.233.161.93","64.233.161.95","64.233.161.100","66.102.7.104","216.239.63.104","72.14.221.19","72.14.221.44","72.14.221.80","72.14.221.81","72.14.221.83","72.14.221.84","72.14.221.91","72.14.221.93","72.14.221.99","72.14.221.101"];\n'
          +'var pageurl="'+window.location.href+'", hash="#ujs_SEObar_Google_Multi_PR", number=1, frame=1; timer=null;\n'
          +ujs_seob.googleFrame.gpr_toHex8 + '\n' + ujs_seob.googleFrame.gpr_hexEncodeU32 + '\n' + ujs_seob.googleFrame.gpr_ch + '\n'
          +'var getSrc = ' + ujs_seob.googleFrame.getSrc + ';\n'
          +'function getFrame(host, n){var src=getSrc(host,pageurl)+hash+n.toString(); var f=\'<iframe id="frame\'+n+\'" title="\'+src+\'" width="100" height="19" frameborder="0" scrolling="no" style="display:none;" ujs_external_unblocked="1"></iframe>\'; return f;}\n'
          +'function getTable(dc, url){var t=\'<table class="dc"><tr><th>#</th><th width="100%">Datacenter</th><th>PageRank</th></tr>\'; var even=false; for(var i=0; i<dc.length; i++){var c=even ? \' class="even"\' : \'\'; t+=\'<tr\'+c+\'><td>\'+number+\'</td><td><a href="http://\'+dc[i]+\'">\'+dc[i]+\'</a></td><td>\'+getFrame(dc[i], number)+\'</td></tr>\'; even=!even; number++;} t+=\'</table>\'; return t;}\n'
          +'function more(){var d = document.getElementById("more"); if(d){d.innerHTML = getTable(dc2, pageurl); clearTimeout(timer); getPR(); getPR(); getPR();}}\n'
          //+'function createFrame(host, number, parent){var f=document.createElement("iframe"); f.src=getSrc(host,pageurl)+hash+number.toString(); f.width=0; f.height=0; f.frameBorder="no"; f.scrolling="no"; f.setAttribute("ujs_external_unblocked","",false); parent.appendChild(f);}\n'
          +'function getPR(){var e=document.getElementById("frame"+frame); if(e){frame++; timer=setTimeout(getPR,5000); e.setAttribute("src", e.getAttribute("title", false), false); e.parentNode.appendChild(document.createTextNode("..."));}}\n'
          +'window.addEventListener("message",function(e){if(e.data&&(e.data.indexOf(hash)==0)){var d=e.data.split("\\n"); if(d.length>0){var r=decodeURIComponent(d[1]); var id=d[0].substring(hash.length); id=parseInt(id); if(!isNaN(id)){clearTimeout(timer); getPR(); var e=document.getElementById("frame"+id); if(e){e.parentNode.innerHTML=r;}}}}}, false);\n'
          +'</script></head><body><div id="main"><div id="cnt"><h1>Multi Datacenter Page Rank</h1>\n'
          +'<p>' + window.location.href + '</p>\n'
          +'<script type="text/javascript">window.document.write(getTable(dc1, pageurl)); getPR();getPR();getPR();</script>\n'
          +'<br><br><div><a href="javascript:void(0)" onclick="this.outerHTML=this.innerText; more();">Display the PageRank from other datacenters</a></div><br><br><div id="more"></div><br><br>\n'
          +'<div></div></body></html>'
        );
      }
    },

    localStorage: {
      get: function(key)
      {
        return localStorage[key];
      },

      set: function(key, value)
      {
        localStorage[key] = value;
      },

      del: function(key)
      {
        localStorage.removeItem(key);
      }
    },

    request: function(url, callback, method, referer, post, cookie, user_agent, header)
    {
      var req = new XMLHttpRequest();
      if (!req)
        return;

      method = method ? method : ((post) ? 'POST' : 'GET');
      user_agent = user_agent ? user_agent : navigator.userAgent;

      req.open(method, url, true);

      req.setRequestHeader('User-Agent', user_agent);
      if(referer)
      {
        req.setRequestHeader('Referer', referer);
      }
      if(cookie)
      {
        req.setRequestHeader('Cookie', cookie);
      }
      if (post)
      {
        if(!(header && header['Content-type']))
          req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

        req.setRequestHeader("Content-Length", post.length);
      }
      if(header)
      {
        for(var i in header)
        {
          req.setRequestHeader(i, header[i]);
        }
      }

      req.onreadystatechange = function ()
      {
        if (req.readyState != 4)
          return;

        callback(req);
      };

      if (req.readyState == 4)
      {
        return;
      }

      if(post)
        req.send(post);
      else
        req.send();
    },

    isArray: function(obj)
    {
      if(obj.constructor.toString().indexOf("Array") == -1)
        return false;

      return true;
    },

    objToString: function(obj)
    {
      switch(typeof(obj))
      {
        case 'object':
          return ujs_seob.serialize(obj);

        case 'number':
          return obj;

        case 'boolean':
          return obj ? 'true' : 'false';

        case 'function':
          return '"function"';

        case 'undefined':
          return 'undefined';

        default:
          return '"' + encodeURIComponent(obj) + '"';
      }

      return '""';
    },

    serialize: function(obj)
    {
      var res = '', sep = '';

      if(typeof(obj) != 'object')
        return '';

      if(!obj)
        return 'null';

      if(ujs_seob.isArray(obj)) // array
      {
        res = '[';
        for(var i = 0; i < obj.length; i++)
        {
          res += sep + ujs_seob.objToString(obj[i]);
          sep = ',';
        }
        res += ']';
      }
      else
      {
        res = '{';
        for(var i in obj)
        {
          res += sep + '"' + i + '":' + ujs_seob.objToString(obj[i]);
          sep = ',';
        }
        res += '}';
      }

      return res;
    },

    unserialize: function(str)
    {
      var obj = {};
      try
      {
        obj = eval('(' + str + ')');
        ujs_seob.restoreStrings(obj);
      }
      catch(err)
      {
      }

      return obj;
    },

    restoreStrings: function(obj)
    {
      if(typeof(obj) != 'object')
        return obj;

      if(!obj)
        return obj;

      if(ujs_seob.isArray(obj)) // array
      {
        for(var i = 0; i < obj.length; i++)
        {
          if(typeof(obj[i]) == 'object')
            ujs_seob.restoreStrings(obj[i]);
          else if(typeof(obj[i]) == 'string')
            obj[i] = decodeURIComponent(obj[i]);
        }
      }
      else
      {
        for(var i in obj)
        {
          if(typeof(obj[i]) == 'object')
            ujs_seob.restoreStrings(obj[i]);
          else if(typeof(obj[i]) == 'string')
            obj[i] = decodeURIComponent(obj[i]);
        }
      }
    }
  };

  (function(){
    if(!window.opera)
      return;

    if(window.opera.ujs_SEObar_switch_off)
      return;

    ujs_seob.storage.domain = ujs_seob.fakeDomain;
    ujs_seob.storage.getDataFunction = ujs_seob.getDataFromStorage;

    ujs_seob.setLanguage();
    ujs_seob.initElements();

    var bFrame = false;
    try
    {
      if(window.parent != window)
      {
        bFrame = true;
      }
    }
    catch(e)
    {
      bFrame = true;
    }

    var prevent = function(e) {
      e.preventDefault();
    };

    if(!bFrame)
    {
      if(window.location.hostname.search(/(?:yandex\.ru|google\.(?:com|[a-z][a-z]))$/i) != -1)
      {
        return;
      }

      if(ujs_seob.urlFilter &&
        window.location.href.search(ujs_seob.urlFilter) != -1)
      {
        return;
      }

      if(ujs_seob.includeUrlFilter &&
        window.location.href.search(ujs_seob.includeUrlFilter) == -1)
      {
        return;
      }

      if(ujs_seob.excludeUrlFilter &&
        window.location.href.search(ujs_seob.excludeUrlFilter) != -1)
      {
        return;
      }

      var onMessage = function(e) {
        if(ujs_seob.storage.processMessage(e, false))
          return;

        with(ujs_seob)
        {
          for(var i in ujs_seob.elements)
          {
            for(var j = 0; j < ujs_seob.elements[i].length; j++)
            {
              if(ujs_seob.elements[i][j].frame.processMessage(e))
              return;
            }
          }
        }
      };

      // main document
       window.addEventListener('load', function(e) {
        if(!ujs_seob.bPanel && !ujs_seob.bStatusbar)
        {
          return;
        }

        var onload = function(){
          var f = function(){
            ujs_seob.storage.loadData(ujs_seob.stateKey,ujs_seob.stateKey);
          };
          try
          {
            setTimeout(f, ujs_seob.requestDelay);
          }
          catch(e){}
        };
        ujs_seob.storage.createFrame(ujs_seob.sFrameId, onload);
      }, false);


      window.addEventListener('message', onMessage, false);
    }

    else if(window.location.host == ujs_seob.fakeDomain)
    {
      // Storage frame
      window.opera.addEventListener('BeforeExternalScript', prevent ,false);
      window.opera.addEventListener('BeforeScript', prevent, false);
      window.opera.addEventListener('BeforeEventListener.load', prevent, false);
      window.opera.addEventListener('BeforeEventListener.message', function(e) {
        if(!e.event.data || (e.event.data.indexOf(ujs_seob.storage.msgPrefix) == -1))
          e.preventDefault();
      }, false);

      window.addEventListener('message', function(e){
        if(ujs_seob.storage.processMessage(e, true))
          return;
      }, false);
    }


    else if(window.location.hash.indexOf('#ujs_SEObar_Google_Multi_PR') != -1)
    {
      var bLoaded = false;
      var onLoad = function()
      {
        if(bLoaded)
          return;

        var r = ujs_seob.googleFrame.getDataFromDocumentFunction(ujs_seob.googleFrame);
        if(r)
        {
          bLoaded = true;
        }
        r = r ? r : 'n/a';
        var msg = window.location.hash + '\n' + encodeURIComponent(r);
        ujs_seob.postMessage(msg, window.parent.document, window.parent);
      };
      onLoad();
      window.opera.addEventListener('BeforeEventListener.message', prevent, false);
      window.opera.addEventListener('BeforeEventListener.DOMContentLoaded', prevent, false);
      window.opera.addEventListener('BeforeEventListener.load', function(e){
        e.preventDefault();
        onLoad();
        bLoaded = true;
      }, false);
      window.addEventListener('load', function(){var a=0;}, false);
    }

    else
    {
      // Data frames
      var id = window.location.hash.indexOf(ujs_seob.urlToken);
      if(id == -1)
        return;

      id = window.location.hash.substr(id + ujs_seob.urlToken.length);
      var frameObj = null;

      for(var i in ujs_seob.elements)
      {
        for(var j = 0; j < ujs_seob.elements[i].length; j++)
        {
          if(ujs_seob.elements[i][j].frame.frameToken == id)
          {
            frameObj = ujs_seob.elements[i][j].frame;
            break;
          }
        }
      }

      if(!frameObj)
        return;

      var bLoaded = false;

      if(frameObj.msgPrefix != 'SEObar_update')
      {
        window.opera.addEventListener('BeforeExternalScript', prevent ,false);
        window.opera.addEventListener('BeforeScript', prevent, false);
      }
      window.opera.addEventListener('BeforeEventListener.message', prevent, false);

      if(frameObj.style)
      {
        ujs_seob.appendStyle('', frameObj.style);
      }

      function onLoad()
      {
        if(bLoaded)
          return;

        bLoaded = true;
        frameObj.getData(id);
      }

      window.opera.addEventListener('BeforeEventListener.load', function(e) {
        e.preventDefault();
        onLoad();
      }, false);

      window.opera.addEventListener('BeforeEventListener.DOMContentLoaded', function(e) {
        e.preventDefault();
        onLoad();
      }, false);

      window.addEventListener('DOMContentLoaded', function(){var a = 0;}, false);
      window.addEventListener('load', function(){var a = 0;}, false);
    }

  })();

/////////////////////////////////////////////////
// ujs_seobarFrame

function ujs_seobarFrame(prefix, frameId, frameToken, url, domain)
{
  this.msgPrefix = prefix;
  this.frameId = frameId;
  this.frameToken = frameToken;
  this.url = url;
  this.checkUrl = '';
  this.domain = domain;
  // Function for obtaining data from document.
  // returns - the data string.
  this.getDataFromDocumentFunction = null;
  // Function to which the received data will be transferred.
  // 1-st parameter - data string,
  // 2-nd parameter - identifier allowing to determine type of data.
  this.getDataFunction = null;
  // Function
  this.isObjectLoaded = null;
  this.updateUrl = null;

  this.deleteFrame = true;
  this.style = '';
  this.msg = '_frame_data';

  this.dataSeparator = '\n';
  this.msgSeparator = '\n';

  this.autoPostMessage = true;

  this.getUrl = function()
  {
    if(this.checkUrl)
      return this.checkUrl;

    return this.url;
  };

  this.createFrame = function()
  {
    if(this.updateUrl)
      this.updateUrl(this);

    if(!this.url)
    {
      alert('ujs_seobarFrame: [url] property must be initialized before calling [createFrame] function.');
      return;
    }

    if(!this.frameId)
    {
      alert('ujs_seobarFrame: [frameId] property must be initialized before calling [createFrame] function.');
      return;
    }

    if(!this.isObjectLoaded)
    {
      alert('ujs_seobarFrame: [isObjectLoaded] property must be initialized before calling [createFrame] function.');
      return;
    }

    var f = document.createElement('IFRAME');
    f.src = this.url;
    f.id = this.frameId;
    f.width = 0;
    f.height = 0;
    f.frameBorder = 'no';
    f.scrolling = 'no';
    document.documentElement.appendChild(f);
  };

  this.getData = function(msgId)
  {
    if(!msgId)
    {
      alert('ujs_seobarFrame: Incorrect call to the [getData] function. [msgId] parameter is not specified.');
      return;
    }

    if(!this.msgPrefix)
    {
      alert('ujs_seobarFrame: [msgPrefix] property must be initialized before calling [getData] function.');
      return;
    }

    if(!this.getDataFromDocumentFunction)
    {
      alert('ujs_seobarFrame: [getDataFromDocumentFunction] property must be initialized before calling [getData] function.');
      return;
    }

    if(!this.getDataFunction)
    {
      alert('ujs_seobarFrame: [getDataFunction] property must be initialized before calling [getData] function.');
      return;
    }

    var data = this.getDataFromDocumentFunction(this);

    if(!this.autoPostMessage)
      return;

    var msg = this.msgPrefix + this.msg + this.msgSeparator + msgId;
    if(data)
    {
      data = encodeURIComponent(data);
    }
    msg += this.msgSeparator + data;
    ujs_seob.postMessage(msg, window.parent.document, window.parent);
  };

  this.processMessage = function(e)
  {
    if(e.data && (e.data.indexOf(this.msgPrefix) == 0))
    {
      if(this.domain && this.url.indexOf(this.domain) < 0)
      {
        alert('ujs_seobarFrame: The [domain]: "' + this.domain + '" is not a part of the [url]: "' + this.url + '"');
        return false;
      }


      var d = e.data.split(this.msgSeparator);
      if(d.length == 0)
      {
        return false;
      }

      if(d[0] == this.msgPrefix + this.msg)
      {
        // process message from frame
        var id = '', data = '';
        if(d[1])
          id = d[1];
        if(d[2])
          data = decodeURIComponent(d[2]);

        if(this.deleteFrame)
        {
          var frame = document.getElementById(this.frameId);
          if(frame)
          {
            frame.parentNode.removeChild(frame);
          }
        }

        this.getDataFunction(data, id);
        return true;
      }
    }

    return false;
  };
}



/////////////////////////////////////////////////
// Global Storage

function ujs_Storage(prefix, domain, getDataFunction)
{
  // Prefix used for recognition of the messages.
  this.msgPrefix = prefix;
  // Domain used for storing data in the localStorage.
  this.domain = domain;
  // Function for obtaining stored data.
  // 1-st parameter - data string,
  // 2-nd parameter - identifier allowing to determine type of data.
  this.getDataFunction = getDataFunction;

  this.frameId = '';
  this.msgSave = '_ujs_storage_save';
  this.msgLoad = '_ujs_storage_load';
  this.msgDelete = '_ujs_storage_delete';
  this.msgSeparator = '\n';

  this.createFrame = function(id, onload)
  {
    if(!id)
    {
      alert('UserJS Storage: Incorrect call to the [createFrame] function. [id] parameter is not specified.');
      return;
    }

    if(!this.domain)
    {
      alert('UserJS Storage: [domain] property must be initialized before calling [createFrame] function.');
      return;
    }

    this.frameId = id;

    var f = document.createElement('IFRAME');
    f.src = 'http://' + this.domain;
    f.id = id;
    f.width = 0;
    f.height = 0;
    f.frameBorder = 'no';
    f.scrolling = 'no';
    if(onload)
      f.onload = onload;
    document.documentElement.appendChild(f);
  };

  this.sendMessageToFrame = function(msg)
  {
    var f = document.getElementById(this.frameId);
    if(f)
    {
      ujs_seob.postMessage(msg, f.contentDocument, f.contentWindow);
    }
  };

  this.saveData = function(data, key)
  {
    if(!key)
    {
      alert('UserJS Storage: Incorrect call to the [saveData] function. [key] parameter is not specified.');
      return;
    }

    if(!this.msgPrefix)
    {
      alert('UserJS Storage: [msgPrefix] property must be initialized before calling [saveData] function.');
      return;
    }

    var msg = this.msgPrefix + this.msgSave + this.msgSeparator;
    msg += key + this.msgSeparator + encodeURIComponent(data);
    this.sendMessageToFrame(msg);
  };

  this.loadData = function(key, msgId)
  {
    if(!key)
    {
      alert('UserJS Storage: Incorrect call to the [loadData] function. [key] parameter is not specified.');
      return;
    }

    if(!msgId)
    {
      alert('UserJS Storage: Incorrect call to the [loadData] function. [msgId] parameter is not specified.');
      return;
    }

    if(!this.msgPrefix)
    {
      alert('UserJS Storage: [msgPrefix] property must be initialized before calling [loadData] function.');
      return;
    }

    if(!this.getDataFunction)
    {
      alert('UserJS Storage: [getDataFunction] property must be initialized before calling [loadData] function.');
      return;
    }

    var msg = this.msgPrefix + this.msgLoad + this.msgSeparator;
    msg += key + this.msgSeparator + msgId;
    this.sendMessageToFrame(msg);
  };

  this.deleteData = function(key)
  {
    if(!key)
    {
      alert('UserJS Storage: Incorrect call to the [deleteData] function. [key] parameter is not specified.');
      return;
    }

    if(!this.msgPrefix)
    {
      alert('UserJS Storage: [msgPrefix] property must be initialized before calling [deleteData] function.');
      return;
    }

    var msg = this.msgPrefix + this.msgDelete + this.msgSeparator;
    msg += key;
    this.sendMessageToFrame(msg);
  };

  this.processMessage = function(e, toFrame)
  {
    if(e.data && (e.data.indexOf(this.msgPrefix) == 0))
    {
      var d = e.data.split(this.msgSeparator);

      if(toFrame)
      {
        // process message to frame
        if(d[0] == this.msgPrefix + this.msgSave)
        {
          // save
          var key = '', data = '';
          if(d[1])
            key = d[1];
          else
            return true;

          if(d[2])
            data = d[2];

          ujs_seob.localStorage.set(key, data);
          return true;
        }
        else if(d[0] == this.msgPrefix + this.msgLoad)
        {
          // load
          var key = '', id = '';
          if(d[1])
            key = d[1];
          else
            return true;

          if(d[2])
            id = d[2];

          var data = ujs_seob.localStorage.get(key);
          var msg = this.msgPrefix + this.msgLoad + this.msgSeparator + id;
          if(data)
            msg += this.msgSeparator + data;

          e.source.postMessage(msg, '*');

          return true;
        }
        else if(d[0] == this.msgPrefix + this.msgDelete)
        {
          if(d[1])
            ujs_seob.localStorage.del(d[1]);

          return true;
        }
      }
      else if(d[0])
      {
        // process message from frame
        if(d[0] && d[0] == this.msgPrefix + this.msgLoad)
        {
          // load
          var id = '', data = '';
          if(d[1])
            id = d[1];
          if(d[2])
            data = decodeURIComponent(d[2]);

          this.getDataFunction(data, id);
        }

        return true;
      }
    }

    return false;
  };
}
