      *  @langversion 3.0
      *  @playerversion Flash 9
      *  @playerversion AIR 1.1
-     *  @productversion Flex 3
+     *  @productversion Flex 4
      */
     public static function restrict(str:String, restrict:String):String
-	{
-		// A null 'restrict' string means all characters are allowed.
+    {
+        // A null 'restrict' string means all characters are allowed.
         if (restrict == null)
-			return str;
-			
-		// An empty 'restrict' string means no characters are allowed.
+            return str;
+            
+        // An empty 'restrict' string means no characters are allowed.
         if (restrict == "")
-			return "";
-			
-		// Otherwise, we need to test each character in 'str'
+            return "";
+            
+        // Otherwise, we need to test each character in 'str'
         // to determine whether the 'restrict' string allows it.
         var charCodes:Array = [];
-		
-		var n:int = str.length;
-		for (var i:int = 0; i < n; i++)
-		{
-			var charCode:uint = str.charCodeAt(i);
-			if (testCharacter(charCode, restrict))
-				charCodes.push(charCode);
-		}
-		
-		return String.fromCharCode.apply(null, charCodes);
-	}
-							
-	/**
+        
+        var n:int = str.length;
+        for (var i:int = 0; i < n; i++)
+        {
+            var charCode:uint = str.charCodeAt(i);
+            if (testCharacter(charCode, restrict))
+                charCodes.push(charCode);
+        }
+        
+        return String.fromCharCode.apply(null, charCodes);
+    }
+                            
+    /**
      *  @private
      *  Helper method used by restrict() to test each character
      *  in the input string against the restriction string.

     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public static function repeat(str:String, n:int):String
    {

     */
    private static function testCharacter(charCode:uint,
                                          restrict:String):Boolean
    {
        var allowIt:Boolean = false;
        
        var inBackSlash:Boolean = false;
        var inRange:Boolean = false;
        var setFlag:Boolean = true;
        var lastCode:uint = 0;
                        
        var n:int = restrict.length;
        var code:uint;
        
        if (n > 0)
        {
            code = restrict.charCodeAt(0);
            if (code == 94) // caret
                allowIt = true;
        }
        
        for (var i:int = 0; i < n; i++)
        {
            code = restrict.charCodeAt(i)
            
            var acceptCode:Boolean = false;
            if (!inBackSlash)
            {
                if (code == 45) // hyphen
                    inRange = true;
                else if (code == 94) // caret
                    setFlag = !setFlag;
                else if (code == 92) // backslash
                    inBackSlash = true;
                else
                    acceptCode = true;
            }
            else
            {
                acceptCode = true;
                inBackSlash = false;
            }
            
            if (acceptCode)
            {
                if (inRange)
                {
                    if (lastCode <= charCode && charCode <= code)
                        allowIt = setFlag;
                    inRange = false;
                    lastCode = 0;
                }
                else
                {
                    if (charCode == code)
                        allowIt = setFlag;
                    lastCode = code;
                }
            }
        }
        
        return allowIt;
    }
}

}
