/* * $ popUp() * Version : 1.4.3 */ ;(function( window, document, $ ) { var W = $( window ), D = $( document ), P = popUp = function () { P.show.apply( this, arguments ); }; var lng = document.documentElement.lang || 'ru'; var tldFix = { uk: '.dataprotection.com.ua', ja: '.drweb.co.jp', cn: '.drweb.cn' }; var st_tld = tldFix[lng] || '.drweb.com'; $.extend( P, { version: '1.4.3', defaults: { // animation appearEffect: 'fadeIn', overlaySpeed: 250, popupSpeed: 300, // close closeSelector: '.popUp-close', closeDestroy: false, closeClick: true, closeEsc: true, // behaviors show: false, showOverlay: true, loadingImage: '//st' + st_tld + '/static/loading_46x46_dwspider.gif', scaleIcon: '//st' + st_tld + '/static/new-www/images/2014/btn_orig_img_size.png', // callbacks onLoad: function() {}, onClose: function() {}, // style classTheme: 'popUpTheme-default', width: false, height: false, zIndex: 999, centered: true, alwaysTop: false, imgAutoResize: false, modalCSS: {top: '40px'}, overlayCSS: {background: 'black'}, overlayOpacity: 0.2, // attr setId: false }, text: { error: { img: false } }, /* Set unique name */ initialize: function ( arg ) { var obj = { type:false, body:false, destroy:false }; function isElement( o ) { return Boolean( window.HTMLElement ? o instanceof HTMLElement : o && o !== null && typeof o === 'object' && typeof o.innerHTML === 'string' && typeof o.nodeName==='string' && o.nodeType === 1 ); } if( isElement( arg ) ) { arg = $( arg ); } if( arg.jquery ) { obj.type = 'id'; obj.body = arg.hide(); obj.destroy = arg.attr( 'id' ) ? false : true; // arg.selector && arg.context } else if( arg.charAt( 0 ) == '#' ) { var el = $( arg ); obj.type = 'id'; obj.body = el.length ? el : false; } else if( arg.match( /\.jpg|\.jpeg|\.png|\.gif/gi ) ) { obj.type = 'img'; obj.body = $( '
' ); } else if( arg.indexOf( 'youtube.com/' ) != -1 ) { obj.type = 'youtube'; obj.body = $( '' ); } else if( arg.match( /^(?:https?:)?\/\// ) ) { obj.type = 'ajax'; obj.body = $( '' ); obj.destroy = true; } return obj; }, /* Set rel popUp parametrs */ setRelPrm: function ( prms ) { var o = {}; if( prms ) { for( var key in P.defaults ) { var p = P.relPrm( prms, key ); if( p !== undefined ) o[key] = p; } } return o; }, /* Get popUp parametrs */ relPrm: function ( prms, name ) { var results = new RegExp( '[\\?&]' + name + '=([^]*)' ).exec( prms ); return !results ? undefined : name != 'show' ? results[1] : '#' + results[1]; }, show: function ( href, options ) { var obj = P.initialize( href || '' ); if( obj.body === false ) return false; if( typeof options != 'string' ) var opt = options; var type = obj.type, $self = obj.body, opts = $.extend( {}, P.defaults, ( opt || {} ) ), destroy = opts.closeDestroy || obj.destroy, $data = $self.data( 'popUp' ), $overlay = $data && $data.overlay ? $data.overlay : false, $loading = $( '' ); if( typeof options == 'string' ) { if( $self.is( ':hidden' ) ) return; opts = $self.data('bind-dta') || opts; destroy = opts.closeDestroy || obj.destroy; switch( options ) { case 'reposition': setSelfPosition(); break; case 'close': closePopUp(); break; } return; } /* Image */ if( type == 'img' ) { $self.append( $loading ); $self.imgLoad = false; $self.image = $( '' ); $self.origImgLink = $( '' ); $self.append( $self.origImgLink ); if( opts.imgAutoResize ){ $self.css({ 'max-width':'none', 'max-height':'none' }); } $self.image. load( function() { $loading.hide(); $self.imgLoad = true; $( this ).appendTo( $self ).one( 'click.popUp', closePopUp ).trigger( 'reposition.popUp' ); }). error( function(){ if( P.text.error.img ) { $loading.hide(); $self.append( ''+P.text.error.img+'
' ).trigger( 'reposition.popUp' ); } }). each( function() { if( this.complete ) $( this ).trigger( 'load' ); }); } /* YouTube */ if( type == 'youtube' ) { if( href.match( /(?:youtube\.(?:[a-z]+))\/(?:v\/|(?:watch(?:\.php)?)?\?(?:.+&)?v=)(?:[^?]+).*/ ) ) { $( '' ) .appendTo( $self ).fadeIn( opts.popupSpeed ).trigger( 'reposition.popUp' ); } else { var $video_block = $( '' ); $self .append( $loading ) .append( $video_block ); $( '' ) .load( function() { $loading.hide(); $video_block.fadeIn( opts.popupSpeed ).trigger( 'reposition.popUp' ); }) .appendTo( $video_block ); } } /* id */ if( type == 'id' ) { if( opts.width ) $self.css( { width : opts.width+'px' } ); if( opts.height ) $self.css( { height : opts.height+'px' } ); } /* ajax */ if( type == 'ajax' ) { $self.append( $loading ); $.get( href ). done( function( data ) { $loading.hide(); $self. append( '×' ). find( '.popUp-content' ). html( data ). end(). trigger( 'reposition.popUp' ); }); } /* Overlay */ if( opts.showOverlay ) { if( !$overlay ) { $overlay = $( '' ).css( { display:'none', position:'fixed', top:0, left:0, right:0, bottom:0, zIndex:opts.zIndex } ).addClass( 'popUp-overlay' ); } $overlay.css( opts.overlayCSS ); $self.data( 'popUp', { overlay : $overlay } ); } /* DOM */ $( 'body' ).append( $overlay.fadeTo( 0, opts.overlayOpacity ) ).append( $self.addClass( 'popUp '+( opts.classTheme || '' ) ) ); /* Bind events */ if( $self.is(':hidden') ) { if( opts.closeClick && opts.showOverlay ) { $overlay.bind( 'click.popUp', function( e ) { closePopUp(); e.preventDefault(); } ); } if ($.fn.on) { $self.on( 'click.popUp', opts.closeSelector, function( e ){ closePopUp(); e.preventDefault(); } ); } else { $self.delegate( opts.closeSelector, 'click.popUp', function( e ){ closePopUp(); e.preventDefault(); } ); } W.bind( 'resize.popUp', setSelfPosition ) .bind( 'keyup.popUp', observeKeyPress ); $self.bind( 'close.popUp', closePopUp ); $self.bind( 'reposition.popUp', setSelfPosition ); $self.data( 'bind-dta', opts ); } /* animate it in. */ if( opts.showOverlay && $overlay.is( ':hidden' ) ) $overlay.fadeIn( opts.overlaySpeed, function() { animate(); } ); else animate(); // reposition.popUp z-index $self.css( { zIndex: ( opts.zIndex + 2 ) } ).siblings( '.popUp:visible' ).css( { zIndex:opts.zIndex } ); /*---------------------------------------------------- Private popUp functions ---------------------------------------------------- */ /* Animate popUp */ function animate() { $self[opts.appearEffect]( opts.popupSpeed, function() { $self.trigger( 'reposition.popUp' ); opts.onLoad(); } ).trigger( 'reposition.popUp' ); } /* Close popUp */ function closePopUp() { if( type == 'img' || type == 'youtube' || destroy ) $self.add( $overlay ).remove(); else $self.unbind( '.popUp' ).css( 'position', 'fixed' ).add( $overlay.unbind( '.popUp' ) ).hide(); W.unbind( 'resize.popUp', setSelfPosition ) .unbind( 'keyup.popUp' ); opts.onClose(); } /* Function to bind to the window to observe the Esc key press */ function observeKeyPress( e ) { if( ( e.keyCode == 27 || ( e.DOM_VK_ESCAPE == 27 && e.which == 0 ) ) && opts.closeEsc ) closePopUp(); } /* Set the position of the modal'd window ($self) */ function setSelfPosition() { var winW = W.width(), winH = W.height(); if( type == 'img' && opts.imgAutoResize && $self.imgLoad ) { $self.image.addClass( 'popUp-orignImgSize' ); if( ! $self.imgOrigSize && ! $self.image.is(':hidden') ) { $self.imgOrigSize = { w: $self.image.outerWidth(), h: $self.image.outerHeight() }; } if( $self.imgOrigSize.h > winH - 50 || $self.imgOrigSize.w > winW - 50 ) { if( $self.origImgLink.is( ':hidden' ) ) $self.origImgLink.show(); if( $self.imgOrigSize.w >= $self.imgOrigSize.h ) { $self.image.css( { height:'auto', width: winW - 50 } ); if( $self.image.outerHeight() + 50 > winH ) $self.image.css( { width:'auto', height: winH - ( 50 + ( typeof opts.alwaysTop === 'number' ? opts.alwaysTop : 40 ) ) } ); } else { $self.image.css( { width: 'auto', height: winH - 50 } ); if( $self.image.outerWidth() + 50 > winW ) $self.image.css( { height:'auto', width: winW - 50 } ); } } else { if( ! $self.origImgLink.is( ':hidden' ) ) $self.origImgLink.hide(); $self.image.css( { width: $self.imgOrigSize.w, height: $self.imgOrigSize.h } ); } $self.image.outerHeight(); // fix for IE7 (magic) if( opts.alwaysTop !== false ){ var topOffset = D.scrollTop() + ( typeof opts.alwaysTop === 'number' ? opts.alwaysTop : 40 ); $self.css( { position: 'absolute', top: topOffset, marginTop: 0 } ); } else $self.css( { position: 'fixed', top: '50%', marginTop: ( $self.outerHeight() / 2 ) * -1 } ); } else { if( opts.alwaysTop !== false || ( $self.height() + 80 >= winH ) && ( $self.css( 'position' ) != 'absolute' ) ) { var topOffset = D.scrollTop() + ( typeof opts.alwaysTop === 'number' ? opts.alwaysTop : 40 ); $self.css( { position: 'absolute', top: topOffset, marginTop: 0 } ); } else if( $self.height() + 80 < winH ) { if( opts.centered ) { $self.css( { position: 'fixed', top: '50%', marginTop: ( $self.outerHeight() / 2 ) * -1 } ); } else { $self.css( { position: 'fixed' } ).css( opts.modalCSS ); } } } $self.css( { left: '50%', marginLeft: ( $self.outerWidth() / 2 ) * -1 } ); } } }); $.fn.popUp = function( arg_1, arg_2 ) { return this.each(function() { var $this = $( this ), data = $this.data( 'popUp' ), opts = $.isPlainObject( arg_1 ) ? arg_1 : {}; if( !data ) { $this.data( 'popUp', { initialize : true, settings : opts } ); var $prms = P.setRelPrm( $this.attr( 'rel' ) || '' ), $href = $prms.show || $this.attr( 'href' ); if( $href ) { opts = $.extend( {}, opts, $prms ); $this.click( function( e ) { P( $href, opts ); e.preventDefault() } ); } } if( typeof arg_1 === 'string' ) { if( arg_1 === 'show' ) P( $this, ( $.isPlainObject( arg_2 ) ? arg_2 : data.settings || {} ) ); else $this.trigger( arg_1+'.popUp' ); } }); }; })( window, document, window['jQuery_1_7_2'] || window['jQuery'] );