;(function ($){
var $window=$(window);
var options={};
var zindexvalues=[];
var lastclicked=[];
var scrollbarwidth;
var bodymarginright=null;
var opensuffix='_open';
var closesuffix='_close';
var visiblePopupsArray=[];
var transitionsupport=null;
var opentimer;
var iOS=/(iPad|iPhone|iPod)/g.test(navigator.userAgent);
var focusableElementsString="a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]";
var methods={
_init: function (el){
var $el=$(el);
var options=$el.data('popupoptions');
lastclicked[el.id]=false;
zindexvalues[el.id]=0;
if(!$el.data('popup-initialized')){
$el.attr('data-popup-initialized', 'true');
methods._initonce(el);
}
if(options.autoopen){
setTimeout(function(){
methods.show(el, 0);
}, 0);
}},
_initonce: function (el){
var $el=$(el);
var $body=$('body');
var $wrapper;
var options=$el.data('popupoptions');
var css;
bodymarginright=parseInt($body.css('margin-right'), 10);
transitionsupport=document.body.style.webkitTransition!==undefined ||
document.body.style.MozTransition!==undefined ||
document.body.style.msTransition!==undefined ||
document.body.style.OTransition!==undefined ||
document.body.style.transition!==undefined;
if(options.type=='tooltip'){
options.background=false;
options.scrolllock=false;
}
if(options.backgroundactive){
options.background=false;
options.blur=false;
options.scrolllock=false;
}
if(options.scrolllock){
var parent;
var child;
if(typeof scrollbarwidth==='undefined'){
parent=$('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body');
child=parent.children();
scrollbarwidth=child.innerWidth() - child.height(99).innerWidth();
parent.remove();
}}
if(!$el.attr('id')){
$el.attr('id', 'j-popup-' + parseInt((Math.random() * 100000000), 10));
}
$el.addClass('popup_content');
if((options.background)&&(!$('#' + el.id + '_background').length)){
$body.append('<div id="' + el.id + '_background" class="popup_background"></div>');
var $background=$('#' + el.id + '_background');
$background.css({
opacity: 0,
visibility: 'hidden',
backgroundColor: options.color,
position: 'fixed',
top: 0,
right: 0,
bottom: 0,
left: 0
});
if(options.setzindex&&!options.autozindex){
$background.css('z-index', '100000');
}
if(options.transition){
$background.css('transition', options.transition);
}}
$body.append(el);
$el.wrap('<div id="' + el.id + '_wrapper" class="popup_wrapper" />');
$wrapper=$('#' + el.id + '_wrapper');
$wrapper.css({
opacity: 0,
visibility: 'hidden',
position: 'absolute'
});
if(iOS){
$wrapper.css('cursor', 'pointer');
}
if(options.type=='overlay'){
$wrapper.css('overflow','auto');
}
$el.css({
opacity: 0,
visibility: 'hidden',
display: 'inline-block'
});
if(options.setzindex&&!options.autozindex){
$wrapper.css('z-index', '100001');
}
if(!options.outline){
$el.css('outline', 'none');
}
if(options.transition){
$el.css('transition', options.transition);
$wrapper.css('transition', options.transition);
}
$el.attr('aria-hidden', true);
if(options.type=='overlay'){
$el.css({
textAlign: 'left',
position: 'relative',
verticalAlign: 'middle'
});
css={
position: 'fixed',
width: '100%',
height: '100%',
top: 0,
left: 0,
textAlign: 'center'
};
if(options.backgroundactive){
css.position='absolute';
css.height='0';
css.overflow='visible';
}
$wrapper.css(css);
$wrapper.append('<div class="popup_align" />');
$('.popup_align').css({
display: 'inline-block',
verticalAlign: 'middle',
height: '100%'
});
}
$el.attr('role', 'dialog');
var openelement=(options.openelement) ? options.openelement:('.' + el.id + opensuffix);
$(openelement).each(function (i, item){
$(item).attr('data-popup-ordinal', i);
if(!item.id){
$(item).attr('id', 'open_' + parseInt((Math.random() * 100000000), 10));
}});
if(!($el.attr('aria-labelledby')||$el.attr('aria-label'))){
$el.attr('aria-labelledby', $(openelement).attr('id'));
}
if(options.action=='hover'){
options.keepfocus=false;
$(openelement).on('mouseenter', function (event){
methods.show(el, $(this).data('popup-ordinal'));
});
$(openelement).on('mouseleave', function (event){
methods.hide(el);
});
}else{
$(document).on('click', openelement, function (event){
event.preventDefault();
var ord=$(this).data('popup-ordinal');
setTimeout(function(){
methods.show(el, ord);
}, 0);
});
}
if(options.closebutton){
methods.addclosebutton(el);
}
if(options.detach){
$el.hide().detach();
}else{
$wrapper.hide();
}},
show: function (el, ordinal){
var $el=$(el);
if($el.data('popup-visible')){
return;
}
if(!$el.data('popup-initialized')){
methods._init(el);
}
$el.attr('data-popup-initialized', 'true');
var $body=$('body');
var options=$el.data('popupoptions');
var $wrapper=$('#' + el.id + '_wrapper');
var $background=$('#' + el.id + '_background');
callback(el, ordinal, options.beforeopen);
lastclicked[el.id]=ordinal;
setTimeout(function(){
visiblePopupsArray.push(el.id);
}, 0);
if(options.autozindex){
var elements=document.getElementsByTagName('*');
var len=elements.length;
var maxzindex=0;
for (var i=0; i<len; i++){
var elementzindex=$(elements[i]).css('z-index');
if(elementzindex!=='auto'){
elementzindex=parseInt(elementzindex, 10);
if(maxzindex < elementzindex){
maxzindex=elementzindex;
}}
}
zindexvalues[el.id]=maxzindex;
if(options.background){
if(zindexvalues[el.id] > 0){
$('#' + el.id + '_background').css({
zIndex: (zindexvalues[el.id] + 1)
});
}}
if(zindexvalues[el.id] > 0){
$wrapper.css({
zIndex: (zindexvalues[el.id] + 2)
});
}}
if(options.detach){
$wrapper.prepend(el);
$el.show();
}else{
$wrapper.show();
}
opentimer=setTimeout(function(){
$wrapper.css({
visibility: 'visible',
opacity: 1
});
$('html').addClass('popup_visible').addClass('popup_visible_' + el.id);
$wrapper.addClass('popup_wrapper_visible');
}, 20);
if(options.scrolllock){
$body.css('overflow', 'hidden');
if($body.height() > $window.height()){
$body.css('margin-right', bodymarginright + scrollbarwidth);
}}
if(options.backgroundactive){
$el.css({
top:(
$window.height() - (
$el.get(0).offsetHeight +
parseInt($el.css('margin-top'), 10) +
parseInt($el.css('margin-bottom'), 10)
)
)/2 +'px'
});
}
$el.css({
'visibility': 'visible',
'opacity': 1
});
if(options.background){
$background.css({
'visibility': 'visible',
'opacity': options.opacity
});
setTimeout(function(){
$background.css({
'opacity': options.opacity
});
}, 0);
}
$el.data('popup-visible', true);
methods.reposition(el, ordinal);
$el.data('focusedelementbeforepopup', document.activeElement);
if(options.keepfocus){
$el.attr('tabindex', -1);
setTimeout(function(){
if(options.focuselement==='closebutton'){
$('#' + el.id + ' .' + el.id + closesuffix + ':first').focus();
}else if(options.focuselement){
$(options.focuselement).focus();
}else{
$el.focus();
}}, options.focusdelay);
}
$(options.pagecontainer).attr('aria-hidden', true);
$el.attr('aria-hidden', false);
callback(el, ordinal, options.onopen);
if(transitionsupport){
$wrapper.one('transitionend', function(){
callback(el, ordinal, options.opentransitionend);
});
}else{
callback(el, ordinal, options.opentransitionend);
}
if(options.type=='tooltip'){
$(window).on('resize.' + el.id, function (){
methods.reposition(el, ordinal);
});
}},
hide: function (el, outerClick){
var popupIdIndex=$.inArray(el.id, visiblePopupsArray);
if(popupIdIndex===-1){
return;
}
if(opentimer){
clearTimeout(opentimer);
}
var $body=$('body');
var $el=$(el);
var options=$el.data('popupoptions');
var $wrapper=$('#' + el.id + '_wrapper');
var $background=$('#' + el.id + '_background');
$el.data('popup-visible', false);
if(visiblePopupsArray.length===1){
$('html').removeClass('popup_visible').removeClass('popup_visible_' + el.id);
}else{
if($('html').hasClass('popup_visible_' + el.id)){
$('html').removeClass('popup_visible_' + el.id);
}}
visiblePopupsArray.splice(popupIdIndex, 1);
if($wrapper.hasClass('popup_wrapper_visible')){
$wrapper.removeClass('popup_wrapper_visible');
}
if(options.keepfocus&&!outerClick){
setTimeout(function(){
if($($el.data('focusedelementbeforepopup')).is(':visible')){
$el.data('focusedelementbeforepopup').focus();
}}, 0);
}
$wrapper.css({
'visibility': 'hidden',
'opacity': 0
});
$el.css({
'visibility': 'hidden',
'opacity': 0
});
if(options.background){
$background.css({
'visibility': 'hidden',
'opacity': 0
});
}
$(options.pagecontainer).attr('aria-hidden', false);
$el.attr('aria-hidden', true);
callback(el, lastclicked[el.id], options.onclose);
if(transitionsupport&&$el.css('transition-duration')!=='0s'){
$el.one('transitionend', function(e){
if(!($el.data('popup-visible'))){
if(options.detach){
$el.hide().detach();
}else{
$wrapper.hide();
}}
if(options.scrolllock){
setTimeout(function(){
$body.css({
overflow: 'visible',
'margin-right': bodymarginright
});
}, 10);
}
callback(el, lastclicked[el.id], options.closetransitionend);
});
}else{
if(options.detach){
$el.hide().detach();
}else{
$wrapper.hide();
}
if(options.scrolllock){
setTimeout(function(){
$body.css({
overflow: 'visible',
'margin-right': bodymarginright
});
}, 10);
}
callback(el, lastclicked[el.id], options.closetransitionend);
}
if(options.type=='tooltip'){
$(window).off('resize.' + el.id);
}},
toggle: function (el, ordinal){
if($(el).data('popup-visible')){
methods.hide(el);
}else{
setTimeout(function(){
methods.show(el, ordinal);
}, 0);
}},
reposition: function (el, ordinal){
var $el=$(el);
var options=$el.data('popupoptions');
var $wrapper=$('#' + el.id + '_wrapper');
var $background=$('#' + el.id + '_background');
ordinal=ordinal||0;
if(options.type=='tooltip'){
$wrapper.css({
'position': 'absolute'
});
var $tooltipanchor;
if(options.tooltipanchor){
$tooltipanchor=$(options.tooltipanchor);
}else if(options.openelement){
$tooltipanchor=$(options.openelement).filter('[data-popup-ordinal="' + ordinal + '"]');
}else{
$tooltipanchor=$('.' + el.id + opensuffix + '[data-popup-ordinal="' + ordinal + '"]');
}
var linkOffset=$tooltipanchor.offset();
if(options.horizontal=='right'){
$wrapper.css('left', linkOffset.left + $tooltipanchor.outerWidth() + options.offsetleft);
}else if(options.horizontal=='leftedge'){
$wrapper.css('left', linkOffset.left + $tooltipanchor.outerWidth() - $tooltipanchor.outerWidth() +  options.offsetleft);
}else if(options.horizontal=='left'){
$wrapper.css('right', $window.width() - linkOffset.left  - options.offsetleft);
}else if(options.horizontal=='rightedge'){
$wrapper.css('right', $window.width()  - linkOffset.left - $tooltipanchor.outerWidth() - options.offsetleft);
}else{
$wrapper.css('left', linkOffset.left + ($tooltipanchor.outerWidth() / 2) - ($el.outerWidth() / 2) - parseFloat($el.css('marginLeft')) + options.offsetleft);
}
if(options.vertical=='bottom'){
$wrapper.css('top', linkOffset.top + $tooltipanchor.outerHeight() + options.offsettop);
}else if(options.vertical=='bottomedge'){
$wrapper.css('top', linkOffset.top + $tooltipanchor.outerHeight() - $el.outerHeight() + options.offsettop);
}else if(options.vertical=='top'){
$wrapper.css('bottom', $window.height() - linkOffset.top - options.offsettop);
}else if(options.vertical=='topedge'){
$wrapper.css('bottom', $window.height() - linkOffset.top - $el.outerHeight() - options.offsettop);
}else{
$wrapper.css('top', linkOffset.top + ($tooltipanchor.outerHeight() / 2) - ($el.outerHeight() / 2) - parseFloat($el.css('marginTop')) + options.offsettop);
}}else if(options.type=='overlay'){
if(options.horizontal){
$wrapper.css('text-align', options.horizontal);
}else{
$wrapper.css('text-align', 'center');
}
if(options.vertical){
$el.css('vertical-align', options.vertical);
}else{
$el.css('vertical-align', 'middle');
}}
},
addclosebutton: function (el){
var genericCloseButton;
if($(el).data('popupoptions').closebuttonmarkup){
genericCloseButton=$(options.closebuttonmarkup).addClass(el.id + '_close');
}else{
genericCloseButton='<button class="popup_close ' + el.id + '_close" title="Close" aria-label="Close"><span aria-hidden="true">×</span></button>';
}
if($(el).data('popup-initialized')){
$(el).append(genericCloseButton);
}}
};
var callback=function (el, ordinal, func){
var options=$(el).data('popupoptions');
var openelement=(options.openelement) ? options.openelement:('.' + el.id + opensuffix);
var elementclicked=$(openelement + '[data-popup-ordinal="' + ordinal + '"]');
if(typeof func=='function'){
func.call($(el), el, elementclicked);
}};
$(document).on('keydown', function (event){
if(visiblePopupsArray.length){
var elementId=visiblePopupsArray[visiblePopupsArray.length - 1];
var el=document.getElementById(elementId);
if($(el).data('popupoptions').escape&&event.keyCode==27){
methods.hide(el);
}}
});
$(document).on('click', function (event){
if(visiblePopupsArray.length){
var elementId=visiblePopupsArray[visiblePopupsArray.length - 1];
var el=document.getElementById(elementId);
var closeButton=($(el).data('popupoptions').closeelement) ? $(el).data('popupoptions').closeelement:('.' + el.id + closesuffix);
if($(event.target).closest(closeButton).length){
event.preventDefault();
methods.hide(el);
}
if($(el).data('popupoptions').blur&&!$(event.target).closest('#' + elementId).length&&event.which!==2&&$(event.target).is(':visible')){
if($(el).data('popupoptions').background){
methods.hide(el);
event.preventDefault();
}else{
methods.hide(el, true);
}}
}});
$(document).on('keydown', function(event){
if(visiblePopupsArray.length&&event.which==9){
var elementId=visiblePopupsArray[visiblePopupsArray.length - 1];
var el=document.getElementById(elementId);
var popupItems=$(el).find('*');
var focusableItems=popupItems.filter(focusableElementsString).filter(':visible');
var focusedItem=$(':focus');
var numberOfFocusableItems=focusableItems.length;
var focusedItemIndex=focusableItems.index(focusedItem);
if(numberOfFocusableItems===0){
$(el).focus();
event.preventDefault();
}else{
if(event.shiftKey){
if(focusedItemIndex===0){
focusableItems.get(numberOfFocusableItems - 1).focus();
event.preventDefault();
}}else{
if(focusedItemIndex==numberOfFocusableItems - 1){
focusableItems.get(0).focus();
event.preventDefault();
}}
}}
});
$.fn.popup=function (customoptions){
return this.each(function (){
var $el=$(this);
if(typeof customoptions==='object'){
var opt=$.extend({}, $.fn.popup.defaults, $el.data('popupoptions'), customoptions);
$el.data('popupoptions', opt);
options=$el.data('popupoptions');
methods._init(this);
}else if(typeof customoptions==='string'){
if(!($el.data('popupoptions'))){
$el.data('popupoptions', $.fn.popup.defaults);
options=$el.data('popupoptions');
}
methods[customoptions].call(this, this);
}else{
if(!($el.data('popupoptions'))){
$el.data('popupoptions', $.fn.popup.defaults);
options=$el.data('popupoptions');
}
methods._init(this);
}});
};
$.fn.popup.defaults={
type: 'overlay',
autoopen: false,
background: true,
backgroundactive: false,
color: 'black',
opacity: '0.5',
horizontal: 'center',
vertical: 'middle',
offsettop: 0,
offsetleft: 0,
escape: true,
blur: true,
setzindex: true,
autozindex: false,
scrolllock: false,
closebutton: false,
closebuttonmarkup: null,
keepfocus: true,
focuselement: null,
focusdelay: 50,
outline: false,
pagecontainer: null,
detach: false,
openelement: null,
closeelement: null,
transition: null,
tooltipanchor: null,
beforeopen: null,
onclose: null,
onopen: null,
opentransitionend: null,
closetransitionend: null
};})(jQuery);