/*
 * FluidCanvas Core - simplifying the use of canvas for frame-based animations.
 *
 * Copyright (c) 2010 Johannes Wüller
 * http://code.google.com/p/fluidcanvas/
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Requires base2 - http://code.google.com/p/base2/
 */
(function(){var FluidCanvasPackage=new base2.Package(this,{name:"FluidCanvas",version:"0.1",exports:"Utils,Canvas,Drawable,DrawableImage"});eval(this.imports);var Cache={Utils:{Dimensions:{toPixels:{}}}};var Utils={Text:{strip:function(string){string=string.replace(/^\s\s*/,'');var whitespace=/\s/;var i=string.length;while(whitespace.test(string.charAt(--i)));return string.slice(0,i+1);}},Math:{radToDeg:function(rad){return rad*180/Math.PI;},degToRad:function(deg){return deg*Math.PI/180;}},Object:{isFunction:function(obj){return Object.prototype.toString.call(obj)==='[object Function]';},merge:function(obj){for(var i=1;i<arguments.length;i++){for(var key in arguments[i]){obj[key]=arguments[i][key];}}
return obj;}},Dimensions:{toPixels:function(size){if(Cache.Utils.Dimensions.toPixels[size]){return Cache.Utils.Dimensions.toPixels[size];}else{var element=document.createElement('div');var body=document.getElementsByTagName('body')[0];body.appendChild(element);Utils.Object.merge(element.style,{position:'absolute',visibility:'hidden',border:'none',margin:'0px',padding:'0px',width:'1px',height:size});Cache.Utils.Dimensions.toPixels[size]=Math.round(element.clientHeight);body.removeChild(element);return Cache.Utils.Dimensions.toPixels[size];}}},Drawable:{allReady:function(objects){var allReady=true;for(var i=0;i<objects.length;i++){if(objects[i]instanceof Drawable&&!objects[i].ready()){allReady=false;}}
return allReady;},onAllReady:function(objects,callback,precision){precision=precision||100;Utils.Timing.loop(function(){if(Utils.Drawable.allReady(objects)){callback.call(this);return false;}},precision);}},Timing:{loop:function(callback,delay){if(callback){var delay=delay||10;var step=function(){var cont=callback.call(this);if(cont!==false){window.setTimeout(step,delay);}};step();}},FpsTracker:Base.extend({updateFrequency:null,lastTime:null,tickCount:0,fps:0,constructor:function(updateFrequency){this.updateFrequency=updateFrequency||500;this.lastTime=(new Date()).getTime()-1;},tick:function(){var now=(new Date()).getTime();var diff=now-this.lastTime;if(diff>=this.updateFrequency){this.fps=this.tickCount/diff*1000;this.lastTime=now;this.tickCount=0;}else{this.tickCount++;}},get:function(){return Math.round(this.fps);}})}};var Canvas=Base.extend({canvasElement:null,ctx:null,exCanvas:false,constructor:function(options){this.options=Utils.Object.merge({parent:null,existingCanvas:null,preserveCanvas:false,width:300,height:150,alternativeContent:'your browser does not support canvas.',backgroundStyle:'rgb(127, 127, 127)'},options||{});var canvasElement=this.options.existingCanvas||document.createElement('canvas');this.exCanvas=typeof G_vmlCanvasManager!=='undefined';if(Utils.Object.isFunction(canvasElement.getContext)||this.exCanvas){if(this.options.parent&&!this.options.existingCanvas){this.canvasElement=this.options.parent.appendChild(canvasElement);}
if(this.exCanvas){canvasElement=G_vmlCanvasManager.initElement(canvasElement);}
this.ctx=canvasElement.getContext('2d');this.resize();this.clear();}else{if(this.options.existingCanvas&&!this.options.preserveCanvas){this.options.existingCanvas.parentNode.removeChild(this.options.existingCanvas);this.options.existingCanvas=null;}
if(this.options.parent){this.options.parent.innerHTML=this.options.alternativeContent;}}},resize:function(w,h){if(this.canvasElement){w=w||this.options.width;h=h||this.options.height;this.canvasElement.setAttribute('width',w,0);this.canvasElement.setAttribute('height',h,0);this.canvasElement.style.width=w;this.canvasElement.style.height=h;this.canvasElement.width=w;this.canvasElement.height=h;if(this.exCanvas){var innerElement=this.canvasElement.childNodes[0];innerElement.style.width=w;innerElement.style.height=h;}
this.options.width=w;this.options.height=h;}},draw:function(drawableObject){if(this.ctx){var args=[this].concat(Array.prototype.slice.call(arguments).slice(1));if(drawableObject instanceof Drawable&&drawableObject.ready()){drawableObject.draw.apply(drawableObject,args);}}},clear:function(backgroundStyle){if(this.ctx){this.ctx.clearRect(0,0,this.options.width,this.options.height);this.ctx.fillStyle=backgroundStyle||this.options.backgroundStyle;this.ctx.fillRect(0,0,this.options.width,this.options.height);}}});var Drawable=Base.extend({ready:function(){return true;},draw:function(){}});var DrawableImage=Drawable.extend({imageObject:null,constructor:function(src){this.imageObject=new Image();this.imageObject.src=src;},ready:function(){return this.imageObject.complete&&this.base();},draw:function(canvas){var args=[this.imageObject].concat(Array.prototype.slice.call(arguments).slice(1));if(args.length==3){canvas.ctx.drawImage(args[0],args[1],args[2]);}else if(args.length==5){canvas.ctx.drawImage(args[0],args[1],args[2],args[3],args[4]);}else if(args.length==9){canvas.ctx.drawImage(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);}}});eval(this.exports);}());
