 				code = JS_var_this(thisVar) + '\nreturn (function(){\n' + code + '}).apply(' + thisVar + ');';
 			}
 			
-			
-			// concatenate all code inside a function wrapper
+			// Concatenate all code inside a function wrapper.
+			// The pNames Array will be empty if JSON is available.
 			code = 'function(' + pNames.join(',') + '){\n' + code + '}';
 			
-			// if there are no parameters, just run the code
-			if (pNames.length == 0)
+			if (json)
 				return ExternalInterface.call(code);
 			
-			// call the function with the specified parameters
+			// JSON is unavailable, so we settle with the flawed ExternalInterface.call() parameters feature.
 			pValues.unshift(code);
 			return ExternalInterface.call.apply(null, pValues);
 		}

			return NOT_A_NUMBER;
		}
		
		private static function _jsonReviver(key:String, value:*):*
		{
			if (value === NOT_A_NUMBER)

			}
		}
		
		/**
		 * Handles a JavaScript request.
		 * @param methodName The name of the method to call.
		 * @param paramsJson An Array of parameters to pass to the method, stringified with JSON.
		 * @return The result of calling the method, stringified with JSON.
		 */
		private static function handleJsonCall(methodName:String, paramsJson:String):String
		{
			var method:Function = registeredMethods[methodName] as Function;
			if (method == null)
				throw new Error("No such method: " + methodName);
			
			var params:Array = json.parse(paramsJson, _jsonReviver);
			var result:* = method.apply(null, params);
			var resultJson:String = json.stringify(result, _jsonReplacer);
			
			// work around unescaped backslash bug
			if (backslashNeedsEscaping)
				resultJson = resultJson.split('\\').join('\\\\');
	
			return resultJson;
		}
		
		/**
		 * Preserves primitive values not supported by JSON: undefined, NaN, Infinity, -Infinity
		 */
		private static function _jsonReplacer(key:String, value:*):*
		{
			if (value === undefined)
