Index: /CKReleaser/trunk/ckeditor.release
===================================================================
--- /CKReleaser/trunk/ckeditor.release	(revision 2893)
+++ /CKReleaser/trunk/ckeditor.release	(revision 2894)
@@ -5,7 +5,8 @@
 	'_dev',
 	'_docs/api',
+	'_samples',
 	'_source/adapters',
- 	'ckeditor.js',
- 	'ckeditor_basic.js',
+	'ckeditor.js',
+	'ckeditor_basic.js',
 	'.svn',
 	'.settings',
Index: /CKReleaser/trunk/ckreleaser.js
===================================================================
--- /CKReleaser/trunk/ckreleaser.js	(revision 2893)
+++ /CKReleaser/trunk/ckreleaser.js	(revision 2894)
@@ -59,4 +59,5 @@
 	catch(e)
 	{
+		print("");
 		error(e);
 	}
Index: /CKReleaser/trunk/includes/io.js
===================================================================
--- /CKReleaser/trunk/includes/io.js	(revision 2893)
+++ /CKReleaser/trunk/includes/io.js	(revision 2894)
@@ -56,5 +56,5 @@
 
 				fis = new FileInputStream( f );
-				
+
 				switch ( compressMethod )
 				{
@@ -89,18 +89,28 @@
 	function copyFile( sourceLocation, targetLocation )
 	{
-		var inStream = new FileInputStream( sourceLocation );
-		var outStream = new FileOutputStream( targetLocation );
-
-		var len, buf = new Packages.java.lang.reflect.Array.newInstance( java.lang.Byte.TYPE, 1024 );
-
-		while ( (len = inStream.read( buf )) != -1 )
-		{
-			outStream.write( buf, 0, len );
-		}
-		inStream.close();
-		outStream.close();
+		try
+		{
+			var inStream = new FileInputStream( sourceLocation );
+			var outStream = new FileOutputStream( targetLocation );
+
+			var len, buf = new Packages.java.lang.reflect.Array.newInstance( java.lang.Byte.TYPE, 1024 );
+
+			while ( (len = inStream.read( buf )) != -1 )
+			{
+				outStream.write( buf, 0, len );
+			}
+			inStream.close();
+			outStream.close();
+		}
+		catch ( e )
+		{
+			throw "Cannot copy file:\n Source: " + sourceLocation.getCanonicalPath() + "\n Destination : "
+					+ targetLocation.getCanonicalPath() + "\n" + e.message;
+		}
 	}
 
 	CKRELEASER.io = {
+		copyFile :copyFile,
+
 		deleteDirectory : function( path )
 		{
@@ -135,10 +145,19 @@
 		},
 
-		saveFile : function( file, text )
-		{
-			var stream = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file ), "UTF-8" ) );
-			stream.write( text );
-			stream.flush();
-			stream.close();
+		saveFile : function( file, text, includeBom )
+		{
+			try
+			{
+				var stream = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file ), "UTF-8" ) );
+				if ( includeBom )
+					stream.write( 65279 );
+				stream.write( text );
+				stream.flush();
+				stream.close();
+			}
+			catch ( e )
+			{
+				throw "Cannot save file:\n Path: " + file.getCanonicalPath() + "\n Eception details: " + e.message;
+			}
 		},
 
@@ -184,8 +203,57 @@
 		},
 
