// JavaScript Document
/*
 * PrettyFloat 0.1.2
 * Copyright (c) 2008-2010 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/
 * MIT License [http://www.opensource.org/licenses/mit-license.php]
 */


(function() {

var extraSand = 16; 	// extra "buffer" pixels added to make sure the image isn't cut off at the end of the bags
var sandbagMargin = 16; // left/right margin on the bags
var resDiv = 16; 	// height of each sandbag div, adjust this to better fit the font size used. Should be a multiple of resCanvas (default = 1)

var resCanvas = 1; 	// downscale factor for the canvas. Bigger number = faster. Don't change unless necessary.


// find all img's with class sandbag-[left|right]
function checkImages() {
	var imgList = document.getElementsByTagName("img");
	var num = imgList.length
	var ptnLeft = new RegExp(["(^|\\s)sandbag-left(\\s|$)"]);
	var ptnRight = new RegExp(["(^|\\s)sandbag-right(\\s|$)"]);
	var imgArr = []
	for (var i=0;i<num;i++) {
		imgArr[i] = imgList[i];
	}
	for (var i=0;i<num;i++) {
		var img = imgArr[i];
		if (ptnLeft.test(img.className)) {
			orderSandbagImage(img, "left");
		} else if (ptnRight.test(img.className)) {
			orderSandbagImage(img, "right");
		}
	}
}

function addEvent(element, ev, handler) {
	if (element.addEventListener)
		element.addEventListener(ev, handler, false); 
	else if (element.attachEvent)
		element.attachEvent("on" + ev, handler); 
}

// sandbag an image
function orderSandbagImage(img, align) {
	if (img.complete) {
		sandbagImage(img, align);
	} else {
		addEvent(img, "load", 
			function() {
				sandbagImage(img, align);
			}
		);
	}
}

// degrade for non-canvas / non-ImageData browsers
function fallbackImage(img, align) {
	img.style.cssFloat = align;
	img.style.styleFloat = align;
}

function sandbagImage(img, align) {
	align = align || "left";

	var canvas = document.createElement("canvas");

	if (!(canvas.getContext && canvas.getContext("2d") && canvas.getContext("2d").getImageData)) {
		fallbackImage(img, align);
		return;
	}


	var ctx = canvas.getContext("2d");

	var iw = img.offsetWidth;
	var ih = img.offsetHeight;
	var parent = img.parentNode;

	// create a container element for our sandbag divs
	var span = document.createElement("span");
	parent.replaceChild(span, img);
	parent = span;

	// draw a downscaled version of the image to the canvas and retrieve the image data
	var w = Math.floor(iw / resCanvas);
	var h = Math.floor(ih / resCanvas);
	canvas.width = w;
	canvas.height = h;
	ctx.drawImage(img, 0, 0, w, h);
	var data = ctx.getImageData(0,0,w,h).data;

	var bags = [];

	var x,y;
	for (y=0;y<h;y++) {
		var yoff = y*w*4;
		var xstart = 0, xend = w;
		if (align == "right") {
			for (x=0;x<w;x++) {
				if (data[yoff + x*4 + 3] == 255) {
					xstart = x;
					break;
				}
				if (xstart == 0) xstart = w;
			}
		}
		if (align == "left") {
			for (x=w-1;x>0;x--) {
				if (data[yoff + x*4 + 3] == 255) {
					xend = x;
					break;
				}
			}
			if (xend == w) xend = 0;
		}
		bags.push([xstart, xend]);
	}

	var finalBags = [];
	var bagCount = Math.ceil(ih / resDiv);

	var jr = Math.ceil(resDiv / resCanvas);
	for (var i=0;i<bagCount;i++) {
		var w = 0;
		for (var j=0;j<jr;j++) {
			var bag = bags[i*jr+j];
			if (bag && (bag[1] - bag[0]) > w)
				w = bag[1] - bag[0];
		}

		var div = document.createElement("div");

		div.style.cssFloat = align;
		div.style.clear = align;

		div.style.width = w*resCanvas+extraSand + "px";
		div.style.height = resDiv + "px";
		div.style.margin = "";

		if (align == "left") {
			div.style.marginRight = sandbagMargin + "px";
		} else {
			div.style.marginLeft = sandbagMargin + "px";
		}
		div.style.border = 0; 
		div.style.padding = 0;
		div.style.fontSize = 0;
		div.style.lineHeight = 0;

		//div.style.border = "1px solid red";

		div.style.background = "url(" + img.src + ") no-repeat "
			+ (align == "right" ? -(iw-w*resCanvas-extraSand) : 0) + "px "
			+ -(i*resDiv) + "px";

		parent.appendChild(div);
	}
}

onContent(checkImages);

})();

// onContent load event handling by Andrea Giammarchi 
function onContent(f){ //(C)webreflection.blogspot.com
  var a=onContent,b=navigator.userAgent,d=document,w=window,c="onContent",e="addEventListener",o="opera",r="readyState",
  s="<scr".concat("ipt defer src='//:' on",r,"change='if(this.",r,"==\"complete\"){this.parentNode.removeChild(this);",c,".",c,"()}'></scr","ipt>");
  a[c]=(function(o){return function(){a[c]=function(){};for(a=arguments.callee;!a.done;a.done=1)f(o?o():o)}})(a[c]);
  if(d[e])d[e]("DOMContentLoaded",a[c],false);
  if(/WebKit|Khtml/i.test(b)||(w[o]&&parseInt(w[o].version())<9))(function(){/loaded|complete/.test(d[r])?a[c]():setTimeout(arguments.callee,1)})();
  else if(/MSIE/i.test(b))d.write(s);
};
