/************************************************************
 * Javascript Lib V1.2
 * CONTACT: jerry.wang@clochase.com
 *
 * These are textbox with restriction
 *
 * InitializeTextbox( "TextboxID", InputType.NonnegativeInteger);
 * InitializeTextbox( "TextboxID", InputType.WholeNumber);
 * InitializeTextbox( "TextboxID", InputType.Currency); 
 ************************************************************/



$import( "Textbox.Common.js" );
$import( "Firefox.attachEvent.js" );



// the input type of the text box
InputType =
{
    NonnegativeInteger          : 0,
    WholeNumber                 : 1,
    Currency                    : 2,
    CurrencyAllowNegatives      : 3, 
    RealNumber                  : 4
};

//dollarFormat function Posted by T.J. Mannos on Google Groups
//http://groups.google.com/group/comp.lang.javascript/msg/8798ba4254b3afc5

function dollarFormat(ctrl) {
        var p=ctrl.value;

        //Tom Persing posting of Regular Expression on RegExLib.com
	    var ret=p.search(/^(\$|\-|\()?([1-9]{1}[0-9]{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\-?\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\(\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))\)$/);
	    if (ret!=-1) {
	
	
		    p = p.replace(/(\(\$)/gi,'-').replace(/(\))/gi,'').replace(/(-\$)/gi,'-').replace(/\$/gi,'').replace(/\,/gi,'');
		    
			
		    var pAb=p;
		    var pennies=0;
		    if (p<0) {
		       pAb=p*-1;
		    }
		    var pennies = (pAb - Math.floor(pAb))*100;
		    pennies = Math.round(pennies);
		    if (pennies<10)
			    pennies = '0' + pennies; // add a leading zero
		    var pstring = '.' + pennies;
		    pAb = Math.floor(pAb);   // don't need the pennies anymore.
		    while (pAb >= 1) {
			    modulus = pAb%1000;
		    pAb = Math.floor(pAb/1000);
		    if (pAb >= 1) {
		    if (modulus>=100)
			    thous = ','
		    else if (modulus>=10)
			    thous = ',0'   // add one leading zero
		    else
			    thous = ',00';   // add two leading zeros
			    }
		    else
		    thous = '';
			    thous += modulus;
		    pstring = thous + pstring;
		    }
		    pstring = '$' + pstring;
		    if (p<0) {				   pstring = '(' + pstring + ')';
		       ctrl.style.color='#FF0000';
		    } else {
		       ctrl.style.color='#000000';
		    }
						
		    return pstring;
			
			
	    } else {
		    return '-1';
	    }	
    }
    
function validateCurrency(ctrl, allowBlanks) {
    if (ctrl.value!=''&&ctrl.value!='$0.00'&&ctrl.value!='$.00') {
        var ret=dollarFormat(ctrl);
        if (ret!='-1') {
            ctrl.value=ret;
        } else {
                try {
                    setTimeout(function(){ctrl.focus();ctrl.select();return false;}, 50);
                    
                } catch (e) {
                
                }
        }
    } else {
       
       //ctrl.value = '$0.00';
      ctrl.value = '';
        
    }
}

//-------------------------------------------------------------------------
// Function Name    :InitializeTextbox
// Parameter(s)     :ctrl         the ctrl id or the ctrl instance
//                  :emType     the InputType
// Return           :bool
//-------------------------------------------------------------------------
function InitializeTextbox( ctrl, emType, onBlur)
{
                
    var obj = typeof(ctrl) == "string" ? document.getElementById(ctrl) : ctrl;
    if( obj == null )
    {
        //alert( "Error:ctrl {" + ctrl + "} does not exist!" );
        return false;    
    }
    
    obj.attachEvent( 'onkeydown', function(){ eval('__SaveKeyCode(event);') });
       
    
    // disbale the actocomplete & paste & drag & drop for IE
    if( document.all )
    {
        
   
        obj.setAttribute( "autocomplete",  "off");
        obj.onpaste = function(){ return false; };
        obj.ondrag = function(){ return false; };
        obj.ondrop = function(){ return false; };
    } 
    
    
        switch(emType)
        {
            case InputType.NonnegativeInteger:
                obj.attachEvent( 'onkeypress', function(){ eval('__AcceptNonnegativeInteger(event);'); });
                break;
                
            case InputType.WholeNumber:
                obj.attachEvent( 'onkeypress', function(){ eval('__AcceptWholeNumber(event);'); });
                break;
                
            case InputType.Currency:
                obj.attachEvent( 'onkeypress', function(){ eval('__AcceptCurrency(event, false);'); });
    
                obj.attachEvent( 'onblur', (function(p) 
                { 
		            return function(p)
		            {
		                
		                validateCurrency(obj, false);
		                
		                if (onBlur!='')
		                {
	    	                eval(onBlur);
		                }
		            };    			
	            }) (obj)
	            );
                break;     
                
           case InputType.CurrencyAllowNegatives:
                obj.attachEvent( 'onkeypress', function(){ eval('__AcceptCurrency(event, true);'); });
              
                obj.attachEvent( 'onblur', (function(p) 
                { 
		            return function()
		            {
		                validateCurrency(obj, false);
		                if (onBlur!='')
		                {
		                    eval(onBlur);
		                }
		            };    			
	            }) (obj)
	            );
                break; 
                
            case InputType.RealNumber:
                obj.attachEvent( 'onkeypress', function(){ eval('__AcceptRealNumber(event);'); });
                break;     
            
            case InputType.NonnegativeRealNumber:
                obj.attachEvent( 'onkeypress', function(){ eval('__AcceptNonnegativeReal(event);'); });
                break;               
                
            default:
                alert( "Error:unknown input type {" + emType + "}!" );
                return false; 
        }; 
    
    return true;
 }



///////////////////////////////////////////////////////////////////////////////////////////////


//-------------------------------------------------------------------------
// Function Name    :__AcceptNonnegativeInteger
// Parameter(s)     :evt        event
// Return           :bool
// Memo             :Only accepted nonnegative integer
//-------------------------------------------------------------------------
function __AcceptNonnegativeInteger(evt)
{
    if( evt.shiftKey )
    {
        __EnableKeys( evt,
            [ 
                VKeyCode.VK_LEFT,
                VKeyCode.VK_RIGHT,
                VKeyCode.VK_BACK,
                VKeyCode.VK_DELETE,
                VKeyCode.VK_NUMLOCK,
                VKeyCode.VK_HOME,
                VKeyCode.VK_END,
                VKeyCode.VK_TAB
            ]
            );
    }
    else
    {
        __EnableKeys( evt,
            [ 
                VKeyCode.VK_0,
                VKeyCode.VK_1,
                VKeyCode.VK_2,
                VKeyCode.VK_3,
                VKeyCode.VK_4,
                VKeyCode.VK_5,
                VKeyCode.VK_6,
                VKeyCode.VK_7,
                VKeyCode.VK_8,
                VKeyCode.VK_9,
                VKeyCode.VK_NUMPAD0,
                VKeyCode.VK_NUMPAD1,                     
                VKeyCode.VK_NUMPAD2,
                VKeyCode.VK_NUMPAD3,
                VKeyCode.VK_NUMPAD4,
                VKeyCode.VK_NUMPAD5,
                VKeyCode.VK_NUMPAD6,
                VKeyCode.VK_NUMPAD7,
                VKeyCode.VK_NUMPAD8,
                VKeyCode.VK_NUMPAD9,
                VKeyCode.VK_LEFT,
                VKeyCode.VK_RIGHT,
                VKeyCode.VK_BACK,
                VKeyCode.VK_DELETE,
                VKeyCode.VK_NUMLOCK,
                VKeyCode.VK_HOME,
                VKeyCode.VK_END,
                VKeyCode.VK_TAB
            ]
            );    
    }// if_else    
}// __AcceptNonnegativeInteger


//-------------------------------------------------------------------------
// Function Name    :__AcceptWholeNumber
// Parameter(s)     :evt        event
// Return           :bool
// Memo             :Accepted whole numbers
//-------------------------------------------------------------------------
function __AcceptWholeNumber(evt)
{   
    var obj = evt.srcElement == null ? evt.target : evt.srcElement;
    if( __GetKeyCode(evt) == VKeyCode.VK_SUBTRACT ||
        __GetKeyCode(evt) == VKeyCode.VK_OEM_MINUS )
    {
        if( __GetCursorStartPos(evt) == 0 &&
            __GetCursorEndPos(evt) == 0 &&
            obj.value.indexOf('-') < 0 &&
            !evt.shiftKey )
        {
            return true;
        };
        
        if( __GetCursorStartPos(evt) == 0 &&
            __GetCursorEndPos(evt) > 0 &&
            !evt.shiftKey )
        {
            return true;
        };
            
        if( evt.preventDefault ) { evt.preventDefault(); }
        evt.returnValue = false;
        return false;
    }

    return __AcceptNonnegativeInteger(evt);
}// __AcceptWholeNumber




//-------------------------------------------------------------------------
// Function Name    :__AcceptCurrency
// Parameter(s)     :evt        event
// Return           :bool
// Memo             :Accepted Currency
//-------------------------------------------------------------------------
function __AcceptCurrency(evt, allowNegative)
{
    var obj = evt.srcElement == null ? evt.target : evt.srcElement;
   
    if( evt.shiftKey )
    {
        return __EnableKeys( evt,
            [ 
                VKeyCode.VK_LEFT,
                VKeyCode.VK_RIGHT,
                VKeyCode.VK_BACK,
                VKeyCode.VK_DELETE,
                VKeyCode.VK_NUMLOCK,
                VKeyCode.VK_HOME,
                VKeyCode.VK_END,
                VKeyCode.VK_TAB
            ]
            );
    }
    
    if( __GetKeyCode(evt) == VKeyCode.VK_OEM_PERIOD ||
        __GetKeyCode(evt) == VKeyCode.VK_DECIMAL || ( __GetKeyCode(evt) == VKeyCode.VK_SUBTRACT && allowNegative==true) ||
        ( __GetKeyCode(evt) == VKeyCode.VK_OEM_MINUS && allowNegative==true) )
    {
        if( evt.shiftKey )
        {
            if( evt.preventDefault ) { evt.preventDefault(); }
            evt.returnValue = false;
            return false;
        }
            
        if( obj.value.indexOf('.') < 0 )
            return true;
            
        if( obj.value.indexOf('.') >= 0 )
        {
            if( __GetCursorStartPos(evt) <= obj.value.indexOf('.') &&
                __GetCursorEndPos(evt) >= obj.value.indexOf('.') )
            {
                return true;           
            };
           
            if( evt.preventDefault ) { evt.preventDefault(); }
            evt.returnValue = false;
            return false;
        }
        else
        {
            return true;
        }
    }
       
    
    return __AcceptNonnegativeInteger(evt);
}// __AcceptCurrency





function __AcceptNonnegativeReal(evt)
{
    if( evt.shiftKey )
    {
        __EnableKeys( evt,
            [ 
                VKeyCode.VK_LEFT,
                VKeyCode.VK_RIGHT,
                VKeyCode.VK_BACK,
                VKeyCode.VK_DELETE,
                VKeyCode.VK_NUMLOCK,
                VKeyCode.VK_HOME,
                VKeyCode.VK_END,
                VKeyCode.VK_TAB, 
                VKeyCode.VK_OEM_PERIOD, 
                VKeyCode.VK_DECIMAL
                
            ]
            );
    }
    else
    {
        __EnableKeys( evt,
            [ 
                VKeyCode.VK_0,
                VKeyCode.VK_1,
                VKeyCode.VK_2,
                VKeyCode.VK_3,
                VKeyCode.VK_4,
                VKeyCode.VK_5,
                VKeyCode.VK_6,
                VKeyCode.VK_7,
                VKeyCode.VK_8,
                VKeyCode.VK_9,
                VKeyCode.VK_NUMPAD0,
                VKeyCode.VK_NUMPAD1,                     
                VKeyCode.VK_NUMPAD2,
                VKeyCode.VK_NUMPAD3,
                VKeyCode.VK_NUMPAD4,
                VKeyCode.VK_NUMPAD5,
                VKeyCode.VK_NUMPAD6,
                VKeyCode.VK_NUMPAD7,
                VKeyCode.VK_NUMPAD8,
                VKeyCode.VK_NUMPAD9,
                VKeyCode.VK_LEFT,
                VKeyCode.VK_RIGHT,
                VKeyCode.VK_BACK,
                VKeyCode.VK_DELETE,
                VKeyCode.VK_NUMLOCK,
                VKeyCode.VK_HOME,
                VKeyCode.VK_END,
                VKeyCode.VK_TAB, 
                VKeyCode.VK_OEM_PERIOD, 
                VKeyCode.VK_DECIMAL
            ]
            );    
    }// if_else    
}// __AcceptNonnegativeInteger


//-------------------------------------------------------------------------
// Function Name    :__AcceptWholeNumber
// Parameter(s)     :evt        event
// Return           :bool
// Memo             :Accepted whole numbers
//-------------------------------------------------------------------------
function __AcceptRealNumber(evt)
{   
    var obj = evt.srcElement == null ? evt.target : evt.srcElement;
    if( __GetKeyCode(evt) == VKeyCode.VK_SUBTRACT ||
        __GetKeyCode(evt) == VKeyCode.VK_OEM_MINUS )
    {
        if( __GetCursorStartPos(evt) == 0 &&
            __GetCursorEndPos(evt) == 0 &&
            obj.value.indexOf('-') < 0 &&
            !evt.shiftKey )
        {
            return true;
        };
        
        if( __GetCursorStartPos(evt) == 0 &&
            __GetCursorEndPos(evt) > 0 &&
            !evt.shiftKey )
        {
            return true;
        };
            
        if( evt.preventDefault ) { evt.preventDefault(); }
        evt.returnValue = false;
        return false;
    }

    return __AcceptNonnegativeReal(evt);
}// __AcceptWholeNumber