+		setByteOrderMark : function( file, includeUtf8Bom )
+		{
+			var buffer = new StringBuffer();
+			var chars = new Packages.java.lang.reflect.Array.newInstance( java.lang.Character.TYPE, 32 );
+			var count;
+
+			try
+			{
+				var inStream = new InputStreamReader( new FileInputStream( file ), "UTF-8" );
+
+				count = inStream.read( chars, 0, 32 );
+
+				if ( count <= 0 )
+					return;
+
+				buffer.append( chars, 0, count );
+
+				/* BOM is at the beginning of file */
+				if ( buffer.length() && buffer.charAt( 0 ) == 65279 )
+				{
+					if ( !includeUtf8Bom )
+					{
+						if ( CKRELEASER.verbose )
+							print( "Removing BOM from " + file.getCanonicalPath() );
+						this.saveFile( file, this.readFile( file ) );
+					}
+				}
+				else
+				{
+					if ( includeUtf8Bom )
+					{
+						if ( CKRELEASER.verbose )
+							print( "Adding BOM to " + file.getCanonicalPath() );
+						this.saveFile( file, this.readFile( file ), true );
+					}
+				}
+			}
+			catch ( e )
+			{
+				throw 'An I/O error occurred while reading the ' + file.getCanonicalPath() + ' file.';
+			}
+			finally
+			{
+				inStream.close();
+			}
+		},
+
+		/**
+		 * Reads file and returns file contents without initial UTF-8 Byte Order
+		 * Mark
+		 */
 		readFile : function( file )
 		{
-			var inStream = new InputStreamReader( new FileInputStream( file ), "UTF-8" );
-
 			var buffer = new StringBuffer();
 			var chars = new Packages.java.lang.reflect.Array.newInstance( java.lang.Character.TYPE, 8192 );
@@ -194,4 +262,6 @@
 			try
 			{
+				var inStream = new InputStreamReader( new FileInputStream( file ), "UTF-8" );
+
 				while ( (count = inStream.read( chars, 0, 8192 )) != -1 )
 				{
@@ -204,5 +274,5 @@
 			catch ( e )
 			{
-				throw 'An I/O error occurred reading the ' + file.getAbsolutePath() + ' file.';
+				throw 'An I/O error occurred while reading the ' + file.getCanonicalPath() + ' file.';
 			}
 			finally
@@ -220,14 +290,17 @@
 		getDirectoryInfo : function( file )
 		{
-			var path_iterator, current_file, files, result = { files: 0, size : 0 };
-
-			if (!file.exists())
+			var path_iterator, current_file, files, result = {
+				files :0,
+				size :0
+			};
+
+			if ( !file.exists() )
 				return result;
-			
+
 			files = file.listFiles();
-			
-			if (!files)
+
+			if ( !files )
 				return result;
-			
+
 			path_iterator = (java.util.Arrays.asList( files )).iterator();
 
@@ -250,5 +323,5 @@
 			return result;
 		},
-		
+
 		getFileName : function( filePath )
 		{
@@ -256,4 +329,5 @@
 			return file.getName();
 		},
+
 		getExtension : function( fileName )
 		{
@@ -262,5 +336,5 @@
 				return "";
 			else
-				return fileName.substring( pos + 1 ).toLowerCase();
+				return String( fileName.substring( pos + 1 ).toLowerCase() );
 		},
 
Index: /CKReleaser/trunk/includes/releaser.js
===================================================================
--- /CKReleaser/trunk/includes/releaser.js	(revision 2893)
+++ /CKReleaser/trunk/includes/releaser.js	(revision 2894)
@@ -46,4 +46,24 @@
 	};
 
+	release.prototype.addIgnoredPath = function( path )
+	{
+		this.ignore.push( path );
+	};
+
+	release.prototype.removeIgnoredPath = function( path )
+	{
+		if ( !this.ignore )
+			return;
+
+		for ( var i = 0 ; i < this.ignore.length ; i++ )
+		{
+			if ( path == this.ignore[i] )
+			{
+				this.ignore.splice( i, 1 );
+				return;
+			}
+		}
+	};
+
 	function moveFiles()
 	{
@@ -54,7 +74,7 @@
 			CKRELEASER.io.copy( sourceLocation, targetLocation );
 			/**
-			 * TODO: Delete, really?
+			 * TODO: Delete?
 			 */
-			CKRELEASER.io.deleteDirectory( sourceLocation );
+			//CKRELEASER.io.deleteDirectory( sourceLocation );
 		}
 	}
@@ -79,4 +99,37 @@
 			var compressed = CKPACKAGER.scriptCompressor.compress( source, false, null, false, false );
 			CKRELEASER.io.saveFile( file, compressed );
+		}
+	}
+
+	function fixByteOrderMark( file )
+	{
+		if ( file.isDirectory() )
+		{
+			var children = file.list();
+			for ( var i = 0 ; i < children.length ; i++ )
+				fixByteOrderMark( new File( file, children[i] ) );
+		}
+		else
+		{
+			extension = CKRELEASER.io.getExtension( file.getName() );
+			switch ( extension )
+			{
+				case "gif":
+				case "jpg":
+				case "jpeg":
+				case "png":
+				case "gz":
+				case "zip":
+					break;
+
+				case "asp":
+				case "js":
+					CKRELEASER.io.setByteOrderMark( file, true );
+					break;
+
+				default:
+					CKRELEASER.io.setByteOrderMark( file, false );
+					break;
+			}
 		}
 	}
