Htk.FullImage = new Class ({ Extends: Vn.Object ,img: null ,timeout: 0 ,loading: false ,visible: false ,hideCalled: false ,closed: false ,initialize: function (props) { this.parent (props); var div = document.createElement ('div'); div.className = 'htk-full-image'; div.addEventListener ('mouseover', this.cancelHide.bind (this)); div.addEventListener ('mouseout', this.hideNow.bind (this)); var loadingBox = document.createElement ('div'); loadingBox.className = 'htk-full-image-loader'; var loadingImg = document.createElement ('img'); loadingImg.src = 'image/loader-black.gif'; loadingImg.alt = _('Loading'); loadingBox.appendChild (loadingImg); this.div = div; this.loadingBox = loadingBox; this.loadingImg = loadingImg; } ,getLeft: function (width) { return parseInt (Vn.Browser.getPageXOffset () + (Vn.Browser.getInnerWidth () - width) / 2) +'px'; } ,getTop: function (height) { return parseInt (Vn.Browser.getPageYOffset () + (Vn.Browser.getInnerHeight () - height) / 2) +'px'; } ,show: function (basedir, file) { var src = basedir +'/'+ file; if (this.closed && this.src == src) return; this.cancelHide (); this.loadingBox.style.left = this.getLeft (40); this.loadingBox.style.top = this.getTop (40); this.closed = false; this.src = src this.img = document.createElement ('img'); this.img.src = src; this.img.addEventListener ('load', this.imageLoaded.bind (this, this.img)); this.img.addEventListener ('error', this.hideLoading.bind (this)); if (!this.img.complete && !this.loading) { document.body.appendChild (this.loadingBox); this.loading = true; } } ,imageLoaded: function (img) { if (img != this.img || this.hideCalled) return; var scale = 1.0; var width = img.width; var height = img.height; var innerWidth = Vn.Browser.getInnerWidth () - 350; var innerHeight = Vn.Browser.getInnerHeight () - 120; if (width > innerWidth) { scale = width / innerWidth; height = parseInt (height / scale); width = innerWidth; } if (height > innerHeight) { scale = height / innerHeight; width = parseInt (width / scale); height = innerHeight; } this.hideLoading (); this.div.style.left = this.getLeft (width + 2); this.div.style.top = this.getTop (height + 2); this.div.style.width = width +'px'; this.div.style.height = height +'px'; if (scale !== 1.0) { img.style.width = width +'px'; img.style.height = height +'px'; } if (this.div.firstChild != null) this.div.replaceChild (img, this.div.firstChild); else this.div.appendChild (img); img.addEventListener ('click', this.onImageClick.bind (this)); if (!this.visible) { document.body.appendChild (this.div); this.visible = true; this.onDocumentClickCallback = this.hideNow.bind (this); document.addEventListener ('click', this.onDocumentClickCallback); } } ,onImageClick: function () { this.closed = true; } ,hide: function () { this.hideCalled = true; this.hideLoading (); if (this.visible) this.timeout = setTimeout (this.hideNow.bind (this), 450); } ,hideNow: function () { if (this.visible) { document.body.removeChild (this.div); this.hideCalled = true; this.visible = false; this.timeout = 0; } document.removeEventListener ('click', this.onDocumentClickCallback); this.onDocumentClickCallback = null; } ,cancelHide: function () { if (this.timeout) { clearTimeout (this.timeout); this.timeout = 0; } this.hideCalled = false; } ,hideLoading: function () { if (this.loading) { document.body.removeChild (this.loadingBox); this.loading = false; } } });