Index: /CKReleaser/trunk/_dev/build.bat
===================================================================
--- /CKReleaser/trunk/_dev/build.bat	(revision 3154)
+++ /CKReleaser/trunk/_dev/build.bat	(revision 3154)
@@ -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: /CKReleaser/trunk/_dev/build.xml
===================================================================
--- /CKReleaser/trunk/_dev/build.xml	(revision 3154)
+++ /CKReleaser/trunk/_dev/build.xml	(revision 3154)
@@ -0,0 +1,138 @@
+<project name="releaser" default="exe" basedir="../">
+	<property name="bin.dir" location="bin" />
+	<property name="tmp.dir" location="tmp" />
+	<property name="build.dir" location="tmp/build" />
+	<property name="launch4j.dir" location="_dev/_thirdparty/launch4j" />
+	<property name="ckpackager.dir" location="_source/ckpackager" />
+	<property name="source.dir" location="_source" />
+	<property name="json.dir" location="_dev/_thirdparty/json" />
+	<property name="rhino.jar" location="_dev/_thirdparty/rhino/js.jar" />
+	<property name="tar.jar" location="_dev/_thirdparty/javatar/tar.jar" />
+	<property name="yui.jar" location="_dev/_thirdparty/yui/yuicompressor.jar" />
+	<property name="activation.jar" location="_dev/_thirdparty/jaf/activation.jar" />
+
+	<target name="init">
+		<tstamp />
+		<delete dir="${build.dir}" />
+		<mkdir dir="${build.dir}/ckreleaser/includes" />
+		<mkdir dir="${build.dir}/ckpackager/includes" />
+		<mkdir dir="${build.dir}/tools/json" />
+	</target>
+
+	<target name="compile" depends="init" description="compile js">
+		<!-- ckreleaser -->
+		<java fork="yes" classname="org.mozilla.javascript.tools.jsc.Main" failonerror="true">
+			<arg value="-debug" />
+			<arg value="-package" />
+			<arg value="ckreleaser" />
+			<arg value="${source.dir}/ckreleaser.js" />
+		</java>
+		<java fork="yes" classname="org.mozilla.javascript.tools.jsc.Main" failonerror="true">
+			<arg value="-debug" />
+			<arg value="-package" />
+			<arg value="ckreleaser.includes" />
+			<arg value="${source.dir}/includes/ckreleaser.js" />
+			<arg value="${source.dir}/includes/docsprocessor.js" />
+			<arg value="${source.dir}/includes/io.js" />
+			<arg value="${source.dir}/includes/releaser.js" />
+			<arg value="${source.dir}/includes/samplesprocessor.js" />
+			<arg value="${source.dir}/includes/skinprocessor.js" />
+			<arg value="${source.dir}/includes/tools.js" />
+			<arg value="${source.dir}/includes/xml.js" />
+		</java>
+		<!-- ckpackager -->
+		<java fork="yes" classname="org.mozilla.javascript.tools.jsc.Main" failonerror="true">
+			<arg value="-debug" />
+			<arg value="-package" />
+			<arg value="ckpackager" />
+			<arg value="${ckpackager.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="${ckpackager.dir}/includes/ckpackager.js" />
+			<arg value="${ckpackager.dir}/includes/packagefile.js" />
+			<arg value="${ckpackager.dir}/includes/packager.js" />
+			<arg value="${ckpackager.dir}/includes/parser.js" />
+			<arg value="${ckpackager.dir}/includes/scope.js" />
+			<arg value="${ckpackager.dir}/includes/scriptcompressor.js" />
+			<arg value="${ckpackager.dir}/includes/token.js" />
+		</java>
+		<!-- json -->
+		<java fork="yes" classname="org.mozilla.javascript.tools.jsc.Main" failonerror="true">
+			<arg value="-debug" />
+			<arg value="-package" />
+			<arg value="tools.json" />
+			<arg value="${json.dir}/json2.js" />
+		</java>
+	</target>
+
+	<!--
+	During compilation if -package option is used, file is located automatically in a subdirectory based on the package name,
+	that's why for example we have anther tools/json subdirectory inside ot tools/json directory.
+	 -->
+	<target name="copy" depends="compile" description="copy files">
+		<!-- ckreleaser -->
+		<copy file="${source.dir}/ckreleaser/ckreleaser.class" tofile="${build.dir}/ckreleaser/ckreleaser.class" overwrite="true" />
+		<copy todir="${build.dir}/ckreleaser">
+			<fileset dir="${source.dir}/includes/ckreleaser" />
+		</copy>
+		<!-- json -->
+		<copy file="${json.dir}/tools/json/json2.class" tofile="${build.dir}/tools/json/json2.class" overwrite="true" />
+		<!-- ckpackager -->
+		<copy file="${ckpackager.dir}/ckpackager/ckpackager.class" tofile="${build.dir}/ckpackager/ckpackager.class" overwrite="true" />
+		<copy todir="${build.dir}/ckpackager">
+			<fileset dir="${ckpackager.dir}/includes/ckpackager" />
+		</copy>
+		<!-- Rhino jar file that will be updated -->
+		<copy file="${rhino.jar}" tofile="${tmp.dir}/ckreleaser.jar" overwrite="true" />
+	</target>
+
+	<target name="unpack" depends="copy" description="merge all jar files into one">
+		<unjar src="${activation.jar}" dest="${build.dir}" />
+		<unjar src="${tar.jar}" dest="${build.dir}" />
+		<unjar src="${yui.jar}" dest="${build.dir}" />
+		<!-- Leave mailcap.default and mimetypes.default from META-INF attached to activation.jar -->
+		<delete includeemptydirs="true">
+			<fileset dir="${build.dir}/META-INF" excludes="**/*.default" />
+		</delete>
+		<!-- Remove Rhino classes included in yuicompressor.jar -->
+		<delete dir="${build.dir}/org/mozilla" />
+	</target>
+
+	<target name="jar" depends="unpack" description="update the jar">
+		<!-- Put everything in ${build.dir} into a jar file -->
+		<jar jarfile="${tmp.dir}/ckreleaser.jar" update="true">
+			<fileset dir="${build.dir}">
+				<include name="**/*" />
+			</fileset>
+			<manifest>
+				<attribute name="Main-Class" value="ckreleaser.ckreleaser" />
+			</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="${tmp.dir}/ckreleaser.jar" outfile="${tmp.dir}/ckreleaser.exe" errTitle="CKPreleaser" chdir="." customProcName="true">
+				<singleInstance mutexName="net.sf.launch4j.example.ConsoleApp" />
+				<jre minVersion="1.4.0" />
+			</config>
+		</launch4j>
+	</target>
+
+	<target name="clean" description="clean up">
+		<move file="${tmp.dir}/ckreleaser.exe" tofile="${bin.dir}/ckreleaser.exe" overwrite="true" />
+		<move file="${tmp.dir}/ckreleaser.jar" tofile="${bin.dir}/ckreleaser.jar" overwrite="true" />
+		<!-- delete all folders created during javascript to java compilation -->
+		<delete dir="${source.dir}/ckreleaser" />
+		<delete dir="${source.dir}/includes/ckreleaser" />
+		<delete dir="${json.dir}/tools" />
+		<delete dir="${ckpackager.dir}/ckpackager" />
+		<delete dir="${ckpackager.dir}/includes/ckpackager" />
+		<delete dir="${tmp.dir}" />
+	</target>
+
+</project>
Index: /CKReleaser/trunk/_dev/jslint/lint.conf
===================================================================
--- /CKReleaser/trunk/_dev/jslint/lint.conf	(revision 3153)
+++ /CKReleaser/trunk/_dev/jslint/lint.conf	(revision 3154)
@@ -115,4 +115,5 @@
 +define importPackage
 +define load
