Index: /CKPackager/trunk/_dev/build.bat
===================================================================
--- /CKPackager/trunk/_dev/build.bat	(revision 3147)
+++ /CKPackager/trunk/_dev/build.bat	(revision 3147)
@@ -0,0 +1,16 @@
+@echo off
+
+if "%ANT_HOME%"=="" goto noAntHome
+if "%JAVA_HOME%"=="" goto noJavaHome
+call "%ANT_HOME%\bin\ant.bat" exe
+call "%ANT_HOME%\bin\ant.bat" clean
+goto end
+
+:noAntHome
+echo ANT_HOME environment variable is not set
+goto end
+
+:noJavaHome
+echo JAVA_HOME environment variable is not set
+
+:end
Index: /CKPackager/trunk/_dev/build.xml
===================================================================
--- /CKPackager/trunk/_dev/build.xml	(revision 3147)
+++ /CKPackager/trunk/_dev/build.xml	(revision 3147)
@@ -0,0 +1,73 @@
+<project name="packager" default="exe" basedir="../">
+	<property name="build.dir" location="build" />
+	<property name="bin.dir" location="bin" />
+	<property name="rhino.jar" location="_dev/_thirdparty/rhino/js.jar" />
+	<property name="source.dir" location="_source" />
+	<property name="launch4j.dir" location="_dev/_thirdparty/launch4j" />
+
+	<target name="init">
+		<tstamp />
+		<mkdir dir="${build.dir}" />
+		<mkdir dir="${build.dir}/ckpackager" />
+	</target>
+
+	<target name="compile" depends="init" description="compile js">
+		<java fork="yes" classname="org.mozilla.javascript.tools.jsc.Main" failonerror="true">
+			<arg value="-debug" />
+			<arg value="-package" />
+			<arg value="ckpackager" />
+			<arg value="${source.dir}/ckpackager.js" />
+		</java>
+		<java fork="yes" classname="org.mozilla.javascript.tools.jsc.Main" failonerror="true">
+			<arg value="-debug" />
+			<arg value="-package" />
+			<arg value="ckpackager.includes" />
+			<arg value="${source.dir}/includes/ckpackager.js" />
+			<arg value="${source.dir}/includes/packagefile.js" />
+			<arg value="${source.dir}/includes/packager.js" />
+			<arg value="${source.dir}/includes/parser.js" />
+			<arg value="${source.dir}/includes/scope.js" />
+			<arg value="${source.dir}/includes/scriptcompressor.js" />
+			<arg value="${source.dir}/includes/token.js" />
+		</java>
+	</target>
+
+	<target name="copy" depends="compile" description="copy files">
+		<copy file="${source.dir}/ckpackager/ckpackager.class" tofile="${build.dir}/ckpackager/ckpackager.class" overwrite="true" />
+		<copy todir="${build.dir}/ckpackager">
+			<fileset dir="${source.dir}/includes/ckpackager" />
+		</copy>
+		<copy file="${rhino.jar}" tofile="${build.dir}/ckpackager.jar" overwrite="true" />
+	</target>
+
+	<target name="jar" depends="copy" description="update the jar">
+		<!-- Put everything in ${build.dir} into a jar file -->
+		<jar jarfile="${build.dir}/ckpackager.jar" update="true">
+			<fileset dir="${build.dir}">
+				<include name="**/*.class" />
+			</fileset>
+			<manifest>
+				<attribute name="Main-Class" value="ckpackager.ckpackager" />
+			</manifest>
+		</jar>
+	</target>
+
+	<target name="exe" depends="jar">
+		<taskdef name="launch4j" classname="net.sf.launch4j.ant.Launch4jTask" classpath="${launch4j.dir}/launch4j.jar:${launch4j.dir}/lib/xstream.jar" />
+		<launch4j>
+			<config headerType="console" jar="${build.dir}/ckpackager.jar" outfile="${build.dir}/ckpackager.exe" errTitle="CKPackager" chdir="." customProcName="true">
+				<singleInstance mutexName="net.sf.launch4j.example.ConsoleApp" />
+				<jre minVersion="1.4.0" />
+			</config>
+		</launch4j>
+	</target>
+
+	<target name="clean" description="clean up">
+		<copy file="${build.dir}/ckpackager.exe" tofile="${bin.dir}/ckpackager.exe" overwrite="true" />
+		<copy file="${build.dir}/ckpackager.jar" tofile="${bin.dir}/ckpackager.jar" overwrite="true" />
+		<delete dir="${source.dir}/ckpackager" />
+		<delete dir="${source.dir}/includes/ckpackager" />
+		<delete dir="${build.dir}" />
+	</target>
+
+</project>
Index: /CKPackager/trunk/_dev/jslint/lint.conf
===================================================================
--- /CKPackager/trunk/_dev/jslint/lint.conf	(revision 3146)
+++ /CKPackager/trunk/_dev/jslint/lint.conf	(revision 3147)
@@ -118,4 +118,7 @@
 +define importPackage
 +define importClass