@@ -224,5 +277,5 @@
 		run : function()
 		{
-			var i, info, time = new Date();
+			var error, i, info, time = new Date();
 
 			var targetDir = new File( CKRELEASER.targetDir );
@@ -300,9 +353,9 @@
 					if ( CKRELEASER.os == 'win' )
 					{
-						throw "php is not recognized as an internal or external command. Make sure that PHP is installed in your system and the 'Path' environment variable in your environment is pointing to it."
+						error = "Line endings has not been fixed due to PHP not found in your system. \nphp is not recognized as an internal or external command. Make sure that PHP is installed and the 'Path' environment variable is pointing to it.";
 					}
 					else
 					{
-						throw "php: command not found. Make sure that PHP is installed in your system and the PATH variable in your environment is pointing to it."
+						error = "Line endings has not been fixed due to PHP not found in your system. \nphp: command not found. Make sure that PHP is installed in your system and the PATH variable in your environment is pointing to it.";
 					}
 				}
@@ -332,9 +385,18 @@
 			time = time / 1000;
 
-			print( "Release process completed:" );
+			print( "Release process completed:\n" );
 			print( "    Number of files: " + info.files );
 			print( "    Total size.....: " + info.size + " bytes" );
-			print( "    Time taken:....: " + time + " seconds" );
+			print( "    Time taken.....: " + time + " seconds" );
 			print( "" );
+
+			fixByteOrderMark( new File( CKRELEASER.releaseDir ) );
+
+			if ( error )
+			{
+				print( "Error details:" );
+				print( error );
+				print( "" );
+			}
 		}
 	};
