jQuery(function($) { var $body = $('body'); var structureModal = {}; var modal = {}; var images; var ajaxLink; var activeImage; var animateSpeed = 200; /*var userAgent = navigator.userAgent.toLowerCase(); var browserVersion = (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]; var isIE6 = (/msie|MSIE 6/.test(userAgent) && !/opera/.test(userAgent) && parseInt(browserVersion) < 7);*/ var isIE6 = false; if (window.external && (typeof window.XMLHttpRequest == "undefined")) { isIE6 = true; } var element; $.fn.PwModal = function(settings) { if (!this) return false; element = this; init(); if ($(this).attr('rel')) { var list = $('[rel=' + $(this).attr('rel') + ']'); if (list.size() > 1) { modal.isGallery = true; } activeImage = list.index(this); var img = new Array(); $(list).each(function(){ var image = {}; image.preview = $(this).children('img').attr('src'); image.full = $(this).attr('href'); image.title = $(this).children('img').attr('alt'); img.push(image); }); images = img; } else { modal.isContent = true; ajaxLink = $(this).attr('href'); } createStructure(); return this; }; $.fn.PwModal.settings = {}; function init() { if (isIE6) { $body.css({ height: $body.height()+'px', width: $body.width()+'px', position: 'static', overflow: 'hidden' }); $('html').css({overflow: 'hidden'}); } modal = { srtucture: {}, // структура окна ready: false, // false - окно не создано, true - окно создано isGallery: false, // false - контент, true - галерея isContent: false } $.fn.PwModal.settings = { startWidth: 300, //стартовая ширина startHeight: 300, //стартовая высота defaultWidth: 500, defaultHeight: 500, galleryHeight: (115/* + 36*/), //высота блока #pwModalThumb indent: 25 //отступ от края окна } } function createStructure() { if (modal.ready) { return; } $body.append( $( '
' + '
' + '
' + '
' + '
' + '
' + ' ' + ' ' + '
' + //'

Фотографии объекта

' + '
' + '
' + '
' + '
' + '
' + '' + 'Закрыть (Esc)' + '
 
' + '
' + '
' + '
' + '
' + '
' ).hide() ); modal.structure = { full: $('#pwModalFull'), bg: $('#pwModalBg'), window: $('#pwModalWindow'), thumb: $('#pwModalThumb'), content: $('#pwModalContent'), loading: $('#pwModalLoading'), title: $('#pwModalTitle span'), next: $('#pwModalNext'), prev: $('#pwModalPrev'), close: $('#pwModalClose') }; $(modal.structure.bg).css("opacity", "0.2"); if (modal.isGallery) { for (i in images) { var img = images[i]; $('.photos-inner', modal.structure.thumb) .append('' + img.title + ''); } // $('.photos-inner', modal.structure.thumb).width(images.length*80); $('a', modal.structure.thumb).click(setImage); } else { modal.structure.thumb.remove(); modal.structure.prev.remove(); modal.structure.next.remove(); modal.structure.title.parents(':first').remove(); $.fn.PwModal.settings.galleryHeight = 0; } modal.structure.window.hide(); modal.ready = true; calcSize = calculateSize($.fn.PwModal.settings.startWidth, $.fn.PwModal.settings.startHeight); modal.structure.content .css({ width: calcSize.width + 'px', height: calcSize.height + 'px' }); if (modal.isGallery) { $('.photos-i', modal.structure.thumb) .animate({ width: calcSize.imgW - 40, scrollLeft: ((((activeImage + 1) * 60)- 40) - Math.round(calcSize.imgW / 2)) }, animateSpeed); modal.structure.title .animate({ width: calcSize.imgW }, animateSpeed); } modal.structure.window .css({ width: (calcSize.width) + 'px', top: calcSize.top, left: calcSize.left }) .show(); modal.structure.full.fadeIn(300, function() { $(document).keyup(function(event){ if (event.keyCode == 27) { destruct(); } }); }); load(); if (modal.isGallery) { $("#pwModalPrev2").click(function() { $(modal.structure.prev).trigger('click'); }); $("#pwModalNext2").click(function() { $(modal.structure.next).trigger('click'); }); modal.structure.next .click(function(){ if (activeImage >= images.length - 1) { activeImage = -1; } activeImage++; showLoadingAndLoad(); return false; }); modal.structure.prev .click(function(){ if (activeImage <= 0) { activeImage = images.length; } activeImage--; showLoadingAndLoad(); return false; }); } $(modal.structure.close).click(destruct); $(modal.structure.bg).click(destruct); } function destruct() { $(modal.structure.window).fadeOut(300, function(){ if (isIE6) { $body.css({height: '', width: '', position: '', overflow: ''}); $('html').css({overflow: ''}); } $(modal.structure.full).remove(); $(document).unbind('keyup'); }); return false; } function load() { if (modal.isContent) { loadContent(); } else { selectImage(); loadImage(); } } function loadContent() { var queryString = ajaxLink.replace(/^[^\?]+\??/,''); var params = parseQuery(queryString); var modalWidth = params['width'] ? parseInt(params['width']) : $.fn.PwModal.settings.defaultWidth; var modalHeight = params['height'] ? parseInt(params['height']) : $.fn.PwModal.settings.defaultHeight; if (params['height'] == 'auto') { modalHeight = $(window).height() - ($.fn.PwModal.settings.indent * 2); } var modalTop = calculateTop(modalHeight); var modalLeft = calculateLeft(modalWidth); $.get( ajaxLink, {}, function(response) { modal.structure.window .animate({ width: modalWidth, height: modalHeight, top: modalTop, left: modalLeft }, animateSpeed); modal.structure.content .append(response) .animate({ width: modalWidth, height: modalHeight }, animateSpeed, function(){ modal.structure.loading.fadeOut(); $(element).trigger('thickboxAjaxAfterLoad'); }); } ); } function loadImage() { var loadImg = new Image(); loadImg.onload = function() { loadImg.onload = null; modal.structure.title.html(' '); $('img', modal.structure.content) .fadeOut(animateSpeed, function(){ $(this).remove(); }); calcSize = calculateSize(loadImg.width, loadImg.height); loadImg.width = calcSize.imgW; loadImg.height = calcSize.imgH; loadImg.alt = images[activeImage].title; modal.structure.window .animate({ width: calcSize.width, height: (calcSize.height + $.fn.PwModal.settings.galleryHeight + modal.structure.title.height()), top: calcSize.top, left: calcSize.left }, animateSpeed); $('.photos-i', modal.structure.thumb) .animate({ width: calcSize.imgW - 40, scrollLeft: ((((activeImage + 1) * 60) - 40) - Math.round(calcSize.imgW / 2)) }, animateSpeed); modal.structure.title .animate({ width: calcSize.imgW }, animateSpeed); modal.structure.content .animate({ width: calcSize.width, height: calcSize.height }, animateSpeed, function(){ $(this).append(loadImg); if (loadImg.alt) { modal.structure.title .html(loadImg.alt) .show(); } else { modal.structure.title.html(' '); } modal.structure.loading.fadeOut(animateSpeed); $(element).trigger('thickboxAjaxAfterLoad'); }); } loadImg.src = images[activeImage].full; } function setImage() { var list = $('a', modal.structure.thumb); activeImage = list.index(this); showLoadingAndLoad(); return false; } function selectImage() { var list = modal.structure.thumb.find('a'); list.removeClass('actived'); list.eq(activeImage).addClass('actived'); } function showLoadingAndLoad() { selectImage(); modal.structure.loading.fadeIn(600, function(){ loadImage(); }); } function calculateSize(imageWidth, imageHeight) { //вычисляем максимальную высоту и ширину контента для текущего размера окна var maxContentWidth = $(window).width() - ($.fn.PwModal.settings.indent * 2); // минус отступы от краев; var maxContentHeight = $(window).height() - ($.fn.PwModal.settings.indent * 2) - 50 ; // минус отступы от краев и тени; //вычитаем высоту блока для комментария maxContentHeight -= modal.structure.title.height(); var calcSize = { top: 0, //отступ от верхнего края окна left: 0, //отступ от левого края окна width: 0, //ширина блока content height: 0, //высота блока content imgW: 0, //ширина изображения imgH: 0 //высота изображения } //ширина навигационных ссылок prev и next var navLinkWidth = 60 * 2; //если это галерея if (modal.isGallery) { maxContentWidth -= navLinkWidth; //вычитаем ширину ссылок next и prev maxContentHeight -= $.fn.PwModal.settings.galleryHeight; //вычитаем высоту блока с preview } //вычисляем размеры изображения if (imageWidth > maxContentWidth && imageHeight < maxContentHeight) { calcSize.imgW = maxContentWidth; calcSize.imgH = Math.round((calcSize.imgW * imageHeight) / imageWidth); } if (imageWidth < maxContentWidth && imageHeight > maxContentHeight) { calcSize.imgH = maxContentHeight; calcSize.imgW = Math.round((imageWidth * calcSize.imgH) / imageHeight); } if (imageWidth < maxContentWidth && imageHeight < maxContentHeight) { calcSize.imgW = imageWidth; calcSize.imgH = imageHeight; } if (imageWidth > maxContentWidth && imageHeight > maxContentHeight) { if (maxContentWidth < maxContentHeight) { calcSize.imgW = maxContentWidth; calcSize.imgH = Math.round((calcSize.imgW * imageHeight) / imageWidth); } else { calcSize.imgH = maxContentHeight; calcSize.imgW = Math.round((imageWidth * calcSize.imgH) / imageHeight); } } //вычисляем размеры блока content calcSize.width = calcSize.imgW + navLinkWidth; calcSize.height = calcSize.imgH + 50; //вычисляем отступы от краев окна var tmpImgHeight = calcSize.height; if (modal.isGallery) { tmpImgHeight += $.fn.PwModal.settings.galleryHeight; } tmpImgHeight += modal.structure.title.height(); calcSize.top = calculateTop(tmpImgHeight); calcSize.left = calculateLeft(calcSize.width); //console.log(calcSize); return calcSize; } function calculateTop(height) { var extraHeight = 0; if (isIE6) { extraHeight = $(window).scrollTop(); } return Math.round((($(window).height() - height) / 2) + extraHeight) - 9; } function calculateLeft(width) { var extraWidth = 0; if (isIE6) { extraWidth = $(window).scrollLeft(); } return Math.round((($(window).width() - width) / 2) + extraWidth) - 9; } function parseQuery (query) { var params = {}; if (!query) {return params;}// return empty object var pairs = query.split(/[;&]/); for (var i = 0; i < pairs.length; i++) { var keyVal = pairs[i].split('='); if (!keyVal || keyVal.length != 2 ) { continue; } var key = unescape( keyVal[0] ); var val = unescape( keyVal[1] ); val = val.replace(/\+/g, ' '); params[key] = val; } return params; } }); $(function(){ $('.PwModal').click(function(){ $(this).PwModal(); return false; }); $('.PwModal2').click(function(){ $(this).PwModal(); return false; }); $('.PwModal3').click(function(){ $(this).PwModal(); return false; }); });