%PDF- %PDF-
Direktori : /home/bitrix/www/local/templates/UB/components/bitrix/photogallery.detail.list.ex/preview/ |
Current File : /home/bitrix/www/local/templates/UB/components/bitrix/photogallery.detail.list.ex/preview/script.js |
(function(window) { window.BXPhotoSlider = function(Params) { var _this = this; this.MESS = Params.MESS; this.bSceletonCreated = false; this.id = Params.id || 'bxph_detail_list'; this.uniqueId = Params.uniqueId; this.itemsCount = Params.itemsCount; this.actionUrl = Params.actionUrl; this.responderUrl = Params.responderUrl; this.actionPostUrl = Params.actionUrl === true ? this.actionUrl : false; this.sign = Params.sign; this.reqParams = Params.reqParams; this.checkParams = Params.checkParams; this.userSettings = Params.userSettings; this.itemsPageSize = Params.itemsPageSize; this.bSectionOpened = this.userSettings.detail_view == "Y"; this.reloadItemsOnload = Params.reloadItemsOnload; this.cacheRaitingReq = Params.cacheRaitingReq; this._bFirstDisplay = true; this.bArrowControllEnabled = true; this.bEscCloseEnabled = true; this.userUrl = Params.userUrl; //this.editItemUrl = Params.editItemUrl; this.sectionUrl = Params.sectionUrl; this.pElementsCont = Params.pElementsCont; this.srcIndex = {}; this.sections = {}; for (var i in Params.sections) this.sections[Params.sections[i]['ID']] = Params.sections[i]['NAME']; // Permissions this.perm = Params.permissions; this.perm.view = !!this.perm.view; this.perm.edit = !!this.perm.edit; this.perm.moderate = !!this.perm.moderate; this.perm.viewComment = !!this.perm.viewComment; this.perm.addComment = !!this.perm.addComment; // Inteface this.useComments = Params.useComments == 'Y' && this.perm.viewComment; this.commentsType = Params.commentsType == 'blog' ? 'blog' : 'forum'; this.useRatings = Params.useRatings == 'Y'; this.bShowSourceLink = Params.showSourceLink != 'N'; this.bShowEditControls = this.perm.edit; this.Mode = this.userSettings.view_mode == "auto" ? "auto" : "fixed"; this.moderation = Params.moderation == 'Y'; // Theme this.theme = this.userSettings.theme == "light" ? "light" : "dark"; this.bChangeTheme = true; this.itemUrl = Params.itemUrl; this.itemUrlHash = Params.itemUrlHash; this.player = false; this.Items = []; this.ItemIndex = {}; this.currentIndex = 0; this.PageQueue = {}; this.LoadedPages = {}; this.LoadedPages[parseInt(Params.currentPage)] = true; this.fixedSize = 735; this.Rotated = {}; this.state = 'ready'; this.showAddCommentsCount = 1; this.HandleItems(Params.items); this.AttachThumbnailsEvents(); if (window.location.hash) window.location.hash.replace(new RegExp(this.itemUrlHash.replace("#ELEMENT_ID#", '(\\d+)'), 'ig'), function(s, id){_this.currentItem = parseInt(id) || 0;}); if (!this.currentItem) this.currentItem = parseInt(Params.currentItem) || 0; if (this.currentItem > 0) { if (typeof this.ItemIndex[this.currentItem] != 'undefined') { this.OpenPopup(this.currentItem); } else { BX.showWait('photo_load_items'); BX.addCustomEvent(this, 'OnAfterItemsLoaded', BX.proxy(this.OnAfterCurrentItemsLoaded, this)); this.LoadItems(this.currentItem, false, false); } } BX.addCustomEvent(window, 'onMoreItemsLoaded', BX.proxy(this.OnMoreItemsLoaded, this)); } window.BXPhotoSlider.prototype = { HandleItems: function(items) { for (var i in items) { items[i].index = parseInt(items[i].index); items[i].comments = parseInt(items[i].comments) || 0; items[i].shows = parseInt(items[i].shows) || 0; this.Items[items[i].index] = items[i]; this.ItemIndex[items[i].id] = items[i].index; items[i].bShowed = false; } BX.onCustomEvent(this, 'OnAfterItemsHandled', [this.Items]); if (this.oTopSlider && !this.reloadItemsOnload) this.oTopSlider.HandleItems(this.Items); }, OpenPopup: function(id) { this.windowInnerSize = BX.GetWindowInnerSize(document); // Protection from some dummies opening popup after dragging if (top.oBXPhotoList && top.oBXPhotoList[this.uniqueId] && top.oBXPhotoList[this.uniqueId].bWasJustDragged) return; // If we open popup just after page loaded - after closing we replace url by section url if (this.currentItem > 0) { var oItem = this.GetById(id); var url = this.sectionUrl.replace("#SECTION_ID#", oItem.album_id); if (oItem.gallery_id) url = url.replace("#USER_ALIAS#", oItem.gallery_id); this.startLocation = {href: url, hash: ''}; } else this.startLocation = {href: window.location.href, hash: window.location.hash}; this.startWndSize = BX.GetWindowScrollPos(); if (!this.bSceletonCreated || !BX.isNodeInDom(this.pFixedOverlay)) this.CreateSceleton(); if (!this.bAjaxNaviEnabled) this.InitAjaxNavi(); this.pFixedOverlay.style.display = ""; this.bPopupOpened = true; this.InitPopupEvents(true); this.ChangeMode(this.Mode, false); this.DisplayItem(id); // Used ONLY when displaying several photos and after opening // photo in popup we need to reload all items with correct indexes if (this.reloadItemsOnload) { this._currentItemId = id; BX.addCustomEvent(this, 'OnBeforeItemsLoaded', BX.proxy(this._CleanItemsArray, this)); BX.addCustomEvent(this, 'OnAfterItemsHandled', BX.proxy(this._RedisplayItemAfterItemsReloading, this)); this.LoadItems(parseInt(this.reloadItemsOnload), false, false); } BX.addClass(document.body, "photo-body-overlay"); if (!BX.browser.IsDoctype() && BX.browser.IsIE()) this.pFixedOverlay.style.top = BX.GetWindowScrollPos(document).scrollTop + "px"; //BX.addCustomEvent(this, 'OnItemLoaded', BX.proxy(this.PreloadImages, this)); }, ClosePopup: function() { if (this.bPopupOpened) { this._bFirstDisplay = true; this.pFixedOverlay.style.display = "none"; this.bPopupOpened = false; this.InitPopupEvents(false); BX.removeClass(document.body, "photo-body-overlay"); this.SetUrl(this.startLocation.href, this.startLocation.hash); this.SaveRotatedItems(); if (BX.browser.IsIE()) { var _this = this, endWndSize; setTimeout(function() { endWndSize = BX.GetWindowScrollPos(); if (endWndSize.scrollTop != _this.startWndSize.scrollTop) BX.GetDocElement().scrollTop = _this.startWndSize.scrollTop; }, 100); setTimeout(function() { endWndSize = BX.GetWindowScrollPos(); if (endWndSize.scrollTop != _this.startWndSize.scrollTop) BX.GetDocElement().scrollTop = _this.startWndSize.scrollTop; }, 300); } //BX.removeCustomEvent(this, 'OnItemLoaded', BX.proxy(this.PreloadImages, this)); } return false; }, InitPopupEvents: function(bInit) { if (bInit === true) { //BX.bind(window, "keyup", BX.proxy(this.OnKeyUp, this)); BX.bind(document, "keyup", BX.proxy(this.OnKeyUp, this)); BX.bind(window, "beforeunload", BX.proxy(this.SaveRotatedItems, this)); BX.bind(window, "resize", BX.proxy(this.OnResize, this)); } else { //BX.unbind(window, "keyup", BX.proxy(this.OnKeyUp, this)); BX.unbind(document, "keyup", BX.proxy(this.OnKeyUp, this)); BX.unbind(window, "beforeunload", BX.proxy(this.SaveRotatedItems, this)); BX.unbind(window, "resize", BX.proxy(this.OnResize, this)); } }, InitAjaxNavi: function() { var _this = this; this.oAjaxNavi = { pObj: this, getState: function() { if (this.pObj && this.pObj.Items && this.pObj.Items[this.pObj.currentIndex]) return {index: this.pObj.currentIndex, id: this.pObj.Items[this.pObj.currentIndex].id}; return {}; }, setState: function(state) { if (state && state.id) _this.DisplayItem(state.id, true, false); } }; BX.ajax.history.init(this.oAjaxNavi); }, SetUrl: function(url, hash) { BX.ajax.history.put(this.oAjaxNavi.getState(), url, hash); }, Previous: function(stepAround) { if (this.slideShowStatus == 'play') this.StopSlideShow(); return this.ShowItem(this.currentIndex - 1, 'prev', stepAround !== false); }, Next: function(stepAround, bSlideshow) { if (!bSlideshow && this.slideShowStatus == 'play') this.StopSlideShow(); return this.ShowItem(this.currentIndex + 1, 'next', stepAround !== false); }, ShowItem: function(index, direction, stepAround, bAffectTopSlider) { this.SaveRotatedItems(true); if (!this.Items || !this.Items.length) return; var curItemId = false; if (index >= this.itemsCount) { index = 0; curItemId = 'first'; if (!stepAround || this.itemsCount <= 1) return false; } else if (index < 0) { index = this.itemsCount - 1; curItemId = 'last'; if (!stepAround || this.itemsCount <= 1) return false; } if (this.Items[index]) { this.DisplayItem(this.Items[index].id, bAffectTopSlider); } else { if (!direction) // ? return; if (curItemId === false) curItemId = this.Items[direction == 'next' ? index - 1 : index + 1].id; this.LoadItems(curItemId, direction); } return true; }, LoadPage: function(page) { if (this.itemsPageCount && this.itemsPageCount < page) { if (this.PageQueue[page]) delete this.PageQueue[page]; return; } if (!this.LoadedPages[page] && !this.PageQueue[page]) { if (this.state == 'loading') this.PageQueue[page] = true; else this.LoadItems('page', false, false, page); } }, LoadItems: function(curItemId, direction, bGoToDirecton, pageNum) { var params = { UCID: this.uniqueId, sessid: BX.bitrix_sessid(), current : {id : curItemId}, include_subsection: 'Y', return_array : 'Y', ELEMENT_ID : curItemId, AJAX_CALL: 'Y' }; if (direction !== false) params.direction = direction == 'next' ? 'next' : 'prev'; this.state = 'loading'; if (curItemId == 'last') params.last_page = Math.ceil(this.itemsCount / this.itemsPageSize); if (curItemId == 'page') params.page_num = parseInt(pageNum) || 0; var _this = this; window.bxphres = false; BX.onCustomEvent(this, 'OnBeforeItemsLoaded', [params]); BX.ajax.get(this.actionUrl, params, function(result){ setTimeout(function(){ _this.CheckActionPostUrl(); if (window.bxphres.itemsPageSize) _this.itemsPageSize = parseInt(window.bxphres.itemsPageSize); if (window.bxphres.itemsCount) _this.itemsCount = parseInt(window.bxphres.itemsCount); if (window.bxphres.pageCount) _this.itemsPageCount = parseInt(window.bxphres.pageCount); if (window.bxphres && window.bxphres.items) _this.HandleItems(window.bxphres.items); _this.LoadedPages[parseInt(window.bxphres.currentPage)] = true; if (_this.PageQueue[parseInt(window.bxphres.currentPage)] === true) delete _this.PageQueue[parseInt(window.bxphres.currentPage)]; _this.state = 'ready'; if(bGoToDirecton !== false) { if (direction == 'next') _this.Next(); else if(direction == 'prev') _this.Previous(); } BX.onCustomEvent(_this, 'OnAfterItemsLoaded'); var page, lastViewed; for(page in _this.PageQueue) if (_this.PageQueue[page] === true && !_this.LoadedPages[page]) lastViewed = page; if (lastViewed) _this.LoadItems('page', false, false, lastViewed); }, 100); }); }, PreloadItems: function() { return; //if (this.state == 'loading') var bLoadPrev = false; var bLoadNext = false; // Preload to the left if (this.minIndex > 0 && this.currentIndex - this.minIndex < 10) bLoadPrev = true; else if (this.maxIndex < this.itemsCount - 1 && this.maxIndex - this.currentIndex < 30) bLoadNext = true; else if (this.minIndex > 0 && this.currentIndex - this.minIndex < 30) bLoadPrev = true; if (!this._iterrations) this._iterrations = 0; if (++this._iterrations > 30) return clearInterval(this.preloadItemsInt); // Preload to the right if (bLoadPrev) return this.LoadItems(this.Items[this.minIndex].id, 'prev', false); if (bLoadNext) return this.LoadItems(this.Items[this.maxIndex].id, 'next', false); if (this.minIndex == 0 && this.maxIndex == this.itemsCount - 1) clearInterval(this.preloadItemsInt); }, GetById: function(id) { if (typeof this.ItemIndex[id] != 'undefined' && this.Items[this.ItemIndex[id]]) return this.Items[this.ItemIndex[id]]; return false; }, OnAfterItemLoad: function() { }, DisplayItem: function(id, bAffectTopSlider, bAffectToUrl) { var _this = this; if (this._DisplayTimeout) { clearTimeout(this._DisplayTimeout); this._DisplayTimeout = null; } var oItem = this.GetById(id); if (oItem === false) { this._DisplayTimeout = setTimeout(function(){_this.DisplayItem(id, bAffectTopSlider);}, 100); return; } if (oItem === false || (this.currentIndex === parseInt(oItem.index) && !this._bFirstDisplay)) return; this._bFirstDisplay = false; this.currentIndex = parseInt(oItem.index); if (bAffectToUrl !== false && !this.reloadItemsOnload) { var url = this.itemUrl.replace('#ELEMENT_ID#', id); url = url.replace('#SECTION_ID#', oItem.album_id); if (oItem.gallery_id) url = url.replace('#USER_ALIAS#', oItem.gallery_id); var hash = this.itemUrlHash.replace('#ELEMENT_ID#', id); hash = hash.replace('#SECTION_ID#', oItem.album_id); if (oItem.gallery_id) hash = hash.replace('#USER_ALIAS#', oItem.gallery_id); this.SetUrl(url, hash); } this.topPager.current.innerHTML = parseInt(oItem.index) + 1; this.topPager.count.innerHTML = (parseInt(this.itemsCount) < parseInt(oItem.index) + 1) ? parseInt(oItem.index) + 1 : this.itemsCount; if (this.RotateCont && this.RotateCont.parentNode) { this.RotateCont.parentNode.removeChild(this.RotateCont); this.RotateCont = null; } oItem.srcLoaded = false; if (this.pImage && this.pImage.parentNode) this.pImage.parentNode.removeChild(this.pImage); // Don't show item if it was just rotated and now we save the rotation angle if (oItem.saveRotationProcess) { this.pImageWait.style.display = ""; } else { var src = oItem.big_src || oItem.src; this.pImage = this.pImgCell.appendChild(BX.create("IMG", {props: {src: src, className: 'photo-image-loading', id: 'bx-ph-' + oItem.id}})); this.pImageWait.style.display = ""; this.pImage.onload = function(){_this.ImageOnload(parseInt(this.id.substr('bx-ph-'.length)));}; if (this._photoOnloadInterval) { clearInterval(this._photoOnloadInterval); this._photoOnloadInterval = null; } if (!_this.pImage.complete && !oItem.srcLoaded) { this._photoOnloadInterval = setInterval(function() { if (_this.pImage.complete) _this.ImageOnload(oItem.id); if (oItem.srcLoaded) { clearInterval(_this._photoOnloadInterval); _this._photoOnloadInterval = null; } }, 100 ); } else { this.ImageOnload(oItem.id); } this.CleanRotation(false); this.CheckImageSize(oItem); } this.CheckFullModeDisplay(oItem); this.DisplayItemDetails(oItem); this.pCommentsCont.innerHTML = ""; // Comments this.ShowComWait(false); if (this.useComments) { oItem.comments = parseInt(oItem.comments); if (oItem.comments > 0) { this.pComCount.innerHTML = oItem.comments; if (this.reloadItemsOnload) this.ShowComWait(true); } if (!this.reloadItemsOnload) { if (oItem.comments > 0) { this.pShowMoreComLink.style.display = "none"; if (oItem.savedComments && this._CommentsParams) { this.pCommentsCont.innerHTML = oItem.savedComments; this._CommentsParams.navParams = oItem.savedNavparams; this.UpdateCommentsCount(); } else { this.GetComments(oItem.id); } } else { if (!this._CommentsParams) this.GetComments(oItem.id); this.pShowMoreComLink.style.display = "none"; this.pComCount.innerHTML = '0'; } if (this._CommentsParams && this.perm.addComment) { if (this._CommentsParams.elementId) this._CommentsParams.elementId.value = oItem.id; if (this._CommentsParams.textarea) { this._CommentsParams.textarea.value = oItem.savedCommentText || ""; this.CheckTextareaActivity(this._CommentsParams.textarea, true); } } if (this.perm.addComment) { if (this.commentsType == 'forum') { if (oItem.comments > this.showAddCommentsCount) { this.pAddCommentForm.style.display = "none"; // Hide add comment form this.pAddComLink.style.display = ""; } else { this.pAddCommentForm.style.display = "block"; // Show add comment form this.pAddComLink.style.display = "none"; } } else // Blog { this.pAddCommentForm.style.display = "block"; // Show add comment form } } } } this.pActionsCont.style.display = this.reloadItemsOnload ? 'none' : ''; if (this.oTopSlider && bAffectTopSlider !== false) this.oTopSlider.SelectItem(oItem); if (!oItem.bShowed || this.useRatings) this.OnItemShowed(oItem); }, DisplayItemDetails: function(oItem) { // Description this.CancelItemDescription(oItem); // Album var url = this.sectionUrl.replace("#SECTION_ID#", oItem.album_id); if (oItem.gallery_id) url = url.replace("#USER_ALIAS#", oItem.gallery_id); this.pAlbumLink.href = url; this.pAlbumLink.innerHTML = oItem.album_name; // Author this.pAuthorLink.href = this.userUrl.replace(/#USER_ID#/ig, oItem.author_id); if (oItem.gallery_id && this.pAuthorLink.href.toLowerCase().indexOf('#user_alias#')) this.pAuthorLink.href = this.pAuthorLink.href.replace(/#USER_ALIAS#/ig, oItem.gallery_id); this.pAuthorLink.innerHTML = oItem.author_name; // Views this.pViews.innerHTML = oItem.shows; // Tags this.pTags.innerHTML = ""; // clean all if (oItem.tags != "") { this.pTags.parentNode.style.display = ""; if (oItem.tags_array) { this.pTags.appendChild(BX.create("SPAN", {text: this.MESS.tags + ': '})); for (var i = 0, l = oItem.tags_array.length; i < l; i++) { name = oItem.tags_array[i]['TAG_NAME']; href = oItem.tags_array[i]['TAG_URL']; this.pTags.appendChild(BX.create("A", {props: {href: href}, text: name})); if (i < l - 1) this.pTags.appendChild(document.createTextNode(', ')); } } else { this.pTags.innerHTML = this.MESS.tags + ': ' + BX.util.htmlspecialchars(oItem.tags); } } else { this.pTags.parentNode.style.display = "none"; } // Date this.pDate.innerHTML = this.MESS.created + ' ' + oItem.date; // Link to sourceImage if (this.bShowSourceLink) this.pSourceLink.href = oItem.big_src || oItem.src; if (this.moderation) this.SetWarning(oItem['active'] != 'Y' ? 'active' : false); }, SetWarning: function(type) { if (!this.pTopWarning) this.pTopWarning = this.pImgCell.appendChild(BX.create("DIV")); this.pTopWarning.className = 'photo-top-warning' + (type ? ' photo-top-not-' + type : ''); if (type == 'active') { this.pTopWarning.style.top = Math.round(((parseInt(this.pImgCell.offsetHeight) / 2) || 300) - 10) + "px"; this.pTopWarning.innerHTML = "<span>" + this.MESS.notModerated + "</span>"; if (this.perm.moderate) { var pActivLinkModer = this.pTopWarning.appendChild(BX.create("A", {props:{href: "javascript: void(0)", className: "photo-top-not-warn-link"}, html: this.MESS.activateNow})); pActivLinkModer.onclick = BX.proxy(this.ActivateItem, this); var pDelLinkModer = this.pTopWarning.appendChild(BX.create("A", {props:{href: "javascript: void(0)", className: "photo-top-not-warn-link"}, html: this.MESS.deleteNow})); pDelLinkModer.onclick = BX.proxy(this.DeleteItem, this); } } }, ImageOnload: function(id) { var oItem = this.GetById(id); if (oItem.index == this.currentIndex && !oItem.srcLoaded) { oItem.srcLoaded = true; this.pImageWait.style.display = "none"; BX.removeClass(this.pImage, 'photo-image-loading'); BX.onCustomEvent(this, 'OnItemLoaded', [oItem]); setTimeout(BX.proxy(this.AdjustControls, this), 100); this.PreloadImages(oItem); } }, CreateSceleton: function() { var _this = this; var pPrev = BX.findChild(document.body, {className: 'photo-fixed-overlay'}); if (pPrev) BX.cleanNode(pPrev, true); this.pFixedOverlay = document.body.appendChild(BX.create("DIV", {props: {className: (!BX.browser.IsDoctype() && BX.browser.IsIE()) ? "photo-fixed-overlay photo-quirks-mode" : "photo-fixed-overlay sds"}})); this.pTable = this.pFixedOverlay.appendChild(BX.create("TABLE", {props: {className: "photo-main-table", cellSpacing: 0}})); var r = this.pTable.insertRow(-1); var pLeftCell = BX.adjust(r.insertCell(-1), {attrs: {className: "photo-prev-slide-wrap"}}), pMainCell = BX.adjust(r.insertCell(-1), {attrs: {className: "photo-main-block-wrap"}}), pRightCell = BX.adjust(r.insertCell(-1), {attrs: {className: "photo-next-slide-wrap"}}); this.pMainCell = pMainCell; this.prevPhotoLink = pLeftCell.appendChild(BX.create("a", {props: {href: "javascript: void(0)", className: "photo-prev-slide"}, html: "<span></span>"})); this.closeLink = pRightCell.appendChild(BX.create("a", {props: {href: "javascript: void(0)", className: "photo-close"}, html: "<span></span>"})); this.nextPhotoLink = pRightCell.appendChild(BX.create("a", {props: {href: "javascript: void(0)", className: "photo-next-slide"}, html: "<span></span>"})); // Set nav this.prevPhotoLink.onclick = BX.proxy(this.Previous, this); this.nextPhotoLink.onclick = BX.proxy(this.Next, this); this.closeLink.onclick = BX.proxy(this.ClosePopup, this); this.pOverlay = this.pFixedOverlay.appendChild(BX.create("DIV", {props: {className: "photo-overlay"}, style: {height: '800px'}})); this.pPopup = pMainCell.appendChild(BX.create("DIV", {props: {className: "photo-wrap"}})).appendChild(BX.create("DIV", {props: {className: "photo-main"}})); // Top section of the popup window (navigation, slider, close and fullscreen buttons) this.pPopupTop = this.pPopup.appendChild(BX.create("DIV", {props: {className: "photo-top"}})); var pNavCont = this.pPopupTop.appendChild(BX.create("DIV", {props: {className: "photo-top-nav"}})), pPager = pNavCont.appendChild(BX.create("DIV", {props: {className: "photo-pager"}, html: '<span class="photo-current-page">#</span><span>' + this.MESS.from + '</span><span class="photo-last-page">#</span>'})), pTopButCont = pNavCont.appendChild(BX.create("DIV", {props: {className: "photo-top-nav-buttons"}})); this.topPager = {current: pPager.childNodes[0], count: pPager.childNodes[2]}; this.pTopSliderBut = pTopButCont.appendChild(BX.create("A", {props:{className: "photo-slider-button", href: "javascript: void(0)"}, html: '<span>' + this.MESS.slider + '</span><i></i>'})); this.pMinimizeBut = pTopButCont.appendChild(BX.create("A", {props:{className: "photo-full-screen-but", href: "javascript: void(0)"}})); // photo-minimize-screen-but this.pCloseBut = pTopButCont.appendChild(BX.create("A", {props:{className: "photo-close-but", href: "javascript: void(0)"}})); this.pCloseBut.onclick = BX.proxy(this.ClosePopup, this); this.pMinimizeBut.onclick = BX.proxy(this.ChangeMode, this); // Scroller in the top this.pScrollCont = pNavCont.appendChild(BX.create("DIV", {props: {className: "photo-scroll"}})); this.pScroller = this.pScrollCont.appendChild(BX.create("A", {props:{className: "photo-scroll-wheel"}})); // Container with small previews of photos in the top of this.pSliderCont = this.pPopupTop.appendChild(BX.create("DIV", {props: {className: "photo-slider"}})); this.pSlider = this.pSliderCont.appendChild(BX.create("DIV", {props: {className: "photo-slider-int"}})); this.oTopSlider = new BXTopSlider(this); // Photo this.pImageTable = this.pPopup.appendChild(BX.create("TABLE", {props: {className: "photo-image", cellSpacing: 0}})); this.pImageTable.onclick = BX.proxy(this.Next, this); this.pImgCell = this.pImageTable.insertRow(-1).insertCell(-1); this.pImageWait = this.pImgCell.appendChild(BX.create("IMG", {props: {src: "/bitrix/images/1.gif", className: "photo-image-wait"}, style: {display: 'none'}})); this.pImage = this.pImgCell.appendChild(BX.create("IMG", {props: {src: "/bitrix/images/1.gif"}})); // Footer section (detail, comments, rating, slideshow controls) this.pPopupFooter = this.pPopup.appendChild(BX.create("DIV", {props: {className: "photo-footer"}})); var pShortDescCont = this.pPopupFooter.appendChild(BX.create("DIV", {props:{className: "photo-descriptions"}})), pDescLeft = pShortDescCont.appendChild(BX.create("DIV", {props:{className: "photo-description-left"}})), pDescRight = pShortDescCont.appendChild(BX.create("DIV", {props:{className: "photo-description-right"}})); this.pDescCont = pDescLeft.appendChild(BX.create("SPAN", {props:{className: "photo-description-text"}})); if (this.bShowEditControls) { this.pAddDescLink = pDescLeft.appendChild(BX.create("A", {props:{className: "photo-qt-desc", href: "javascript: void(0)"}, text: this.MESS.addDesc})); this.pAddDescLink.onclick = BX.proxy(this.EditItemDescription, this); } this.pDesc = this.pDescCont.appendChild(BX.create("SPAN")); if (this.bShowEditControls) { this.pEditDesc = this.pDescCont.appendChild(BX.create("A", {props:{href: "javascript:void(0)"}})); this.pEditDesc.onclick = BX.proxy(this.EditItemDescription, this); // Textarea with save and cancel buttons this.pEditDescCont = pDescLeft.appendChild(BX.create("DIV", {props:{className: "photo-sign-wrap"}})); this.pEditDescInp = this.pEditDescCont.appendChild(BX.create("TEXTAREA", {props:{className: "photo-textarea photo-textarea-active"}})); this.pEditDescSave = this.pEditDescCont.appendChild(BX.create("A", {props:{className: "photo-comment-add", href: "javascript:void(0)", title: this.MESS.saveDetailTitle}, html: '<span>' + this.MESS.save + '</span><i></i>'})); this.pEditDescCancel = this.pEditDescCont.appendChild(BX.create("A", {props:{className: "photo-comment-add", href: "javascript:void(0)"}, html: '<span>' + this.MESS.cancel + '</span><i></i>'})); this.pEditDescSave.onclick = BX.proxy(this.SaveItemDescription, this); this.pEditDescCancel.onclick = BX.proxy(this.CancelItemDescription, this); this.pEditDescInp.onkeyup = function(e) { if(!e) e = window.event if(!e) return; var key = e.keyCode || e.which; if (key == 17) // Ctrl { _this._bCtrlPressed = true; setTimeout(function(){_this._bCtrlPressed = false;}, 400); } else if (key == 13 && (e.ctrlKey || _this._bCtrlPressed)) { if (_this.bItemDescEdited) _this.SaveItemDescription(); } return BX.PreventDefault(e); }; } // Rating with stars - filled by component bitrix:iblock.vote with 'ajax' template if (this.useRatings) { this.pRatingCont = pDescRight.appendChild(BX.create("SPAN", {props:{id: "bx-photo-rating-cont", className: "photo-rating"}})); if (!BX.browser.IsDoctype() && BX.browser.IsIE()) this.pRatingCont.style.margin = "3px 10px 0 0"; } // SlideShow Control this.pSlideshowCont = pDescRight.appendChild(BX.create("SPAN", {props:{className: "photo-slideshow"}})); this.pSlideshow = this.pSlideshowCont.appendChild(BX.create("A", {props:{className: "photo-slideshow-button", title: this.MESS.slideshowTitle}, html: '<span class="photo-slideshow-button-text">' + this.MESS.slideshow + ':</span><span class="photo-slideshow-button-img"></span><i></i>'})); this.pSlideshow.onclick = BX.proxy(this.RunSlideShow, this); // Extended section which can be showed or hidden by user this.pExtendDescCont = this.pPopupFooter.appendChild(BX.create("DIV", {props:{className: "photo-comments no-comment"}})); var pLeftCont = this.pExtendDescCont.appendChild(BX.create("DIV", {props:{className: "photo-comments-left"}})), pRightCont = this.pExtendDescCont.appendChild(BX.create("DIV", {props:{className: "photo-comments-right"}})), pInfo = pRightCont.appendChild(BX.create("DIV", {props:{className: "photo-comments-right-info"}})), pAlbumCont = pInfo.appendChild(BX.create("DIV", {props:{className: "photo-album"}, children: [BX.create("SPAN", {props:{className: "photo-comments-right-grey"}, text: this.MESS.album + ': '})]})), pAuthorCont = pInfo.appendChild(BX.create("DIV", {props:{className: "photo-comments-author"}, children: [BX.create("SPAN", {props:{className: "photo-comments-right-grey"}, text: this.MESS.author + ': '})]})), pViewsCont = pInfo.appendChild(BX.create("DIV", {props:{className: "photo-comments-author"}, children: [BX.create("SPAN", {props:{className: "photo-comments-right-grey"}, text: this.MESS.views + ': '})]})), pTagsCont = pInfo.appendChild(BX.create("DIV", {props:{className: "photo-comments-author"}})); this.pAlbumLink = pAlbumCont.appendChild(BX.create("A", {props:{href: "#"}, html: "album"})); this.pAuthorLink = pAuthorCont.appendChild(BX.create("A", {props:{href: '#'}, html: 'author'})); this.pViews = pViewsCont.appendChild(BX.create("SPAN", {props:{className: "photo-comments-right-grey"}})); this.pDate = pInfo.appendChild(BX.create("DIV", {props:{className: "photo-comments-add_date"}})); this.pTags = pTagsCont.appendChild(BX.create("SPAN", {props:{className: "photo-comments-right-grey"}})); this.pActionsCont = pRightCont.appendChild(BX.create("DIV")); var pEditWrap = this.pActionsCont.appendChild(BX.create("DIV", {props:{className: "photo-comments-edit-wrap"}})); if (this.bShowEditControls) { var pEditLink = pEditWrap.appendChild(BX.create("A", {props:{href: "javascript: void(0)", className: "photo-comments-button"}, html: this.MESS.edit})), pRotateLeft = pEditWrap.appendChild(BX.create("A", {props:{href: "javascript: void(0)", className: "photo-comment-undo", title: this.MESS.rotate}})), pRotateRight = pEditWrap.appendChild(BX.create("A", {props:{href: "javascript: void(0)", className: "photo-comment-redo", title: this.MESS.rotate}})), pDelLink = this.pActionsCont.appendChild(BX.create("A", {props:{href: "javascript: void(0)", className: "photo-comments-button"}, html: this.MESS.del})); pRotateLeft.onclick = function(e){_this.RotateItem(true); return BX.PreventDefault(e);}; pRotateRight.onclick = function(e){_this.RotateItem(false); return BX.PreventDefault(e);}; pDelLink.onclick = BX.proxy(this.DeleteItem, this); pEditLink.onclick = BX.proxy(this.EditItem, this); } this.pBigPhoto = this.pActionsCont.appendChild(BX.create("A", {props:{href: "javascript: void(0)", className: "photo-comments-button"}, html: this.MESS.bigPhoto})); this.pBigPhoto.onclick = BX.proxy(this.ChangeMode, this); if (this.bShowSourceLink) { this.pSourceLink = this.pActionsCont.appendChild(BX.create("A", {props:{href: "javascript: void(0)", className: "photo-comments-button"}, html: this.MESS.sourceImage})); this.pSourceLink.onclick = BX.proxy(this.ShowSource, this); } this.pComWaiter = pLeftCont.appendChild(BX.create("IMG", {props:{className: "photo-wait-comments", src: "/bitrix/images/1.gif"}, style: {display: "none"}})); // Waiter this.pShowMoreComLink = pLeftCont.appendChild(BX.create("A", {props:{className: "photo-more-comments", href: "javascript:void(0)"}, html: this.MESS.moreCom, style: {display: 'none'}})); // Show more comments link this.pCommentsCont = pLeftCont.appendChild(BX.create("DIV")); // Container with comments this.pShowMoreComLink.onclick = BX.proxy(this.ShowMoreComments, this); this.pAddCommentForm = pLeftCont.appendChild(BX.create("DIV")); if (!this.perm.addComment && this.useComments) pLeftCont.appendChild(BX.create("DIV", {props: {className: 'photo-comments-warning'}, text: this.MESS.comAccessDenied})); if (this.perm.addComment) { this.pAddComLink = pLeftCont.appendChild(BX.create("A", {props:{className: "photo-comments-add", href: "javascript:void(0)"}, html: this.MESS.addComment, style: {display: 'none'}})); // Add new comment this.pAddComLink.onclick = function() { _this.pAddCommentForm.style.display = "block"; _this.pAddComLink.style.display = "none"; if (_this._CommentsParams && _this._CommentsParams.textarea) _this.CheckTextareaActivity(_this._CommentsParams.textarea, false); _this.AdjustOverlay(); }; } this.pComCountLink = this.pPopupFooter.appendChild(BX.create("A", {props:{className: "photo-qt-comments", href: "javascript: void(0)"}, html: this.MESS.commentsCount + ": "})); this.pComCount = this.pComCountLink.appendChild(BX.create("SPAN", {html: '0'})); this.pExFlipper = this.pPopupFooter.appendChild(BX.create("A", {props:{className: "photo-open-footer", href: "javascript: void(0)"}, html: "<i></i>"})); this.pExFlipper.onclick = this.pComCountLink.onclick = BX.proxy(this.OpenExtDescription, this); // User can change theme if (this.bChangeTheme) { this.pThemeLink = this.pPopupFooter.appendChild(BX.create("A", {props:{className: "photo-dark-theme-link", href: "javascript: void(0)"}})); this.pThemeLink.onclick = BX.proxy(this.SetTheme, this); } this.OpenExtDescription(this.bSectionOpened, false); this.bSceletonCreated = true; this.SetUnselectable([this.pTopSliderBut, this.pMinimizeBut, this.pCloseBut, this.pScrollCont, this.pScroller, this.pSliderCont, this.pSlider]); if (!this.useComments) { // Put Information cont to the left side pLeftCont.appendChild(pInfo); BX.addClass(pInfo, "photo-comments-right-info-left"); this.pComCountLink.style.display = "none"; } this.SetTheme(this.theme, false); this.OnResize(); }, AdjustControls: function() { // Set nav if (this.itemsCount <= 1) { this.nextPhotoLink.style.display = this.prevPhotoLink.style.display = "none"; } else { this.nextPhotoLink.style.display = this.prevPhotoLink.style.display = ""; if(!BX.browser.IsDoctype() && BX.browser.IsIE()) { this.nextPhotoLink.style.height = this.prevPhotoLink.style.height = document.documentElement.offsetHeight + "px"; this.prevPhotoLink.style.width = (this.prevPhotoLink.parentNode.clientWidth - 1) + 'px'; this.nextPhotoLink.style.width = (this.nextPhotoLink.parentNode.clientWidth - 1) + 'px'; } else { this.nextPhotoLink.style.height = this.prevPhotoLink.style.height = document.documentElement.clientHeight + "px"; this.prevPhotoLink.style.width = this.prevPhotoLink.parentNode.clientWidth + 'px'; this.nextPhotoLink.style.width = this.nextPhotoLink.parentNode.clientWidth + 'px'; } this.prevPhotoLink.firstChild.style.left = (this.prevPhotoLink.parentNode.clientWidth * 4 / 10) + 'px'; this.nextPhotoLink.firstChild.style.right = (this.nextPhotoLink.parentNode.clientWidth * 4 / 10) + 'px'; } this.closeLink.style.width = this.closeLink.parentNode.clientWidth + 'px'; if (BX.browser.IsChrome()) { var x = this.closeLink.firstChild; x.style.top = '14.5px'; setTimeout(function(){x.style.top = '15px';}, 10); } var footW = this.Mode == "auto" ? parseInt(this.pImageTable.offsetWidth) : this.fixedSize; if (!footW || footW < this.fixedSize) footW = this.fixedSize; this.pPopupFooter.style.width = footW + 'px'; this.AdjustOverlay(); if (this.oTopSlider) this.oTopSlider.AdjustScroller(); }, AdjustOverlay: function() { var h = parseInt(this.pTable.offsetHeight) || 0, hWin = parseInt(BX.GetWindowScrollSize(document).scrollHeight) || 0; if (h < hWin) h = hWin; this.pOverlay.style.height = (h + (BX.browser.IsIE10() ? 250 : 50)) + 'px'; }, OpenExtDescription: function(bOpen, bSave) { if (typeof bOpen != 'boolean') bOpen = !this.bSectionOpened; if (bOpen) { BX.addClass(this.pExFlipper, "photo-open-footer-open"); this.pExtendDescCont.style.display = "block"; if (this.useComments) this.pComCountLink.style.display = "none"; } else { BX.removeClass(this.pExFlipper, "photo-open-footer-open"); this.pExtendDescCont.style.display = "none"; if (this.useComments) this.pComCountLink.style.display = ""; } this.bSectionOpened = bOpen; if (bSave !== false) this.SaveOption("detail_view", bOpen ? "Y" : "N"); this.AdjustOverlay(); return false; }, OnKeyUp: function(e) { if(!e) e = window.event if(!e) return; var key = e.keyCode || e.which; if(key == 27) { if (this.bEscCloseEnabled) this.ClosePopup(); } else if(key == 39) // Next photo { if (this.bArrowControllEnabled) this.Next(); } else if(key == 37) // Previous photo { if (this.bArrowControllEnabled) this.Previous(); } else if (key == 17) // Ctrl { var _this = this; this._bCtrlPressed = true; setTimeout(function(){_this._bCtrlPressed = false;}, 400); } else if (key == 13 && (e.ctrlKey || this._bCtrlPressed)) { if (this.bItemDescEdited) this.SaveItemDescription(); else if (this.pAddCommentForm.style.display == "block" && this._CommentsParams) this.SubmitNewComment(); } }, SetUnselectable: function(arNodes) { if (typeof arNodes != 'object') arNodes = [arNodes]; for (var i = 0, l = arNodes.length; i < l; i++) { BX.setUnselectable(arNodes[i]); arNodes[i].ondragstart = function (e){return BX.PreventDefault(e);}; } }, GetComments: function(id) { this.ShowComWait(true); var _this = this; window.bxph_error = null; BX.ajax.get( this.actionUrl, { UCID: this.uniqueId, photo_list_action: 'load_comments', sessid: BX.bitrix_sessid(), photo_element_id : id, AJAX_CALL: 'Y' }, function(result){ setTimeout(function() { _this.CheckActionPostUrl(); _this.ShowComWait(false); if (window.bxph_error) { alert(window.bxph_error); } else { if (id != _this.Items[_this.currentIndex].id) return; if (_this.commentsType == 'blog') { _this.ParseBlogComments(result); } else { if (_this.perm.addComment) _this.ParseForm(result); _this.AddComments(result); } //BX.onCustomEvent(_this, 'OnRegisterCommentsControl'); } }, 50); var f = function() { setTimeout(function(){BX.onCustomEvent(_this, 'OnRegisterCommentsControl');}, 100); BX.removeCustomEvent('onAjaxSuccessFinish', f); }; BX.addCustomEvent('onAjaxSuccessFinish', f); } ); }, AddComments: function(result, bAttachToTheEnd) { var exIds = this.Items[this.currentIndex].arCommentInds; if (exIds && top._bxArCommentsIds) { for (var i in top._bxArCommentsIds) { if (exIds[top._bxArCommentsIds[i]]) { var pComment = BX('bxphoto_com_' + top._bxArCommentsIds[i]); if (pComment) pComment.parentNode.removeChild(pComment); } } } if (bAttachToTheEnd === true) this.pCommentsCont.innerHTML += this.ParseComments(result); else this.pCommentsCont.innerHTML = this.ParseComments(result) + this.pCommentsCont.innerHTML; this.Items[this.currentIndex].savedComments = this.pCommentsCont.innerHTML; this.AdjustOverlay(); }, RegisterCommentsControl: function(Params) { if (Params.itemId != this.Items[this.currentIndex].id) return; if (Params.navParams) { Params.navParams.pageCount = parseInt(Params.navParams.pageCount) || 0; Params.navParams.pageSize = parseInt(Params.navParams.pageSize) || 0; Params.navParams.pagen = parseInt(Params.navParams.pagen) || 0; Params.navParams.NavNum = parseInt(Params.navParams.NavNum) || 0; Params.navParams.nSelectedCount = parseInt(Params.navParams.nSelectedCount) || 0; } this._CommentsParams = Params; this.Items[this.currentIndex].savedNavparams = BX.clone(Params.navParams, true); if (!this.Items[this.currentIndex].arCommentInds) this.Items[this.currentIndex].arCommentInds = {}; if (Params.arComments) for (var i in Params.arComments) this.Items[this.currentIndex].arCommentInds[Params.arComments[i]] = true; this.UpdateCommentsCount(); var _this = this; if (this.perm.addComment && this._CommentsParams && this._CommentsParams.textarea && this._CommentsParams.button) { this._CommentsParams.button.onclick = BX.proxy(this.SubmitNewComment, this); this._CommentsParams.textarea.onblur = function() { _this.SaveUnpostedComment(this.value); _this.CheckTextareaActivity(this, true); }; this._CommentsParams.textarea.onkeyup = function(e) { _this.SaveUnpostedComment(this.value); if(!e) e = window.event if(!e) return; var key = e.keyCode || e.which; if (key == 17) // Ctrl { _this._bCtrlPressed = true; setTimeout(function(){_this._bCtrlPressed = false;}, 400); } else if (key == 13 && (e.ctrlKey || _this._bCtrlPressed)) { if (_this.pAddCommentForm.style.display == "block" && _this._CommentsParams) _this.SubmitNewComment(); } return BX.PreventDefault(e); }; this._CommentsParams.textarea.onfocus = function() { _this.CheckTextareaActivity(this, false); }; this.CheckTextareaActivity(this._CommentsParams.textarea, true); if (this._CommentsParams.guestName) { this._CommentsParams.guestName.onblur = function(){_this.CheckInputActivity(this, true);}; this._CommentsParams.guestName.onfocus = function(){_this.CheckInputActivity(this, false);}; } if (this._CommentsParams.guestEmail) { this._CommentsParams.guestEmail.onblur = function(){_this.CheckInputActivity(this, true);}; this._CommentsParams.guestEmail.onfocus = function(){_this.CheckInputActivity(this, false);}; } } }, ShowMoreComments: function() { if (!this._CommentsParams || !this._CommentsParams.navParams || this._CommentsParams.navParams.pagen >= this._CommentsParams.navParams.pageCount) { this.pShowMoreComLink.style.display = "none"; return; } var _this = this; var params = { UCID: this.uniqueId, photo_list_action: 'load_comments', sessid: BX.bitrix_sessid(), return_more_comments: 'Y', photo_element_id : this.Items[this.currentIndex].id, AJAX_CALL: 'Y' }; params['PAGEN_' + this._CommentsParams.navParams.NavNum] = this._CommentsParams.navParams.pagen + 1; top._bxArCommentsIds = false; this.ShowComWait(true); BX.ajax.get(this.actionUrl, params, function(result){setTimeout(function(){ _this.CheckActionPostUrl(); _this.AddComments(result); _this.ShowComWait(false); BX.onCustomEvent(_this, 'OnRegisterCommentsControl'); }, 100);}); }, ParseBlogComments: function(result) { var _this = this, indBegin = result.indexOf('#BLOG_COMMENTS_BEGIN#'), indEnd = result.indexOf('#BLOG_COMMENTS_END#'); if (indBegin === -1 || indEnd === -1) return ''; var res = result.substr(indBegin + '#BLOG_COMMENTS_BEGIN#'.length, indEnd - indBegin - '#BLOG_COMMENTS_BEGIN#'.length); BX.addCustomEvent('onShowPhotoBlogComment', BX.proxy(this.AdjustOverlay, this)); BX.addCustomEvent('onAddNewPhotoBlogComment', function(params) { if (params) { var count = parseInt(params.count); if (parseInt(params.editId) == 0) count++; // Add new comment if (parseInt(params.deletedComment) != 0) count--; // Comment was deleted _this.pComCount.innerHTML = count; } }); this.pAddCommentForm.innerHTML = BX.util.trim(res); this.AdjustOverlay(); }, ParseComments: function(result) { var indBegin = result.indexOf('#COMMENTS_BEGIN#'), indEnd = result.indexOf('#COMMENTS_END#'); if (indBegin === -1 || indEnd === -1) return ''; var res = result.substr(indBegin + '#COMMENTS_BEGIN#'.length, indEnd - indBegin - '#COMMENTS_BEGIN#'.length); res = BX.util.trim(res); return res; }, ParseForm: function(result) { var resMes = '', resNote = '', indBegin = result.indexOf('#NOTE_BEGIN#'), indEnd = result.indexOf('#NOTE_END#'); if (indBegin !== -1 && indEnd !== -1) resNote = BX.util.trim(result.substr(indBegin + '#NOTE_BEGIN#'.length, indEnd - indBegin - '#NOTE_BEGIN#'.length)); indBegin = result.indexOf('#ADD_COMMENT_BEGIN#'); indEnd = result.indexOf('#ADD_COMMENT_END#'); if (indBegin !== -1 && indEnd !== -1) resMes = BX.util.trim(result.substr(indBegin + '#ADD_COMMENT_BEGIN#'.length, indEnd - indBegin - '#ADD_COMMENT_BEGIN#'.length)); this.pAddCommentForm.innerHTML = resNote + resMes; if (resNote !== '') return false; // Fetch errors For forums if (resMes.indexOf('reviews-note-error') !== -1) return false; return true; }, UpdateCommentsCount: function() { this.pShowMoreComLink.style.display = (this._CommentsParams.navParams && this._CommentsParams.navParams.pageCount > 1) ? "" : "none"; var mess = this.MESS.moreCom, N = this._CommentsParams.navParams.pageSize, M = 0, i, showed = 0, all = this._CommentsParams.navParams.nSelectedCount; this.Items[this.currentIndex].comments = all; for (i in this.Items[this.currentIndex].arCommentInds) showed++; M = all - showed; if (M < N) { N = M; mess = this.MESS.moreCom2; } if (M <= 0) this.pShowMoreComLink.style.display = "none"; mess = mess.replace("#N#", N); mess = mess.replace("#M#", M); this.pShowMoreComLink.innerHTML = mess; this.pComCount.innerHTML = all; }, ShowComWait: function(bShow) { this.pComWaiter.style.display = bShow ? "" : "none"; }, SaveUnpostedComment: function(value) { this.Items[this.currentIndex].savedCommentText = value; }, SubmitNewComment: function() { if (!this._CommentsParams) return; var _this = this; var bReRequest = this.Items[this.currentIndex].comments < 1; // First comment for photo var id = this.Items[this.currentIndex].id; this._CommentsParams.textarea.value = BX.util.trim(this._CommentsParams.textarea.value); if (this._CommentsParams.textarea.value == this.MESS.commentTitle) this._CommentsParams.textarea.value = ""; // Add UCID to this._CommentsParams.form.action += '&UCID='+ this.uniqueId; top._bxError = false; var comment = this._CommentsParams.textarea.value; if (comment.length > 2) { // Comments this.ShowComWait(true); BX.ajax.submit(this._CommentsParams.form, function(result) { var res = _this.ParseForm(result); if (!top._bxError && res !== false) { if (bReRequest) return _this.GetComments(id); setTimeout(function(){_this.AddComments(result, true);}, 100); } if (res === false) { _this.pAddCommentForm.style.display = ""; _this.pAddComLink.style.display = "none"; _this._CommentsParams.textarea.value = comment; } BX.onCustomEvent(_this, 'OnRegisterCommentsControl'); _this.ShowComWait(false); }); setTimeout(function(){ // Hide add comment link and show link _this.pAddCommentForm.style.display = "none"; _this.pAddComLink.style.display = ""; _this.SaveUnpostedComment(''); _this._CommentsParams.textarea.value = ""; _this._CommentsParams.form.parentNode.removeChild(_this._CommentsParams.form); }, 50); } else { if (this._CommentsParams.textarea.value.length > 0) alert(this.MESS.shortComError); } }, CheckTextareaActivity: function(ta, bBlur) { if (!this.perm.addComment) return; var val = BX.util.trim(ta.value), deffMess = this.MESS.commentTitle, activeClass = 'photo-textarea-active'; if (bBlur) { if (val == '' || val == deffMess) { ta.value = deffMess; BX.removeClass(ta, activeClass); } else { BX.addClass(ta, activeClass); } this.bArrowControllEnabled = true; } else { if (val == '' || val == deffMess) { ta.value = ''; BX.addClass(ta, activeClass); ta.focus(); } this.bArrowControllEnabled = false; } }, CheckInputActivity: function(inp, bBlur) { if (!inp) return; var val = BX.util.trim(inp.value), deffMess = inp.title + '...', activeClass = 'bxph-photo-active'; if (bBlur) { if (val == '' || val == deffMess) { inp.value = deffMess; BX.removeClass(inp, activeClass); } else { BX.addClass(inp, activeClass); } this.bArrowControllEnabled = true; } else { if (val == '' || val == deffMess) { inp.value = ''; BX.addClass(inp, activeClass); inp.focus(); } this.bArrowControllEnabled = false; } }, SaveOption: function(option, value) { BX.userOptions.save('photogallery', this.id, option, value); }, RunSlideShow: function() { if (this.slideShowStatus != 'play') this.PlaySlideShow(false, this.currentIndex == this.itemsCount - 1); else this.StopSlideShow(); return false; }, InitSlideShow: function() { this.bSlideShowInited = true; this.slideShowSpeed = parseInt(this.userSettings.slide_show_speed); if (!this.slideShowSpeed || this.slideShowSpeed < 1 || this.slideShowSpeed > 5) this.slideShowSpeed = 3; this.pSlideShowSpeed = {}; var pSlideshowSpeedCont = this.pSlideshowCont.appendChild(BX.create("SPAN", {props:{className: "photo-slideshow-speed"}})); var i, _this = this; for (i = 1; i <= 5; i++) { this.pSlideShowSpeed[i] = pSlideshowSpeedCont.appendChild(BX.create("A", {props: {id: 'bxph-slide-speed-' + i, className: (i == this.slideShowSpeed ? "photo-slideshow-speed-active" : ""), href: "javascript:void(0)"}, html: i})); this.pSlideShowSpeed[i].onclick = function(){_this.SetSlideShowSpeed(parseInt(this.id.substr('bxph-slide-speed-'.length)));}; }; BX.addCustomEvent(this, 'OnItemLoaded', BX.proxy(this.SlideShowItemOnload, this)); }, SetSlideShowSpeed: function(speed) { this.slideShowSpeed = speed; var i, _this = this; for (i = 1; i <= 5; i++) this.pSlideShowSpeed[i].className = i == this.slideShowSpeed ? "photo-slideshow-speed-active" : ""; this.SaveOption('slide_show_speed', speed); }, PlaySlideShow: function(bPlay, bPlayAgain) { // Changle button BX.addClass(this.pSlideshowCont, "photo-slideshow-active"); if (!this.bSlideShowInited) this.InitSlideShow(); var _this = this; this.slideShowStatus = 'play'; bPlay = !!bPlay; bPlayAgain = !!bPlayAgain; if (bPlay) { this.Next(!!bPlayAgain, true); if (this.currentIndex == this.itemsCount - 1 && !bPlayAgain) this.StopSlideShow(); } else { setTimeout(function() { if (_this.slideShowStatus == 'play') _this.PlaySlideShow(true, !!bPlayAgain); }, this.slideShowSpeed * 1000); } }, StopSlideShow: function() { // Changle button BX.removeClass(this.pSlideshowCont, "photo-slideshow-active"); this.slideShowStatus = 'paused'; }, SlideShowItemOnload: function(Item) { if (this.slideShowStatus != 'play') return; this.PlaySlideShow(false); }, EditItemDescription: function(e) { if (this.bShowEditControls) { this.bArrowControllEnabled = false; this.bItemDescEdited = true; this.pAddDescLink.style.display = "none"; this.pEditDescCont.style.display = ""; this.pDescCont.style.display = "none"; var oItem = this.Items[this.currentIndex]; this.pEditDescInp.value = oItem.description; BX.focus(this.pEditDescInp); } return BX.PreventDefault(e); }, SaveItemDescription: function(checkActUrl) { _this = this; if (!this.actionPostUrl && checkActUrl !== false) return setTimeout( function() { _this.SaveItemDescription(false); }, 200); var oItem = this.Items[this.currentIndex]; oItem._description = oItem.description; oItem.description = this.pEditDescInp.value; window.bxph_error = null; var _this = this; BX.ajax.post( this.actionPostUrl || this.actionUrl, { UCID: this.uniqueId, photo_list_action: 'save_description', sessid: BX.bitrix_sessid(), description: oItem.description, ELEMENT_ID : oItem.id }, function(result){setTimeout(function() { if (window.bxph_error) { alert(window.bxph_error); if (_this.currentIndex == oItem.index) _this.EditItemDescription(); oItem.description = oItem._description; } delete oItem._description; }, 100);} ); // Hide this.CancelItemDescription(oItem); }, CancelItemDescription: function(oItem) { if (!oItem || oItem.nodeName || typeof oItem.description == 'undefined') oItem = this.Items[this.currentIndex]; this.bItemDescEdited = false; this.bArrowControllEnabled = true; // Description if (oItem.description.length > 0) { if (this.bShowEditControls) this.pAddDescLink.style.display = "none"; this.pDescCont.style.display = ""; var html = oItem.description; html = BX.util.htmlspecialchars(html); html = html.replace(/\n|\r/ig, '<br>'); this.pDesc.innerHTML = html; } else // Show add desc link { if (this.bShowEditControls) this.pAddDescLink.style.display = ""; this.pDescCont.style.display = "none"; this.pDesc.innerHTML = ""; } if (this.bShowEditControls) this.pEditDescCont.style.display = "none"; }, _CleanItemsArray: function() { this.Items = []; this.ItemIndex = {}; this.currentIndex = 0; this.LoadedPages = {}; //currentPage if (this.oTopSlider) this.oTopSlider.CleanItems(); }, _RedisplayItemAfterItemsReloading: function() { if (this._currentItemId > 0 && this.reloadItemsOnload) { this.reloadItemsOnload = false; this._bFirstDisplay = true; this.DisplayItem(this._currentItemId); this._currentItemId = 0; BX.removeCustomEvent(this, 'OnBeforeItemsLoaded', BX.proxy(this._CleanItemsArray, this)); BX.removeCustomEvent(this, 'OnAfterItemsHandled', BX.proxy(this._RedisplayItemAfterItemsReloading, this)); if (this.oTopSlider) this.oTopSlider.CheckCurrentShownItems(); } }, RotateItem: function(bLeft) { // Current item var oItem = this.Items[this.currentIndex]; if (!oItem) return; // Calculate angle if (!oItem.angle) oItem.angle = 0; oItem.angle += (bLeft ? -1 : 1) * 90; if (oItem.angle < 0) oItem.angle = 360 + oItem.angle; else if (oItem.angle == 360) oItem.angle = 0; // Catch original sizes once for item and zero angle if (!oItem.w) oItem.w = parseInt(this.pImage.offsetWidth); if (!oItem.h) oItem.h = parseInt(this.pImage.offsetHeight); // Set size if (oItem.angle == 0 || oItem.angle == 180) { this.pImage.style.marginTop = ''; this.pImage.style.marginLeft = ''; if (this.RotateCont) { this.pImgCell.appendChild(this.pImage); this.RotateCont.parentNode.removeChild(this.RotateCont); this.RotateCont = null; } } else { // Put image into the container if (!this.RotateCont) { this.RotateCont = this.pImage.parentNode.appendChild(BX.create("DIV", {props: {className: "photo-rotate-cont"}})); this.RotateInnerCont = this.RotateCont.appendChild(BX.create("DIV", {props: {className: "photo-rotate-cont-inner"}})); this.RotateInnerCont.appendChild(this.pImage); this.RotateInnerCont.style.overflow = 'hidden'; } // Default - for landscape images (W > H) var pad = Math.round((oItem.w - oItem.h) / 2); // For portrait images (H < W) if (oItem.w < oItem.h) { if (!BX.browser.IsIE()) this.pImage.style.marginTop = pad + "px"; else if (BX.browser.IsIE() && BX.browser.IsDoctype()) this.pImage.style.marginLeft = (pad * 2) + "px"; pad = 0; } else { if (BX.browser.IsIE() && BX.browser.IsDoctype()) this.RotateCont.style.paddingLeft = pad + 'px'; } if (!BX.browser.IsIE()) this.RotateCont.style.paddingTop = pad + 'px'; this.RotateInnerCont.style.width = oItem.h + 'px'; this.RotateInnerCont.style.height = (oItem.w - pad) + 'px'; } this.RotateImage(this.pImage, oItem.angle, true); if (!this.Rotated[oItem.id]) this.Rotated[oItem.id] = true; this.AdjustControls(); }, SaveRotatedItems: function(bTime) { if (bTime === true) return setTimeout(BX.proxy(this.SaveRotatedItems, this), 1); for (var id in this.Rotated) if (this.Rotated) this.SaveRotationAngle(this.GetById(id)); // Reinit rotation array this.Rotated = {}; }, CleanRotation: function(oItem, bCheck) { if (this.RotateInnerCont) { this.pImage.style.marginTop = ''; this.pImage.style.marginLeft = ''; if (this.RotateCont) { this.pImgCell.appendChild(this.pImage); this.RotateCont.parentNode.removeChild(this.RotateCont); this.RotateCont = null; } if (bCheck !== false) this.CheckImageSize(oItem); this.RotateImage(this.pImage, 0, false); } }, RotateImage: function(pImg, angle, bEffects) { var cn = ''; if (angle != 0) cn = BX.browser.IsIE9() ? 'photo-rotate-ie9-' + angle : 'photo-rotate-' + angle; pImg.className = cn; }, SaveRotationAngle: function(oItem) { if (oItem.angle == 0) return; oItem.saveRotationProcess = true; BX.showWait('photo_rotate'); var angle = oItem.angle; var _this = this; window.bxphres = false; BX.ajax.get( this.actionUrl, { UCID: this.uniqueId, photo_list_action: 'rotate', sessid: BX.bitrix_sessid(), ELEMENT_ID : oItem.id, angle: angle, AJAX_CALL: 'Y' }, function(result){setTimeout(function() { _this.CheckActionPostUrl(); BX.closeWait('photo_rotate'); if (window.bxph_error) { alert(window.bxph_error); } else if(window.bxphres && window.bxphres.Item) { var Item = _this.GetById(window.bxphres.Item.id); Item.saveRotationProcess = false; if (Item.big_src) Item.big_src = window.bxphres.Item.src; if (Item.angle == angle) { Item.src = window.bxphres.Item.src; Item.width = window.bxphres.Item.w; Item.height = window.bxphres.Item.h; delete Item.h; delete Item.w; delete Item.angle; if (_this.currentIndex == Item.index) { _this.CleanRotation(Item); _this._bFirstDisplay = true; // We need to set it 'true' to pass currentIndex checking _this.DisplayItem(Item.id); } if (_this.oTopSlider) _this.oTopSlider.UpdateThumbnail(Item.index); } } }, 100);} ); }, EditItem: function(e) { var oItem = this.Items[this.currentIndex]; if (!oItem || !oItem.id) return; var _this = this; var url = this.actionUrl + (this.actionUrl.indexOf('?') == -1 ? '?' : '&') + 'photo_list_action=edit&sessid=' + BX.bitrix_sessid(); url += '&ELEMENT_ID=' + oItem.id; url += '&SECTION_ID=' + oItem.album_id; url += '&AJAX_CALL=Y&UCID=' + this.uniqueId; if (oItem.gallery_id) url += '&USER_ALIAS=' + oItem.gallery_id; // Set z-index BX.WindowManager.setStartZIndex(3100); var oEditDialog = new BX.CDialog({ title : this.MESS.photoEditDialogTitle, content_url: url, buttons: [BX.CDialog.btnSave, BX.CDialog.btnCancel], width: 600 }); oEditDialog.Show(); this.bArrowControllEnabled = false; this.bEscCloseEnabled = false; BX.addCustomEvent(oEditDialog, "onWindowRegister", function(){ oEditDialog.adjustSizeEx(); BX.focus(BX('bxph_title')); var div = window.oPhotoEditDialog.Get(); if (div) div.style.zIndex = 3101; if (window.oPhotoEditDialog.OVERLAY) window.oPhotoEditDialog.OVERLAY.style.zIndex = 3097; }); BX.addCustomEvent(oEditDialog, "onWindowUnRegister", function(){ _this.bArrowControllEnabled = true; _this.bEscCloseEnabled = true; }); oEditDialog.ClearButtons(); oEditDialog.SetButtons([ new BX.CWindowButton( { title: BX.message('JS_CORE_WINDOW_SAVE'), id: 'savebtn', action: BX.proxy(this.CheckForm, this) }), oEditDialog.btnCancel ]); window.oPhotoEditDialog = oEditDialog; return BX.PreventDefault(e); }, CheckForm: function() { var _this = this; var form = document.forms['form_photo']; if (typeof form != "object") return false; var oData = {"AJAX_CALL" : "Y"}; for (var ii = 0; ii < form.elements.length; ii++) { if (form.elements[ii] && form.elements[ii].name) { if (form.elements[ii].type && form.elements[ii].type == "checkbox") { if (form.elements[ii].checked == true) oData[form.elements[ii].name] = form.elements[ii].value; } else { oData[form.elements[ii].name] = form.elements[ii].value; } } } BX.showWait('photo_window_edit'); window.oPhotoEditDialogError = false; BX.ajax.post( form.action, oData, function(data) { setTimeout(function(){ BX.closeWait('photo_window_edit'); result = {}; if (window.oPhotoEditDialogError !== false) { var errorTr = BX("bxph_error_row"); errorTr.style.display = ""; errorTr.cells[0].innerHTML = window.oPhotoEditDialogError; window.oPhotoEditDialog.adjustSizeEx(); } else { top.result = false; try { data = BX.util.trim(data); var res = '', indBegin = data.indexOf('<!--BX_PHOTO_EDIT_RES-->'), indEnd = data.indexOf('<!--BX_PHOTO_EDIT_RES_END-->'); if (indBegin != -1 && ~indEnd != -1) res = data.substr(indBegin + '<!--BX_PHOTO_EDIT_RES-->'.length, indEnd - indBegin - '<!--BX_PHOTO_EDIT_RES-->'.length); else res = data; eval("top.result = " + res + ";"); } catch(e) { var errorTr = BX("bxph_error_row"); if (errorTr) { errorTr.style.display = ""; errorTr.cells[0].innerHTML = _this.MESS.unknownError; } window.oPhotoEditDialog.adjustSizeEx(); } if (top.result) { _this.EditItemCallBack(top.result); window.oPhotoEditDialog.Close(); } } }, 200); } ); }, EditItemCallBack: function(res) { var oItem = this.Items[this.currentIndex]; oItem.tags = res.TAGS || ''; oItem.description = res._DESCRIPTION || ''; oItem.date = res.DATE_STR || res.DATE; oItem.tags_array = res.TAGS_LIST || []; //oItem['public'] = res.PUBLIC; //oItem.approved = res.APPROVED; // Photo was moved to other album - we have to kill it from slider if (res.SECTION_ID && parseInt(res.SECTION_ID) !== parseInt(oItem.album_id)) this.DropAndRecalc(oItem); else this.DisplayItemDetails(oItem); }, DeleteItem: function(e) { var oItem = this.Items[this.currentIndex]; if (!confirm(this.MESS.delItemConfirm)) return; window.bxph_error = null; var _this = this; BX.ajax.get( this.actionUrl, { UCID: this.uniqueId, photo_list_action: 'delete', sessid: BX.bitrix_sessid(), ELEMENT_ID : oItem.id, AJAX_CALL: 'Y' }, function(result){setTimeout(function() { _this.CheckActionPostUrl(); if (window.bxph_error) alert(window.bxph_error); else _this.DropAndRecalc(oItem); }, 100);} ); return BX.PreventDefault(e); }, ActivateItem: function(e) { var oItem = this.Items[this.currentIndex]; oItem.active = "Y"; this.DisplayItemDetails(oItem); window.bxph_error = null; var _this = this; BX.ajax.get( this.actionUrl, { UCID: this.uniqueId, photo_list_action: 'activate', sessid: BX.bitrix_sessid(), ELEMENT_ID : oItem.id }, function(result){setTimeout(function(){_this.CheckActionPostUrl();}, 100);} ); return BX.PreventDefault(e); }, DropAndRecalc: function(oItem) { if (this.itemsCount <= 1) { this.ClosePopup(); // Refresh page setTimeout(function(){window.location = window.location;}, 100); } // Go to previous item or to the next if this item was first if (oItem.index == 0) this.Next(); else if (this.itemsCount > 1) this.Previous(); // Del item from this.Items, ItemIndex and correct indexes in this.Items; var Items = []; var ItemIndex = {}; var index = 0; for(var i in this.Items) { if (this.Items[i].index != oItem.index) { index = this.Items[i].index; if (this.Items[i].index > oItem.index) index--; this.Items[i].index = index; Items[index] = this.Items[i]; ItemIndex[this.Items[i].id] = index; } } this.Items = Items; this.ItemIndex = ItemIndex; // decrese items count this.itemsCount--; if (this.itemsCount == 0) { this.ClosePopup(); // Refresh page setTimeout(function(){window.location = window.location;}, 100); } // Del from if (this.oTopSlider) this.oTopSlider.RecalcItems(); // Update items count in the top this.topPager.count.innerHTML = this.itemsCount; }, ChangeMode: function(mode, bSave) { if (mode != "auto" && mode != "fixed") mode = this.Mode == "auto" ? "fixed" : "auto"; // Flip mode // Change buttons and labels if (mode == "auto") { BX.addClass(this.pMinimizeBut, 'photo-minimize-screen-but'); this.pBigPhoto.innerHTML = this.MESS.smallPhoto; this.pBigPhoto.title = this.pMinimizeBut.title = this.MESS.smallPhoto; } else { BX.removeClass(this.pMinimizeBut, 'photo-minimize-screen-but'); this.pBigPhoto.innerHTML = this.MESS.bigPhoto; this.pBigPhoto.title = this.pMinimizeBut.title = this.MESS.bigPhoto; this.pPopupFooter.style.width = this.fixedSize + 'px'; } this.Mode = mode; this.CheckImageSize(); // Check current displayed image if (bSave !== false) this.SaveOption("view_mode", this.Mode); }, CheckFullModeDisplay: function(oItem) { if (!oItem) oItem = this.Items[this.currentIndex]; if (!oItem) return; if (oItem.width <= this.fixedSize && oItem.height <= this.windowInnerSize.innerHeight - 100) { this.pBigPhoto.style.display = "none"; BX.addClass(this.pMinimizeBut, 'photo-minimize-disabled'); this.pMinimizeBut.title = this.MESS.bigPhotoDisabled; } else { this.pBigPhoto.style.display = ""; BX.removeClass(this.pMinimizeBut, 'photo-minimize-disabled'); } }, CheckImageSize: function(oItem) { if (!oItem) oItem = this.Items[this.currentIndex]; if (!oItem) return; var maxW = this.windowInnerSize.innerWidth - 30; var maxH = this.windowInnerSize.innerHeight - 100; if (this.Mode == 'fixed' && this.fixedSize < maxW) maxW = this.fixedSize; var res = this.FitInto(oItem.width, oItem.height, maxW, maxH); if (res.w == oItem.width && res.h == oItem.height) { this.pImage.style.width = ""; this.pImage.style.height = ""; } else { this.pImage.style.width = res.w + "px"; this.pImage.style.height = res.h + "px"; } if (this.Mode == "auto") { this.pPopupFooter.style.width = this.fixedSize + 'px'; setTimeout(BX.proxy(this.AdjustControls, this), 1); } }, FitInto: function(w, h, maxW, maxH) { var r = w / h; if (w > maxW) { w = maxW; h = w / r; } if (h > maxH) { h = maxH; w = h * r; } if (w > maxW) { w = maxW; h = w / r; } if (!w || isNaN(w)) w = 0; if (!h || isNaN(h)) h = 0; return {w: Math.round(w), h: Math.round(h)}; }, SetTheme: function(theme, bSave) { if (theme !== 'dark' && theme !== 'light') this.theme = this.theme == 'dark' ? 'light' : 'dark'; // Flip theme else this.theme = theme; if (this.theme == 'dark') { if (this.pThemeLink) this.pThemeLink.innerHTML = '<i></i><span class="photo-dark-theme-link-text">' + this.MESS.LightBG + '</span>'; BX.addClass(this.pFixedOverlay, "photo-dark-theme"); } else { if (this.pThemeLink) this.pThemeLink.innerHTML = '<i></i><span class="photo-dark-theme-link-text">' + this.MESS.DarkBG + '</span>'; BX.removeClass(this.pFixedOverlay, "photo-dark-theme"); } // Append css for dark theme to LHE in blog's comments if (this.useComments && this.commentsType == 'blog') this.SetThemeCSSForLHE(); if (bSave !== false) this.SaveOption("theme", this.theme); }, SetThemeCSSForLHE: function() { var pLEditor = window.oBlogComLHE; if (!pLEditor) return setTimeout(BX.proxy(this.SetThemeCSSForLHE, this, 400)); var darkThemeLheCSS = "/*BXPH-CSS-START*/" + "body,body *{background-color: #464646!important; color: #FFFFFF;}\n" + "body blockquote.bx-quote {border: 1px solid #C0C0C0!important; background-color: #FFF4CA!important; color: #373737!important;}\n" + "/*BXPH-CSS-END*/"; var css = pLEditor.systemCSS.replace(/\/\*BXPH-CSS-START\*\/(\s|\S)*\/\*BXPH-CSS-END\*\//ig, ''); if (this.theme == 'dark') pLEditor.systemCSS = css + "\n" + darkThemeLheCSS; else pLEditor.systemCSS = css; pLEditor.SetEditorContent(pLEditor.GetContent()); }, ShowSource: function(e) { var oItem = this.Items[this.currentIndex], title = oItem.description || '', src = oItem.big_src || oItem.src, SrcWidth = screen.availWidth, SrcHeight = screen.availHeight, sizer = false; if (document.all) sizer = window.open("","","height=SrcHeight,width=SrcWidth,top=0,left=0,scrollbars=yes,fullscreen=yes"); else sizer = window.open('', src,'width=SrcWidth,height=SrcHeight,menubar=no,status=no,location=no,scrollbars=yes,fullscreen=yes,directories=no,resizable=yes'); sizer.document.write('<html><head>' + '<script>function SetBackGround(div){if (div)document.body.style.backgroundColor = div.style.backgroundColor;}</script>' + '<title>' + title + '</title>' + '<style>table div{width:18px; height:18px;}</style>' + '</head><body style="background-color:#000000;">' + '<table width="100%" height="96%" cellspacing="0" cellpadding="0" border="0">' + '<tr><td align="right">' + '<table cellspacing="2" cellpadding="0" border="0" align="center">' + '<tr><td><div onmouseover="SetBackGround(this);" style="width:18px; height:18px; background-color:#FFFFFF;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#E5E5E5;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#CCCCCC;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#B3B3B3;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#999999;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#808080;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#666666;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#4D4D4D;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#333333;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#1A1A1A;"></div></td></tr>' + '<tr><td><div onmouseover="SetBackGround(this);" style="background-color:#000000;"></div></td></tr>' + '</table>' + '</td>' + '<td align="center"><img border="0" title="' + this.MESS.clickToClose + '" style="cursor:pointer; cursor:hand;" onclick="window.close();" src="' + src + '"></td></tr>' + '</table></body></html>' ); return BX.PreventDefault(e); }, OnAfterCurrentItemsLoaded: function() { BX.closeWait('photo_load_items'); if (this.currentItem > 0 && this.ItemIndex[this.currentItem]) this.OpenPopup(this.currentItem); BX.removeCustomEvent(this, 'OnAfterItemsLoaded', BX.proxy(this.OnAfterCurrentItemsLoaded, this)); }, OnMoreItemsLoaded: function(items) { if (items) this.HandleItems(items); this.AttachThumbnailsEvents(); }, AttachThumbnailsEvents: function() { var _this = this, res = this.pElementsCont.getElementsByTagName('a'), ii, l = res.length; for (ii = 0; ii < l; ii++) if (res[ii].id && res[ii].id.match(/photo\_(\d+)/gi)) res[ii].onclick = function(e){_this.OpenPopup(parseInt(this.id.substr("photo_".length))); return BX.PreventDefault(e);}; }, OnItemShowed: function(oItem) { var bIncreaseCounter = oItem.bShowed ? 'N' : 'Y'; var bGetRaitings = this.useRatings ? 'Y' : 'N'; if (this.useRatings && typeof oItem.rating != 'undefined') { this.pRatingCont.innerHTML = oItem.rating; bGetRaitings = 'N'; } if (bGetRaitings == 'Y') this.pRatingCont.innerHTML = ''; if (bGetRaitings == 'Y' || !oItem.bShowed) { var _this = this; BX.ajax.get( this.responderUrl, { sessid: BX.bitrix_sessid(), ELEMENT_ID : oItem.id, AUTHOR_ID : oItem.author_id, sigh: this.sign, checkParams: this.checkParams, reqParams: this.reqParams, increaseCounter: bIncreaseCounter, getRaiting: bGetRaitings, UCID: this.uniqueId, AJAX_CALL: 'Y' }, function(result){ setTimeout(function() { //_this.CheckActionPostUrl(); if (bIncreaseCounter == 'Y') oItem.shows++; if (bGetRaitings == 'Y') { var res = '', indBegin = result.indexOf('<!--BX_PHOTO_RATING-->'), indEnd = result.indexOf('<!--BX_PHOTO_RATING_END-->'); if (indBegin !== -1 && indEnd !== -1) res = result.substr(indBegin + '<!--BX_PHOTO_RATING-->'.length, indEnd - indBegin - '<!--BX_PHOTO_RATING-->'.length); else res = result; _this.pRatingCont.innerHTML = res; // For like (rating_main) - we have to rerender ratings for each photo loading if (!_this.cacheRaitingReq) oItem.rating = res; } }, 100); } ); oItem.bShowed = true; } }, OnResize: function() { if (!BX.browser.IsDoctype() && BX.browser.IsIE()) { this.windowInnerSize = BX.GetWindowInnerSize(document); var d = (document.body.offsetHeight > this.windowInnerSize.innerHeight) ? 18 : 0; this.pFixedOverlay.style.width = (this.windowInnerSize.innerWidth + d)+ "px"; this.pFixedOverlay.style.height = this.windowInnerSize.innerHeight + "px"; } this.AdjustControls(); }, PreloadImages: function(LoadedItem) { if (this.reloadItemsOnload || !LoadedItem) return; if (!this.pPreloadImagesCont) { this.pPreloadImagesCont = document.body.appendChild(BX.create("DIV", {props: {className: "bxph-preload-cont"}})); this.arLoadedImg = {}; this.ImgQueue = {}; } this.PreloadPhoto(LoadedItem, 1); // One step next this.PreloadPhoto(LoadedItem, 2); // Two step next this.PreloadPhoto(LoadedItem, -1); // One step before this.PreloadPhoto(LoadedItem, -2); // One step before }, PreloadPhoto: function(Item, d) { if (typeof d == 'undefined') d = 1; var ind = (parseInt(Item.index) || 0) + d; if (this.Items && this.Items[ind]) { var src = this.Items[ind].big_src || this.Items[ind].src; if (!this.arLoadedImg[src]) { this.ImgQueue[src] = true; this.arLoadedImg[src] = true; if (this.ImageLoadingState != 'loading') this.PreloadAgent(); } } }, PreloadAgent: function(src) { var _this = this, src_i; if (src && this.ImgQueue[src]) { this.srcIndex[src] = true; this.ImageLoadingState = 'wait'; if (this.clearStateTimeout) { clearTimeout(this.clearStateTimeout); this.clearStateTimeout = null; } } var bLoaded = false; for (src_i in this.ImgQueue) { if (this.ImgQueue[src_i]) { bLoaded = true; var pImage = this.pPreloadImagesCont.appendChild(BX.create("IMG", {props: {src: src_i, title: src_i}})); this.ImageLoadingState = 'loading'; _this.ImgQueue[src_i] = null; delete _this.ImgQueue[src_i]; pImage.onerror = pImage.onload = function(){ _this.PreloadAgent(this.title);}; if (this.clearStateTimeout) { clearTimeout(this.clearStateTimeout); this.clearStateTimeout = null; } this.clearStateTimeout = setInterval(function() { _this.ImageLoadingState = 'wait'; _this.PreloadAgent(); }, 5000); break; } } if (!bLoaded) { this.ImageLoadingState = 'wait'; if (this.clearStateTimeout) { clearTimeout(this.clearStateTimeout); this.clearStateTimeout = null; } } }, CheckActionPostUrl: function() { if (!window['bxph_action_url_' + this.uniqueId] || this.actionPostUrl) return; if (top.oBXPhotoList && top.oBXPhotoList[this.uniqueId]) top.oBXPhotoList[this.uniqueId].actionPostUrl = window['bxph_action_url_' + this.uniqueId]; this.actionPostUrl = window['bxph_action_url_' + this.uniqueId]; } }; function BXTopSlider(pObj) { this.thumbSize = 40; this.thumbContSize = 48; this.pTopSliderBut = pObj.pTopSliderBut; this.pScrollCont = pObj.pScrollCont; this.pScroller = pObj.pScroller; this.pObj = pObj; this.pWnd = pObj.pSlider; this.pSliderCont = pObj.pSliderCont; this.itemsIndex = {}; this.itemsCount = pObj.itemsCount; this.startItemIndex = pObj.currentIndex; this.uniqueId = pObj.uniqueId; this.carretWidth = 22; this.pTopSliderBut.onclick = BX.proxy(this.Show, this); this.bOpened = false; this.Init(); } BXTopSlider.prototype = { Init: function() { this.extraSize = 30; // pixels this.currentIndex = this.startItemIndex; this.AdjustScroller(); this.BuildItems(); this.HandleItems(this.pObj.Items); this.pScroller.onmousedown = BX.proxy(this.StartMoveCarret, this); this.pWnd.onmousedown = BX.proxy(this.StartMoveSlider, this); this.pScrollCont.onmousedown = BX.proxy(this.ScrollerClick, this); if (this.pSliderCont.addEventListener) this.pSliderCont.addEventListener('DOMMouseScroll', BX.proxy(this.OnMouseWheel, this), false); BX.bind(this.pSliderCont, 'mousewheel', BX.proxy(this.OnMouseWheel, this)); if (this.pObj.userSettings.show_top_slider == 'Y') this.Show(true, false, true); }, StartMoveSlider: function(e) { if (this.bNotEnoughItems) return; this.ClearIntervals(); if(!e) e = window.event; this.bMoveSlider = true; this.bSliderMoved = false; this.pSliderContPos = BX.pos(this.pSliderCont); this.wndSize = BX.GetWindowScrollPos(); this.startX = e.clientX + this.wndSize.scrollLeft; this.startLeft = parseInt(this.pWnd.style.left) || 0; this.minLeft = this.pSliderContPos.width - this.pObj.itemsCount * this.thumbContSize; var _this = this; this.x0 = this.x1 = this.x2 = parseInt(this.pWnd.style.left) || 0; this.time0 = new Date().getTime(); this.zeroSpeedCount = 0; this.time = 10; if (!this.bOpened) this.Show(true); this.measureSpeedInt = setInterval(BX.proxy(this.MeasureSpeed, this), this.time); BX.bind(document, "mousemove", BX.proxy(this.MoveSlider, this)); BX.bind(document, "mouseup", BX.proxy(this.StopMoveSlider, this)); }, MeasureSpeed: function() { this.x1 = this.x2; this.x2 = parseInt(this.pWnd.style.left); var speed = (this.x2 - this.x1); if (speed == 0) this.zeroSpeedCount++; else this.zeroSpeedCount = 0; if (!this.bMoveSlider) { clearInterval(this.measureSpeedInt); this.time1 = new Date().getTime(); var avSpeed = ((this.x2 - this.x0) / (this.time1 - this.time0)); avSpeed = avSpeed * this.time * 1.2; this.t = 1; this.startV = avSpeed; this.v = avSpeed; var _this = this, a = 0.3, a = this.v > 0 ? -a : a; if (Math.abs(avSpeed) > 0 && this.zeroSpeedCount < 50) { this.stoppieInterval = setInterval(function() { var t = ++_this.t; var curSpeed = _this.v + a * t; var x = _this.secondX + _this.v * t + a * t * t / 2; x = Math.round(x * 10) / 10; if (_this.startV > 0 && curSpeed <= 0 || _this.startV < 0 && curSpeed >= 0) return clearInterval(_this.stoppieInterval); if (x > _this.extraSize) { x = _this.extraSize; t = 100; // Just stop } if (x < _this.minLeft - _this.extraSize) { x = _this.minLeft - _this.extraSize; t = 100; // Just stop } _this.pWnd.style.left = x + "px"; _this.CheckCurrentShownItems(); _this.AdjustCarret(x); if (t > 50) { _this.PullBack(); clearInterval(_this.stoppieInterval); } }, this.time); } } }, PullBack: function() { var x = parseInt(this.pWnd.style.left) || 0, time = this.time, dx = (x > 0) ? -1 : 1, _this = this, count = 1; if (this.bMoveSlider || x <= 0 && x >= this.minLeft) return; if (this.pullBackInterval) clearInterval( this.pullBackInterval); this.pullBackInterval = setInterval(function() { var left = parseInt(_this.pWnd.style.left); left += count * dx; if (dx > 0 && left > _this.minLeft) left = _this.minLeft; else if (dx < 0 && left < 0) left = 0; _this.pWnd.style.left = left + 'px'; if (left == _this.minLeft || left == 0) clearInterval( _this.pullBackInterval); count++; }, time); }, MoveSlider: function(e) { if (this.bNotEnoughItems) return; this.bSliderMoved = true; if (this.bMoveSlider) { if(!e) e = window.event; var x = parseInt(e.clientX) + parseInt(this.wndSize.scrollLeft); var offsetX = x - this.startX; var newLeft = this.startLeft + offsetX; if (newLeft > this.extraSize) newLeft = this.extraSize; if (newLeft < this.minLeft - this.extraSize) newLeft = this.minLeft - this.extraSize; if (!this.firstTime || !this.firstX) { this.firstTime = new Date().getTime(); this.firstX = newLeft; } else { this.firstTime = this.secondTime; this.secondTime = new Date().getTime(); this.firstX = this.secondX; this.secondX = newLeft; } this.pWnd.style.left = newLeft + "px"; this.AdjustCarret(newLeft); this.CheckCurrentShownItems(); } }, StopMoveSlider: function() { this.bMoveSlider = false; if (this.measureSpeedInt) this.MeasureSpeed(); BX.unbind(document, "mousemove", BX.proxy(this.MoveSlider, this)); BX.unbind(document, "mouseup", BX.proxy(this.StopMoveSlider, this)); this.PullBack(); }, StartMoveCarret: function() { if (!this.bOpened) this.Show(true); if (this.bNotEnoughItems) return; this.ClearIntervals(); this.bScroll = true; this.pScrollContPos = BX.pos(this.pScrollCont); this.wndSize = BX.GetWindowScrollPos(); BX.addClass(this.pScroller, "photo-scroll-wheel-active"); BX.bind(document, "mousemove", BX.proxy(this.MoveCarret, this)); BX.bind(document, "mouseup", BX.proxy(this.StopMoveCarret, this)); }, MoveCarret: function(e) { if (this.bScroll && !this.bNotEnoughItems) { if(!e) e = window.event; var dx = e.clientX + this.wndSize.scrollLeft - this.pScrollContPos.left; this.SetCarret(dx); } }, StopMoveCarret: function() { this.bScroll = false; BX.removeClass(this.pScroller, "photo-scroll-wheel-active"); BX.unbind(document, "mousemove", BX.proxy(this.MoveCarret, this)); BX.unbind(document, "mouseup", BX.proxy(this.StopMoveCarret, this)); }, AdjustScroller: function() { if (this.pObj.itemsCount > 0) { var sliderWidth = parseInt(this.pSliderCont.parentNode.offsetWidth); this.pSliderContPos = BX.pos(this.pSliderCont); this.scrollerWidth = parseInt(this.pScrollCont.offsetWidth); this.deltaWidth = this.pObj.itemsCount * this.thumbContSize - parseInt(this.pSliderCont.parentNode.offsetWidth); this.scrollRatio = this.deltaWidth / this.scrollerWidth; this.minLeft = sliderWidth - this.pObj.itemsCount * this.thumbContSize; this.bNotEnoughItems = this.pObj.itemsCount < sliderWidth / this.thumbContSize; this.pScrollContPos = BX.pos(this.pScrollCont); this.pWnd.style.width = this.bNotEnoughItems ? '100%' : ''; } }, ScrollerClick: function(e) { if (!this.bNotEnoughItems) { if(!e) e = window.event; this.StartMoveCarret(e); this.SetCarret(e.clientX + this.wndSize.scrollLeft - this.pScrollContPos.left); } }, SetCarret: function(x) { if (x < 0 || this.bNotEnoughItems) x = 0; // On each pixel moved carret we move slider on some _offset_ var offsetX; if (x >= this.pScrollContPos.width - this.carretWidth) { x = this.pScrollContPos.width - this.carretWidth; offsetX = Math.round(this.pScrollContPos.width * this.scrollRatio * 10) / 10; } else { offsetX = Math.round(x * this.scrollRatio * 10) / 10; } offsetX = -offsetX; this.AdjustCarret(offsetX); this.pWnd.style.left = offsetX + "px"; this.CheckCurrentShownItems(); }, AdjustCarret: function(left) { if (this.bNotEnoughItems) { this.pScroller.style.display = "none"; return; } else { this.pScroller.style.display = ""; } if (typeof left == 'undefined') left = parseInt(this.pWnd.style.left) || 0; if (left > 0) left = 0; if (left < this.minLeft) left = this.minLeft; var carretX = Math.abs(Math.round(10 * left / this.scrollRatio) / 10); if (carretX > this.pScrollContPos.width - this.carretWidth) carretX = this.pScrollContPos.width - this.carretWidth; this.pScroller.style.left = carretX + "px"; }, ClearIntervals: function() { if (this.pullBackInterval) clearInterval( this.pullBackInterval); if (this.measureSpeedInt) clearInterval(this.measureSpeedInt); if (this.stoppieInterval) clearInterval(this.stoppieInterval); }, HandleItems: function(Items) { for (i in Items) { Item = Items[i]; if (Item.id && this.itemsIndex[Item.index]) { if (typeof Item.thumb_src == 'undefined') { Item.thumb_src = Item.src; Item.thumb_height = Item.height; Item.thumb_width = Item.width; } if (Item.thumb_src && Item.thumb_src != undefined) { this.itemsIndex[Item.index].pImg.src = Item.thumb_src; BX.removeClass(this.itemsIndex[Item.index].pLink, 'photo-wait'); this.AdjustThumb(this.itemsIndex[Item.index].pImg, Item.thumb_width, Item.thumb_height); } } } }, RecalcItems: function() { if (this.itemsCount == this.pObj.itemsCount + 1) { this.itemsCount = this.pObj.itemsCount; this.pWnd.removeChild(this.itemsIndex[this.itemsCount].pLink); this.itemsIndex[this.itemsCount] = null; delete this.itemsIndex[this.itemsCount]; this.HandleItems(this.pObj.Items); } }, BuildItems: function() { var i, _this = this, pLink, pImg, pDiv; for (i = 0; i < this.pObj.itemsCount; i++) { pLink = this.pWnd.appendChild(BX.create("A", {props:{id: 'bxphoto_t_' + i, className: "photo-preview photo-wait", href: "javascript: void(0)"}})); pDiv = pLink.appendChild(BX.create("DIV", {props:{className: 'photo-preview-inner'}, style: {width: this.thumbSize + 'px', height: this.thumbSize + 'px'}})); pImg = pDiv.appendChild(BX.create("IMG", {props:{src: '/bitrix/images/1.gif'}, style: {width: this.thumbSize + 'px', height: this.thumbSize + 'px'}})); this.itemsIndex[i] = { pLink: pLink, pImg: pImg }; pLink.onclick = function() { if (!_this.bSliderMoved) _this.pObj.ShowItem(parseInt(this.id.substr('bxphoto_t_'.length)), false, false, true /*bAffectTopSlider*/); }; this.pObj.SetUnselectable(pLink, pLink.firstChild); } }, CleanItems: function() { for (i = 0; i < this.pObj.itemsCount; i++) BX.addClass(this.itemsIndex[i].pLink, 'photo-wait'); }, OnMouseWheel: function(event) { if (this.bNotEnoughItems) return BX.PreventDefault(event); if (!event) event = window.event; var wheelDelta = 0; if (event.wheelDelta) wheelDelta = event.wheelDelta / 120; else if (event.detail) wheelDelta = - event.detail / 3; var startLeft = parseInt(this.pWnd.style.left) || 0, newLeft = startLeft + wheelDelta * this.thumbContSize * 1; newLeft = Math.round(newLeft * 10) / 10; if (newLeft > this.extraSize) newLeft = this.extraSize; if (newLeft < this.minLeft - this.extraSize) newLeft = this.minLeft - this.extraSize; this.pWnd.style.left = newLeft + "px"; this.CheckCurrentShownItems(); this.AdjustCarret(newLeft); if (this.mouseWheelTimeout) clearTimeout(this.mouseWheelTimeout); this.mouseWheelTimeout = setTimeout(BX.proxy(this.PullBack, this), 100); return BX.PreventDefault(event); }, CheckCurrentShownItems: function() { if (this.pObj.reloadItemsOnload || !this.pObj.itemsPageSize) return; var left = parseInt(this.pWnd.style.left) || 0, startIndex = - Math.round(left / this.thumbContSize); if (startIndex < 1) startIndex = 1; if(!this.pSliderContPos) this.pSliderContPos = BX.pos(this.pSliderCont); var endIndex = Math.round(startIndex + this.pSliderContPos.width / this.thumbContSize); if (endIndex > this.pObj.itemsCount) endIndex = this.pObj.itemsCount; var page, pageStart = Math.ceil(startIndex / this.pObj.itemsPageSize), pageEnd = Math.ceil(endIndex / this.pObj.itemsPageSize); for (page = pageStart; page <= pageEnd; page++) this.pObj.LoadPage(page); }, Show: function(bShow, bSave, bFast) { if (bShow !== true && bShow !== false) bShow = !this.bOpened; bFast = bFast === true; if (BX.browser.IsIE() && !BX.browser.IsIE9()) bFast = true; if (bShow) { if (bFast) { this.pSliderCont.style.display = "block"; this.pObj.pPopupTop.style.marginBottom = this.thumbContSize + 'px'; } BX.addClass(this.pTopSliderBut, "photo-slider-button-active"); this.AdjustScroller(); } else // Hide { if (bFast) this.pObj.pPopupTop.style.marginBottom = ''; this.pSliderCont.style.display = "none"; BX.removeClass(this.pTopSliderBut, "photo-slider-button-active"); } this.bOpened = bShow; if (!bFast) { if (this.showInt) clearInterval(this.showInt); var _this = this, dx = 5, count = 1, marg = parseInt(this.pObj.pPopupTop.style.marginBottom) || 0, bFinish = false; this.showInt = setInterval( function(){ if (bShow) { marg += dx * count; if (marg >= _this.thumbContSize) { marg = _this.thumbContSize; bFinish = true; } } else { marg -= dx * count; if (marg <= 0) { marg = 0; bFinish = true; } } _this.pObj.pPopupTop.style.marginBottom = marg + 'px'; if (bFinish) { if (bShow) _this.pSliderCont.style.display = "block"; clearInterval(_this.showInt); } count++; }, 40 ); } if (bSave !== false) this.pObj.SaveOption("show_top_slider", this.bOpened ? "Y" : "N"); this.CheckCurrentShownItems(); }, // Highlight the item in the top slider and scroll the slider if index off the boundaries SelectItem: function(Item) { if (!this.itemsIndex[Item.index]) return; var left = 0; this.AdjustScroller(); if (this.bNotEnoughItems) { this.pWnd.style.left = "0px"; } else { left = parseInt(this.pWnd.style.left) || 0; var startIndex = - Math.round(left / this.thumbContSize), endIndex = Math.round(startIndex + this.pSliderContPos.width / this.thumbContSize) - 1; if (Item.index < startIndex || Item.index > endIndex) { if (Item.index < startIndex) left = - parseInt(Item.index) * this.thumbContSize; else left = this.pSliderContPos.width - (parseInt(Item.index) + 1) * this.thumbContSize; if (left > 0) left = 0; if (left < this.minLeft) left = this.minLeft; this.pWnd.style.left = left + "px"; } } this.AdjustCarret(left); if (typeof this.selectedIndex != 'undefined' && this.itemsIndex[this.selectedIndex].pLink) BX.removeClass(this.itemsIndex[this.selectedIndex].pLink, "photo-preview-selected"); BX.addClass(this.itemsIndex[Item.index].pLink, "photo-preview-selected"); this.selectedIndex = Item.index; //setTimeout(BX.proxy(this.CheckCurrentShownItems, this), 1000); }, UpdateThumbnail: function(index) { var Item = this.itemsIndex[index]; if (Item) { var oItem = this.pObj.Items[index]; if (typeof oItem.thumb_src == 'undefined') { oItem.thumb_src = oItem.src; oItem.thumb_height = oItem.height; oItem.thumb_width = oItem.width; } if (oItem.thumb_src && oItem.thumb_src != undefined) { Item.pImg.src = oItem.thumb_src; this.AdjustThumb(Item.pImg, oItem.thumb_width, oItem.thumb_height); } BX.removeClass(Item.pLink, 'photo-wait'); } }, AdjustThumb: function(img, w, h) { if (!w || !h) return; var r = w / h; if (r > 1) { img.style.height = this.thumbSize + "px"; img.style.width = Math.round(this.thumbSize * r /* width*/) + "px"; img.style.left = Math.round((this.thumbSize - this.thumbSize * r /* width*/) / 2) + "px"; img.style.top = 0; } else { img.style.width = this.thumbSize + "px"; img.style.height = Math.round(this.thumbSize / r /*height*/) + "px"; img.style.top = Math.round((this.thumbSize - this.thumbSize / r /* height*/) / 2) + "px"; img.style.left = 0; } } }; // Controll which used to display thumbs, open popups, sort thumbs window.BXPhotoList = function(Params) { this.actionUrl = Params.actionUrl; this.navName = Params.navName; this.currentPage = parseInt(Params.currentPage); this.pageCount = parseInt(Params.pageCount); this.uniqueId = Params.uniqueId; if (Params.morePhotoNav == "Y") { this.pMorePhotosLink = BX('photo-more-photo-link-' + this.uniqueId); this.pMorePhotosCont = BX('photo-more-photo-link-cont-' + this.uniqueId); this.pMorePhotosLink.onclick = BX.proxy(this.LoadMorePhotos, this); } this.pElementsCont = Params.pElementsCont; this.initDragSorting = Params.initDragSorting == 'Y'; this.canModerate = !!Params.canModerate; this.maxDelta = 10; this.thumbSize = parseInt(Params.thumbSize); this.thumbHeight = this.thumbWidth = this.thumbSize + 8; // thumb size + margin to setermine correct position and size this.oItems = []; this.oItemIndex = {}; this.HandleItems(Params.items); this.pContPos = BX.pos(this.pElementsCont); var w = this.pElementsCont.parentNode.offsetWidth; if (!w || w < 0) w = this.pContPos.width; if (!this.matrixX) this.matrixX = Math.floor(w / this.thumbWidth); if (this.initDragSorting) this.InitSort(); }; window.BXPhotoList.prototype = { HandleItems: function(items) { for (var i in items) { items[i].index = parseInt(items[i].index); this.oItems[items[i].index] = items[i]; this.oItemIndex[items[i].id] = items[i].index; } if (items[i].active != "Y" && this.canModerate) { } }, LoadMorePhotos: function() { var params = { UCID: this.uniqueId, sessid: BX.bitrix_sessid(), return_array : 'Y', get_elements_html: 'Y' }; params[this.navName] = ++this.currentPage; if (this.currentPage >= this.pageCount) this.pMorePhotosCont.style.display = "none"; BX.addClass(this.pMorePhotosCont, "photo-show-more-wait"); var _this = this; window.bxphres = false; BX.ajax.get(this.actionUrl, params, function(result) { setTimeout(function(){ _this.CheckActionPostUrl(); _this.HandleItems(window.bxphres.items); BX.removeClass(_this.pMorePhotosCont, "photo-show-more-wait"); _this.pElementsCont.innerHTML += window.bxphres.elementsHTML; _this.currentPage = parseInt(window.bxphres.currentPage); if (_this.initDragSorting) _this.InitSort(); BX.onCustomEvent(window, 'onMoreItemsLoaded', [window.bxphres.items]); }, 100); }); return false; }, ShowLoadPhotoWait: function(bShow) { //this.pComWaiter.style.display = bShow ? "" : "none"; }, InitSort: function() { var _this = this, ii, id, ind = 0, res = this.pElementsCont.getElementsByTagName('a'); // TODO: handle window.onresize this.pElementsCont.style.width = ((this.thumbWidth * this.matrixX) + 8) + "px"; this.Items = []; this.ItemsIndex = {}; this.sortMatrix = {}; this.curItemsCount = 0; this.time = 30; this.maxSortValue = 0; this.sortFieldStep = 5; for (ii = 0; ii < res.length; ii++) { if (!res[ii].id || !res[ii].id.match(/photo\_(\d+)/gi) || !this.oItems[ind]) continue; id = parseInt(res[ii].id.substr("photo_".length)); res[ii].onmousedown = function(e){_this.StartDragItem(e, parseInt(this.id.substr("photo_".length)));return false;}; this.Items[ind] = { id: id, pWnd: res[ii].parentNode, sort: ind, origSort: ind, curSortField: parseInt(this.oItems[ind].sort), sortField: (ind + 1) * this.sortFieldStep }; this.ItemsIndex[id] = ind; this.sortMatrix[id] = ind; this.curItemsCount++; ind++; if (this.maxSortValue < parseInt(this.oItems[ii].sort)) this.maxSortValue = parseInt(this.oItems[ii].sort); } }, StartDragItem: function(e, id) { if (!e) e = window.event; this.bSorting = true; this.wndSize = BX.GetWindowScrollPos(); this.startX = e.clientX; this.startY = e.clientY; this.movedItemId = id; this.movedItem = this.GetItemById(id); this.movedItem.curSortIndex = false; this.pItemPos = BX.pos(this.movedItem.pWnd); var x = e.clientX + this.wndSize.scrollLeft - this.pContPos.left; var y = e.clientY + this.wndSize.scrollTop - this.pContPos.top; var absX = e.clientX + this.wndSize.scrollLeft; var absY = e.clientY + this.wndSize.scrollTop; this.deltaMovedX = absX - this.pItemPos.left; this.deltaMovedY = absY - this.pItemPos.top; BX.bind(document, "mousemove", BX.proxy(this.DragItem, this)); BX.bind(document, "mouseup", BX.proxy(this.StopDragItem, this)); if (this.SaveOrderTimeout) clearTimeout(this.SaveOrderTimeout); }, DragItem: function(e) { if (this.bSorting) { if(!e) e = window.event; if (!this.bDragItem && (Math.abs(e.clientX - this.startX) > this.maxDelta || Math.abs(e.clientY - this.startY) > this.maxDelta)) { this.bDragItem = true; this.bWasJustDragged = true; this.movedItem.oldParrent = this.movedItem.pWnd.parentNode; BX.addClass(this.movedItem.pWnd, 'photo-item-cont-drag'); document.body.appendChild(this.movedItem.pWnd); } if (this.bDragItem) { var absX = e.clientX + this.wndSize.scrollLeft; var absY = e.clientY + this.wndSize.scrollTop; var x = absX - this.pContPos.left; var y = absY - this.pContPos.top; // Move abs posed photo with cursor this.movedItem.pWnd.style.left = (absX - this.deltaMovedX) + 'px'; this.movedItem.pWnd.style.top = (absY - this.deltaMovedY) + 'px'; // Calculate new index corresponding to photo-matrix var indexX = Math.ceil(x / this.thumbWidth); var indexY = Math.ceil(y / this.thumbHeight); if (indexX < 0) indexX = 0; if (indexY < 0) indexY = 0; var newIndex = (indexY - 1) * this.matrixX + indexX - 1; if (newIndex > this.curItemsCount - 1) newIndex = this.curItemsCount - 1; //document.title = newIndex; this.PutItemToNewPlace(this.movedItemId, newIndex); } return BX.PreventDefault(e); } }, StopDragItem: function(e) { if (this.bDragItem) { if (!e) e = window.event; BX.removeClass(this.movedItem.pWnd, 'photo-item-cont-drag'); var i, l = this.pElementsCont.childNodes.length, index = 0, el; if (this.pNewEmptyPlace.parentNode) this.pNewEmptyPlace.parentNode.removeChild(this.pNewEmptyPlace); if (this.pNewEmptyPlace2.parentNode) this.pNewEmptyPlace2.parentNode.removeChild(this.pNewEmptyPlace2); for (i = 0; i < l; i++) { el = this.pElementsCont.childNodes[i]; if (!BX.hasClass(el, 'photo-item-cont')) continue; if(this.movedItem.curSortIndex == this.curItemsCount - 1 && index == this.movedItem.curSortIndex - 1) { // Last item this.pElementsCont.appendChild(this.movedItem.pWnd); break; } if (index == this.movedItem.curSortIndex) { // All items except last this.pElementsCont.insertBefore(this.movedItem.pWnd, el); break; } index++; } this.SaveSortingOrder(); } this.bSorting = false; this.bDragItem = false; BX.unbind(document, "mousemove", BX.proxy(this.DragItem, this)); BX.unbind(document, "mouseup", BX.proxy(this.StopDragItem, this)); _this = this; setTimeout(function(){_this.bWasJustDragged = false;}, 100); if (Math.abs(e.clientX - this.startX) > this.maxDelta || Math.abs(e.clientY - this.startY) > this.maxDelta) return BX.PreventDefault(e); }, SaveSortingOrder: function() { if (this.SaveOrderTimeout) clearTimeout(this.SaveOrderTimeout); BX.closeWait('photo_save_sort_items'); BX.showWait('photo_save_sort_items'); this.SaveOrderTimeout = setTimeout(BX.proxy(this.SaveSortingOrderNow, this), 2000); }, SaveSortingOrderNow: function() { var i, l = this.pElementsCont.childNodes.length, el, ind = 0, id, Item; var params = { UCID: this.uniqueId, sessid: BX.bitrix_sessid(), photo_list_action: 'save_sort_order', pio: {} }; for (i = 0; i < l; i++) { el = this.pElementsCont.childNodes[i]; if (el.id && el.id.match(/photo_cont_(\d+)/gi)) { id = parseInt(el.id.substr("photo_cont_".length)); Item = this.GetItemById(id); Item.sortField = (ind + 1) * this.sortFieldStep; if (Item.curSortField != Item.sortField) params.pio[id] = Item.sortField; Item.curSortField = Item.sortField; ind++; } } BX.ajax.get(this.actionUrl, params, function(result){BX.closeWait('photo_save_sort_items');}); }, PutItemToNewPlace: function(id, newIndex) { var oItem = this.GetItemById(id); if (oItem.curSortIndex === newIndex) return; oItem.curSortIndex = newIndex; var i, l = this.pElementsCont.childNodes.length, index = 0, el; for (i = 0; i < l; i++) { el = this.pElementsCont.childNodes[i]; if (!BX.hasClass(el, 'photo-item-cont')) continue; if(newIndex == this.curItemsCount - 1 && index == newIndex - 1) { // Last item this.pElementsCont.appendChild(this.ShowNewEmptyPlace()); break; } if (index == newIndex) { // All items except last this.pElementsCont.insertBefore(this.ShowNewEmptyPlace(), el); break; } index++; } }, GetItemById:function(id) { if (typeof this.ItemsIndex[id] != 'undefined' && this.Items[this.ItemsIndex[id]]) return this.Items[this.ItemsIndex[id]]; return false; }, ShowNewEmptyPlace: function() { this.bFirstEmptyPlace = !this.bFirstEmptyPlace; if (!this.pNewEmptyPlace) this.pNewEmptyPlace = BX.create("DIV", {props: {className: "photo-new-empty-place"}, style: {width: '0px', height: this.thumbHeight + 'px'}}); if (!this.pNewEmptyPlace2) this.pNewEmptyPlace2 = BX.create("DIV", {props: {className: "photo-new-empty-place svd"}, style: {width: '0px', height: this.thumbHeight + 'px'}}); if (this.showNewEmpty) clearInterval(this.showNewEmpty); if (this.hideNewEmpty) clearInterval(this.hideNewEmpty); var risingCont = this.bFirstEmptyPlace ? this.pNewEmptyPlace : this.pNewEmptyPlace2, fadingCont = this.bFirstEmptyPlace ? this.pNewEmptyPlace2 : this.pNewEmptyPlace, dx = Math.round(this.thumbWidth * 10 / 5) / 10, count = 0, _this = this, maxW = this.thumbWidth, bClear = false; bClear1 = false; w = 0, w1 = fadingCont.parentNode ? (parseInt(fadingCont.style.width) || parseInt(fadingCont.offsetWidth)) : 0; if (!fadingCont.parentNode) { risingCont.style.width = maxW + 'px'; bClear = bClear1 = true; } this.showNewEmpty = setInterval(function() { if (!bClear) { w += 1 * dx; if (w >= maxW) { w = maxW; bClear = true; } risingCont.style.width = w + 'px'; } if (!bClear1) { w1 -= 1 * dx; if (w1 <= 0 ) { w1 = 0; if (fadingCont.parentNode) fadingCont.parentNode.removeChild(fadingCont); bClear1 = true; } fadingCont.style.width = w1 + 'px'; } if (bClear && bClear1) clearInterval(_this.showNewEmpty); count++; }, this.time); return risingCont; }, DeleteItem: function(e) { // return BX.PreventDefault(e); }, ActivateItem: function(e) { // return BX.PreventDefault(e); }, CheckActionPostUrl: function() { if (!window['bxph_action_url_' + this.uniqueId] || this.actionPostUrl) return; if (top.oBXPhotoSlider && top.oBXPhotoSlider[this.uniqueId]) top.oBXPhotoSlider[this.uniqueId].actionPostUrl = window['bxph_action_url_' + this.uniqueId]; this.actionPostUrl = window['bxph_action_url_' + this.uniqueId]; } }; })(window);