FancifiedGalleries

By Shane O Sullivan Last update Oct 5, 2009 — Installed 108 times.

There are 1 previous version of this script.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name           FancifiedGalleries
// @namespace      http://chofter.com/apps
// @description    Easily turns a simple HTML based slideshows into a far cooler Ajax-ified dynamic galleries.  This makes it much quicker and simpler to look through numerous images, without having to go through many HTML pages.
// @include        http://*
// ==/UserScript==

/* 
  Include the Acme CSS selector library (http://dojotoolkit.org) to find anchor tags on the page amazingly fast
*/
(function(){acme={trim:function(g){g=g.replace(/^\s+/,"");for(var f=g.length-1;f>=0;f--){if(/\S/.test(g.charAt(f))){g=g.substring(0,f+1);break}}return g},forEach:function(f,k,h){if(!f||!f.length){return}for(var j=0,g=f.length;j<g;++j){k.call(h||window,f[j],j,f)}},byId:function(g,f){if(typeof g=="string"){return(f||document).getElementById(g)}else{return g}},isString:function(f){return(typeof f=="string")},doc:document,NodeList:Array};var e=navigator;var a=e.userAgent;var d=e.appVersion;var c=parseFloat(d);acme.isOpera=(a.indexOf("Opera")>=0)?c:undefined;acme.isKhtml=(d.indexOf("Konqueror")>=0)?c:undefined;acme.isWebKit=parseFloat(a.split("WebKit/")[1])||undefined;acme.isChrome=parseFloat(a.split("Chrome/")[1])||undefined;var b=Math.max(d.indexOf("WebKit"),d.indexOf("Safari"),0);if(b&&!acme.isChrome){acme.isSafari=parseFloat(d.split("Version/")[1]);if(!acme.isSafari||parseFloat(d.substr(b+7))<=419.3){acme.isSafari=2}}if(document.all&&!acme.isOpera){acme.isIE=parseFloat(d.split("MSIE ")[1])||undefined}Array._wrap=function(f){return f}})();(function(Y){var a=Y.trim;var U=Y.forEach;var M=Y._queryListCtor=Y.NodeList;var p=Y.isString;var Z=function(){return Y.doc};var V=(Y.isWebKit&&((Z().compatMode)=="BackCompat"));var J=!!Z().firstChild.children?"children":"childNodes";var R=">~+";var W=false;var G=function(){return true};var m=function(ah){if(R.indexOf(ah.slice(-1))>=0){ah+=" * "}else{ah+=" "}var ab=function(az,aA){return a(ah.slice(az,aA))};var am=[];var ai=-1,af=-1,ap=-1,ay=-1,d=-1,ae=-1,ao=-1,au="",at="",ag;var an=0,ac=ah.length,ad=null,ax=null;var al=function(){if(ao>=0){var az=(ao==an)?null:ab(ao,an);ad[(R.indexOf(az)<0)?"tag":"oper"]=az;ao=-1}};var aw=function(){if(ae>=0){ad.id=ab(ae,an).replace(/\\/g,"");ae=-1}};var ak=function(){if(d>=0){ad.classes.push(ab(d+1,an).replace(/\\/g,""));d=-1}};var aq=function(){aw();al();ak()};var ar=function(){aq();if(ay>=0){ad.pseudos.push({name:ab(ay+1,an)})}ad.loops=(ad.pseudos.length||ad.attrs.length||ad.classes.length);ad.oquery=ad.query=ab(ag,an);ad.otag=ad.tag=(ad.oper)?null:(ad.tag||"*");if(ad.tag){ad.tag=ad.tag.toUpperCase()}if(am.length&&(am[am.length-1].oper)){ad.infixOper=am.pop();ad.query=ad.infixOper.query+" "+ad.query}am.push(ad);ad=null};for(;au=at,at=ah.charAt(an),an<ac;an++){if(au=="\\"){continue}if(!ad){ag=an;ad={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){return(W)?this.otag:this.tag}};ao=an}if(ai>=0){if(at=="]"){if(!ax.attr){ax.attr=ab(ai+1,an)}else{ax.matchFor=ab((ap||ai+1),an)}var av=ax.matchFor;if(av){if((av.charAt(0)=='"')||(av.charAt(0)=="'")){ax.matchFor=av.slice(1,-1)}}ad.attrs.push(ax);ax=null;ai=ap=-1}else{if(at=="="){var aj=("|~^$*".indexOf(au)>=0)?au:"";ax.type=aj+at;ax.attr=ab(ai+1,an-aj.length);ap=an+1}}}else{if(af>=0){if(at==")"){if(ay>=0){ax.value=ab(af+1,an)}ay=af=-1}}else{if(at=="#"){aq();ae=an+1}else{if(at=="."){aq();d=an}else{if(at==":"){aq();ay=an}else{if(at=="["){aq();ai=an;ax={}}else{if(at=="("){if(ay>=0){ax={name:ab(ay+1,an),value:null};ad.pseudos.push(ax)}af=an}else{if((at==" ")&&(au!=at)){ar()}}}}}}}}}return am};var E=function(ab,d){if(!ab){return d}if(!d){return ab}return function(){return ab.apply(window,arguments)&&d.apply(window,arguments)}};var k=function(ab,d){var ac=d||[];if(ab){ac.push(ab)}return ac};var P=function(d){return(1==d.nodeType)};var s="";var t=function(ab,d){if(!ab){return s}if(d=="class"){return ab.className||s}if(d=="for"){return ab.htmlFor||s}if(d=="style"){return ab.style.cssText||s}return(W?ab.getAttribute(d):ab.getAttribute(d,2))||s};var n={"*=":function(d,ab){return function(ac){return(t(ac,d).indexOf(ab)>=0)}},"^=":function(d,ab){return function(ac){return(t(ac,d).indexOf(ab)==0)}},"$=":function(d,ac){var ab=" "+ac;return function(ae){var ad=" "+t(ae,d);return(ad.lastIndexOf(ac)==(ad.length-ac.length))}},"~=":function(d,ac){var ab=" "+ac+" ";return function(ae){var ad=" "+t(ae,d)+" ";return(ad.indexOf(ab)>=0)}},"|=":function(d,ac){var ab=" "+ac+"-";return function(ae){var ad=" "+t(ae,d);return((ad==ac)||(ad.indexOf(ab)==0))}},"=":function(d,ab){return function(ac){return(t(ac,d)==ab)}}};var f=(typeof Z().firstChild.nextElementSibling=="undefined");var X=!f?"nextElementSibling":"nextSibling";var q=!f?"previousElementSibling":"previousSibling";var e=(f?P:G);var l=function(d){while(d=d[q]){if(e(d)){return false}}return true};var B=function(d){while(d=d[X]){if(e(d)){return false}}return true};var x=function(af){var ac=af.parentNode;var ae=0,ag=ac[J],ad=(af._i||-1),ab=(ac._l||-1);if(!ag){return -1}var d=ag.length;if(ab==d&&ad>=0&&ab>=0){return ad}ac._l=d;ad=-1;for(var ah=ac.firstElementChild||ac.firstChild;ah;ah=ah[X]){if(e(ah)){ah._i=++ae;if(af===ah){ad=ae}}}return ad};var r=function(d){return !((x(d))%2)};var N=function(d){return((x(d))%2)};var aa={checked:function(d,ab){return function(ac){return !!Y.attr(ac,"checked")}},"first-child":function(){return l},"last-child":function(){return B},"only-child":function(d,ab){return function(ac){if(!l(ac)){return false}if(!B(ac)){return false}return true}},empty:function(d,ab){return function(af){var ag=af.childNodes;var ad=af.childNodes.length;for(var ac=ad-1;ac>=0;ac--){var ae=ag[ac].nodeType;if((ae===1)||(ae==3)){return false}}return true}},contains:function(d,ac){var ab=ac.charAt(0);if(ab=='"'||ab=="'"){ac=ac.slice(1,-1)}return function(ad){return(ad.innerHTML.indexOf(ac)>=0)}},not:function(d,ae){var ac=m(ae)[0];var ad={el:1};if(ac.tag!="*"){ad.tag=1}if(!ac.classes.length){ad.classes=1}var ab=H(ac,ad);return function(af){return(!ab(af))}},"nth-child":function(ab,ae){var ag=parseInt;if(ae=="odd"){return N}else{if(ae=="even"){return r}}if(ae.indexOf("n")!=-1){var ai=ae.split("n",2);var ac=ai[0]?((ai[0]=="-")?-1:ag(ai[0])):1;var ah=ai[1]?ag(ai[1]):0;var ad=0,d=-1;if(ac>0){if(ah<0){ah=(ah%ac)&&(ac+(ah%ac))}else{if(ah>0){if(ah>=ac){ad=ah-ah%ac}ah=ah%ac}}}else{if(ac<0){ac*=-1;if(ah>0){d=ah;ah=ah%ac}}}if(ac>0){return function(ak){var aj=x(ak);return(aj>=ad)&&(d<0||aj<=d)&&((aj%ac)==ah)}}else{ae=ah}}var af=ag(ae);return function(aj){return(x(aj)==af)}}};var T=(Y.isIE)?function(d){var ab=d.toLowerCase();if(ab=="class"){d="className"}return function(ac){return(W?ac.getAttribute(d):ac[d]||ac[ab])}}:function(d){return function(ab){return(ab&&ab.getAttribute&&ab.hasAttribute(d))}};var H=function(ab,ac){if(!ab){return G}ac=ac||{};var d=null;if(!("el" in ac)){d=E(d,P)}if(!("tag" in ac)){if(ab.tag!="*"){d=E(d,function(ad){return(ad&&(ad.tagName==ab.getTag()))})}}if(!("classes" in ac)){U(ab.classes,function(af,ae,ad){var ag=new RegExp("(?:^|\\s)"+af+"(?:\\s|$)");d=E(d,function(ah){return ag.test(ah.className)});d.count=ae})}if(!("pseudos" in ac)){U(ab.pseudos,function(ae){var ad=ae.name;if(aa[ad]){d=E(d,aa[ad](ad,ae.value))}})}if(!("attrs" in ac)){U(ab.attrs,function(ad){var af;var ae=ad.attr;if(ad.type&&n[ad.type]){af=n[ad.type](ae,ad.matchFor)}else{if(ae.length){af=T(ae)}}if(af){d=E(d,af)}})}if(!("id" in ac)){if(ab.id){d=E(d,function(ad){return(!!ad&&(ad.id==ab.id))})}}if(!d){if(!("default" in ac)){d=G}}return d};var i=function(d){return function(ad,ab,ac){while(ad=ad[X]){if(f&&(!P(ad))){continue}if((!ac||C(ad,ac))&&d(ad)){ab.push(ad)}break}return ab}};var L=function(d){return function(ab,ac,ad){var ae=ab[X];while(ae){if(e(ae)){if(ad&&!C(ae,ad)){break}if(d(ae)){ac.push(ae)}}ae=ae[X]}return ac}};var o=function(d){d=d||G;return function(ac,ad,ae){var ag,ab=0,af=ac[J];while(ag=af[ab++]){if(e(ag)&&(!ae||C(ag,ae))&&(d(ag,ab))){ad.push(ag)}}return ad}};var D=function(ac,d){var ab=ac.parentNode;while(ab){if(ab==d){break}ab=ab.parentNode}return !!ab};var v={};var F=function(ai){var ad=v[ai.query];if(ad){return ad}var ag=ai.infixOper;var ab=(ag?ag.oper:"");var af=H(ai,{el:1});var ah=ai.tag;var ac=("*"==ah);var ae=Z()["getElementsByClassName"];if(!ab){if(ai.id){af=(!ai.loops&&ac)?G:H(ai,{el:1,id:1});ad=function(al,ak){var am=Y.byId(ai.id,(al.ownerDocument||al));if(!am||!af(am)){return}if(9==al.nodeType){return k(am,ak)}else{if(D(am,al)){return k(am,ak)}}}}else{if(ae&&/\{\s*\[native code\]\s*\}/.test(String(ae))&&ai.classes.length&&!V){af=H(ai,{el:1,classes:1,id:1});var d=ai.classes.join(" ");ad=function(am,al){var an=k(0,al),ap,ak=0;var ao=am.getElementsByClassName(d);while((ap=ao[ak++])){if(af(ap,am)){an.push(ap)}}return an}}else{if(!ac&&!ai.loops){ad=function(am,al){var an=k(0,al),ap,ak=0;var ao=am.getElementsByTagName(ai.getTag());while((ap=ao[ak++])){an.push(ap)}return an}}else{af=H(ai,{el:1,tag:1,id:1});ad=function(am,al){var an=k(0,al),ap,ak=0;var ao=am.getElementsByTagName(ai.getTag());while((ap=ao[ak++])){if(af(ap,am)){an.push(ap)}}return an}}}}}else{var aj={el:1};if(ac){aj.tag=1}af=H(ai,aj);if("+"==ab){ad=i(af)}else{if("~"==ab){ad=L(af)}else{if(">"==ab){ad=o(af)}}}}return v[ai.query]=ad};var O=function(af,ak){var ad=k(af),ai,ag,ab,aj=ak.length,d,ae;for(var ac=0;ac<aj;ac++){ae=[];ai=ak[ac];ag=ad.length-1;if(ag>0){d={};ae.nozip=true}var ah=F(ai);while(ab=ad[ag--]){ah(ab,ae,d)}if(!ae.length){break}ad=ae}return ae};var S={},h={};var u=function(ab){var d=m(a(ab));if(d.length==1){var ac=F(d[0]);return function(ad){var ae=ac(ad,new M());if(ae){ae.nozip=true}return ae}}return function(ad){return O(ad,d)}};var c=navigator.userAgent;var b="WebKit/";var A=(Y.isWebKit&&(c.indexOf(b)>0)&&(parseFloat(c.split(b)[1])>528));var K=Y.isIE?"commentStrip":"nozip";var w="querySelectorAll";var j=(!!Z()[w]&&(!Y.isSafari||(Y.isSafari>3.1)||A));var I=function(ae,ai){if(j){var d=h[ae];if(d&&!ai){return d}}var ag=S[ae];if(ag){return ag}var ah=ae.charAt(0);var ad=(-1==ae.indexOf(" "));if((ae.indexOf("#")>=0)&&(ad)){ai=true}var ac=(j&&(!ai)&&(R.indexOf(ah)==-1)&&(!Y.isIE||(ae.indexOf(":")==-1))&&(!(V&&(ae.indexOf(".")>=0)))&&(ae.indexOf(":contains")==-1)&&(ae.indexOf("|=")==-1));if(ac){var af=(R.indexOf(ae.charAt(ae.length-1))>=0)?(ae+" *"):ae;return h[ae]=function(aj){try{if(!((9==aj.nodeType)||ad)){throw""}var ak=aj[w](af);ak[K]=true;return ak}catch(al){return I(ae,true)(aj)}}}else{var ab=ae.split(/\s*,\s*/);return S[ae]=((ab.length<2)?u(ae):function(aj){var al=0,ak=[],am;while((am=ab[al++])){ak=ak.concat(u(am)(aj))}return ak})}};var g=0;var Q=Y.isIE?function(d){if(W){return(d.getAttribute("_uid")||d.setAttribute("_uid",++g)||g)}else{return d.uniqueID}}:function(d){return(d._uid||(d._uid=++g))};var C=function(ab,d){if(!d){return 1}var ac=Q(ab);if(!d[ac]){return d[ac]=1}return 0};var z="_zipIdx";var y=function(ab){if(ab&&ab.nozip){return(M._wrap)?M._wrap(ab):ab}var ac=new M();if(!ab||!ab.length){return ac}if(ab[0]){ac.push(ab[0])}if(ab.length<2){return ac}g++;if(Y.isIE&&W){var ad=g+"";ab[0].setAttribute(z,ad);for(var d=1,af;af=ab[d];d++){if(ab[d].getAttribute(z)!=ad){ac.push(af)}af.setAttribute(z,ad)}}else{if(Y.isIE&&ab.commentStrip){try{for(var d=1,af;af=ab[d];d++){if(P(af)){ac.push(af)}}}catch(ae){}}else{if(ab[0]){ab[0][z]=g}for(var d=1,af;af=ab[d];d++){if(ab[d][z]!=g){ac.push(af)}af[z]=g}}}return ac};Y.query=function(ad,ab){M=Y._queryListCtor;if(!ad){return new M()}if(ad.constructor==M){return ad}if(!p(ad)){return new M(ad)}if(p(ab)){ab=Y.byId(ab);if(!ab){return new M()}}ab=ab||Z();var d=ab.ownerDocument||ab.documentElement;W=(ab.contentType&&ab.contentType=="application/xml")||(Y.isOpera&&(ab.doctype||d.toString()=="[object XMLDocument]"))||(!!d)&&(Y.isIE?d.xml:(ab.xmlVersion||d.xmlVersion));var ac=I(ad)(ab);if(ac&&ac.nozip&&!M._wrap){return ac}return y(ac)};Y.query.pseudos=aa;Y._filterQueryResult=function(ab,ac){var ae=new Y._queryListCtor();var ad=H(m(ac)[0]);for(var d=0,af;af=ab[d];d++){if(ad(af)){ae.push(af)}}return ae}})(this["queryPortability"]||this["acme"]||dojo);

