/* 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", "images/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);
   // alert(selector+" - "+v.length)
      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]);
   }