/** * Yobi, Project Hosting SW * * Copyright 2013 NAVER Corp. * http://yobi.io * * @author Yi EungJun * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Render pagination in the given target HTML element. // Usage: Pagiation.updatePagination(target, totalPages); // For more details, see docs/technical/pagination.md yobi.Pagination = (function(window, document) { var htRegEx = {}; var rxDigit = /^.[0-9]*$/; // $.isNumeric determines hex, point or negative numbers as numeric. // but, rxDigit finds only positive decimal integer numbers /** * getQuery * @param {String} url */ function getQuery(url){ var parser = document.createElement('a'); parser.href = url.replace('&', '&'); return parser.search; } /** * valueFromQuery * @param {String} key * @param {String} query */ function valueFromQuery(key, query) { htRegEx[key] = htRegEx[key] || new RegExp('(^|&|\\?)' + key + '=([^&]+)'); var result = htRegEx[key].exec(query); return (result) ? result[2]: null; } /** * urlWithQuery * @param {String} url * @param {String} query */ function urlWithQuery(url, query) { var parser = document.createElement('a'); parser.href = url; parser.search = (query[0]=='?') ? query : '?' + query; return parser.href; } /** * urlWithPageNum * * Create a url whose query has a paramNameForPage parameter whose value is * pageNum. * * @param {String} url * @param {Number} pageNum * @param {String} paramNameForPage */ function urlWithPageNum(url, pageNum, paramNameForPage) { var query = getQuery(url); var regex = new RegExp('(^|&|\\?)' + paramNameForPage + '=[^&]+'); var result = regex.exec(query); if (result) { // if paramNameForPage parameter already exists, update it. query = query.replace(regex, result[1] + paramNameForPage + '=' + pageNum); } else { // if not add new one. query = query + '&' + paramNameForPage + '=' + pageNum; } return urlWithQuery(url, query); } /** * validateOptions */ function validateOptions(options) { if (!$.isNumeric(options.current)) { throw new Error("options.current is not valid: " + options.current); } } /** * Update pagination * * @param {HTMLElement} elTarget * @param {Number} nTotalPages * @param {Hash Table} htOpt */ function updatePagination(elTarget, nTotalPages, htOptions) { if (nTotalPages <= 0){ return; } var welTarget = $(elTarget); var htData = htOptions || {}; htData.url = htData.url || document.URL; htData.firstPage = htData.firstPage || 1; htData.totalPages = nTotalPages; htData.paramNameForPage = htData.paramNameForPage || 'pageNum'; htData.current = !rxDigit.test(htData.current) ? _getPageNumFromUrl(htData) : htData.current; htData.hasPrev = (typeof htData.hasPrev === "undefined") ? htData.current > htData.firstPage : htData.hasPrev; htData.hasNext = (typeof htData.hasNext === "undefined") ? htData.current < htData.totalPages : htData.hasNext; validateOptions(htData); welTarget.html(''); welTarget.addClass('page-navigation-wrap'); // prev/next link var welPagePrev = _getPrevPageLink(htData); var welPageNext = _getNextPageLink(htData); // page input box var welPageInput = _getPageInputBox(htData); var welPageInputWrap = $('
  • ').append(welPageInput); var welDelimiter = $('
  • ').text('/'); var welTotalPages = $('
  • ').text(nTotalPages); // fill #pagination var welPageList = $('