// Contributors: 
// Ilkka Huotari at http://www.editsite.net
// Mathieu 'p01' HENRI at http://www.p01.org/
// http://seky.nahory.net/2005/04/rounded-corners/
// Steven Wittens at http://www.acko.net/anti-aliased-nifty-corners
// Original Nifty Corners by Alessandro Fulciniti at http://pro.html.it/esempio/nifty/

//

var CSSALICEBLUE  =  "#F0F8FF"   
var CSSANTIQUEWHITE  =  "#FAEBD7"   
var CSSAQUA  =  "#00FFFF"   
var CSSAQUAMARINE  =  "#7FFFD4"   
var CSSAZURE  =  "#F0FFFF"   
var CSSBEIGE  =  "#F5F5DC"   
var CSSBISQUE  =  "#FFE4C4"   
var CSSBLACK  =  "#000000"   
var CSSBLANCHEDALMOND  =  "#FFEBCD"   
var CSSBLUE  =  "#0000FF"   
var CSSBLUEVIOLET  =  "#8A2BE2"   
var CSSBROWN  =  "#A52A2A"   
var CSSBURLYWOOD  =  "#DEB887"   
var CSSCADETBLUE  =  "#5F9EA0"   
var CSSCHARTREUSE  =  "#7FFF00"   
var CSSCHOCOLATE  =  "#D2691E"   
var CSSCORAL  =  "#FF7F50"   
var CSSCORNFLOWERBLUE  =  "#6495ED"   
var CSSCORNSILK  =  "#FFF8DC"   
var CSSCRIMSON  =  "#DC143C"   
var CSSCYAN  =  "#00FFFF"   
var CSSDARKBLUE  =  "#00008B"   
var CSSDARKCYAN  =  "#008B8B"   
var CSSDARKGOLDENROD  =  "#B8860B"   
var CSSDARKGRAY  =  "#A9A9A9"   
var CSSDARKGREEN  =  "#006400"   
var CSSDARKKHAKI  =  "#BDB76B"   
var CSSDARKMAGENTA  =  "#8B008B"   
var CSSDARKOLIVEGREEN  =  "#556B2F"   
var CSSDARKORANGE  =  "#FF8C00"   
var CSSDARKORCHID  =  "#9932CC"   
var CSSDARKRED  =  "#8B0000"   
var CSSDARKSALMON  =  "#E9967A"   
var CSSDARKSEAGREEN  =  "#8FBC8F"   
var CSSDARKSLATEBLUE  =  "#483D8B"   
var CSSDARKSLATEGRAY  =  "#2F4F4F"   
var CSSDARKTURQUOISE  =  "#00CED1"   
var CSSDARKVIOLET  =  "#9400D3"   
var CSSDEEPPINK  =  "#FF1493"   
var CSSDEEPSKYBLUE  =  "#00BFFF"   
var CSSDIMGRAY  =  "#696969"   
var CSSDODGERBLUE  =  "#1E90FF"   
var CSSFELDSPAR  =  "#D19275"   
var CSSFIREBRICK  =  "#B22222"   
var CSSFLORALWHITE  =  "#FFFAF0"   
var CSSFORESTGREEN  =  "#228B22"   
var CSSFUCHSIA  =  "#FF00FF"   
var CSSGAINSBORO  =  "#DCDCDC"   
var CSSGHOSTWHITE  =  "#F8F8FF"   
var CSSGOLD  =  "#FFD700"   
var CSSGOLDENROD  =  "#DAA520"   
var CSSGRAY  =  "#808080"   
var CSSGREEN  =  "#008000"   
var CSSGREENYELLOW  =  "#ADFF2F"   
var CSSHONEYDEW  =  "#F0FFF0"   
var CSSHOTPINK  =  "#FF69B4"   
var CSSINDIANRED   =  "#CD5C5C"   
var CSSINDIGO   =  "#4B0082"   
var CSSIVORY  =  "#FFFFF0"   
var CSSKHAKI  =  "#F0E68C"   
var CSSLAVENDER  =  "#E6E6FA"   
var CSSLAVENDERBLUSH  =  "#FFF0F5"   
var CSSLAWNGREEN  =  "#7CFC00"   
var CSSLEMONCHIFFON  =  "#FFFACD"   
var CSSLIGHTBLUE  =  "#ADD8E6"   
var CSSLIGHTCORAL  =  "#F08080"   
var CSSLIGHTCYAN  =  "#E0FFFF"   
var CSSLIGHTGOLDENRODYELLOW  =  "#FAFAD2"   
var CSSLIGHTGREY  =  "#D3D3D3"   
var CSSLIGHTGREEN  =  "#90EE90"   
var CSSLIGHTPINK  =  "#FFB6C1"   
var CSSLIGHTSALMON  =  "#FFA07A"   
var CSSLIGHTSEAGREEN  =  "#20B2AA"   
var CSSLIGHTSKYBLUE  =  "#87CEFA"   
var CSSLIGHTSLATEBLUE  =  "#8470FF"   
var CSSLIGHTSLATEGRAY  =  "#778899"   
var CSSLIGHTSTEELBLUE  =  "#B0C4DE"   
var CSSLIGHTYELLOW  =  "#FFFFE0"   
var CSSLIME  =  "#00FF00"   
var CSSLIMEGREEN  =  "#32CD32"   
var CSSLINEN  =  "#FAF0E6"   
var CSSMAGENTA  =  "#FF00FF"   
var CSSMAROON  =  "#800000"   
var CSSMEDIUMAQUAMARINE  =  "#66CDAA"   
var CSSMEDIUMBLUE  =  "#0000CD"   
var CSSMEDIUMORCHID  =  "#BA55D3"   
var CSSMEDIUMPURPLE  =  "#9370D8"   
var CSSMEDIUMSEAGREEN  =  "#3CB371"   
var CSSMEDIUMSLATEBLUE  =  "#7B68EE"   
var CSSMEDIUMSPRINGGREEN  =  "#00FA9A"   
var CSSMEDIUMTURQUOISE  =  "#48D1CC"   
var CSSMEDIUMVIOLETRED  =  "#C71585"   
var CSSMIDNIGHTBLUE  =  "#191970"   
var CSSMINTCREAM  =  "#F5FFFA"   
var CSSMISTYROSE  =  "#FFE4E1"   
var CSSMOCCASIN  =  "#FFE4B5"   
var CSSNAVAJOWHITE  =  "#FFDEAD"   
var CSSNAVY  =  "#000080"   
var CSSOLDLACE  =  "#FDF5E6"   
var CSSOLIVE  =  "#808000"   
var CSSOLIVEDRAB  =  "#6B8E23"   
var CSSORANGE  =  "#FFA500"   
var CSSORANGERED  =  "#FF4500"   
var CSSORCHID  =  "#DA70D6"   
var CSSPALEGOLDENROD  =  "#EEE8AA"
var CSSPALEGREEN  =  "#98FB98"
var CSSPALETURQUOISE  =  "#AFEEEE"
var CSSPALEVIOLETRED  =  "#D87093"  
var CSSPAPAYAWHIP  =  "#FFEFD5"
var CSSPEACHPUFF  =  "#FFDAB9" 
var CSSPERU  =  "#CD853F"   
var CSSPINK  =  "#FFC0CB"   
var CSSPLUM  =  "#DDA0DD"   
var CSSPOWDERBLUE  =  "#B0E0E6"   
var CSSPURPLE  =  "#800080"   
var CSSRED  =  "#FF0000"   
var CSSROSYBROWN  =  "#BC8F8F"   
var CSSROYALBLUE  =  "#4169E1"   
var CSSSADDLEBROWN  =  "#8B4513"   
var CSSSALMON  =  "#FA8072"   
var CSSSANDYBROWN  =  "#F4A460"   
var CSSSEAGREEN  =  "#2E8B57"   
var CSSSEASHELL  =  "#FFF5EE"   
var CSSSIENNA  =  "#A0522D"   
var CSSSILVER  =  "#C0C0C0"   
var CSSSKYBLUE  =  "#87CEEB"   
var CSSSLATEBLUE  =  "#6A5ACD"   
var CSSSLATEGRAY  =  "#708090"   
var CSSSNOW  =  "#FFFAFA"   
var CSSSPRINGGREEN  =  "#00FF7F"   
var CSSSTEELBLUE  =  "#4682B4"   
var CSSTAN  =  "#D2B48C"   
var CSSTEAL  =  "#008080"   
var CSSTHISTLE  =  "#D8BFD8"   
var CSSTOMATO  =  "#FF6347"   
var CSSTURQUOISE  =  "#40E0D0"   
var CSSVIOLET  =  "#EE82EE"   
var CSSVIOLETRED  =  "#D02090"   
var CSSWHEAT  =  "#F5DEB3"   
var CSSWHITE  =  "#FFFFFF"   
var CSSWHITESMOKE  =  "#F5F5F5"   
var CSSYELLOW  =  "#FFFF00"   
var CSSYELLOWGREEN  =  "#9ACD32"

