// ==UserScript==
// @name        Image Reloader for Opera 9.5
// @version     1.13
// @date        2008-06-15
// @author      Mike Samokhvalov <mikivanch@gmail.com>
// @idea        Vlad Pudovkin.com, Kildor (background images reloading)
// @description Image Reloader loads regular and background images in two ways:
//              1) Ctrl+left click on the image
//              2) Hover the cursor on the image, press and hold (one second by default)
//              mouse left button.
//
// @download    http://www.puzzleclub.ru/files/image_reloader_for_opera_9.5.js
// ==/UserScript==

(function(){

  ///////////////////////////////////////////////////////////////////
  // BEGIN OF SETTINGS
  
  // Reload images by holding the mouse left button
  var reloadByHoldingDownMouseButton = true;
  // Reload images using ctrl+left click
  var reloadByCtrlClick = true;
  
  // Delay: the number of milliseconds to hold the mouse button
  var delay = 750;
  
  // END OF SETTINGS
  ///////////////////////////////////////////////////////////////////
  
  var timerId = 0;
  
  if(reloadByHoldingDownMouseButton)
  {
    opera.addEventListener('BeforeEvent.mousedown', function(e){
      if(e.event.button == 0)
      {
        timerId = setTimeout(function(){reload(e.event, 1);}, delay);
      }
    }, false);
  }

  document.addEventListener('mouseup', function(e) {    
    clearTimeout(timerId);
    if(reloadByCtrlClick && e.button == 0 && e.ctrlKey && !e.shiftKey)
    {
      reload(e, 0);
    }
  }, false);
  
  var reload = function(e, mode)
  {    
    var removeObject = function(obj)
    {
      if(obj && obj.parentNode)
        obj.parentNode.removeChild(obj);
    };
    
    var checkImageCompleteness = function(src)
    {
      var img = new Image();
      img.src = src;
      if(img.complete)
        return true;
        
      return false;  
    };
  
    var refreshImg = function(img, display)
    {
      img.style.display = display;
    };
    
    var restoreImage = function(src)
    {      
      var tags = ['img', 'input'];
      for(var i = 0; i < tags.length; i++)
      {
        var objs = document.getElementsByTagName(tags[i]);
        
        for(var j = objs.length - 1; j >= 0; j--)
        {
          if(objs[j].src && objs[j].src == src && objs[j].currentStyle.display != 'none')
          {
            var display = objs[j].currentStyle.display;
            objs[j].style.display = 'none';
            setTimeout(refreshImg, 1, objs[j], display);
          }
        }
      }
    };
    
    var reloadImage = function(src, bBgImage)
    {
      if(checkImageCompleteness(src))
      return false;

    var f = document.createElement('iframe');
    f.src = src;
    f.width = 0;
    f.height = 0;
    f.frameBorder = 'no';
    f.scrolling = 'no';
    f.onload = function(){
      removeObject(this);      
      if(!bBgImage)
      {
        restoreImage(src);
      }
    };
    document.documentElement.appendChild(f);
    
    var f = function(){
      if(checkImageCompleteness(src))
      {
        if(!bBgImage)
        {
          restoreImage(src);
        }  
        removeObject(f);
      }
      else
        setTimeout(f, 100);
    };
    setTimeout(f, 100);
    setTimeout(removeObject, 60000, f);
    return true;
    };
    
    var reloadBackgroundImage = function(obj, bgImgStyle)
    {
      var bgi = bgImgStyle.replace(/^url\(\x22?\x27?|\x22?\x27?\)$/gi, '');
      reloadImage(bgi, true);
    }
    
    var preventAnchorClick = function(anchor)
    {    
      var html = anchor.outerHTML;
      anchor.innerHTML = '';
      anchor.outerHTML = html;
    };
    
    var obj = e.srcElement;    
    if(obj.tagName == 'IMG')
    {
      var parent = obj.parentNode;
      if(parent.tagName == 'A')
      {          
        reloadImage(obj.src, false);         
        preventAnchorClick(parent);
      }
      else
      {
        reloadImage(obj.src, false);
      }
    }
    else if(obj.tagName == 'INPUT' && obj.type.toLowerCase() == 'image')
    {
      reloadImage(obj.src);
      obj.outerHTML = obj.outerHTML;
    }
    else
    {
      if(mode == 1)
      {
        if(document.getSelection())
          return;
      }
    
      var bgi = obj.currentStyle.backgroundImage;
      if((obj.tagName != 'BODY') && (obj.tagName != 'HTML') && (!bgi || bgi == 'none'))
      {
        // check parent elements
        var parent = obj.parentNode;
        while(parent)
        {
          if(parent.tagName == 'HTML')
            return;

          bgi = parent.currentStyle.backgroundImage;
          if(bgi && bgi != 'none')
          {            
            reloadBackgroundImage(parent, bgi);            
            break;
          }
          
          if(parent.tagName == 'BODY')
            return;
            
          parent = parent.parentNode;
        }        
      }
      else
      {
        if(obj.tagName == 'A')
        {
          reloadBackgroundImage(obj, bgi);
          preventAnchorClick(obj);
        }
        else
        {
          reloadBackgroundImage(obj, bgi);
        }
      }
    }      
  };
})();