///
///
Umbraco.Sys.registerNamespace("Umbraco.Controls");
(function($) {
//jQuery plugin for Umbraco image viewer control
$.fn.UmbracoImageViewer = function(opts) {
//all options must be specified
var conf = $.extend({
style: false,
linkTarget: "_blank",
umbPath: ""
}, opts);
return this.each(function() {
new Umbraco.Controls.ImageViewer().init($(this), conf);
});
}
$.fn.UmbracoImageViewerAPI = function() {
/// exposes the Umbraco Image Viewer api for the selected object
//if there's more than item in the selector, throw exception
if ($(this).length != 1) {
throw "UmbracoImageViewerAPI selector requires that there be exactly one control selected";
};
return Umbraco.Controls.ImageViewer.inst[$(this).attr("id")] || null;
};
Umbraco.Controls.ImageViewer = function() {
return {
_cntr: ++Umbraco.Controls.ImageViewer.cntr,
_containerId: null,
_context: null,
_serviceUrl: "",
_umbPath: "",
_style: false,
_linkTarget: "",
init: function(jItem, opts) {
//this is stored so that we search the current document/iframe for this object
//when calling _getContainer. Before this was not required but for some reason inside the
//TinyMCE popup, when doing an ajax call, the context is lost to the jquery item!
this._context = jItem.get(0).ownerDocument;
//store a reference to this api by the id and the counter
Umbraco.Controls.ImageViewer.inst[this._cntr] = this;
if (!jItem.attr("id")) jItem.attr("id", "UmbImageViewer_" + this._cntr);
Umbraco.Controls.ImageViewer.inst[jItem.attr("id")] = Umbraco.Controls.ImageViewer.inst[this._cntr];
this._containerId = jItem.attr("id");
this._umbPath = opts.umbPath;
this._serviceUrl = this._umbPath + "/controls/Images/ImageViewerUpdater.asmx";
this._style = opts.style;
this._linkTarget = opts.linkTarget;
},
updateImage: function(mediaId, callback) {
/// Updates the image to show the mediaId parameter using AJAX
this._showThrobber();
var _this = this;
$.ajax({
type: "POST",
url: _this._serviceUrl + "/UpdateImage",
data: '{ "mediaId": ' + parseInt(mediaId) + ', "style": "' + _this._style + '", "linkTarget": "' + _this._linkTarget + '"}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
var rHtml = $("
").append(msg.d.html); //get the full html response wrapped in temp div
_this._updateImageFromAjax(rHtml);
if (typeof callback == "function") {
//build the parameters to pass back to the callback method
var params = {
hasImage: _this._getContainer().find("img.noimage").length == 0,
mediaId: msg.d.mediaId,
width: msg.d.width,
height: msg.d.height,
url: msg.d.url,
alt: msg.d.alt
};
//call the callback method
callback.call(_this, params);
}
}
});
},
showImage: function(path) {
///
This will force the image to show the path passed in
if (this._style != "ThumbnailPreview") {
this._getContainer().find("img").attr("src", path);
}
else {
c = this._getContainer().find(".bgImage");
c.css("background-image", "url('" + path + "')");
}
},
_getContainer: function() {
return $("#" + this._containerId, this._context);
},
_updateImageFromAjax: function(rHtml) {
this._getContainer().html(rHtml.find(".imageViewer").html()); //replace the html with the inner html of the image viewer response
},
_showThrobber: function() {
var c = null;
if (this._style != "ThumbnailPreview") {
c = this._getContainer().find("img");
c.attr("src", this._umbPath + "/images/throbber.gif");
c.css("margin-top", ((c.height() - 15) / 2) + "px");
c.css("margin-left", ((c.width() - 15) / 2) + "px");
}
else {
c = this._getContainer().find(".bgImage");
c.css("background-image", "");
c.html("
![]()
");
var img = c.find("img");
img.attr("src", this._umbPath + "/images/throbber.gif");
img.css("margin-top", "45px");
img.css("margin-left", "45px");
}
}
}
}
// instance manager
Umbraco.Controls.ImageViewer.cntr = 0;
Umbraco.Controls.ImageViewer.inst = {};
})(jQuery);