blob: 02c0c4970c2373343bed3e9e085e891543ccf868 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
(function($) {
$.fn.centerBox = function() {
return this.each(function() {
var s = this.style;
s.left = (($(window).width() - $(this).width()) / 2) + "px";
s.top = (($(window).height() - $(this).height()) / 2) + "px";
});
}
$.showDialog = function(url, options) {
options = options || {};
options.load = options.load || function() {};
options.cancel = options.cancel || function() {};
options.validate = options.validate || function() { return true };
options.submit = options.submit || function() {};
var overlay = $('<div id="overlay" style="z-index:1001"></div>')
.css("opacity", "0");
var dialog = $('<div id="dialog" style="z-index:1002;position:fixed;display:none;"></div>');
if ($.browser.msie) {
var frame = $('<iframe id="overlay-frame" style="z-index:1000;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="javascript:false"></iframe>')
.css("opacity", "0").appendTo(document.body);
if (parseInt($.browser.version)<7) {
dialog.css("position", "absolute");
overlay.css("position", "absolute");
$("html,body").css({width: "100%", height: "100%"});
}
}
overlay.appendTo(document.body).fadeTo(100, 0.6);
dialog.appendTo(document.body).addClass("loading").centerBox().fadeIn(400);
$(document).keydown(function(e) {
if (e.keyCode == 27) dismiss(); // dismiss on escape key
});
function dismiss() {
dialog.fadeOut("fast", function() {
$("#dialog, #overlay, #overlay-frame").remove();
});
$(document).unbind("keydown");
}
overlay.click(function() { dismiss(); });
function showError(name, message) {
var input = dialog.find(":input[name=" + name + "]");
input.addClass("error").next("div.error").remove();
$('<div class="error"></div>').text(message).insertAfter(input);
}
$.get(url, function(html) {
$(html).appendTo(dialog);
dialog.removeClass("loading").addClass("loaded").centerBox().each(function() {
options.load(dialog.children()[0]);
$(":input:first", dialog).each(function() { this.focus() });
$("button.cancel", dialog).click(function() { // dismiss on cancel
dismiss();
options.cancel();
});
$("form", dialog).submit(function(e) { // invoke callback on submit
e.preventDefault();
dialog.find("div.error").remove().end().find(".error").removeClass("error");
var data = {};
$.each($("form :input", dialog).serializeArray(), function(i, field) {
data[field.name] = field.value;
});
$("form :file", dialog).each(function() {
data[this.name] = this.value; // file inputs need special handling
});
options.submit(data, function callback(errors) {
if ($.isEmptyObject(errors)) {
dismiss();
} else {
for (var name in errors) {
showError(name, errors[name]);
}
}
});
return false;
});
});
});
}
})(jQuery);