// SaveFrom.net link modifier
// Copyright © 2009-2010 SaveFrom.net
// All rights reserved
//

var savefrom__lm = {

  ///////////////////////////////////////////////////////////////////
  // SETTINGS
  
  parentId: '', 

  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;',
  
  anchorStyle: '',

  modifyTextLink: true,
  modifyTextLinkBoxId: '',

  useImageButton: true,
  useSmallButton: false,
  
  sfref: '',
  
  ///////////////////////////////////////////////////////////////////
  // DO NOT EDIT

  pageUrl: 'http://savefrom.net/',
  
  linkCount: 0,
  anchorAttribute: 'savefrom_lm',
  anchorIndexAttribute: 'savefrom_lm_index',

  linkRegExp: null,

  re: {
    filehosting: {
      'rapidshare.com': [/^http:\/\/([\w\-]+\.)?rapidshare\.com\/\#\!download\|\d+\|\d+\|[^\s\"\|]+\|\d+/i, /^http:\/\/(rs\d+\.|www\.)?rapidshare\.com\/files\/\d+\/.+/i],
      'filefactory.com': [/^http:\/\/(www\.)?filefactory\.com\/file\/[a-z0-9]+\/?/i],
      'sendspace.com': [/^http:\/\/(www\.)?sendspace\.com\/file\/\w+/i]
    },

    mediahosting: {
      'youtube.com': [/^http:\/\/([a-z]+\.)?youtube\.com\/watch\?.*v=/i],
      'google.com': [/^http:\/\/video\.google\.com\/videoplay\?.*docid=/i],
      'metacafe.com': [/^http:\/\/(www\.)?metacafe\.com\/watch\/\d+\/[^\/]+\/?/i],
      'break.com': [/^http:\/\/(www\.)?break\.com\/(index|movies\w*|(\w+\-)+\w+)\/.+\.html$/i, /^http:\/\/view\.break\.com\/\d+/i],
      'vimeo.com': [/^http:\/\/([\w\-]+\.)?vimeo\.com\/\d+$/i],
      'spike.com': [/^http:\/\/(www\.)spike\.com\/video\/([^\/]+\/)*\d+/i],
      'sevenload.com': [/^http:\/\/([\w\-]+\.)?sevenload\.com\/videos\/[\w\-\+\/=]+/i, /^http:\/\/([\w\-]+\.)?sevenload\.com\/shows\/.+/i],
      'rutube.ru': [/^http:\/\/rutube\.ru\/tracks\/\d+\.html\?.*v=[a-f0-9]+/i],
      'mail.ru': [/^http:\/\/([a-z0-9_-]+\.)?video\.mail\.ru\/(.+\/)+\d+\.html/i, /^http:\/\/r\.mail\.ru\/\w+\/video\.mail\.ru\/(.+\/)+\d+\.html/i],
      'yandex.ru': [/^http:\/\/video\.yandex\.ru\/users\/[\w\-,!\+]+\/view\/[\w\-,!\+]+\/?/i],
      'rambler.ru': [/^http:\/\/vision\.rambler\.ru\/users\/[^\/\s]+\/\d+\/[\w\-_\+!]+\/?/i],
      'smotri.com': [/^http:\/\/([a-z0-9_-]+\.)?smotri\.com\/video\/view\/\?.*id=v[0-9a-f]/i],
      'tvigle.ru': [/^http:\/\/(www\.)?tvigle\.ru\/channel\/\d+\?.*vid_id=\d+/i, /^http:\/\/(www\.)tvigle\.ru\/prg\/\d+\/\d+/i],
      'intv.ru': [/^http:\/\/(www\.)?intv\.ru\/(view|quickdl)\/\?.*film_id=\w+/i, /^http:\/\/(www\.)?intv\.ru\/v\/\w+/i],
      'yasee.ru': [/^http:\/\/([a-z0-9_-]+\.)?yasee\.ru\/video\/view\/\?.*id=v[0-9a-f]/i],
      'narod.tv': [/^http:\/\/(?:www\.)?narod\.tv\/\?.*vid=/i],
      'vkadre.ru': [/^http:\/\/(www\.)?vkadre\.ru\/videos\/\d+/i],
      'myvi.ru': [/^http:\/\/(www\.)?myvi\.ru\/([a-z][a-z]\/)?videodetail\.aspx\?.*video=/i],
      '1tv.ru': [/^http:\/\/(www\.)?1tv\.ru(\:\d+)?\/newsvideo\/\d+/i, /^http:\/\/(www\.)?1tv\.ru(\:\d+)?\/news\/\w+\d+/i],
      'ntv.ru': [/^http:\/\/news\.ntv\.ru\/(\w+\/)?\d+\/video\/?/i],
      'vesti.ru': [/^http:\/\/(www\.)?vesti\.ru\/videos\?.*vid=\d+/i],
      'bibigon.ru': [/^http:\/\/(www\.)?bibigon\.ru\/videow\.html\?id=\d+/i, /^http:\/\/(www\.)?bibigon\.ru\/video\.html\?vid=\d+/i],
      'mreporter.ru': [/^http:\/\/(www\.)?mreporter\.ru\/reportermessages\!viewreport\.do[^\?]*\?.*reportid=\d+/i],
      'autoplustv.ru': [/^http:\/\/(www\.)?autoplustv\.ru\/494\/\?id=\d+/i],
      'russia.ru': [/^http:\/\/([\w\-]+\.)?russia\.ru\/video\//i],
      'amik.ru': [/^http:\/\/(www\.)?amik\.ru\/video\/vid\d+\.html/i, /^http:\/\/(www\.)?amik\.ru\/video\/vcid\d+\.html/i],
      'life.ru': [/^http:\/\/([\w+\-]+\.)?life\.ru\/video\/\d+/i]
    }  
  },


  savefromLanguage: {
    en: {
      buttonSrc: 'http://savefrom.net/img/savefrom_button_en.gif',
      directLink: 'Get a direct link'
    },

    ru: {
      buttonSrc: 'http://savefrom.net/img/savefrom_button_ru.gif',
      directLink: '\u041f\u043e\u043b\u0443\u0447\u0438\u0020\u043f\u0440\u044f\u043c\u0443\u044e\u0020\u0441\u0441\u044b\u043b\u043a\u0443'
    }
  },


  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()
  {
    savefrom__lm.linkRegExp = {};

    for(var i in savefrom__lm.re.filehosting)
    {
      if(savefrom__lm.re.filehosting[i])
        savefrom__lm.linkRegExp[i] = savefrom__lm.re.filehosting[i];
    }  
    
    for(var i in savefrom__lm.re.mediahosting)
    {
      if(savefrom__lm.re.mediahosting[i])
        savefrom__lm.linkRegExp[i] = savefrom__lm.re.mediahosting[i];
    }  
  },

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

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

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

    if(!savefrom__lm.linkRegExp)
      savefrom__lm.initLinkRegExp();

    domain = savefrom__lm.getTopLevelDomain(domain);
    if(!domain || !savefrom__lm.linkRegExp[domain])
      return false;

    for(var i = 0; i < savefrom__lm.linkRegExp[domain].length; i++)
    {
      if(link.search(savefrom__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 = savefrom__lm.base64_decode(h[1]);
            if(h.search(/^http:\/\//i) != -1)
            {
              res.push(decodeURIComponent(h));
            }
          }
        }
      }
    }

    return res;
  },
  
  
  getStyle: function(node, property)
  {
    var s = undefined;
    if(node)
    {    
      try
      {
        if(node.currentStyle)
          s = node.currentStyle[property];
        else if(window.getComputedStyle)
          s = document.defaultView.getComputedStyle(node, null)[property];
      }
      catch(e){}
    }
    return s;
  },
  
  
  getNodeIndex: function(node)
  {
    var html = node.innerHTML;
    if(!html || html == ' ')
      return 1;

    var bg = savefrom__lm.getStyle(node, 'backgroundImage');
    if(bg && bg != 'none')
      return 1;

    var c = node.getElementsByTagName('*');
    for(var i = 0; i < c.length; i++)
    {
      if(c[i].tagName == 'IMG')
        return 2;
      else
      {
        bg = savefrom__lm.getStyle(c[i], 'backgroundImage');
        if(bg && bg != 'none')
          return 1;
      }
    }

    return 0;
  },

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

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

    var t = savefrom__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;
  },
  
  
  attr: function(node, attr)
  {
    return node.getAttribute(attr, false);
  },
  
  
  getHref: function(node)
  {
    var href = node.href;
    if(href && (href.search(/^https?:\/\/([\w\-]+\.)?savefrom\.net\//i) == -1))
    {
      var hrefArray = savefrom__lm.parseHref(href, node.search);

      if(hrefArray.length > 0)
      {
        if(savefrom__lm.attr(node, 'href').indexOf('#') != 0 && savefrom__lm.checkLink(hrefArray[0], node.hostname))
        {
          return hrefArray[0];
        }
        else if(hrefArray.length > 1)
        {
          for(var j = 1; j < hrefArray.length; j++)
          {
            var aTemp = document.createElement('a');
            aTemp.href = hrefArray[j];
            if(savefrom__lm.attr(aTemp, 'href').indexOf('#') != 0 && savefrom__lm.checkLink(hrefArray[j], aTemp.hostname))
            {
              return hrefArray[j];
            }
          }
        }
      }
    }
    
    return '';
  },

  
  go: function(force)
  {
    if(!savefrom__lm.language)
      savefrom__lm.setLanguage('en');

    if(savefrom__lm.useSmallButton)
      savefrom__lm.language.buttonSrc = 'http://savefrom.net/img/savefrom_button_16x16.gif';

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

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

    var a = null;
    if(savefrom__lm.parentId)
    {
      var parent = document.getElementById(savefrom__lm.parentId);
      if(parent)
        a = parent.getElementsByTagName('a');
      else
        a = document.getElementsByTagName('a');
    }
    else
      a = document.getElementsByTagName('a');
      

    if(a.length != savefrom__lm.linkCount || force)
    {
      savefrom__lm.linkCount = a.length;
      var found = {}, lastHref = '';
      
      for(var i = 0; i < a.length; i++)
      {
        var href = savefrom__lm.getHref(a[i]);
        if(href)
        {
          var index = 0;
          var attr = savefrom__lm.attr(a[i], savefrom__lm.anchorIndexAttribute);
          if(attr === 0 || attr)
            index = parseInt(attr);
          else
          {
            index = savefrom__lm.getNodeIndex(a[i]);
            a[i].setAttribute(savefrom__lm.anchorIndexAttribute, index, false);
          }

          if(found[href])
          {
            if(index < found[href].index)
            {
              found[href].elements = [a[i]];
              found[href].index = index;
              lastHref = href;
            }
            else if(index == found[href].index && href != lastHref)
            {
              found[href].elements.push(a[i]);
              lastHref = href;
            }
          }
          else
          {
            found[href] = {
              index: index,
              elements: [a[i]]
            };

            lastHref = href;
          }
        }
      }

      for(var i in found)
      {
        for(var j = 0; j < found[i].elements.length; j++)
        {
          var e = found[i].elements[j];
          if(!savefrom__lm.attr(e, savefrom__lm.anchorAttribute))
            savefrom__lm.modifyLink(e, i);
        }
      }
    }
  },
  

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

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

    return true;
  },
  

  modifyLink: function(node, link)
  {
    if(!node)
      return;

    node.setAttribute(savefrom__lm.anchorAttribute, '1', false);
    if(savefrom__lm.anchorStyle)
    {
      var style = savefrom__lm.anchorStyle.split(';');
      if(style && style.length > 0)
      {
        for(var i = 0; i < style.length; i++)
        {
          var s = style[i].split(':');
          if(s && s.length > 1)
          {
            if(s.length > 2)
            {
              for(var j = 2; j < s.length; j++)
                s[1] += ':' + s[j];
            }

            s[0] = s[0].replace(/^\s+/, '').replace(/\s+$/, '');
            s[0] = s[0].replace(/-(\w)/g, function(str, c){return c.toUpperCase();});
            s[1] = s[1].replace(/!important/ig, '').replace(/^\s+/, '').replace(/\s+$/, '');
            
            try{node.style[s[0]] = s[1];}catch(err){}
          }  
        }  
      }  
    } 
    

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

    var parent = node.parentNode;
    if(!parent)
      return;

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

    var href = savefrom__lm.pageUrl + '?url=' + link;
    if(savefrom__lm.sfref)
      href += '&_openstat=' + savefrom__lm.sfref;

    if(savefrom__lm.replaceLink) // replace link
    {      
      node.setAttribute('href', href, false);
      node.setAttribute('title', savefrom__lm.language.directLink, false);
      savefrom__lm.createDownloadButton(box);
    }
    else // add new link
    {
      var a = document.createElement('a');
      a.href = href;
      a.target = '_blank';
      a.title = savefrom__lm.language.directLink;
      a.setAttribute('style', savefrom__lm.linkStyle, false);
      a.setAttribute(savefrom__lm.anchorAttribute, '1', false);
      if(savefrom__lm.linkText)
      {
        a.innerHTML = savefrom__lm.linkText;
      }

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

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

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


    if(node.nextSibling)
    {
      parent.insertBefore(box, node.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)
    {
      savefrom__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(savefrom__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(savefrom__lm.linkifier.uriRe) != -1)
          savefrom__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)
          savefrom__lm.linkifier.getNodesWithUris(node.childNodes[i]);
      }
    }
  }
};

