Index: /CKEditor/branches/prototype/_source/plugins/image/dialogs/image.js
===================================================================
--- /CKEditor/branches/prototype/_source/plugins/image/dialogs/image.js	(revision 2820)
+++ /CKEditor/branches/prototype/_source/plugins/image/dialogs/image.js	(revision 2821)
@@ -123,22 +123,18 @@
 		var url = dialog.getContentElement( 'info', 'txtUrl' ).getValue();
 
-		// New url
-		if ( url != dialog.editObj[ 'imagePreview' ].getAttribute( 'src' ) )
-			dialog.editObj[ 'imagePreview' ].setAttribute( 'src', url );
-		
-		var width = 0;
-		var height = 0;
 		var oImageOriginal = dialog.editObj[ 'imageOriginal' ];
-			
-		width = dialog.getValueOf( 'info', 'txtWidth' );
-		height = dialog.getValueOf( 'info', 'txtHeight' );
-
-		if ( width == '' && oImageOriginal )
-			width = oImageOriginal.$.width;
-		if ( height == '' && oImageOriginal )
-			height = oImageOriginal.$.height;
-
-		dialog.editObj[ 'imagePreview' ].setStyle( 'width', width + 'px');
-		dialog.editObj[ 'imagePreview' ].setStyle( 'height', height + 'px');
+		if ( oImageOriginal && oImageOriginal.getCustomData( 'isReady' ) == 'true' )
+		{
+			var width = dialog.getValueOf( 'info', 'txtWidth' );
+			var height = dialog.getValueOf( 'info', 'txtHeight' );
+
+			if ( width == '' && oImageOriginal )
+				width = oImageOriginal.$.width;
+			if ( height == '' && oImageOriginal )
+				height = oImageOriginal.$.height;
+
+			dialog.editObj[ 'imagePreview' ].setStyle( 'width', width + 'px');
+			dialog.editObj[ 'imagePreview' ].setStyle( 'height', height + 'px');
+		}
 
 		// Read attributes
@@ -187,22 +183,47 @@
 			var loader = CKEDITOR.document.getById( 'ImagePreviewLoader' );
 			if ( loader )
-				loader.setStyle('display', '');
-
-			dialog.editObj[ 'imageOriginal' ].on( 'load', function()
-				{
-					// Image is ready.
-					this.editObj[ 'imageOriginal' ].setCustomData( 'isReady', 'true' );
-					this.editObj[ 'imageOriginal' ].removeListener( 'load' );
-
-					// Hide loader
-					var loader = CKEDITOR.document.getById( 'ImagePreviewLoader' );
-					if ( loader )
-						loader.setStyle('display', 'none' );
-			
-					// New image -> new domensions
-					if ( forceResetSize ){
-						resetSize( this );
-					}
-				}, dialog );
+				loader.setStyle( 'display', '' );
+
+			var onImgLoad = function()
+			{
+				// Image is ready.
+				this.editObj[ 'imageOriginal' ].setCustomData( 'isReady', 'true' );
+				this.editObj[ 'imageOriginal' ].removeListener( 'load', onImgLoad );
+				this.editObj[ 'imageOriginal' ].removeListener( 'error', onImgLoadError );
+				this.editObj[ 'imageOriginal' ].removeListener( 'abort', onImgLoadError );
+
+				// Hide loader
+				CKEDITOR.document.getById( 'ImagePreviewLoader' ).setStyle( 'display', 'none' );
+
+				// New image -> new domensions
+				if ( forceResetSize ){
+					resetSize( this );
+				}
+			}
+			var onImgLoadError = function()
+			{
+				// Error. Image is not loaded.
+				this.editObj[ 'imageOriginal' ].removeListener( 'load', onImgLoad );
+				this.editObj[ 'imageOriginal' ].removeListener( 'error', onImgLoadError );
+				this.editObj[ 'imageOriginal' ].removeListener( 'abort', onImgLoadError );
+
+				// Set Error image.
+				var noimage = CKEDITOR.getUrl(
+					'_source/' +	// TODO: Add @-Packager.RemoveLine to the final build process.
+					'skins/' + editor.config.skin + '/images/dialog.noimage.gif' );
+
+				this.editObj[ 'imagePreview' ].setAttribute( 'src', noimage );
+
+				// Hide loader
+				CKEDITOR.document.getById( 'ImagePreviewLoader' ).setStyle( 'display', 'none' );
+				switchLockRatio( dialog, false );	// Unlock.
+			}
+
+			dialog.editObj[ 'imagePreview' ].removeStyle( 'width' );
+			dialog.editObj[ 'imagePreview' ].removeStyle( 'height' );
+			dialog.editObj[ 'imagePreview' ].setAttribute( 'src', url );
+			dialog.editObj[ 'imageOriginal' ].on( 'load', onImgLoad, dialog );
+			dialog.editObj[ 'imageOriginal' ].on( 'error', onImgLoadError, dialog );
+			dialog.editObj[ 'imageOriginal' ].on( 'abort', onImgLoadError, dialog );
 			dialog.editObj[ 'imageOriginal' ].setAttribute( 'src', url );
 		}
@@ -211,9 +232,15 @@
 	var switchLockRatio = function( dialog, value )
 	{
- 		if ( value != undefined )
-			dialog.imageLockRatio = value
+		var oImageOriginal = dialog.editObj[ 'imageOriginal' ];
+		if ( oImageOriginal && oImageOriginal.getCustomData( 'isReady' ) == 'true' )
+		{
+	 		if ( value != undefined )
+				dialog.imageLockRatio = value
+			else
+				dialog.imageLockRatio = !dialog.imageLockRatio;
+		}
 		else
-			dialog.imageLockRatio = !dialog.imageLockRatio;
-
+			dialog.imageLockRatio = false;
+		
 		var ratioButton = CKEDITOR.document.getById( 'btnLockSizes' );
 		if ( dialog.imageLockRatio )
Index: /CKEditor/branches/prototype/_source/skins/default/dialog.css
===================================================================
--- /CKEditor/branches/prototype/_source/skins/default/dialog.css	(revision 2820)
+++ /CKEditor/branches/prototype/_source/skins/default/dialog.css	(revision 2821)
@@ -677,5 +677,5 @@
 	height : 160px;
 	width : 230px;
-	background-image: url(images/dialog.loading30.gif);
+	background-image: url(images/dialog.loading.gif);
 	background-repeat: no-repeat;
 	background-position: 47% 47%;
