diff --git a/source/Ox.UI/css/Ox.UI.css b/source/Ox.UI/css/Ox.UI.css
index 8edeb405..19615c04 100644
--- a/source/Ox.UI/css/Ox.UI.css
+++ b/source/Ox.UI/css/Ox.UI.css
@@ -2691,6 +2691,17 @@ Miscellaneous
padding: 0;
}
+.OxLoadingScreen {
+ position: absolute;
+}
+.OxLoadingScreen > div {
+ position: absolute;
+ text-align: center;
+}
+.OxLoadingScreen > div > div {
+ margin-top: 4px;
+}
+
.OxSpecialLink {
padding: 0 2px 0 2px;
border-radius: 2px;
diff --git a/source/Ox.UI/css/theme.css b/source/Ox.UI/css/theme.css
index 50fc9c0e..5ea25e56 100644
--- a/source/Ox.UI/css/theme.css
+++ b/source/Ox.UI/css/theme.css
@@ -1155,6 +1155,12 @@ Miscellaneous
================================================================================
*/
+.$themeClass .OxImageElement > .OxLoadingScreen {
+ background-image: -moz-linear-gradient(top, $imageLoadingGradient);
+ background-image: -o-linear-gradient(top, $imageLoadingGradient);
+ background-image: -webkit-linear-gradient(top, $imageLoadingGradient);
+}
+
.$themeClass .OxSelectableElement {
background-image: -moz-linear-gradient(top, $listItemGradient);
background-image: -o-linear-gradient(top, $listItemGradient);
diff --git a/source/Ox.UI/js/Core/ImageElement.js b/source/Ox.UI/js/Core/ImageElement.js
new file mode 100644
index 00000000..541cf8c1
--- /dev/null
+++ b/source/Ox.UI/js/Core/ImageElement.js
@@ -0,0 +1,54 @@
+'use strict';
+
+Ox.ImageElement = function(options, self) {
+
+ self = self || {};
+ var that = Ox.Element({}, self)
+ .defaults({
+ height: 0,
+ src: '',
+ width: 0
+ })
+ .options(options || {})
+ .update({
+ height: setSizes,
+ src: loadImage,
+ width: setSizes
+ })
+ .addClass('OxImageElement');
+
+ self.$screen = Ox.LoadingScreen({size: 16}).appendTo(that);
+
+ loadImage();
+ setSizes();
+
+ function loadImage() {
+ if (self.$image) {
+ self.$image.off({load: showImage}).remove();
+ }
+ self.$image = $('')
+ .one({load: showImage})
+ .attr({src: self.options.src});
+ }
+
+ function setSizes() {
+ var css = {
+ width: self.options.width,
+ height: self.options.height
+ };
+ self.$screen && self.$screen.options(css);
+ css = Ox.map(css, function(value) {
+ return value + 'px';
+ });
+ that.css(css);
+ self.$image.css(css);
+ }
+
+ function showImage() {
+ self.$screen.remove();
+ self.$image.appendTo(that);
+ }
+
+ return that;
+
+};
\ No newline at end of file
diff --git a/source/Ox.UI/js/Core/LoadingScreen.js b/source/Ox.UI/js/Core/LoadingScreen.js
new file mode 100644
index 00000000..21d6244b
--- /dev/null
+++ b/source/Ox.UI/js/Core/LoadingScreen.js
@@ -0,0 +1,60 @@
+'use strict';
+
+Ox.LoadingScreen = function(options, self) {
+
+ self = self || {};
+ var that = Ox.Element({}, self)
+ .defaults({
+ height: 256,
+ size: 32,
+ text: '',
+ width: 256
+ })
+ .options(options || {})
+ .update({
+ height: setSizes,
+ text: function() {
+ self.$text && self.$text.html(self.options.text);
+ },
+ width: setSizes
+ })
+ .addClass('OxLoadingScreen');
+
+ self.$box = $('