/**
 * Numeric Stepper
 * ------------------------------------------------
 *
 * Copyright 2007-2008 Ca Phun Ung
 *	
 * This software is licensed under the CC-GNU LGPL
 * http://creativecommons.org/licenses/LGPL/2.1/
 * 
 * Version 0.1.2  Added keyboard Accessibility enhancements. 
 *                Refactored some code.
 *                Added a few more comments.
 *                
 * Version 0.1    Alpha release
 */

/**
 * Numeric Stepper Class.
 */

window.addEvent('domready', initNumericStepper );

var NumericStepper = {	
    register : function(name, minValue, maxValue, stepSize, dvdPrice){
        this.minValue = minValue;
		this.maxValue = maxValue;
		this.stepSize = stepSize;
		this.dvdPrice = dvdPrice;
		
		var textbox = $("amount");

		if (textbox){
				
			var buttonContainer = new Element('div').injectAfter( textbox );								
			var buttonUp = new Element('a').injectInside( buttonContainer );	
			var buttonDown = new Element('a').injectInside( buttonContainer );
			var sumContainer = new Element('p').injectAfter( buttonContainer );
			
			buttonContainer.addClass("button-container");
			buttonUp.addClass("button-up");
			buttonDown.addClass("button-down");
			sumContainer.addClass("sum");
			
			buttonUp.setText("Eine DVD hinzufügen.");
			buttonDown.setText("Eine DVD entfernen.");
			sumContainer.setText("Gesamtpreis: ");
			var price = new Element("strong").injectInside(sumContainer);			
			price.setProperty("id", "price");
			
			this.setSum(1);
			
			if (textbox.value == undefined || textbox.value == '' || isNaN(textbox.value)) 
				textbox.value = 0;		
			textbox.next = (buttonUp ? buttonUp : null);		
			
			// detect key presses and restrict to numeric values only
			textbox.onkeypress = function(e){
				var keynum = (window.event ? event.keyCode : (e.which ? e.which : null));
				keychar = String.fromCharCode(keynum);
				numcheck = /[0-9\-]/;		
				switch (keynum) {
					case NumericStepper.keys.BACKSPACE :
					case NumericStepper.keys.TAB : 
                       case null : 						 
                           return true;
					default : 
					    return numcheck.test(keychar);
				}															
			};
			// detect cursor keys
               textbox.onkeyup = function(e){
                   var keynum = (window.event ? event.keyCode : (e.which ? e.which : null));
                   switch (keynum) {
                       case NumericStepper.keys.UP_ARROW : // cursor key up (increment)
                           NumericStepper.stepper(this, NumericStepper.stepSize); return true;
                       case NumericStepper.keys.DOWN_ARROW : // cursor key down (decrement)
                           NumericStepper.stepper(this, -NumericStepper.stepSize); return true;							
                       case NumericStepper.keys.RIGHT_ARROW : // cursor key right (focus on first button but only if at end of text)
                           if (this.next && typeof this.next == 'object') this.next.focus(); return true;
					default : return true;                      
                   }                                                           
               };
			textbox.onblur = function(e){
				if (parseInt(this.value) < NumericStepper.minValue)
					this.value = NumericStepper.minValue;
				if (parseInt(this.value) > NumericStepper. maxValue)
					this.value = NumericStepper.maxValue;
				NumericStepper.setSum(this.value);
			};	
			textbox.autocomplete = "off"; // turns off autocomplete in opera! 							
               if (buttonUp){this.addButtonEvent(buttonUp, textbox, this.stepUp, {next:buttonDown, prev:textbox});}
               if (buttonDown){this.addButtonEvent(buttonDown, textbox, this.stepDown, {next:null, prev:buttonUp});}                    
		}
	}	
    ,addButtonEvent:function(o, textbox, func, moveTo){
        o.textbox = textbox;
		o.moveTo = moveTo;
		// convert button type to button to prevent form submission onclick
		if (o.getAttribute("type")=="submit"){
			o.removeAttribute("type"); // IE fix
			o.setAttribute("type","button");
		}
        o.onclick = func;
		o.onkeyup = function(e) {
	        var keynum = (window.event ? event.keyCode : (e.which ? e.which : null));
	        switch (keynum) {
				// (prev object)
	            case NumericStepper.keys.UP_ARROW : 
	            case NumericStepper.keys.LEFT_ARROW : 
	                if (this.moveTo.prev && typeof this.moveTo.prev == 'object') this.moveTo.prev.focus(); break;
				// (next object)
	            case NumericStepper.keys.DOWN_ARROW : 
	            case NumericStepper.keys.RIGHT_ARROW :  
	                if (this.moveTo.next && typeof this.moveTo.next == 'object') this.moveTo.next.focus(); break;					
	        }			
		}
	}
	,setSum:function(amount){
		$('price').setText("€ " + amount * this.dvdPrice +",-");		
	}
    ,stepUp:function(){
		NumericStepper.stepper(this.textbox, NumericStepper.stepSize);
    }
    ,stepDown:function(){
		NumericStepper.stepper(this.textbox, -NumericStepper.stepSize);
    }
    ,stepper:function(textbox, val){
		if (textbox == undefined) 
		  return false;
		if (val == undefined || isNaN(val)) 
		  val = 1;
		if (textbox.value == undefined || textbox.value == '' || isNaN(textbox.value)) 
		  textbox.value = 0;
		textbox.value = parseInt(textbox.value) + parseInt(val);
		if (parseInt(textbox.value) < NumericStepper.minValue)
		  textbox.value = NumericStepper.minValue;
		if (parseInt(textbox.value) >NumericStepper. maxValue)
		  textbox.value = NumericStepper.maxValue;
		this.setSum(textbox.value);
    }
	,keys : {
        BACKSPACE: 8,
        TAB: 9,
        LEFT_ARROW: 37,
        UP_ARROW: 38,
        RIGHT_ARROW: 39,
        DOWN_ARROW: 40
    }
}

function initNumericStepper(){ 
	var myNumericStepper = NumericStepper.register("numeric-stepper", 1, 100, 1, 15); 
}

