//
//  Spinner
//
//  Created by murat on 2007-10-23 (or thereabouts).
//  Copyright (c) 2007 murat n konar. All rights reserved.
//

/* 
	The first spinner has id='spinner0', the next 'spinner1', and so on.
	Use CSS to position the spinner where you want it (eg. #spinner0 {....})
*/

var Spinner = new Class({

	// -------------------------------------------------------------
	//	initialize
	// -------------------------------------------------------------
	initialize: function(options) 
	{ 
		// Make sure the class is setup.
		if (!Spinner.spinners)
		{
			Spinner._spinnerClassInit()
		}

		var spinnerID = 'spinner' + Spinner.spinners.length.toString()

		this.inverted	= false // default to black spinner	
		
		if (options != undefined && options['inverted'] != undefined)
		{
			this.inverted = options['inverted']
		}

		// setup spinner node
		this.spinnerNode = new Element('img', {'class':'spinner', id: spinnerID})
		
		if (this.inverted)
		{
			this.spinnerNode.src = 'spinner/images/inverted-spinner-0.png'
		}
		else
		{
			this.spinnerNode.src	= 'spinner/images/spinner-0.png'
		}
			
		this.spinnerNode.frameNumber = 0
		this.spinnerNode.controller = this

		Spinner.spinners.push(this.spinnerNode)
		
		// Add functions to node for conveinence.
		this.spinnerNode.showSpinner = function() {
			this.controller.showSpinner()	
		}
		
		this.spinnerNode.hideSpinner = function() {
			this.controller.hideSpinner()	
		}
		
	},
	
	// -------------------------------------------------------------
	//	showSpinner
	// -------------------------------------------------------------
	showSpinner: function() 
	{
		if (!this.spinnerNode.getParent())
		{
			this.spinnerNode.containerNode.appendChild(this.spinnerNode)
			this.spinnerNode.morpher = new Fx.Morph(	this.spinnerNode, {wait: false, duration:Spinner.morphDuration, transition: Fx.Transitions.Quad.easeOut});
			this.spinnerNode.morpher.start({'width':'24px', 'height':'24px', 'padding':0})
		}
	},
	
	// -------------------------------------------------------------
	//	hideSpinner
	// -------------------------------------------------------------
	hideSpinner: function()
	{
		if (this.spinnerNode.getParent()) 
		{
			if (this.spinnerNode.containerNode == undefined)
			{
				this.spinnerNode.containerNode = this.spinnerNode.getParent()
			}
		
			var spinnerNode = this.spinnerNode
			var completionFunction = function(){
				spinnerNode.dispose() // doesn't really dispose, just removes from parent.
			}

			this.spinnerNode.morpher = new Fx.Morph(	this.spinnerNode, {wait: false, duration:Spinner.morphDuration, transition: Fx.Transitions.Quad.easeOut, onComplete:completionFunction});
			this.spinnerNode.morpher.start({'width':'2px', 'height':'2px', 'padding':'11px'})
		}
	}
});

// -------------------------------------------------------------
//	Spinner._SpinnerClassInit
// -------------------------------------------------------------
Spinner._spinnerClassInit = function (){
	// Preload the images
	Spinner.spinnerImages = new Asset.images([	'spinner/images/spinner-0.png', 
																'spinner/images/spinner-1.png', 
																'spinner/images/spinner-2.png', 
																'spinner/images/spinner-3.png', 
																'spinner/images/spinner-4.png', 
																'spinner/images/spinner-5.png', 
																'spinner/images/spinner-6.png', 
																'spinner/images/spinner-7.png', 
																'spinner/images/spinner-8.png', 
																'spinner/images/spinner-9.png', 
																'spinner/images/spinner-10.png', 
																'spinner/images/spinner-11.png',
																
																'spinner/images/inverted-spinner-0.png', 
																'spinner/images/inverted-spinner-1.png', 
																'spinner/images/inverted-spinner-2.png', 
																'spinner/images/inverted-spinner-3.png', 
																'spinner/images/inverted-spinner-4.png', 
																'spinner/images/inverted-spinner-5.png', 
																'spinner/images/inverted-spinner-6.png', 
																'spinner/images/inverted-spinner-7.png', 
																'spinner/images/inverted-spinner-8.png', 
																'spinner/images/inverted-spinner-9.png', 
																'spinner/images/inverted-spinner-10.png', 
																'spinner/images/inverted-spinner-11.png'	]
														);


	// Setup the 'heartbeat' that spins all spinners
	Spinner.spinners = new Array() // all spinners will be in this list

	Spinner.advanceFunction = function() {
											Spinner.spinners.each(function(item, index) {
												if (item.getParent()){
													item.frameNumber = (item.frameNumber+1)%12
													
													var srcbase = ''
													if (item.controller.inverted)
													{
														srcbase = 'spinner/images/inverted-spinner-'
													}
													else
													{
														srcbase = 'spinner/images/spinner-'
													}
													
													item.src = srcbase + item.frameNumber.toString() + ".png"
												}
											}, null); //optional second arg for binding, not used here
										}
	// Start spinnin'!
	Spinner.advanceFunction.periodical(75)
	
	Spinner.morphDuration = 200
}

