// 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/

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");

		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;

}

