//**************************************************************************
//		Copyright  Sybase, Inc. 1998-1999
//						 All Rights reserved.
//
//	Sybase, Inc. ("Sybase") claims copyright in this
//	program and documentation as an unpublished work, versions of
//	which were first licensed on the date indicated in the foregoing
//	notice.  Claim of copyright does not imply waiver of Sybase's
//	other rights.
//
//	 This code is generated by the PowerBuilder HTML DataWindow generator.
//	 It is provided subject to the terms of the Sybase License Agreement
//	 for use as is, without alteration or modification.  
//	 Sybase shall have no obligation to provide support or error correction 
//	 services with respect to any altered or modified versions of this code.  
//
//       ***********************************************************
//       **     DO NOT MODIFY OR ALTER THIS CODE IN ANY WAY       **
//       ***********************************************************
//
//       ***************************************************************
//       ** IMPLEMENTATION DETAILS SUBJECT TO CHANGE WITHOUT NOTICE.  **
//       **            DO NOT RELY ON IMPLEMENTATION!!!!		      **
//       ***************************************************************
//
// Use the public interface only.
// Checkout, if this works in all "decimal point is comma" regions 
//       Arnd Schmidt (www.dwox.com)
//**************************************************************************
function DW_FloatParse(inString)
{
    var result = new DW_NumberClass();
    
    if (DW_parseNumberStringAgainstMask(inString, result, true))
    {
        return result.number;
    }
    else
        return null;
}
function DW_IntParse(inString)
{
    var result = new DW_NumberClass();
    
    if (DW_parseNumberStringAgainstMask(inString, result, false))
    {
        return result.number;
    }
    else
        return null;
}
function DW_parseNumberStringAgainstMask(inString, outNumber, bFloat)
{
	var Mask = gMask;
    
	var format;
	var	bNegative = false;
	
	// try special case first
	if (Mask == "") // unformatted data
	{
		var n = 0;
		if (bFloat)
			n = parseFloat(inString);
		else
			n = parseInt(inString);
		
		if (isNaN(n))
			return false;
		if(outNumber != null)
			outNumber.number = n;
		
		return true;
	}		
	
	if (Mask.toLowerCase() == "[currency]")
	{
		bFloat = true; 
		if (inString.charAt(0) == DW_negCurrencyFormat.charAt(0))
		{
			format = new DW_NumberEncodingClass(DW_negCurrencyFormat, DWFMT_section_positive);
			bNegative = true;
		}
		else
			format = new DW_NumberEncodingClass(DW_posCurrencyFormat, DWFMT_section_positive);
	}
	else
    {
        var semiOffset;
        semiOffset = Mask.indexOf(";");
        if (semiOffset != -1)
            {
            format = new DW_NumberEncodingClass(Mask.substring(0, semiOffset), DWFMT_section_positive);
            Mask = Mask.substring(0, semiOffset);
            }
        else
           format = new DW_NumberEncodingClass(Mask, DWFMT_section_positive);
    }
    
    if(!format.bValid)
		return false;
	
	
	// Create a new number class
	var nm = new DW_NumberClass();
	var STATESECTION = 0;
	var STATENUMBER = 1;
	var STATEDECIMAL = 2;
	var STATEASIS = 3;
	var currChar;
	var charIndex = 0;
	var state;
	var prvState;
	var isInteger = false;
	var key;			// To hold number and strings
	var nVal;			// To store integer value
	
    var index = 0;
    var encodedFormat = format.encodedFormat;
    var action;
    
	while (charIndex < inString.length && index < encodedFormat.length)
	{
		// Initialize
		state = prvState = STATESECTION;
		key = "";
		nVal = 0;
		// Extract one token from inString
		do{
			currChar = inString.charAt (charIndex);
			if (state == STATESECTION)
			{
				if (currChar == ',')
					state = STATEDECIMAL;
				
				else if (allowInString(currChar, "1234567890+-"))
					state = STATENUMBER;
				
				else
					state = STATEASIS;
			}
			else if (state == STATEDECIMAL)
			{
				if(bFloat != true)
					isInteger = true;
				key += currChar;
				charIndex++;
				state = STATESECTION;       // Change state for next char
				prvState = STATEDECIMAL;
			}
			else if(state == STATENUMBER)
			{
				if((key == "") && ((currChar == '-') || (currChar == '+')))
				{
					if (currChar == '-')
						bNegative = true;
					charIndex++;
				}
				else
				{
					key += currChar;
					charIndex++;
					
					// Skip comma character
					if(inString.charAt (charIndex) == '.')
					{
						charIndex++;
						
						// Next character should be a digit
						if(!DW_parseIsDigit(inString.charAt (charIndex)))
							return false;
					}
					
					if (!DW_parseIsDigit(inString.charAt (charIndex)))
					{
						state = STATESECTION;       // Change state for next char
						prvState = STATENUMBER;
						nVal = key - 0;
					}
				}
			}
			else if (state == STATEASIS)
			{
				key += currChar;
				charIndex++;
				if (allowInString (inString.charAt (charIndex), "1234567890,+-"))
				{
					state = STATESECTION;       // Change state for next char
					prvState = STATEASIS;
				}
			}
			else
			{
				return false;        // Unspecified error
			}
		}while(charIndex < inString.length && state != STATESECTION)
		// Now extract one token from encode string
		
		action = 0;
		if( index < encodedFormat.length)
		{
            action = encodedFormat[index];
			index++;
		}
		
		if ((typeof action == "string") && (prvState != STATEASIS))
		{
			// Skip ASIS Format
            action = encodedFormat[index];
			index++;
		}
		
		if ((action == DWFMT_integer || action == DWFMT_integer_comma) && (prvState == STATEDECIMAL))
		{
			// Skip Integer Action
            action = encodedFormat[index+2];
			index+=3;
			if (action != DWFMT_decimal)
				return false;
		}
        if (typeof action == "string")
		{
			if (key != action)
				return false;
		}
		else if(action == DWFMT_decimal)
		{
            if (key != ",")
				return false;
		}
		else if(action == DWFMT_integer || action == DWFMT_integer_comma)
		{
            numReq = encodedFormat[index];	index ++;
            numOpt = encodedFormat[index];	index ++;
            
			if (!format.bMult100 && (key.length > numReq + numOpt)) 
				return false;
			nm.number = nVal;
		}
        else if (action == DWFMT_fraction)
		{
            numReq = encodedFormat[index];	index ++;
            numOpt = encodedFormat[index];	index ++;
            if (key.length > numReq + numOpt)
				return false;
				
			var tString = "." + key;
			
			nm.number += tString;
		}
	}
	if (bNegative)
		nm.number *= -1;
 	if(nm.number == 0)
		nm.number = "0.0"
	if (format.bMult100) 
		nm.number = nm.number/100.0;
	if (isInteger)
		nm.number = Math.floor(nm.number);
	if(outNumber != null)
		outNumber.number = nm.number;
	return true;
}
//
// Number formatting code
//
var DWFMT_integer_comma = 1;
var DWFMT_integer = 2;
var DWFMT_fraction = 3;
var DWFMT_decimal = 4;
var DWFMT_exp_integer_comma = 5;
var DWFMT_exp_integer = 6;
var DWFMT_exp_fraction = 7;
var DWFMT_exp_exp = 8;
var DWFMT_exp_sign = 9;
var DWFMT_exp_sign_opt = 10;
var DWFMT_general = 11;
var DWFMT_asis_digit = 12;
var DWFMT_type_normal = 1;
var DWFMT_type_exp = 2;
var DWFMT_type_percent = 3;
var DWFMT_type_asis = 4;
var DWFMT_section_positive = 0;
var DWFMT_section_negative = 1;
var DWFMT_section_zero = 2;
var DWFMT_section_null = 3;
function DW_NumberEncodingClass(inString,section)
{
var STATE_START = 1;
var STATE_LEFTDEC = 2;
var STATE_RIGHTDEC = 3;
var STATE_TESTASIS = 4;
var STATE_ASIS = 5;
    var index;
    var currState = STATE_START;
    var currChar;
    var encodedFormat = new Array();
    var accum = "";
    var numInSection;
    var offset = 0;
    var bValid = true;
    // state flags
    var bOnLeft = true;
    var bDidLeft = false;
    var bOnExp = false;
    var bCommas = false;
    var reqDigits = 0;
    var optDigits = 0;
    var totDigits = 0;
    var numDecPlaces = 0;
    
    // misc variable
    var nextChar;
    var nextNextChar;
    
    this.encodedFormat = encodedFormat;
    this.color = "";
    this.bMult100 = false;
    this.maskType = DWFMT_type_normal;
    this.bGeneral = false;
    
    var strLen = inString.length;
    for (index=0; index <= strLen && bValid; )
        {
        if (index < strLen)
            currChar = inString.charAt(index);
        else
            currChar = "";
        if (currState == STATE_START)
            {
            // handle keywords
            if (currChar == "[")
                {
                if (accum != "")
                    encodedFormat[offset++] = accum;
                accum = "";
                index++;
                for (; inString.charAt(index) != "]"; index++)
                    accum += inString.charAt(index);
                index++; // skip ]
                var inlineEncoding = null;
                var keyword = accum.toUpperCase();
                if (keyword == "GENERAL")
                    {
                    encodedFormat[offset++] = DWFMT_general;
                    this.bGeneral = true;
                    }
                else if (keyword == "CURRENCY")
                    {
                    if (section == DWFMT_section_positive || section == DWFMT_section_null)
                        inlineEncoding = new DW_NumberEncodingClass(DW_posCurrencyFormat, section);
                    else if(section == DWFMT_section_negative)
                        inlineEncoding = new DW_NumberEncodingClass(DW_negCurrencyFormat, section);
                    else
                        bValid = false;
                    }
                else
                    {
					if (!parseInt(accum)) 
						this.color = accum.toLowerCase();
					else
						this.color = eval(accum);
                    this.keyword = accum;
                    }
                // if we build another format, inline it into current one
                if (inlineEncoding != null && inlineEncoding.bValid)
                    {
                    var innerFormat = inlineEncoding.encodedFormat;
                    for (var j=0; j<innerFormat.length; j++)
                        encodedFormat[offset++] = innerFormat[j];
                    }
                accum = "";
                }
            else if (currChar == "#")
                {
                if (accum != "")
                    encodedFormat[offset++] = accum;
                accum = "";
                if (bOnLeft && bDidLeft)
                    currState = STATE_TESTASIS;
                else if(bOnLeft)
                    currState = STATE_LEFTDEC;
                else
                    currState = STATE_RIGHTDEC;
                // reset accumulators
                reqDigits = 0;
                totDigits = 0;
                optDigits = 0;
                bCommas = false;
                }
            else if (currChar == "0")
                {
                if (accum != "")
                    encodedFormat[offset++] = accum;
                accum = "";
                if (bOnLeft && bDidLeft)
                    currState = STATE_TESTASIS;
                else if(bOnLeft)
                    currState = STATE_LEFTDEC;
                else
                    currState = STATE_RIGHTDEC;
                // reset accumulators
                reqDigits = 0;
                totDigits = 0;
                optDigits = 0;
                bCommas = false;
                }
            else if (currChar == ".")
                {
                if (accum != "")
                    encodedFormat[offset++] = accum;
                accum = "";
                index++;
                if (bOnLeft)
                    {
                    encodedFormat[offset++] = DWFMT_decimal;
                    bOnLeft = false;
                    }
                // we want only 1 period char!
                else
                    bValid = false;
                }
            else if (currChar == "e" || currChar == "E")
                {
                accum += currChar;
                index++;
                nextChar = inString.charAt(index);
                nextNextChar = inString.charAt(index+1);
                if ((nextChar == "-" || nextChar == "+") &&
                     (nextNextChar == "#" || nextNextChar == "0"))
                    {
                    bOnExp = true;
                    bOnLeft = false;
                    if (nextChar == "+")
                        encodedFormat[offset++] = DWFMT_exp_sign;
                    else
                        encodedFormat[offset++] = DWFMT_exp_sign_opt;
                    // correct prior encodings
                    for (i=0; i < encodedFormat.length;i++)
                        {
                        if (typeof encodedFormat[i] == "number")
                            {
                            var lastFormat = encodedFormat[i];
                            if (lastFormat == DWFMT_integer_comma)
                                {
                                encodedFormat[i] = DWFMT_exp_integer_comma;
                                i += 2;
                                }
                            else if (lastFormat == DWFMT_integer)
                                {
                                encodedFormat[i] = DWFMT_exp_integer;
                                i += 2;
                                }
                            else if (lastFormat == DWFMT_fraction)
                                {
                                encodedFormat[i] = DWFMT_exp_fraction;
                                i += 2;
                                }
                            }
                        }
                    }
                if (this.maskType == DWFMT_type_normal)
                    this.maskType = DWFMT_type_exp;
                else
                    bValid = false;
                }
            else if (currChar == "-")
                {
                // we will allow it to be the first char of the negative section
                if (section == DWFMT_section_negative && 
                        offset == 0 && accum == "")
                    {
                    accum += currChar;
                    index++;
                    }
                else
                    currState = STATE_TESTASIS;
                }
            else if (currChar == "%")
                {
                accum += currChar;
                index++;
                if (this.maskType == DWFMT_type_normal)
                    {
                    this.maskType = DWFMT_type_percent;
                    this.bMult100 = true;
                    }
                else
                    bValid = false;
                }
            else if (currChar == "\\")
                {
                index++;
                accum += inString.charAt(index++);
                }
            else if (currChar == "'")
                {
                index++;
                while (index < strLen)
                    {
                    currChar = inString.charAt(index);
                    if (currChar == "'")
                        break;
                    accum += currChar;
                    index++;
                    }
                // check if we fell off end before finding closing quotes
                if (index == strLen)
                    bValid = false;
                index++; // skip trailing '
                }
            else
                {
                accum += currChar;
                index++;
                }
            }
        else if (currState == STATE_LEFTDEC)
            {
            nextChar = inString.charAt(index+1);
            if (currChar == "#")
                {
                optDigits++;
                if(!bOnExp)
                    totDigits++;
                index++;
                }
            else if(currChar == "0")
                {
                reqDigits++;
                if(!bOnExp)
                    totDigits++;
                index++;
                }
            else if(currChar == "," &&
                    (nextChar == "#" || nextChar == "0"))
                {
                bCommas = true;
                index++;
                }
            else
                {
                if (bCommas)
                    encodedFormat[offset++] = DWFMT_integer_comma;
                else
                    encodedFormat[offset++] = DWFMT_integer;
                encodedFormat[offset++] = reqDigits;
                encodedFormat[offset++] = optDigits;
                currState = STATE_START;
                }
            }
        else if (currState == STATE_RIGHTDEC)
            {
            if (currChar == "#")
                {
                numDecPlaces++;
                optDigits++;
                if(!bOnExp)
                    totDigits++;
                index++;
                }
            else if(currChar == "0")
                {
                numDecPlaces++;
                reqDigits++;
                if(!bOnExp)
                    totDigits++;
                index++;
                }
            else
                {
                if (bOnExp)
                    encodedFormat[offset++] = DWFMT_exp_exp;
                else
                    encodedFormat[offset++] = DWFMT_fraction;
                encodedFormat[offset++] = reqDigits;
                encodedFormat[offset++] = optDigits;
                currState = STATE_START;
                }
            }
        else if (currState == STATE_TESTASIS)
            {
            // convert to asis form
            for (i=0; i < encodedFormat.length && bValid;i++)
                {
                if (typeof encodedFormat[i] == "number")
                    {
                    if (encodedFormat[i] == DWFMT_integer)
                        {
                        encodedFormat[i] = DWFMT_asis_digit;
                        i += 2;
                        }
                    else
                        bValid = false;
                    }
                }
            this.maskType = DWFMT_type_asis;
            currState = STATE_ASIS;
            }
        else if (currState == STATE_ASIS)
            {
            if (currChar == "#" || currChar == "0")
                {
                totDigits++;
                if (accum != "")
                    encodedFormat[offset++] = accum;
                accum = "";
                encodedFormat[offset++] = DWFMT_asis_digit;
                encodedFormat[offset++] = 1; // 1 required char
                encodedFormat[offset++] = 0; // no optional
                }
            else
                accum += currChar;
            index++;
            }
        }
    if (accum != "")
        encodedFormat[offset++] = accum;
    this.totalDigits = totDigits;
	if (encodedFormat.length == 0 ) 
		bValid = false;
    this.bValid = bValid;
    this.numDecPlaces = numDecPlaces;
}
function DW_NumberClass(number)
{
    if (arguments.length == 0)
        number = 0.0;
        
    this.number = number;
}
function DW_NumberFormatClass(formatString)
{
    this.negativeFormat = null;
    this.zeroFormat = null;
    this.nullFormat = null;
    // try special case first
    if (formatString.toLowerCase() == "[currency]")
        {
        this.positiveFormat = new DW_NumberEncodingClass(DW_posCurrencyFormat, DWFMT_section_positive);
        this.negativeFormat = new DW_NumberEncodingClass(DW_negCurrencyFormat, DWFMT_section_negative);
        this.bValid = this.positiveFormat.bValid && this.negativeFormat.bValid;
        }
    else
        {
        var bValid = true;
        var semiOffset;
        semiOffset = formatString.indexOf(";");
        if (semiOffset != -1)
            {
            this.positiveFormat = new DW_NumberEncodingClass(formatString.substring(0, semiOffset), DWFMT_section_positive);
            formatString = formatString.substring(semiOffset+1, formatString.length);
            semiOffset = formatString.indexOf(";");
            if (semiOffset != -1)
                {
                this.negativeFormat = new DW_NumberEncodingClass(formatString.substring(0, semiOffset), DWFMT_section_negative);
                formatString = formatString.substring(semiOffset+1, formatString.length);
                semiOffset = formatString.indexOf(";");
                if (semiOffset != -1)
                    {
                    this.zeroFormat = new DW_NumberEncodingClass(formatString.substring(0, semiOffset), DWFMT_section_zero);
                    this.nullFormat = new DW_NumberEncodingClass(formatString.substring(semiOffset+1, formatString.length), DWFMT_section_null);
                    bValid = bValid && this.nullFormat.bValid;
                    }
                else
                    this.zeroFormat = new DW_NumberEncodingClass(formatString, DWFMT_section_zero);
                bValid = bValid && this.zeroFormat.bValid;
                }
            else
                this.negativeFormat = new DW_NumberEncodingClass(formatString, DWFMT_section_negative);
            bValid = bValid && this.negativeFormat.bValid
            }
        else
            this.positiveFormat = new DW_NumberEncodingClass(formatString, DWFMT_section_positive);
        this.bValid = bValid && this.positiveFormat.bValid;
        }
}
function DW_FormatNumber(formatString, value, control)
{
    var numberFormat = new DW_NumberFormatClass(formatString);
    var result = "";
    var strValue, dotOffset, exponentOffset;
    var bRequireNegative = false;
    var bNegative = false;
    var format;
    
    if (numberFormat.bValid)
        {
        if (value == null)
            {
            if (numberFormat.nullFormat != null)
                format = numberFormat.nullFormat;
            else
                format = null;
            }
        else if (value < 0)
            {
            bNegative = true;
            if (numberFormat.negativeFormat != null)
                format = numberFormat.negativeFormat;
            else
                {
                format = numberFormat.positiveFormat;
                bRequireNegative = true; // mask will not contain negative
                }
            }
        else if (value > 0)
            format = numberFormat.positiveFormat;
        else // == 0
            {
            if (numberFormat.zeroFormat != null)
                format = numberFormat.zeroFormat;
            else
                format = numberFormat.positiveFormat;
            }
        // if not format, we just return ""
        if (format != null)
            {
            var index;
            var encodedFormat = format.encodedFormat;
            var action;
            var numReq, numOpt, numDigitsLeft, numDigitsRight, i, commaDigit;
            var accum;
            var asIsOffset = 0;
            
            if (format.bMult100 && value != null)
                value *= 100;
            // round to proper number of decimal places
            if (value != null && ! format.bGeneral)
                value = DW_Round (value, format.numDecPlaces);
            // convert the value to a string
            if (value != null)
                strValue = value.toString();
            else
                strValue = "";
            // strip off leading minus
            if (strValue.charAt(0) == "-")
                strValue = strValue.substring(1,strValue.length);
                
            dotOffset = strValue.indexOf(".");
            if (dotOffset == -1)
                {
                numDigitsLeft = strValue.length;
                numDigitsRight = 0;
                }
            else
                {
                numDigitsLeft = dotOffset;
                numDigitsRight = strValue.length - dotOffset - 1;
                }
            
            for (index=0; index < encodedFormat.length ; index++)
                {
                action = encodedFormat[index];
                if (typeof action == "string")
                    result += action;
                else if (action == DWFMT_integer_comma)
                    {
                    numReq = encodedFormat[index + 1];
                    numOpt = encodedFormat[index + 2];
                    index += 2;
                    if (bRequireNegative)
                        result += "-";
                    if (numDigitsLeft < numReq)
                        {
                        commaDigit = numReq - 1;
                        for (i=0;i< numReq-numDigitsLeft;i++,commaDigit--)
                            {
                            result += "0";
                            if (commaDigit % 3 == 0 && commaDigit != 0)
                                result += DW_thousandsChar;
                            }
                        }
                    else
                        commaDigit = numDigitsLeft - 1;
                                                    
                    for (i=0; i < numDigitsLeft; i++,commaDigit--)
                        {
                        result += strValue.charAt(i);
                        if (commaDigit % 3 == 0 && commaDigit != 0)
                            result += DW_thousandsChar;
                        }
                        
                    }
                else if (action == DWFMT_integer)
                    {
                    numReq = encodedFormat[index + 1];
                    numOpt = encodedFormat[index + 2];
                    index += 2;
                    if (numDigitsLeft < numReq)
                        {
                        for (i=0;i< numReq-numDigitsLeft;i++)
                            result += "0";
                        }
                    for (i=0; i < numDigitsLeft; i++)
                        result += strValue.charAt(i);
                    }
                else if (action == DWFMT_fraction)
                    {
                    numReq = encodedFormat[index + 1];
                    numOpt = encodedFormat[index + 2];
                    index += 2;
                    for (i=0; i < numDigitsRight; i++)
                        result += strValue.charAt(dotOffset + 1 + i);
                    if (numDigitsRight < numReq)
                        {
                        for (i=0; i < numReq - numDigitsRight; i++)
                            result += "0";
                        }
                    }
                else if (action == DWFMT_asis_digit)
                    {
                    numReq = encodedFormat[index + 1];
                    numReq += encodedFormat[index + 2];
                    index += 2;
                    for (i=0; i< numReq; i++)
                        {
                        result += strValue.charAt (asIsOffset);
                        asIsOffset++;
                        }
                    }
                else if (action == DWFMT_decimal)
                    {
                    result += DW_decimalChar;
                    }
                else if (action == DWFMT_general)
                    {
                    if (value != null)
                        result += value.toString();
                    }
                // won't deal with exponents for now
                else if (action == DWFMT_exp_integer_comma)
                    {
                    }
                else if (action == DWFMT_exp_integer)
                    {
                    }
                else if (action == DWFMT_exp_fraction)
                    {
                    }
                else if (action == DWFMT_exp_exp)
                    {
                    }
                else if (action == DWFMT_exp_sign)
                    {
                    }
                else if (action == DWFMT_exp_sign_opt)
                    {
                    }
                }
            }
        }
    else if ( value != null )
		// Simulating a [general] format.
        result = value.toString();
	else
		result = "";
	if (this.bStylePositioning && format && format.bValid)  
        if ( format.color == "" || typeof format.color == "string" )
            control.style.color = format.color;
        else
            control.style.color = convertToRGB( format.color );
    return result;
}
function DW_Fact(n)
{
    var result = 1;
    if (n == null)
        result = null;
    else
        {
        var intN = Math.floor(n);
        // must be an integer and in range
        if (intN != n || intN <= 0 || intN >= 171)
            result = null;
        else
            {
            for (var i = 1; i <= n ; i++)
                result *= i;
            }
        }
    return result;
}
function DW_Sign(n)
{
    var result;
    if (n < 0) 
        result = -1;
    else if (n == 0)
        result = 0;
    else
        result = 1;
    return result;
}
function DW_Truncate(num, decPlaces)
{
	var powTen = Math.pow(10.0,decPlaces);
	num *= powTen;
	if (num >= 0)
	    num = Math.floor(num + 0.000000000000005);
	else
	    num = Math.ceil(num - 0.000000000000005);
    return num / powTen;
}
		- Sources
 - pb9webeasy
 - WebTarget
 - Source
 - NumberFormat.js
 
			File: NumberFormat.js
Size: 31978
Date: Sat, 08 Dec 2007 15:37:13 +0100
Type: js
		
		Size: 31978
Date: Sat, 08 Dec 2007 15:37:13 +0100
Type: js