++define loadClass
 +define print
 +define readFile
@@ -130,4 +131,5 @@
 
 # Java Classes
++define BufferedReader
 +define BufferedWriter
 +define DocumentBuilderFactory
@@ -136,4 +138,5 @@
 +define InputStreamReader
 +define InputStreamWriter
++define JavaAdapter
 +define File
 +define FileInputStream
@@ -157,4 +160,7 @@
 +define JSON
 
+#YUI
++define CssCompressor
+
 # FIXME - CKRELEASER should not be here...
 +define CKRELEASER
@@ -175,6 +181,5 @@
 +recurse
 
-+process ../../includes/ckreleaser.js
-+process ../../releaser.js
-+process ../../includes/*.js
++process ../../_source/ckreleaser.js
++process ../../_source/includes/*.js
 +process ../../test/*.js
Index: /CKReleaser/trunk/_source/ckreleaser.js
===================================================================
--- /CKReleaser/trunk/_source/ckreleaser.js	(revision 3153)
+++ /CKReleaser/trunk/_source/ckreleaser.js	(revision 3154)
@@ -6,12 +6,45 @@
 importPackage( org.mozilla.javascript );
 importClass( java.io.File );
+importClass( java.lang.System );
 
-var jarPath = JavaAdapter(org.mozilla.javascript.Parser)["class"].getResource("/org/mozilla/javascript").toString();
-var releaserPath = jarPath.replaceFirst( "^jar:", '' ).replaceFirst( "\/js\.jar\!\/org\/mozilla\/javascript$", '');
+var isCompiled = true;
+var command = "java -cp [...] org.mozilla.javascript.tools.shell.Main ckreleaser.js";
+var resource = JavaAdapter( org.mozilla.javascript.Parser )["class"].getResource( "/org/mozilla/javascript" ).toString();
 
-load( releaserPath + "/includes/ckreleaser.js" );
+try
+{
+	java.lang.Class.forName( "ckreleaser.ckreleaser" );
+}
+catch ( e )
+{
+	isCompiled = false;
+}
+
+if ( isCompiled )
+{
+	var quit = function()
+	{
+		System.exit( 0 );
+	};
+
+	loadClass( "ckreleaser.includes.ckreleaser" );
+
+	if ( resource.indexOf( ".exe" ) != -1 )
+		command = "ckreleaser.exe";
+	else
+		command = "java -jar ckreleaser.jar";
+}
+else
+{
+	var releaserPath = resource.replaceFirst( "^jar:", '' ).replaceFirst( "\/js\.jar\!\/org\/mozilla\/javascript$", '' )
+			.replaceAll( "_dev.{1}_thirdparty.{1}rhino", "" );
+
+	load( releaserPath + "_source/includes/ckreleaser.js" );
+}
+
+CKRELEASER.isCompiled = isCompiled;
 CKRELEASER.path = releaserPath;
-CKRELEASER.loadCode( "includes/releaser.js" );
-	
+CKRELEASER.load( "ckreleaser.includes.releaser" );
+
 function error( msg )
 {
@@ -21,10 +54,10 @@
 }
 
-if (arguments.length > 1 && arguments[arguments.length-1] == '-v')
-	CKRELEASER.verbose = 1; 
+if ( arguments.length > 1 && ( arguments[arguments.length - 1] == '-v' || arguments[arguments.length - 1] == '--verbose' ) )
+	CKRELEASER.verbose = 1;
 
-if ( arguments[0] == '-test' )
+if ( arguments[0] == '-test' && !isCompiled )
 {
-	CKRELEASER.loadCode( 'test/test.js' );
+	CKRELEASER.load( 'test.test' );
 	quit();
 }
@@ -37,28 +70,54 @@
 CKRELEASER.targzName = arguments[5];
 
-if ( !CKRELEASER.releaseFile || !CKRELEASER.sourceDir || !CKRELEASER.targetDir 
-		|| !CKRELEASER.version || !CKRELEASER.zipName || !CKRELEASER.targzName)
+if ( !CKRELEASER.releaseFile || !CKRELEASER.sourceDir || !CKRELEASER.targetDir || !CKRELEASER.version || !CKRELEASER.zipName
+		|| !CKRELEASER.targzName )
 {
-	error( 'Usage:java -jar js.jar ckreleaser.js [release_file] [source_dir] [target_dir] [version] [zip_name] [targz_name]' );
+	error( '\nUsage: ' + command + ' release_file source_dir target_dir version zip_name targz_name [-v]' +
+			'\n' +
+			'\n release_file    Path to CKReleaser configuration file.' +
+			'\n source_dir      Path to the directory with code of application to be released.' +
+			'\n target_dir      Path to the directory, where application will be build.' +
+			'\n                 If directory already exists, CKReleaser will not start.' +
+			'\n version         The version string used to replace the %VERSION% directive.' +
+			'\n zip_name        Name of the .zip file to create.' +
+			'\n targz_name      Name of the .tar.gz file to create.' +
+			'\n\n -v | --verbose  Enable verbose output.' +
+			'\n                 Display detailed exception information when an error occurs.');
 }
 
 CKRELEASER.releaseDir = CKRELEASER.targetDir + "/" + "release";
-CKRELEASER.loadCode( 'tools/CKPackager/includes/ckpackager.js' );
+CKRELEASER.load( 'ckpackager.includes.ckpackager' );
+CKPACKAGER.isCompiled = isCompiled;
 CKPACKAGER.packDir = CKRELEASER.releaseDir;
-CKPACKAGER.dir = 'tools/CKPackager/';
+CKPACKAGER.path = 'tools/CKPackager/';
 CKPACKAGER.outputDir = CKRELEASER.releaseDir;
-CKPACKAGER.loadCode( 'includes/packager.js' );
+CKPACKAGER.load( 'ckpackager.includes.packager' );
 
-(function()
+( function()
 {
-	try {
+	try
+	{
 		var releaser = new CKRELEASER.releaser();
 		releaser.loadDefinitionFile( CKRELEASER.releaseFile );
 		releaser.run();
 	}
-	catch(e)
+	catch ( e )
 	{
-		print("");
-		error(e);
+		if ( CKRELEASER.verbose )
+		{
+			if ( typeof ( e.rhinoException ) != 'undefined' )
+			{
+				e.rhinoException.printStackTrace();
+				quit();
+			}
+			else if ( typeof ( e.javaException ) != 'undefined' )
+			{
+				e.javaException.printStackTrace();
+				quit();
+			}
+		}
+
+		print( "" );
+		error( e );
 	}
-})();
+} )();
Index: /CKReleaser/trunk/_source/includes/ckreleaser.js
===================================================================
--- /CKReleaser/trunk/_source/includes/ckreleaser.js	(revision 3153)
+++ /CKReleaser/trunk/_source/includes/ckreleaser.js	(revision 3154)
@@ -2,26 +2,48 @@
 Copyright (c) 2003-2008, Frederico Caldeira Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
- */
+*/
 
 importClass( java.lang.Integer );
 importClass( java.lang.System );
 
