(function(){
	var is_vml = document.all && !(navigator.userAgent.indexOf("Opera") >= 0);
	if (is_vml) {
		document.namespaces.add("v", "urn:schemas-microsoft-com:vml");
		document.createStyleSheet().addRule("v\\:*", "behavior:url(#default#VML); position:absolute;");
	};

	var roundImage = {
		draw: function(img, x, y, arc) {
			var command = is_vml ? this.vml : this.canvas;
			command(img, x, y, arc);
		},
		vml: function(img, x, y, arc) {
			var empty_div = document.createElement("div");
			var markup = [
				'<v:roundrect style="width:'+ x +'px;height:'+ y +'px;" arcsize="'+ arc +'">',
					'<v:stroke opacity="0" />',
					'<v:fill type="frame" src="'+ img.src +'" />',
				'</v:roundrect>'
			].join("");

			empty_div.innerHTML = markup;
			img.parentNode.insertBefore(empty_div.childNodes[0], img);
			img.style.visibility = "hidden";
		},
		canvas: function(img, x, y, arc) {
			var canvas = document.createElement("canvas");
			if (!canvas || !canvas.getContext) return;

			canvas.width = x;
			canvas.height = y;

			var ctx = canvas.getContext('2d');
			var arcSize = parseInt(Math.min(x, y) * arc);
			var canvasPattern;

			ctx.beginPath();
			ctx.moveTo(0,y/2);
			ctx.lineTo(0,arcSize);
			ctx.quadraticCurveTo(0,0,arcSize,0);
			ctx.lineTo(x-arcSize,0);
			ctx.quadraticCurveTo(x,0,x,arcSize);
			ctx.lineTo(x,y-arcSize);
			ctx.quadraticCurveTo(x,y,x-arcSize,y);
			ctx.lineTo(arcSize,y);
			ctx.quadraticCurveTo(0,y,0,y-arcSize);
			ctx.lineTo(0,y/2);

			canvasPattern = ctx.createPattern(img, "no-repeat");
			ctx.fillStyle = canvasPattern;
			ctx.fill();
			ctx.restore();

			img.parentNode.insertBefore(canvas, img);
			img.parentNode.removeChild(img);
		}
	};

	window.RoundedImage = function(img, arc) {
		if (!img || !img.src) throw "RoundedImage: needs image element for first argument.";
		if (!arc || arc < 0 || arc > 1) throw "RoundedImage: invalid arc";
		var x = parseInt(img.width);
		var y = parseInt(img.height);
		if (!x || !y) throw "RoundedImage: image not available!";

		roundImage.draw(img, x, y, arc);
	};
})();