//


function NiftyCheck() {
  if(!document.getElementById || !document.createElement) {
    return false;
  }
  var b = navigator.userAgent.toLowerCase();
  if (b.indexOf("msie 5") > 0 && b.indexOf("opera") == -1) {
    return false;
  }
  return true;
}

function Rounded(className, sizex, sizey, sizex_b, sizey_b) {
	var bk;


	if (!NiftyCheck()) return;
	if (typeof(sizex_b) == 'undefined')
		sizex_b = sizex;
	if (typeof(sizey_b) == 'undefined')
		sizey_b = sizey;
	var v = getElements(className);
	var l = v.length;

	for (var i = 0; i < l; i++) {
		color = get_current_style(v[i],"background-color","transparent");
		bk = get_current_style(v[i].parentNode,"background-color","transparent");
	
		//alert(color);
		//alert(bk);
		if (color.indexOf("#")<0) color = eval("CSS" + color.toUpperCase()) 
		if (bk.indexOf("#")<0) bk = eval("CSS" + bk.toUpperCase())

		AddRounded(v[i], bk, color, sizex, sizey, true);
		AddRounded(v[i], bk, color, sizex_b, sizey_b, false);
	}
}

Math.sqr = function (x) {
  return x*x;
};

function Blend(a, b, alpha) {

  var ca = Array(
    parseInt('0x' + a.substring(1, 3)), 
    parseInt('0x' + a.substring(3, 5)), 
    parseInt('0x' + a.substring(5, 7))
  );
  var cb = Array(
    parseInt('0x' + b.substring(1, 3)), 
    parseInt('0x' + b.substring(3, 5)), 
    parseInt('0x' + b.substring(5, 7))
  );
  return '#' + ('0'+Math.round(ca[0] + (cb[0] - ca[0])*alpha).toString(16)).slice(-2).toString(16)
             + ('0'+Math.round(ca[1] + (cb[1] - ca[1])*alpha).toString(16)).slice(-2).toString(16)
             + ('0'+Math.round(ca[2] + (cb[2] - ca[2])*alpha).toString(16)).slice(-2).toString(16);

  return '#' + ('0'+Math.round(ca[0] + (cb[0] - ca[0])*alpha).toString(16)).slice(-2).toString(16)
             + ('0'+Math.round(ca[1] + (cb[1] - ca[1])*alpha).toString(16)).slice(-2).toString(16)
             + ('0'+Math.round(ca[2] + (cb[2] - ca[2])*alpha).toString(16)).slice(-2).toString(16);
}