-var CKRELEASER = {
+var CKRELEASER =
+{
+	isCompiled : false,
 	verbose : 0,
-	os : System.getProperty( "os.name" ).substring(0,3).toLowerCase(),
+	os : System.getProperty( "os.name" ).substring( 0, 3 ).toLowerCase(),
+	path : "",
 
-	timestamp :( function()
+	timestamp : ( function()
 	{
 		var time = new Date();
-		
-		var timestamp = Integer.toString( time.getUTCFullYear() % 1000, 36 ) + Integer.toString( time.getUTCMonth(), 36 )
-				+ Integer.toString( time.getUTCDate(), 36 ) + Integer.toString( time.getUTCHours(), 36 );
+
+		var timestamp = Integer.toString( time.getUTCFullYear() % 1000, 36 )
+				+ Integer.toString( time.getUTCMonth(), 36 ) + Integer.toString( time.getUTCDate(), 36 )
+				+ Integer.toString( time.getUTCHours(), 36 );
 
 		return timestamp.toUpperCase();
-	})(),
+	} )(),
 
-	loadCode : function( path )
+	load : function( className )
 	{
-		load( CKRELEASER.path + "/" + path );
+		if ( CKRELEASER.isCompiled )
+		{
+			loadClass( className );
+		}
+		else
+		{
+			var path = className;
+
+			if ( path.indexOf( "ckpackager." ) === 0 )
+				path = path.replace( /^ckpackager\./, '_source/ckpackager/' );
+			else if ( path.indexOf( "tools." ) === 0 )
+				path = path.replace( /^tools\./, '_dev/_thirdparty/' );
+			else
+				path = path.replace( /^ckreleaser\./, "_source/" );
+
+			path = path.replace( /\./g, '/' ) + '.js';
+
+			load( CKRELEASER.path + path );
+		}
 	}
 };
Index: /CKReleaser/trunk/_source/includes/docsprocessor.js
===================================================================
--- /CKReleaser/trunk/_source/includes/docsprocessor.js	(revision 3153)
+++ /CKReleaser/trunk/_source/includes/docsprocessor.js	(revision 3154)
@@ -4,5 +4,5 @@
  */
 
-CKRELEASER.loadCode( 'tools/json/json2.js' );
+CKRELEASER.load( 'tools.json.json2' );
 
 CKRELEASER.docsProcessor = function()