++define CompilerEnvirons
++define Node
++define Token
 
 # Java Packages
@@ -124,8 +127,32 @@
 
 # Java Classes
++define BufferedReader
++define BufferedWriter
++define DocumentBuilderFactory
++define DOMSource
++define Integer
++define InputStreamReader
++define InputStreamWriter
++define JavaAdapter
 +define File
++define FileInputStream
++define FileOutputStream
++define FileWriter
++define OutputKeys
++define OutputStreamWriter
++define Packages
++define Pattern
++define StreamResult
++define StringBuffer
++define StringWriter
 +define System
-+define BufferedWriter
-+define FileWriter
++define TarEntry
++define TarGzOutputStream
++define TransformerFactory
++define ZipEntry
++define ZipOutputStream
+
+
++define CKPACKAGER
 
 ### Interactive
@@ -143,6 +170,6 @@
 +recurse
 
-+process ../../ckpackager.js
-+process ../../_samples.js
-+process ../../includes.js
-+process ../../test.js
++process ../../_source/ckpackager.js
++process ../../_source/includes/*.js
++process ../../_samples/*.js
++process ../../test/*.js
Index: /CKPackager/trunk/_samples/basic/run.bat
===================================================================
--- /CKPackager/trunk/_samples/basic/run.bat	(revision 3146)
+++ /CKPackager/trunk/_samples/basic/run.bat	(revision 3147)
@@ -9,7 +9,3 @@
 ECHO.
 
-:: Show call stack on errors.
-java -jar ../../js.jar -opt -1 ../../ckpackager.js basic.pack
-
-:: Best performance.
-:: java -jar ../../js.jar -opt 1 ../../ckpackager.js basic.pack
+java -jar ../../bin/ckpackager.jar basic.pack
Index: /CKPackager/trunk/_source/ckpackager.js
===================================================================
--- /CKPackager/trunk/_source/ckpackager.js	(revision 3146)
+++ /CKPackager/trunk/_source/ckpackager.js	(revision 3147)
@@ -2,5 +2,5 @@
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
+ */
 
 importPackage( org.mozilla.javascript );
@@ -11,8 +11,50 @@
 importClass( java.io.FileWriter );
 
-var jarPath = JavaAdapter(org.mozilla.javascript.Parser)["class"].getResource("/org/mozilla/javascript").toString();
-var packagerPath = jarPath.replaceFirst( "^jar:", '' ).replaceFirst( "\/js\.jar\!\/org\/mozilla\/javascript$", '');
+/*
+ * Check if we're running the compiled version of this script. If yes, the
+ * ckpackager class should be available.
+ */
+var isCompiled = true;
+var command = "java -jar js.jar ckpackager.js";
+var resource = JavaAdapter( org.mozilla.javascript.Parser )["class"].getResource( "/org/mozilla/javascript" ).toString();
 
