// ==UserScript==
// @name        SEObar
// @version     2.03
// @date        2007-02-28
// @author      Mike Samokhvalov <mikivanch@gmail.com>
// @download    http://www.puzzleclub.ru/files/seobar/seobar.js
// @exclude     file://*
// @exclude     ftp://*
// @exclude     http://www.alexa.com/*
// ==/UserScript==
// The SEObar's settings are saved only if cookies are allowed for domain 
// 8412ea42-008d-4621-b919-3cb2e38a2e6c.ru

// Description: http://www.puzzleclub.ru/files/seobar/


  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): /\/{1}$|index\.{1}[a-z]{3,5}$|default\.{1}[a-z]{3,5}$/i
    includeUrlFilter : null,
    // Example (exclude a pages with the "?" symbol): /\?{1}/
    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',
    
    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 : '8412ea42-008d-4621-b919-3cb2e38a2e6c.ru',
    
    // cookies's name where the SEObar stores it's settings
    preferencesCookie : 'SEObar_preferences',
    // cookies's name where the the current domain's info is stored.
    domainCookie : 'SEObar_domain',
    
    // 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
    domainRatingCookie : 'SEObar_domain_ratings',

    /////////////////////////////////////////////////////////////////
    // permanent settings. do not edit
    
    version : '2.03.00',
    versionString : '2.03',
    versionDate : 'February 28, 2007',
    versionAuthor : 'Mike Samokhvalov',
    versionAuthorEmail : 'mikivanch@gmail.com',
    versionHomepage : 'http://www.puzzleclub.ru/files/seobar/',
    versionDiscussion : new Array(      
      new Array('English', 'http://my.opera.com/community/forums/topic.dml?id=178339', 'my.opera.com'),
      new Array('Russian', 'http://operafan.net/component/option,com_smf/Itemid,50/topic,1451.0/', 'operafan.net')
    ),
    
    anchorAttributeName : 'seobar',
    anchorAttributeValue : '1',
    
    urlFilter : /\.jpg$|\.jpeg$|\.gif$|\.png$|\.tif$|\.tiff$|\.bmp$|\.txt$|\.js$|\.css$/i,    
    
    highlightStyle : 'color: #000 !important; border: 1px dotted #000 !important; padding: 2px !important; display: inline-block !important;',
    noindexStyle : 'background: #c8d0e7 !important; ',
    nofollowStyle : 'background: #d2e7c7 !important; ', 
    externalLinkStyle : 'background: #eedfc1 !important; ',
    
    scrollbarStyle : (
      "scrollbar-3dlight-color:#b3b3b3 !important; "
      +"scrollbar-arrow-color:#000 !important; "
      +"scrollbar-base-color:#d0d0d0 !important; "
      +"scrollbar-darkshadow-color:#919191 !important; "
      +"scrollbar-face-color:#d0d0d0 !important; "
      +"scrollbar-highlight-color:#f6f6f6 !important; "
      +"scrollbar-shadow-color:#cfcfdf !important; "
      +"scrollbar-track-color:#efefef !important;"
    ),
    
    
    storage : new ujs_Storage('SEObar'),
    
    urlToken : '#SEObar_frame_',
    
    alexaFrame : new ujs_seobarFrame(),
    googleFrame : new ujs_seobarFrame(),
    yandexFrame : new ujs_seobarFrame(),
    // Directories    
    dmozFrame : new ujs_seobarFrame(),
    yahooDirFrame : new ujs_seobarFrame(),
    yaCaFrame : new ujs_seobarFrame(),
    raTop100Frame : new ujs_seobarFrame(),
    // Backward Links
    googleLinkFrame : new ujs_seobarFrame(),
    yahooUrlLinkFrame : new ujs_seobarFrame(),
    yahooDomainLinkFrame : new ujs_seobarFrame(),
    msnUrlLinkFrame : new ujs_seobarFrame(),
    msnDomainLinkFrame : new ujs_seobarFrame(),
    yandexLinkFrame : new ujs_seobarFrame(),
    // Indexed Pages
    googleIndexFrame : new ujs_seobarFrame(),
    yahooIndexFrame : new ujs_seobarFrame(),
    msnIndexFrame : new ujs_seobarFrame(),
    yandexIndexFrame : new ujs_seobarFrame(),
    ramblerIndexFrame : new ujs_seobarFrame(),
    // SEObar update  information
    seobarUpdateFrame : new ujs_seobarFrame(),

    // storage: frame id
    sFrameId : 'SEObar_storage_frame',

    // panel id 
    panelId : 'SEObar_panel',    
    alexaRank : '',
    alexaDomain : '',      
    googlePR : '',
    yandexCY : '',
    yandexRank : '',
    yandexInfo : '',
    // Directories
    dirDmoz : '',
    dirYahoo : '',
    dirYandex : '',
    dirRambler : '',
    // Backward Links
    linkGoogle : '',
    linkYahooUrl : '',
    linkYahooDomain : '',    
    linkMsnURL : '',
    linkMsnDomain : '',
    linkYandex : '',
    // Indexed Pages
    indexGoogle : '',
    indexYahoo : '',
    indexMsn : '',
    indexYandex : '',
    indexRambler : '',
    // Tools
    highlightNoindex : false,
    highlightNofollow : false,
    highlightExternalLinks: false,
    httpHeaders : '',
    seobarUpdateInfo : '',

    domainData : new Array('ujs_seob.alexaRank', 'ujs_seob.alexaDomain',
    'ujs_seob.yandexCY', 'ujs_seob.yandexRank', 'ujs_seob.yandexInfo',
    'ujs_seob.linkGoogle', 'ujs_seob.linkYahooDomain', 'ujs_seob.linkMsnDomain',
    'ujs_seob.indexGoogle', 'ujs_seob.indexYahoo', 'ujs_seob.indexMsn',
    'ujs_seob.indexYandex', 'ujs_seob.indexRambler'),    
    
    currentToolTab : 0,
    bTools : false,    
    currentRatingTab : 0,  
    bRatings : false,    
    bShowOptions : false, 
    bCollapsedPanel : false,
    bMore : false,
    bMoreDirectories : false,
    bMoreBackwardLinks : false,
    bMoreIndexedPages : false,
    bInit : false,
    
    // options
    opFormId : 'SEObar_panel_options_form',
    
    op : new Array(
      new Array(false, 'SEObar_options_disable_script'),   // 0 Disable Script (true, false)
      new Array(true, 'SEObar_options_store_ratings')      // 1 Store Domain Ratings (true, false)
    ),
    
    opRepresentation : new Array(      
      new Array(0, 'SEObar_options_alexa_rank'),      // 0 Alexa Rank            (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_alexa_domain'),    // 1 Alexa Domain          (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_google_pr'),       // 2 Google Rank           (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_yandex_tcy'),      // 3 Yandex tCY            (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_yandex_rank'),     // 4 Yandex Rank           (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_yandex_info'),     // 5 Yandex Info           (0 - always, 1 - By request, 2 - Never)
      // Directories
      new Array(0, 'SEObar_options_dir_dmoz'),        // 6 DMOZ                  (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_dir_yahoo'),       // 7 Yahoo!                (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_dir_yandex'),      // 8 Yandex                (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_dir_rambler'),     // 9 Rambler Top100        (0 - always, 1 - By request, 2 - Never)
      // Backward Links
      new Array(0, 'SEObar_options_link_google'),     // 10 Google               (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_link_yahooUrl'),   // 11 Yahoo! URL           (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_link_yahooDomain'),// 12 Yahoo! Domain        (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_link_msnUrl'),     // 13 MSN URL              (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_link_msnDomain'),  // 14 MSN Domain           (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_link_yandex'),     // 15 Yandex               (0 - always, 1 - By request, 2 - Never)
      // Indexed Pages
      new Array(0, 'SEObar_options_index_google'),    // 16 Google               (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_index_yahoo'),     // 17 Yahoo!               (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_index_msn'),       // 18 MSN                  (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_index_yandex'),    // 19 Yandex               (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_index_rambler'),   // 20 Rambler              (0 - always, 1 - By request, 2 - Never)
      // Panel Elements
      new Array(0, 'SEObar_options_btn_options'),      // 21 Button "Options"        (0 - always, 1 - By request)      
      new Array(0, 'SEObar_options_btn_refresh'),      // 22 Button "Refresh"        (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_btn_ratings'),      // 23 Button "Ratings"        (0 - always, 1 - By request, 2 - Never)
      new Array(0, 'SEObar_options_btn_tools')         // 24 Button "Tools"          (0 - always, 1 - By request, 2 - Never)
    ),
    
    opRepMain : new Array(0, 1, 2, 3, 4, 5, 21, 22, 23, 24),
    opRepDirectories : new Array(6, 7, 8, 9),
    opRepBackwardLinks : new Array(10, 11, 12, 13, 14, 15),
    opRepIndexedPages : new Array(16, 17, 18, 19, 20),

    opPosition : new Array( 
      new Array(1, 'SEObar_options_location'),   // 0 Panel Location 1 (0 - Top Left, 1 - Top Right, 2 - Bottom Left, 3 - Bottom Right)
      new Array(0, 'SEObar_options_position')    // 1 Panel Position (0 - fixed, 1 - absolute)
    ),
    
    getDomainName : function(host)
    {
      var domain = host;
      var i = domain.indexOf('www.');
      if(i != -1)
      {
        domain = domain.substr(i + 4);
      }
      return domain;
    },
    
    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 null;
    
      var a = domain.split('.');
      var l = a.length;
      
      if(l == 2)  
        return domain;
        
      return (a[l - 2] + '.' + a[l - 1]);
    },
    
    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; " + 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; /*line-height: normal !important;*/ text-align: left !important; text-indent: 0 !important;} "
        +"#SEObar_panel {" + loc + pos + " background: white !important; border: 1px solid black !important; padding: 3px !important; z-index: 9101 !important; display: block !important; /*line-height: normal !important;*/ text-align: right !important; 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 input[type=checkbox] {" + input + "} "
        +"#SEObar_panel input[type=radio] {" + input + "} "
        +"#SEObar_panel input[type=button] {background: white !important; border: 1px solid #a0a0a0 !important; 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; min-width: 60px !important; width: 60px !important; height: 17px !important; padding: 0 !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; min-width: 16px !important; width: 16px !important; height: 17px !important; padding: 0 !important;} "
        +"#SEObar_panel input.SEObar_panel_sbtn[selected] {background: #f0f0f0 !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; 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 fieldset {background: white !important; border: 1px solid #a0a0a0 !important; padding: 10px !important;} "
        +"#SEObar_panel_addon legend {background: white !important; color: #505050 !important; font-weight: bold !important; margin: 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: 320px !important; overflow: auto !important; padding-right: 20px !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: #f5f5f5 !important;} "
        +"#SEObar_panel_addon .SEObar_panel_gray_text {color: #808080 !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-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; 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: 3px 10px !important; vertical-align: top !important; border: 1px solid #e0e0e0 !important; width: 100% !important;} "
        +"#SEObar_panel_addon div#tab_content table td[noborder] {padding-right: 0 !important; border: none !important;} "
        +"#SEObar_panel_addon div#tab_content table td.hdr {color: #404040 !important; width: auto !important; max-width: 33% !important;white-space: nowrap !important; font-weight: bold !important;} "
        +"#SEObar_panel_addon div#tab_content table td.hdr[noborder] {padding-left: 0 !important;} "
        +"#SEObar_panel_addon div#tab_content table td.separator {border-left: none !important; border-right: none !important;} "
      );
      var s = document.createElement('style');
      s.setAttribute('type', 'text/css');
			s.setAttribute('style', 'display:none !important;');			
			s.appendChild(document.createTextNode(css));
      document.documentElement.appendChild(s);
    },
    
    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(typeof(opera.version) == 'function' && opera.version() >= 9)
      {
        if(input.currentStyle.backgroundColor != 'transparent')
          s = bg;
      }
      else if(window.getComputedStyle)
      {
        try
        {
          if(document.defaultView.getComputedStyle(input, null).getPropertyValue('background-color') != 'transparent')
            s = bg;
        }
        catch(e)
        {
        }
      }
      
      input.parentNode.removeChild(input);
      return s;
    },
    
    initFrameData : 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";}';
    
      ///////////////////////////////////////////////////////////////
      // Alexa        
      ujs_seob.alexaFrame.msgPrefix = 'SEObar_Alexa_Rank';
      ujs_seob.alexaFrame.frameId = 'SEObar_alexa_frame';
      ujs_seob.alexaFrame.frameToken = 'AlexaRank';      
      ujs_seob.alexaFrame.url = 'http://xml.alexa.com/data?cli=10&dat=nsa&url=' + escape(url) + ujs_seob.urlToken + ujs_seob.alexaFrame.frameToken;
      ujs_seob.alexaFrame.domain = 'xml.alexa.com';
      ujs_seob.alexaFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.alexaFrame.IsObjectLoaded = function() {
        var obj = document.getElementsByTagName('DMOZ');
        if(obj)
        {
          return true;
        }
        return false;
      };
      ujs_seob.alexaFrame.getDataFromDocumentFunction = function () {
        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 += ujs_seob.alexaFrame.dataSeparator + domain;
          }
        }
        return rank;
      };
      ujs_seob.alexaFrame.getDataFunction = ujs_seob.getRatings;
      
      ///////////////////////////////////////////////////////////////
      // Google      
      ujs_seob.googleFrame.msgPrefix = 'SEObar_Google_PR';
      ujs_seob.googleFrame.frameId = 'SEObar_google_frame';
      ujs_seob.googleFrame.frameToken = 'GooglePR';
      // GooglePR from http://opera.oslocity.org/shoust/?p=userjs
      var r=function(x,y) {return Math.floor((x/y-Math.floor(x/y))*y+.1);}    
      var ch=function(url){url='info:'+url; var c=[0x9E3779B9,0x9E3779B9,0xE6359A60],i,j,k=0,l,f=Math.floor; var m=function(c){var i,j,s=[13,8,13,12,16,5,3,10,15]; for(i=0;i<9;i+=1){j=c[r(i+2,3)]; c[r(i,3)]=(c[r(i,3)]-c[r(i+1,3)]-j)^(r(i,3)==1?j<<s[i]:j>>>s[i]);}}; for(l=url.length;l>=12;l-=12){for(i=0;i<16;i+=1){j=k+i; c[f(i/4)]+=url.charCodeAt(j)<<(r(j,4)*8);} m(c); k+=12;} c[2]+=url.length; for(i=l;i>0;i--) c[f((i-1)/4)]+=url.charCodeAt(k+i-1)<<(r(i-1,4)+(i>8?1:0))*8;m(c); return'6'+c[2];};
      ujs_seob.googleFrame.url = 'http://www.google.com/search?client=navclient-auto&ch=' + ch(url) + '&features=Rank&q=info:' + escape(url) + ujs_seob.urlToken + ujs_seob.googleFrame.frameToken;
      ujs_seob.googleFrame.domain = 'www.google.com';
      ujs_seob.googleFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.googleFrame.IsObjectLoaded = function() {
        if(document.body.innerText)
        {
          return true;
        }
        return false;
      };
      
      ujs_seob.googleFrame.createFrame = function() {      
        var gDiv = document.createElement('DIV');        
        gDiv.setAttribute('style', 'display: none !important;');
        var gFrame = '<iframe src="' + ujs_seob.googleFrame.url + '"';        
        gFrame += ' id="' + ujs_seob.googleFrame.frameId  + '" width="0" height="0" frameborder="0" scrolling="no">';
        gDiv.innerHTML = gFrame;
        document.documentElement.appendChild(gDiv);
      };
      
      ujs_seob.googleFrame.getDataFromDocumentFunction = function () {
        var rank = document.body.innerText;        
        if(rank)
        {
          var res = rank.match(/Rank_\d{1}:\d{1}:([\d]+)/);
          rank = '';
          if(res && res.length > 1)
          {            
            rank = res[1];
          }
        }
        return rank;        
      };
      ujs_seob.googleFrame.getDataFunction = ujs_seob.getRatings;
      
      ///////////////////////////////////////////////////////////////
      // Yandex
      ujs_seob.yandexFrame.msgPrefix = 'SEObar_Yandex_tCY';
      ujs_seob.yandexFrame.frameId = 'SEObar_yandex_frame';
      ujs_seob.yandexFrame.frameToken = 'YandexTCY';
      ujs_seob.yandexFrame.url = 'http://bar-navig.yandex.ru/u?ver=2&lang=1049&url=' + escape(url) + '&show=1&thc=0' + ujs_seob.urlToken + ujs_seob.yandexFrame.frameToken;
      ujs_seob.yandexFrame.domain = 'bar-navig.yandex.ru';
      ujs_seob.yandexFrame.deleteFrame = ujs_seob.removeFrames;      
      ujs_seob.yandexFrame.IsObjectLoaded = function() {
        var obj = document.getElementsByTagName('urlinfo');
        if(obj && obj.length > 0)
        {
          return true;
        }
        return false;
      };
      ujs_seob.yandexFrame.getDataFromDocumentFunction = function () {
        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('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;
              }
            }
          }
        }
        return rank;
      };
      ujs_seob.yandexFrame.getDataFunction = ujs_seob.getRatings;
      
      ///////////////////////////////////////////////////////////////
      // DIRECTORIES
      
      ///////////////////////////////////////////////////////////////
      // DMOZ      
      ujs_seob.dmozFrame.msgPrefix = 'SEObar_DMOZ';
      ujs_seob.dmozFrame.frameId = 'SEObar_dmoz_frame';
      ujs_seob.dmozFrame.frameToken = 'DMOZ';      
      ujs_seob.dmozFrame.url = 'http://search.dmoz.org/cgi-bin/search?search=' + domain + '&all=no&cat=&t=s' + ujs_seob.urlToken + ujs_seob.dmozFrame.frameToken;
      ujs_seob.dmozFrame.domain = 'search.dmoz.org';
      ujs_seob.dmozFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.dmozFrame.style = style;
      ujs_seob.dmozFrame.IsObjectLoaded = function() {
        var obj = document.getElementById('search');
        if(obj)
        {
          return true;
        }
        return false;
      };
      ujs_seob.dmozFrame.getDataFromDocumentFunction = function () {
        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 = ''
          if(document.getElementById('search'))          
            u1 = document.getElementById('search').value;          
          else          
            return;

          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];
                }
                
                info += '">';
                
                var href = a.item(1).innerText.split(': ');
                if(href.length > 3)
                  info += href[href.length - 3] + ': ' + href[href.length - 2] + ': ' + href[href.length - 1];
                else                
                  info += a.item(1).innerText;
                
                info += '</a>';
                sep = '<br />';
              }
            }
          }
        }
        return info;
      };
      ujs_seob.dmozFrame.getDataFunction = ujs_seob.getDirectoriesInfo;
      
      ///////////////////////////////////////////////////////////////
      // Yahoo! Directory
      ujs_seob.yahooDirFrame.msgPrefix = 'SEObar_Yahoo_Dir';
      ujs_seob.yahooDirFrame.frameId = 'SEObar_yahoodir_frame';
      ujs_seob.yahooDirFrame.frameToken = 'YahooDir';      
      ujs_seob.yahooDirFrame.url = 'http://search.yahoo.com/search/dir?p=' + domain + '&ei=UTF-8&x=drt' + ujs_seob.urlToken + ujs_seob.yahooDirFrame.frameToken;
      ujs_seob.yahooDirFrame.domain = 'search.yahoo.com';
      ujs_seob.yahooDirFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.yahooDirFrame.style = style;
      ujs_seob.yahooDirFrame.IsObjectLoaded = function() {
        var obj = document.getElementById('yschssbx');
        if(obj)
        {
          return true;
        }
        return false;
      };
      ujs_seob.yahooDirFrame.getDataFromDocumentFunction = function () {
        var info = '';
        var obj = document.getElementById('yschsp');
        if(!obj)
          return info;
          
        var u1 = obj.value;
        u1 = u1.replace(/"+/g, '');
        var u2 = 'www.' + u1;
        
        var ol = document.getElementsByTagName('ol');
        if(ol && ol.length > 0)
        {
          ol = ol.item(0);
          var li = ol.getElementsByTagName('li');
          
          var count = 0, sep = '';
          
          for(var i = 0; i < li.length; i++)
          {
            var href='', text = '', desc = '';
            
            var em = li.item(i).getElementsByTagName('em');
            for(var j = 0; j < em.length; j++)              
            {
              if(em.item(j).className == 'yschurl')
              {
                var d = em.item(j).innerText;                
                if(d.indexOf(u1) == 0 || d.indexOf(u2) == 0)
                {
                  var div = li.item(i).getElementsByTagName('div');
                  for(var k = 0; k < div.length; k++)
                  {
                    if(div.item(k).className == 'yschabstr')
                    {
                      desc = div.item(k).innerText;                      
                    }
                    else if((div.item(k).firstChild && div.item(k).firstChild.nodeValue == ' Category: ') ||
                      (div.item(k).className == 'yschdircat' && div.item(k).firstChild && div.item(k).firstChild.innerText.indexOf('Category: ') == 0))
                    {                    
                      var a = div.item(k).getElementsByTagName('a');
                      if(a && a.length > 0)
                      {
                        a = a.item(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;
                        }
                      }
                    }                    
                  }
                }
                break;
              }
            }
            
            if(href && text)
            {          
              count++;
              if(count > ujs_seob.maxDirectoryResults)
              {
                info += sep + '...';
                break;
              }

              info += sep + count.toString() + ') ';
              info += '<a href="' + href +'" title="' + desc + '">' + text + '</a>';
              sep = '<br />';
            }
          }
        }
        
        return info;
      };
      ujs_seob.yahooDirFrame.getDataFunction = ujs_seob.getDirectoriesInfo;
      
      ///////////////////////////////////////////////////////////////
      // Yandex Catalog
      ujs_seob.yaCaFrame.msgPrefix = 'SEObar_YaCa';
      ujs_seob.yaCaFrame.frameId = 'SEObar_yaca_frame';
      ujs_seob.yaCaFrame.frameToken = 'YaCa';      
      ujs_seob.yaCaFrame.url = 'http://search.yaca.yandex.ru/yca/cy/ch/' + domain + '/' + ujs_seob.urlToken + ujs_seob.yaCaFrame.frameToken;
      ujs_seob.yaCaFrame.domain = 'search.yaca.yandex.ru';
      ujs_seob.yaCaFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.yaCaFrame.style = style;
      ujs_seob.yaCaFrame.IsObjectLoaded = function() {
        var obj = document.getElementsByTagName('div');
        for(var i = 0; i < obj.length; i++)
        {
          if(obj.item(i).className && obj.item(i).className == 'path2root')
            return true;
        }
        return false;
      };
      ujs_seob.yaCaFrame.getDataFromDocumentFunction = function () {
        var info = '';
        var obj = document.getElementsByTagName('div');
        for(var i = 0; i < obj.length; i++)
        {
          if(obj.item(i).className && obj.item(i).className == 'path2root')
          {
            var a = obj.item(i).getElementsByTagName('a');
            var sep = '';              
            for(var j = 0; j < a.length; j++)
            {
              info += sep;
              info += a.item(j).outerHTML;
              sep = ' / ';
            }
            break;
          }            
        }
        return info;
      };
      ujs_seob.yaCaFrame.getDataFunction = ujs_seob.getDirectoriesInfo;
      
      ///////////////////////////////////////////////////////////////
      // Rambler Top100
      ujs_seob.raTop100Frame.msgPrefix = 'SEObar_Rambler_Top100';
      ujs_seob.raTop100Frame.frameId = 'SEObar_ratop100_frame';
      ujs_seob.raTop100Frame.frameToken = 'RamblerTop100';
      ujs_seob.raTop100Frame.url = 'http://www.rambler.ru/cgi-bin/counter_search?words=' + domain + ujs_seob.urlToken + ujs_seob.raTop100Frame.frameToken;
      ujs_seob.raTop100Frame.domain = 'www.rambler.ru';
      ujs_seob.raTop100Frame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.raTop100Frame.style = style;
      ujs_seob.raTop100Frame.IsObjectLoaded = function() {        
        obj = document.getElementsByTagName('spacer');
        if(obj && obj.length > 1)
        {
          return true;
        }
        return false;
      };
      ujs_seob.raTop100Frame.getDataFromDocumentFunction = function () {
        var info = '';
        var obj = document.getElementById('words');
        if(obj && obj.tagName.toLowerCase() == 'input')
        {
          var u1 = 'http://' + obj.value;
          var u2 = 'http://www.' + obj.value;
          
          obj = document.getElementsByTagName('ol');
          if(obj && obj.length > 0)
          {
            var sep = '', count = 0;
            obj = obj.item(0).getElementsByTagName('div');            
            for(var i = 0; i < obj.length; i++)
            { 
              if(obj.item(i).className == 'inf')
              {
                var res = obj.item(i).innerHTML;
                var ind = res.indexOf(u1);
                if(ind < 0)
                  ind = res.indexOf(u2);                

                if(ind >= 0)
                { 
                  count++;
                  if(count > ujs_seob.maxDirectoryResults)
                  {
                    info += sep + '...';
                    break;
                  }
                  var a = obj.item(i).getElementsByTagName('a');
                  var href = a.item(0).href;
                  info += sep + count.toString() + ') ';
                  info += '<a href="' + href + '">';
                  info += a.item(0).innerText;                      
                  info += '</a>';
                  sep = ', ';
                  
                }
              }
            }              
          }
        }
        return info;
      };
      ujs_seob.raTop100Frame.getDataFunction = ujs_seob.getDirectoriesInfo;
      
      ///////////////////////////////////////////////////////////////
      // BACKWARD LINKS
      
      ///////////////////////////////////////////////////////////////
      // Google Backward Links
      ujs_seob.googleLinkFrame.msgPrefix = 'SEObar_link_Google';
      ujs_seob.googleLinkFrame.frameId = 'SEObar_link_google_frame';
      ujs_seob.googleLinkFrame.frameToken = 'linkGoogle';
      ujs_seob.googleLinkFrame.url = 'http://www.google.com/search?hl=en&q=link%3A' + host + '&btnG=Search' + ujs_seob.urlToken + ujs_seob.googleLinkFrame.frameToken;
      ujs_seob.googleLinkFrame.domain = 'www.google.com';
      ujs_seob.googleLinkFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.googleLinkFrame.style = style;
      ujs_seob.googleLinkFrame.IsObjectLoaded = function() {
        var obj = document.getElementsByTagName('center');
        if(obj && obj.length > 0)
        {
          return true;
        }
        return false;
      };
      ujs_seob.googleLinkFrame.getDataFromDocumentFunction = function () {
        var info = '';
        var obj = document.getElementsByTagName('table');
        for(var i = 0; i < obj.length; i++)
        {
          if(obj.item(i).className && obj.item(i).className == 't bt')
          {
            var td = obj.item(i).getElementsByTagName('td');
            if(td && td.length > 1)  
            {
              var txt = td.item(1).innerText;
              var res = txt.match(/about ([\d,]+) linking/);
              if(res && res.length > 1)
              { 
                info = res[1].replace(/,+/g, '');
                info = ujs_seob.groupDigits(info);
              }
            }
            
            break;
          }            
        }
        return info;
      };
      ujs_seob.googleLinkFrame.getDataFunction = ujs_seob.getBackwardLinksInfo;
      
      ///////////////////////////////////////////////////////////////
      // Yahoo! URL Backward Links
      ujs_seob.yahooUrlLinkFrame.msgPrefix = 'SEObar_link_YahooUrl';
      ujs_seob.yahooUrlLinkFrame.frameId = 'SEObar_link_yahoourl_frame';
      ujs_seob.yahooUrlLinkFrame.frameToken = 'linkYahooUrl';
      ujs_seob.yahooUrlLinkFrame.url = 'http://search.yahoo.com/search?p=link%3A' + escape(url) + '+-site%3A' + domain + '&prssweb=Search&ei=UTF-8&x=wrt' + ujs_seob.urlToken + ujs_seob.yahooUrlLinkFrame.frameToken;
      ujs_seob.yahooUrlLinkFrame.domain = 'search.yahoo.com';
      ujs_seob.yahooUrlLinkFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.yahooUrlLinkFrame.style = style;
      ujs_seob.yahooUrlLinkFrame.IsObjectLoaded = function() {
        var obj = document.getElementById('yschres');
        if(obj)
        {
          return true;
        }
        return false;
      };
      ujs_seob.yahooUrlLinkFrame.getDataFromDocumentFunction = function () {
        var info = '';        
        var obj = document.getElementById('yschinfo');
        if(obj)
        {
          var txt = obj.innerText;
          var res = txt.match(/about ([\d,]+) from/);
          if(res && res.length > 1)
          { 
            info = res[1].replace(/,+/g, '');
            info = ujs_seob.groupDigits(info);
          }
        }        
        return info;
      };
      ujs_seob.yahooUrlLinkFrame.getDataFunction = ujs_seob.getBackwardLinksInfo;
      
      ///////////////////////////////////////////////////////////////
      // Yahoo! Domain Backward Links
      ujs_seob.yahooDomainLinkFrame.msgPrefix = 'SEObar_link_YahooDomain';
      ujs_seob.yahooDomainLinkFrame.frameId = 'SEObar_link_yahoodomain_frame';
      ujs_seob.yahooDomainLinkFrame.frameToken = 'linkYahooDomain';
      ujs_seob.yahooDomainLinkFrame.url = 'http://search.yahoo.com/search?p=linkdomain%3A' + domain + '+-site%3A' + domain + '&prssweb=Search&ei=UTF-8&x=wrt' + ujs_seob.urlToken + ujs_seob.yahooDomainLinkFrame.frameToken;
      ujs_seob.yahooDomainLinkFrame.domain = 'search.yahoo.com';
      ujs_seob.yahooDomainLinkFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.yahooDomainLinkFrame.style = style;
      ujs_seob.yahooDomainLinkFrame.IsObjectLoaded = function() {
        var obj = document.getElementById('yschres');
        if(obj)
        {
          return true;
        }
        return false;
      };
      ujs_seob.yahooDomainLinkFrame.getDataFromDocumentFunction = function () {
        var info = '';        
        var obj = document.getElementById('yschinfo');
        if(obj)
        {
          var txt = obj.innerText;
          var res = txt.match(/about ([\d,]+) from/);
          if(res && res.length > 1)
          { 
            info = res[1].replace(/,+/g, '');
            info = ujs_seob.groupDigits(info);
          }
        }        
        return info;
      };
      ujs_seob.yahooDomainLinkFrame.getDataFunction = ujs_seob.getBackwardLinksInfo;
      
      ///////////////////////////////////////////////////////////////
      // MSN URL Backward Links
      ujs_seob.msnUrlLinkFrame.msgPrefix = 'SEObar_link_MsnUrl';
      ujs_seob.msnUrlLinkFrame.frameId = 'SEObar_link_msnurl_frame';
      ujs_seob.msnUrlLinkFrame.frameToken = 'linkMsnUrl';          
      ujs_seob.msnUrlLinkFrame.url = 'http://search.msn.com/results.aspx?q=link%3A' + escape(url) + '+-site%3A' + domain + '&mkt=en-US&form=QBRE&go.x=0&go.y=0' + ujs_seob.urlToken + ujs_seob.msnUrlLinkFrame.frameToken;      
      ujs_seob.msnUrlLinkFrame.domain = 'search.msn.com';
      ujs_seob.msnUrlLinkFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.msnUrlLinkFrame.style = style;
      ujs_seob.msnUrlLinkFrame.IsObjectLoaded = function() {
        var obj = document.getElementById('results_area');
        if(obj)
        {
          return true;
        }
        return false;
      };
      ujs_seob.msnUrlLinkFrame.getDataFromDocumentFunction = function () {
        var info = '';        
        var obj = document.getElementById('search_header');
        if(obj)
        {
          var txt = obj.innerText;
          var res = txt.match(/of ([\d,]+) results/);
          if(res && res.length > 1)
          { 
            info = res[1].replace(/,+/g, '');
            info = ujs_seob.groupDigits(info);
          }
        }        
        return info;
      };
      ujs_seob.msnUrlLinkFrame.getDataFunction = ujs_seob.getBackwardLinksInfo;
      
      ///////////////////////////////////////////////////////////////
      // MSN Domain Backward Links
      ujs_seob.msnDomainLinkFrame.msgPrefix = 'SEObar_link_MsnDomain';
      ujs_seob.msnDomainLinkFrame.frameId = 'SEObar_link_msndomain_frame';
      ujs_seob.msnDomainLinkFrame.frameToken = 'linkMsnDomain';          
      ujs_seob.msnDomainLinkFrame.url = 'http://search.msn.com/results.aspx?q=linkdomain%3A' + domain + '+-site%3A' + domain + '&mkt=en-US&form=QBRE&go.x=0&go.y=0' + ujs_seob.urlToken + ujs_seob.msnDomainLinkFrame.frameToken;      
      ujs_seob.msnDomainLinkFrame.domain = 'search.msn.com';
      ujs_seob.msnDomainLinkFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.msnDomainLinkFrame.style = style;
      ujs_seob.msnDomainLinkFrame.IsObjectLoaded = function() {
        var obj = document.getElementById('results_area');
        if(obj)
        {
          return true;
        }
        return false;
      };
      ujs_seob.msnDomainLinkFrame.getDataFromDocumentFunction = function () {
        var info = '';        
        var obj = document.getElementById('search_header');
        if(obj)
        {
          var txt = obj.innerText;
          var res = txt.match(/of ([\d,]+) results/);
          if(res && res.length > 1)
          { 
            info = res[1].replace(/,+/g, '');
            info = ujs_seob.groupDigits(info);
          }
        }        
        return info;
      };
      ujs_seob.msnDomainLinkFrame.getDataFunction = ujs_seob.getBackwardLinksInfo;
      
      ///////////////////////////////////////////////////////////////
      // Yandex Backward Links
      ujs_seob.yandexLinkFrame.msgPrefix = 'SEObar_link_Yandex';
      ujs_seob.yandexLinkFrame.frameId = 'SEObar_link_yandex_frame';
      ujs_seob.yandexLinkFrame.frameToken = 'linkYandex';          
      ujs_seob.yandexLinkFrame.url = 'http://www.yandex.ru/yandsearch?text=&Link=' + url + ujs_seob.urlToken + ujs_seob.yandexLinkFrame.frameToken;
      ujs_seob.yandexLinkFrame.checkUrl = 'http://www.yandex.ru/yandsearch?text=&Link=' + url + '&numdoc=50';
      ujs_seob.yandexLinkFrame.domain = 'www.yandex.ru';
      ujs_seob.yandexLinkFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.yandexLinkFrame.style = style;
      ujs_seob.yandexLinkFrame.IsObjectLoaded = function() {
        var obj = document.getElementsByTagName('ol');
        if(obj && obj.length > 0)
        {
          return true;
        } 
        else
        {
          obj = document.getElementsByTagName('div');
          if(obj && obj.length > 0)
          {
            for(var i = 0; i < obj.length; i++)
            {
              if(obj.item(i).className == 'moreInfo')
                return true;
            }
          }
        }
        return false;
      };
      ujs_seob.yandexLinkFrame.getDataFromDocumentFunction = function () {
        var info = '';        
        var obj = document.getElementsByTagName('div');
        if(obj && obj.length > 0)
        {          
          for(var i = 0; i < obj.length; i++)
          {
            if(obj.item(i).className == 'refblock')
            {
              var b = obj.item(i).getElementsByTagName('b');
              if(b && b.length > 0)
              {
                var txt = b.item(0).innerText;
                txt = txt.replace(/[\s,.]+/g, '');                
                var rank = parseInt(txt);
                if(!isNaN(rank))
                {                  
                  info += ujs_seob.groupDigits(rank.toString());
                  if(b.length > 1)
                  {
                    txt = b.item(1).innerText;
                    txt = txt.replace(/[\s,.]+/g, '');
                    rank = parseInt(txt);
                    if(!isNaN(rank))
                    {
                      info += ' | ' + ujs_seob.groupDigits(rank.toString());                      
                    }
                  }
                }
              }
              
              break;
            }
          }
        }
        return info;
      };
      ujs_seob.yandexLinkFrame.getDataFunction = ujs_seob.getBackwardLinksInfo;
      
      ///////////////////////////////////////////////////////////////
      // INDEXED PAGES
      
      ///////////////////////////////////////////////////////////////
      // Google Indexed Pages
      ujs_seob.googleIndexFrame.msgPrefix = 'SEObar_index_Google';
      ujs_seob.googleIndexFrame.frameId = 'SEObar_index_google_frame';
      ujs_seob.googleIndexFrame.frameToken = 'indexGoogle';
      ujs_seob.googleIndexFrame.url = 'http://www.google.com/search?hl=en&lr=&q=site%3A' + domain + '&btnG=Search' + ujs_seob.urlToken + ujs_seob.googleIndexFrame.frameToken;
      ujs_seob.googleIndexFrame.domain = 'www.google.com';
      ujs_seob.googleIndexFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.googleIndexFrame.style = style;
      ujs_seob.googleIndexFrame.IsObjectLoaded = function() {
        var obj = document.getElementsByTagName('center');
        if(obj && obj.length > 0)
        {
          return true;
        }
        return false;
      };
      ujs_seob.googleIndexFrame.getDataFromDocumentFunction = function () {
        var info = '';
        var obj = document.getElementsByTagName('table');
        for(var i = 0; i < obj.length; i++)
        {
          if(obj.item(i).className && obj.item(i).className == 't bt')
          {
            var td = obj.item(i).getElementsByTagName('td');
            if(td && td.length > 1)  
            {
              var txt = td.item(1).innerText;
              var res = txt.match(/about ([\d,]+) from/);
              if(res && res.length > 1)
              { 
                info = res[1].replace(/,+/g, '');
                info = ujs_seob.groupDigits(info);
              }
            }
            
            break;
          }            
        }
        return info;
      };
      ujs_seob.googleIndexFrame.getDataFunction = ujs_seob.getIndexedPagesInfo;
      
      ///////////////////////////////////////////////////////////////
      // Yahoo! Indexed Pages
      ujs_seob.yahooIndexFrame.msgPrefix = 'SEObar_index_Yahoo';
      ujs_seob.yahooIndexFrame.frameId = 'SEObar_index_yahoo_frame';
      ujs_seob.yahooIndexFrame.frameToken = 'indexYahoo';            
      ujs_seob.yahooIndexFrame.url = 'http://search.yahooapis.com/SiteExplorerService/V1/pageData?appid=SEObar&results=50&start=1&query=' + domain + ujs_seob.urlToken + ujs_seob.yahooIndexFrame.frameToken;
      ujs_seob.yahooIndexFrame.checkUrl = 'http://siteexplorer.search.yahoo.com/search?ei=UTF-8&p=' + domain + '&bwm=p&bwmf=a&bwms=p&searchbwm=Explore+URL&b=1';
      ujs_seob.yahooIndexFrame.domain = 'search.yahooapis.com';
      ujs_seob.yahooIndexFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.yahooIndexFrame.IsObjectLoaded = function() {    
        alert('OK');
        return false;        
      };
      ujs_seob.yahooIndexFrame.getDataFromDocumentFunction = function () {
        var info = '';
        var resultSet = document.getElementsByTagName('ResultSet');
        if(resultSet && resultSet.item(0))
        {
          info = resultSet.item(0).attributes.getNamedItem('totalResultsAvailable').nodeValue;
          if(info)
            info = ujs_seob.groupDigits(info);        
        }
        return info;
      };
      ujs_seob.yahooIndexFrame.getDataFunction = ujs_seob.getIndexedPagesInfo;  

      ///////////////////////////////////////////////////////////////
      // MSN Indexed Pages
      ujs_seob.msnIndexFrame.msgPrefix = 'SEObar_index_Msn';
      ujs_seob.msnIndexFrame.frameId = 'SEObar_index_msn_frame';
      ujs_seob.msnIndexFrame.frameToken = 'indexMsn';
      ujs_seob.msnIndexFrame.url = 'http://search.msn.com/results.aspx?q=site%3A' + domain + '&mkt=en-US&form=QBRE&go.x=0&go.y=0' + ujs_seob.urlToken + ujs_seob.msnIndexFrame.frameToken;
      ujs_seob.msnIndexFrame.domain = 'search.msn.com';
      ujs_seob.msnIndexFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.msnIndexFrame.style = style;
      ujs_seob.msnIndexFrame.IsObjectLoaded = function() {
        var obj = document.getElementById('results_area');
        if(obj)
        {
          return true;
        }
        return false;
      };
      ujs_seob.msnIndexFrame.getDataFromDocumentFunction = function () {
        var info = '';        
        var obj = document.getElementById('search_header');
        if(obj)
        {
          var txt = obj.innerText;
          var res = txt.match(/of ([\d,]+) results/);
          if(res && res.length > 1)
          { 
            info = res[1].replace(/,+/g, '');
            info = ujs_seob.groupDigits(info);
          }
        }        
        return info;
      };
      ujs_seob.msnIndexFrame.getDataFunction = ujs_seob.getIndexedPagesInfo; 

      ///////////////////////////////////////////////////////////////
      // Yandex Indexed Pages
      ujs_seob.yandexIndexFrame.msgPrefix = 'SEObar_index_Yandex';
      ujs_seob.yandexIndexFrame.frameId = 'SEObar_index_yandex_frame';
      ujs_seob.yandexIndexFrame.frameToken = 'indexYandex';
      ujs_seob.yandexIndexFrame.url = 'http://www.yandex.ru/yandsearch?serverurl=' + domain + ujs_seob.urlToken + ujs_seob.yandexIndexFrame.frameToken;
      ujs_seob.yandexIndexFrame.domain = 'www.yandex.ru';
      ujs_seob.yandexIndexFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.yandexIndexFrame.style = style;
      ujs_seob.yandexIndexFrame.IsObjectLoaded = function() {
        var obj = document.getElementsByTagName('ol');        
        if(obj && obj.length > 0)
        {
          return true;
        } 
        else
        {
          obj = document.getElementsByTagName('div');
          if(obj && obj.length > 0)
          {
            for(var i = 0; i < obj.length; i++)
            {
              if(obj.item(i).className == 'moreInfo')
                return true;
            }
          }
        }
        return false;
      };
      ujs_seob.yandexIndexFrame.getDataFromDocumentFunction = function () {        
        var info = '';        
        var obj = document.getElementsByTagName('div');        
        if(obj && obj.length > 0)
        {          
          for(var i = 0; i < obj.length; i++)
          {
            if(obj.item(i).className == 'refblock')
            {
              var b = obj.item(i).getElementsByTagName('b');
              if(b && b.length > 0)
              {
                var txt = b.item(0).innerText;
                txt = txt.replace(/[\s,.]+/g, '');                
                var rank = parseInt(txt);
                if(!isNaN(rank))
                {                  
                  info += ujs_seob.groupDigits(rank.toString());
                }
              }
              
              break;
            }
          }
        }
        return info;
      };
      ujs_seob.yandexIndexFrame.getDataFunction = ujs_seob.getIndexedPagesInfo; 

      ///////////////////////////////////////////////////////////////
      // Rambler Indexed Pages
      ujs_seob.ramblerIndexFrame.msgPrefix = 'SEObar_index_Rambler';
      ujs_seob.ramblerIndexFrame.frameId = 'SEObar_index_rambler_frame';
      ujs_seob.ramblerIndexFrame.frameToken = 'indexRambler';
      ujs_seob.ramblerIndexFrame.url = 'http://www.rambler.ru/srch?words=&filter=' + domain + '&sort=0' + ujs_seob.urlToken + ujs_seob.ramblerIndexFrame.frameToken;      
      ujs_seob.ramblerIndexFrame.domain = 'www.rambler.ru';
      ujs_seob.ramblerIndexFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.ramblerIndexFrame.style = style;
      ujs_seob.ramblerIndexFrame.IsObjectLoaded = function() {
        var obj = document.getElementById('resultsdiv');
        if(obj)
        {
          return true;
        } 
        return false;
      };
      ujs_seob.ramblerIndexFrame.getDataFromDocumentFunction = function () {
        var info = '';        
        var obj = document.getElementsByTagName('table');
        if(obj && obj.length > 0)
        {          
          for(var i = 0; i < obj.length; i++)
          {
            if(obj.item(i).className == 'find')
            {
              var b = obj.item(i).getElementsByTagName('b');
              if(b && b.length > 0)
              {
                var txt = b.item(0).innerText;
                txt = txt.replace(/[\s,.]+/g, '');                
                var rank = parseInt(txt);
                if(!isNaN(rank))
                {                  
                  info += ujs_seob.groupDigits(rank.toString());                  
                }
              }
              break;
            }
          }
        }
        return info;
      };
      ujs_seob.ramblerIndexFrame.getDataFunction = ujs_seob.getIndexedPagesInfo;
      
      ///////////////////////////////////////////////////////////////
      // SEOBAR UPDATE
      ujs_seob.seobarUpdateFrame.msgPrefix = 'SEObar_update';
      ujs_seob.seobarUpdateFrame.frameId = 'SEObar_update_frame';
      ujs_seob.seobarUpdateFrame.frameToken = 'update';
      ujs_seob.seobarUpdateFrame.url = 'http://www.puzzleclub.ru/files/seobar/update.html' + ujs_seob.urlToken + ujs_seob.seobarUpdateFrame.frameToken;      
      ujs_seob.seobarUpdateFrame.domain = 'www.puzzleclub.ru';
      ujs_seob.seobarUpdateFrame.deleteFrame = ujs_seob.removeFrames;
      ujs_seob.seobarUpdateFrame.style = '';
      ujs_seob.seobarUpdateFrame.IsObjectLoaded = function() {return false;};
      ujs_seob.seobarUpdateFrame.getDataFromDocumentFunction = function () {
        SEObarUpdateVersion = '0.00.00';
        SEObarUpdateVersionString = '';
        SEObarUpdateDate = '';
        SEObarUpdateUrl = '';
        SEObarDownloadUrl = '';
        SEObarUpdateInfo = new Array();
        SEObarUpdateImportantInfo = '';
        
        var id = 'SEObar_version_script';
        var url = 'http://www.puzzleclub.ru/files/seobar/seobar_version.js';
        if(!document.getElementById(id))
        {    
          var s = document.createElement('script');
          s.setAttribute('id', id);
          s.setAttribute('type', 'text/javascript');
          s.setAttribute('src', url);
          s.setAttribute('style', 'display:none !important;');
          document.documentElement.appendChild(s);
        }
        
        var bUpdate = false;
        var ver1 = ujs_seob.version.split('.');
        var ver2 = 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 />';
        
        if(bUpdate)
        {
          info += '<b>Update available</b><br />';          
          info += 'Version: ' + SEObarUpdateVersionString + '<br />';
          info += 'Date: ' + SEObarUpdateDate + '<br />';
          info += 'Download: ' + SEObarUpdateUrl + '<br /><br />';
          info += '<input type="button" value="Download" onclick="var wnd=window.open(\'' + SEObarDownloadUrl + '\');" />';
          
            
          if(SEObarUpdateInfo)
          {
            info += '<br /><br /><b>Information about this update:</b>';
            for(var i = 0; i < SEObarUpdateInfo.length; i++)
            {
              info += '<br />' + SEObarUpdateInfo[i];
            }
          }
        }
        else
        {
          info += 'There are no new updates available.';
          if(SEObarUpdateImportantInfo)
            info += '<br /><br />' + SEObarUpdateImportantInfo;
        }
       
       return info;
      };
      ujs_seob.seobarUpdateFrame.getDataFunction = ujs_seob.getUpdateInfo;
    },
    
    getFrameObjects : function()
    {
      var fo = new Array(ujs_seob.alexaFrame, ujs_seob.googleFrame, ujs_seob.yandexFrame,
        ujs_seob.dmozFrame, ujs_seob.yahooDirFrame, ujs_seob.yaCaFrame, ujs_seob.raTop100Frame,
        ujs_seob.googleLinkFrame, ujs_seob.yahooUrlLinkFrame, ujs_seob.yahooDomainLinkFrame,
        ujs_seob.msnUrlLinkFrame, ujs_seob.msnDomainLinkFrame, ujs_seob.yandexLinkFrame,
        ujs_seob.googleIndexFrame, ujs_seob.yahooIndexFrame, ujs_seob.msnIndexFrame,
        ujs_seob.yandexIndexFrame, ujs_seob.ramblerIndexFrame,
        ujs_seob.seobarUpdateFrame);
      return fo;
    },
    
    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;        
    },
    
    setPanelData : function()
    {
      if(!ujs_seob.bPanel)
        return;
        
      var p = document.getElementById(ujs_seob.panelId);
      if(p)
      {       
        var d = '';
        var grip = ujs_seob.getGripBtn();
        var btnOptions = ujs_seob.getOptionsBtn();
        var btnClose = '<input type="button" value="&times;" class="SEObar_panel_sbtn" title="Close" onMouseUp="javascript: ujs_seob.removeObject(ujs_seob.panelId)" />';
        
        if(ujs_seob.bShowOptions)
        {
          d = btnOptions + '&nbsp;' + btnClose;
          
          var getRadioBtn = function(i) {                        
            return '<td><input type="radio" name="' + ujs_seob.opRepresentation[i][1] + '" /></td>';
          };
          
          var disableScript = '<label style="display: none !important;"><input type="checkbox" name="' + ujs_seob.op[0][1] + '" value="Disable Script"/>&nbsp;Disable script</label>';
          if(!ujs_seob.bDisableScriptByPanelCollapse)
          {
            disableScript = '<label><input type="checkbox" name="' + ujs_seob.op[0][1] + '" value="Disable Script"/>&nbsp;Disable script</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
          }
       
          var storeRatings = '<label><input type="checkbox" name="' + ujs_seob.op[1][1] + '" value="Store Domain Ratings" />&nbsp;Store domain ratings</label>';
          var alexaRank = '<td><input type="radio" name="' + ujs_seob.opRepresentation[0][1]  + '" onclick="ujs_seob.onOptionsAlexaRankClick()" /></td>';                    
          var yandexValue = '<td><input type="radio" name="' + ujs_seob.opRepresentation[3][1] + '" onclick="ujs_seob.onOptionsYandexTcyClick()" /></td>';
          var yandexRank = '<td><input type="radio" name="' + ujs_seob.opRepresentation[4][1] + '" onclick="ujs_seob.onOptionsYandexTcyClick()" /></td>';                    
          var panelLocation = '<td><input type="radio" name="' + ujs_seob.opPosition[0][1] + '" /></td>';
          var panelPosition = '<input 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 />' 
            +'<table class="main"><tr><td class="left">'
            +'<fieldset><legend>Elements Representation</legend>'
            +'<div class="overflow" style="' + ujs_seob.scrollbarStyle + '">'
            +'<table class="options" id="SEObar_panel_addon_options_rep"><tr><th>Panel&nbsp;Elements&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th>Always</th><th>By&nbsp;request</th><th>Never</th></tr>'
            +'<tr><td colspan="4" class="SEObar_panel_subhdr"><input type="button" value="&minus;" class="SEObar_panel_sbtn" onclick="javascript:ujs_seob.toggleOptionsSections(this, 2, 7);"/>&nbsp;Ratings</td></tr>'
            +'<tr><td>Alexa&nbsp;Rank</td>' + alexaRank + alexaRank + alexaRank + '</tr>'
            +'<tr><td>Alexa&nbsp;Domain&nbsp;name</td>' + getRadioBtn(1) + getRadioBtn(1) + getRadioBtn(1) + '</tr>'
            +'<tr><td>Google&nbsp;Page&nbsp;Rank</td>' + getRadioBtn(2) + getRadioBtn(2) + getRadioBtn(2) + '</tr>'
            +'<tr><td>Yandex&nbsp;tCY&nbsp;value</td>' + yandexValue + yandexValue + yandexValue + '</tr>'
            +'<tr><td>Yandex&nbsp;Rank</td>' + yandexRank + yandexRank + yandexRank + '</tr>'
            +'<tr><td>Yandex&nbsp;Additional&nbsp;info</td>' + getRadioBtn(5) + getRadioBtn(5) + getRadioBtn(5) + '</tr>'
            
            +'<tr><td colspan="4" class="SEObar_panel_subhdr"><input type="button" value="&minus;" class="SEObar_panel_sbtn" onclick="javascript:ujs_seob.toggleOptionsSections(this, 9, 13);"/>&nbsp;Indexed Pages&nbsp</td></tr>'
            +'<tr><td>Google</td>' + getRadioBtn(16) + getRadioBtn(16) + getRadioBtn(16) + '</tr>'
            +'<tr><td>Yahoo</td>' + getRadioBtn(17) + getRadioBtn(17) + getRadioBtn(17) + '</tr>'
            +'<tr><td>MSN</td>' + getRadioBtn(18) + getRadioBtn(18) + getRadioBtn(18) + '</tr>'
            +'<tr><td>Yandex</td>' + getRadioBtn(19) + getRadioBtn(19) + getRadioBtn(19) + '</tr>'
            +'<tr><td>Rambler</td>' + getRadioBtn(20) + getRadioBtn(20) + getRadioBtn(20) + '</tr>'

            +'<tr><td colspan="4" class="SEObar_panel_subhdr"><input type="button" value="&minus;" class="SEObar_panel_sbtn" onclick="javascript:ujs_seob.toggleOptionsSections(this, 15, 20);"/>&nbsp;Backward Links&nbsp</td></tr>'
            +'<tr><td>Google</td>' + getRadioBtn(10) + getRadioBtn(10) + getRadioBtn(10) + '</tr>'
            +'<tr><td>Yahoo! URL</td>' + getRadioBtn(11) + getRadioBtn(11) + getRadioBtn(11) + '</tr>'
            +'<tr><td>Yahoo! Domain</td>' + getRadioBtn(12) + getRadioBtn(12) + getRadioBtn(12) + '</tr>'
            +'<tr><td>MSN URL</td>' + getRadioBtn(13) + getRadioBtn(13) + getRadioBtn(13) + '</tr>'
            +'<tr><td>MSN Domain</td>' + getRadioBtn(14) + getRadioBtn(14) + getRadioBtn(14) + '</tr>'
            +'<tr><td>Yandex</td>' + getRadioBtn(15) + getRadioBtn(15) + getRadioBtn(15) + '</tr>'
            
            
            +'<tr><td colspan="4" class="SEObar_panel_subhdr"><input type="button" value="&minus;" class="SEObar_panel_sbtn" onclick="javascript:ujs_seob.toggleOptionsSections(this, 22, 25);"/>&nbsp;Directories</td></tr>'
            +'<tr><td>DMOZ</td>' + getRadioBtn(6) + getRadioBtn(6) + getRadioBtn(6) + '</tr>'
            +'<tr><td>Yahoo!&nbsp;Directory</td>' + getRadioBtn(7) + getRadioBtn(7) + getRadioBtn(7) + '</tr>'
            +'<tr><td>Yandex&nbsp;Catalogue</td>' + getRadioBtn(8) + getRadioBtn(8) + getRadioBtn(8) + '</tr>'
            +'<tr><td>Rambler&nbsp;Top100</td>' + getRadioBtn(9) + getRadioBtn(9) + getRadioBtn(9) + '</tr>'
            
            +'<tr><td colspan="4" class="SEObar_panel_subhdr"><input type="button" value="&minus;" class="SEObar_panel_sbtn" onclick="javascript:ujs_seob.toggleOptionsSections(this, 27, 30);"/>&nbsp;Controls</td></tr>'
            +'<tr><td>Button&nbsp;&quot;Ratings&quot;</td>' + getRadioBtn(23) + getRadioBtn(23) + getRadioBtn(23) + '</tr>'
            +'<tr><td>Button&nbsp;&quot;Tools&quot;</td>' + getRadioBtn(24) + getRadioBtn(24) + getRadioBtn(24) + '</tr>'
            +'<tr><td>Button&nbsp;&quot;Refresh&quot;</td>' + getRadioBtn(22) + getRadioBtn(22) + getRadioBtn(22) + '</tr>'            
            +'<tr><td>Button&nbsp;"Options"</td>' + getRadioBtn(21) + getRadioBtn(21) + '<td></td></tr>'
            
            +'</table></div></fieldset>'
            
            +'</td><td><fieldset><legend>Panel Position</legend>'          
            +'<table class="options"><tr>' + panelLocation + panelLocation + '</tr><tr>' + panelLocation + panelLocation + '</tr></table>'
            +'<br />'
            +'<label>' + panelPosition + '&nbsp;Fixed</label><br /><label>' + panelPosition + '&nbsp;Absolute</label>'
            +'</fieldset>'
            +'</td></table><br />'
            +'<div class="right">'
            +'<input type="button" value="OK" class="SEObar_panel_btn" onMouseUp="ujs_seob.saveOptions();ujs_seob.bShowOptions=false;ujs_seob.setPanelData();ujs_seob.setStatusbarData();" />&nbsp;'
            +'<input type="button" value="Cancel" class="SEObar_panel_btn" onMouseUp="ujs_seob.bShowOptions=false;ujs_seob.setPanelData();ujs_seob.setStatusbarData();" />'            
            +'</div></form>'
            +'<br /><span class="SEObar_panel_gray_text">Fake domain: ' + ujs_seob.fakeDomain + '</span>'
            +'</div>'
          );
          
          d += options;
          p.innerHTML = d;
          ujs_seob.setFormValues();
          return;
        }    

        if(ujs_seob.bCollapsedPanel) 
        {           
           p.innerHTML = grip;          
           return;           
        }

        var btnMoreLess = '';
        if(ujs_seob.isMoreLessBtnRequired())
          btnMoreLess = ujs_seob.getMoreLessBtn();
        
        var th = ujs_seob.getTh(ujs_seob.bMore);        
        
        d = grip + '&nbsp;';
        
        var protocol = document.location.protocol;
        var host = document.location.host;
        var domain = ujs_seob.getDomainName(host);        
        var url = protocol + '//' + host;
        
        var anchorAttribute = ujs_seob.anchorAttributeName + '="' + ujs_seob.anchorAttributeValue + '"';

        var alexa = ujs_seob.formatAlexa(th);
        if(alexa)
        {
          d += '<b>Alexa</b>:&nbsp;';
          d += '<a href="http://www.alexa.com/data/details/main?url=' + url + '" ' + anchorAttribute + '>';
          d += alexa + '</a>' + '&nbsp;&nbsp;&nbsp;';
        }

        var google = ujs_seob.formatData(ujs_seob.googlePR,
          ujs_seob.opRepresentation[2][0], th);
        if(google)
        {
          d += '<b>Google</b>:&nbsp;';
          d += '<a href="' + ujs_seob.googleFrame.url + '" ' + anchorAttribute + '>' + google + '</a>&nbsp;&nbsp;&nbsp;';
        }
        
        var yandex = ujs_seob.formatYandex(th);
        if(yandex)
        {
          d += '<b>Yandex</b>:&nbsp;';
          d += '<a href="http://www.yandex.ru/cy?base=0&host=' + url + '"';
          if(ujs_seob.yandexInfo && ujs_seob.opRepresentation[5][0] <= th)
          {
            d += ' title="' + ujs_seob.yandexInfo + '" ';
          }
          d += anchorAttribute + '>' + yandex + '</a>' + '&nbsp;&nbsp;&nbsp;';
        } 
        
        if(ujs_seob.opRepresentation[22][0] <= th)
        {
          d += '<input type="button" value="&empty;" class="SEObar_panel_sbtn" title="Refresh" onMouseUp="ujs_seob.refreshRatings()" />&nbsp;';
        }
        
        if(ujs_seob.opRepresentation[23][0] <= th)
        {        
          d += ujs_seob.getRatingsBtn() + '&nbsp;';
        }
        
        if(ujs_seob.opRepresentation[24][0] <= th)
        {        
          d += ujs_seob.getToolsBtn() + '&nbsp;';
        }
        
        if(ujs_seob.opRepresentation[21][0] <= th)
        {
          d += btnOptions;        
        }

        d += btnMoreLess;  
        
        d += btnClose;
        
        
        if(this.bRatings)
        {
          var tabs = new Array('', '', '', '');
          tabs[ujs_seob.currentRatingTab] = ' id="selected_tab"';
          var ratings = '<div id="SEObar_panel_addon_h2">Ratings</div>';
          
          ratings += '<ul id="SEObar_tabs">';
          ratings += '<li' + tabs[1] + ' class="first_tab"><a href="#" ' + anchorAttribute + ' onMouseUp="ujs_seob.currentRatingTab = 1; ujs_seob.setPanelData(); ujs_seob.getIndexedPagesInfo();">Indexed&nbsp;Pages</a></li>';
          ratings += '<li' + tabs[2] + '><a href="#" ' + anchorAttribute + ' onMouseUp="ujs_seob.currentRatingTab = 2; ujs_seob.setPanelData(); ujs_seob.getBackwardLinksInfo();">Backward&nbsp;Links</a></li>';
          ratings += '<li' + tabs[3] + '><a href="#" ' + anchorAttribute + ' onMouseUp="ujs_seob.currentRatingTab = 3; ujs_seob.setPanelData(); ujs_seob.getDirectoriesInfo();">Directories</a></li>';
          ratings += '</ul>';
          
          ratings += '<div id="tab_content" style="' + ujs_seob.scrollbarStyle + '">';
          
          switch(ujs_seob.currentRatingTab)
          {
            case 0:
              break;
            case 1:  
              if(ujs_seob.bInitRatings)
              {
                ujs_seob.bInitRatings = false;
                ujs_seob.getIndexedPagesInfo();                
              }
              ratings += ujs_seob.getIndexedPages();
              break;
            case 2:
              if(ujs_seob.bInitRatings)
              {
                ujs_seob.bInitRatings = false;
                ujs_seob.getBackwardLinksInfo();                
              }
              ratings += ujs_seob.getBackwardLinks();
              break;
            case 3:
              if(ujs_seob.bInitRatings)
              {
                ujs_seob.bInitRatings = false;
                ujs_seob.getDirectoriesInfo();
              }
              ratings += ujs_seob.getDirectories();
              break;            
            default:
              ujs_seob.currentRatingTab = 0;
              ujs_seob.setPanelData();
              break;
          }          
          ratings += '</div>';
          
          d += '<div id="SEObar_panel_addon">' + ratings + '</div>';
        }
        else if(this.bTools)
        {
          var tabs = new Array('', '', '', '', '', '');
          tabs[ujs_seob.currentToolTab] = ' id="selected_tab"';
          var tools = '';          
          tools += '<div id="SEObar_panel_addon_h2">Tools</div>';
          
          tools += '<ul id="SEObar_tabs">';
          tools += '<li' + tabs[0] + ' class="first_tab"><a href="#" ' + anchorAttribute + ' onMouseUp="ujs_seob.currentToolTab = 0; ujs_seob.setPanelData();">General</a></li>';
          tools += '<li' + tabs[1] + '><a href="#" ' + anchorAttribute + ' onMouseUp="ujs_seob.currentToolTab = 1; ujs_seob.setPanelData();">Link&nbsp;Statistics</a></li>';
          tools += '<li' + tabs[2] + '><a href="#" ' + anchorAttribute + ' onMouseUp="ujs_seob.currentToolTab = 2; ujs_seob.setPanelData();">Meta&nbsp;Tags</a></li>';
          tools += '<li' + tabs[3] + '><a href="#" ' + anchorAttribute + ' onMouseUp="ujs_seob.currentToolTab = 3; ujs_seob.getHttpHeaders();">HTTP&nbsp;Headers</a></li>';
          tools += '<li' + tabs[4] + '><a href="#" ' + anchorAttribute + ' onMouseUp="ujs_seob.currentToolTab = 4; ujs_seob.setPanelData();">SEObar</a></li>';
          tools += '</ul>';
          
          tools += '<div id="tab_content" style="' + ujs_seob.scrollbarStyle + '">';
          
          switch(ujs_seob.currentToolTab)
          {
            case 0:
              tools += '<table>';
              // noindex
              var checked = '';
              if(ujs_seob.highlightNoindex)
              {
                checked = 'checked';
              }
              tools += '<tr><td class="hdr" noborder><label><input type="checkbox" value="noindex" ' + checked + ' onclick="ujs_seob.highlightNoindex = this.checked; ujs_seob.putPreferencesToStorage(); ujs_seob.highlightElements();">&nbsp;Highlight&nbsp;&quot;noindex&quot;</label></td>';
              tools += '<td noborder><span style="' + ujs_seob.noindexStyle + ujs_seob.highlightStyle + '">[example]</span></td></tr>';
              // nofollow
              checked = '';
              if(ujs_seob.highlightNofollow)
              {
                checked = 'checked';
              }
              tools += '<tr><td class="hdr" noborder><label><input type="checkbox" value="nofollow" ' + checked + ' onclick="ujs_seob.highlightNofollow = this.checked; ujs_seob.putPreferencesToStorage(); ujs_seob.highlightElements();">&nbsp;Highlight&nbsp;&quot;nofollow&quot;</label></td>';
              tools += '<td noborder><span style="' + ujs_seob.nofollowStyle + ujs_seob.highlightStyle + '">[example]</span></td></tr>';
              // external links
              checked = '';
              if(ujs_seob.highlightExternalLinks)
              {
                checked = 'checked';
              }
              tools += '<td class="hdr" noborder><label><input type="checkbox" value="external_links" ' + checked + ' onclick="ujs_seob.highlightExternalLinks = this.checked; ujs_seob.putPreferencesToStorage(); ujs_seob.highlightElements();">&nbsp;Highlight&nbsp;external&nbsp;links</label></td>';
              tools += '<td noborder><span style="' + ujs_seob.externalLinkStyle + ujs_seob.highlightStyle + '">[example]</span></td></tr>';
              
              tools += '<tr><td class="separator" noborder colspan="2">&nbsp;</td></tr>'
              // Whois
              var whois = ujs_seob.whoisUrl.replace(/%s{1}/, domain);
              tools += '<tr><td class="hdr" noborder colspan="2"><input type="button" value="Whois" onMouseUp="var wnd=window.open(\'' + whois + '\');" /></td></tr>';
              // Robots.txt          
              tools += '<tr><td class="hdr" noborder colspan="2"><input type="button" value="Robots.txt" onMouseUp="var wnd=window.open(\'' + protocol + '//' + host + '/robots.txt\');" /></td></tr>';
              // Google's cache          
              tools += '<tr><td class="hdr" noborder colspan="2"><input type="button" value="Google\'s cache" onMouseUp="var wnd=window.open(\'http://google.com/search?q=cache:' + document.location.href + '\');" /></td></tr>';              
              
              tools += '</table>';
              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.seobarUpdateInfo;
              break;  
            default:
              ujs_seob.currentToolTab = 0;
              ujs_seob.setPanelData();
              break;
          }          
          tools += '</div>';
          
          d += '<div id="SEObar_panel_addon">' + tools + '</div>';
        }
          
        p.innerHTML = d;
      }
    },
    
    setStatusbarData : function()
    { 
      if(!ujs_seob.bStatusbar)
        return;
        
      if(ujs_seob.op[0][0])
      {
        window.defaultStatus = '';
        return;
      }
        
      var s = '';
      var th = ujs_seob.getTh(ujs_seob.bMore);
       
      var alexa = ujs_seob.formatAlexa(th);
      if(alexa)
      {
        s += 'Alexa: ' + alexa + '   ';        
      }

      var google = ujs_seob.formatData(ujs_seob.googlePR,
        ujs_seob.opRepresentation[2][0], th);
      if(google)
      {
        s += 'Google: ' + google + '   ';
      }
        
      var yandex = ujs_seob.formatYandex(th);
      if(yandex)
      {
        s += 'Yandex: ' + yandex;
        if(ujs_seob.showYandexInfoInStatusbar && ujs_seob.yandexInfo &&
          ujs_seob.opRepresentation[5][0] <= th)
        {
          s += ' [' + ujs_seob.yandexInfo + ']';
        }
      }
      
      if(s)
          window.defaultStatus = s;
      
    },
    
    getTh : function(bMore)
    {
      return  (bMore) ? 1 : 0;
    },
    
    isMoreLessBtnRequired : function()
    {
      for(var i = 0; i < ujs_seob.opRepMain.length; i++)
      {
        if(ujs_seob.opRepresentation[ujs_seob.opRepMain[i]][0] == 1)
        {          
          return true;
        }
      }
      
      return false;
    },
    
    isDirMoreLessBtnRequired : function()
    {
      for(var i = 0; i < ujs_seob.opRepDirectories.length; i++)
      {
        if(ujs_seob.opRepresentation[ujs_seob.opRepDirectories[i]][0] == 1)
        {          
          return true;
        }
      }
      
      return false;
    },
    
    isLinkMoreLessBtnRequired : function()
    {
      for(var i = 0; i < ujs_seob.opRepBackwardLinks.length; i++)
      {
        if(ujs_seob.opRepresentation[ujs_seob.opRepBackwardLinks[i]][0] == 1)
        {          
          return true;
        }
      }
      
      return false;
    },
    
    isIndexMoreLessBtnRequired : function()
    {
      for(var i = 0; i < ujs_seob.opRepIndexedPages.length; i++)
      {
        if(ujs_seob.opRepresentation[ujs_seob.opRepIndexedPages[i]][0] == 1)
        {          
          return true;
        }
      }
      
      return false;
    },
    
    getMoreLessBtn : function() 
    {
      var v = '&laquo;', t = 'More';
      if(ujs_seob.bMore)
      {
        v = '&raquo;';
        t = 'Less';
      }          
      return '<input type="button" value="' + v + '" class="SEObar_panel_sbtn" title="' + t + '" onMouseUp="ujs_seob.onMoreLessData()" />&nbsp;'; 
    },
    
    getSecButtons : function(bShowMoreLessButton, bMore, onMouseUp, onRefresh) 
    {
      var v = 'More', t = 'More';
      if(bMore)
      {
        v = 'Less';
        t = 'Less';
      }          
      var ret = '<br /><div class="right">'
      ret += '<input type="button" value="Refresh" class="SEObar_panel_btn" title="Refresh" onMouseUp="' + onRefresh + '" />';
      
      if(bShowMoreLessButton)
      {
        ret += '&nbsp;';
        ret += '<input type="button" value="' + v + '" class="SEObar_panel_btn" title="' + t + '" onMouseUp="' + onMouseUp + '" />'
      }
      ret += '</div>';
      
      return ret;
    },
   
    getGripBtn : function()
    {
      var v = '&minus;', t = 'Collapse';
      if(ujs_seob.bCollapsedPanel)     
      {
        v = '+';
        t = 'Expand';
      }          
      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="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="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="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.getRatings();
      }
      
      ujs_seob.setPanelData();
      ujs_seob.setStatusbarData();
      ujs_seob.putPreferencesToStorage();
    },
    
    onMoreLessData : function()
    { 
      ujs_seob.bMore = !ujs_seob.bMore;      
      
      if(ujs_seob.bMore)
      {
        ujs_seob.getRatings();
      }
      
      ujs_seob.setPanelData();
      ujs_seob.setStatusbarData();
    },
    
    onDirMoreLessData : function()
    { 
      ujs_seob.bMoreDirectories = !ujs_seob.bMoreDirectories;      
      
      if(ujs_seob.bMoreDirectories)
      {
        ujs_seob.getDirectoriesInfo();
      }
      
      ujs_seob.setPanelData();
    },
    
    onLinkMoreLessData : function()
    { 
      ujs_seob.bMoreBackwardLinks = !ujs_seob.bMoreBackwardLinks;      
      
      if(ujs_seob.bMoreBackwardLinks)
      {
        ujs_seob.getBackwardLinksInfo();
      }
      
      ujs_seob.setPanelData();
    },
    
    onIndexMoreLessData : function()
    { 
      ujs_seob.bMoreIndexedPages = !ujs_seob.bMoreIndexedPages;      
      
      if(ujs_seob.bMoreIndexedPages)
      {
        ujs_seob.getIndexedPagesInfo();
      }
      
      ujs_seob.setPanelData();
    },    
    
    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];

      for(var i = 0; i < ujs_seob.opRepresentation.length; i++)
      {
        f.elements[ujs_seob.opRepresentation[i][1]][ujs_seob.opRepresentation[i][0]].checked = true;
      }
      
      for(var i = 0; i < ujs_seob.opPosition.length; i++)
      {
        f.elements[ujs_seob.opPosition[i][1]][ujs_seob.opPosition[i][0]].checked = true;
      }
      
    },
    
    onOptionsAlexaRankClick : function()
    {
      var f = document.forms[ujs_seob.opFormId];      
      var d = f.elements[ujs_seob.opRepresentation[1][1]];

      var i1 = 0, i2 = 0;
      for(var k = 0; k < d.length; k++)
      {
        if(f.elements[ujs_seob.opRepresentation[0][1]][k].checked)
          i1 = k;
        if(d[k].checked)
          i2 = k;
      }
      
      if(i2 < i1)
      {
        d[i2].checked = false;
        d[i1].checked = true;
      }
      
      var dis = true;
      for(k = 0; k < d.length; k++)
      {
        if(i1 == k)
          dis = false;
          
        d[k].disabled = dis; 
      }
    },
    
    onOptionsYandexTcyClick : function()
    {
      var f = document.forms[ujs_seob.opFormId];      
      var ai = f.elements[ujs_seob.opRepresentation[5][1]];      

      var i1 = 0, i2 = 0, i3 = 0;
      for(var k = 0; k < ai.length; k++)
      {
        if(f.elements[ujs_seob.opRepresentation[3][1]][k].checked)
          i1 = k;
        if(f.elements[ujs_seob.opRepresentation[4][1]][k].checked)
          i2 = k;            
        if(ai[k].checked)
          i3 = k;
      }
      
      if(i2 < i1)
        i1 = i2;
      
      if(i3 < i1)
      {
        ai[i3].checked = false;
        ai[i1].checked = true;
      }
      
      var dis = true;
      for(k = 0; k < ai.length; k++)
      {
        if(i1 == k)
          dis = false;
          
        ai[k].disabled = dis; 
      }
    },
    
    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;
        
        for(var i = 0; i < ujs_seob.opRepresentation.length; i++)
        {
          ujs_seob.opRepresentation[i][0] = 0;
          var e = f.elements[ujs_seob.opRepresentation[i][1]];
          
          for(var j = 0; j < e.length; j++)
          {
            if(e[j].checked)
            {
              ujs_seob.opRepresentation[i][0] = j;
            }
          }
        }
        
        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.putPreferencesToStorage();            
    },
    
    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.preferencesCookie)
      {
        if(!data)
        {
          ujs_seob.storage.loadData(ujs_seob.domainCookie, ujs_seob.domainCookie);
          return;
        }
        
        var v = data.split('**');
        if(v.length >= 2)
        {
          var count1 = parseInt(v[0]);
          if(!isNaN(count1))
          {
            var count2 = 6; // collapsed, disable script, store domain ratings
            count2 += ujs_seob.opRepresentation.length;
            count2 += ujs_seob.opPosition.length;
            
            if(count1 == count2)
            {
              v = v[1].split('-');
              if(v.length == count1)
              {
                // collapsed
                ujs_seob.bCollapsedPanel = (v[0] == 'false') ? false : true;
                // disable script
                ujs_seob.op[0][0] = (v[1] == 'false') ? false : true;
                // store domain ratings
                ujs_seob.op[1][0] = (v[2] == 'false') ? false : true;
                // highlight
                ujs_seob.highlightNoindex = (v[3] == 'false') ? false : true;
                ujs_seob.highlightNofollow = (v[4] == 'false') ? false : true;      
                ujs_seob.highlightExternalLinks = (v[5] == 'false') ? false : true;
                
                // Elements Representation
                var offset = 6;
                for(var i = 0; i < ujs_seob.opRepresentation.length; i++)
                {
                  var val = parseInt(v[i + offset]);
                  if(!isNaN(val))
                  {
                    ujs_seob.opRepresentation[i][0] = val;
                  }
                }                
                offset += ujs_seob.opRepresentation.length;
                
                // Panel Position
                for(var i = 0; i < ujs_seob.opPosition.length; i++)
                {
                  var val = parseInt(v[i + offset]);
                  if(!isNaN(val))
                  {
                    ujs_seob.opPosition[i][0] = val;
                  }
                }                
                offset += ujs_seob.opPosition.length;
              }
            }
          }
        }
          
        ujs_seob.storage.loadData(ujs_seob.domainCookie, ujs_seob.domainCookie);
      }      
      else if(id == ujs_seob.domainCookie)
      {    
        if(ujs_seob.op[1][0])
        {
          ujs_seob.getDomainRatings();
          ujs_seob.init();
          return;
        }
        
        if(!data)
        {
          ujs_seob.init();
          return;
        }
          
        var v = data.split('**');
        if(v.length >= 2)
        {
          var count1 = parseInt(v[0]);
          if(!isNaN(count1))
          {
            var count2 = 1; // domain name
            count2 += ujs_seob.domainData.length;            
            
            if(count1 == count2)
            {
              v = v[1].split('\t');
              if(v.length == count1)
              {
                if(v[0] == document.location.host)
                {
                  for(var i = 0; i < ujs_seob.domainData.length; i++)
                  {                    
                    var str = 'if(!' + ujs_seob.domainData[i] + ' && v[i + 1])';
                    str += ujs_seob.domainData[i] + '=' + 'v[i + 1]';
                    eval(str);
                  }
                }                
              }
            }
          }
        }
        
        ujs_seob.init();
      }
    },
    
    putPreferencesToStorage : function()
    {
      var count = 0;
      var v = ujs_seob.bCollapsedPanel;
      count++;
      v += '-' + ujs_seob.op[0][0];      
      count++;
      v += '-' + ujs_seob.op[1][0];
      count++;
      v += '-' + ujs_seob.highlightNoindex;
      count++;
      v += '-' + ujs_seob.highlightNofollow;
      count++;
      v += '-' + ujs_seob.highlightExternalLinks;
      count++;
      
      for(var i = 0; i < ujs_seob.opRepresentation.length; i++)
      {            
        v += '-' + ujs_seob.opRepresentation[i][0].toString();
      }
      count += ujs_seob.opRepresentation.length;
      
      for(var i = 0; i < ujs_seob.opPosition.length; i++)
      {            
        v += '-' + ujs_seob.opPosition[i][0].toString();
      }
      
      count += ujs_seob.opPosition.length;
      v = count.toString() + '**' + v;
      
      ujs_seob.storage.saveData(v, ujs_seob.preferencesCookie);
    },
    
    putDomainInfoToStorage : function()
    {
      if(ujs_seob.op[1][0])
      {
        ujs_seob.storeDomainRatings();
        return;
      }
        
      var count = 0;      
      var v = document.location.host;
      count++;
      for(var i = 0; i < ujs_seob.domainData.length; i++)
      {
        v += '\t' + eval(ujs_seob.domainData[i]);
      }
      count += ujs_seob.domainData.length;
      v = count.toString() + '**' + v;
      
      ujs_seob.storage.saveData(v, ujs_seob.domainCookie);
    },
    
    getDomainRatings : function()
    {
      var data = ujs_seob.getCookie(ujs_seob.domainRatingCookie);
      if(!data)
        return;
        
      var v = data.split('**');
      if(v.length < 2)
        return;
        
      var count = parseInt(v[0]);
      if(isNaN(count))
        return;
        
      if(count != ujs_seob.domainData.length)
        return;

      v = v[1].split('\t');
      if(v.length != count)
        return;
        
      for(var i = 0; i < ujs_seob.domainData.length; i++)
      {
        var str = ujs_seob.domainData[i] + '=' + 'v[i]';
        eval(str);
      }
    },
    
    storeDomainRatings : function()
    {
      var v = ujs_seob.domainData.length.toString() + '**';
      var sep = '';
      for(var i = 0; i < ujs_seob.domainData.length; i++)
      {
        v += sep + eval(ujs_seob.domainData[i]);
        sep = '\t';
      }
      
      var exp = new Date();
      var msec = exp.getTime();
      msec += ujs_seob.domainRatingStorageTime * 60000;
      exp = new Date(msec);
      ujs_seob.setCookie(ujs_seob.domainRatingCookie, v, exp, window.location.host);
    },
    
    init : function()
    {
      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.getRatings();
    },
    
    getRatings : function(data, id)
    {
      var th = ujs_seob.getTh(ujs_seob.bMore);
      if(!id)
        id = 'begin';
      
      switch(id)
      {
        case 'begin':
          ujs_seob.getRatings('', 'Alexa info');
          return;

        case 'Alexa info':          
          if(ujs_seob.opRepresentation[0][0] <= th && !ujs_seob.alexaRank)          
            ujs_seob.getInfoFromFrame(ujs_seob.alexaFrame);          
          else          
            ujs_seob.getRatings('', 'Google info');
            
          return;
          
        case ujs_seob.alexaFrame.frameToken:
          ujs_seob.parseAlexaData(data);
          ujs_seob.getRatings('', 'Google info');
          return;
          
        case 'Google info':
          if(ujs_seob.opRepresentation[2][0] <= th && !ujs_seob.googlePR)
            ujs_seob.getInfoFromFrame(ujs_seob.googleFrame);
          else
            ujs_seob.getRatings('', 'Yandex info');
            
          return;
          
        case ujs_seob.googleFrame.frameToken:
          ujs_seob.parseGoogleData(data);
          ujs_seob.getRatings('', 'Yandex info');
          return;  
          
        case 'Yandex info':
          if((ujs_seob.opRepresentation[3][0] <= th && !ujs_seob.yandexCY) ||
            (ujs_seob.opRepresentation[4][0] <= th && !ujs_seob.yandexRank))
            ujs_seob.getInfoFromFrame(ujs_seob.yandexFrame);
          return;
          
        case ujs_seob.yandexFrame.frameToken:
          ujs_seob.parseYandexData(data);
          return;
      }
    },
    
    getDirectoriesInfo : function(data, id)
    {
      var th = ujs_seob.getTh(ujs_seob.bMoreDirectories);
      if(!id)
      {
        id = 'begin';
      }

      switch(id)
      {
        case 'begin':
          ujs_seob.getDirectoriesInfo('', 'DMOZ info');
          return;
         
        case 'DMOZ info':
          if(ujs_seob.opRepresentation[6][0] <= th && !ujs_seob.dirDmoz)
            ujs_seob.getInfoFromFrame(ujs_seob.dmozFrame);
          else          
            ujs_seob.getDirectoriesInfo('', 'Yahoo! Directory info');
            
          return;
          
        case ujs_seob.dmozFrame.frameToken:
          ujs_seob.dirDmoz = ujs_seob.parseData(data);
          if(ujs_seob.dirDmoz != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
          }
          ujs_seob.getDirectoriesInfo('', 'Yahoo! Directory info');
          return;
          
        case 'Yahoo! Directory info':
          if(ujs_seob.opRepresentation[7][0] <= th && !ujs_seob.dirYahoo)
            ujs_seob.getInfoFromFrame(ujs_seob.yahooDirFrame);
          else          
            ujs_seob.getDirectoriesInfo('', 'YaCa info');
            
          return;
          
        case ujs_seob.yahooDirFrame.frameToken:
          ujs_seob.dirYahoo = ujs_seob.parseData(data);
          if(ujs_seob.dirYahoo != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
          }
          ujs_seob.getDirectoriesInfo('', 'YaCa info');
          return;

        case 'YaCa info':          
          if(ujs_seob.opRepresentation[8][0] <= th && !ujs_seob.dirYandex)          
            ujs_seob.getInfoFromFrame(ujs_seob.yaCaFrame);          
          else          
            ujs_seob.getDirectoriesInfo('', 'RamblerTop100 info');
            
          return;
          
        case ujs_seob.yaCaFrame.frameToken:
          ujs_seob.dirYandex = ujs_seob.parseData(data);
          if(ujs_seob.dirYandex != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
          }
          ujs_seob.getDirectoriesInfo('', 'RamblerTop100 info');
          return;
          
        case 'RamblerTop100 info':
          if(ujs_seob.opRepresentation[9][0] <= th && !ujs_seob.dirRambler)
          {
            ujs_seob.getInfoFromFrame(ujs_seob.raTop100Frame);
          }
          return;
          
        case ujs_seob.raTop100Frame.frameToken:
          ujs_seob.dirRambler = ujs_seob.parseData(data);
          if(ujs_seob.dirRambler != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
          }
          return;  
      }
    },
    
    getBackwardLinksInfo : function(data, id)
    {
      var th = ujs_seob.getTh(ujs_seob.bMoreBackwardLinks);
      if(!id)
      {
        id = 'begin';
      }

      switch(id)
      {
        case 'begin':
          ujs_seob.getBackwardLinksInfo('', 'Google info');
          return;
         
        case 'Google info':
          if(ujs_seob.opRepresentation[10][0] <= th && !ujs_seob.linkGoogle)
            ujs_seob.getInfoFromFrame(ujs_seob.googleLinkFrame);
          else          
            ujs_seob.getBackwardLinksInfo('', 'Yahoo! URL info');
            
          return;
          
        case ujs_seob.googleLinkFrame.frameToken:
          ujs_seob.linkGoogle = ujs_seob.parseData(data);
          if(ujs_seob.linkGoogle != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
            ujs_seob.putDomainInfoToStorage();
          }
          ujs_seob.getBackwardLinksInfo('', 'Yahoo! URL info');
          return;          
          
          
        case 'Yahoo! URL info': 
          if(ujs_seob.opRepresentation[11][0] <= th && !ujs_seob.linkYahooUrl)
            ujs_seob.getInfoFromFrame(ujs_seob.yahooUrlLinkFrame);
          else          
            ujs_seob.getBackwardLinksInfo('', 'Yahoo! Domain info');
            
          return; 

        case ujs_seob.yahooUrlLinkFrame.frameToken:
          ujs_seob.linkYahooUrl = ujs_seob.parseData(data);
          if(ujs_seob.linkYahooUrl != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
          }
          ujs_seob.getBackwardLinksInfo('', 'Yahoo! Domain info');
          return;

        case 'Yahoo! Domain info': 
          if(ujs_seob.opRepresentation[12][0] <= th && !ujs_seob.linkYahooDomain)
            ujs_seob.getInfoFromFrame(ujs_seob.yahooDomainLinkFrame);
          else          
            ujs_seob.getBackwardLinksInfo('', 'MSN URL info');
            
          return; 

        case ujs_seob.yahooDomainLinkFrame.frameToken:
          ujs_seob.linkYahooDomain = ujs_seob.parseData(data);
          if(ujs_seob.linkYahooDomain != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
            ujs_seob.putDomainInfoToStorage();
          }
          ujs_seob.getBackwardLinksInfo('', 'MSN URL info');
          return;

        case 'MSN URL info':
          if(ujs_seob.opRepresentation[13][0] <= th && !ujs_seob.linkMsnURL)
            ujs_seob.getInfoFromFrame(ujs_seob.msnUrlLinkFrame);
          else          
            ujs_seob.getBackwardLinksInfo('', 'MSN Domain info');
            
          return; 

        case ujs_seob.msnUrlLinkFrame.frameToken:
          ujs_seob.linkMsnURL  = ujs_seob.parseData(data);
          if(ujs_seob.linkMsnURL  != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
          }
          ujs_seob.getBackwardLinksInfo('', 'MSN Domain info');
          return;  

        case 'MSN Domain info':
          if(ujs_seob.opRepresentation[14][0] <= th && !ujs_seob.linkMsnDomain)
            ujs_seob.getInfoFromFrame(ujs_seob.msnDomainLinkFrame);
          else          
            ujs_seob.getBackwardLinksInfo('', 'Yandex info');
            
          return; 

        case ujs_seob.msnDomainLinkFrame.frameToken:
          ujs_seob.linkMsnDomain   = ujs_seob.parseData(data);
          if(ujs_seob.linkMsnDomain   != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
            ujs_seob.putDomainInfoToStorage();
          }
          ujs_seob.getBackwardLinksInfo('', 'Yandex info');
          return;  

        case 'Yandex info':
          if(ujs_seob.opRepresentation[15][0] <= th && !ujs_seob.linkYandex)
            ujs_seob.getInfoFromFrame(ujs_seob.yandexLinkFrame);
            
          return; 

        case ujs_seob.yandexLinkFrame.frameToken:
          ujs_seob.linkYandex   = ujs_seob.parseData(data);
          if(ujs_seob.linkYandex   != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
          }
          return;            
      }
    },
    
    getIndexedPagesInfo : function(data, id)
    {
      var th = ujs_seob.getTh(ujs_seob.bMoreIndexedPages);
      if(!id)
      {
        id = 'begin';
      }

      switch(id)
      {
        case 'begin':
          ujs_seob.getIndexedPagesInfo('', 'Google info');
          return;
         
        case 'Google info':
          if(ujs_seob.opRepresentation[16][0] <= th && !ujs_seob.indexGoogle)
            ujs_seob.getInfoFromFrame(ujs_seob.googleIndexFrame);          
          else          
            ujs_seob.getIndexedPagesInfo('', 'Yahoo! info');
            
          return;
          
        case ujs_seob.googleIndexFrame.frameToken:
          ujs_seob.indexGoogle = ujs_seob.parseData(data);
          if(ujs_seob.indexGoogle != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
            ujs_seob.putDomainInfoToStorage();
          }
          ujs_seob.getIndexedPagesInfo('', 'Yahoo! info');
          return;
          
        case 'Yahoo! info':
          if(ujs_seob.opRepresentation[17][0] <= th && !ujs_seob.indexYahoo)
            ujs_seob.getInfoFromFrame(ujs_seob.yahooIndexFrame);          
          else          
            ujs_seob.getIndexedPagesInfo('', 'MSN info');
            
          return;
          
        case ujs_seob.yahooIndexFrame.frameToken:
          ujs_seob.indexYahoo = ujs_seob.parseData(data);
          if(ujs_seob.indexYahoo != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
            ujs_seob.putDomainInfoToStorage();
          }
          ujs_seob.getIndexedPagesInfo('', 'MSN info');
          return;  
          
        case 'MSN info':
          if(ujs_seob.opRepresentation[18][0] <= th && !ujs_seob.indexMsn)
            ujs_seob.getInfoFromFrame(ujs_seob.msnIndexFrame);          
          else          
            ujs_seob.getIndexedPagesInfo('', 'Yandex info');
            
          return;
          
        case ujs_seob.msnIndexFrame.frameToken:
          ujs_seob.indexMsn = ujs_seob.parseData(data);
          if(ujs_seob.indexMsn != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
            ujs_seob.putDomainInfoToStorage();
          }
          ujs_seob.getIndexedPagesInfo('', 'Yandex info');
          return;  
          
        case 'Yandex info':
          if(ujs_seob.opRepresentation[19][0] <= th && !ujs_seob.indexYandex)
            ujs_seob.getInfoFromFrame(ujs_seob.yandexIndexFrame);          
          else          
            ujs_seob.getIndexedPagesInfo('', 'Rambler info');
            
          return;
          
        case ujs_seob.yandexIndexFrame.frameToken:
          ujs_seob.indexYandex = ujs_seob.parseData(data);
          if(ujs_seob.indexYandex != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
            ujs_seob.putDomainInfoToStorage();
          }
          ujs_seob.getIndexedPagesInfo('', 'Rambler info');
          return;  
          
        case 'Rambler info':
          if(ujs_seob.opRepresentation[20][0] <= th && !ujs_seob.indexRambler)
          {
            ujs_seob.getInfoFromFrame(ujs_seob.ramblerIndexFrame);
          }
          return;
          
        case ujs_seob.ramblerIndexFrame.frameToken:
          ujs_seob.indexRambler = ujs_seob.parseData(data);
          if(ujs_seob.indexRambler != ujs_seob.undefinedRank)
          {
            ujs_seob.setPanelData();
            ujs_seob.putDomainInfoToStorage();
          }          
          return;
      }
    },
    
    getUpdateInfo : function(data, id)
    {
      if(!id)
      {        
        ujs_seob.getInfoFromFrame(ujs_seob.seobarUpdateFrame);
      }
      else if(ujs_seob.seobarUpdateFrame.frameToken)
      {
        if(data != undefined)
          ujs_seob.seobarUpdateInfo = data;
          
        ujs_seob.setPanelData();
      }
    },
    
    refreshRatings : function()
    {
      ujs_seob.alexaRank = '';
      ujs_seob.googlePR = '';
      ujs_seob.yandexCY = '';
      ujs_seob.yandexRank = '';
      
      ujs_seob.setPanelData();      
      ujs_seob.getRatings();
    },
    
    refreshDirectoriesInfo : function()
    {
      ujs_seob.dirDmoz = '';
      ujs_seob.dirYahoo = '';
      ujs_seob.dirYandex = '';
      ujs_seob.dirRambler = '';
      
      ujs_seob.setPanelData(); 
      ujs_seob.getDirectoriesInfo();
    },
    
    refreshBackwardLinksInfo : function()
    {
      ujs_seob.linkGoogle = '';
      ujs_seob.linkYahooUrl = '';
      ujs_seob.linkYahooDomain = '';
      ujs_seob.linkMsnURL = '';
      ujs_seob.linkMsnDomain = '';
      ujs_seob.linkYandex = '';
      
      ujs_seob.setPanelData(); 
      ujs_seob.getBackwardLinksInfo();
    },
    
    refreshIndexedPagesInfo : function()
    {
      ujs_seob.indexGoogle = '';
      ujs_seob.indexYahoo = '';
      ujs_seob.indexMsn = '';
      ujs_seob.indexYandex = '';
      ujs_seob.indexRambler = '';
      
      ujs_seob.setPanelData(); 
      ujs_seob.getIndexedPagesInfo();
    },
    
    getInfoFromFrame : function(frameObj)
    {
      var obj = document.getElementById(frameObj.frameId);
      if(obj)
        frameObj.getData(frameObj.frameToken);
      else
        frameObj.createFrame();
    },
    
    parseData : function(data)
    {
      if(!data)
        return ujs_seob.undefinedRank;
      else
        return data;
    },
    
    parseAlexaData : function(data)
    {
      var d = data.split(ujs_seob.alexaFrame.dataSeparator);      
      if(d.length > 0)
        ujs_seob.alexaRank = d[0];
      if(d.length > 1)
        ujs_seob.alexaDomain = d[1];
          
      if(!ujs_seob.alexaRank)
        ujs_seob.alexaRank = ujs_seob.undefinedRank;
      else
      {  
        ujs_seob.setStatusbarData();
        ujs_seob.setPanelData();
      }
          
      ujs_seob.putDomainInfoToStorage();
    },
    
    parseGoogleData : function(data)
    {
      ujs_seob.googlePR = data;
      if(!ujs_seob.googlePR)
        ujs_seob.googlePR = ujs_seob.undefinedRank;
      else
      {
        ujs_seob.setStatusbarData();
        ujs_seob.setPanelData();
      }
    },
    
    parseYandexData : function(data)
    {
      var d = data.split('#'), tcy = '', info = '';
      if(d.length > 0)
      {
        tcy = d[0].split('|');
        if(tcy.length > 0)
          ujs_seob.yandexCY = tcy[0];
        if(tcy.length > 1)
          ujs_seob.yandexRank = tcy[1];
      }
      if(d.length > 1)
      {
        ujs_seob.yandexInfo = d[1];
      }

      if(!ujs_seob.yandexCY)
        ujs_seob.yandexCY = ujs_seob.undefinedRank;
            
      if(!ujs_seob.yandexRank)
        ujs_seob.yandexRank = ujs_seob.undefinedRank;          
            

      if(ujs_seob.yandexCY != ujs_seob.undefinedRank ||
        ujs_seob.yandexRank != ujs_seob.undefinedRank)
      {
        ujs_seob.setStatusbarData();
        ujs_seob.setPanelData();
      }
          
      ujs_seob.putDomainInfoToStorage();
    },

    formatData : function(data, rep, th)
    {
      var d = '';      
      if(rep <= th)
      {
        if(data)
          d = data;
        else
          d = ujs_seob.undefinedRank;
      }
     
      return d; 
    },
    
    formatAlexa : function(th)
    {
      var a = '';
      
      if(ujs_seob.opRepresentation[0][0] <= th)
      {
        if(ujs_seob.alexaRank)
          a = ujs_seob.alexaRank;
        else
          return ujs_seob.undefinedRank;
          
        if(ujs_seob.opRepresentation[1][0] <= th)
        {
          if(ujs_seob.alexaDomain)
            a += ' | ' + ujs_seob.alexaDomain;
        }
      }
      
      return a;  
    },    
    
    formatYandex : function(th)
    {
      var v = '', r = '';
      
      if(ujs_seob.opRepresentation[3][0] <= th)
      {
        if(ujs_seob.yandexCY)          
          v = ujs_seob.yandexCY;                  
        else
          v = ujs_seob.undefinedRank;
      }        
          
      if(ujs_seob.opRepresentation[4][0] <= th)
      {
        if(ujs_seob.yandexRank)
          r = ujs_seob.yandexRank;
        else
          r = ujs_seob.undefinedRank;
      }
      
      if(v == ujs_seob.undefinedRank && v == r)
        return ujs_seob.undefinedRank;
        
      if(v && r)
        return v + ' | ' + r;
        
      if(v)
        return v;
        
      if(r)
        return r;      
        
      return '';
    },
    
    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;
    },
    
    getIndexedPages : function()
    {
      var indTh = ujs_seob.getTh(ujs_seob.bMoreIndexedPages);
      var ind = '<table>';
          
      var indData = new Array();
      indData[0] = (new Array('Google', 16, ujs_seob.indexGoogle, ujs_seob.googleIndexFrame));
      indData[1] = (new Array('Yahoo!', 17, ujs_seob.indexYahoo, ujs_seob.yahooIndexFrame));
      indData[2] = (new Array('MSN', 18, ujs_seob.indexMsn, ujs_seob.msnIndexFrame));
      indData[3] = (new Array('Yandex', 19, ujs_seob.indexYandex, ujs_seob.yandexIndexFrame));
      indData[4] = (new Array('Rambler', 20, ujs_seob.indexRambler, ujs_seob.ramblerIndexFrame));
      
      for(var i = 0; i < indData.length; i++)
      {
        var val = ujs_seob.formatData(indData[i][2],
          ujs_seob.opRepresentation[indData[i][1]][0], indTh);
        if(val)
        {
          ind += '<tr><td class="hdr">' + indData[i][0] + '</td><td>';
          ind += '<a href="' + indData[i][3].getUrl() + '">' + val + '</a></td></tr>';
        }
      }
      
      ind += '</table>';
      
      var btnInd = ujs_seob.getSecButtons(ujs_seob.isIndexMoreLessBtnRequired(),
        ujs_seob.bMoreIndexedPages, 'ujs_seob.onIndexMoreLessData()',
        'ujs_seob.refreshIndexedPagesInfo()');
        
      ind += btnInd;
      return ind;
    },
    
    getBackwardLinks : function()
    {
      var linkTh = ujs_seob.getTh(ujs_seob.bMoreBackwardLinks);
      var link = '<table>';
      
      var linkData = new Array();
      linkData[0] = (new Array('Google', 10, ujs_seob.linkGoogle, ujs_seob.googleLinkFrame));
      linkData[1] = (new Array('Yahoo!&nbsp;<span class="SEObar_panel_gray_text">(URL)</span>', 11, ujs_seob.linkYahooUrl, ujs_seob.yahooUrlLinkFrame));
      linkData[2] = (new Array('Yahoo!&nbsp;<span class="SEObar_panel_gray_text">(Domain)</span>', 12, ujs_seob.linkYahooDomain, ujs_seob.yahooDomainLinkFrame));
      linkData[3] = (new Array('MSN&nbsp;<span class="SEObar_panel_gray_text">(URL)</span>', 13, ujs_seob.linkMsnURL, ujs_seob.msnUrlLinkFrame));
      linkData[4] = (new Array('MSN&nbsp;<span class="SEObar_panel_gray_text">(Domain)</span>', 14, ujs_seob.linkMsnDomain, ujs_seob.msnDomainLinkFrame));
      linkData[5] = (new Array('Yandex&nbsp;<span class="SEObar_panel_gray_text">(Pages&nbsp;|&nbsp;Sites)</span>', 15, ujs_seob.linkYandex, ujs_seob.yandexLinkFrame));
      
      for(var i = 0; i < linkData.length; i++)
      {
        var val = ujs_seob.formatData(linkData[i][2],
          ujs_seob.opRepresentation[linkData[i][1]][0], linkTh);
        if(val)
        {
          link += '<tr><td class="hdr">' + linkData[i][0] + '</td><td>';
          link += '<a href="' + linkData[i][3].getUrl() + '">' + val + '</a></td></tr>';
        }
      }
      
      link += '</table>';
      
      var btnLink = ujs_seob.getSecButtons(ujs_seob.isLinkMoreLessBtnRequired(),
        ujs_seob.bMoreBackwardLinks, 'ujs_seob.onLinkMoreLessData()',
        'ujs_seob.refreshBackwardLinksInfo()');
        
      link += btnLink;
      return link;
    },
    
    getDirectories : function()
    {
      var dirTh = ujs_seob.getTh(ujs_seob.bMoreDirectories);      
      var dir = '<table>';
      
      var dirData = new Array();
      dirData[0] = (new Array('DMOZ', 6, ujs_seob.dirDmoz, ujs_seob.dmozFrame));
      dirData[1] = (new Array('Yahoo!', 7, ujs_seob.dirYahoo, ujs_seob.yahooDirFrame));
      dirData[2] = (new Array('Yandex', 8, ujs_seob.dirYandex, ujs_seob.yaCaFrame));
      dirData[3] = (new Array('Rambler', 9, ujs_seob.dirRambler, ujs_seob.raTop100Frame));
      
      for(var i = 0; i < dirData.length; i++)
      {
        var val = ujs_seob.formatData(dirData[i][2],
          ujs_seob.opRepresentation[dirData[i][1]][0], dirTh);
        if(val)
        {
          dir += '<tr><td class="hdr">' + dirData[i][0] + '<br />';
          dir += '<a href="' + dirData[i][3].getUrl() + '">link</a></td><td>';
          dir += val + '</td></tr>';
        }
      }
      
      dir += '</table>';

      var btnDir = ujs_seob.getSecButtons(ujs_seob.isDirMoreLessBtnRequired(),
        ujs_seob.bMoreDirectories, 'ujs_seob.onDirMoreLessData()',
        'ujs_seob.refreshDirectoriesInfo()');              
        
      dir += btnDir;
      return dir;
    },
    
    highlightElements : function()
    {
      var styleId = 'SEObar_highlight_style';
      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.noindexStyle + ujs_seob.highlightStyle + '} ';
        css += 'noindex * ' + child + ' ';
      }
      
      if(ujs_seob.highlightNofollow)
      {
        css += '*[rel*="nofollow"] {' + ujs_seob.nofollowStyle + ujs_seob.highlightStyle + '} ';        
        css += ext + '[rel*="nofollow"] {' + ujs_seob.nofollowStyle + ujs_seob.highlightStyle + '} ';
        css += '*[rel*="nofollow"] * ' + child + ' ';
        css += ext + '[rel*="nofollow"] * ' + child + ' ';
      }
      
      if(ujs_seob.highlightExternalLinks)
      {        
        css += ext + ' {' + ujs_seob.externalLinkStyle + ujs_seob.highlightStyle + '}';
        css += ext + ' * ' + child;
      }
      
      var style = document.getElementById(styleId);
      if(style)
      {
        style.innerText = css;
      }
      else
      {
        var s = document.createElement('style');
        s.setAttribute('id', styleId);
        s.setAttribute('type', 'text/css');
  			s.setAttribute('style', 'display:none !important;');			
  			s.appendChild(document.createTextNode(css));
        document.documentElement.appendChild(s);
      }
      
      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.anchorAttributeName, false) != ujs_seob.anchorAttributeValue &&
          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 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 = new Array(
        new Array(0, 'Total&nbsp;Links'),
        new Array(0, 'Internal'),
        new Array(0, 'Subdomain'),
        new Array(0, 'External'),
        new Array(0, 'Text'),
        new Array(0, 'Image'),
        new Array(0, 'Nofollow')
      );
      
      var ext = new Array(
        new Array(0, 'Text'),
        new Array(0, 'Image'),
        new Array(0, 'Nofollow')
      );
      
      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.anchorAttributeName, false) == ujs_seob.anchorAttributeValue)        
          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
          }
        }
      }      
            
      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 = 'Loading, please wait.';
      ujs_seob.setPanelData();
      ujs_seob.requestHeaders(true);
    },
    
    requestHeaders : function(bCheckStatusText)
    {      
      var bCheck = bCheckStatusText;
      var xmlhttp = new XMLHttpRequest();      
      xmlhttp.open("GET", window.location.href, true);
      //xmlhttp.setRequestHeader("User-Agent", navigator.userAgent);            
      xmlhttp.setRequestHeader("Content-Type", "text/html");
      //xmlhttp.setRequestHeader("Connection", "Keep-Alive");
      xmlhttp.onreadystatechange = function() {
        if(this.readyState == 4)
        { 
          if(bCheck && this.statusText != undefined && !this.statusText)
          {            
            ujs_seob.requestHeaders(false);
            return;
          }
          
          ujs_seob.httpHeaders = 'Status: ' +  this.status;
          if(this.statusText)
            ujs_seob.httpHeaders += ' ' + this.statusText;
            
          ujs_seob.httpHeaders += '<br /><br /><table>';
            
          var a = this.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();
        }
      };
      xmlhttp.send();
    },
    
    getSeobarInfo : function()
    {
      var mail = ujs_seob.versionAuthorEmail + '?subject=SEObar ' + ujs_seob.versionString;
      mail = 'mailto:' + escape(mail);
      mail = '<a href="' + mail + '">' + ujs_seob.versionAuthorEmail + '</a>';

      var homepage = '<a href="javascript:void(0);" ';
      homepage += 'onMouseUp="javascript:var wnd=window.open(\'' + ujs_seob.versionHomepage + '\');">';
      homepage += ujs_seob.versionHomepage + '</a>';
      var info = '<table>';
      info += '<tr><td class="hdr">Version</td><td>' + ujs_seob.versionString + '</td></tr>';
      info += '<tr><td class="hdr">Date</td><td>' + ujs_seob.versionDate + '</td></tr>';
      info += '<tr><td class="hdr">Author</td><td>' + ujs_seob.versionAuthor + '</td></tr>';
      info += '<tr><td class="hdr">E-Mail</td><td>' + mail + '</td></tr>';
      info += '<tr><td class="hdr">Homepage</td><td>' + homepage + '</td></tr>';
      var discussion = '', sep = '';;
      for(var i = 0; i < ujs_seob.versionDiscussion.length; i++)
      {
        var d = '';
        if(ujs_seob.versionDiscussion[i].length == 3)
        {
          d += ujs_seob.versionDiscussion[i][0] + ': ';
          d += '<a href="' + ujs_seob.versionDiscussion[i][1] + '">';
          d += ujs_seob.versionDiscussion[i][2] + '</a>';
        }
        if(d)
        {
          discussion += sep + d;
          sep = '<br />';
        }
      }
      if(discussion)
        info += '<tr><td class="hdr">Discussion</td><td>' + discussion + '</td></tr>';
      
      
      info += '</table><br />';
      info += '<input type="button" value="Check for Updates" onMouseUp="ujs_seob.getUpdateInfo()" />';
      
      return info;
    },
    
    getSeobarVersion : function(bAttachScript)
    {
      var id = 'SEObar_version_script';
      var url = 'http://www.puzzleclub.ru/files/seobar/seobar_version.js';
      if(!document.getElementById(id))
      {    
        var s = document.createElement('script');
        s.setAttribute('id', id);
        s.setAttribute('type', 'text/javascript');
        s.setAttribute('src', url);
        s.setAttribute('style', 'display:none !important;');
        document.documentElement.appendChild(s);
      }
      
      ujs_seob.seobarUpdateInfo = '<br /><br />';

      if(SEObar_last_version >  ujs_seob.version)
      {
        ujs_seob.seobarUpdateInfo += '<b>Update available</b><br />';
        ujs_seob.seobarUpdateInfo += 'Version: ' + SEObar_last_version.toString() + '<br />';
        ujs_seob.seobarUpdateInfo += 'Date: ' + SEObar_last_version_date + '<br />';
        ujs_seob.seobarUpdateInfo += 'Size: ' + SEObar_last_version_size + '<br />';
        ujs_seob.seobarUpdateInfo += '<a href="' +SEObar_last_version_url + '">Download</a>';
        if(SEObar_last_version_info && SEObar_last_version_info.length > 0)
        {
          ujs_seob.seobarUpdateInfo += '<br /><br /><b>Information about this update:</b>';
          ujs_seob.seobarUpdateInfo += '<br />' + SEObar_last_version_info;
        }
      }
      else
      {
        ujs_seob.seobarUpdateInfo += 'There are no new updates available.';
        if(SEObar_information && SEObar_information.length > 0)
          ujs_seob.seobarUpdateInfo += '<br /><br />' + SEObar_information;
      }
      
      ujs_seob.setPanelData();
    },
    
    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)
    {
      var curCookie = name + "=" + escape(value) +
      ((expires) ? "; expires=" + expires.toGMTString() : "") +      
      ((domain) ? "; domain=" + domain : "");      
	
      if ((name + "=" + escape(value)).length <= 4000)
        document.cookie = curCookie;
    },
    
    
    getCookie : function(name)
    {
      var prefix = name + "=";
      var cookieStartIndex = document.cookie.indexOf(prefix);
      if (cookieStartIndex == -1)
        return null;
		
      var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
      if (cookieEndIndex == -1)
        cookieEndIndex = document.cookie.length;
		
      var len = prefix.length;	
		
      return unescape(document.cookie.substring(cookieStartIndex + len, cookieEndIndex));
    },

    deleteCookie : function(name, domain)
    { 
      if(getCookie(name))
      {
        document.cookie = name + "=" +        
        ((domain) ? "; domain=" + domain : "") +
        "; expires=Thu, 01-Jan-70 00:00:01 GMT";
      }
    }
  };
  
  (function(){
  
    if(!window.opera)
      return;

    ujs_seob.initFrameData();
      
    var bFrame = false;
    try
    {
      if(window.parent != window)
      {
        bFrame = true;
      }
    }
    catch(e)
    {
      bFrame = true;
    }
    
    var prevent = function(e) {
      e.preventDefault();
    };    
    
    if(!bFrame)
    {
      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))
            return;         

        if(ujs_seob.alexaFrame.processMessage(e))
          return;
        if(ujs_seob.googleFrame.processMessage(e))
          return;
        if(ujs_seob.yandexFrame.processMessage(e))
          return;
        
        // Directories
        if(ujs_seob.dmozFrame.processMessage(e))
          return;
        if(ujs_seob.yahooDirFrame.processMessage(e))
          return;
        if(ujs_seob.yaCaFrame.processMessage(e))
          return;
        if(ujs_seob.raTop100Frame.processMessage(e))
          return;
          
        // Backward Links  
        if(ujs_seob.googleLinkFrame.processMessage(e))
          return;
        if(ujs_seob.yahooUrlLinkFrame.processMessage(e))
          return;
        if(ujs_seob.yahooDomainLinkFrame.processMessage(e))
          return;
        if(ujs_seob.msnUrlLinkFrame.processMessage(e))
          return;  
        if(ujs_seob.msnDomainLinkFrame.processMessage(e))
          return;  
        if(ujs_seob.yandexLinkFrame.processMessage(e))
          return;  
          
        // Indexed Pages
        if(ujs_seob.googleIndexFrame.processMessage(e))
          return;
        if(ujs_seob.yahooIndexFrame.processMessage(e))
          return;  
        if(ujs_seob.msnIndexFrame.processMessage(e))
          return;
        if(ujs_seob.yandexIndexFrame.processMessage(e))
          return;
        if(ujs_seob.ramblerIndexFrame.processMessage(e))
          return;  
          
        // SEObar update information
        if(ujs_seob.seobarUpdateFrame.processMessage(e))
          return;
      };    
    
      // main document
      document.addEventListener('load', function(e) {    
        if(!ujs_seob.bPanel && !ujs_seob.bStatusbar)
        {
          return;
        }

        // storage
        ujs_seob.storage.domain = ujs_seob.fakeDomain;
        ujs_seob.storage.getDataFunction = ujs_seob.getDataFromStorage;
        
        var onload = 'setTimeout(\'ujs_seob.storage.loadData("' + ujs_seob.preferencesCookie + '", ';
        onload += '"' + ujs_seob.preferencesCookie +'")\', ujs_seob.requestDelay)';
        ujs_seob.storage.createFrame(ujs_seob.sFrameId, onload);
      }, false);
      
      document.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);
      
      document.addEventListener('message', function(e){
        if(ujs_seob.storage.processMessage(e))
          return;
      }, 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;
      
      var fo = ujs_seob.getFrameObjects();
      if(fo && fo.length > 0)
      {
        for(var i in fo)
        {
          if(fo[i].frameToken == id)
          {
            frameObj = fo[i];
            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)
      {
        var s = document.createElement('style');
        s.setAttribute('type', 'text/css');
        s.setAttribute('style', 'display:none !important;');
        s.appendChild(document.createTextNode(frameObj.style));
        document.documentElement.appendChild(s);
      }

      if(typeof(opera.version) == 'function' && opera.version() >= 9)
      {
        window.opera.addEventListener('BeforeEventListener.load', prevent, false);
        window.opera.addEventListener('BeforeEventListener.DOMContentLoaded', function(e) {
          e.preventDefault();
          
          if(bLoaded)
            return;

          bLoaded = true;
          frameObj.getData(id);
        }, false);
        
        window.addEventListener('DOMContentLoaded', function(){var a = 0;}, false);
      }
      else
      {
        window.opera.addEventListener('BeforeEventListener.load', function(e) {
          e.preventDefault();
          
          if(bLoaded)
            return;
            
          bLoaded = true;
          frameObj.getData(id);
          clearInterval(interval);
        }, false) ;
      
        var count = 0, interval = 0;        
        var onLoad = function() {
          
          if(frameObj.IsObjectLoaded())
          {
            frameObj.getData(id);
            clearInterval(interval);
            return;
          }

          count++;        
          if(count == 40)
          {
            clearInterval(interval);
          }
        };
  		
        interval = setInterval(onLoad, 250);
        
        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.deleteFrame = true;
  this.style = '';
  this.msg = '_frame_data';
  
  this.dataSeparator = '\n';
  this.msgSeparator = '\n';
  
  this.getUrl = function()
  {
    if(this.checkUrl)
      return this.checkUrl;
      
    return this.url;
  };
  
  this.createFrame = function() 
  {
    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();
    
    var msg = this.msgPrefix + this.msg + this.msgSeparator + msgId;
    if(data)      
    {
      data = encodeURIComponent(data);
    }
    msg += this.msgSeparator + data;
    window.parent.document.postMessage(msg);
  };
  
  this.processMessage = function(e)
  {
    if(e.data && (e.data.indexOf(this.msgPrefix) == 0))
    {
      if(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((e.domain == this.domain) && (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;
  };
}



/////////////////////////////////////////////////
// UserJS Storage (http://www.puzzleclub.ru/files/ujs_storage.zip)

function ujs_Storage(prefix, domain, getDataFunction)
{
  // Prefix used for recognition of the messages.
  this.msgPrefix = prefix;
  // Domain used for storing data in the cookies.
  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)
    {
      var d = f.contentDocument;
      if(d)      
      {
        d.postMessage(msg);
      }
    }
  };
  
  this.saveData = function(data, cookie)
  {
    if(!cookie)
    {
      alert('UserJS Storage: Incorrect call to the [saveData] function. [cookie] 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 += cookie + this.msgSeparator + encodeURIComponent(data);
    this.sendMessageToFrame(msg);
  };
  
  this.loadData = function(cookie, msgId)
  { 
    if(!cookie)
    {
      alert('UserJS Storage: Incorrect call to the [loadData] function. [cookie] 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 += cookie + this.msgSeparator + msgId;
    this.sendMessageToFrame(msg);
  };
  
  this.deleteData = function(cookie)
  {
    if(!cookie)
    {
      alert('UserJS Storage: Incorrect call to the [deleteData] function. [cookie] 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 += cookie;    
    this.sendMessageToFrame(msg);
  };
  
  this.processMessage = function(e)
  {
    if(e.data && (e.data.indexOf(this.msgPrefix) == 0))
    {    
      var d = e.data.split(this.msgSeparator);
      
      if(e.domain == this.domain)
      {
        // 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;
      }    
      else if(d[0])
      {
        // process message to frame
        if(d[0] == this.msgPrefix + this.msgSave)
        {
          // save
          var cookie = '', data = '';
          if(d[1])
            cookie = d[1];
          else
            return true;
            
          if(d[2])
            data = d[2];
            
          expdate = new Date("November 22, 2025 00:00:00");
          this.setCookie(cookie, data, expdate);
          
          return true;
        }
        else if(d[0] == this.msgPrefix + this.msgLoad)
        {
          // load
          var cookie = '', id = '';
          if(d[1])
            cookie = d[1];
          else
            return true;
            
          if(d[2])
            id = d[2];
            
          var msg = this.msgPrefix + this.msgLoad + this.msgSeparator + id;            
          var data = this.getCookie(cookie);
          if(data)        
            msg += this.msgSeparator + data;
            
          e.source.postMessage(msg);
          
          return true;
        }
        else if(d[0] == this.msgPrefix + this.msgDelete)
        {
          if(d[1])        
            this.deleteCookie(d[1]);
            
          return true;  
        }
      }    
    }
    
    return false;
  };
  
  this.setCookie = function(name, value, expires)
  {
    var curCookie = name + "=" + escape(value) +
    ((expires) ? "; expires=" + expires.toGMTString() : "");

    if ((name + "=" + escape(value)).length <= 4000)
      document.cookie = curCookie;
  }
  
  this.getCookie = function(name)
  {
    var prefix = name + "=";
    var cookieStartIndex = document.cookie.indexOf(prefix);
    if (cookieStartIndex == -1)
      return null;
  
    var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
    if (cookieEndIndex == -1)
      cookieEndIndex = document.cookie.length;
      
    var len = prefix.length;	
    
    return unescape(document.cookie.substring(cookieStartIndex + len, cookieEndIndex));
  };
  
  this.deleteCookie = function (name)
  {
    if (this.getCookie(name))
    {
      document.cookie = name + "=" +
      "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
  };
}