/* * Solo - A small and beautiful blogging system written in Java. * Copyright (c) 2010-2019, b3log.org & hacpai.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /** * @fileoverview timeline js. * * @author Liyuan Li * @version 1.0.1.2, Jun 6, 2013 */ var timeline = { _COLHA: 0, _COLHB: 20, _initArticleList: function() { var $articles = $(".articles"); if ($articles.length === 0 || $(".articles > .fn-clear").length > 0) { return; } $(window).resize(function() { if ($("#hideTop").css("top") === "auto") { var colH = [timeline._COLHA, timeline._COLHB]; $articles.find("article").each(function() { var $it = $(this), isLeft = colH[1] > colH[0], top = isLeft ? colH[0] : colH[1]; if (parseInt($it.css("top")) !== top || top === 0) { $it.css({ "top": top + "px", "position": "absolute" }); if (isLeft) { this.className = "l"; } else { this.className = "r"; } } colH[(isLeft ? '0' : '1')] += parseInt($it.outerHeight(true)); }); $articles.height(colH[0] > colH[1] ? colH[0] : colH[1]); } else { $articles.find("article").each(function() { $(this).css({ "position": "inherit", "top": "auto" }).removeClass("r l"); }); $articles.css("height", "auto"); } }); $(window).resize(); $(".module img").imagesLoaded(function() { $(window).resize(); }); }, _initIndexList: function() { var $archives = $(".articles > .fn-clear"); if ($archives.length === 0) { return; } // 如果为 index 页面,重构 archives 结构,使其可收缩 var year = 0; $(".nav-abs li").each(function(i) { var $this = $(this); $this.hide(); if (year !== $this.data("year")) { year = $this.data("year"); $this.before("
  • " + year + "
  • "); } }); // 首次加载时,当没有下一页时,使用 js 隐藏"更多"按钮 if ($(".article-more").parent().data("count") <= $(".article-more").parent().find("article").length) { $(".article-more").remove(); } $(window).resize(function() { $archives.each(function() { if ($("#hideTop").css("top") === "auto") { var colH = [timeline._COLHA + 60, timeline._COLHB * 4]; var $articles = $(this).find("article"); if ($articles.length === 0) { $(this).find("h2").remove(); $(this).css("margin-bottom", 0); } else { $articles.each(function() { var $it = $(this), isLeft = colH[1] > colH[0], top = isLeft ? colH[0] : colH[1]; if (parseInt($it.css("top")) !== top || top === 0) { $it.css({ "top": top + "px", "position": "absolute" }); if (isLeft) { this.className = "l"; } else { this.className = "r"; } } colH[(isLeft ? '0' : '1')] += parseInt($it.outerHeight(true)); }); $(this).height(colH[0] > colH[1] ? colH[0] : colH[1]); } } else { var $articles = $(this).find("article"); if ($articles.length === 0) { $(this).find("h2").remove(); $(this).css("margin-bottom", 0); } else { $articles.each(function() { $(this).css({ "position": "inherit", "top": "auto" }).removeClass("r l"); }); $(this).css("height", "auto"); } } }); }); $(window).resize(); $(".module img").imagesLoaded(function() { $(window).resize(); }); }, _setNavCurrent: function() { $(".header li a").each(function() { if ($(this).prop("href") === location.href.split("#")[0]) { this.className = "current"; } else { this.className = ""; } }) }, init: function() { $(window).scroll(function() { if ($(window).scrollTop() > 60) { $(".ico-top").show(); } else { $(".ico-top").hide(); } }); timeline._initIndexList(); timeline._initArticleList(); timeline._setNavCurrent(); // init header list $(".ico-list").click(function() { if ($(".header > .container > form").css("height") === "0px") { $(".header > .container > ul, .header > .container > form").css({ "height": "auto" }); } else { $(".header > .container > ul, .header > .container > form").animate({ "height": "0px" }); } }); }, translate: function() { window.open("http://translate.google.com/translate?sl=auto&tl=auto&u=" + location.href); }, getArchive: function(year, month, monthName) { var archiveDate = year + month, archive = year + "/" + month; window.location.hash = "#" + archiveDate; if ($("#" + archiveDate + " > article").length === 0) { var archiveDataTitle = year + " " + Label.yearLabel + " " + month + " " + Label.monthLabel; if (Label.localeString.substring(0, 2) === "en") { archiveDataTitle = monthName + " " + year; } var archiveHTML = '

    ' + archiveDataTitle + '

    ' + '
    ' + Label.moreLabel + '
    '; $("#" + archiveDate).html(archiveHTML).css("margin-bottom", "50px"); timeline.getNextPage($("#" + archiveDate).find(".article-more")[0], archive); } }, getNextPage: function(it, archive) { var $more = $(it), currentPage = $more.data("page") + 1, path = "/articles/"; if ($("#tag").length === 1) { var pathnames = location.pathname.split("/"); path = "/articles/tags/" + pathnames[pathnames.length - 1] + "/"; } else if ($("#author").length === 1) { var pathnames = location.pathname.split("/"); path = "/articles/authors/" + pathnames[pathnames.length - 1] + "/"; } else if (archive) { path = "/articles/archives/" + archive + "/"; } $.ajax({ url: latkeConfig.servePath + path + '?p=' + currentPage, type: "GET", beforeSend: function() { $more.css("background", "url(" + latkeConfig.staticServePath + "/skins/timeline/images/ajax-loader.gif) no-repeat scroll center center #60829F").text(""); }, success: function(result, textStatus) { if (!result.sc) { $more.css("background", "none #60829F").text("Error"); return; } if (result.rslts.articles.length === 0) { $more.remove(); return; } var articlesHTML = "", pagination = result.rslts.pagination; // append articles for (var i = 0; i < result.rslts.articles.length; i++) { var article = result.rslts.articles[i]; articlesHTML += '
    ' + '

    ' + article.articleTitle + ''; if (article.hasUpdated) { articlesHTML += '' + Label.updatedLabel + ''; } if (article.articlePutTop) { articlesHTML += '' + Label.topArticleLabel + ''; } articlesHTML += '

    ' + article.articleAbstract + '

    ' + ''; var articleTags = article.articleTags.split(","); for (var j = 0; j < articleTags.length; j++) { articlesHTML += '' + articleTags[j] + ''; if (j < articleTags.length - 1) { articlesHTML += ","; } } articlesHTML += ' ' + ' ' + (article.articleCommentCount === 0 ? Label.noCommentLabel : article.articleCommentCount) + ' ' + '' + article.articleViewCount + '
    '; } $more.before(articlesHTML).data("page", currentPage); // 最后一页处理 if (pagination.paginationPageCount <= currentPage) { $more.remove(); } else { $more.css("background", "none #60829F").text(Label.moreLabel); } $(window).resize(); $(".module img").imagesLoaded(function() { $(window).resize(); }); } }); }, toggleArchives: function(it, year) { $(".nav-abs li").each(function(i) { var $it = $(this); if (!$it.hasClass("year")) { $it.hide(); if (year === $it.data("year") && $(it).hasClass("close")) { $it.show(); } } }); $(".nav-abs li.year").each(function() { if (parseInt($(this).text()) === year) { if ($(it).hasClass("close")) { it.className = "year open"; } else { it.className = "year close"; } } else { this.className = "year close"; } }); } }; /*! * jQuery imagesLoaded plugin v2.1.1 * http://github.com/desandro/imagesloaded * * MIT License. by Paul Irish et al. */ /*jshint curly: true, eqeqeq: true, noempty: true, strict: true, undef: true, browser: true */ /*global jQuery: false */ ; (function($, undefined) { 'use strict'; // blank image data-uri bypasses webkit log warning (thx doug jones) var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=='; $.fn.imagesLoaded = function(callback) { var $this = this, deferred = $.isFunction($.Deferred) ? $.Deferred() : 0, hasNotify = $.isFunction(deferred.notify), $images = $this.find('img').add($this.filter('img')), loaded = [], proper = [], broken = []; // Register deferred callbacks if ($.isPlainObject(callback)) { $.each(callback, function(key, value) { if (key === 'callback') { callback = value; } else if (deferred) { deferred[key](value); } }); } function doneLoading() { var $proper = $(proper), $broken = $(broken); if (deferred) { if (broken.length) { deferred.reject($images, $proper, $broken); } else { deferred.resolve($images); } } if ($.isFunction(callback)) { callback.call($this, $images, $proper, $broken); } } function imgLoadedHandler(event) { imgLoaded(event.target, event.type === 'error'); } function imgLoaded(img, isBroken) { // don't proceed if BLANK image, or image is already loaded if (img.src === BLANK || $.inArray(img, loaded) !== -1) { return; } // store element in loaded images array loaded.push(img); // keep track of broken and properly loaded images if (isBroken) { broken.push(img); } else { proper.push(img); } // cache image and its state for future calls $.data(img, 'imagesLoaded', { isBroken: isBroken, src: img.src }); // trigger deferred progress method if present if (hasNotify) { deferred.notifyWith($(img), [isBroken, $images, $(proper), $(broken)]); } // call doneLoading and clean listeners if all images are loaded if ($images.length === loaded.length) { setTimeout(doneLoading); $images.unbind('.imagesLoaded', imgLoadedHandler); } } // if no images, trigger immediately if (!$images.length) { doneLoading(); } else { $images.bind('load.imagesLoaded error.imagesLoaded', imgLoadedHandler) .each(function(i, el) { var src = el.src; // find out if this image has been already checked for status // if it was, and src has not changed, call imgLoaded on it var cached = $.data(el, 'imagesLoaded'); if (cached && cached.src === src) { imgLoaded(el, cached.isBroken); return; } // if complete is true and browser supports natural sizes, try // to check for image status manually if (el.complete && el.naturalWidth !== undefined) { imgLoaded(el, el.naturalWidth === 0 || el.naturalHeight === 0); return; } // cached images don't fire load sometimes, so we reset src, but only when // dealing with IE, or image is complete (loaded) and failed manual check // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f if (el.readyState || el.complete) { el.src = BLANK; el.src = src; } }); } return deferred ? deferred.promise($this) : $this; }; })(jQuery); (function() { Util.init(); Util.replaceSideEm($(".comments .content-reset")); Util.buildTags("tagsSide"); timeline.init(); })();