/* Nifty Corners Cube - rounded corners with CSS and Javascript


Copyright 2006 Alessandro Fulciniti (a.fulciniti@html.it)





This program is free software; you can redistribute it and/or modify


it under the terms of the GNU General Public License as published by


the Free Software Foundation; either version 2 of the License, or


(at your option) any later version.





This program is distributed in the hope that it will be useful,


but WITHOUT ANY WARRANTY; without even the implied warranty of


MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the


GNU General Public License for more details.





You should have received a copy of the GNU General Public License


along with this program; if not, write to the Free Software


Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA


*/





var niftyOk=(document.getElementById && document.createElement && Array.prototype.push);


var niftyCss=false;





String.prototype.find=function(what){


return(this.indexOf(what)>=0 ? true : false);


}





var oldonload=window.onload;


if(typeof(NiftyLoad)!='function') NiftyLoad=function(){};


if(typeof(oldonload)=='function')


    window.onload=function(){oldonload();AddCss();NiftyLoad()};


else window.onload=function(){AddCss();NiftyLoad()};





function AddCss(){


niftyCss=true;


var l=CreateEl("link");


l.setAttribute("type","text/css");


l.setAttribute("rel","stylesheet");


l.setAttribute("href","niftyCorners.css");


l.setAttribute("media","screen");


document.getElementsByTagName("head")[0].appendChild(l);


}





function Nifty(selector,options){


if(niftyOk==false) return;


if(niftyCss==false) AddCss();


var i,v=selector.split(","),h=0;


if(options==null) options="";


if(options.find("fixed-height"))


    h=getElementsBySelector(v[0])[0].offsetHeight;


for(i=0;i<v.length;i++)


    Rounded(v[i],options);


if(options.find("height")) SameHeight(selector,h);


}





function Rounded(selector,options){


var i,top="",bottom="",v=new Array();


if(options!=""){


    options=options.replace("left","tl bl");


    options=options.replace("right","tr br");


    options=options.replace("top","tr tl");


    options=options.replace("bottom","br bl");


    options=options.replace("transparent","alias");


    if(options.find("tl")){


        top="both";


        if(!options.find("tr")) top="left";


        }


    else if(options.find("tr")) top="right";


    if(options.find("bl")){


        bottom="both";


        if(!options.find("br")) bottom="left";


        }


    else if(options.find("br")) bottom="right";


    }


if(top=="" && bottom=="" && !options.find("none")){top="both";bottom="both";}


v=getElementsBySelector(selector);


for(i=0;i<v.length;i++){


    FixIE(v[i]);


    if(top!="") AddTop(v[i],top,options);


    if(bottom!="") AddBottom(v[i],bottom,options);


    }


}





function AddTop(el,side,options){


var d=CreateEl("b"),lim=4,border="",p,i,btype="r",bk,color;


d.style.marginLeft="-"+getPadding(el,"Left")+"px";


d.style.marginRight="-"+getPadding(el,"Right")+"px";


if(options.find("alias") || (color=getBk(el))=="transparent"){


    color="transparent";bk="transparent"; border=getParentBk(el);btype="t";


    }


else{


    bk=getParentBk(el); border=Mix(color,bk);


    }


d.style.background=bk;


d.className="niftycorners";


p=getPadding(el,"Top");


if(options.find("small")){


    d.style.marginBottom=(p-2)+"px";


    btype+="s"; lim=2;


    }


else if(options.find("big")){


    d.style.marginBottom=(p-10)+"px";


    btype+="b"; lim=8;


    }


else d.style.marginBottom=(p-5)+"px";


for(i=1;i<=lim;i++)


    d.appendChild(CreateStrip(i,side,color,border,btype));


el.style.paddingTop="0";


el.insertBefore(d,el.firstChild);


}





function AddBottom(el,side,options){


var d=CreateEl("b"),lim=4,border="",p,i,btype="r",bk,color;


d.style.marginLeft="-"+getPadding(el,"Left")+"px";


d.style.marginRight="-"+getPadding(el,"Right")+"px";


if(options.find("alias") || (color=getBk(el))=="transparent"){


    color="transparent";bk="transparent"; border=getParentBk(el);btype="t";


    }


else{


    bk=getParentBk(el); border=Mix(color,bk);


    }


d.style.background=bk;


d.className="niftycorners";


p=getPadding(el,"Bottom");


if(options.find("small")){


    d.style.marginTop=(p-2)+"px";


    btype+="s"; lim=2;


    }


else if(options.find("big")){


    d.style.marginTop=(p-10)+"px";


    btype+="b"; lim=8;


    }


else d.style.marginTop=(p-5)+"px";


for(i=lim;i>0;i--)


    d.appendChild(CreateStrip(i,side,color,border,btype));


el.style.paddingBottom=0;


el.appendChild(d);


}





