Spinner = function(name, parentDiv, w, h, autoSumInterval) {
	this.name = name;

	this.minValue 	= 0;
	this.maxValue	= 100;
	this.Decimal	= 2;
	
	this.incrementValue = 1;
	this.PrevValueValid = this.minValue;
	this.autoSumInterval = autoSumInterval;
	
	// Html elements
	this.html = new Object();
	
	this.html.parentDiv = parentDiv;
	if (this.html.parentDiv == null) { this.html.parentDiv = document.body; }	
	
	this.html.div = document.createElement('div');
	this.html.parentDiv.appendChild(this.html.div);
	this.html.div.style.position = 'absolute';
	
	this.html.inputField = document.createElement('input');
	this.html.div.appendChild(this.html.inputField);
	
	this.html.inputField.userData = new Object(); this.html.inputField.userData.name = this.name;
	this.userData = this.html.inputField.userData;
	this.html.inputField.style.position = 'absolute';
	this.html.inputField.style.padding = '0px 2px 0px 2px';
	
	this.html.inputField.onblur = function() { var oTmp = eval(this.userData.name); oTmp.validateOnBlur(); };
	
	this.btnIncrement = new Button(this.name + '["btnIncrement"]', this.html.div, 18, 10, false);
	this.btnIncrement.setImage('/images/album_designer/btnSpinnerI.gif');
	this.btnIncrement.setPosition(this.html.inputField.offsetWidth, 0);
	this.btnIncrement.setEventHandlerData('number', this.incrementValue);
	this.btnIncrement.setEventHandler('down', 'setIntervalAutoSum', this);
	this.btnIncrement.setEventHandler('out', 'clearIntervalAutoSum', this);
	this.btnIncrement.setEventHandler('up', 'clearIntervalAutoSum', this);
	this.btnIncrement.setEventHandler('over', 'clearIntervalAutoSum', this);
	
	this.btnDecrement = new Button(this.name + '["btnDecrement"]', this.html.div, 18, 10, false);
	this.btnDecrement.setImage('/images/album_designer/btnSpinnerD.gif');
	this.btnDecrement.setPosition(this.html.inputField.offsetWidth, 31);
	this.btnDecrement.setEventHandlerData('number', - this.incrementValue);
	this.btnDecrement.setEventHandler('down', 'setIntervalAutoSum', this);
	this.btnDecrement.setEventHandler('out', 'clearIntervalAutoSum', this);
	this.btnDecrement.setEventHandler('up', 'clearIntervalAutoSum', this);
	this.btnDecrement.setEventHandler('over', 'clearIntervalAutoSum', this);

	this.disabled = false;	
	this.autoSumTimer = null;
	this.bChangeOnAutoSum = false;
	
	this.setPosition(0, 0);

	this.setSize(w, h);
	this.setValue(this.PrevValueValid, false);
	
	this.eventTarget = this.html.inputField;
	this.oComponent = new component(this.name + '.oComponent', this);
}

