/**
* Cornerz 0.6 - Bullet Proof Corners
* Jonah Fox (jonah@parkerfox.co.uk) 2008
* 
* Usage: $('.myclass').curve(options)
* options is a hash with the following parameters. Bracketed is the default
*   radius (10)
*   borderWidth (read from BorderTopWidth or 0)
*   background ("white"). Note that this is not calculated from the HTML as it is expensive
*   borderColor (read from BorderTopColor)
*   corners ("tl br tr bl"). Specify which borders
*   fixIE ("padding") - attmepts to fix IE by incrementing the property by 1 if the outer width/height is odd.

CHANGELIST from  v0.4

0.5 - Now attempts to fix the odd dimension problem in IE 
0.6 - Added semicolons for packing and fixed a problem with odd border width's in IE

*/
	
;(function($){

  if($.browser.msie && document.namespaces["v"] == null) {
	document.namespaces.add("v", "urn:schemas-microsoft-com:vml");
	var ss = document.createStyleSheet().owningElement;
	ss.styleSheet.cssText = "v\\:*{behavior:url(#default#VML);}"
  }

  $.fn.cornerz = function(options){
	
	function canvasCorner(t,l, r,bw,bc,bg){
		var sa,ea,cw,sx,sy,x,y, p = 1.57, css="position:absolute;";
		if(t) 
			{sa=-p; sy=r; y=0; css+="top:-"+bw+"px;";  }
		else 
			{sa=p; sy=0; y=r; css+="bottom:-"+bw+"px;"; }
		if(l) 
			{ea=p*2; sx=r; x=0;	css+="left:-"+bw+"px;"}
		else 
			{ea=0; sx=0; x=r; css+="right:-"+bw+"px;";	}
		
		var canvas=$("<canvas width="+r+"px height="+ r +"px style='" + css+"' ></canvas>");
		var ctx=canvas[0].getContext('2d');
		ctx.beginPath();
		ctx.lineWidth=bw*2;	
		ctx.arc(sx,sy,r,sa,ea,!(t^l));
		ctx.strokeStyle=bc;
		ctx.stroke();
		ctx.lineWidth = 0;
		ctx.lineTo(x,y);
		ctx.fillStyle=bg;
		ctx.fill();
		return canvas;
	};

	function canvasCorners(corners, r, bw,bc,bg) {
		var hh = $("<div style='display: inherit' />"); // trying out style='float:left' 
		$.each(corners.split(" "), function() {
		  hh.append(canvasCorner(this[0]=="t",this[1]=="l", r,bw,bc,bg));
		});
		return hh;
	};

	function vmlCurve(r,b,c,m,ml,mt, right_fix) {
		var l = m-ml-right_fix;
		var t = m-mt;
		return "<v:arc filled='False' strokeweight='"+b+"px' strokecolor='"+c+"' startangle='0' endangle='361' style=' top:" + t +"px;left: "+ l + ";width:" + r+ "px; height:" + r+ "px' />";
	}
	

	function vmlCorners(corners, r, bw, bc, bg, w) {
	  var h ="<div style='text-align:left; '>";
	  $.each($.trim(corners).split(" "), function() {
		var css,ml=1,mt=1,right_fix=0;
		if(this.charAt(0)=="t") {
		  css="top:-"+bw+"px;";
		}
		else {
		  css= "bottom:-"+bw+"px;";
		  mt=r+1;
		}
		if(this.charAt(1)=="l")
		  css+="left:-"+bw+"px;";
		else {
		  css +="right:-"+(bw)+"px; "; // odd width gives wrong margin?
		   ml=r;
		   right_fix = 1;
		}

		h+="<div style='"+css+"; position: absolute; overflow:hidden; width:"+ r +"px; height: " + r + "px;'>";
		h+= "<v:group  style='width:1000px;height:1000px;position:absolute;' coordsize='1000,1000' >";
		h+= vmlCurve(r*3,r+bw,bg, -r/2,ml,mt,right_fix); 
		if(bw>0)
		  h+= vmlCurve(r*2-bw,bw,bc, Math.floor(bw/2+0.5),ml,mt,right_fix);
		h+="</v:group>";
		h+= "</div>"; 
	  });
	  h += "</div>";
	  
	  return h;
	};

	var settings = {
	  corners : "tl tr bl br",
	  radius : 10,
	  background: "white",
	  borderWidth: 0,
	  fixIE: true };              
	$.extend(settings, options || {});
	
	var incrementProperty = function(elem, prop, x) {
	  var y = parseInt(elem.css(prop)) || 0 ;
	  elem.css(prop, x+y);
	}
	
	
	return this.each(function() {
	  
	  var $$ = $(this);
	  var r = settings.radius*1.0;
	  var bw = (settings.borderWidth || parseInt($$.css("borderTopWidth")) || 0)*1.0;
	  var bg = settings.background;
	  var bc = settings.borderColor;
	  bc = bc || ( bw > 0 ? $$.css("borderTopColor") : bg);
			
	  var cs = settings.corners;

	  if($.browser.msie) {//need to use innerHTML rather than jQuery
		h = vmlCorners(cs,r,bw,bc,bg, $(this).width() );     
		this.innerHTML += h;
		
	  }
	  else  //canvasCorners returns a DOM element
		$$.append(canvasCorners(cs,r,bw,bc,bg));
	  
	  
	  if(this.style.position != "absolute")
		this.style.position = "relative";
	 
	   this.style.zoom = 1; // give it a layout in IE
	  
	   if($.browser.msie && settings.fixIE) {
		  var ow = $$.outerWidth();
		  var oh = $$.outerHeight();
		  
		  if(ow%2 == 1) {
			incrementProperty($$, "padding-right", 1);
			incrementProperty($$, "margin-right", 1);
		  }

		  if(oh%2 == 1) { 
			incrementProperty($$, "padding-bottom", 1);
			incrementProperty($$, "margin-bottom", 1);
		  }
		}
		  
	  }
	  
	);
 
  }
})(jQuery);