function AddRounded(el, bk, color, sizex, sizey, top) {
  if (!sizex && !sizey)
	return;
  var i, j;
  var d = document.createElement("div");
  d.style.backgroundColor = bk;
  var lastarc = 0;
  for (i = 1; i <= sizey; i++) {
    var coverage, arc2, arc3;
    // Find intersection of arc with bottom of pixel row
    arc = Math.sqrt(1.0 - Math.sqr(1.0 - i / sizey)) * sizex;
    // Calculate how many pixels are bg, fg and blended.
    var n_bg = sizex - Math.ceil(arc);
    var n_fg = Math.floor(lastarc);
    var n_aa = sizex - n_bg - n_fg;
    // Create pixel row wrapper
    var x = document.createElement("div");
    var y = d;
    x.style.margin = "0px " + n_bg + "px";
	x.style.height='1px';
	x.style.overflow='hidden';
    // Make a wrapper per anti-aliased pixel (at least one)
    for (j = 1; j <= n_aa; j++) {
      // Calculate coverage per pixel
      // (approximates circle by a line within the pixel)
      if (j == 1) {
        if (j == n_aa) {
          // Single pixel
          coverage = ((arc + lastarc) * .5) - n_fg;
        }
        else {
          // First in a run
          arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;
          coverage = (arc2 - (sizey - i)) * (arc - n_fg - n_aa + 1) * .5;
          // Coverage is incorrect. Why?
          coverage = 0;
        }
      }
      else if (j == n_aa) {
        // Last in a run
        arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;
        coverage = 1.0 - (1.0 - (arc2 - (sizey - i))) * (1.0 - (lastarc - n_fg)) * .5;
      }
      else {
        // Middle of a run
        arc3 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j) / sizex)) * sizey;
        arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;
        coverage = ((arc2 + arc3) * .5) - (sizey - i);
      }
      
      x.style.backgroundColor = Blend(bk, color, coverage);
	  if (top)
	      y.appendChild(x);
      else
	      y.insertBefore(x, y.firstChild);
      y = x;
      var x = document.createElement("div");
		x.style.height='1px';
		x.style.overflow='hidden';
      x.style.margin = "0px 1px";
    }
    x.style.backgroundColor = color;
    if (top)
	    y.appendChild(x);
    else
		y.insertBefore(x, y.firstChild);
    lastarc = arc;
  }
  if (top)
	  el.insertBefore(d, el.firstChild);
  else
	  el.appendChild(d);
}