Spinner.prototype = {
	setValue : function(iValue, bEvent, bOnBlur){
		if (this.disabled == true) { return; }
		iValue = this.validate(iValue, bOnBlur);
		this.html.inputField.value = Number(iValue).toFixed(this.Decimal);
		
		//dbg.add('this.name: ' + this.name + ' - this.PrevValueValid: ' + this.PrevValueValid + ' - iValue: ' + iValue + ' - this.autoSumTimer: ' + this.autoSumTimer);		
		if (this.PrevValueValid != iValue && (this.autoSumTimer == null || this.bEventOnChange == true )) {
			this.PrevValueValid = iValue;
			//dbg.add('<font color="orange">this.name: ' + this.name + ' - this.PrevValueValid != iValue</font>');
			if (bEvent == true) { 
				//dbg.add('<font color="red">this.name: ' + this.name + ' - change</font>');
				var e = new Object();
				this.setExtarEvents(e, 'change'); 
			}
		}			
	},
	
	getValue : function(){
		return Number(this.html.inputField.value);
	},	
	
	setIntervalAutoSum : function(e){
		if (!e) e = normalizeEvent(window.event);
		this.bChangeOnAutoSum = false;
		this.iSum = e.target.userData.number;
		this.autoSumTimer =  window.setInterval(this.name + ".sum();", this.autoSumInterval);
	},
	
	clearIntervalAutoSum : function(){
		var bTimer = false;
		if (this.autoSumTimer != null) { bTimer = true; }
		window.clearInterval(this.autoSumTimer); this.autoSumTimer = null;
		if (bTimer == true) { 
			if (this.bChangeOnAutoSum == false) {
				this.bChangeOnAutoSum = true;
				this.sum();
			}
			else {
				if (this.PrevValueValid != this.getValue()) { this.sum(0); }
			}
		}
	},

	sum : function(iSum) {
		if (iSum == null) { iSum = this.iSum; }
		iValue = Number(this.getValue()) + Number(iSum);
		this.setValue(iValue, true);
	},
	
	validate : function(iValue, bKeypress) {
		if (isNaN(iValue)) { return this.PrevValueValid; }
		if (iValue < this.minValue) { return (bKeypress == true ? this.PrevValueValid : this.minValue); }
		if (iValue > this.maxValue) { return (bKeypress == true ? this.PrevValueValid : this.maxValue); }
		return iValue;
	},
	
	validateOnBlur : function(){
		//dbg.add('<font color="blue">this.name: ' + this.name + ' - BLUR</font>');
		this.setValue(this.html.inputField.value, true, true);
	},

	setSize : function(w, h) {
		this.w = w;
		this.h = h;
		
		this.html.div.style.width  = this.w + 'px';
		this.html.div.style.height = this.h + 'px';
		
		this.html.inputField.style.width = (this.w-this.btnIncrement.w)  + 'px';
		this.html.inputField.style.height = this.h + 'px';
		
		this.html.inputField.style.top = '0px';
		this.html.inputField.style.left = '0px';

		this.btnIncrement.setPosition(this.w - 12, 0);
		this.btnDecrement.setPosition(this.w - 12, (this.h / 2)+1);
	},
	
	getSize : function() {
		return {height: this.h, width: this.w};
	},
	
	setPosition : function(x, y) {
		this.x = x; this.y = y;
		this.html.div.style.left = this.x + 'px';
		setPositionAbsoluteTop(this.html.div, this.y);
	},
	
	setDisabled : function(disabled) {
		this.disabled = disabled;
		if (this.disabled == true) {
			this.btnIncrement.setState('disabled');
			this.btnDecrement.setState('disabled');
			this.html.inputField.disabled = true;
			this.html.inputField.style.backgroundColor = '#dfdfdf';
		}
		else {
			this.btnIncrement.setState('up');
			this.btnDecrement.setState('up');
			this.html.inputField.disabled = false;
			this.html.inputField.style.backgroundColor = 'transparent';
		}
	},

	getDisabled : function() {
		return this.disabled;
	},
	
	setVisibility : function(bValue) {
		this.html.div.style.display = (bValue == false ? 'none' : 'block');
		this.visible = bValue;
	},

	setIncrementValue : function(incrementValue){
		this.incrementValue = incrementValue;
		this.btnIncrement.setEventHandlerData('number', this.incrementValue);
		this.btnDecrement.setEventHandlerData('number', - this.incrementValue);
	},
	
	setLabel : function(sCaption, w, h, lblPositions){
		if (this.oLabel == null) {
			this.oLabel = new Label(this.name + '.oLabel', this.html.parentDiv, w, h, sCaption, this );
		} 
		else {
			this.oLabel.setSize(w, h);
			this.oLabel.setCaption(sCaption);
		}
		this.oLabel.setParentObjPosition(lblPositions);
		
		return this.oLabel;
	},
	
	setToolTip : function(sText) {
		if (this.oToolTip == null) {
			this.oToolTip = new ToolTip(this.name + '.oToolTip', this.html.div, sText, this);
		} 
		else {
			this.oToolTip.setCaption(sCaption);
		}
		this.html.div.userData = this.html.inputField.userData;
		this.html.div.onmouseover = function() { var oTmp = eval(this.userData.name); oTmp.oToolTip.show(); };
		this.html.div.onmouseout = function() { var oTmp = eval(this.userData.name); oTmp.oToolTip.hidden(); };
		return this.oToolTip;
	}
}