-load( packagerPath + "/includes/ckpackager.js" );
+try
+{
+	java.lang.Class.forName( "ckpackager.ckpackager" );
+}
+catch ( e )
+{
+	isCompiled = false;
+}
+
+if ( isCompiled )
+{
+	var quit = function()
+	{
+		System.exit( 0 );
+	};
+
+	loadClass( "ckpackager.includes.ckpackager" );
+
+	if ( resource.indexOf( ".exe" ) != -1 )
+		command = "ckpackager.exe";
+	else
+		command = "java -jar ckpackager.jar";
+}
+else
+{
+	var packagerPath = resource.replaceFirst( "^jar:", '' ).replaceFirst( "\/js\.jar\!\/org\/mozilla\/javascript$", '' )
+			.replaceAll( "_dev.{1}_thirdparty.{1}rhino", "" );
+
+	load( packagerPath + "_source/includes/ckpackager.js" );
+	CKPACKAGER.path = packagerPath;
+}
+
+if ( !arguments[0] || arguments[0] == '-help' || arguments[0] == '/?')
+	error( '\nUsage: ' + command + ' sample.pack [-v]' +
+			'\n\n -v    Show the files being worked on as CKPackager is running.' +
+			'\n       Display detailed exception information when an error occurs.');
+
+CKPACKAGER.isCompiled = isCompiled;
 
 function error( msg )
@@ -23,7 +65,10 @@
 }
 
+if ( arguments.length > 1 && ( arguments[arguments.length - 1] == '-v' || arguments[arguments.length - 1] == '--verbose' ) )
+	CKPACKAGER.verbose = 1;
+
 if ( arguments[0] == '-dump' )
 {
-	CKPACKAGER.loadCode( 'includes/parser.js' );
+	CKPACKAGER.load( 'ckpackager.includes.parser' );
 	CKPACKAGER.parser.dumpThree( CKPACKAGER.tools.readFile( arguments[1] ) );
 	quit();
@@ -31,5 +76,5 @@
 else if ( arguments[0] == '-compress' )
 {
-	CKPACKAGER.loadCode( 'includes/scriptcompressor.js' );
+	CKPACKAGER.load( 'ckpackager.includes.scriptcompressor' );
 
 	var compressed = CKPACKAGER.scriptCompressor.compress( CKPACKAGER.tools.readFile( arguments[1] ) );
@@ -45,16 +90,12 @@
 	quit();
 }
-else if ( arguments[0] == '-test' )
+else if ( arguments[0] == '-test' && !isCompiled )
 {
-	CKPACKAGER.loadCode( 'test/test.js' );
+	load( packagerPath + "/test/test.js" );
 	quit();
 }
 
 CKPACKAGER.packFile = arguments[0];
-
-if ( !CKPACKAGER.packFile )
-	error( 'Usage:java -jar js.jar ckpackager.js sample.pack' );
-
-CKPACKAGER.packDir = (function()
+CKPACKAGER.packDir = ( function()
 {
 	var packFile = new File( CKPACKAGER.packFile );
@@ -64,9 +105,9 @@
 
 	return packFile.getParent() || './';
-})();
+} )();
 
 CKPACKAGER.outputDir = CKPACKAGER.packDir;
 
-CKPACKAGER.loadCode( 'includes/packager.js' );
+CKPACKAGER.load( 'ckpackager.includes.packager' );
 
 //for ( var o in CKPACKAGER )
@@ -75,8 +116,30 @@
 // print( String( System.getProperties() ).replace( /,/g, '\n') );
 
