// Usage:
//
// $("#element").screen();
// $("#element").unscreen();
// $.unscreen(); // remove all screens
//
;(function($) {
function resetPosition($screen, $el) {
$screen
.css({
'top': $el.position().top + parseInt($el.css('margin-top')),
'left': $el.position().left + parseInt($el.css('margin-left')),
'position': 'absolute',
'width': $el.outerWidth(),
'height': $el.outerHeight()
});
};
$.uiscreen = $.extend(function(el) {
$.uiscreen.activate(el);
}, {
// State
$screens: [],
// Options
background: '#555555',
opacity: 0.5,
screen_template: "
",
z_index: 10010,
fadein_time: 250,
fadeout_time: 0,
// Methods
activate: function(el, options) {
var $el = $(el);
if ($(el).length === 0) { return false; }
if (!options) { options = {}; }
var id = "uiscreen-for-" + ($el.attr('id') ? $el.attr('id') : 'noid');
var $screen = this.$screen($el);
if (options['class']) { $screen.addClass(options['class']); }
$screen.css({ 'opacity': this.opacity });
resetPosition($screen, $el);
$el.offsetParent().append($screen);
$screen
.data('parent', $el)
.attr('id', id)
.addClass('fadein')
.show()
.animate(
{ 'opacity': this.opacity },
this.fadein_time,
function() {
$(this).removeClass('fadein');
});
},
kill: function(el, options) {
var $el = $(el);
if (!$el.data('$screen')) {
return;
}
var speed = (options && (options.speed != undefined)) ? options.speed : this.fadeout_time;
$el.data('$screen')
.addClass('fadeout')
.animate(
{ 'opacity': 0 },
speed,
function() {
$(this).remove();
});
$el.data('$screen', null);
},
// Return the screen for a certain element
$screen: function($el) {
if ($el.data('$screen')) { return $el.data('$screen'); }
// Construct the screen.
var $screen =
$(this.screen_template).
css({
'position': 'absolute',
'margin': 0,
'padding':0,
'border': 0,
'top': 0,
'left': 0,
'width': 1,
'height': 1,
'z-index': this.z_index
})
.hide();
if (this.background)
{ $screen.css({ 'background': this.background }); }
$(document.body).append($screen);
this.$screens.push($screen);
$el.data('$screen', $screen);
return $screen;
}
});
$.unscreen = function(options) {
var $parents = $('');
for (i in $.uiscreen.$screens) {
var screen = $.uiscreen.$screens[i];
var $parent = screen.data('parent');
if (($parent) && ($parent.unscreen)) { $parent.unscreen(options); }
}
};
$.fn.screen = function(options) {
this.each(function() {
$.uiscreen.activate($(this), options);
});
return this;
};
$.fn.unscreen = function(options) {
this.each(function() {
$.uiscreen.kill($(this), options);
});
return this;
};
// Make sure that all uiscreens hug their parents, literally
$.uiscreen.autoresize = function() {
var $parents = $('');
for (i in $.uiscreen.$screens) {
var screen = $.uiscreen.$screens[i];
var $parent = screen.data('parent');
if ($parent) { resetPosition($(screen), $parent); }
}
};
$(window).resize(function () {
$.uiscreen.autoresize();
});
})(jQuery);