@@ -12,37 +12,115 @@
 ( function()
 {
-	CKRELEASER.docsProcessor.prototype = {
+	CKRELEASER.docsProcessor.prototype =
+	{
 		createDocumentation : function( sourceDir, targetDir )
 		{
-			var confLocation = new File( sourceDir, CKRELEASER.release.documentation.config );
+			var jsdocDir, jsdocPath;
+			var configFile = new File( sourceDir, CKRELEASER.release.documentation.config );
 			var targetLocation = new File( targetDir, CKRELEASER.release.documentation.target );
 
-			if ( !confLocation.exists() )
-				throw "Missing configuration file (" + confLocation.getAbsolutePath() + ")";
+			if ( !configFile.exists() )
+				throw "Missing configuration file (" + configFile.getCanonicalPath() + ")";
 
-			var jsdocLocation = new File( 'tools/jsdoc' );
-			var jsdocPath = jsdocLocation.getAbsolutePath();
+			var configurationCode = 'var configuration = ' + CKRELEASER.io.readFile( configFile ) + '\n;';
+			var cx = Context.enter();
+			var scope = cx.initStandardObjects();
+			cx.evaluateString( scope, configurationCode, configFile.getName(), 1, null );
 
-			var o = {
-				output :""
-			};
-
-			var configurationCode = 'var configuration = ' + CKRELEASER.io.readFile( confLocation.getAbsolutePath() ) + '\n;';
-			var cx = Context.enter(), scope = cx.initStandardObjects();
-			cx.evaluateString( scope, configurationCode, confLocation.getName(), 1, null );
-
-			var confDir = confLocation.getParent();
+			var confDir = configFile.getParent();
 
 			var f;
+			f = new File( confDir.replace( "\\", "/" ), scope.configuration.t );
+			scope.configuration.t = new String( f.getCanonicalPath() );
+			f = new File( confDir.replace( "\\", "/" ), scope.configuration.d );
+			scope.configuration.d = new String( f.getCanonicalPath() );
 
-			f = new File( confDir.replace( "\\", "/" ), scope.configuration.t );
-			scope.configuration.t = new String( f.getAbsolutePath() );
-			f = new File( confDir.replace( "\\", "/" ), scope.configuration.d );
-			scope.configuration.d = new String( f.getAbsolutePath() );
+			/**
+			 * The compiled version of CKReleaser may be launched anywhere. It
+			 * can be launched over the released version of CKEditor without the
+			 * _dev directory.
+			 */
+			if ( CKRELEASER.isCompiled )
+			{
+				var jsdocTemplateDir;
+
+				if ( !System.getenv( "JSDOCDIR" ) )
+				{
+					jsdocDir = new File( CKRELEASER.sourceDir, "_dev/_thirdparty/jsdoc-toolkit" );
+
+					if ( !jsdocDir.exists() )
+						jsdocDir = new File( CKRELEASER.sourceDir, "jsdoc-toolkit" );
+
+					if ( !jsdocDir.exists() )
+					{
+						print( "\nERROR: JsDoc Toolkit not found (" + jsdocDir.getCanonicalPath() + ")" );
+						print( "       To create documentation, set the JSDOCDIR environment variable" );
+						print( "       that points to directory with JsDoc Toolkit." );
+
+						return;
+					}
+				}
+				else
+				{
+					jsdocDir = new File( System.getenv( "JSDOCDIR" ) );
+
+					if ( !jsdocDir.exists() )
+					{
+						print( "\nERROR: JsDoc Toolkit not found (" + jsdocDir.getCanonicalPath() + ")" );
+						print( "       The JSDOCDIR environment variable points into invalid directory." );
+
+						return;
+					}
+				}
+
+				if ( !System.getenv( "JSDOCTEMPLATEDIR" ) )
+				{
+					jsdocTemplateDir = new File( scope.configuration.t );
+
+					if ( !jsdocTemplateDir.exists() )
+					{
+						print( "\nERROR: JsDoc template not found (" + jsdocTemplateDir.getCanonicalPath() + ")." );
+						print( "       You can set the template location in configuration file: " );
+						print( "            " + configFile.getCanonicalPath() + "." );
+						print( "       As an alternative, set the JSDOCTEMPLATEDIR environment variable that " );
+						print( "       points to the directory with JsDoc template." );
+
+						return;
+					}
+				}
+				else
+				{
+					jsdocTemplateDir = new File( System.getenv( "JSDOCTEMPLATEDIR" ) );
+					if ( !jsdocTemplateDir.exists() )
+					{
+						print( "\nERROR: JsDoc template not found (" + jsdocTemplateDir.getCanonicalPath() + ")" );
+						print( "       The JSDOCTEMPLATEDIR environment variable points into invalid directory." );
+
+						return;
+					}
+
+					/*
+					 * Set the new t attribute based on the JSDOCTEMPLATEDIR environment variable.
+					 */
+					scope.configuration.t = new String( jsdocTemplateDir.getCanonicalPath() );
+				}
+			}
+			else
+			{
+				jsdocDir = new File( '_dev/_thirdparty/jsdoc-toolkit' );
+			}
+
+			var runjsFile = new File( jsdocDir.getCanonicalPath(), 'app/run.js' );
+			if ( !runjsFile.exists() )
+			{
+				print( "\nERROR: the specified JsDoc Toolkit directory seems to be invalid." );
+				print( "Could not find " + runjsFile.getCanonicalPath() + "" );
+				return;
+			}
 
 			for ( var i = 0 ; i < scope.configuration._.length ; i++ )
 			{
 				f = new File( confDir.replace( "\\", "/" ), scope.configuration._[i] );
-				scope.configuration._[i] = new String( f.getAbsolutePath() );
+				scope.configuration._[i] = new String( f.getCanonicalPath() );
 			}
 
@@ -50,6 +128,12 @@
 			CKRELEASER.io.saveFile( tempFile, JSON.stringify( scope.configuration ) );
 
-			runCommand( "java", "-jar", jsdocPath + "/jsrun.jar", jsdocPath + "/app/run.js", "-c=" + tempFile.getAbsolutePath(), "-d="
-					+ targetLocation.getAbsolutePath(), o );
+			var o =
+			{
+				output : ""
+			};
+
+			jsdocPath = jsdocDir.getCanonicalPath();
+			runCommand( "java", "-jar", jsdocPath + "/jsrun.jar", jsdocPath + "/app/run.js", "-c=" + tempFile.getCanonicalPath(),
+					"-d=" + targetLocation.getCanonicalPath(), o );
 
 			if ( CKRELEASER.verbose )
@@ -57,3 +141,3 @@
 		}
 	};
-})();
+} )();
Index: /CKReleaser/trunk/_source/includes/io.js
===================================================================
--- /CKReleaser/trunk/_source/includes/io.js	(revision 3153)
+++ /CKReleaser/trunk/_source/includes/io.js	(revision 3154)
@@ -21,35 +21,36 @@
 ( function()
 {
-	var txtExtensions = {
-		"" :0,
-		"afp" :1,
-		"afpa" :1,
-		"ascx" :1,
-		"asp" :1,
-		"aspx" :1,
-		"bat" :1,
-		"cfc" :1,
-		"cfm" :1,
-		"cgi" :1,
-		"code" :1,
-		"command" :1,
-		"conf" :1,
-		"css" :1,
-		"dtd" :1,
-		"htaccess" :1,
-		"htc" :1,
-		"htm" :1,
-		"html" :1,
-		"js" :1,
-		"jsp" :1,
-		"lasso" :1,
-		"php" :1,
-		"pl" :1,
-		"py" :1,
-		"readme" :1,
-		"sample" :1,
-		"sh" :1,
-		"txt" :1,
-		"xml" :1
+	var txtExtensions =
+	{
+		"" : 0,
+		"afp" : 1,
+		"afpa" : 1,
+		"ascx" : 1,
+		"asp" : 1,
+		"aspx" : 1,
+		"bat" : 1,
+		"cfc" : 1,
+		"cfm" : 1,
+		"cgi" : 1,
+		"code" : 1,
+		"command" : 1,
+		"conf" : 1,
+		"css" : 1,
+		"dtd" : 1,
+		"htaccess" : 1,
+		"htc" : 1,
+		"htm" : 1,
+		"html" : 1,
+		"js" : 1,
+		"jsp" : 1,
+		"lasso" : 1,
+		"php" : 1,
+		"pl" : 1,
+		"py" : 1,
+		"readme" : 1,
+		"sample" : 1,
+		"sh" : 1,
+		"txt" : 1,
+		"xml" : 1
 	};
 
@@ -87,9 +88,9 @@
 				switch ( compressMethod )
 				{
-					case 'tar.gz':
-						anEntry = new TarEntry( f.getCanonicalPath().replace( r.getCanonicalPath(), rootDir ).replace("\\", "/") );
+					case 'tar.gz' :
+						anEntry = new TarEntry( f.getCanonicalPath().replace( r.getCanonicalPath(), rootDir ).replace( "\\", "/" ) );
 						break;
-					case 'zip':
-						anEntry = new ZipEntry( f.getCanonicalPath().replace( r.getCanonicalPath(), rootDir ).replace("\\", "/") );
+					case 'zip' :
+						anEntry = new ZipEntry( f.getCanonicalPath().replace( r.getCanonicalPath(), rootDir ).replace( "\\", "/" ) );
 						break;
 					default:
@@ -100,5 +101,5 @@
 				outStream.putNextEntry( anEntry );
 
-				while ( (bytesIn = fis.read( readBuffer )) != -1 )
+				while ( ( bytesIn = fis.read( readBuffer ) ) != -1 )
 				{
 					outStream.write( readBuffer, 0, bytesIn );
@@ -124,5 +125,5 @@
 			var len, buf = new Packages.java.lang.reflect.Array.newInstance( java.lang.Byte.TYPE, 1024 );
 
-			while ( (len = inStream.read( buf )) != -1 )
+			while ( ( len = inStream.read( buf ) ) != -1 )
 			{
 				outStream.write( buf, 0, len );
@@ -138,6 +139,7 @@
 	}
 
-	CKRELEASER.io = {
-		copyFile :copyFile,
+	CKRELEASER.io =
+	{
+		copyFile : copyFile,
 
 		deleteDirectory : function( path )
@@ -240,5 +242,12 @@
 			{
 				var inStream = new InputStreamReader( new FileInputStream( file ), "UTF-8" );
-
+			}
+			catch ( e )
+			{
+				throw 'An I/O error occurred while opening the ' + file + ' file.';
+			}
+
+			try
+			{
 				count = inStream.read( chars, 0, 32 );
 
@@ -288,9 +297,21 @@
 			var count;
 
+			if ( !file.exists() )
+			{
+				throw 'File ' + file + ' does not exist.';
+			}
+
 			try
 			{
 				var inStream = new InputStreamReader( new FileInputStream( file ), "UTF-8" );
-
-				while ( (count = inStream.read( chars, 0, 8192 )) != -1 )
+			}
+			catch ( e )
+			{
+				throw 'An I/O error occurred while opening the ' + file + ' file.';
+			}
+
+			try
+			{
+				while ( ( count = inStream.read( chars, 0, 8192 ) ) != -1 )
 				{
 					if ( count > 0 )
@@ -318,7 +339,8 @@
 		getDirectoryInfo : function( file )
 		{
-			var path_iterator, current_file, files, result = {
-				files :0,
-				size :0
+			var path_iterator, current_file, files, result =
+			{
+				files : 0,
+				size : 0
 			};
 
@@ -331,5 +353,5 @@
 				return result;
 
-			path_iterator = (java.util.Arrays.asList( files )).iterator();
+			path_iterator = ( java.util.Arrays.asList( files ) ).iterator();
 
 			while ( path_iterator.hasNext() )
@@ -372,6 +394,18 @@
 
 			return txtExtensions[ext] === 1;
+		},
+
+		isChildPath : function( childPath, parentPath )
+		{
+			if ( childPath.length > parentPath.length )
+				return false;
+
+			var i = 0, max = Math.min( childPath.length(), parentPath.length() );
+
+			while ( i < max && childPath.charAt( i ) == parentPath.charAt( i ) )
+				i++;
+
+			return i != max;
 		}
-
 	};
-})();
+} )();
Index: /CKReleaser/trunk/_source/includes/releaser.js
===================================================================
--- /CKReleaser/trunk/_source/includes/releaser.js	(revision 3153)
+++ /CKReleaser/trunk/_source/includes/releaser.js	(revision 3154)
@@ -7,10 +7,11 @@
 importClass( java.io.FileWriter );
 importPackage( java.util.regex );
-
-CKRELEASER.loadCode( 'includes/io.js' );
-CKRELEASER.loadCode( 'includes/skinprocessor.js' );
-CKRELEASER.loadCode( 'includes/samplesprocessor.js' );
-CKRELEASER.loadCode( 'includes/docsprocessor.js' );
-CKRELEASER.loadCode( 'includes/tools.js' );
+importPackage( com.yahoo.platform.yui.compressor );
+
+CKRELEASER.load( 'ckreleaser.includes.io' );
+CKRELEASER.load( 'ckreleaser.includes.skinprocessor' );
+CKRELEASER.load( 'ckreleaser.includes.samplesprocessor' );
+CKRELEASER.load( 'ckreleaser.includes.docsprocessor' );
+CKRELEASER.load( 'ckreleaser.includes.tools' );
 
 ( function()
@@ -76,14 +77,14 @@
 				var sourceLocation = new File( CKRELEASER.releaseDir, CKRELEASER.release.rename[i].source );
 				var targetLocation = new File( CKRELEASER.releaseDir, CKRELEASER.release.rename[i].target );
-				sourceLocation.renameTo(targetLocation);
+				sourceLocation.renameTo( targetLocation );
 			}
 			catch ( e )
 			{
-				print( "WARNING: Cannot rename " + CKRELEASER.release.rename[i].source + " into " + CKRELEASER.release.rename[i].target + " "
-						+ e.toString() );
-			}
-		}
-	}
-	
+				print( "WARNING: Cannot rename " + CKRELEASER.release.rename[i].source + " into "
+						+ CKRELEASER.release.rename[i].target + " " + e.toString() );
+			}
+		}
+	}
+
 	function copyFiles()
 	{
@@ -98,6 +99,6 @@
 			catch ( e )
 			{
-				print( "WARNING: Cannot copy " + CKRELEASER.release.copy[i].source + " into " + CKRELEASER.release.copy[i].target + " "
-						+ e.toString() );
+				print( "WARNING: Cannot copy " + CKRELEASER.release.copy[i].source + " into " + CKRELEASER.release.copy[i].target
+						+ " " + e.toString() );
 			}
 		}
@@ -106,6 +107,7 @@
 	function minifyFile( file )
 	{
-		var o = {
-			output :""
+		var o =
+		{
+			output : ""
 		};
 		var ext = CKRELEASER.io.getExtension( file.getName() );
@@ -113,8 +115,25 @@
 		if ( ext == "css" )
 		{
-			runCommand( "java", "-jar", "tools/yui/yuicompressor.jar", file.getAbsolutePath(), "--line-break", "4096", "-v", "--charset",
-					"UTF-8", "-o", file.getAbsolutePath(), o );
-
-			print( o.output );
+			if ( CKRELEASER.isCompiled )
+			{
+				var isr = new InputStreamReader( new FileInputStream( file ), "UTF-8" );
+				var compressor = new CssCompressor( isr );
+
+				// Close the input stream first, and then open the output
+				// stream,
+				// in case the output file should override the input file.
+				isr.close();
+
+				var out = new OutputStreamWriter( new FileOutputStream( file ), "UTF-8" );
+				compressor.compress( out, 4096 );
+				out.close();
+			}
+			else
+			{
+				runCommand( "java", "-jar", "_dev/_thirdparty/yui/yuicompressor.jar", file.getAbsolutePath(), "--line-break",
+						"4096", "-v", "--charset", "UTF-8", "-o", file.getAbsolutePath(), o );
+
+				print( o.output );
+			}
 		}
 		else if ( ext == "js" )
@@ -136,17 +155,17 @@
 		else
 		{
-			extension = CKRELEASER.io.getExtension( file.getName() );
+			var extension = CKRELEASER.io.getExtension( file.getName() );
 			switch ( extension )
 			{
-				case "gif":
-				case "jpg":
-				case "jpeg":
-				case "png":
-				case "gz":
-				case "zip":
+				case "gif" :
+				case "jpg" :
+				case "jpeg" :
+				case "png" :
+				case "gz" :
+				case "zip" :
 					break;
 
-				case "asp":
-				case "js":
+				case "asp" :
+				case "js" :
 					CKRELEASER.io.setByteOrderMark( file, true );
 					break;
@@ -178,6 +197,6 @@
 			switch ( ext )
 			{
-				case "css":
-				case "js":
+				case "css" :
+				case "js" :
 					minifyFile( file );
 					prependHeader( file );
@@ -202,7 +221,8 @@
 	}
 
-	var regexLib = {
-		packagerRemove :Pattern.compile( '(?m-s:^.*?%REMOVE_START%).*?(?m-s:%REMOVE_END%.*?$)', Pattern.DOTALL ),
-		packagerRemoveLine :Pattern.compile( '.*%REMOVE_LINE%.*(?:\\r\\n|\\r|\\n)?' )
+	var regexLib =
+	{
+		packagerRemove : Pattern.compile( '(?m-s:^.*?%REMOVE_START%).*?(?m-s:%REMOVE_END%.*?$)', Pattern.DOTALL ),
+		packagerRemoveLine : Pattern.compile( '.*%REMOVE_LINE%.*(?:\\r\\n|\\r|\\n)?' )
 	};
 
@@ -270,14 +290,25 @@
 	}
 
-	CKRELEASER.releaser.prototype = {
+	CKRELEASER.releaser.prototype =
+	{
 		loadDefinitionFile : function( filePath )
 		{
 			var file = new File( filePath );
 
-			var releaseCode = 'var release = { ' + CKRELEASER.io.readFile( filePath ) + '\n};';
-
+			var releaseCode = 'var release = { ' + CKRELEASER.io.readFile( file ) + '\n};';
 			var cx = Context.enter(), scope = cx.initStandardObjects();
 
-			cx.evaluateString( scope, releaseCode, file.getName(), 1, null );
+			try
+			{
+				cx.evaluateString( scope, releaseCode, file.getName(), 1, null );
+			}
+			catch ( e )
+			{
+				if ( CKRELEASER.verbose && typeof ( e.rhinoException ) != 'undefined' )
+					e.rhinoException.printStackTrace();
+
+				error( '\nParsing release file failed:\n    Error: ' + e.message + '\n    File: ' + file.getAbsolutePath()
+						+ '\n    Line: ' + e.lineNumber );
+			}
 
 			this.loadDefinition( scope.release );
@@ -305,5 +336,5 @@
 			if ( definitionObject.rename )
 				CKRELEASER.release.rename = definitionObject.rename;
-			
+
 			if ( definitionObject.packages )
 				CKRELEASER.release.packages = definitionObject.packages;
@@ -347,5 +378,12 @@
 			if ( targetDir.exists() )
 				throw 'Target directory already exists (' + CKRELEASER.targetDir + ')';
-			else if ( !releaseDir.mkdirs() )
+
+			if ( sourceDir.getCanonicalPath() == targetDir.getCanonicalPath() )
+				throw "Source and target directory cannot be identical";
+
+			if ( CKRELEASER.io.isChildPath( targetDir.getCanonicalPath(), sourceDir.getCanonicalPath() ) )
+				throw "Target directory must be located outside source directory";
+
+			if ( !releaseDir.mkdirs() )
 				throw "Cannot create release directory (" + releaseDir + ")";
 
@@ -353,48 +391,85 @@
 			CKRELEASER.io.copy( sourceDir, releaseDir );
 
-			print( "\nCopying files to special destination...\n" );
-			copyFiles();
-
-			print( "\nRenaming files...\n" );
-			renameFiles();
+			if ( CKRELEASER.release.copy )
+			{
+				print( "\nCopying files to special destination...\n" );
+				copyFiles();
+			}
+
+			if ( CKRELEASER.release.rename )
+			{
+				print( "\nRenaming files...\n" );
+				renameFiles();
+			}
 
 			print( "\nProcessing directives in files used by CKPackager...\n" );
 			this.processDirectives( new File( CKPACKAGER.packDir ) );
-			
-			print( "\nPackaging CKEditor...\n" );
-			for ( i = 0 ; i < CKRELEASER.release.packages.length ; i++ )
-			{
-				var packager = new CKPACKAGER.packager();
-				packager.loadDefinitionFile( CKRELEASER.release.packages[i] );
-				packager.run();
-			}
-
-			print( "\nCreating skins...\n" );
-			var skinProcessor = new CKRELEASER.skinProcessor();
-			skinProcessor.createSkins( CKRELEASER.sourceDir, CKRELEASER.releaseDir );
-
-			if ( CKRELEASER.release.skins.minify )
-				minifyFiles( new File( CKRELEASER.releaseDir, CKRELEASER.release.skins.target ) );
-
-			print( "\nCreating documentation...\n" );
-			var docsProcessor = new CKRELEASER.docsProcessor();
-			docsProcessor.createDocumentation( CKRELEASER.sourceDir, CKRELEASER.releaseDir );
-
-			var docsDir = new File( CKRELEASER.releaseDir, CKRELEASER.release.documentation.target );
-			info = CKRELEASER.io.getDirectoryInfo( docsDir );
-			print( "    Number of created files: " + info.files );
-			print( "    Total size.............: " + info.size + " bytes" );
-
-			print( "\nCreating samples...\n" );
-			var samplesProcessor = new CKRELEASER.samplesProcessor();
-			samplesProcessor.createSamples( CKRELEASER.sourceDir, CKRELEASER.releaseDir );
-
-			print( "\nMinifying files...\n" );
-			for ( i = 0 ; i < CKRELEASER.release.copy.length ; i++ )
-			{
-				if ( CKRELEASER.release.copy[i].minify )
+
+			if ( CKRELEASER.release.packages )
+			{
+				print( "\nPackaging CKEditor...\n" );
+
+				var packager, packFile;
+
+				for ( i = 0 ; i < CKRELEASER.release.packages.length ; i++ )
 				{
-					var targetLocation = new File( CKRELEASER.releaseDir, CKRELEASER.release.copy[i].target );
-					minifyFiles( targetLocation );
+					packFile = new File( CKRELEASER.sourceDir, CKRELEASER.release.packages[i] );
+					if ( !packFile.exists() )
+						throw 'Package file ' + CKRELEASER.release.packages[i] + ' defined in ' + CKRELEASER.releaseFile
+								+ ' not found (' + packFile.getCanonicalPath() + ')';
+
+					packager = new CKPACKAGER.packager();
+					packager.loadDefinitionFile( packFile.getCanonicalPath() );
+					packager.run();
+				}
+			}
+			else
+				print( "\nWARNING: no package definitions found in the release file.\n" );
+
+			if ( CKRELEASER.release.skins.source )
+			{
+				print( "\nCreating skins...\n" );
+				var skinProcessor = new CKRELEASER.skinProcessor();
+				skinProcessor.createSkins( CKRELEASER.sourceDir, CKRELEASER.releaseDir );
+
+				if ( CKRELEASER.release.skins.minify )
+					minifyFiles( new File( CKRELEASER.releaseDir, CKRELEASER.release.skins.target ) );
+			}
+			else
+				print( "\nWARNING: skins directive not found in the release file.\n" );
+
+			if ( CKRELEASER.release.documentation.target )
+			{
+				print( "\nCreating documentation...\n" );
+				var docsProcessor = new CKRELEASER.docsProcessor();
+				docsProcessor.createDocumentation( CKRELEASER.sourceDir, CKRELEASER.releaseDir );
+
+				var docsDir = new File( CKRELEASER.releaseDir, CKRELEASER.release.documentation.target );
+				info = CKRELEASER.io.getDirectoryInfo( docsDir );
+				print( "    Number of created files: " + info.files );
+				print( "    Total size.............: " + info.size + " bytes" );
+			}
+			else
+				print( "\nWARNING: documentation directive not found in the release file.\n" );
+
+			if ( CKRELEASER.release.samples.source )
+			{
+				print( "\nCreating samples...\n" );
+				var samplesProcessor = new CKRELEASER.samplesProcessor();
+				samplesProcessor.createSamples( CKRELEASER.sourceDir, CKRELEASER.releaseDir );
+			}
+			else
+				print( "\nWARNING: samples directive not found in the release file.\n" );
+
+			if ( CKRELEASER.release.copy )
+			{
+				print( "\nMinifying files...\n" );
+				for ( i = 0 ; i < CKRELEASER.release.copy.length ; i++ )
+				{
+					if ( CKRELEASER.release.copy[i].minify )
+					{
+						var targetLocation = new File( CKRELEASER.releaseDir, CKRELEASER.release.copy[i].target );
+						minifyFiles( targetLocation );
+					}
 				}
 			}
@@ -430,5 +505,5 @@
 			print( "\n==========================" );
 
-			time = (new Date()) - time;
+			time = ( new Date() ) - time;
 			time = time / 1000;
 
@@ -447,3 +522,3 @@
 		}
 	};
-})();
+} )();
Index: /CKReleaser/trunk/_source/includes/samplesprocessor.js
===================================================================
--- /CKReleaser/trunk/_source/includes/samplesprocessor.js	(revision 3153)
+++ /CKReleaser/trunk/_source/includes/samplesprocessor.js	(revision 3154)
@@ -4,5 +4,5 @@
  */
 
-CKRELEASER.loadCode( 'includes/xml.js' );
+CKRELEASER.load( 'ckreleaser.includes.xml' );
 
 CKRELEASER.samplesProcessor = function( release )
Index: /CKReleaser/trunk/_source/includes/skinprocessor.js
===================================================================
--- /CKReleaser/trunk/_source/includes/skinprocessor.js	(revision 3153)
+++ /CKReleaser/trunk/_source/includes/skinprocessor.js	(revision 3154)
@@ -20,5 +20,5 @@
 	{
 		var parentPath, path = sourceLocation.getCanonicalPath();
-		var lines = CKRELEASER.io.readFile( path ).split( /\r\n|\n|\r/ );
+		var lines = CKRELEASER.io.readFile( new File( path ) ).split( /\r\n|\n|\r/ );
 		var out = [];
 		var isImported = false;
Index: /CKReleaser/trunk/_source/includes/tools.js
===================================================================
--- /CKReleaser/trunk/_source/includes/tools.js	(revision 3153)
+++ /CKReleaser/trunk/_source/includes/tools.js	(revision 3154)
@@ -52,5 +52,5 @@
 			var line;
 
-			extension = CKRELEASER.io.getExtension( file.getName() );
+			var extension = CKRELEASER.io.getExtension( file.getName() );
 
 			if ( !lineEnding[extension] )
Index: /CKReleaser/trunk/_source/includes/xml.js
===================================================================
--- /CKReleaser/trunk/_source/includes/xml.js	(revision 3153)
+++ /CKReleaser/trunk/_source/includes/xml.js	(revision 3154)
@@ -27,5 +27,5 @@
 				 * Skip empty text nodes (containing white space characters) at the beginning and at the end.
 				 */
-				if ( (i == 0 || i == length - 1) && nodeList.item( i ).getNodeType() == org.w3c.dom.Node.TEXT_NODE
+				if ( (i === 0 || i == length - 1) && nodeList.item( i ).getNodeType() == org.w3c.dom.Node.TEXT_NODE
 						&& nodeList.item( i ).getNodeValue().match( /^\s*$/ ) !== null )
 					continue;
Index: /CKReleaser/trunk/test/test.bat
===================================================================
--- /CKReleaser/trunk/test/test.bat	(revision 3153)
+++ /CKReleaser/trunk/test/test.bat	(revision 3154)
@@ -6,3 +6,3 @@
 ECHO.
 
-java -cp ../js.jar;../tools/javatar/tar.jar;../tools/tartool/tartool.jar;../tools/jaf/activation.jar org.mozilla.javascript.tools.shell.Main ../ckreleaser.js -test %1
+java -cp ../_dev/_thirdparty/rhino/js.jar;../_dev/_thirdparty/javatar/tar.jar;../_dev/_thirdparty/tartool/tartool.jar;../_dev/_thirdparty/jaf/activation.jar org.mozilla.javascript.tools.shell.Main ../_source/ckreleaser.js -test %1
Index: /CKReleaser/trunk/test/test.js
===================================================================
--- /CKReleaser/trunk/test/test.js	(revision 3153)
+++ /CKReleaser/trunk/test/test.js	(revision 3154)
@@ -208,5 +208,5 @@
 	function testBom()
 	{
-		var file, file2;
+		var file, extension;
 		var dir = new File( 'tmp/bom' );
 
@@ -216,5 +216,5 @@
 		for ( var i = 0 ; i < children.length ; i++ )
 		{
-			var file = new File( dir, children[i] );
+			file = new File( dir, children[i] );
 
 			extension = CKRELEASER.io.getExtension( file.getName() );