-(function()
+( function()
 {
-	var packager = new CKPACKAGER.packager();
-	packager.loadDefinitionFile( CKPACKAGER.packFile );
-	packager.run();
-})();
+	try
+	{
+		var packager = new CKPACKAGER.packager();
+		packager.loadDefinitionFile( CKPACKAGER.packFile );
+		packager.run();
+	}
+	catch ( e )
+	{
+		if ( CKPACKAGER.verbose )
+		{
+			if ( typeof ( e.rhinoException ) != 'undefined' )
+			{
+				e.rhinoException.printStackTrace();
+				quit();
+			}
+			else if ( typeof ( e.javaException ) != 'undefined' )
+			{
+				e.javaException.printStackTrace();
+				quit();
+			}
+		}
+
+		print( "" );
+		error( e );
+	}
+} )();
Index: /CKPackager/trunk/_source/includes/ckpackager.js
===================================================================
--- /CKPackager/trunk/_source/includes/ckpackager.js	(revision 3146)
+++ /CKPackager/trunk/_source/includes/ckpackager.js	(revision 3147)
@@ -6,9 +6,7 @@
 var CKPACKAGER =
 {
-	dir : (function()
-		{
-			var packagerDir = new File( System.getProperty( 'java.class.path' ) );
-			return packagerDir.getParent();
-		})(),
+	isCompiled : false,
+	path : "",
+	verbose : 0,
 
 	getPackPath : function( relativePath )
@@ -32,19 +30,30 @@
 	_loadedCode : {},
 
-	loadCode : function( path )
+	load : function( className )
 	{
-		if ( this._loadedCode[ path ] )
+		if ( this._loadedCode[className] )
 			return;
 
-		load( CKPACKAGER.getPackagerPath( path ) );
+		if ( CKPACKAGER.isCompiled )
+		{
+			loadClass( className );
+		}
+		else
+		{
+			load( CKPACKAGER.path + '_source/' + className.replace( /^ckpackager\./, '' ).replace( '.', "/" ) + '.js' );
+		}
 
-		this._loadedCode[ path ] = true;
+		this._loadedCode[className] = true;
 	},
 
 	tools :
 	{
-		readFile : function( file )
+		readFile : function( filePath )
 		{
-			var data = readFile( file, "UTF-8" );
+			var file = new File( filePath );
+			if ( !file.exists() )
+				error( '\nFile does not exist: ' + file.getCanonicalPath() );
+
+			var data = readFile( filePath, "UTF-8" );
 
 			// Remove the UTF-8 BOM.
Index: /CKPackager/trunk/_source/includes/packagefile.js
===================================================================
--- /CKPackager/trunk/_source/includes/packagefile.js	(revision 3146)
+++ /CKPackager/trunk/_source/includes/packagefile.js	(revision 3147)
@@ -7,5 +7,5 @@
 importClass( java.io.FileWriter );
 
-CKPACKAGER.loadCode( 'includes/scriptcompressor.js' );
+CKPACKAGER.load( 'ckpackager.includes.scriptcompressor' );
 
 CKPACKAGER.packageFile = function( outputFile )
@@ -34,5 +34,6 @@
 			var file = this.files[ i ];
 
-			print( '    Adding ' + CKPACKAGER.tools.getFileName( file ) );
+			if ( CKPACKAGER.verbose )
+				print( '    Adding ' + CKPACKAGER.tools.getFileName( file ) );
 
 			source.push( CKPACKAGER.tools.readFile( file ), '\n' );
@@ -58,14 +59,15 @@
 			out.write( compressed );
 			out.close();
-	    }
-	    catch ( e )
-	    {
+		}
+		catch ( e )
+		{
 			throw e;
-	    }
+		}
 
 		print( '' );
 		print( '    Number of files processed: ' + this.files.length );
 		print( '    Original size............: ' + source.length + ' bytes' );
-		print( '    Output file size.........: ' + compressed.length + ' bytes (' + Math.round( compressed.length / source.length * 100 ) + '% of original)' );
+		print( '    Output file size.........: ' + compressed.length + ' bytes ('
+				+ Math.round( compressed.length / source.length * 100 ) + '% of original)' );
 		print( '' );
 	}
Index: /CKPackager/trunk/_source/includes/packager.js
===================================================================
--- /CKPackager/trunk/_source/includes/packager.js	(revision 3146)
+++ /CKPackager/trunk/_source/includes/packager.js	(revision 3147)
@@ -4,5 +4,5 @@
 */
 
