/* 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]);
   }

