
/*
The function NiftyCheck performs a check for DOM support. If the test has passed, the Rounded function is called, that is now the only one function that you should call to get nifty corners. It accepts five parameters, that are in order:

A CSS selector that indicates on wich elements apply the function 
A string that indicates wich corners to round 
Outer color of the rounded corners 
Inner color of the rounded corners 
An optional fifth parameter, that will contain the options for Nifty Corners 

First parameter: the CSS selector
One of the strenghts of the function is that is capable of accepting a CSS selector to target the elements to round. Are accepted parameters:

Tag selector, i.e. "p" or "blockquote" or "h2" 
Id selector, with specified tag of the element: for example "div#content" or "p#news" or "li#home" 
Class selector, with specified tag of the element: for example "div.entry" or "h2.highlight" 
Descendant selector, with some limitation: this have to be composed by an id selector followed by a tag selector. Valid examples are: "div#news div" or "ul#menu li" 
Second parameter: specifing wich corners to round
Let's see again the Javascript call for the first example:

Rounded("div#nifty","all","#FFF","#D4DDFF","smooth");

The second parameter specify wich corners to round. It accept one or more of the following keywords separated by a space:

all will round all corners 
top will round top corners 
bottom will round bottom corners 
tl will round top-left corner 
tr will round top-right corner 
bl will round bottom-left corner 
br will round bottom-right corner 
You can also combine the keywords. For example, you can use the parameter "top br" to round the top corners and the bottom-right one. Note also that both the parameter "top bottom" and "tl tr bl br" are valid to get all the four corners rounded.

Third and fourth parameters: specifying the colors
Let's look again the Javascript call for the first example:

Rounded("div#nifty","all","#FFF","#D4DDFF","smooth");

The third and fourth parameters are used to specifying respectively outer and inner color. They should be specified in hex code with # symbol, in three or six digits. The good news is that they could also be setted to "transparent". While in the first version you could only get the outer color transparent, now you can also get nifty corners transparent inside. Obviously, you cannot get them both. But transparency inside it's really useful for example to play with elements with background, or avoiding specifying inner color but just the outer color.

Fifth parameter: nifty corners options
Here's the Javascript call for the first example:

Rounded("div#nifty","all","#FFF","#D4DDFF","smooth");

As you can see, there's a fifth parameter setted to "smooth", in order to produce lighly smoothed rounded corners. The fifth parameter is optional, and if specified will render nifty corners in different way. There are some keywords that you could use:

smooth will produce lighly antialiased nifty corners: the Javascript library will compute automatically the intermediate color to blend the inner and outer color more gently: so, in this case they must be both be specified. 
border (followed by a color in hex code with # symbol, in three or six digits) will make corners with edges. Note that you can also get transparent corners, but just outside the edges. 
small will produce small corners, and could be applied to every kind of corners 
The vertical padding handling
Before we start with the examples, let me explaing a good feature I've added to Nifty Corners but is behind the scenes. I' ve added a basic vertical padding handling,you can now specify via CSS a vertical padding to the elements to round: The script will automatically eliminate it before adding nifty corners. This is very useful for three reasons: it's easier adopting nifty corners on existing pages, the pages will degrade better if Javascript is disabled and also to avoid that jump-effect when the page wich use nifty corners is loaded. Optimal values are 5px vertical padding on the elements to round if you're planning to use normal nifty corners and 2px for small ones.


*/

function NiftyCheck(){
if(!document.getElementById || !document.createElement)
    return(false);
isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
if(Array.prototype.push==null){Array.prototype.push=function(){
      this[this.length]=arguments[0]; return(this.length);}}
return(true);
}

