window.AnalogMeter = function(canvasID, bgImageSrc, diameter, hand) {
	return this.init(canvasID, bgImageSrc, diameter, hand);
}

AnalogMeter.objectMap = new Array();
AnalogMeter.setupCanvas = function() {
	var canvases = document.getElementsByTagName("canvas");
	for(var i=0;i<canvases.length;i++) {
		var className = canvases[i].className;
		if(className.toLowerCase() == "analogmeter") {
			var imgsrc = canvases[i].getAttribute("imgsrc");
			var diameter = canvases[i].getAttribute("diameter");
			var hand = canvases[i].getAttribute("hand");
			var cid = canvases[i].getAttribute("id");
			AnalogMeter.objectMap[cid] = new AnalogMeter(cid, imgsrc, diameter, hand);
		}
	}
}

/*
AnalogMeter.addLoadEvent = function(func){
	var onloadFunction = window.onload;
	if(typeof window.onload != 'function') {
		window.onload = func;
	}else{
		window.onload = function() {
			func();
			onloadFunction();
		}
	}
}
*/

AnalogMeter.prototype = {
	init: function(canvasID, bgImageSrc, diameter, hand) {
		this.cid = canvasID;
		this.bgImage = new Image();
		this.diameter = diameter;
		this.hand = hand;
		this.bgImage.src = bgImageSrc;
		this.bgImage.onload = this.update(0);
		this.lastRPM = 0;
		this.handSpeed = 30;
		return this;
	},

	draw: function(context2D) {
		with(context2D) {
			drawImage(this.bgImage, 0, 0);
		}
	},

	drawHand: function(context2D, rpm) {
		with(context2D) {
			translate(this.diameter/2,this.diameter/2);
			strokeStyle = this.hand;
			lineWidth = "2";

			var angle = rpm > 1000 ? 1000 / 1200 : rpm / 1200;
			rotate(Math.PI * (2 * (angle+45/360)));
			beginPath();
			moveTo(0,0);
			var lineLength = new Number(this.diameter);
			lineLength = lineLength/4 + 5;
			lineTo(lineLength,lineLength);
			stroke();
		}
	},

	update: function(rpm) {
		this.tempRPM = rpm > 1000 ? 1000 : rpm;

		this.counter = this.handSpeed;
		var self = this;
		this.hTimer = setInterval(function(){self.timerLoop();}, 10);
	},

	timerLoop: function() {
		this.counter--;
		var context2D = document.getElementById(this.cid).getContext('2d');
		context2D.save();
		context2D.clearRect(0,0,this.diameter,this.diameter);
		if(this.counter > 0) {
			var gapSpeed = (this.lastRPM - this.tempRPM) / this.handSpeed;
			var rpm = this.lastRPM - ((this.handSpeed - this.counter) * gapSpeed);
			this.draw(context2D);
			rpm = rpm < 0 ? 0 : rpm;
			this.drawHand(context2D, rpm);
		}else{
			var rpm = this.tempRPM < 0 ? 0 : this.tempRPM;
			this.draw(context2D);
			this.drawHand(context2D, rpm);
			this.lastRPM = this.tempRPM;
			clearInterval(this.hTimer);
		}
		context2D.restore();
	}
}

//AnalogMeter.addLoadEvent(AnalogMeter.setupCanvas);