function find(q, n) {
  return acme.query(q, n || unsafeWindow.document);
}

var dojoPath = "http://o.aolcdn.com/dojo/1.3";
var icon, timer, highlightedImg;
var destImg, clickHandlerAdded, tempPageContainer;

var linkNodes = [];
var storedNodes = {};

var cache = {};

var head = document.body.previousSibling;

while (head && head.tagName != "HEAD") {
  head = head.previousSibling;
}

function log(){
  if (!unsafeWindow.console){return;}

  if (arguments.length == 5) {
      unsafeWindow.console.log(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
  } else if (arguments.length == 4) {
      unsafeWindow.console.log(arguments[0], arguments[1], arguments[2], arguments[3]);
  } else if (arguments.length == 3) {
      unsafeWindow.console.log(arguments[0], arguments[1], arguments[2]);
  } else if (arguments.length == 2) {
      unsafeWindow.console.log(arguments[0], arguments[1]);
  } else if (arguments.length == 1) {
    unsafeWindow.console.log(arguments[0]);
  } else {
    unsafeWindow.console.log(arguments[0], arguments[1]);
  }
}


function appendScript(href, domNode) {
  var script = document.createElement("script");
  
  if (href) {  
    script.setAttribute("src", href);
  }
  script.setAttribute("type", "text/javascript");
  (domNode || head).appendChild(script);
}


doConnect(unsafeWindow.document.body, "mouseover", function(event) {
  var t = event.target;
  
  if (t == destImg || (t.tagName == "IMG" && t.width > 150 && t.height > 150)) {
    showIcon(t);
  }
  
});

function unplaceImage(img) {
  img.width += 4;
  img.height += 4;
  img.style.borderWidth = "0px";
  img._isPlaced = false;
}

function setImgAttr(img, attr, val) {
  img[attr] = val + "px";
  img.setAttribute(attr, val + "px");
}

function fixImgSize(img, w1, w2, h1, h2){
  var min = 200;
  var w = img.width || img.getAttribute("width");
  var h = img.height || img.getAttribute("height");
      
  log("Got width ", w, " height ", h);
  setImgAttr(img, "width" , w || w1 || w2);
    
  setImgAttr(img, "height", h || h1 || h2);
  if (img.height < min) {
   setImgAttr(img, "height" , Math.max(min, w1));
  }
  if(img.width < min) {
   setImgAttr(img, "width" , Math.max(min, h1));
  }
  
  log("Final width " + img.width, " height " + img.height, "h1 = " + h1);
}

function placeImage(img) {
  if (img._isPlaced) {
    return;
  }
  
  var w1 = destImg.width, w2 = destImg.offsetWidth;
  var h1 = destImg.height, h2 = destImg.offsetHeight;
  fixImgSize(img, w1, w2, h1, h2);
  
  
  doConnect(img, "load", function(){
    fixImgSize(img, w1, w2, h1, h2);
  });
  

  img.width -= 4;
  img.height -= 4;
  img.style.border = "2px solid red";
  img._isPlaced = true;
  
  if (img == destImg) {
    return;
  }
  
  destImg.parentNode.replaceChild(img, destImg);
  unplaceImage(destImg);
  destImg = img;
}


// Icon Code

function addElementsToPage(){
  if (icon){
    return;
  }
  var img = icon = document.createElement("img");
  img.setAttribute("src", "http://www.chofter.com/apps/DaftMonkey/enlarge.png");
  img.style.position = "absolute";
  img.style.left = "-1000px";
  img.style.zIndex = 1000;
  img.style.cursor = "pointer";
  unsafeWindow.document.body.appendChild(img);
  
  doConnect(img, "click", function(evt){
    if (destImg) {
      unplaceImage(destImg);

      for (var i = 0; i < linkNodes.length; i++) {
        linkNodes[i].style.display = "";
        linkNodes[i].href = linkNodes[i]._origHref;
      }
      
      destImg = null;
    } else {
  
      destImg = highlightedImg;
      placeImage(destImg);
      imgQuery = buildPath(destImg).query;
      initClickHandler();
    }
  }, true);
  
}

function initClickHandler() {
  if (clickHandlerAdded) {
    return;
  }
  clickHandlerAdded =  true;
  doConnect(document.body, "click", function(evt){
    if (!destImg) {
      return true;
    }
    var t = evt.target;
    if (t.tagName == "IMG" && t.parentNode.tagName == "A") {
      evt.preventDefault();
      evt.stopPropagation();
      doLoadImg(t);
    } else if (t.tagName == "A" && 
    	(t.innerHTML.toLowerCase().indexOf("next") > -1 ||
    	 t.innerHTML.toLowerCase().indexOf("prev") > -1
    	)) {
      evt.preventDefault();
      evt.stopPropagation();
      doLoadAnchor(t);
    }
  });
}

function buildPath(node) {
  
  var q = "";
  var origNode = node;
  while (node != document.body) {
    
    var token = node.tagName;
    
    if (node.id) {
      token += "[id='" + node.id + "']";
    } else if (node.className && node.className.length > 0) {
      token += "." + node.className.split(" ")[0];
    }
    
    q = token + " " + q;
    
    node = node.parentNode;
  }
  
  var nodes = find(q);
  var i;
  for (i = 0; i < nodes.length; i++) {
    if (nodes[i] == origNode) {
      break;
    }
  }
  
  return {
  	query: q,
  	index: i
  	};
  
  //imgQuery = q;
}

function doLoadImg(img) {
  
  if (img.alt && img.alt.toLowerCase().indexOf("next") || img.alt.toLowerCase().indexOf("prev")) {
    doLoadAnchor(img.parentNode);
    return;
  }
  
  var url = img.parentNode.href;
  
  if (cache[url]) {
    placeImage(cache[url]);
  } else {

    GM_xmlhttpRequest({
      url : url,
      method: "GET",
      onload: function(data){
        var html = data.responseText;
       
        var imgNode = getNodesFromHtml(html, imgQuery)[0];
        
        if (!imgNode) {
          imgNode = findLargestImg();
        }
      
        if (imgNode) {
          cache[url] = imgNode;
          placeImage(imgNode);
        }
      },
      onerror: function(){
        alert("failed to load image");
      }
    });
  }
}

function doLoadAnchor(anchorTag) {

  var url = anchorTag.href;
  var nodePath = buildPath(anchorTag);
  
  initAnchor(anchorTag);
  
  if (cache[url]) {
    placeImage(cache[url]);
  } else {
    GM_xmlhttpRequest({
      url : url,
      method: "GET",
      onload: function(data){
        var html = data.responseText;
       
        var imgNode = getNodesFromHtml(html, imgQuery)[0];
        
        if (!imgNode) {
          imgNode = findLargestImg();
        }
      
        if (imgNode) {
          cache[url] = imgNode;
          placeImage(imgNode);
        }
        
        // Find the corresponding node.
        var anchorNodes = getNodesFromHtml(null, nodePath.query);
        
        for (var i = 0; i < anchorNodes.length; i++) {
          if (anchorNodes[i].innerHTML == anchorTag.innerHTML) {
            log("setting href", anchorNodes[i].href);
            setHref(anchorTag, anchorNodes[i].href);
            return;
          }
        }

        setHref(anchorTag, "");
        anchorTag.style.display = "none";        
      },
      onerror: function(){
        alert("failed to load image");
      }
    });
  }
}

function initAnchor(anchorTag) {
  if (storedNodes[anchorTag.innerHTML]) {
    return;
  }
  storedNodes[anchorTag.innerHTML] = true;
  linkNodes.push(anchorTag);
  anchorTag._origHref = anchorTag.href;
}

function setHref(anchorTag, href) {
  initAnchor(anchorTag);
  anchorTag.href = href;
}

function findLargestImg() {
  var images = getNodesFromHtml(null, "img");
  
  var max = 0;
  var node;
  
  if (!images) {
    return null;
  }
  
  for (var i = 0; i < images.length; i++) {
    var img = images[i];
    var size = img.width * img.height;
    
    if (size > max) {
      node = img;
      max = size;
    }
  }
  return node;
  
  
}

function showIcon(img) {
  if (!icon) {
    addElementsToPage();
  }
  clearTimer();
  var pos = abspos(img, true);

  icon.style.left = (pos.x - 4) + "px";
  icon.style.top = (pos.y -  4) + "px";
  highlightedImg = img;
  
  hideIcon(true);
}

function hideIcon(useTimer) {
  if (!icon) {
    return;
  }
  var fn = function(){
    icon.style.left = "-1000px";
  };
  if (useTimer) {
    timer = setTimeout(fn, 3000);
  } else {
    fn();
  }
}

// Event code

function doConnect(node, event, fn) {
  event = normalizeEventName(event);
  node.addEventListener(event, fixCallback(event, fn), false);
}

function fixCallback(name, fp){
  return name != "keypress" ? fp : function(e){ return fp.call(this, del._fixEvent(e, this)); };
}

function normalizeEventName(name){
  return name.slice(0,2) =="on" ? name.slice(2) : name;
}

// Add the event listener to the body element.



function clearTimer(){
  if (timer) {
    clearTimeout(timer);
    timer = null;
  }
}


// Positioning code


function docScroll (){
  var 
    _w = unsafeWindow,
    _b = _w.document.body,
    de = _w.document.documentElement;
  return {
    y: (_w.pageYOffset || de.scrollTop || _b.scrollTop || 0),
    x: (_w.pageXOffset || de.scrollLeft || _b.scrollLeft || 0)
 };
};

function gcs(node){
  return node instanceof HTMLElement ? 
    node.ownerDocument.defaultView.getComputedStyle(node, null) : {};
};

function px(element, value){
  // style values can be floats, client code may want
  // to round for integer pixels.
  return parseFloat(value) || 0; 
};

function abspos (node, includeScroll){
  //  summary:
  //    Gets the position of the passed element relative to
  //    the viewport (if includeScroll==false), or relative to the
  //    document root (if includeScroll==true).
  //
  //    Returns an object of the form:
  //      { x: 100, y: 300 }
  //    if includeScroll is passed, the x and y values will include any
  //    document offsets that may affect the position relative to the
  //    viewport.

  // targetBoxType == "border-box"
  var db = unsafeWindow.document.body, dh = db.parentNode, ret;
  
  // FF3+, super-modern WebKit, and Opera 9.6+ all take this branch
  var client = node.getBoundingClientRect();
  ret = { x: client.left, y: client.top };

  // in FF3 you have to subtract the document element margins
  var cs = gcs(dh);
  ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth);
  ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth);
    
  
  // account for document scrolling
  // if offsetParent is used, ret value already includes scroll position
  // so we may have to actually remove that value if !includeScroll
  if(includeScroll){
    var scroll = docScroll();
    ret.x += scroll.x;
    ret.y += scroll.y;
  }

  return ret; // Object
}

