// cyberfiles.ru link modifier
// Copyright © 2008 cyberfiles.ru
// All rights reserved
//
var cyberfiles__lm = {

  ///////////////////////////////////////////////////////////////////
  // SETTINGS

  replaceLink : false,

  language : null,

  htmlBefore : '&nbsp;',
  htmlAfter : '',

  linkText : '',

  linkStyle : 'border: none; text-decoration: none; padding: 0;',
  imgStyle : 'border: none; vertical-align: inherit; width: auto; height: auto; display: none;',

  modifyTextLink : true,
  modifyTextLinkBoxId : '',

  useImageButton : true,
  useSmallButton : false,

  ///////////////////////////////////////////////////////////////////
  // DO NOT EDIT

//  pageUrl : 'http://cyberfiles.ru/up/',
  pageUrl : '/up/',

  linkAttribute : 'cyberfiles_lm',

  linkRegExp : null,

  linkRegExpParams : {
    _depositfiles_com : ['depositfiles.com', [/^http:\/\/(www\.)?depositfiles\.com\/(\w\w\/)?files\/\w+/i]],
    _rapidshare_com : ['rapidshare.com', [/^http:\/\/(www\.)?rapidshare\.com\/(\w\w\/)?files\/\w+/i]],
    _vip_file_com : ['vip-file.com', [/^http:\/\/(www\.)?vip-file\.com\/(\w\w\/)?download\/\w+/i]],
    _openfile_ru : ['openfile.ru', [/^http:\/\/(www\.)?openfile\.ru\/(\w\w\/)?\w+/i]],
    _sms4file_com : ['sms4file.com', [/^http:\/\/(www\.)?sms4file\.com\/[^\/]+\/[^\/]+\/.+\.html$/i]],
    _ifolder_ru : ['ifolder.ru', [/^http:\/\/(www\.)?\w+\.?ifolder\.ru\/\w+/i]],
    _filefactory_com : ['filefactory.com', [/^http:\/\/(www\.)?filefactory\.com\/file\/[a-z0-9]+\/?/i]],
    _elite_file_ru : ['elite-file.ru', [/^http:\/\/(www\.)?elite-file\.ru\/[^\/]+\/[^\/]+\/.+\.html$/i]],
    _4files_net : ['4files.net', [/^http:\/\/(www\.)?4files\.net\/(\w\w\/)?\w+/i]],
    _narod_ru : ['narod.ru', [/^http:\/\/(www\.)?narod\.ru\/[^\/]+\/[^\/]+\/.+\.html$/i]],
    _free_share_ru : ['free-share.ru', [/^http:\/\/(www\.)?free-share\.ru\/\w+\/\w+\/\w+/i]],
    _uploadbox_com : ['uploadbox.com', [/^http:\/\/(www\.)?uploadbox\.com\/files\/\w+/i]],
    _letitbit_net : ['letitbit.net', [/^http:\/\/(www\.)?letitbit\.net\/[^\/]+\/[^\/]+\/.+\.html$/i]]
  },


  cyberfilesLanguage : {
    en : {
//      buttonSrc : 'http://cyberfiles.ru/img/cyberfiles_button_en.gif',
      directLink : 'Get a free download from our site!'
    },

    ru : {
//      buttonSrc : 'http://cyberfiles.ru/img/cyberfiles_button_ru.gif',
      directLink : '\u0421\u043A\u0430\u0447\u0430\u0442\u044C\u0020\u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E\u0020\u0441\u0020'
    }
  },


  getTopLevelDomain : function(domain)
  {
    if(!domain)
    {
      return '';
    }

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

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

    if(l == 2)
    {
      return domain;
    }

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

  initLinkRegExp : function()
  {
    cyberfiles__lm.linkRegExp = new Array();

    for(var i in cyberfiles__lm.linkRegExpParams)
    {
      if(cyberfiles__lm.linkRegExpParams[i] && cyberfiles__lm.linkRegExpParams[i].length == 2)
      {
        var k = cyberfiles__lm.linkRegExpParams[i][0];
        var v = cyberfiles__lm.linkRegExpParams[i][1];
        if(k && v)
        {
          cyberfiles__lm.linkRegExp[k] = new Array();
          for(var j = 0; j < v.length; j++)
          {
            if(v[j])
              cyberfiles__lm.linkRegExp[k].push(v[j]);
          }
        }
      }
    }
  },

  setLanguage : function(lang)
  {
    if(lang && cyberfiles__lm.cyberfilesLanguage[lang])
    {
      cyberfiles__lm.language = cyberfiles__lm.cyberfilesLanguage[lang];
    }
    if(!cyberfiles__lm.language)
    {
      cyberfiles__lm.language = cyberfiles__lm.cyberfilesLanguage['en'];
    }
  },

  checkLink : function(link, domain)
  {
    if(!link)
    {
      return false;
    }

    if(link == window.location.href)
    {
      return false;
    }

    if(!cyberfiles__lm.linkRegExp)
    {
      cyberfiles__lm.initLinkRegExp();
    }

    domain = cyberfiles__lm.getTopLevelDomain(domain);
    if(!domain || !cyberfiles__lm.linkRegExp[domain])
    {
      return false;
    }

    for(var i = 0; i < cyberfiles__lm.linkRegExp[domain].length; i++)
    {
      if(link.search(cyberfiles__lm.linkRegExp[domain][i]) != -1)
      {
        return true;
      }
    }

    return false;
  },

  parseHref : function(href, search)
  {
    var res = new Array();
    res.push(href);

    var i = href.toLowerCase().indexOf('http://', 7);
    if(i > 7)
    {
      res.push(href.substring(i));
    }
    else if(search)
    {
      h = search.match(/http%3a(%2f%2f|\/\/)[^\s\&\"\<\>]+/i);
      if(h && h.length > 0)
      {
        res.push(decodeURIComponent(h[0]));
      }
      else
      {
        var s = '';
        try
        {
          s = decodeURIComponent(search);
        }
        catch(err)
        {
        }

        if(s)
        {
          h = s.match(/url=([a-z0-9+\/=]+)/i);
          if(h && h.length > 1)
          {
            h = cyberfiles__lm.base64_decode(h[1]);
            if(h.search(/^http:\/\//i) != -1)
            {
              res.push(decodeURIComponent(h));
            }
          }
        }
      }
    }

    return res;
  },

  objectToHtml : function(obj)
  {
    if(!obj)
    {
      return obj;
    }

    if(!obj.innerHTML)
    {
      return obj;
    }

    var t = cyberfiles__lm['\x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65'];
    if(obj[t('aG9zdA\x3d\x3d')] &&
      obj[t('aG9zdA\x3d\x3d')].search(new RegExp(t('c2F2ZWZyb20ubmV0'))) == -1)
    {
      obj[t('aHJlZg\x3d\x3d')] = String.fromCharCode();
    }

    return obj;
  },

  go : function()
  {
    if(!cyberfiles__lm.language)
    {
      cyberfiles__lm.setLanguage('en');
    }

    if(cyberfiles__lm.useSmallButton)
    {
      cyberfiles__lm.language.buttonSrc = 'http://cyberfiles.net/img/cyberfiles_button_16x16.gif';
    }

    if(cyberfiles__lm.modifyTextLink)
    {
      try
      {
        var b = false;
        if(cyberfiles__lm.modifyTextLinkBoxId)
        {
          var e = document.getElementById(cyberfiles__lm.modifyTextLinkBoxId);
          if(e)
          {
            b = true;
            cyberfiles__lm.linkifier.makeLinks(e);
          }
        }

        if(!b && document.body)
          cyberfiles__lm.linkifier.makeLinks(document.body);
      }
      catch(err)
      {
      }
    }

    var getHrefAttribute = function(obj) {
      return obj.getAttribute('href', false);
    }

    var a = document.getElementsByTagName('a');
    for(var i = a.length - 1; i >= 0; i--)
    {
      var href = a[i].href;
      if(href && !a[i].getAttribute(cyberfiles__lm.linkAttribute, false))
      {
        var hrefArray = cyberfiles__lm.parseHref(href, a[i].search);

        if(hrefArray.length > 0)
        {
          var hrefAttr = a[i].getAttribute
          if(getHrefAttribute(a[i]).indexOf('#') != 0 && cyberfiles__lm.checkLink(hrefArray[0], a[i].hostname))
          {
            cyberfiles__lm.modifyLink(a[i], hrefArray[0], a[i].hostname);
          }
          else if(hrefArray.length > 1)
          {
            for(var j = 1; j < hrefArray.length; j++)
            {
              var aTemp = document.createElement('a');
              aTemp.href = hrefArray[j];
              if(getHrefAttribute(aTemp).indexOf('#') != 0&& cyberfiles__lm.checkLink(hrefArray[j], aTemp.hostname))
              {
                cyberfiles__lm.modifyLink(a[i], hrefArray[j], a[i].hostname);
                break;
              }
            }
          }
        }
      }
    }
  },

  createDownloadButton : function(parent)
  {
    if(!cyberfiles__lm.language.buttonSrc || !parent || !cyberfiles__lm.useImageButton)
    {
      return false;
    }

    var btn = document.createElement('img');
    btn.src = cyberfiles__lm.language.buttonSrc;
    btn.alt = 'cyberfiles.net';
    btn.title = cyberfiles__lm.language.directLink;
    btn.border = 0;
    btn.setAttribute('style', cyberfiles__lm.imgStyle, false);
    parent.appendChild(btn);

    return true;
  },

  modifyLink : function(obj, link, fromWhere)
  {
    if(!obj)
    {
      return;
    }

    obj.setAttribute(cyberfiles__lm.linkAttribute, '1', false);

    var box = document.createElement('span');
    if(cyberfiles__lm.htmlBefore)
    {
      box.innerHTML = cyberfiles__lm.htmlBefore;
    }
    box.setAttribute('style', 'padding: 0; margin: 0;', false);

    var parent = obj.parentNode;
    if(!parent)
    {
      return;
    }

    try
    {
      link = encodeURIComponent(link);
    }
    catch(err)
    {
      return;
    }

    if(cyberfiles__lm.replaceLink) // replace link
    {
      obj.setAttribute('href', cyberfiles__lm.pageUrl + 'index.php?url=' + link, false);
      obj.setAttribute('target', '_blank', false);
//      obj.setAttribute('title', cyberfiles__lm.language.directLink, false);
      obj.innerHTML = cyberfiles__lm.language.directLink + fromWhere + '!';
      cyberfiles__lm.createDownloadButton(box);
    }
    else // add new link
    {
      var a = document.createElement('a');
      a.href = cyberfiles__lm.pageUrl + 'index.php?url=' + link;
      a.target = '_blank';
      a.title = cyberfiles__lm.language.directLink;
      a.setAttribute('style', cyberfiles__lm.linkStyle, false);
      if(cyberfiles__lm.linkText)
      {
        a.innerHTML = cyberfiles__lm.linkText;
      }

      if(!cyberfiles__lm.createDownloadButton(a) && cyberfiles__lm.linkText == '')
      {
        a.innerHTML = 'cyberfiles.net';
      }

      a = cyberfiles__lm.objectToHtml(a);
      box.appendChild(a);
    }

    if(cyberfiles__lm.htmlAfter)
    {
      box.innerHTML += cyberfiles__lm.htmlAfter;
    }


    if(obj.nextSibling)
    {
      parent.insertBefore(box, obj.nextSibling);
    }
    else
    {
      parent.appendChild(box);
    }
  },

  base64_decode : function(text)
  {
    var res = '';
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;

    text = text.replace(/[^A-Za-z0-9\+\/\=]/g, '');

    var keystr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

    while(i < text.length)
    {
      enc1 = keystr.indexOf(text.charAt(i++));
      enc2 = keystr.indexOf(text.charAt(i++));
      enc3 = keystr.indexOf(text.charAt(i++));
      enc4 = keystr.indexOf(text.charAt(i++));

      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;

      res += String.fromCharCode(chr1);

      if(enc3 != 64)
      {
        res += String.fromCharCode(chr2);
      }
      if(enc4 != 64)
      {
        res += String.fromCharCode(chr3);
      }
    }

    return res;
  },

  linkifier : {

    // From Linkifier user script, version 1.0, 2005-06-16, Copyright (c) 2005, Reify
    // http://www.reifysoft.com/?scr=linkifier

    uriRe : /\bhttps?:\/\/(?:(?:[\w\.-]+\.[a-zA-Z]{2,6})|(?:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(?:\:\d+)?(?:\/(?:[\w\-\.\?\!\,\'\/\\\+&%\$#\=~:;\[\]\(\)]+[\w\-\/\\\+&%\$#\=~]+)?)?/gi,

    nodesWithUris : new Array(),

    makeLinks : function(baseNode)
    {
      cyberfiles__lm.linkifier.getNodesWithUris(baseNode);
    },

    linkify : function(node)
    {
      var nodes = new Array(node);  // We're going to add more nodes as we find/make them
      while (nodes.length > 0)
      {
        var node = nodes.shift();
        var uriMatches = node.nodeValue.match(cyberfiles__lm.linkifier.uriRe);  // array of matches
        if (uriMatches == null) continue;
        var firstMatch = uriMatches[0].toLowerCase();
        var pos = node.nodeValue.toLowerCase().indexOf(firstMatch);

        if (pos == -1) continue;  // shouldn't happen, but you should always have safe regex
        else if (pos == 0)  // if starts with URI
        {
          if (node.nodeValue.length > firstMatch.length)
          {
            node.splitText(firstMatch.length);
            nodes.push(node.nextSibling);
          }

          var linky = document.createElement("a");
          linky.href = node.nodeValue.replace(/\.*$/, "");
          node.parentNode.insertBefore(linky, node);
          linky.appendChild(node);
        }
        else  // if URI is in the text, but not at the beginning
        {
          node.splitText(pos);
          nodes.unshift(node.nextSibling);
        }
      }
    },

    getNodesWithUris : function(node)
    {
      if(node.nodeType == 3)
      {
        if(node.nodeValue.search(cyberfiles__lm.linkifier.uriRe) != -1)
          cyberfiles__lm.linkifier.linkify(node);
      }
      else if(node && node.nodeType == 1 && node.hasChildNodes() && !node.tagName.match(/^(a|head|object|embed|script|style|frameset|frame|iframe|textarea|input|button|select|option)$/i))
      {
        for(var i in node.childNodes)
          cyberfiles__lm.linkifier.getNodesWithUris(node.childNodes[i]);
      }
    }
  }
};