function getElements(className) {
	var elements = [];
	var el = document.getElementsByTagName('DIV');  
	var regexp=new RegExp("\\b"+className+"\\b");
	for (var i = 0; i < el.length; i++) 
	{
		if (regexp.test(el[i].className)) 
			elements.push(el[i]);
	}
	return elements;
}

function get_current_style(element,property,not_accepted)
{
  var ee,i,val,apr;
  try
  {
    var cs=document.defaultView.getComputedStyle(element,'');
    val=cs.getPropertyValue(property);
  }
  catch(ee)
  {
    if(element.currentStyle)
  	{
	    apr=property.split("-");
	    for(i=1;i<apr.length;i++) apr[i]=apr[i].toUpperCase();
	    apr=apr.join("");
	    val=element.currentStyle.getAttribute(apr);
   }
  }
  if((val.indexOf("rgba") > -1 || val==not_accepted) && element.parentNode)
  {
	 if(element.parentNode != document) 
		 val=get_current_style(element.parentNode,property,not_accepted);
	 else
		 val = '#FFFFFF';
  }
  if (val.indexOf("rgb") > -1 && val.indexOf("rgba") == -1)
	  val = rgb2hex(val);
  //if (val.length == 4)
//	  val = '#'+val.substring(1,1)+val.substring(1,1)+val.substring(2,1)+val.substring(2,1)+val.substring(3,1)+val.substring(3,1);
  return val;
}

function rgb2hex(value)
{
	var x = 255;
	var hex = '';
	var i;
	var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;
	var array=regexp.exec(value);
	for(i=1;i<4;i++) hex += ('0'+parseInt(array[i]).toString(16)).slice(-2);
	return '#'+hex;
}