function CreateStrip(index,side,color,border,btype){


var x=CreateEl("b");


x.className=btype+index;


x.style.backgroundColor=color;


x.style.borderColor=border;


if(side=="left"){


    x.style.borderRightWidth="0";


    x.style.marginRight="0";


    }


else if(side=="right"){


    x.style.borderLeftWidth="0";


    x.style.marginLeft="0";


    }


return(x);


}





function CreateEl(x){


return(document.createElement(x));


}





function FixIE(el){


if(el.currentStyle!=null && el.currentStyle.hasLayout!=null && el.currentStyle.hasLayout==false)


    el.style.display="inline-block";


}





function SameHeight(selector,maxh){


var i,v=selector.split(","),t,j,els=[],gap;


for(i=0;i<v.length;i++){


    t=getElementsBySelector(v[i]);


    els=els.concat(t);


    }


for(i=0;i<els.length;i++){


    if(els[i].offsetHeight>maxh) maxh=els[i].offsetHeight;


    els[i].style.height="auto";


    }


for(i=0;i<els.length;i++){


    gap=maxh-els[i].offsetHeight;


    if(gap>0){


        t=CreateEl("b");t.className="niftyfill";t.style.height=gap+"px";


        nc=els[i].lastChild;


        if(nc.className=="niftycorners")


            els[i].insertBefore(t,nc);


        else els[i].appendChild(t);


        }


    }


}





function getElementsBySelector(selector){


var i,j,selid="",selclass="",tag=selector,tag2="",v2,k,f,a,s=[],objlist=[],c;


if(selector.find("#")){ //id selector like "tag#id"


    if(selector.find(" ")){  //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){


            v=f.getElementsByTagName(s[1]);


            for(i=0;i<v.length;i++) objlist.push(v[i]);


            }


        return(objlist);


        }


    else{


        s=selector.split("#");


        tag=s[0];


        selid=s[1];


        if(selid!=""){


            f=document.getElementById(selid);


            if(f) objlist.push(f);


            return(objlist);


            }


        }


    }


if(selector.find(".")){      //class selector like "tag.class"


    s=selector.split(".");


    tag=s[0];


    selclass=s[1];


    if(selclass.find(" ")){   //descendant selector like tag1.classname tag2


        s=selclass.split(" ");


        selclass=s[0];


        tag2=s[1];


        }


    }


var v=document.getElementsByTagName(tag);  // tag selector like "tag"


if(selclass==""){


    for(i=0;i<v.length;i++) objlist.push(v[i]);


    return(objlist);


    }


for(i=0;i<v.length;i++){


    c=v[i].className.split(" ");


    for(j=0;j<c.length;j++){


        if(c[j]==selclass){


            if(tag2=="") objlist.push(v[i]);


            else{


                v2=v[i].getElementsByTagName(tag2);


                for(k=0;k<v2.length;k++) objlist.push(v2[k]);


                }


            }


        }


    }


return(objlist);


}





function getParentBk(x){


var el=x.parentNode,c;


while(el.tagName.toUpperCase()!="HTML" && (c=getBk(el))=="transparent")


    el=el.parentNode;


if(c=="transparent") c="#FFFFFF";


return(c);


}





function getBk(x){


var c=getStyleProp(x,"backgroundColor");


if(c==null || c=="transparent" || c.find("rgba(0, 0, 0, 0)"))


    return("transparent");


if(c.find("rgb")) c=rgb2hex(c);


return(c);


}





function getPadding(x,side){


var p=getStyleProp(x,"padding"+side);


if(p==null || !p.find("px")) return(0);


return(parseInt(p));


}





function getStyleProp(x,prop){


if(x.currentStyle)


    return(x.currentStyle[prop]);


if(document.defaultView.getComputedStyle)


    return(document.defaultView.getComputedStyle(x,'')[prop]);


return(null);


}





function rgb2hex(value){


var hex="",v,h,i;


var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;


var h=regexp.exec(value);


for(i=1;i<4;i++){


    v=parseInt(h[i]).toString(16);


    if(v.length==1) hex+="0"+v;


    else hex+=v;


    }


return("#"+hex);


}





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


    r[i]=r[i].toString(16);


    if(r[i].length==1) r[i]="0"+r[i];


    }


return("#"+r[0]+r[1]+r[2]);


}