/** * * 2014-2022 Presta-Mod.pl Rafał Zontek * * NOTICE OF LICENSE * * Poniższy kod jest kodem płatnym, rozpowszechanie bez pisemnej zgody autora zabronione * Moduł można zakupić na stronie Presta-Mod.pl. Modyfikacja kodu jest zabroniona, * wszelkie modyfikacje powodują utratę gwarancji * * http://presta-mod.pl * * DISCLAIMER * * * @author Presta-Mod.pl Rafał Zontek * @copyright 2014-2022 Presta-Mod.pl * @license Licecnja na jedną domenę * Presta-Mod.pl Rafał Zontek * */ if (typeof pm_inpostpaczkomaty_token == 'undefined') { pm_inpostpaczkomaty_token = prestakey; } if (typeof current_cart == 'undefined') { current_cart = prestakey; }; (function($) { opera = (navigator.userAgent.match(/Opera|OPR\//) ? true : false); msie = (navigator.userAgent.match(/MSIE\//) ? true : false); $.fn.extend({ paczkomaty: function(urlOrData, options) { var isUrl = typeof urlOrData == "string"; options = $.extend({}, $.Paczkomator.defaults, { url: isUrl ? urlOrData : null, data: isUrl ? null : urlOrData, delay: isUrl ? $.Paczkomator.defaults.delay : 10, max: options && !options.scroll ? 10 : 150 }, options); options.url = pm_inpostpaczkomaty_gcup; options.highlight = options.highlight || function(value) { return value; }; options.formatMatch = options.formatMatch || options.formatItem; return this.each(function() { new $.Paczkomator(this, options); }); }, result: function(handler) { return this.bind("result", handler); }, search: function(handler) { return this.trigger("search", [handler]); }, flushCache: function() { return this.trigger("flushCache"); }, setOptions: function(options) { return this.trigger("setOptions", [options]); }, unpaczkomaty: function() { return this.trigger("unpaczkomaty"); }, getPaczkomatName: function() { return this.trigger("getPaczkomatName"); } }); $.Paczkomator = function(input, options) { var KEY = { UP: 38, DOWN: 40, DEL: 46, TAB: 9, RETURN: 13, ESC: 27, COMMA: 188, PAGEUP: 33, PAGEDOWN: 34, BACKSPACE: 8 }; var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass); var timeout; var previousValue = ""; var cache = $.Paczkomator.Cache(options); var hasFocus = 0; var lastKeyPressCode; var config = { mouseDownOnSelect: false }; var select = $.Paczkomator.Select(options, input, selectCurrent, config); var blockSubmit; opera && $(input.form).bind("submit.paczkomaty", function() { if (blockSubmit) { blockSubmit = false; return false; } }); $input.bind((opera ? "keypress" : "keydown") + ".paczkomaty", function(event) { lastKeyPressCode = event.keyCode; switch (event.keyCode) { case KEY.UP: event.preventDefault(); if (select.visible()) { select.prev(); } else { onChange(0, true); } break; case KEY.DOWN: event.preventDefault(); if (select.visible()) { select.next(); } else { onChange(0, true); } break; case KEY.PAGEUP: event.preventDefault(); if (select.visible()) { select.pageUp(); } else { onChange(0, true); } break; case KEY.PAGEDOWN: event.preventDefault(); if (select.visible()) { select.pageDown(); } else { onChange(0, true); } break; case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: case KEY.TAB: case KEY.RETURN: if (selectCurrent()) { event.preventDefault(); blockSubmit = true; return false; } break; case KEY.ESC: select.hide(); break; default: clearTimeout(timeout); timeout = setTimeout(onChange, options.delay); break; } }).focus(function() { hasFocus++; }).blur(function() { hasFocus = 0; if (!config.mouseDownOnSelect) { hideResults(); } }).click(function() { if (hasFocus++ > 1 && !select.visible()) { onChange(0, true); } }).bind("search", function() { var fn = (arguments.length > 1) ? arguments[1] : null; function findValueCallback(q, data) { var result; if (data && data.length) { for (var i = 0; i < data.length; i++) { if (data[i].result.toLowerCase() == q.toLowerCase()) { result = data[i]; break; } } } if (typeof fn == "function") { fn(result); } else { $input.trigger("result", result && [result.data, result.value]); } } $.each(trimWords($input.val()), function(i, value) { request(value, findValueCallback, findValueCallback); }); }).bind("flushCache", function() { cache.flush(); }).bind("setOptions", function() { $.extend(options, arguments[1]); if ("data" in arguments[1]) { cache.populate(); } }).bind("unpaczkomaty", function() { select.unbind(); $input.unbind(); $(input.form).unbind(".paczkomaty"); }).bind('getPaczkomatName', function() { if ($input.val() != '') { if ($(this).val().length <= 10) { $.ajax({ method: 'get', url: 'https://api-pl-points.easypack24.net/v1/points/' + $(this).val().toUpperCase(), dataType: 'json', success: function(d) { $input.trigger("result", [d, false]); } }) } } }); function selectCurrent() { var selected = select.selected(); if (!selected) { return false; } var v = selected.result; previousValue = v; if (options.multiple) { var words = trimWords($input.val()); if (words.length > 1) { v = words.slice(0, words.length - 1).join(options.multipleSeparator) + options.multipleSeparator + v; } v += options.multipleSeparator; } $input.val(v); hideResultsNow(); $input.trigger("result", [selected.data, selected.value]); return true; } function onChange(crap, skipPrevCheck) { if (lastKeyPressCode == KEY.DEL) { select.hide(); return; } var currentValue = $input.val(); if (!skipPrevCheck && currentValue == previousValue) { return; } previousValue = currentValue; currentValue = lastWord(currentValue); if (currentValue.length >= options.minChars) { $input.addClass(options.loadingClass); if (!options.matchCase) { currentValue = currentValue.toLowerCase(); } request(currentValue, receiveData, hideResultsNow); } else { stopLoading(); select.hide(); } }; function trimWords(value) { if (!value) { return [""]; } var words = value.split(options.multipleSeparator); var result = []; $.each(words, function(i, value) { if ($.trim(value)) { result[i] = $.trim(value); } }); return result; } function lastWord(value) { if (!options.multiple) { return value; } var words = trimWords(value); return words[words.length - 1]; } function autoFill(q, sValue) { if (options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE) { $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); $.Paczkomator.Selection(input, previousValue.length, previousValue.length + sValue.length); } }; function hideResults() { clearTimeout(timeout); timeout = setTimeout(hideResultsNow, 200); }; function hideResultsNow() { var wasVisible = select.visible(); select.hide(); clearTimeout(timeout); stopLoading(); if (options.mustMatch) { $input.search( function(result) { if (!result) { if (options.multiple) { var words = trimWords($input.val()).slice(0, -1); $input.val(words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "")); } else { $input.val(""); } } } ); } if (wasVisible) { $.Paczkomator.Selection(input, input.value.length, input.value.length); } }; function receiveData(q, data) { if (data && data.length && hasFocus) { stopLoading(); select.display(data, q); autoFill(q, data[0].value); select.show(); } else { hideResultsNow(); } }; function request(term, success, failure) { if (!options.matchCase) { term = term.toLowerCase(); } var data = cache.load(term); if (data && data.length) { success(term, data); } else if ((typeof options.url == "string") && (options.url.length > 0)) { var extraParams = { timestamp: +new Date() }; $.each(options.extraParams, function(key, param) { extraParams[key] = typeof param == "function" ? param() : param; }); var find = false; $.ajax({ method: 'get', url: 'https://api-pl-points.easypack24.net/v1/points/' + lastWord(term).toUpperCase(), dataType: 'json', fields: 'name,type,location,address,address_details,is_next,location_description,opening_hours,payment_point_descr', status: 'Operating', type: options.types, success: function(d) { if (d.status == 'Operating') { var data = []; data[0] = d; var parsed = options.parse && options.parse(data) || parse(data); cache.add(term, parsed); success(term, parsed); find = true; } else { $.ajax({ mode: "abort", port: "autocomplete" + input.name, dataType: 'JSON', url: options.url, data: $.extend({ address: lastWord(term), token: pm_inpostpaczkomaty_token, current_cart: current_cart }, extraParams), success: function(d) { if (d.status == 'OK') { var lat = d.results[0].geometry.location.lat; var lng = d.results[0].geometry.location.lng; $.ajax({ method: 'get', url: pm_inpostpaczkomaty_gcup, dataType: 'json', data: { prequest: true, fields: 'name,type,location,address,address_details,is_next,location_description,opening_hours,payment_point_descr', status: 'Operating', type: options.types, relative_point: lat + ',' + lng, max_distance: 4000, limit: 200, term: term }, success: function(d) { if (d.count > 0) { data = d.items var parsed = options.parse && options.parse(data) || parse(data); cache.add(term, parsed); success(term, parsed); } else { select.emptyList(); failure(term); } } }) } else { if (typeof d.status !== 'undefined') { console.log(d.status); } if (typeof d.error_message !== 'undefined') { console.log(d.error_message); } } } }); } } }) } else { select.emptyList(); failure(term); } }; function parse(data) { var parsed = []; var rows = data.split("\n"); for (var i = 0; i < rows.length; i++) { var row = $.trim(rows[i]); if (row) { row = row.split("|"); parsed[parsed.length] = { data: row, value: row[0], result: options.formatResult && options.formatResult(row, row[0]) || row[0] }; } } return parsed; }; function stopLoading() { $input.removeClass(options.loadingClass); }; }; $.Paczkomator.defaults = { inputClass: "paczkomaty_input", resultsClass: "paczkomaty_result", loadingClass: "paczkomaty_loading", minChars: 3, delay: 400, matchCase: false, matchSubset: true, matchContains: false, cacheLength: 500, max: 100, mustMatch: false, extraParams: { ajaxSearch: 1, key: pm_inpostpaczkomaty_mapkey, }, selectFirst: false, formatMatch: null, autoFill: false, width: 400, types: 'parcel_locker,pok', multiple: false, multipleSeparator: ", ", highlight: function(value, term) { return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1"); }, scroll: true, scrollHeight: 300 }; $.Paczkomator.Cache = function(options) { var data = {}; var length = 0; function matchSubset(s, sub) { if (!options.matchCase) { s = s.toLowerCase(); } var i = s.indexOf(sub); if (i == -1) { return false; } return i == 0 || options.matchContains; }; function add(q, value) { if (length > options.cacheLength) { flush(); } if (!data[q]) { length++; } data[q] = value; } function populate() { if (!options.data) { return false; } var stMatchSets = {}, nullData = 0; if (!options.url) { options.cacheLength = 1; } stMatchSets[""] = []; for (var i = 0, ol = options.data.length; i < ol; i++) { var rawValue = options.data[i]; rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; var value = options.formatMatch(rawValue, i + 1, options.data.length); if (value === false) { continue; } var firstChar = value.charAt(0).toLowerCase(); if (!stMatchSets[firstChar]) { stMatchSets[firstChar] = []; } var row = { value: value, data: rawValue, result: options.formatResult && options.formatResult(rawValue) || value }; stMatchSets[firstChar].push(row); if (nullData++ < options.max) { stMatchSets[""].push(row); } }; $.each(stMatchSets, function(i, value) { options.cacheLength++; add(i, value); }); } setTimeout(populate, 25); function flush() { data = {}; length = 0; } return { flush: flush, add: add, populate: populate, load: function(q) { if (!options.cacheLength || !length) { return null; } /* * if dealing w/local data and matchContains than we must make sure * to loop through all the data collections looking for matches */ if (!options.url && options.matchContains) { var csub = []; for (var k in data) { if (k.length > 0) { var c = data[k]; $.each(c, function(i, x) { if (matchSubset(x.value, q)) { csub.push(x); } }); } } return csub; } else if (data[q]) { return data[q]; } else if (options.matchSubset) { for (var i = q.length - 1; i >= options.minChars; i--) { var c = data[q.substr(0, i)]; if (c) { var csub = []; $.each(c, function(i, x) { if (matchSubset(x.value, q)) { csub[csub.length] = x; } }); return csub; } } } return null; } }; }; $.Paczkomator.Select = function(options, input, select, config) { var CLASSES = { ACTIVE: "paczkomaty_over" }; var listItems, active = -1, data, term = "", needsInit = true, element, list; function init() { if (!needsInit) { return; } element = $("
") .hide() .addClass(options.resultsClass) .css("position", "absolute") .appendTo(document.body); list = $("