/**
 * RUZEE.ShadedBorder 0.6.1
 * (c) 2006 Steffen Rusitschka
 *
 * RUZEE.ShadedBorder is freely distributable under the terms of an MIT-style license.
 * For details, see http://www.ruzee.com/
 */

var RUZEE = window.RUZEE || {};

RUZEE.ShadedBorder = {

	create: function(opts) {
	  var isie = /msie/i.test(navigator.userAgent) && !window.opera;
	  var isie6 = isie && !window.XMLHttpRequest;
	  function sty(el, h) {
	    for(k in h) {
	      if (/ie_/.test(k)) {
	        if (isie) el.style[k.substr(3)]=h[k];
	      } else el.style[k]=h[k];
	    }
	  }
	  function crdiv(h) {
	    var el=document.createElement("div");
	    el.className = "sb-gen";
	    sty(el, h);
	    return el;
	  }
	  function op(v) {
	    v = v<0 ? 0 : v;
	    if (v>0.99999) return "";
	    return isie ? " filter:alpha(opacity=" + (v*100) + ");" : " opacity:" + v + ';';
	  }
	
	  var sr = opts.shadow || 0;
	  var r = opts.corner || 0;
	  var bor = 0;
	  var bow = opts.border || 0;
	  var boo = opts.borderOpacity || 1;
	  var shadow = sr != 0;
	  var lw = r > sr ? r : sr;
	  var rw = lw;
	  var th = lw;
	  var bh = lw;
	  if (bow > 0) {
	    bor = r;
	    r = r - bow;
	  }
	  var cx = r != 0 && shadow ? Math.round(lw/3) : 0;
	  var cy = cx;
	  var cs = Math.round(cx/2);
	  var iclass = r > 0 ? "sb-inner" : "sb-shadow";
	  var sclass = "sb-shadow";
	  var bclass = "sb-border";
	  var edges = opts.edges || "trlb";
	  if (!/t/i.test(edges)) th=0;
	  if (!/b/i.test(edges)) bh=0;
	  if (!/l/i.test(edges)) lw=0;
	  if (!/r/i.test(edges)) rw=0;
	
	  var p = { position:"absolute", left:"0", top:"0", width:lw + "px", height:th + "px", 
	            ie_fontSize:"1px", overflow:"hidden", margin:"0", padding:"0" }; var tl = crdiv(p);
	  delete p.left; p.right="0"; p.width=rw + "px"; var tr = crdiv(p);
	  delete p.top; p.bottom="0"; p.height=bh + "px"; var br = crdiv(p);
	  delete p.right; p.left="0"; p.width=lw + "px"; var bl = crdiv(p);
	
	  var tw = crdiv({ position:"absolute", width:"100%", height:th + "px", ie_fontSize:"1px",
	                   top:"0", left:"0", overflow:"hidden", margin:"0", padding:"0" });
	  var t = crdiv({ position:"relative", height:th + "px", ie_fontSize:"1px",
	                  margin:"0 "+ rw + "px 0 " + lw + "px", overflow:"hidden", padding:"0" });
	  tw.appendChild(t);
	
	  var bw = crdiv({ position:"absolute", left:"0", bottom:"0", width:"100%", height:bh + "px", 
	                   ie_fontSize:"1px", overflow:"hidden", margin:"0", padding:"0" });
	                   
	  var b = crdiv({ position:"relative", height:bh + "px", ie_fontSize:"1px",
	                  margin:"0 "+ rw + "px 0 " + lw + "px", overflow:"hidden", padding:"0" });
	                  
	  bw.appendChild(b);
	
	  var mw = crdiv({ position:"absolute", top:(-bh)+"px", left:"0", width:"100%", height:"100%",
	                   overflow:"hidden", ie_fontSize:"1px", padding:"0", margin:"0" });
	
	  function corner(el,t,l) {
	    var w = l ? lw : rw;
	    var h = t ? th : bh;
	    var s = t ? cs : -cs;
	    var dsb = []; var dsi = []; var dss = [];
	    
	    var xp=0; var xd=1; if (l) { xp=w-1; xd=-1; }
	    for (var x=0; x<w; ++x) {
	      var yp=h-1; var yd=-1; if (t) { yp=0; yd=1; }
	      var finished=false;
	      for (var y=h-1; y>=0 && !finished; --y) {
	        var div = '<div style="position:absolute; top:' + yp + 'px; left:' + xp + 'px; ' +
	                  'width:1px; height:1px; overflow:hidden; margin:0; padding:0;';
	
	        var xc = x - cx; var yc = y - cy - s;
	        var d = Math.sqrt(xc*xc+yc*yc);
	        var doShadow = false;
	
	        if (r > 0) {
	          // draw border
	          if (xc < 0 && yc < bor && yc >= r || yc < 0 && xc < bor && xc >= r) {
	            dsb.push(div + op(boo) + '" class="1' + bclass + '"></div>');
	          } else
	          if (d<bor && d>=r-1 && xc>=0 && yc>=0) {
	            var dd = div;
	            if (d>=bor-1) {
	              dd += op((bor-d)*boo);
	              doShadow = true;
	            } else dd += op(boo);
	            dsb.push(dd + '" class="1' + bclass + '"></div>');
	          }
	          
	          // draw inner
	          var dd = div + ' z-index:2;' + (t ? 'background-position:0 -' + (r-yc-1) + 'px;' : 'background-image:none;');
	          var finish = function() {
	            if (!t) dd = dd.replace(/top\:\d+px/, "top:0px");
	            dd = dd.replace(/height\:1px/, "height:" + (y+1) + "px");
	            dsi.push(dd + '" class="' + iclass + '"></div>');
	            finished = true;
	          };
	          if (xc < 0 && yc < r || yc < 0 && xc < r) {
	            finish();
	          } else
	          if (d<r && xc>=0 && yc>=0) {
	            if (d>=r-1) {
	              dd += op(r-d);
	              doShadow = true;
	              dsi.push(dd + '" class="' + iclass + '"></div>');
	            } else {
	              finish();
	            }
	          } else doShadow = true;
	        } else doShadow = true;
	        
	        // draw shadow
	        if (sr > 0 && doShadow) {
	          d = Math.sqrt(x*x+y*y);
	          if (d<sr) {
	            dss.push(div + ' z-index:0; ' + op(1-(d/sr)) + '" class="' + sclass + '"></div>');
	          }
	        }
	        yp += yd;
	      }
	      xp += xd;
	    }
	    el.innerHTML = dss.concat(dsb.concat(dsi)).join('');
	  }
	  
	  function mid(mw) {
	    var ds = [];
	
	    ds.push('<div style="position:relative; top:' + (th+bh) + 'px; height:2048px; ' +
	            ' margin:0 ' + (rw-r-cx) + 'px 0 ' + (lw-r-cx) + 'px; ' +
	            ' padding:0; overflow:hidden;' +
	            ' background-position:0 ' + (th > 0 ? -(r+cy+cs) : '0') + 'px;"' +
	            ' class="' + iclass + '"></div>');
	
	    var dd = '<div style="position:absolute; width:1px;' +
	        ' top:' + (th+bh) + 'px; height:2048px; padding:0; margin:0;';
	    if (sr>0) {
	      for (var x=0; x<lw-r-cx; ++x) {
	        ds.push(dd + ' left:' + x + 'px;' + op((x+1.0)/lw) + 
	            '" class="' + sclass + '"></div>');
	      }
	
	      for (var x=0; x<rw-r-cx; ++x) {
	        ds.push(dd + ' right:' + x + 'px;' + op((x+1.0)/rw) + 
	            '" class="' + sclass + '"></div>');
	      }
	    }
	
	    if (bow > 0) {
	      var su = ' width:' + bow + 'px;' + op(boo) + '" class="' + bclass + '"></div>';
	      ds.push(dd + ' left:' + (lw-bor-cx) + 'px;' + su);
	      ds.push(dd + ' right:' + (rw-bor-cx) + 'px;' + su);
	    }
	
	    mw.innerHTML = ds.join('');
	  }
	
	  function tb(el, t) {
	    var ds = [];
	    var h = t ? th : bh;
	    var dd = '<div style="height:1px; overflow:hidden; position:absolute; margin:0; padding:0;' +
	        ' width:100%; left:0px; ';
	    var s = t ? cs : -cs;
	    for (var y=0; y<h-s-cy-r; ++y) {
	      if (sr>0) ds.push(dd + (t ? 'top:' : 'bottom:') + y + 'px;' + op((y+1)*1.0/h) + 
	          '" class="' + sclass + '"></div>');
	    }
	    if (y >= bow) {
	      ds.push(dd + (t ? 'top:' : 'bottom:') + (y - bow) + 'px;' + op(boo) +
	          ' height:' + bow + 'px;" class="' + bclass + '"></div>');
	    }
	
	    ds.push(dd + (t ? 'background-position:0; top:' : 
	                      'background-image:none; bottom:') + y + 'px;' +
	        ' height:' + (r+cy+s) + 'px;" class="' + iclass + '"></div>');
	
	    el.innerHTML = ds.join('');
	  }
	
	  corner(tl, true, true); corner(tr, true, false);
	  corner(bl, false, true); corner(br, false, false);
	  mid(mw); tb(t, true); tb(b, false);
	
	  return {
	    render: function(el) {
	      if (typeof el == 'string') {
	      	el = document.getElementById(el);
	      	if (!el) return false;
	      }
	      
	      if (el.length != undefined) {
	        for (var i=0; i<el.length; ++i) this.render(el[i]);
	        return;
	      }
	      
	      // Aien: hacks for headers that seems to not displaying correctly if rounded corner applied to it
	      if (el.nodeName == "H3" || el.nodeName == "H4") el.innerHTML = '<div class="content">' + el.innerHTML + '</div>';
	      
	      el.className += " sb";
	      sty(el, { position:"relative", background:"transparent" });
	
	      // remove generated children
	      var node = el.firstChild;
	      while (node) {
	        var nextNode = node.nextSibling;
	        if (node.nodeType == 1 && node.className == 'sb-gen')
	          el.removeChild(node);
	        node = nextNode;
	      }
	
	      var iel = el.firstChild;
	
	      var twc = tw.cloneNode(true);
	      var mwc = mw.cloneNode(true);
	      var bwc = bw.cloneNode(true);
	      
	      el.insertBefore(tl.cloneNode(true), iel); el.insertBefore(tr.cloneNode(true), iel);
	      el.insertBefore(bl.cloneNode(true), iel); el.insertBefore(br.cloneNode(true), iel);
	      el.insertBefore(twc, iel); el.insertBefore(mwc, iel);
	      el.insertBefore(bwc, iel);
	
	      if (isie6) {
	        el.onmouseover=function() { this.className+=" hover"; }
	        el.onmouseout=function() { this.className=this.className.replace(/ hover/,""); }
	      }
	      if (isie) {
	        function resize() {
	          twc.style.width = bwc.style.width = mwc.style.width = el.offsetWidth + "px";
	          mwc.firstChild.style.height = el.offsetHeight + "px";
	        }
	        el.onresize=resize;
	        resize();
	      }
	    }
	  };
	}
}

// add our styles to the document
document.write('\
  <style type="text/css">\
  .sb, .sbi, .sb *, .sbi * { position:relative; z-index:1; }\
  * html .sb, * html .sbi { height:1%; }\
  .sb-inner { background:#ddd; }\
  .sb-shadow { background:#000; }\
  .sb-border { background:#bbb; }\
  </style>\
');