// Dynamic page loading code.

function getBodyContent(html) {
  var bodyIdx = html.indexOf(">", html.indexOf("<body"));
  var endBodyIdx = html.indexOf("</body");

  var body = html.substring(bodyIdx + 1, endBodyIdx);

  return body;
}

function stripIframe(body, returnFrame) {
  var scriptIdx = body.indexOf("<iframe");
  var endScriptIdx;
    
  var iframe;
    
  if(scriptIdx > -1) {
    endScriptIdx = body.indexOf("</iframe", scriptIdx);
    
    if (endScriptIdx < 0) {
      endScriptIdx = body.indexOf("/>", scriptIdx);
    }
    endScriptIdx = body.indexOf(">", endScriptIdx) + 1;

    iframe = body.substring(scriptIdx, endScriptIdx);
    body = body.substring(0, scriptIdx) + body.substring(endScriptIdx);
    
  }

  return returnFrame ? iframe : body;
}

function stripScripts(html) {
  
  var idx = html.indexOf("<script");
  var endIdx;
  
  while (idx > -1) {
    endIdx = html.indexOf("</script", idx);
    
    html = html.substring(0, idx) + html.substring(html.indexOf(">", endIdx + 1));
    idx = html.indexOf("<script");
  }
  return html;
}

function getNodesFromHtml(html, query, initialQuery, initialIndex) {
  initTempPageContainer();
  if (html) {
    var text = getBodyContent(html);
    text = stripScripts(html);
    tempPageContainer.innerHTML = stripIframe(text);
  }  
  var context = tempPageContainer;
  
  if (initialQuery) {
    context = find(initialQuery, tempPageContainer)[initialIndex || 0];
  }
  
  return find(query, context);
}

function initTempPageContainer() {
  if (tempPageContainer) {
    return;
  }
  
  var tpc = tempPageContainer = document.createElement("div");
  tpc.id = "tempPageContainer";
  document.body.appendChild(tpc);
  
  tpc.style.position = "absolute";
  tpc.style.left = "-10000px";
  tpc.style.top = "-10000px";
  tpc.style.width = "1px";
  tpc.style.height = "1px";
  tpc.style.visibility = "hidden";
}