Index: /CKEditor/branches/prototype/_dev/packager/ckpackager/includes/scriptcompressor.js
===================================================================
--- /CKEditor/branches/prototype/_dev/packager/ckpackager/includes/scriptcompressor.js	(revision 2368)
+++ /CKEditor/branches/prototype/_dev/packager/ckpackager/includes/scriptcompressor.js	(revision 2369)
@@ -75,4 +75,7 @@
 	precedence[ Token.SETNAME ] = precedence[ Token.SETPROP ] = precedence[ Token.SETELEM ] = 16;
 	precedence[ Token.COMMA ] = 17;
+	
+	//Other
+	precedence[ Token.FUNCTION ] = 100;
 
 	var noSpaceChars = {' ':1,';':1,',':1,'.':1,'(':1,')':1,'[':1,']':1,'{':1,'}':1,'?':1,':':1,'!':1,'=':1,'>':1,'<':1,'*':1,'/':1,'%':1,'+':1,'-':1,'&':1,'|':1,'^':1};
@@ -115,4 +118,34 @@
 	out.checkSpace = true;
 	out.size = 0;
+	
+	var outString = function( str )
+	{
+		var value = String( str ),
+			singleParts = value.split( "'" ),
+			doubleParts = value.split( '"' );
+
+		value = value.replace( /[\b\t\n\v\f\r\\]/g, function( match )
+			{
+				var chars =
+				{
+					'\b' : '\\b',
+					'\t' : '\\t',
+					'\n' : '\\n',
+					'\v' : '\\v',
+					'\f' : '\\f',
+					'\r' : '\\r',
+					'\\' : '\\\\'
+				};
+
+				return chars[ match ];
+			} );
+
+		if ( doubleParts.length > singleParts.length )
+			out( "'", value.replace( /'/g, "\\'" ), "'" );
+		else if ( singleParts.length > 1 )
+			out( '"', value.replace( /"/g, '\\"' ), '"' );
+		else
+			out( "'", value, "'" );
+	};
 
 	var isReserved = function( word )
@@ -120,5 +153,6 @@
 		return !!isReserved.words[ word ];
 	};
-	isReserved.words = { 'class':1,'float':1,'break':1,'else':1,'new':1,'var':1,'case':1,'finally':1,'return':1,'void':1,'catch':1,'for':1,'switch':1,'while':1,'continue':1,'function':1,'this':1,'with':1,'default':1,'if':1,'throw':1,'delete':1,'in':1,'try':1,'do':1,'instanceof':1,'typeof':1 };
+	// Taken from the ECMA-262.
+	isReserved.words = { 'break':1,'else':1,'new':1,'var':1,'case':1,'finally':1,'return':1,'void':1,'catch':1,'for':1,'switch':1,'while':1,'continue':1,'function':1,'this':1,'with':1,'default':1,'if':1,'throw':1,'delete':1,'in':1,'try':1,'do':1,'instanceof':1,'typeof':1,'abstract':1,'enum':1,'int':1,'short':1,'boolean':1,'export':1,'interface':1,'static':1,'byte':1,'extends':1,'long':1,'super':1,'char':1,'final':1,'native':1,'synchronized':1,'class':1,'float':1,'package':1,'throws':1,'const':1,'goto':1,'private':1,'transient':1,'debugger':1,'implements':1,'protected':1,'volatile':1,'double':1,'import':1,'public':1 };
 
 	var writeNode = function( node, opt )
@@ -675,5 +709,5 @@
 					hasCurly = true;
 
-				hasCurly = ( !block || ( block.getType() == Token.BLOCK && block.getFirstChild() && block.getFirstChild().getNext() ) );
+				hasCurly = ( !block || ( block.getType() == Token.BLOCK && ( !block.getFirstChild() || block.getFirstChild().getNext() ) ) );
 
 				if ( hasCurly )
@@ -691,5 +725,5 @@
 					block = block.getNext().getNext();
 
-					hasCurly = ( !block || ( block.getType() == Token.BLOCK && block.getFirstChild() && block.getFirstChild().getType() != Token.IFNE && block.getFirstChild().getNext() ) );
+					hasCurly = ( !block || ( block.getType() == Token.BLOCK && ( !block.getFirstChild() || block.getFirstChild().getType() != Token.IFNE && block.getFirstChild().getNext() ) ) );
 
 					if ( hasCurly )
@@ -709,27 +743,5 @@
 
 			case Token.STRING :
-				var value = String( node.getString() ),
-					singleParts = value.split( "'" ),
-					doubleParts = value.split( '"' );
-
-				value = value.replace( /[\n\r\t\\]/g, function( match )
-					{
-						var chars =
-						{
-							'\n' : '\\n',
-							'\r' : '\\r',
-							'\t' : '\\t',
-							'\\' : '\\\\'
-						};
-
-						return chars[ match ];
-					} );
-
-				if ( doubleParts.length > singleParts.length )
-					out( "'", value.replace( /'/g, "\\'" ), "'" );
-				else if ( singleParts.length > 1 )
-					out( '"', value.replace( /"/g, '\\"' ), '"' );
-				else
-					out( "'", value, "'" );
+				outString( node.getString() );
 				break;
 
@@ -773,6 +785,6 @@
 					var id = String( ids[ counter++ ] );
 
-					if ( !id.length || ( isNaN( id ) && ( isReserved( id ) || !/^[a-zA-Z$_][\w$_]*$/.test( id ) ) ) )
-						out( "'", id, "'" );
+					if ( isReserved( id ) || !/^(?:(?:[a-zA-Z$_][\w$_]*)|(?:\d+))$/.test( id ) )
+						outString( id );
 					else
 						out( id );
Index: /CKEditor/branches/prototype/_dev/packager/ckpackager/test/test.js
===================================================================
--- /CKEditor/branches/prototype/_dev/packager/ckpackager/test/test.js	(revision 2368)
+++ /CKEditor/branches/prototype/_dev/packager/ckpackager/test/test.js	(revision 2369)
@@ -174,5 +174,5 @@
 
 		[	"var a,x,y,r=10;with(Math){a=PI*r*r;x=r*cos(PI);y=r*sin(E/2);}",
-			"var a,b,c,d=10;with{Math){a=PI*d*d;b=d*cos(PI);c=d*sin(E/2);}" ],
+			"var a,b,c,d=10;with(Math){a=PI*d*d;b=d*cos(PI);c=d*sin(E/2);}" ],
 
 		[	"(function(A){go(A);})('Test');",
@@ -238,12 +238,16 @@
 
 		[	"(a?b:c).go();" ],
-		
+
 		[	"for(i=0;i<1;i++){}" ],
-		
+
 		[	"a in b;" ],
-		
+
 		[	"o={'':1};" ],
-		
-		[	"with(o){a=b;}" ]
+
+		[	"with(o){a=b;}" ],
+
+		[	"o={'\\b':'\\\\b','\\t':'\\\\t','\\n':'\\\\n','\\f':'\\\\f','\\r':'\\\\r','\"':'\\\\\"','\\\\':'\\\\\\\\'};" ],
+
+		[	"if(a){}else{}" ]
 	];
 
