/* 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 = true;

//zmienne wprowadzone na prywatne potrzeby
var options = new Array(); //domyslna opcja drugiego parametru (''=> default, 'small', 'big', 'same-height')
var elements = new Array(); //nazwy divow i innych elementow

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]);
}

function niftyPush(element, option) {
  elements.push(element);
  options.push(option);
}

window.onload = function() {
  for (i = 0; i < elements.length; i++) {
    Nifty(elements[i], options[i]);
  }
}