// cornerzap.js
// selector.js

var _browser=0;var isXHTML;var _czap_msgs="";function _browser_check(){if(!_browser){if(document.getElementById&&document.createElement){isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);_browser=1;var ua=navigator.userAgent;if(ua.indexOf("Konqueror")!=-1)
_browser=2;if(ua.indexOf("Opera")!=-1)
_browser=3;if(Array.prototype.push==null){Array.prototype.push=function(){this[this.length]=arguments[0];return(this.length);}}}else{_browser=-1;}}
return(_browser>0);}
function CZapDebug(){if(_czap_msgs)
alert(_czap_msgs);}
function CZapper(s){if(!_browser_check())
return;var pat=/([^{]*)\{([^}]*)\}\s*(.*)/,erg;s=s.replace(/\n/g," ");while(erg=s.match(pat)){_czap_one(erg[1],erg[2]);s=erg[3];}
if(s.length>0)
throw'Parse error in zap spec at: '+s;}
function _czap_one(selector,opt){var opts={"tl":1,"tr":2,"top":3,"bl":4,"br":8,"bottom":12,"left":5,"right":10,"all":15,"border":16,"smooth":32,"height":128,"width":256,"bg":0,"fg":0,"fgtop":0,"fgbottom":0};var propagate={all:"tl tr bl br",top:"tl tr",bottom:"bl br",left:"tl bl",right:"tr br",fg:"fgtop fgbottom"};var args={tl:5,tr:5,bl:5,br:5,fg:"",bg:"",fgtop:"",ftbottom:"",border:"",bwidth:1,bcolor:"#777"};var bm=0,s,i,els;if(typeof opt!="string"){opt="";}
var ar=opt.split(";"),ar2;for(i=0;i<ar.length;i++){s=ar[i].strip();if(s=="")
continue;ar2=s.split(":",2);if(ar2.length==2)
args[ar2[0]]=ar2[1];s=ar2[0];if(typeof opts[s]!="undefined"){bm=bm|opts[s];if(ar2[1]&&propagate[s]){var ar3=propagate[s].split(" ");for(var j=0;j<ar3.length;j++)
args[ar3[j]]=ar2[1];}}else
alert("CornerZap: unknown parameter >>"+s+"<<"
+" for selector "+selector);}
if((bm&15)==0)
bm|=15;if(bm&16){var bspec=args.border.split(" ");for(i=0;i<bspec.length;i++){s=bspec[i];if(s.substr(0,1)=="#")
args.bcolor=s;else
args.bwidth=s;}}else
args.bwidth=0;args.bwidth=parseInt(args.bwidth,10);args.selector=selector;els=$$(selector);for(i=0;i<els.length;i++)
_czap_element(els[i],bm,args);}
function _czap_element(el,bm,args){var bg=args.bg?args.bg:_get_background_of(el.parentNode,true);var bcolor=args.bcolor;var cs=_get_computed_style(el);var w=_add_wrapper(el,args);if(bm&128){if(cs.position=='static'||(_browser==2&&cs.position=='')){el.style.position="relative";}
if(_browser==3)
el.style.height=cs.height;else
el.style.height=(parseInt(cs.height,10)+parseInt(cs.paddingTop,10)
+parseInt(cs.paddingBottom,10))+"px";}
if(bm&256)
if(_browser==3)
el.style.width=cs.width;else
el.style.width=(parseInt(cs.width,10)+parseInt(cs.paddingLeft,10)
+parseInt(cs.paddingRight,10))+"px";args.bm=bm;if(_browser==3){var old_pad=el.style.padding;el.style.padding=(old_pad=="1px"?"2px":"1px");el.style.padding=old_pad;}
if(bm&3)
_add_corner(el,args,1,bg,args.fgtop,bcolor,cs,w);if(bm&12)
_add_corner(el,args,4,bg,args.fgbottom,bcolor,cs,w);w.style.paddingLeft=cs.paddingLeft;el.style.paddingLeft=0;w.style.paddingRight=cs.paddingRight;el.style.paddingRight=0;if(!(bm&3)){w.style.paddingTop=cs.paddingTop;el.style.paddingTop=0;}
if(!(bm&12)){w.style.paddingBottom=cs.paddingBottom;el.style.paddingBottom=0;}
el.style.padding=0;}
function _get_background_of(el,recurse){var s;for(;el!=document;el=el.parentNode){s=_get_computed_style(el).backgroundColor;if(s=="rgba(0, 0, 0, 0)")
s="transparent";if(s=="#000000"&&_browser==2)
s="transparent";if(!recurse||s!="transparent")
return s;}
return"#fff";}
function _get_computed_style(el){return el.currentStyle?el.currentStyle:document.defaultView.getComputedStyle(el,null);}
function _add_wrapper(el,args){if(el.zapped){el=el.firstChild;return el.nodeName=="B"?el.nextSibling:el;}
el.zapped=1;var spec=args.bwidth?"solid "+args.bwidth+"px "+args.bcolor:"";var w=_create_el("span");w.style.display="block";w.style.borderLeft=spec;w.style.borderRight=spec;while(el.childNodes.length>0)
w.appendChild(el.removeChild(el.firstChild));el.appendChild(w);return w;}
function _circle(r,y){if(y>=r)
return r;if(y<0)
return 0;return r-Math.round(r*Math.cos(Math.asin(y/r)))+1;}
function _add_corner(el,args,where,bgcolor,fgcolor1,bcolor,cs,wrapper){var rr=parseInt((where==1)?args.tr:args.br,10);var rl=parseInt((where==1)?args.tl:args.bl,10);var xl,xr,xl2=0,xr2=0,y,b,v,cont,prevxl=0,prevxr=0,aaxl=0,aaxr=0;var bwidth=args.bwidth;var rmax=rl>rr?rl:rr;rmax=bwidth>rmax?bwidth:rmax;var ydl=rmax-rl,ydr=rmax-rr;var bm=args.bm;var fgcolor=fgcolor1?fgcolor1:_get_background_of(el,false);if(fgcolor=="transparent"){bcolor=bgcolor;bgcolor="transparent";bm|=64;}
if(bm&32&&fgcolor!="transparent")
bcolor=_mix_colors(fgcolor,bgcolor);cont=_create_el("b");cont.style.backgroundColor=bgcolor;cont.className="czap";for(y=1;y<=rmax;y++){xl=_circle(rl,y-ydl);xr=_circle(rr,y-ydr);b=_create_el("b");b.style.height="1px";if(bm&64){b.style.borderColor=bcolor;if(bm&where)
b.style.borderLeftWidth=xl+"px";if(bm&(where<<1))
b.style.borderRightWidth=xr+"px";}else{if(bm&(16+32)){b.style.borderColor=bcolor;if(bwidth==0){if(xl!=prevxl)
xl2=aaxl=xl-prevxl;if(xr!=prevxr)
xr2=aaxr=xr-prevxr;}else{xl2=_circle(rl-bwidth,y-ydl)-xl;xr2=_circle(rr-bwidth,y-ydr)-xr;}
b.style.borderLeftWidth=(((bm&where)?xl2:0)+bwidth)+"px";b.style.borderRightWidth=(((bm&(where<<1))?xr2:0)+bwidth)+"px";}
if(bm&where)
b.style.marginLeft=(xl-aaxl)+"px";if(bm&(where<<1))
b.style.marginRight=(xr-aaxr)+"px";prevxl=xl;prevxr=xr;b.style.backgroundColor=((bm&16)&&y+bwidth>rmax)?bcolor:fgcolor;}
if(where==1)
cont.insertBefore(b,cont.firstChild);else
cont.appendChild(b);}
if(where==4&&(bm&128)){cont.style.position="absolute";cont.style.bottom=0;cont.style.left=0;cont.style.width="100%";}
if(where==1){wrapper.style.paddingTop=_add_px(args,cs.paddingTop,-rmax,"top");el.style.paddingTop=0;el.insertBefore(cont,el.firstChild);}else{wrapper.style.paddingBottom=_add_px(args,cs.paddingBottom,-rmax,"bottom");el.style.paddingBottom=0;el.appendChild(cont);}}
function _create_el(x){if(isXHTML)
return document.createElementNS('http://www.w3.org/1999/xhtml',x);return document.createElement(x);}
function _add_px(args,a,b,where){var c=parseInt(a,10);c+=parseInt(b,10);if(c<0){_czap_msgs+="Warning: need "+(-c)+" more "+where
+" padding for selector "+args.selector+"\n";c=0;}
return c+"px";}
function _mix_colors(c1,c2){var a=_parse_color(c1);var b=_parse_color(c2);var r=new Array(3);for(var i=0;i<3;i++){r[i]=Math.floor((a[i]+b[i])/2);}
return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));}
function _parse_color(s){var ar=new Array(3),i;if(s.substr(0,4)=="rgb("){ar=s.substr(4).split(",",3);for(i=0;i<3;i++){ar[i]=parseInt(ar[i],10);}}else if(s.substr(0,1)=="#"){if(s.length==4){for(i=0;i<3;i++){ar[i]=parseInt(s.substr(1+i,1),16)*16;}}else if(s.length==7){for(i=0;i<3;i++){ar[i]=parseInt(s.substr(1+i*2,2),16);}}}
return ar;}
var $A=Array.from=function(iterable){if(!iterable)
return[];if(iterable.toArray){return iterable.toArray();}else{var results=[];for(var i=0;i<iterable.length;i++)
results.push(iterable[i]);return results;}}
String.prototype.inspect=function(){return"'"+this.replace(/\\/g,'\\\\').replace(/'/g,'\\\'')+"'";}
String.prototype.strip=function(){return this.replace(/^\s+/,'').replace(/\s+$/,'');}
Array.prototype.map=function(func){var res=[],i;for(i=0;i<this.length;i++)
res.push(func(this[i],i));return res;}
Array.prototype.inject=function(res,func){for(var i=0;i<this.length;i++)
res=func(res,this[i],i);return res;}
Array.prototype.flatten=function(){return this.inject([],function(ar,val){return ar.concat(val.constructor==Array?val.flatten():[val]);});}
Array.prototype.shift=function(){var result=this[0];for(var i=0;i<this.length-1;i++)
this[i]=this[i+1];this.length--;return result;};Function.prototype.bind=function(){var __method=this,args=$A(arguments),obj=args.shift();return function(){return __method.apply(obj,args.concat($A(arguments)));}}
if(!Function.prototype.apply)
Function.prototype.apply=function(scope,args){if(!args)
args=[];var index=0,result;do{--index;}while(typeof scope[index]!="undefined");scope[index]=this;switch(args.length){case 0:result=scope[index]();break;case 1:result=scope[index](args[0]);break;case 2:result=scope[index](args[0],args[1]);break;case 3:result=scope[index](args[0],args[1],args[2]);break;default:throw"too many arguments: "+args.length;}
delete scope[index];return result;}
function _element_hasClassName(el,s){var ar=el.className.split(/ +/),i;for(i=0;i<ar.length;i++)
if(ar[i]==s)
return true;return false;}
function _element_childOf(el,ancestor){while(el=el.parentNode)
if(el==ancestor)
return true;return false;}
var Class={create:function(){return function(){this.initialize.apply(this,arguments);}}}
var Selector=Class.create();Selector.prototype={initialize:function(s){s=s.strip();this.params={classNames:[]};this.parse(s);this.compile();},parse:function(expr){function abort(msg){throw'Parse error in selector: '+msg;}
if(expr=="")
abort("empty expression");if(expr=='*')
return this.params.wildcard=true;var params=this.params,match,modifier,clause,rest;while(match=expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)){modifier=match[1],clause=match[2],rest=match[3];switch(modifier){case'#':params.id=clause;break;case'.':params.classNames.push(clause);break;case'':case undefined:params.tagName=clause.toUpperCase();break;default:abort(expr.inspect());}
expr=rest;}
if(expr.length>0)
abort(expr.inspect());},compile:function(){this.match=new Function('element','if (!element.tagName) return false; \
      return '+this.buildMatchExpression());},buildMatchExpression:function(){var params=this.params,conditions=[],cn,i;if(params.wildcard)
return'true';if(clause=params.id)
conditions.push('element.id == '+clause.inspect());if(clause=params.tagName)
conditions.push('element.tagName.toUpperCase() == '+clause.inspect());cn=params.classNames;for(i=0;i<cn.length;i++)
conditions.push('_element_hasClassName(element, '+cn[i].inspect()+')');return conditions.join(' && ');},findElements:function(scope){var element;if(element=$(this.params.id))
if(this.match(element))
if(!scope||_element_childOf(element,scope))
return[element];scope=(scope||document).getElementsByTagName(this.params.tagName||'*');var results=[];for(var i=0;i<scope.length;i++)
if(this.match(element=scope[i]))
results.push(element);return results;}};function $(){var results=[],element;for(var i=0;i<arguments.length;i++){element=arguments[i];if(typeof element=='string')
element=document.getElementById(element);results.push(element);}
return results.length<2?results[0]:results;}
function $$(s){var i,j,ar,ar2,res=[];ar=s.split(/,/);for(i=0;i<ar.length;i++){res=res.concat(ar[i].strip().split(/\s+/).inject([null],function(res,expr){var sel=new Selector(expr);return res.map(sel.findElements.bind(sel)).flatten();}));}
return res.flatten();}