DDI.Web.NumberBox = 
	function(el)
	{
		if (arguments.length > 0)
		{
			this.init(el);
		}
	}

DDI.Web.NumberBox.prototype = new DDI.Web.TextBox();
DDI.Web.NumberBox.prototype.constructor = DDI.Web.TextBox;
DDI.Web.NumberBox.superclass = DDI.Web.TextBox.prototype;

DDI.Web.NumberBox.prototype.init = 
	function(el) {  
		DDI.Web.NumberBox.superclass.init.call(this, el);

		YAHOO.util.Event.addListener(this.el, 'blur', DDI.Web.NumberBox.OnBlur);
		YAHOO.util.Event.addListener(this.el, 'keypress', DDI.Web.NumberBox.OnKeyPress);
	}

DDI.Web.NumberBox.FormatValue =
	function(value, numDigitsAfterDecimal, groupDigits, useParensForNegativeNumbers, includeLeadingDigit)
	{
		// convert leading open parens to negative symbol, if present
		
		var re = /^\(/g;
		var returnValue = value.replace(re, '-');

	  // remove any non-numeric characters
	  
		re = /[^\d\-\.]/g;
		returnValue = returnValue.replace(re, '');
			
		// determine after decimal portion

		var decimalPosition = returnValue.indexOf('.');
		var wholePart = returnValue;
		var decimalPart = '0';
		var groupLength = 3;

		if (numDigitsAfterDecimal > 0)
		{
			if (decimalPosition > -1)
			{
				wholePart = returnValue.substr(0, decimalPosition);
				decimalPart = returnValue.substring(decimalPosition+1, returnValue.length);
			}	
			if (decimalPart.length < numDigitsAfterDecimal) // pad the decimal portion if not enough digits entered
			{
				var tempDecimalPart = decimalPart;
				for (var i=0; i<numDigitsAfterDecimal - tempDecimalPart.length; i++)
				{
					decimalPart += '0';
				}
			}
			if (decimalPart.length > numDigitsAfterDecimal) // truncate the decimal portion if too large
				decimalPart = decimalPart.substring(0,numDigitsAfterDecimal);
		}
		
		// determine comma separated whole number prior to decimal portion

		if (wholePart.substring(0,1) == '-') groupLength = 4;
		
 		returnValue = '';
		if (groupDigits)
		{
		  while (wholePart.length > groupLength) 
		  {
			  returnValue = ',' + wholePart.substr(wholePart.length - 3,3) + returnValue;
			  wholePart = wholePart.substr(0, wholePart.length - 3);
		  }
		}
		
		returnValue = wholePart + returnValue;			
		
		if (includeLeadingDigit && numDigitsAfterDecimal > 0 && (returnValue.length == 0  || returnValue == '-'))
			returnValue += '0';

		// piece together the various parts
		
		if (numDigitsAfterDecimal > 0) 
			returnValue += '.' + decimalPart;
		
		// display negatives with parens if desired
		
		re = /^-/g;
		if (useParensForNegativeNumbers && returnValue.substring(0,1) == '-')
			returnValue = returnValue.replace(re, '(') + ')';
		
		return returnValue;
	}

DDI.Web.NumberBox.OnBlur = 
	function(e)
	{
		var el = YAHOO.util.Event.getTarget(e);		
		if (el.value == '') return true;
		
		var numDigitsAfterDecimal = DDI.Web.GetAttribute('int', el, 'decimals', 0);
		var groupDigits = DDI.Web.GetAttribute('boolean', el, 'group', true);
		var useParensForNegativeNumbers = DDI.Web.GetAttribute('boolean', el, 'useparens', true);
		var includeLeadingDigit = DDI.Web.GetAttribute('boolean', el, 'leadingzero', true);
		el.value = DDI.Web.NumberBox.FormatValue(el.value, numDigitsAfterDecimal, groupDigits, useParensForNegativeNumbers, includeLeadingDigit);
		
		return true;
	}

DDI.Web.NumberBox.OnKeyPress = 
	function(e)
	{
		var el = YAHOO.util.Event.getTarget(e);
		var kc = YAHOO.util.Event.getCharCode(e);
		var st = DDI.Web.Selection.text;

		var numDigitsAfterDecimal = DDI.Web.GetAttribute('int', el, 'decimals', 0);

	  // let all special keys to pass through
	  
		if (kc < 32) return true;
		
		// wipe out the selected text
		
		DDI.Web.TextBox.ClearSelection(el);
			
	  var decimalPosition = el.value.indexOf('.');
	  
	  // if it is a numeric character and 
	  // we have not exceeded the number of digits allowed after the decimal point
		if (kc >= 48 && kc <= 57)
		{
		  if (decimalPosition > -1 && el.value.length > (decimalPosition + numDigitsAfterDecimal)) 
		  {
			if (e.preventDefault) e.preventDefault();
				return false;
			}
		  return true;
		}

		switch (kc)
		{
		  case 40:
		  
			// if they are trying to enter an open parens, it can only be the first character

			if (el.value.length > 0 || el.value.indexOf('(') > -1)
			{
	    		if (e.preventDefault) e.preventDefault();
					return false;
				}
		  break;
	 
 		  case 45:
		  
			// if they are trying to enter a hyphen, it can only be the first character

			if (el.value.length > 0 || el.value.indexOf('-') > -1)
			{
	    		if (e.preventDefault) e.preventDefault();
					return false;
				}
		  break;
	      
		  case 46:
		  
			// if they are trying to enter a decimal point, only allow one
			if (numDigitsAfterDecimal == 0) 
			{
	    		if (e.preventDefault) e.preventDefault();
					return false;
				}
			else if (decimalPosition > -1)
		  {
      		if (e.preventDefault) e.preventDefault();
					return false;
				}
			break;
		    
 		  default:
 				return false;
			break;
		}
			 
		return true;
		
	}
	