-CKPACKAGER.loadCode( 'includes/packagefile.js' );
+CKPACKAGER.load( 'ckpackager.includes.packagefile' );
 
 CKPACKAGER.packager = function()
@@ -18,10 +18,21 @@
 
 		// Evaluate the package definition, moving its contents to CKPACKAGER.packDefinition.
-		var packCode = 'var pack = { ' + CKPACKAGER.tools.readFile( filePath ) + '\n};';
+		var packCode = 'var pack = { ' + CKPACKAGER.tools.readFile( file ) + '\n};';
 
 		var cx = Context.enter(),
 			scope = cx.initStandardObjects();
 
-		cx.evaluateString( scope, packCode, file.getName(), 1, null );
+		try
+		{
+			cx.evaluateString( scope, packCode, file.getName(), 1, null );
+		}
+		catch ( e )
+		{
+			if ( CKPACKAGER.verbose && typeof ( e.rhinoException ) != 'undefined' )
+				e.rhinoException.printStackTrace();
+
+			error( '\nParsing package file failed:\n    Error: ' + e.message + '\n    File: ' + file.getAbsolutePath()
+					+ '\n    Line: ' + e.lineNumber );
+		}
 
 		this.loadDefinition( scope.pack );
Index: /CKPackager/trunk/_source/includes/parser.js
===================================================================
--- /CKPackager/trunk/_source/includes/parser.js	(revision 3146)
+++ /CKPackager/trunk/_source/includes/parser.js	(revision 3147)
@@ -4,8 +4,7 @@
 */
 
-load( '../includes/token.js' );
+CKPACKAGER.load( 'ckpackager.includes.token' );
 
 importPackage( org.mozilla.javascript );
-
 importClass( java.io.File );
 importClass( java.io.FileReader );
@@ -98,5 +97,5 @@
 
 		indentation = indentation.substr( 1 );
-	}
+	};
 
 	CKPACKAGER.parser =
Index: /CKPackager/trunk/_source/includes/scriptcompressor.js
===================================================================
--- /CKPackager/trunk/_source/includes/scriptcompressor.js	(revision 3146)
+++ /CKPackager/trunk/_source/includes/scriptcompressor.js	(revision 3147)
@@ -10,6 +10,6 @@
 importClass( java.io.FileReader );
 
-CKPACKAGER.loadCode( 'includes/scope.js' );
-CKPACKAGER.loadCode( 'includes/token.js' );
+CKPACKAGER.load( 'ckpackager.includes.scope' );
+CKPACKAGER.load( 'ckpackager.includes.token' );
 
 (function()
@@ -141,5 +141,5 @@
 			doubleParts = value.split( '"' );
 
-		value = value.replace( /[\b\t\n\v\f\r\\]/g, function( match )
+		value = value.replace( /[\b\t\x\n\v\f\r\\]/g, function( match )
 			{
 				var chars =
@@ -151,5 +151,6 @@
 					'\f' : '\\f',
 					'\r' : '\\r',
-					'\\' : '\\\\'
+					'\\' : '\\\\',
+					'\x' : '\\x'
 				};
 
Index: /CKPackager/trunk/test/test.bat
===================================================================
--- /CKPackager/trunk/test/test.bat	(revision 3146)
+++ /CKPackager/trunk/test/test.bat	(revision 3147)
@@ -8,3 +8,3 @@
 ECHO.
 
-java -jar ../js.jar -opt -1 ../ckpackager.js -test
+java -jar ../_dev/_thirdparty/rhino/js.jar -opt -1 ../_source/ckpackager.js -test
Index: /CKPackager/trunk/test/test.js
===================================================================
--- /CKPackager/trunk/test/test.js	(revision 3146)
+++ /CKPackager/trunk/test/test.js	(revision 3147)
@@ -4,5 +4,5 @@
 */
 
-CKPACKAGER.loadCode( 'includes/scriptcompressor.js' );
+CKPACKAGER.load( 'ckpackager.includes.scriptcompressor' );
 
 (function()
