/*  Spinners 1.1
 *  (c) 2010 Nick Stakenburg - http://www.nickstakenburg.com
 *
 *  Spinners is freely distributable under the terms of an MIT-style license.
 *
 *  Works with your framework of choice using BridgeJS:
 *  http://www.github.com/staaky/bridgejs
 *
 *  Requires ExplorerCanvas to work in Internet Explorer:
 *  http://code.google.com/p/explorercanvas
 */

var Spinners = {
  Version: '1.1'
};

(function(d){function c(f){return f*Math.PI/180}function b(f,g){(f=d.$(f))&&(this.element=f.source,Spinners.remove(f),Spinners.removeDetached(),this.options=d.Object.extend({radii:[5,10],color:"#000",dashWidth:1.8,dashes:12,opacity:1,padding:3,speed:0.7,build:true},g),this._position=0,this._state="stopped",this.options.build&&this.build(),Spinners.add(this))}d.Object.extend(Spinners,{spinners:[],Required:{Bridge:"0.2.0"},support:{canvas:document.createElement("canvas").getContext},insertScript:function(f){try{document.write("<script type='text/javascript' src='"+f+"'><\/script>")}catch(g){Bridge.$$("head").source[0].appendChild(new Bridge.Element("script",{src:f,type:"text/javascript"}))}},require:function(f,g){if(typeof window[f]=="undefined"||this.convertVersionString(window[f].Version)<this.convertVersionString(this.Required[f])){throw"Spinners requires "+(g||f)+" >= "+this.Required[f]}},convertVersionString:function(f){var g=f.replace(/_.*|\./g,"");g=parseInt(g+Bridge.String.times("0",4-g.length));return f.indexOf("_")>-1?g-1:g},start:function(){this.require("Bridge");if(!this.support.canvas&&!window.G_vmlCanvasManager){throw"Spinners requires ExplorerCanvas"}},get:function(f){if(f=d.$(f).source){var g=null;d._each(this.spinners,function(h){h.element==f&&(g=h)});return g}},add:function(f){this.spinners.push(f)},remove:function(f){(f=this.get(f))&&(f.remove(),this.spinners=d.Array.without(this.spinners,f))},removeDetached:function(){d.each(this.spinners,function(f){try{f.element.offsetParent||this.remove(f.element)}catch(g){this.remove(f.element)}},this)}});var a={drawRoundedRectangle:function(g,l){var m=d.Object.extend({top:0,left:0,width:0,height:0,radius:0},l||{}),i=m.left,n=m.top,k=m.width,j=m.height;m=m.radius;g.beginPath();g.moveTo(i+m,n);g.arc(i+k-m,n+m,m,c(-90),c(0),false);g.arc(i+k-m,n+j-m,m,c(0),c(90),false);g.arc(i+m,n+j-m,m,c(90),c(180),false);g.arc(i+m,n+m,m,c(-180),c(-90),false);g.closePath();g.fill()}},e=function(){function f(i){var j=[];i.indexOf("#")==0&&(i=i.substring(1));i=i.toLowerCase();if(i.replace(g,"")!=""){return null}i.length==3?(j[0]=i.charAt(0)+i.charAt(0),j[1]=i.charAt(1)+i.charAt(1),j[2]=i.charAt(2)+i.charAt(2)):(j[0]=i.substring(0,2),j[1]=i.substring(2,4),j[2]=i.substring(4));for(i=0;i<j.length;i++){j[i]=parseInt(j[i],16)}j.red=j[0];j.green=j[1];j.blue=j[2];return j}var g=RegExp("[0123456789abcdef]","g"),h=function(){function i(l,k,j){l=l.toString(j||10);return d.String.times("0",k-l.length)+l}return function(l,k,j){return"#"+i(l,2,16)+i(k,2,16)+i(j,2,16)}}();return{hex2rgb:f,hex2fill:function(i,l){d.Object.isUndefined(l)&&(l=1);var k=l,j=f(i);j[3]=k;j.opacity=k;return"rgba("+j.join()+")"},rgb2hex:h}}();d.Object.extend(b.prototype,function(){function f(){var g=this.options.speed*1000/this.options.dashes;this.nextPosition();this._playTimer=window.setTimeout(d.Function.bind(f,this),g)}return{remove:function(){this.canvas&&(this.stop(),this.canvas.remove(),this.canvas=null,this.ctx=null)},build:function(){this.remove();var g=this.getLayout().workspace.radius,h=g*2;d.$(this.element).insert(this.canvas=(new d.Element("canvas",{height:h,width:h})).setStyle({zoom:1}));window.G_vmlCanvasManager&&G_vmlCanvasManager.initElement(this.canvas.source);this.ctx=this.canvas.source.getContext("2d");this.ctx.globalAlpha=this.options.opacity;this.ctx.translate(g,g);this.drawPosition(0);return this},getLayout:function(){if(this._layout){return this._layout}var p=this.options,q=p.dashes,s=p.radii,r=p.dashWidth,n=Math.min(s[0],s[1]);s=Math.max(s[0],s[1]);var m=Math.ceil(Math.max(Math.max(r,s),Math.sqrt(s*s+r/2*(r/2))));m+=p.padding;p=m;for(var g=1/q,i=[],k=0;k<q;k++){i.push((k+1)*g)}return this._layout=q={workspace:{radius:p,opacities:i},dash:{position:{top:m-s,left:m-r/2},dimensions:{width:r,height:s-n}}}},_nextPosition:f,nextPosition:function(){this._position==this.options.dashes-1&&(this._position=-1);this._position++;this.drawPosition(this._position)},drawPosition:function(i){var j=this.getLayout().workspace,g=j.radius*2,k=-1*j.radius,h=this.options.dashes;this.ctx.clearRect(k,k,g,g);g=c(360/h);j=j.opacities;if(i=i*-1){k=j.slice(0,i);i=j.slice(i,j.length).concat(k)}else{i=j}for(j=0;j<h;j++){this.drawDash(i[j],this.options.color);this.ctx.rotate(g)}},drawDash:function(i,j){this.ctx.fillStyle=e.hex2fill(j,i);var g=this.getLayout(),k=g.workspace.radius,h=g.dash.position;g=g.dash.dimensions;a.drawRoundedRectangle(this.ctx,{top:h.top-k,left:h.left-k,width:g.width,height:g.height,radius:Math.min(g.height,g.width)/2})},play:function(){if(this._state!="playing"){this._state="playing";var g=this.options.speed*1000/this.options.dashes;this._playTimer=window.setTimeout(d.Function.bind(f,this),g);return this}},pause:function(){if(this._state!="paused"){this._pause();this._state="paused";return this}},_pause:function(){this._playTimer&&(window.clearTimeout(this._playTimer),this._playTimer=null)},stop:function(){if(this._state!="stopped"){this._pause();this._position=0;this.drawPosition(0);this._state="stopped";return this}},toggle:function(){this[this._state=="playing"?"pause":"play"]();return this}}}());window.Spinner=b;Spinners.start()})(Bridge);