Index: /CKReleaser/trunk/includes/samplesprocessor.js
===================================================================
--- /CKReleaser/trunk/includes/samplesprocessor.js	(revision 2893)
+++ /CKReleaser/trunk/includes/samplesprocessor.js	(revision 2894)
@@ -12,5 +12,5 @@
 ( function()
 {
-	var templateFile, templateLocation, templateDocument, processedFiles = {}, copiedFiles = {};
+	var template, templateLocation, templateDocument, processedFiles = {}, copiedFiles = {};
 
 	var regexLib = {
@@ -24,5 +24,5 @@
 		var newDocument = templateDocument.cloneNode( true );
 		var document = CKRELEASER.xml.loadDocument( sourceLocation );
-		var result = new java.lang.String( templateFile );
+		var result = template;
 		var node = {
 			code :null,
@@ -49,5 +49,7 @@
 				print( "    WARNING: File with .html extension does not contain all necessary elements (html, code): "
 						+ sourceLocation.getName() );
-			CKRELEASER.io.copy( sourceLocation, targetLocation );
+
+			if ( sourceLocation.getAbsolutePath() != templateLocation.getAbsolutePath() )
+				CKRELEASER.io.copyFile( sourceLocation, targetLocation );
 			return;
 		}
@@ -139,5 +141,10 @@
 
 			var targetLocation = new File( targetDir, CKRELEASER.release.samples.target );
-			
+			if ( !targetLocation.exists() )
+			{
+				if (!targetLocation.mkdir())
+					throw "Creating samples failed. Can't create target directory (" + targetLocation.getCanonicalPath() + ")";
+			}
+
 			templateLocation = new File( sourceDir, CKRELEASER.release.samples.template );
 			if ( !templateLocation.exists() )
@@ -145,7 +152,9 @@
 
 			templateDocument = CKRELEASER.xml.loadDocument( templateLocation );
-			templateFile = CKRELEASER.io.readFile( templateLocation );
+			template = CKRELEASER.io.readFile( templateLocation );
 
+			CKRELEASER.release.removeIgnoredPath( CKRELEASER.release.samples.source );
 			processDirectory( sourceLocation, targetLocation );
+			CKRELEASER.release.addIgnoredPath( CKRELEASER.release.samples.source );
 		}
 	};
Index: /CKReleaser/trunk/test/_assets/bom/test.asp
===================================================================
--- /CKReleaser/trunk/test/_assets/bom/test.asp	(revision 2894)
+++ /CKReleaser/trunk/test/_assets/bom/test.asp	(revision 2894)
@@ -0,0 +1,1 @@
+aaa
Index: /CKReleaser/trunk/test/_assets/bom/test.html
===================================================================
--- /CKReleaser/trunk/test/_assets/bom/test.html	(revision 2894)
+++ /CKReleaser/trunk/test/_assets/bom/test.html	(revision 2894)
@@ -0,0 +1,1 @@
+aaa
Index: /CKReleaser/trunk/test/_assets/bom/test.js
===================================================================
--- /CKReleaser/trunk/test/_assets/bom/test.js	(revision 2894)
+++ /CKReleaser/trunk/test/_assets/bom/test.js	(revision 2894)
@@ -0,0 +1,1 @@
+aaa
Index: /CKReleaser/trunk/test/_assets/bom/test.txt
===================================================================
--- /CKReleaser/trunk/test/_assets/bom/test.txt	(revision 2894)
+++ /CKReleaser/trunk/test/_assets/bom/test.txt	(revision 2894)
@@ -0,0 +1,1 @@
+aaa
Index: /CKReleaser/trunk/test/_assets/bom/test_bom.asp
===================================================================
--- /CKReleaser/trunk/test/_assets/bom/test_bom.asp	(revision 2894)
+++ /CKReleaser/trunk/test/_assets/bom/test_bom.asp	(revision 2894)
@@ -0,0 +1,1 @@
+﻿aaa
Index: /CKReleaser/trunk/test/_assets/bom/test_bom.html
===================================================================
--- /CKReleaser/trunk/test/_assets/bom/test_bom.html	(revision 2894)
+++ /CKReleaser/trunk/test/_assets/bom/test_bom.html	(revision 2894)
@@ -0,0 +1,1 @@
+﻿aaa
Index: /CKReleaser/trunk/test/_assets/bom/test_bom.js
===================================================================
--- /CKReleaser/trunk/test/_assets/bom/test_bom.js	(revision 2894)
+++ /CKReleaser/trunk/test/_assets/bom/test_bom.js	(revision 2894)
@@ -0,0 +1,1 @@
+﻿aaa
Index: /CKReleaser/trunk/test/_assets/bom/test_bom.txt
===================================================================
--- /CKReleaser/trunk/test/_assets/bom/test_bom.txt	(revision 2894)
+++ /CKReleaser/trunk/test/_assets/bom/test_bom.txt	(revision 2894)
@@ -0,0 +1,1 @@
+﻿aaa
Index: /CKReleaser/trunk/test/test.js
===================================================================
--- /CKReleaser/trunk/test/test.js	(revision 2893)
+++ /CKReleaser/trunk/test/test.js	(revision 2894)
@@ -52,5 +52,5 @@
 			error( "Can't create temp directory: " + tempDir );
 
-		var tests = [ 'directives', 'skins', 'samples' ];
+		var tests = [ 'directives', 'skins', 'samples', 'bom' ];
 
 		for ( var i = 0 ; i < tests.length ; i++ )
@@ -205,4 +205,42 @@
 		}
 	}
+	
+	function testBom()
+	{
+		var file, file2;
+		var dir = new File('tmp/bom');
+		
+		CKRELEASER.io.copy(new File('_assets/bom'), dir);
+
+		var children = dir.list();
+		for ( var i = 0 ; i < children.length ; i++ )
+		{
+			var file = new File( dir, children[i] );
+			
+			extension = CKRELEASER.io.getExtension( file.getName() );
+			
+			switch ( extension )
+			{
+				case "gif":
+				case "jpg":
+				case "jpeg":
+				case "png":
+				case "gz":
+				case "zip":
+					break;
+
+				case "asp":
+				case "js":
+					CKRELEASER.io.setByteOrderMark( file, true );
+					assertEquals( file.length(), 6);
+					break;
+
+				default:
+					CKRELEASER.io.setByteOrderMark( file, false );
+					assertEquals( file.length(), 3);
+					break;
+			}			
+		}
+	}
 
 	function testRemoveComments()
@@ -222,4 +260,5 @@
 	testSamples();
 	testRemoveComments();
+	testBom();
 
 	print( '' );