function Rounded(selector,wich,bk,color,opt){
var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;

if(color=="transparent"){
    cn=cn+"x";
    ecolor=bk;
    bk="transparent";
    }
else if(opt && opt.indexOf("border")>=0){
    var optar=opt.split(" ");
    for(i=0;i<optar.length;i++)
        if(optar[i].indexOf("#")>=0) ecolor=optar[i];
    if(ecolor=="") ecolor="#666";
    cn+="e";
    edges=true;
    }
else if(opt && opt.indexOf("smooth")>=0){
    cn+="a";
    ecolor=Mix(bk,color);
    }
if(opt && opt.indexOf("small")>=0) cn+="s";
prefixt=cn;
prefixb=cn;
if(wich.indexOf("all")>=0){t=true;b=true}
else if(wich.indexOf("top")>=0) t="true";
else if(wich.indexOf("tl")>=0){
    t="true";
    if(wich.indexOf("tr")<0) prefixt+="l";
    }
else if(wich.indexOf("tr")>=0){
    t="true";
    prefixt+="r";
    }
if(wich.indexOf("bottom")>=0) b=true;
else if(wich.indexOf("bl")>=0){
    b="true";
    if(wich.indexOf("br")<0) prefixb+="l";
    }
else if(wich.indexOf("br")>=0){
    b="true";
    prefixb+="r";
    }
var v=getElementsBySelector(selector);
var l=v.length;
for(i=0;i<l;i++){
    if(edges) AddBorder(v[i],ecolor);
    if(t) AddTop(v[i],bk,color,ecolor,prefixt);
    if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
    }
}

function AddBorder(el,bc){
var i;
if(!el.passed){
    if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
        var t=el.firstChild.nodeValue;
        el.removeChild(el.lastChild);
        var d=CreateEl("span");
        d.style.display="block";
        d.appendChild(document.createTextNode(t));
        el.appendChild(d);
        }
    for(i=0;i<el.childNodes.length;i++){
        if(el.childNodes[i].nodeType==1){
            el.childNodes[i].style.borderLeft="1px solid "+bc;
            el.childNodes[i].style.borderRight="1px solid "+bc;
            }
        }
    }
el.passed=true;
}
    
function AddTop(el,bk,color,bc,cn){
var i,lim=4,d=CreateEl("b");

if(cn.indexOf("s")>=0) lim=2;
if(bc) d.className="artop";
else d.className="rtop";
d.style.backgroundColor=bk;
for(i=1;i<=lim;i++){
    var x=CreateEl("b");
    x.className=cn + i;
    x.style.backgroundColor=color;
    if(bc) x.style.borderColor=bc;
    d.appendChild(x);
    }
el.style.paddingTop=0;
el.insertBefore(d,el.firstChild);
}

function AddBottom(el,bk,color,bc,cn){
var i,lim=4,d=CreateEl("b");

if(cn.indexOf("s")>=0) lim=2;
if(bc) d.className="artop";
else d.className="rtop";
d.style.backgroundColor=bk;
for(i=lim;i>0;i--){
    var x=CreateEl("b");
    x.className=cn + i;
    x.style.backgroundColor=color;
    if(bc) x.style.borderColor=bc;
    d.appendChild(x);
    }
el.style.paddingBottom=0;
el.appendChild(d);
}

function CreateEl(x){
if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
else return(document.createElement(x));
}

function getElementsBySelector(selector){
var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];

if(selector.indexOf(" ")>0){  //descendant selector like "tag#id tag"
    s=selector.split(" ");
    var fs=s[0].split("#");
    if(fs.length==1) return(objlist);
    f=document.getElementById(fs[1]);
    if(f) return(f.getElementsByTagName(s[1]));
    return(objlist);
    }
if(selector.indexOf("#")>0){ //id selector like "tag#id"
    s=selector.split("#");
    tag=s[0];
    selid=s[1];
    }
if(selid!=""){
    f=document.getElementById(selid);
    if(f) objlist.push(f);
    return(objlist);
    }
if(selector.indexOf(".")>0){  //class selector like "tag.class"
    s=selector.split(".");
    tag=s[0];
    selclass=s[1];
    }
var v=document.getElementsByTagName(tag);  // tag selector like "tag"
if(selclass=="")
    return(v);
for(i=0;i<v.length;i++){
    if(v[i].className.indexOf(selclass)>=0){
        objlist.push(v[i]);
        }
    }

obj = eval(objlist);
var temp = "";
for (x in obj)
        temp += x + ": " + obj[x] + "\n";
alert (temp);


return(objlist);
}

function Mix(c1,c2){
var i,step1,step2,x,y,r=new Array(3);
if(c1.length==4)step1=1;
else step1=2;
if(c2.length==4) step2=1;
else step2=2;
for(i=0;i<3;i++){
    x=parseInt(c1.substr(1+step1*i,step1),16);
    if(step1==1) x=16*x+x;
    y=parseInt(c2.substr(1+step2*i,step2),16);
    if(step2==1) y=16*y+y;
    r[i]=Math.floor((x*50+y*50)/100);
    }
return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
}
