Advertisement
Guest User

Untitled

a guest
Nov 6th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
jQuery 12.34 KB | None | 0 0
  1. (function($) {
  2.     $(function() {
  3.         var nps = 'EmbedVkGallery';
  4.         $[nps] = {
  5.             /**
  6.              * Can be [s,m,x,o,p,q,y,z,w]
  7.              * Look into https://vk.com/dev/photo_sizes
  8.              */
  9.             full_image_size: 'y',
  10.             width: 100,
  11.             margin: 4,
  12.             static: 0, /* functionality hasn't been implemented yet */
  13.             height: 0, /* functionality hasn't been implemented yet */
  14.             rev: 1,
  15.             shuffle: 0,
  16.             limit: 0,
  17.             link: '',
  18.             link_mapper: function(el){
  19.                 return [
  20.                     el.href,
  21.                     '<a href="'+el.href+'">'+el.title+'</a>'
  22.                 ]
  23.             }
  24.         };
  25.  
  26.         function getRandomInt(min, max) {
  27.             return Math.floor(Math.random() * (max - min + 1)) + min;
  28.         }
  29.  
  30.         function embedVkGalleryCompareRandom(a, b) {
  31.             return Math.random() - 0.5;
  32.         }
  33.  
  34.         $.fn[nps] = function(opts) {
  35.             opts = opts || {};
  36.             opts = (typeof(opts) !== 'object' ) ? {link:opts} : opts;
  37.             var localOpts = $.extend({}, $[nps], opts),
  38.                 json;
  39.             function showAlbum() {
  40.                 var $this = $(this),
  41.                     $array_for_promises = [],
  42.                     $loader_block,
  43.                     $loader_blinding_block,
  44.                     gallerySetName = 'gallerySetName' + +new Date(),
  45.                     meta_opts = $.extend({}, localOpts, $this.data()),
  46.                     res = /(-?\d+)_(\d+)/g.exec(meta_opts.link);
  47.                     if (!res || res.length < 3) {return;}
  48.  
  49.                 $loader_blinding_block = $('<span/>', {text: '...'});
  50.                 $loader_block = $('<div/>', {
  51.                     text: 'Загрузка фотографий, пожалуйста подождите ',
  52.                     style: 'text-align: center; padding: 20px 20px;',
  53.                     'class': 'jquery-embedvkgallery-loader-block'
  54.                 });
  55.                 $loader_block.append($loader_blinding_block);
  56.                 $this.append($loader_block);
  57.                 setInterval(function() {
  58.                     $loader_blinding_block.fadeOut(500).fadeIn(500);
  59.                 }, 1000);
  60.                 /**
  61.                  * photo_sizes=1 returns special formats
  62.                  * https://vk.com/dev/photo_sizes
  63.                  */
  64.                 var vkPhotoJSON = JSON.parse($("#VKPhotoJSON").html());
  65.  
  66.                 if (meta_opts.width < 0) {return;}
  67.                 meta_opts.height = meta_opts.width - (meta_opts.width / 2 ^ 0);
  68.  
  69.                 function resize($img) {
  70.                     var $div = $img.closest('div'),
  71.                         d_h = $div.height(),
  72.                         d_w = $div.width(),
  73.                         i_h = $img.height(),
  74.                         i_w = $img.width();
  75.                     var max = d_h > d_w ? d_h : d_w;
  76.                     if (i_h > i_w) { $img.width(max); } else { $img.height(max); }
  77.                     return $img;
  78.                 }
  79.  
  80.                 function getCountRows(count, width, parentWidth) {
  81.                     var min = parentWidth / width ^ 0,
  82.                         result = [];
  83.                     if (count <= min) {
  84.                         return [count];
  85.                     } else {
  86.                         while (count > 0) {
  87.                             if ((count - min) > min) {
  88.                                 result[result.length] = min;
  89.                             } else {
  90.                                 result[result.length] = count / 2 ^ 0;
  91.                                 result[result.length] = count - result[result.length - 1];
  92.                                 count = 0;
  93.                             }
  94.                             count -= result[result.length - 1];
  95.                         }
  96.                     }
  97.                     for (var i = 0; i < result.length; i++) {
  98.                         if (i % 2 === 0) {
  99.                             if (i <= (result.length-2)) {
  100.                                 if (result[i] > 3 && result[i+1] > 3) {
  101.                                     var max = (result[i] / 3 ^ 0) < (result[i+1] / 3 ^ 0) ?
  102.                                         result[i] / 3 ^ 0 : result[i + 1] / 3 ^ 0,
  103.                                         plusOrMinus = Math.random() < 0.5 ? -1 : 1,
  104.                                         a = getRandomInt(1, max) * plusOrMinus;
  105.                                     result[i] += a;
  106.                                     result[i + 1] -= a;
  107.                                 }
  108.                             }
  109.                         }
  110.                     }
  111.                     return result;
  112.                 }
  113.  
  114.                 function expanding($row) {
  115.                     var $divs = $('div', $row),
  116.                         totalWidth = $divs.length * meta_opts.margin,
  117.                         diff,
  118.                         newWidth,
  119.                         newHeight;
  120.                     $divs.each(function() {
  121.                         totalWidth += $(this).data('newWidth');
  122.                     });
  123.                     totalWidth = totalWidth ^ 0;
  124.                     var a = (totalWidth > $this.width()) ? -1 : 1;
  125.                     while ( totalWidth !== $this.width() ) {
  126.                         diff = ($this.width() - totalWidth ^ 0 ) / $divs.length ^ 0;
  127.                         diff = Math.abs(diff);
  128.                         if (diff > 2) { a *= diff; }
  129.                         $divs.each(function() {
  130.                             newWidth = $(this).data('newWidth') + a;
  131.                             $(this).data({ newWidth: newWidth });
  132.                             totalWidth += a;
  133.                             return (totalWidth !== $this.width());
  134.                         });
  135.                         newHeight  = $divs.eq(0).data('newHeight') + a;
  136.                         $divs.data('newHeight', newHeight);
  137.                         a = (totalWidth > $this.width()) ? -1 : 1;
  138.                     }
  139.                     $divs.each(function() {
  140.                         $(this).css({
  141.                             width: $(this).data('newWidth'),
  142.                             height: $(this).data('newHeight'),
  143.                             float: 'left',
  144.                             marginRight: meta_opts.margin + 'px',
  145.                             marginTop: meta_opts.margin + 'px',
  146.                             boxSizing: 'border-box',
  147.                             overflow: 'hidden'
  148.  
  149.                         });
  150.                         var $def = $.Deferred();
  151.                         $array_for_promises.push($def);
  152.                         var $a = $('<a/>', {
  153.                                 href: $(this).data('maxSrc'),
  154.                                 rel: gallerySetName,
  155.                                 'class': 'embedvkgallery_link',
  156.                                 'data-lightbox': gallerySetName,
  157.                                 title: $(this).data('text')
  158.                             }),
  159.                             $img = $('<img/>', {
  160.                                 src: $(this).data('src'),
  161.                                 'class': 'embedvkgallery_img'
  162.                                
  163.                             })
  164.                                 .css({ margin: 0, display: 'none' })
  165.                                 .one('load', function() {
  166.                                     resize( $(this) );
  167.                                     $def.resolve();
  168.                                 })
  169.                                 .on('error', function() {
  170.                                     $def.resolve();
  171.                                 });
  172.                         $a.append($img).appendTo( $(this) );
  173.                     });
  174.                     return $row;
  175.                 }
  176.  
  177.                 function addSlider($elem) {
  178.                     if ($.fn.slimbox){
  179.                         $('a', $elem).slimbox({}, meta_opts.link_mapper);
  180.                     } else if ($.fn.swipebox) {
  181.                         $('a.embedvkgallery_link', $elem).swipebox({}, meta_opts.link_mapper);
  182.                     }
  183.                 }
  184.  
  185.                 function renderAlbumList(data) {
  186.                     if (data.response && data.response.count > 0) {
  187.                         /**
  188.                          * Shuffle array if `shuffle` = 1
  189.                          */
  190.                         if (+meta_opts.shuffle) {
  191.                             data.response.items.sort(embedVkGalleryCompareRandom);
  192.                         }
  193.  
  194.                         /**
  195.                          * Slice array by option LIMIT
  196.                          */
  197.                         if (meta_opts.limit && +meta_opts.limit && meta_opts.limit < data.response.count) {
  198.                             data.response.items.length = meta_opts.limit;
  199.                             data.response.count = data.response.items.length;
  200.                         }
  201.                         json = data;
  202.  
  203.                         var arr = getCountRows(data.response.count, meta_opts.width,  $this.width()),
  204.                             sizes = 2,
  205.                             item = 0;
  206.                         for (var i = 0; i < arr.length; i++) {
  207.                             var $row = $('<div/>');
  208.                             for (var j = 0; j < arr[i]; j++) {
  209.                                 var c_height = data.response.items[item].sizes[sizes].height,
  210.                                     c_width = data.response.items[item].sizes[sizes].width,
  211.                                     newWidth = c_width * meta_opts.height / c_height ^ 0,
  212.                                     maxSrc,
  213.                                     grepResults;
  214.  
  215.                                 /**
  216.                                  * Finding the maxSrc url which we need
  217.                                  */
  218.                                 grepResults = $.grep(data.response.items[item].sizes, function(size) {
  219.                                     return size.type == localOpts.full_image_size;
  220.                                 });
  221.                                 if ( ! grepResults || ! grepResults.length ) {
  222.                                     grepResults = $.grep(data.response.items[item].sizes, function(size) {
  223.                                         return size.type == 'm';
  224.                                     });
  225.                                     if ( ! grepResults || ! grepResults.length ) {
  226.                                         grepResults = $.grep(data.response.items[item].sizes, function(size) {
  227.                                             return size.type == 's';
  228.                                         });
  229.                                     }
  230.                                 }
  231.                                 if ( ! grepResults || ! grepResults.length ) {
  232.                                     continue;
  233.                                 }
  234.                                 maxSrc = grepResults[0].src;
  235.  
  236.  
  237.                                 $('<div/>').data({
  238.                                     newHeight: meta_opts.height,
  239.                                     newWidth: newWidth,
  240.                                     src: data.response.items[item].sizes[sizes].src,
  241.                                     text: data.response.items[item].text,
  242.                                     maxSrc: maxSrc
  243.                                 }).appendTo($row);
  244.                                 item++;
  245.                             }
  246.                             expanding($row).appendTo($this);
  247.                             addSlider($this);
  248.                         }
  249.                         $.when.apply(null, $array_for_promises).done(function() {
  250.                             $loader_block.hide('slow');
  251.                             $this.find('.embedvkgallery_img').fadeIn('slow');
  252.                         });
  253.                     } else {
  254.                         $this.text('Album not found');
  255.                     }
  256.                 }
  257.  
  258.                 /**
  259.                  * Get Album data from VK
  260.                  */
  261.                 if (vkPhotoJSON !== undefined) {
  262.                     renderAlbumList(vkPhotoJSON);
  263.                 } else {
  264.                    $loader_block.html('Ошибка загрузки фотографий :(');
  265.                 }
  266.             }
  267.             return this.each(showAlbum);
  268.         };
  269.     });
  270. })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement