OwlCyberSecurity - MANAGER
Edit File: peafowl.js
/* * This file is part of Chevereto. * * (c) Rodolfo Berrios <rodolfo@chevereto.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ $(function () { var ajaxSetup = { url: PF.obj.config.json_api, cache: false, dataType: "json", data: { auth_token: PF.obj.config.auth_token } }; if (typeof PF.obj.config.session_id !== typeof undefined) { ajaxSetup.data.session_id = PF.obj.config.session_id; } $.ajaxSetup(ajaxSetup); /** * WINDOW LISTENERS * ------------------------------------------------------------------------------------------------- */ $(window).bind("beforeunload", function () { if ( $("form", PF.obj.modal.selectors.root).data("beforeunload") == "continue" ) return; if ( $(PF.obj.modal.selectors.root).is(":visible") && PF.fn.form_modal_has_changed() ) { return '<i class="fas fa-exclamation-triangle"></i> ' + PF.fn._s( "All the changes that you have made will be lost if you continue." ); } }); var previousScrollPosition = 0; const supportPageOffset = window.pageXOffset !== undefined; const isCSS1Compat = (document.compatMode || "") === "CSS1Compat"; const isScrollingDown = function () { let scrolledPosition = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop; let isScrollDown; if (scrolledPosition > previousScrollPosition) { isScrollDown = true; } else { isScrollDown = false; } previousScrollPosition = scrolledPosition; return isScrollDown; }; var scrollTimer; window.addEventListener("scroll", function () { if(!$("html").hasScrollbar().vertical) return; if(scrollTimer) return; scrollTimer = true; setTimeout(function () { var down = isScrollingDown(); $("#top-bar, .follow-scroll").each(function() { if($(this).attr("data-scroll-lock") === "1") { return; } $(this) .addClass("scroll-" + (down ? "down" : "up")) .removeClass("scroll-" + (down ? "up" : "down")); }); scrollTimer = false; }, 250); }); $(window).bind("hashchange", function () { // Call edit modal on #edit if ( window.location.hash == "#edit" && !$(PF.obj.modal.selectors.root).exists() ) $("[data-modal=edit]") .first() .click(); }); // Blind the tipTips on load PF.fn.bindtipTip(); var resizeTimeout = 0, resizeTimer, width = $(window).width(); $(window).on("resize", function () { PF.fn.modal.styleAware(); PF.fn.close_pops(); clearTimeout(resizeTimer); resizeTimer = setTimeout(function () { PF.fn.modal.fixScrollbars(); var device = PF.fn.getDeviceName(), handled = ["phone", "phablet"], desktop = ["tablet", "laptop", "desktop"]; var new_device = PF.fn.getDeviceName(); if ( (new_device !== device && ($.inArray(device, handled) >= 0 && $.inArray(new_device, handled) == -1)) || ($.inArray(device, desktop) >= 0 && $.inArray(new_device, desktop) == -1) ) { PF.fn.close_pops(); } $(".top-bar").css("top", ""); $("body").css({ position: "", height: "" }); $(".antiscroll") .removeClass("jsly") .data("antiscroll", ""); // Destroy for this? $(".antiscroll-inner").css({ height: "", width: "", maxheight: "" }); // .pop-box, .pop-box-inner ? PF.fn.list_fluid_width(); if (width !== $(window).width()) { $(PF.obj.listing.selectors.list_item, PF.obj.listing.selectors.content_listing_visible).css("opacity", 0); if ( $("[data-action=top-bar-menu-full]", "#top-bar").hasClass("current") ) { PF.fn.topMenu.hide(0); } PF.fn.listing.columnizer(true, 0, true); $(PF.obj.listing.selectors.list_item, PF.obj.listing.selectors.content_listing_visible).css("opacity", 1); } width = $(window).width(); }, resizeTimeout); }); // Close the opened pop-boxes on HTML click $(document).on("click", "html", function () { PF.fn.close_pops(); }); // Keydown numeric input (prevents non numeric keys) $(document).on("keydown", ".numeric-input", function (e) { e.keydown_numeric(); }); // The handly data-scrollto. IT will scroll the elements to the target $(document).on("click", "[data-scrollto]", function (e) { var target = $(this).data("scrollto"), $target = $(!target.match(/^\#|\./) ? "#" + target : target); if ($target.exists()) { PF.fn.scroll($target); } else { console.log("PF scrollto error: target doesn't exists", $target); } }); $(document).on( "click focus", "[data-login-needed], [data-user-logged=must]", function (e) { if (!PF.fn.is_user_logged()) { e.preventDefault(); e.stopPropagation(); window.location.href = PF.obj.vars.urls.login; return false; } } ); // The handly data-trigger. It will trigger click for elements with data-trigger $(document).on("click", "[data-trigger]", function (e) { if (e.isPropagationStopped()) { return false; } var trigger = $(this).data("trigger"), $target = $(!trigger.match(/^\#|\./) ? "#" + trigger : trigger); if ($target.exists()) { e.stopPropagation(); e.preventDefault(); if (!$target.closest(PF.obj.modal.selectors.root).length) { PF.fn.modal.close(); } $target.trigger("click"); } else { console.log("PF trigger error: target doesn't exists", $target); } }); // Fix the auth_token inputs $("form[method=post]").each(function () { if (!$("input[name=auth_token]", this).exists()) { $(this).append( $("<input>", { type: "hidden", name: "auth_token", value: PF.obj.config.auth_token }) ); } }); // Clear form like magic $(document).on("click", ".clear-form", function () { $(this) .closest("form")[0] .reset(); }); $(document).on("submit", "form[data-action=validate]", function (e) { var type = $(this).data("type"), errors = false, $validate = $(this).find("[required], [data-validate]"); $validate.each(function () { var input_type = $(this).attr("type"), pattern = $(this).attr("pattern"), errorFn = function (el) { $(el).highlight(); errors = true; }; if ($(this).is("[required]") && $(this).val() == "") { if ($(this).is(":hidden")) { var $hidden_target = $( $($(this).data("highlight")).exists() ? $(this).data("highlight") : "#" + $(this).data("highlight") ); $($hidden_target).highlight(); } errorFn(this); } if ( typeof pattern == "undefined" && /mail|url/.test(input_type) == false ) { return true; } if (pattern) { pattern = new RegExp(pattern); if (!pattern.test($(this).val())) { errorFn(this); } } if ( input_type == "email" && !$(this) .val() .isEmail() ) { errorFn(this); } }); if (errors) { PF.fn.growl.expirable( PF.fn._s("Check the errors in the form to continue.") ); return false; } }); // Co-combo breaker $(document).on("change", "select[data-combo]", function () { var $combo = $("#" + $(this).data("combo")); if ($combo.exists()) { $combo.children(".switch-combo").hide(); } var $combo_container = $( "#" + $(this) .closest("select") .data("combo") ), $combo_target = $( "[data-combo-value~=" + $("option:selected", this).attr("value") + "]", $combo_container ); if ($combo_target.exists()) { $combo_target .show() .find("[data-required]") .each(function () { $(this).attr("required", "required"); // re-enable any disabled required }); } // Disable [required] in hidden combos $(".switch-combo", $combo_container).each(function () { if ($(this).is(":visible")) return; $("[required]", this) .attr("data-required", true) .removeAttr("required"); }); }); $(document).on("keyup", function (e) { var $this = $(e.target); var event = e.originalEvent; if (event.key == "Escape") { if ($(PF.obj.modal.selectors.root).is(":visible")) { if(!$this.is(":input")) { $( "[data-action=cancel],[data-action=close-modal]", PF.obj.modal.selectors.root ) .first() .trigger("click"); } else { $this.trigger("blur"); } PF.fn.keyFeedback.spawn(e); } } }); // Input events $(document).on("change", ":input", function (e) { PF.fn.growl.close(); }); $(document).on("keyup", ":input", function (e) { $(".input-warning", $(this).closest(".input-label")).html(""); }); $(document).on("blur", ":input", function () { var this_val = $.trim($(this).prop("value")); $(this).prop("value", this_val); }); $(document).on("click", "[data-focus=select-all],[data-click=select-all]", function () { if ($(this).is(":input")) { this.select(); } else { var range = document.createRange(); range.selectNodeContents(this); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } }); // Input password strength $(document).on("keyup change blur", ":input[type=password]", function () { var password = testPassword($(this).val()), $parent = $(this).closest("div"); if ($(this).val() == "") { password.percent = 0; password.verdict = ""; } $("[data-content=password-meter-bar]", $parent) .attr("data-veredict", password.verdict.replace(/ /g, "-")) .width(password.percent); $("[data-text=password-meter-message]", $parent) .removeClass("red-warning") .text(password.verdict !== "" ? PF.fn._s(password.verdict) : ""); }); // Popup links $(document).on("click", "[rel=popup-link], .popup-link", function (e) { e.preventDefault(); var href = $(this)[ typeof $(this).attr("href") !== "undefined" ? "attr" : "data" ]("href"); if (typeof href == "undefined") { return; } if(PF.fn.isDevice(["phone", "phablet"])) { if (href.substring(0, 6) == "mailto") { window.location = href; return; } if (href.substring(0, 5) == "share") { if(navigator.canShare) { navigator.share(PF.fn.deparam(href.substring(6))); } return; } } PF.fn.popup({ href: href }); }); /** * MODAL * ------------------------------------------------------------------------------------------------- */ // Call plain simple HTML modal $(document).on("click", "[data-modal=simple],[data-modal=html]", function () { var $target = $( "[data-modal=" + $(this).data("target") + "], #" + $(this).data("target") ).first(); PF.fn.modal.call({ template: $target.html(), buttons: false }); }); // Prevent modal submit form since we only use the form in the modal to trigger HTML5 validation $(document).on("submit", PF.obj.modal.selectors.root + " form", function (e) { if ($(this).data("prevented")) return false; // Don't send the form if is prevented if (typeof $(this).attr("method") !== "undefined") return; // Don't bind anything extra if is normal form return false; // Prevent default form handling }); // Form/editable/confirm modal $(document).on( "click", "[data-modal=edit],[data-modal=form],[data-confirm]", function (e) { e.preventDefault(); var $this = $(this); var $target; if ($this.is("[data-confirm]")) { $target = $this; PF.obj.modal.type = "confirm"; } else { $target = $( "[data-modal=" + $this.data("target") + "], #" + $this.data("target") ).first(); if ($target.length == 0) { $target = $("[data-modal=form-modal], #form-modal").first(); } if ($target.length == 0) { console.log("PF Error: Modal target doesn't exists."); } PF.obj.modal.type = $this.data("modal"); } var args = $this.data("args"), submit_function = window[$target.data("submit-fn")], cancel_function = window[$target.data("cancel-fn")], onload_function = window[$target.data("load-fn")], submit_done_msg = $target.data("submit-done"), ajax = { url: $target.data("ajax-url") || (typeof $target.data("is-xhr") !== typeof undefined ? PF.obj.config.json_api : null), deferred: window[$target.data("ajax-deferred")] }; if (typeof submit_function !== "function" && $target.data("submit-fn")) { var submit_fn_split = $target.data("submit-fn").split("."); submit_function = window; for (var i = 0; i < submit_fn_split.length; i++) { submit_function = submit_function[submit_fn_split[i]]; } } if (typeof cancel_function !== "function" && $target.data("cancel-fn")) { var cancel_fn_split = $target.data("cancel-fn").split("."); cancel_function = window; for (var i = 0; i < cancel_fn_split.length; i++) { cancel_function = cancel_function[cancel_fn_split[i]]; } } if (typeof load_function !== "function" && $target.data("load-fn")) { var load_fn_split = $target.data("load-fn").split("."); load_function = window; for (var i = 0; i < load_fn_split.length; i++) { load_function = load_function[load_fn_split[i]]; } } if (typeof ajax.deferred !== "object" && $target.data("ajax-deferred")) { var deferred_obj_split = $target.data("ajax-deferred").split("."); ajax.deferred = window; for (var i = 0; i < deferred_obj_split.length; i++) { ajax.deferred = ajax.deferred[deferred_obj_split[i]]; } } // Before fn var fn_before = window[$target.data("before-fn")]; if (typeof fn_before !== "function" && $target.data("before-fn")) { var before_obj_split = $target.data("before-fn").split("."); fn_before = window; for (var i = 0; i < before_obj_split.length; i++) { fn_before = fn_before[before_obj_split[i]]; } } if (typeof fn_before == "function") { fn_before(e); } var inline_options = $(this).data("options") || {}; // Confirm modal if ($this.is("[data-confirm]")) { var default_options = { message: $this.data("confirm"), confirm: typeof submit_function == "function" ? submit_function(args) : "", cancel: typeof cancel_function == "function" ? cancel_function(args) : "", ajax: ajax }; if ($this.attr("href") && default_options.confirm == "") { default_options.confirm = function () { return window.location.replace($this.attr("href")); }; } PF.fn.modal.confirm($.extend(default_options, inline_options)); } else { // Form/editable var default_options = { template: $target.html(), button_submit: $(this).is("[data-modal=edit]") ? PF.fn._s("Save changes") : PF.fn._s("Submit"), confirm: function () { var form_modal_has_changed = PF.fn.form_modal_has_changed(); // Conventional form handling var $form = $("form", PF.obj.modal.selectors.root); if (typeof $form.attr("action") !== "undefined") { $form.data("prevented", !form_modal_has_changed); PF.fn.modal.close(); return; } // Handle the required thing for non-visible elements $(":input[name]", $form).each(function () { if (!$(this).is(":visible")) { var input_attr = $(this).attr("required"); if ( typeof input_attr !== typeof undefined && input_attr !== false ) { $(this) .prop("required", false) .attr("data-required", "required"); } } else { if ($(this).attr("data-required") == "required") { $(this).prop("required", true); } } }); // Detect HTML5 validation if (!$form[0].checkValidity()) { return false; } // Run the full function only when the form changes if (!form_modal_has_changed && !inline_options.forced) { PF.fn.modal.close(); return; } if (typeof submit_function == "function") submit_fn = submit_function(args); if (typeof submit_fn !== "undefined" && submit_fn == false) { return false; } $(":input", PF.obj.modal.selectors.root).each(function () { $(this).val($.trim($(this).val())); }); if ($this.is("[data-modal=edit]")) { // Set the input values before cloning the html $target.html( $( PF.obj.modal.selectors.body, $(PF.obj.modal.selectors.root).bindFormData() ) .html() .replace(/rel=[\'"]tooltip[\'"]/g, 'rel="template-tooltip"') ); } if (typeof ajax.url !== "undefined") { return true; } else { PF.fn.modal.close(function () { if (typeof submit_done_msg !== "undefined") { PF.fn.growl.expirable( submit_done_msg !== "" ? submit_done_msg : PF.fn._s("Changes saved successfully.") ); } }); } }, cancel: function () { if (typeof cancel_fn == "function") cancel_fn = cancel_fn(); if (typeof cancel_fn !== "undefined" && cancel_fn == false) { return false; } // nota: falta template aca if ( $target.data("prompt") != "skip" && PF.fn.form_modal_has_changed() ) { if ($(PF.obj.modal.selectors.changes_confirm).exists()) return; $(PF.obj.modal.selectors.box, PF.obj.modal.selectors.root) .css({ transition: "none" }) .hide(); $(PF.obj.modal.selectors.root).append( '<div id="' + PF.obj.modal.selectors.changes_confirm.replace("#", "") + '"><div class="content-width"><h2>' + '<i class="fas fa-exclamation-triangle"></i> ' + PF.fn._s( "All the changes that you have made will be lost if you continue." ) + '</h2><div class="' + PF.obj.modal.selectors.btn_container.replace(".", "") + ' margin-bottom-0"><button class="btn btn-input default" data-action="cancel">' + '<i class="fas fa-chevron-circle-left btn-icon"></i>'+ '<span class="btn-text">' + PF.fn._s("Go back to form") + '</span>' + '</button> <span class="btn-alt">' + PF.fn._s("or") + ' <a data-action="submit"><i class="fas fa-check margin-right-5"></i>' + PF.fn._s("continue anyway") + "</a></span></div></div>" ); $(PF.obj.modal.selectors.changes_confirm) .css( "margin-top", -$(PF.obj.modal.selectors.changes_confirm).outerHeight(true) / 2 ) .hide() .fadeIn("fast"); } else { PF.fn.modal.close(); if (window.location.hash == "#edit") window.location.hash = ""; } }, load: function () { if (typeof load_function == "function") load_function(); }, callback: function () { }, ajax: ajax }; PF.fn.modal.call($.extend(default_options, inline_options)); } } ); if (!PF.fn.is_user_logged()) { $("[data-login-needed]:input, [data-user-logged=must]:input").each( function () { $(this).attr("readonly", true); } ); } $(document).on("keydown", "html", function (e) { var $this = $(e.target), event = e.originalEvent; if (event.key === 'Escape') { PF.fn.growl.close(); return; } var submit = event.key === 'Enter' && (event.ctrlKey || event.metaKey); if($this.is("textarea") && !submit) { e.stopPropagation(); return; } var $inputEnabledEnter = $this.is(":input.search") || $this.closest(".input-with-button").exists(); if(!$inputEnabledEnter && $this.is(":input, textarea") && event.key === 'Enter' && !submit) { e.stopPropagation(); e.preventDefault(); return; } if($(PF.obj.modal.selectors.root).exists()) { if(!submit && event.key === 'Enter' && $("[data-action=submit]", PF.obj.modal.selectors.root).exists() && !$this.is(".prevent-submit")) { submit = true; } if(!submit) { return; } $("[data-action=submit]", PF.obj.modal.selectors.root).trigger("click"); } else { if(submit) { var $form = $this.is(":input") ? $this.closest("form") : $("form", ".form-content:visible").first(); $form.trigger("submit"); } } if(submit) { PF.fn.keyFeedback.spawn(e); } }); // Trigger modal edit on hash #edit // It must be placed after the event listener if (window.location.hash && window.location.hash == "#edit") { $("[data-modal=edit]") .first() .click(); } /** * MOBILE TOP BAR MENU * ------------------------------------------------------------------------------------------------- */ $(document).on("click", "#menu-fullscreen .fullscreen, [data-action=top-bar-menu-full]", function (e) { if($(e.target).is("#pop-box-mask")) { return; } var hasClass = $("[data-action=top-bar-menu-full]", "#top-bar").hasClass( "current" ); PF.fn.topMenu[hasClass ? "hide" : "show"](); if(Boolean(window.navigator.vibrate)) { var pattern = !hasClass ? [15, 200, 25, 125, 15] : [15, 200, 15]; window.navigator.vibrate(0); window.navigator.vibrate(pattern); } }); /** * SEARCH INPUT * ------------------------------------------------------------------------------------------------- */ // Top-search feature $(document).on("click", "[data-action=top-bar-search]", function () { $("[data-action=top-bar-search-input]", ".top-bar") .removeClass("hidden") .show(); $("[data-action=top-bar-search-input]:visible input") .first() .focus(); if ( is_ios() && !$(this) .closest(PF.fn.topMenu.vars.menu) .exists() ) { $(".top-bar").css("position", "absolute"); } $("[data-action=top-bar-search]", ".top-bar").hide(); }); // Search icon click -> focus input $(document).on("click", ".input-search .icon--search", function (e) { $("input", e.currentTarget.offsetParent).focus(); }); // Clean search input $(document).on( "click", ".input-search .icon--close, .input-search [data-action=clear-search]", function (e) { var $input = $("input", e.currentTarget.offsetParent); if ($input.val() == "") { if ( $(this) .closest("[data-action=top-bar-search-input]") .exists() ) { $("[data-action=top-bar-search-input]", ".top-bar").hide(); $("[data-action=top-bar-search]", ".top-bar") .removeClass("opened") .show(); } } else { if ( !$(this) .closest("[data-action=top-bar-search-input]") .exists() ) { $(this).hide(); } $input.val("").change(); } } ); // Input search clear search toggle $(document).on("keyup change", "input.search", function (e) { var $input = $(this), $div = $(this).closest(".input-search"); if ( !$(this) .closest("[data-action=top-bar-search-input]") .exists() ) { var todo = $input.val() == "" ? "hide" : "show"; $(".icon--close, [data-action=clear-search]", $div)[todo](); } }); /** * POP BOXES (MENUS) * ------------------------------------------------------------------------------------------------- */ $(document) .on("click mouseenter", ".pop-btn", function (e) { if ( PF.fn.isDevice(["phone", "phablet"]) && (e.type == "mouseenter" || $(this).hasClass("pop-btn-desktop")) ) { return; } var $this_click = $(e.target); var $pop_btn; var $pop_box; var devices = $.makeArray(["phone", "phablet"]); var $this = $(this); if (e.type == "mouseenter" && !$(this).hasClass("pop-btn-auto")) return; if ( $(this).hasClass("disabled") || ($this_click.closest(".current").exists() && !PF.fn.isDevice("phone") && !$this_click.closest(".pop-btn-show").exists()) ) { return; } PF.fn.growl.close(); e.stopPropagation(); $pop_btn = $(this); $pop_box = $(".pop-box", $pop_btn); $pop_btn.addClass("opened"); var marginBox = parseInt($pop_box.css("margin-right")); $(".pop-box-inner", $pop_box).css("max-height", ""); if (PF.fn.isDevice(devices)) { var textButton = $(".pop-btn-text,.btn-text,.text", $pop_btn) .first().text(); var iconButton = $(".pop-btn-icon,.btn-icon,.icon", $pop_btn)[0].outerHTML; if (!$(".pop-box-header", $pop_box).exists()) { $pop_box.prepend( $("<div/>", { class: "pop-box-header", html: iconButton + ' ' + textButton + '<span class="btn-icon icon--close fas fa-times"></span></span>' }), $("<div/>", { class: "hidden phone-show phablet-show or-separator margin-top-0 margin-bottom-0", }) ); } } else { $(".pop-box-header", $pop_box).remove(); $pop_box.css({ bottom: "" }); } if ($pop_box.hasClass("anchor-center")) { if (!PF.fn.isDevice(devices)) { $pop_box.css("marginInlineStart", -($pop_box.outerWidth() / 2)); } else { $pop_box.css("marginInlineStart", ""); } } // Pop button changer if ($this_click.is("[data-change]")) { $("li", $pop_box).removeClass("current"); $this_click.closest("li").addClass("current"); $("[data-text-change]", $pop_btn).text( $("li.current a", $pop_box).text() ); e.preventDefault(); } if (!$pop_box.exists()) return; var $this = e.istriggered ? $(e.target) : $(this); if ( $pop_box.is(":visible") && $(e.target) .closest(".pop-box-inner") .exists() && ($this.hasClass("pop-keep-click")) ) { return; } $(".pop-box:visible") .not($pop_box) .hide() .closest(".pop-btn") .removeClass("opened"); var callback = function ($pop_box) { if (!$pop_box.is(":visible")) { $pop_box .css("marginInlineStart", "") .removeAttr("data-guidstr") .closest(".pop-btn") .removeClass("opened"); } else { if (!PF.fn.isDevice(devices)) { var posMargin = $pop_box.css("marginInlineStart"); if (typeof posMargin !== typeof undefined) { posMargin = parseFloat(posMargin); $pop_box.css("marginInlineStart", ""); } var cutoff = $pop_box.getWindowCutoff(); if (cutoff && cutoff.right && cutoff.right < posMargin) { $pop_box .css("marginInlineStart", cutoff.right + "px"); } else { $pop_box.css("marginInlineStart", posMargin + "px"); cutoff = $pop_box.getWindowCutoff(); if(cutoff && cutoff.left) { let marginFix = -(Math.abs(posMargin) + Math.abs(cutoff.left) + marginBox/2); $pop_box.css( "marginInlineStart", marginFix + "px" ); } } $(".antiscroll-wrap:not(.jsly):visible", $pop_box) .addClass("jsly") .antiscroll(); } else { $(".antiscroll-inner", $pop_box).height("100%"); } } }; if (PF.fn.isDevice(devices)) { if ($(this).is("[data-action=top-bar-notifications]")) { $pop_box.css({ height: $(window).height() }); } var pop_box_h = $pop_box.height() + "px"; var menu_top = parseInt($(".top-bar").outerHeight()) + parseInt($(".top-bar").css("top")) + parseInt($(".top-bar").css("margin-top")) + parseInt($(".top-bar").css("margin-bottom")) + "px"; if ($pop_box.is(":visible")) { $("#pop-box-mask").css({ opacity: 0 }); $pop_box.css({ transform: "none" }); if ($this.closest(PF.fn.topMenu.vars.menu).exists()) { $(".top-bar").css({ transform: "none" }); } setTimeout(function () { $pop_box.hide().attr("style", ""); $("#pop-box-mask").remove(); callback($pop_box); if ($this.closest(PF.fn.topMenu.vars.menu).exists()) { $(PF.fn.topMenu.vars.menu).css({ height: "" }); $(PF.fn.topMenu.vars.menu).animate( { scrollTop: PF.fn.topMenu.vars.scrollTop }, PF.obj.config.animation.normal / 2 ); } if (!$("body").data("hasOverflowHidden")) { var removeClasses = "pop-box-show pop-box-show--top"; if(!$(PF.obj.modal.selectors.root).exists()) { removeClasses += " overflow-hidden"; } $("body,html").removeClass(removeClasses); } $pop_box.find(".pop-box-inner").css("height", ""); }, PF.obj.config.animation.normal); } else { $("#pop-box-mask").remove(); $pop_box.parent().prepend( $("<div/>", { id: "pop-box-mask", class: "fullscreen black" }).css({ zIndex: 400, display: "block" }) ); PF.fn.topMenu.vars.scrollTop = $(PF.fn.topMenu.vars.menu).scrollTop(); setTimeout(function () { $("#pop-box-mask").css({ opacity: 1 }); setTimeout(function () { $pop_box.show().css({ bottom: "-" + pop_box_h, maxHeight: "100%", zIndex: 1000, transform: "translate(0,0)" }); setTimeout(function() { $pop_box.find(".pop-box-inner").scrollTop(0) }, 1) setTimeout(function () { $pop_box.css({ transform: "translate(0,-" + pop_box_h + ")" }); }, 1); setTimeout(function () { callback($pop_box); }, PF.obj.config.animation.normal); if ($("html").hasClass("overflow-hidden")) { $("html").data("hasOverflowHidden", 1); } else { $("html").addClass("overflow-hidden"); $("body").addClass( ($this.closest('.top-bar').exists() ? 'pop-box-show--top' : 'pop-box-show') ); } $(".pop-box-inner", $pop_box).css( "height", $pop_box.height() - $(".pop-box-header", $pop_box).outerHeight(true) ); }, 1); }, 1); } } else { $pop_box[$pop_box.is(":visible") ? "hide" : "show"](0, function () { callback($pop_box); }); } }) .on("mouseleave", ".pop-btn", function () { if (!PF.fn.isDevice(["laptop", "desktop"])) { return; } var $pop_btn = $(this), $pop_box = $(".pop-box", $pop_btn); if ( !$pop_btn.hasClass("pop-btn-auto") || (PF.fn.isDevice(["phone", "phablet"]) && $pop_btn.hasClass("pop-btn-auto")) ) { return; } $pop_box .hide() .closest(".pop-btn") .removeClass("opened"); }); /** * TABS * ------------------------------------------------------------------------------------------------- */ // Hash on load (static tabs) changer if (window.location.hash) { /* var $hash_node = $("[href="+ window.location.hash +"]"); if($hash_node.exists()) { $.each($("[href="+ window.location.hash +"]")[0].attributes, function(){ PF.obj.tabs.hashdata[this.name] = this.value; }); PF.obj.tabs.hashdata.pushed = "tabs"; History.replaceState({ href: window.location.hash, "data-tab": $("[href="+ window.location.hash +"]").data("tab"), pushed: "tabs", statenum: 0 }, null, null); } */ } // Stock tab onload data if ($(".content-tabs").exists() /* && !window.location.hash*/) { var $tab = $("a", ".content-tabs .current"); History.replaceState( { href: $tab.attr("href"), "data-tab": $tab.data("tab"), pushed: "tabs", statenum: 0 }, null, null ); } // Keep scroll position (history.js) var State = History.getState(); if (typeof State.data == "undefined") { History.replaceState( { scrollTop: 0 }, document.title, window.location.href ); // Stock initial scroll } History.Adapter.bind(window, "popstate", function () { var State = History.getState(); if (State.data && typeof State.data.scrollTop !== "undefined") { if ($(window).scrollTop() !== State.data.scrollTop) { $(window).scrollTop(State.data.scrollTop); } } return; }); // Toggle tab display $("a", ".content-tabs").on("click", function (e) { if ($(this).data("link") == true) { $(this).data("tab", false); } if ( $(this) .closest(".current,.disabled") .exists() ) { e.preventDefault(); return; } if (typeof $(this).data("tab") == "undefined") return; var dataTab = {}; $.each(this.attributes, function () { dataTab[this.name] = this.value; }); dataTab.pushed = "tabs"; if ($("#" + dataTab["data-tab"]).data("load") != "classic") { if (window.location.hash) { var url = window.location.href; url = url.replace(window.location.hash, ""); } History.pushState( dataTab, document.title, typeof url !== "undefined" ? url : $(this).attr("href") ); e.preventDefault(); } var $tab_menu = $("[data-action=tab-menu]", $(this).closest(".header")); $tab_menu.find("[data-content=current-tab-label]").text($(this).text()); $tab_menu.find('[data-content="tab-icon"]').attr("class", "").addClass( $(this).find(".btn-icon").attr("class") ); if ($tab_menu.is(":visible")) { $tab_menu.click(); } }); $(document).on("click", "[data-action=tab-menu]", function () { var $tabs = $(this) .closest(".header") .find(".content-tabs"), visible = $tabs.is(":visible"), wrap = $tabs.closest('.content-tabs-wrap'); $this = $(this); wrap.css("display", visible ? "" : "block"); $this.toggleClass('--hide', visible); if (!visible) { $tabs.data("classes", $tabs.attr("class")); $tabs.removeClass(function (index, css) { return (css.match(/\b\w+-hide/g) || []).join(" "); }); // $tabs.hide(); } if (!visible) { $this.removeClass("current"); } // $tabs[visible ? "hide" : "show"](); if (visible) { $tabs.css("display", "").addClass($tabs.data("classes")); $this.addClass("current"); } }); // On state change bind tab changes $(window).bind("statechange", function (e) { PF.fn.growl.close(); var dataTab; dataTab = History.getState().data; if (dataTab && dataTab.pushed == "tabs") { PF.fn.show_tab(dataTab["data-tab"]); } }); /** * LISTING * ------------------------------------------------------------------------------------------------- */ // Stock the scroll position on list element click $(document).on("click", PF.obj.listing.selectors.list_item + " a", function (e) { if ($(this).attr("src") == "") return; History.replaceState( { scrollTop: $(window).scrollTop() }, document.title, window.location.href ); }); // Load more (listing +1 page) $(document).on("click", "[data-action=load-more]", function (e) { if (PF.obj.listing.lockClickMore) { return; } PF.obj.listing.lockClickMore = true; $(this) .closest(".content-listing-more") .hide(); if ( !PF.fn.is_listing() || $(this) .closest(PF.obj.listing.selectors.content_listing) .is(":hidden") || $(this) .closest("#content-listing-template") .exists() || PF.obj.listing.calling ) return; PF.fn.listing.queryString.stock_new(); PF.obj.listing.query_string.seek = $(this).attr("data-seek"); PF.obj.listing.query_string.page = $( PF.obj.listing.selectors.content_listing_visible ).data("page"); PF.obj.listing.query_string.page++; PF.fn.listing.ajax(); e.preventDefault(); }); // List found on load html -> Do the columns! if ($(PF.obj.listing.selectors.list_item).length > 0) { PF.fn.listing.show(); // Bind the infinte scroll $(window).scroll(function () { var $loadMore = $( PF.obj.listing.selectors.content_listing_load_more, PF.obj.listing.selectors.content_listing_visible ).find("button[data-action=load-more]"); var toScroll = $(document).height() - $(window).height() - 1.5 * document.documentElement.clientHeight; if ( $loadMore.length > 0 && $(window).scrollTop() > toScroll && PF.obj.listing.calling == false ) { $loadMore.click(); } }); } else { $(PF.obj.listing.selectors.content_listing + ".visible").addClass("jsly"); } // Multi-selection tools $(document).on( "click", PF.obj.modal.selectors.root + " [data-switch]", function () { var $this_modal = $(this).closest(PF.obj.modal.selectors.root); $("[data-view=switchable]", $this_modal).hide(); $("#" + $(this).attr("data-switch"), $this_modal).show(); } ); $(document).on("click", "[data-toggle]", function () { var $target = $("[data-content=" + $(this).data("toggle") + "]"); var show = !$target.is(":visible"); $(this).html($(this).data("html-" + (show ? "on" : "off"))); $target.toggle(); }); // Cookie law thing $(document).on("click", "[data-action=cookie-law-close]", function () { var $cookie = $(this).closest("#cookie-law-banner"); var cookieName = typeof $cookie.data("cookie") !== typeof undefined ? $cookie.data("cookie") : "PF_COOKIE_LAW_DISPLAY"; Cookies.set(cookieName, 0, { expires: 365 }); $cookie.remove(); }); Clipboard = new Clipboard("[data-action=copy]", { text: function (trigger) { var $target = $(trigger.getAttribute("data-action-target")); var text = $target.is(":input") ? $target.val() : $target.text(); return text.trim(); } }); Clipboard.on("success", function (e) { var $target = $(e.trigger.getAttribute("data-action-target")); $target.highlight(); e.clearSelection(); }); $(window).on("fullscreenchange", function () { $("html").toggleClass("--fullscreen", document.fullscreenElement !== null); }); }); /** * PEAFOWL OBJECT * ------------------------------------------------------------------------------------------------- */ var PF = { fn: {}, str: {}, obj: {} }; /** * PEAFOWL CONFIG * ------------------------------------------------------------------------------------------------- */ PF.obj.config = { base_url: "", json_api: "/json/", listing: { items_per_page: 24 }, animation: { easingFn: "ease", normal: 400, fast: 250 } }; /** * WINDOW VARS * ------------------------------------------------------------------------------------------------- */ /** * LANGUAGE FUNCTIONS * ------------------------------------------------------------------------------------------------- */ PF.obj.l10n = {}; /** * Get lang string by key * @argument string (lang key string) */ // pf: get_pf_lang PF.fn._s = function (string, s) { var string; if (typeof string == "undefined") { return string; } if ( typeof PF.obj.l10n !== "undefined" && typeof PF.obj.l10n[string] !== "undefined" ) { string = PF.obj.l10n[string][0]; if (typeof string == "undefined") { string = string; } } else { string = string; } string = string.toString(); if (typeof s !== "undefined") { string = sprintf(string, s); } return string; }; PF.fn._n = function (singular, plural, n) { var string; if ( typeof PF.obj.l10n !== "undefined" && typeof PF.obj.l10n[singular] !== "undefined" ) { string = PF.obj.l10n[singular][n == 1 ? 0 : 1]; } else { string = n == 1 ? singular : plural; } string = typeof string == "undefined" ? singular : string.toString(); if (typeof n !== "undefined") { string = sprintf(string, n); } return string; }; /** * Extend Peafowl lang * Useful to add or replace strings * @argument strings obj */ // pf: extend_pf_lang PF.fn.extend_lang = function (strings) { $.each(PF.obj.lang_strings, function (i, v) { if (typeof strings[i] !== "undefined") { $.extend(PF.obj.lang_strings[i], strings[i]); } }); }; /** * HELPER FUNCTIONS * ------------------------------------------------------------------------------------------------- */ PF.fn.get_url_vars = function () { var match, pl = /\+/g, // Regex for replacing addition symbol with a space search = /([^&=]+)=?([^&]*)/g, decode = function (s) { return decodeURIComponent(escape(s.replace(pl, " "))); }, query = window.location.search.substring(1), urlParams = {}; while ((match = search.exec(query))) { urlParams[decode(match[1])] = decode(match[2]); } return urlParams; }; PF.fn.get_url_var = function (name) { return PF.fn.get_url_vars()[name]; }; PF.fn.is_user_logged = function () { return $("#top-bar-user").exists(); // nota: default version // It should use backend conditional }; PF.fn.generate_random_string = function (len) { if (typeof len == "undefined") len = 5; var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var i = 0; i < len; i++) { text += possible.charAt(Math.floor(Math.random() * possible.length)); } return text; }; PF.fn.getDateTime = function () { var now = new Date(); var year = now.getFullYear(); var month = now.getMonth() + 1; var day = now.getDate(); var hour = now.getHours(); var minute = now.getMinutes(); var second = now.getSeconds(); if (month.toString().length == 1) { var month = "0" + month; } if (day.toString().length == 1) { var day = "0" + day; } if (hour.toString().length == 1) { var hour = "0" + hour; } if (minute.toString().length == 1) { var minute = "0" + minute; } if (second.toString().length == 1) { var second = "0" + second; } var dateTime = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second; return dateTime; }; PF.fn.htmlEncode = function (value) { return $("<div/>") .text($.trim(value)) .html(); }; PF.fn.htmlDecode = function (value) { return $("<div/>") .html($.trim(value)) .text(); }; PF.fn.nl2br = function (str) { var breakTag = "<br>"; return (str + "").replace( /([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, "$1" + breakTag + "$2" ); }; // https://raw.githubusercontent.com/johndwells/phpjs/master/functions/info/version_compare.js PF.fn.versionCompare = function (v1, v2, operator) { this.php_js = this.php_js || {}; this.php_js.ENV = this.php_js.ENV || {}; // END REDUNDANT // Important: compare must be initialized at 0. var i = 0, x = 0, compare = 0, // vm maps textual PHP versions to negatives so they're less than 0. // PHP currently defines these as CASE-SENSITIVE. It is important to // leave these as negatives so that they can come before numerical versions // and as if no letters were there to begin with. // (1alpha is < 1 and < 1.1 but > 1dev1) // If a non-numerical value can't be mapped to this table, it receives // -7 as its value. vm = { dev: -6, alpha: -5, a: -5, beta: -4, b: -4, RC: -3, rc: -3, "#": -2, p: 1, pl: 1 }, // This function will be called to prepare each version argument. // It replaces every _, -, and + with a dot. // It surrounds any nonsequence of numbers/dots with dots. // It replaces sequences of dots with a single dot. // version_compare('4..0', '4.0') == 0 // Important: A string of 0 length needs to be converted into a value // even less than an unexisting value in vm (-7), hence [-8]. // It's also important to not strip spaces because of this. // version_compare('', ' ') == 1 prepVersion = function (v) { v = ("" + v).replace(/[_\-+]/g, "."); v = v.replace(/([^.\d]+)/g, ".$1.").replace(/\.{2,}/g, "."); return !v.length ? [-8] : v.split("."); }; // This converts a version component to a number. // Empty component becomes 0. // Non-numerical component becomes a negative number. // Numerical component becomes itself as an integer. numVersion = function (v) { return !v ? 0 : isNaN(v) ? vm[v] || -7 : parseInt(v, 10); }; v1 = prepVersion(v1); v2 = prepVersion(v2); x = Math.max(v1.length, v2.length); for (i = 0; i < x; i++) { if (v1[i] == v2[i]) { continue; } v1[i] = numVersion(v1[i]); v2[i] = numVersion(v2[i]); if (v1[i] < v2[i]) { compare = -1; break; } else if (v1[i] > v2[i]) { compare = 1; break; } } if (!operator) { return compare; } // Important: operator is CASE-SENSITIVE. // "No operator" seems to be treated as "<." // Any other values seem to make the function return null. switch (operator) { case ">": case "gt": return compare > 0; case ">=": case "ge": return compare >= 0; case "<=": case "le": return compare <= 0; case "==": case "=": case "eq": return compare === 0; case "<>": case "!=": case "ne": return compare !== 0; case "": case "<": case "lt": return compare < 0; default: return null; } }; /** * Basename * http://stackoverflow.com/questions/3820381/need-a-basename-function-in-javascript */ PF.fn.baseName = function (str) { var base = new String(str).substring(str.lastIndexOf("/") + 1); if (base.lastIndexOf(".") != -1) { base = base.substring(0, base.lastIndexOf(".")); } return base; }; // https://stackoverflow.com/a/8809472 PF.fn.guid = function () { var d = new Date().getTime(); if ( typeof performance !== "undefined" && typeof performance.now === "function" ) { d += performance.now(); //use high-precision timer if available } return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (d + Math.random() * 16) % 16 | 0; d = Math.floor(d / 16); return (c === "x" ? r : (r & 0x3) | 0x8).toString(16); }); }; PF.fn.md5 = function (string) { return SparkMD5.hash(string); }; /** * dataURI to BLOB * http://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata */ PF.fn.dataURItoBlob = function (dataURI) { // convert base64/URLEncoded data component to raw binary data held in a string var byteString; if (dataURI.split(",")[0].indexOf("base64") >= 0) { byteString = atob(dataURI.split(",")[1]); } else { byteString = unescape(dataURI.split(",")[1]); } // separate out the mime component var mimeString = dataURI .split(",")[0] .split(":")[1] .split(";")[0]; // write the bytes of the string to a typed array var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], { type: mimeString }); }; PF.fn.clean_facebook_hash = function () { if (window.location.hash == "#_=_") { window.location.hash = ""; } }; PF.fn.clean_facebook_hash(); /** * Get the min and max value from 1D array */ Array.min = function (array) { return Math.min.apply(Math, array); }; Array.max = function (array) { return Math.max.apply(Math, array); }; /** * Return the sum of all the values in a 1D array */ Array.sum = function (array) { return array.reduce(function (pv, cv) { return cv + pv; }); }; /** * Return the size of an object */ Object.size = function (obj) { var size = 0, key; for (key in obj) { if (obj.hasOwnProperty(key)) size++; } return size; }; /** * Flatten an object */ Object.flatten = function (obj, prefix) { if (typeof prefix == "undefined") { var prefix = ""; } var result = {}; $.each(obj, function (key, value) { if (value !== null && typeof value == "object") { result = $.extend({}, result, Object.flatten(value, prefix + key + "_")); } else { result[prefix + key] = value; } }); return result; }; /** * Tells if the string is a number or not */ String.prototype.isNumeric = function () { return !isNaN(parseFloat(this)) && isFinite(this); }; /** * Repeats an string */ String.prototype.repeat = function (num) { return new Array(num + 1).join(this); }; /** * Ucfirst */ String.prototype.capitalizeFirstLetter = function () { return this.charAt(0).toUpperCase() + this.slice(1); }; /** * Replace all */ String.prototype.replaceAll = function (search, replacement) { var target = this; return target.replace(new RegExp(search, "g"), replacement); }; /** * Tells if the string is a email or not */ String.prototype.isEmail = function () { var regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; return regex.test(this); }; // http://phpjs.org/functions/round/ String.prototype.getRounded = function (precision, mode) { var m, f, isHalf, sgn; // helper variables precision |= 0; // making sure precision is integer m = Math.pow(10, precision); value = this; value *= m; sgn = (value > 0) | -(value < 0); // sign of the number isHalf = value % 1 === 0.5 * sgn; f = Math.floor(value); if (isHalf) { switch (mode) { case "PHP_ROUND_HALF_DOWN": value = f + (sgn < 0); // rounds .5 toward zero break; case "PHP_ROUND_HALF_EVEN": value = f + (f % 2) * sgn; // rouds .5 towards the next even integer break; case "PHP_ROUND_HALF_ODD": value = f + !(f % 2); // rounds .5 towards the next odd integer break; default: value = f + (sgn > 0); // rounds .5 away from zero } } return (isHalf ? value : Math.round(value)) / m; }; /** * Return bytes from Size + Suffix like "10 MB" */ String.prototype.getBytes = function () { var units = ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], suffix = this.toUpperCase().substr(-2); if (units.indexOf(suffix) == -1) { return this; } var pow_factor = units.indexOf(suffix) + 1; return parseFloat(this) * Math.pow(1000, pow_factor); }; /** * Return size formatted from size bytes */ String.prototype.formatBytes = function (round) { var bytes = parseInt(this), units = ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; if (!$.isNumeric(this)) { return false; } if (bytes < 1000) return bytes + " B"; if (typeof round == "undefined") var round = 2; for (var i = 0; i < units.length; i++) { var multiplier = Math.pow(1000, i + 1), threshold = multiplier * 1000; if (bytes < threshold) { var size = bytes / multiplier; return this.getRounded.call(size, round) + " " + units[i]; } } }; /** * Returns the image url.matches (multiple) */ String.prototype.match_image_urls = function () { return this.match( /\b(?:(http[s]?|ftp[s]):\/\/)?([^:\/\s]+)(:[0-9]+)?((?:\/\w+)*\/)([\w\-\.]+[^#?\s]+)([^#\s]*)?(#[\w\-]+)?\.(?:jpe?g|gif|png|bmp|webp)\b/gim ); }; String.prototype.match_urls = function () { return this.match( /\b(?:(http[s]?|ftp[s]):\/\/)?([^:\/\s]+)(:[0-9]+)?((?:\/\w+)*\/)([\w\-\.]+[^#?\s]+)([^#\s]*)?(#[\w\-]+)?\b/gim ); }; // Add ECMA262-5 Array methods if not supported natively if (!("indexOf" in Array.prototype)) { Array.prototype.indexOf = function (find, i /*opt*/) { if (i === undefined) i = 0; if (i < 0) i += this.length; if (i < 0) i = 0; for (var n = this.length; i < n; i++) { if (i in this && this[i] === find) { return i; } } return -1; }; } /** * Removes all the array duplicates without loosing the array order. */ Array.prototype.array_unique = function () { var result = []; $.each(this, function (i, e) { if ($.inArray(e, result) == -1) result.push(e); }); return result; }; PF.fn.deparam = function (querystring) { if (typeof querystring == "undefined" || !querystring) return; // Get rid of the URL part var querystring = querystring.substring(querystring.indexOf("?") + 1); var obj = {}, pairs = querystring .replace(/^[\?|&]*/, "") .replace(/[&|\?]*$/, "") .split("&"); for (var i = 0; i < pairs.length; i++) { var split = pairs[i].split("="); var key = decodeURIComponent(split[0]); var value = split[1] ? decodeURIComponent(split[1]) : null; // Aready in the object? if (obj.hasOwnProperty(key) && !value) { continue; } obj[key] = value; } return obj; }; // http://stackoverflow.com/a/1634841/1145912 String.prototype.removeURLParameter = function (key) { var url = "", deparam = PF.fn.deparam(this); if (typeof deparam[key] !== "undefined") { delete deparam[key]; } return decodeURIComponent($.param(deparam)); }; String.prototype.changeURLParameterValue = function (key, value) { var base = this.substring(0, this.indexOf("?")); var res = ""; var deparam = PF.fn.deparam(this); if (typeof deparam[key] !== "undefined") { deparam[key] = value; } return base + "?" + decodeURIComponent($.param(deparam)); }; /** * Truncate the middle of the URL just like Firebug * From http://stackoverflow.com/questions/10903002/shorten-url-for-display-with-beginning-and-end-preserved-firebug-net-panel-st */ String.prototype.truncate_middle = function (l) { var l = typeof l != "undefined" ? l : 40, chunk_l = l / 2, url = this.replace(/https?:\/\//g, ""); if (url.length <= l) { return url; } function shortString(s, l, reverse) { var stop_chars = [" ", "/", "&"], acceptable_shortness = l * 0.8, // When to start looking for stop characters reverse = typeof reverse != "undefined" ? reverse : false, s = reverse ? s .split("") .reverse() .join("") : s, short_s = ""; for (var i = 0; i < l - 1; i++) { short_s += s[i]; if (i >= acceptable_shortness && stop_chars.indexOf(s[i]) >= 0) { break; } } if (reverse) { return short_s .split("") .reverse() .join(""); } return short_s; } return ( shortString(url, chunk_l, false) + "..." + shortString(url, chunk_l, true) ); }; /** * Compare 2 arrays/objects * http://stackoverflow.com/questions/1773069/using-jquery-to-compare-two-arrays */ jQuery.extend({ compare: function (a, b) { var obj_str = "[object Object]", arr_str = "[object Array]", a_type = Object.prototype.toString.apply(a), b_type = Object.prototype.toString.apply(b); if (a_type !== b_type) { return false; } else if (a_type === obj_str) { return $.compareObject(a, b); } else if (a_type === arr_str) { return $.compareArray(a, b); } return a === b; }, compareArray: function (arrayA, arrayB) { var a, b, i, a_type, b_type; if (arrayA === arrayB) { return true; } if (arrayA.length != arrayB.length) { return false; } a = jQuery.extend(true, [], arrayA); b = jQuery.extend(true, [], arrayB); a.sort(); b.sort(); for (i = 0, l = a.length; i < l; i += 1) { a_type = Object.prototype.toString.apply(a[i]); b_type = Object.prototype.toString.apply(b[i]); if (a_type !== b_type) { return false; } if ($.compare(a[i], b[i]) === false) { return false; } } return true; }, compareObject: function (objA, objB) { var i, a_type, b_type; // Compare if they are references to each other if (objA === objB) { return true; } if (Object.keys(objA).length !== Object.keys(objB).length) { return false; } for (i in objA) { if (objA.hasOwnProperty(i)) { if (typeof objB[i] === "undefined") { return false; } else { a_type = Object.prototype.toString.apply(objA[i]); b_type = Object.prototype.toString.apply(objB[i]); if (a_type !== b_type) { return false; } } } if ($.compare(objA[i], objB[i]) === false) { return false; } } return true; } }); /** * Tells if a selector exits in the dom */ jQuery.fn.exists = function () { return this.length > 0; }; /** * Replace .svg for .png */ jQuery.fn.replace_svg = function () { if (!this.attr("src")) return; $(this).each(function () { $(this).attr( "src", $(this) .attr("src") .replace(".svg", ".png") ); }); }; /** * Detect fluid layout * nota: deberia ir en PF */ jQuery.fn.is_fluid = function () { return true; }; /** * jQueryfy the form data * Bind the attributes and values of form data to be manipulated by DOM fn */ jQuery.fn.bindFormData = function () { $(":input", this).each(function () { var safeVal = PF.fn.htmlEncode($(this).val()); if ($(this).is("input")) { this.setAttribute("value", this.value); if (this.checked) { this.setAttribute("checked", "checked"); } else { this.removeAttribute("checked"); } } if ($(this).is("textarea")) { $(this).html(safeVal); } if ($(this).is("select")) { var index = this.selectedIndex, i = 0; $(this) .children("option") .each(function () { if (i++ != index) { this.removeAttribute("selected"); } else { this.setAttribute("selected", "selected"); } }); } }); return this; }; /** jQuery.formValues: get or set all of the name/value pairs from child input controls * @argument data {array} If included, will populate all child controls. * @returns element if data was provided, or array of values if not * http://stackoverflow.com/questions/1489486/jquery-plugin-to-serialize-a-form-and-also-restore-populate-the-form */ jQuery.fn.formValues = function (data) { var els = $(":input", this); if (typeof data != "object") { data = {}; $.each(els, function () { if ( this.name && !this.disabled && (this.checked || /select|textarea/i.test(this.nodeName) || /color|date|datetime|datetime-local|email|month|range|search|tel|time|url|week|text|number|hidden|password/i.test( this.type )) ) { if (this.name.match(/^.*\[\]$/) && this.checked) { if (typeof data[this.name] == "undefined") { data[this.name] = []; } data[this.name].push($(this).val()); } else { data[this.name] = $(this).val(); } } }); return data; } else { $.each(els, function () { if (this.name.match(/^.*\[\]$/) && typeof data[this.name] == "object") { $(this).prop("checked", data[this.name].indexOf($(this).val()) !== -1); } else { if (this.name && data[this.name]) { if (/checkbox|radio/i.test(this.type)) { $(this).prop("checked", data[this.name] == $(this).val()); } else { $(this).val(data[this.name]); } } else if (/checkbox|radio/i.test(this.type)) { $(this).removeProp("checked"); } } }); return $(this); } }; jQuery.fn.storeformData = function (dataname) { if ( typeof dataname == "undefined" && typeof $(this).attr("id") !== "undefined" ) { dataname = $(this).attr("id"); } if (typeof dataname !== "undefined") $(this).data(dataname, $(this).formValues()); return this; }; /** * Compare the $.data values against the current DOM values * It relies in using $.data to store the previous value * Data must be stored using $.formValues() * * @argument dataname string name for the data key */ jQuery.fn.is_sameformData = function (dataname) { var $this = $(this); if (typeof dataname == "undefined") dataname = $this.attr("id"); return jQuery.compare($this.formValues(), $this.data(dataname)); }; /** * Prevent non-numeric keydown * Allows only numeric keys to be entered on the target event */ jQuery.Event.prototype.keydown_numeric = function () { var e = this; if (e.shiftKey) { e.preventDefault(); return false; } var key = e.charCode || e.keyCode, target = e.target, value = $(target).val() == "" ? 0 : parseInt($(target).val()); if (key == 13) { // Allow enter key return true; } if ( key == 46 || key == 8 || key == 9 || key == 27 || // Allow: Ctrl+A (key == 65 && e.ctrlKey === true) || // Allow: home, end, left, right (key >= 35 && key <= 40) ) { // let it happen, don't do anything return true; } else { // Ensure that it is a number and stop the keypress if ((key < 48 || key > 57) && (key < 96 || key > 105)) { e.preventDefault(); } } }; /** * Detect canvas support */ PF.fn.is_canvas_supported = function () { var elem = document.createElement("canvas"); return !!(elem.getContext && elem.getContext("2d")); }; /** * Detect validity support */ PF.fn.is_validity_supported = function () { var i = document.createElement("input"); return typeof i.validity === "object"; }; PF.fn.getScrollBarWidth = function () { var inner = document.createElement("p"); inner.style.width = "100%"; inner.style.height = "200px"; var outer = document.createElement("div"); outer.style.position = "absolute"; outer.style.top = "0px"; outer.style.left = "0px"; outer.style.visibility = "hidden"; outer.style.width = "200px"; outer.style.height = "150px"; outer.style.overflow = "hidden"; outer.appendChild(inner); document.body.appendChild(outer); var w1 = inner.offsetWidth; outer.style.overflow = "scroll"; var w2 = inner.offsetWidth; if (w1 == w2) w2 = outer.clientWidth; document.body.removeChild(outer); return w1 - w2; }; PF.str.ScrollBarWidth = PF.fn.getScrollBarWidth(); /** * Updates the notifications button */ PF.fn.top_notifications_viewed = function () { var $top_bar_notifications = $("[data-action=top-bar-notifications]"), $notifications_lists = $( ".top-bar-notifications-list", $top_bar_notifications ), $notifications_count = $(".top-btn-number", $top_bar_notifications); if ($(".persistent", $top_bar_notifications).exists()) { $notifications_count .text($(".persistent", $top_bar_notifications).length) .addClass("on"); } else { $notifications_count.removeClass("on"); } }; /** * bind tipTip for the $target with options * @argument $target selector or jQuery obj * @argument options obj */ PF.fn.bindtipTip = function ($target, options) { if (typeof $target == "undefined") $target = $("body"); if ($target instanceof jQuery == false) $target = $($target); var bindtipTipoptions = { delay: 0, content: false, fadeIn: 0 }; if (typeof options !== "undefined") { if (typeof options.delay !== "undefined") bindtipTipoptions.delay = options.delay; if (typeof options.content !== "undefined") bindtipTipoptions.content = options.content; if (typeof options.content !== "undefined") bindtipTipoptions.fadeIn = options.fadeIn; } if ($target.attr("rel") !== "tooltip") $target = $("[rel=tooltip]", $target); $target.each(function () { if ( (typeof $(this).attr("href") !== "undefined" || typeof $(this).data("href") !== "undefined") && PF.fn.isDevice(["phone", "phablet", "tablet"]) ) { return true; } var position = typeof $(this).data("tiptip") == "undefined" ? "bottom" : $(this).data("tiptip"); if (PF.fn.isDevice(["phone", "phablet"])) { position = "top"; } $(this).tipTip({ delay: bindtipTipoptions.delay, defaultPosition: position, content: bindtipTipoptions.content, fadeIn: bindtipTipoptions.fadeIn, fadeOut: 0 }); }); }; /** * form modal changed * Detects if the form modal (fullscreen) has changed or not * Note: It relies in that you save a serialized data to the */ PF.fn.form_modal_has_changed = function () { if ($(PF.obj.modal.selectors.root).is(":hidden")) return; if (typeof $("html").data("modal-form-values") == typeof undefined) return; var data_stored = $("html").data("modal-form-values"); var data_modal = PF.fn.deparam( $(":input:visible", PF.obj.modal.selectors.root).serialize() ); var has_changed = false; var keys = $.extend({}, data_stored, data_modal); for (var k in keys) { if (data_stored[k] !== data_modal[k]) { has_changed = true; break; } } return has_changed; }; /** * PEAFOWL CONDITIONALS * ------------------------------------------------------------------------------------------------- */ PF.fn.is_listing = function () { return $(PF.obj.listing.selectors.content_listing).exists(); }; PF.fn.is_tabs = function () { return $(".content-tabs").exists(); }; /** * PEAFOWL EFFECTS * ------------------------------------------------------------------------------------------------- */ /** * Shake effect * Shakes the element using CSS animations. * @argument callback fn */ jQuery.fn.shake = function (callback) { this.each(function (init) { var $this = $(this); $this.addClass("animate shake") .promise() .done(function () { setTimeout(function () { $this.removeClass("shake") }, 820); }); }); if (typeof callback == "function") callback(); return this; }; /** * Highlight effect * Changes the background of the element to a highlight color and revert to original * @argument string (yellow|red|hex-color) */ jQuery.fn.highlight = function (color) { if (this.is(":animated") || !this.exists()) return this; if (typeof color == "undefined") color = "yellow"; var fadecolor = color; switch (color) { case "yellow": fadecolor = "#FFFBA2"; break; case "red": fadecolor = "#FF7F7F"; break; default: fadecolor = color; break; } var base_background_color = $(this).css("background-color"), base_background = $(this).css("background"); $(this) .css({ background: "", backgroundColor: fadecolor }) .animate({ backgroundColor: base_background_color}, 1000, function () { $(this).css("background", ""); }); return this; }; /** * Peafowl slidedown effect * Bring the element using slideDown-type effect * @argument speed (fast|normal|slow|int) * @argument callback fn */ jQuery.fn.pf_slideDown = function (speed, callback) { var default_speed = "normal", this_length = $(this).length, css_prechanges, css_animation, animation_speed; if (typeof speed == "function") { callback = speed; speed = default_speed; } if (typeof speed == "undefined") { speed = default_speed; } $(this).each(function (index) { var this_css_top = parseInt($(this).css("top")), to_top = this_css_top > 0 ? this_css_top : 0; if (speed == 0) { (css_prechanges = { display: "block", opacity: 0 }), (css_animation = { opacity: 1 }), (animation_speed = jQuery.speed("fast").duration); } else { css_prechanges = { top: -$(this).outerHeight(true), opacity: 1, display: "block" }; css_animation = { top: to_top }; animation_speed = jQuery.speed(speed).duration; } $(this).data("originalTop", $(this).css("top")); $(this) .css(css_prechanges) .animate(css_animation, animation_speed, function () { if (index == this_length - 1) { if (typeof callback == "function") { callback(); } } }); }); return this; }; /** * Peafowl slideUp effect * Move the element using slideUp-type effect * @argument speed (fast|normal|slow|int) * @argument callback fn */ jQuery.fn.pf_slideUp = function (speed, callback) { var default_speed = "normal", this_length = $(this).length; if (typeof speed == "function") { callback = speed; speed = default_speed; } if (typeof speed == "undefined") { speed = default_speed; } $(this).each(function (index) { $(this).animate( { top: -$(this).outerHeight(true) }, jQuery.speed(speed).duration, function () { $(this).css({ display: "none", top: $(this).data("originalTop") }); if (index == this_length - 1) { if (typeof callback == "function") { callback(); } } } ); }); return this; }; jQuery.fn.is_in_viewport = function () { var rect = $(this)[0].getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); }; jQuery.fn.is_within_viewport = function (height) { var rect = $(this)[0].getBoundingClientRect(); if (typeof height == "undefined") { height = 0; } return ( rect.top >= 0 && rect.left >= 0 && (rect.top + height) <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); }; /** * Visible on current window stuff */ jQuery.fn.getWindowCutoff = function () { var rect = { top: $(this).offset().top, left: $(this).offset().left, width: $(this).outerWidth(), height: $(this).outerHeight() }; rect.right = rect.left + rect.width; rect.bottom = rect.top + rect.height; var detected = false; var cutoff = { top: rect.top > 0 ? 0 : rect.top, right: document.body.clientWidth - rect.right, bottom: document.body.clientHeight - rect.bottom, left: rect.left > 0 ? 0 : rect.left }; for (var key in cutoff) { if (cutoff[key] < 0) { detected = true; } else { cutoff[key] = 0; } } if (!detected) return null; return cutoff; }; /** * Scroll the window to the target. * @argument target selector * @argument callback fn */ PF.fn.scroll = function (target, callback) { if (typeof target == "function") { var callback = target, target = ""; } var pxtop = parseInt($("body").css("margin-top")); if (pxtop == 0 && $(".top-bar-placeholder").exists()) { pxtop = $(".top-bar-placeholder").height(); } if (!$(target).exists()) target = "html"; $("body,html").animate( { scrollTop: $(target).offset().top - pxtop }, "normal", function () { if (typeof callback == "function") callback(); } ); }; PF.fn.close_pops = function (e) { $(".pop-box:visible").each(function () { $(this).closest(".pop-btn").trigger("click"); }); }; /** * Bring up a nice growl-like alert */ PF.fn.growl = { selectors: { root: "#growl" }, str: { timeout: null, timeoutcall: false }, /** * Fires the growl * @argument options object */ call: function (options) { if (typeof options == "undefined") return; if (typeof options == "string") { options = { message: options }; } if (typeof options.message == "undefined") return; var growl_options, $growl, growl_class, growl_color; growl_options = { message: options.message, insertTo: "body", where: "before", color: "default", css: {}, classes: "", expires: 0, callback: function () { } }; for (key in growl_options) { if (typeof options[key] !== "undefined") { if (key.match("/^(callback)$/")) { if (typeof options[key] == "function") { growl_options[key] = options[key]; } } else { growl_options[key] = options[key]; } } } if (!$(growl_options.insertTo).exists()) { growl_options.insertTo = "body"; } if ($(PF.fn.growl.selectors.root).exists()) { if ($(PF.fn.growl.selectors.root).text() == growl_options.message) { $(PF.fn.growl.selectors.root).shake(); return; } $(PF.fn.growl.selectors.root).remove(); } $growl = $( '<div id="' + PF.fn.growl.selectors.root.replace("#", "") + '" class="growl animated">' + growl_options.message + '<span class="icon fas fa-times" data-action="close"></span></div>' ) .css(growl_options.css) .addClass(growl_options.classes); growl_class = growl_options.insertTo !== "body" ? "static" : ""; switch (growl_options.color) { case "dark": growl_color = "dark"; break; default: growl_color = ""; break; } $growl.addClass(growl_class + " " + growl_color); if (growl_options.where == "before") { $(growl_options.insertTo).prepend($growl.hide()); } else { $(growl_options.insertTo).append($growl.hide()); } $growl.pf_slideDown(growl_class == "static" ? 0 : 200, function () { if (typeof growl_options.callback == "function") { growl_options.callback(); } }); $(document).on("click", ".growl", function (e) { if ( PF.fn.isDevice(["phone", "phablet"]) || $(e.target).is("[data-action=close]") ) { PF.fn.growl.close(true); } }); if (growl_options.expires > 0) { if (typeof this.str.timeout == "number") { clearTimeout(this.str.timeout); } this.str.timeout = setTimeout(function () { PF.fn.growl.str.timeoutcall = true; PF.fn.growl.close(); }, growl_options.expires); } }, /** * Fires an expirable growl (will close after time) * @argument msg string * @argument time int (ms) */ expirable: function (msg, time) { if (typeof msg == "undefined") return; if (typeof time == "undefined") time = 5000; PF.fn.growl.call({ message: msg, expires: time }); }, /** * Closes the growl * @argument callback fn */ close: function (forced, callback) { var $growl = $(PF.fn.growl.selectors.root); if (forced) { this.str.timeout = null; this.str.timeoutcall = false; clearTimeout(this.str.timeout); } if ( !$growl.exists() || (typeof this.str.timeout == "number" && !this.str.timeoutcall) ) { return; } $growl.fadeOut("fast", function () { $(this).remove(); if (typeof callback == "function") { callback(); } }); }, }; /** * Bring up a nice fullscreen modal */ PF.obj.modal = { type: "", selectors: { root: "#fullscreen-modal", box: "#fullscreen-modal-box", body: "#fullscreen-modal-body", login: "[data-modal=login]", changes_confirm: "#fullscreen-changes-confirm", btn_container: ".btn-container", close_buttons: ".close-modal,.cancel-modal,[data-action=cancel],[data-action-close]", submit_button: "[data-action=submit]", growl_placeholder: "#fullscreen-growl-placeholder" }, ajax: { url: "", deferred: {} }, locked: false, form_data: {}, XHR: {}, prevented: false }; PF.obj.modal.$close_buttons = $( PF.obj.modal.selectors.close_buttons, PF.obj.modal.selectors.root ); PF.fn.modal = { str: { transition: "all " + PF.obj.config.animation.fast + "ms " + PF.obj.config.animation.easingFn }, /** * Fires the modal * @argument options object */ call: function (options) { var modal_options, modal_base_template, modal_message; if (typeof options == "undefined") return; if ( typeof options.template !== "undefined" && typeof options.type == "undefined" ) options.type = "html"; if ( (typeof options.title == "undefined" || typeof options.message == "undefined") && (options.type !== "login" && options.type !== "html") ) return; PF.fn.growl.close(); modal_options = { forced: false, type: "confirm", title: options.title, message: options.message, html: false, template: options.template, buttons: true, button_submit: PF.fn._s("Submit"), txt_or: PF.fn._s("or"), button_cancel: PF.fn._s("cancel"), ajax: { url: null, data: null, deferred: {} }, confirm: function () { }, cancel: function () { PF.fn.modal.close(); }, load: function () { }, callback: function () { } }; for (key in modal_options) { if (typeof options[key] !== "undefined") { if (/^cancel|confirm|callback$/.test(key)) { if (typeof options[key] == "function") { modal_options[key] = options[key]; } } else { modal_options[key] = options[key]; } } } if ( typeof options.ajax !== "undefined" && !options.ajax.url && options.ajax.deferred ) { modal_options.ajax.url = PF.obj.config.json_api; } if (modal_options.type == "login") { modal_options.buttons = false; } if (modal_options.type == "confirm") { modal_options.button_submit = PF.fn._s("Confirm"); } var overlay_background = "black"; var modal_base_template = [ '<div id="', PF.obj.modal.selectors.root.replace("#", ""), '"class="fullscreen ' + overlay_background + '"><div id="', PF.obj.modal.selectors.box.replace("#", ""), '"class="clickable"><div id="', PF.obj.modal.selectors.body.replace("#", ""), '">%MODAL_BODY%</div>%MODAL_BUTTONS%<span class="close-modal icon--close fas fa-times" data-action="close-modal" title="Esc"></span></div></div>' ].join(""); var modal_buttons = modal_options.buttons ? [ '<div class="', PF.obj.modal.selectors.btn_container.replace(".", ""), '"><button class="btn btn-input accent" data-action="submit" type="submit" title="Ctrl/Cmd + Enter">', '<span class="btn-icon fas fa-check-circle user-select-none"></span>', '<span class="btn-text user-select-none">', modal_options.button_submit, '</span>', '</button></div>' ].join("") : ""; if (modal_options.type == "login") { modal_options.template = typeof modal_options.template == "undefined" ? $(PF.obj.modal.selectors.login).html() : modal_options.template; } var modalBodyHTML; switch (modal_options.type) { case "html": case "login": modalBodyHTML = modal_options.template; break; case "confirm": default: modal_message = modal_options.message; if (!modal_options.html) { modal_message = "<p>" + modal_message + "</p>"; } modalBodyHTML = "<h1>" + modal_options.title + "</h1>" + modal_message; break; } if (typeof modalBodyHTML == "undefined") { console.log("PF Error: Modal content is empty"); return; } modal_base_template = modal_base_template .replace("%MODAL_BODY%", modalBodyHTML) .replace("%MODAL_BUTTONS%", modal_buttons) .replace(/template-tooltip/g, "tooltip"); $(PF.obj.modal.selectors.root).remove(); $("body").data("hasOverflowHidden", $("body").hasClass("overflow-hidden") && !$("body").hasClass("pop-box-show")); $("body") .prepend(modal_base_template) .addClass("overflow-hidden"); this.fixScrollbars(); $("[rel=tooltip]", PF.obj.modal.selectors.root).each(function () { PF.fn.bindtipTip(this, { content: $(this).data("title") }); }); if ( $( ":button, input[type=submit], input[type=reset]", PF.obj.modal.selectors.root ).length > 0 ) { var $form = $("form", PF.obj.modal.selectors.root); if ($form.exists()) { $form.append( $( $( PF.obj.modal.selectors.btn_container, PF.obj.modal.selectors.root ).html() ).wrapInner(PF.obj.modal.selectors.btn_container.replace(".", "")) ); $( PF.obj.modal.selectors.btn_container, PF.obj.modal.selectors.root ).each(function () { if ( !$(this) .closest("form") .exists() ) { $(this).remove(); } }); } else { $(PF.obj.modal.selectors.box, PF.obj.modal.selectors.root).wrapInner( "<form />" ); } } modal_options.callback(); $(PF.obj.modal.selectors.box).css({ transform: "scale(0.7)", opacity: 0, transition: PF.fn.modal.str.transition }); $(PF.obj.modal.selectors.root).addClass("--show"); setTimeout(function () { $(PF.obj.modal.selectors.root).css({ opacity: 1 }); $(PF.obj.modal.selectors.box).css({ transform: "scale(1)", opacity: 1 }); if (typeof PFrecaptchaCallback !== typeof undefined) { PFrecaptchaCallback(); } setTimeout(function () { $("html").data( "modal-form-values", PF.fn.deparam( $(":input:visible", PF.obj.modal.selectors.root).serialize() ) ); if (typeof modal_options.load == "function") { modal_options.load(); } }, PF.obj.config.animation.fast); PF.fn.modal.styleAware(); }, 10); $(PF.obj.modal.selectors.root).on("click", function (e) { var $this = $(e.target), _this = this; if (PF.obj.modal.locked || $this.is(PF.obj.modal.selectors.root)) { return; } var isCloseButton = $this.is(PF.obj.modal.selectors.close_buttons) || $this.closest(PF.obj.modal.selectors.close_buttons).exists(); var isSubmitButton = $this.is(PF.obj.modal.selectors.submit_button) || $this.closest(PF.obj.modal.selectors.submit_button).exists(); var isButton = isCloseButton || isSubmitButton; if ( $this.closest(PF.obj.modal.selectors.changes_confirm).exists() && isButton ) { $(PF.obj.modal.selectors.changes_confirm).remove(); if (isCloseButton) { $(PF.obj.modal.selectors.box, _this).fadeIn("fast", function () { $(this).css("transition", PF.fn.modal.str.transition); }); } else { PF.fn.modal.close(); } } else { if ( !$this.closest(".clickable").exists() || isCloseButton ) { PF.fn.growl.close(); modal_options.cancel(); } if (isSubmitButton) { if (modal_options.confirm() === false) { return; } var modal_submit_continue = true; if ( $("input, textarea, select", PF.obj.modal.selectors.root).not( ":input[type=button], :input[type=submit], :input[type=reset]" ).length > 0 && !PF.fn.form_modal_has_changed() && !modal_options.forced ) { modal_submit_continue = false; } if (modal_submit_continue) { if (modal_options.ajax.url) { var $btn_container = $( PF.obj.modal.selectors.btn_container, PF.obj.modal.selectors.root ); PF.obj.modal.locked = true; $btn_container .first() .clone() .height($btn_container.height()) .html("") .addClass("loading") .appendTo(PF.obj.modal.selectors.root + " form"); $btn_container.hide(); PF.obj.modal.$close_buttons.hide(); var modal_loading_msg; switch (PF.obj.modal.type) { case "edit": modal_loading_msg = PF.fn._s("Saving"); break; case "confirm": case "form": default: modal_loading_msg = PF.fn._s("Sending"); break; } PF.fn.loading.inline( $( PF.obj.modal.selectors.btn_container + ".loading", PF.obj.modal.selectors.root ), { size: "small", message: modal_loading_msg, valign: "center" } ); $(PF.obj.modal.selectors.root).disableForm(); if ( !$.isEmptyObject(PF.obj.modal.form_data) || (typeof options.ajax !== "undefined" && typeof options.ajax.data == "undefined") ) { modal_options.ajax.data = PF.obj.modal.form_data; } PF.obj.modal.XHR = $.ajax({ url: modal_options.ajax.url, type: "POST", data: modal_options.ajax.data //PF.obj.modal.form_data // $.param ? }).complete(function (XHR) { PF.obj.modal.locked = false; if (XHR.status == 200) { var success_fn = typeof modal_options.ajax.deferred !== "undefined" && typeof modal_options.ajax.deferred.success !== "undefined" ? modal_options.ajax.deferred.success : null; if (typeof success_fn == "function") { PF.fn.modal.close(function () { if (typeof success_fn == "function") { success_fn(XHR); } }); } else if (typeof success_fn == "object") { if (typeof success_fn.before == "function") { success_fn.before(XHR); } if (typeof success_fn.done == "function") { success_fn.done(XHR); } } } else { $(PF.obj.modal.selectors.root).enableForm(); $( PF.obj.modal.selectors.btn_container + ".loading", PF.obj.modal.selectors.root ).remove(); $btn_container.css("display", ""); if ( typeof modal_options.ajax.deferred !== "undefined" && typeof modal_options.ajax.deferred.error == "function" ) { modal_options.ajax.deferred.error(XHR); } else { var message = PF.fn._s( "An error occurred. Please try again later." ); if(XHR.responseJSON.error.message) { message = XHR.responseJSON.error.message; } PF.fn.growl.call(message); } } }); } else { // No ajax behaviour PF.fn.modal.close(modal_options.callback()); } } } } }); }, styleAware: function () { if(!$(PF.obj.modal.selectors.root).exists()) { return; } $(PF.obj.modal.selectors.root) .toggleClass( "--has-scrollbar", $(PF.obj.modal.selectors.root).hasScrollbar().vertical ); }, /** * Fires a confirm modal * @argument options object */ confirm: function (options) { options.type = "confirm"; if (typeof options.title == "undefined") { options.title = PF.fn._s("Confirm action"); } PF.fn.modal.call(options); }, /** * Fires a simple info modal */ simple: function (options) { if (typeof options == "string") options = { message: options }; if (typeof options.buttons == "undefined") options.buttons = false; if (typeof options.title == "undefined") options.title = PF.fn._s("information"); PF.fn.modal.call(options); }, fixScrollbars: function () { if (!$(PF.obj.modal.selectors.root).exists()) { return; } var $targets = { padding: $(".fixed, .position-fixed"), margin: $("html") }; var properties = {}; if ( PF.str.ScrollBarWidth > 0 && $("html").hasScrollbar().vertical && !$("body").data("hasOverflowHidden") ) { properties.padding = PF.str.ScrollBarWidth + "px"; properties.margin = PF.str.ScrollBarWidth + "px"; } else { properties.padding = ""; properties.margin = ""; } $targets.padding.css({ paddingRight: properties.padding }); $targets.margin.css({ marginRight: properties.margin }); }, /** * Closes the modal * @argument callback fn */ close: function (callback) { if (!$(PF.obj.modal.selectors.root).exists()) { return; } PF.fn.growl.close(true); $("[rel=tooltip]", PF.obj.modal.selectors.root).tipTip("hide"); $(PF.obj.modal.selectors.box).css({ transform: "scale(0.5)", opacity: 0 }); $(PF.obj.modal.selectors.root).css({ opacity: 0 }); setTimeout(function () { if (PF.str.ScrollBarWidth > 0 && $("html").hasScrollbar().vertical) { $(".fixed, .position-fixed").css({ paddingRight: "" }); } $("html").css({ marginRight: "" }); if (!$("body").data("hasOverflowHidden")) { $("html,body").removeClass("overflow-hidden"); } $("body").removeData("hasOverflowHidden"); $(PF.obj.modal.selectors.root).remove(); if (typeof callback == "function") callback(); }, PF.obj.config.animation.normal); } }; PF.fn.keyFeedback = { enabled: true, timeout: { spawn: null, remove: null, }, selectors: { root: "#key-feedback", }, translate: { "ArrowLeft": "◄", "ArrowRight": "►", "Delete": "Del", "Escape": "Esc", }, spawn: function(e) { if(this.enabled == false || PF.fn.isDevice(["phone", "phablet"])) { return; } var $el = $(PF.fn.keyFeedback.selectors.root); if(!$el.exists()) { $('body').append($('<div></div>').attr({id: "key-feedback", class: "key-feedback"})); $el = $(PF.fn.keyFeedback.selectors.root) } var message = []; if((e.ctrlKey || e.metaKey) && e.originalEvent.code === 'KeyV') { e = { type: "keydown", key: PF.fn._s("Paste") }; } if(e.type === "contextmenu" && e.ctrlKey) { e.type = "click"; } if(e.type === "contextmenu") { message.push(PF.fn._s("Right click")); } else { if(e.ctrlKey) { message.push('Ctrl'); } if(e.metaKey) { message.push('⌘'); } if(e.hasOwnProperty("key")) { var key = e.key.length === 1 ? e.key.toUpperCase() : e.key; if(key in this.translate) { key = this.translate[key]; } message.push(key); } } if(e.type === "click") { message.push("click"); } $el.html(message.join(" + ", message)).css("opacity", 1); clearTimeout(PF.fn.keyFeedback.timeout.spawn); clearTimeout(PF.fn.keyFeedback.timeout.remove); PF.fn.keyFeedback.timeout.spawn = setTimeout(function() { $el.css("opacity", 0); PF.fn.keyFeedback.timeout.remove = setTimeout(function() { $el.remove(); }, 500) }, 1500); }, }; PF.fn.popup = function (options) { var settings = { height: options.height || 500, width: options.width || 650, scrollTo: 0, resizable: 0, scrollbars: 0, location: 0 }; settings.top = screen.height / 2 - settings.height / 2; settings.left = screen.width / 2 - settings.width / 2; var settings_ = ""; for (var key in settings) { settings_ += key + "=" + settings[key] + ","; } settings_ = settings_.slice(0, -1); // remove the last comma window.open(options.href, "Popup", settings_); return; }; /** * PEAFOWL FLUID WIDTH FIXER * ------------------------------------------------------------------------------------------------- */ PF.fn.list_fluid_width = function () { if (!$("body").is_fluid()) return; var $content_listing = $(PF.obj.listing.selectors.content_listing_visible), $pad_content_listing = $( PF.obj.listing.selectors.pad_content, $content_listing ), $list_item = $(PF.obj.listing.selectors.list_item, $content_listing), list_item_width = $list_item.outerWidth(true), list_item_gutter = $list_item.outerWidth(true) - $list_item.width(); PF.obj.listing.content_listing_ratio = parseInt( ($content_listing.width() + list_item_gutter) / list_item_width ); if ($list_item.length < PF.obj.listing.content_listing_ratio) { $pad_content_listing.css("width", "100%"); return; } }; /** * PEAFOWL TABS * ------------------------------------------------------------------------------------------------- */ PF.obj.tabs = { hashdata: {} }; PF.fn.show_tab = function (tab) { if (typeof tab == "undefined") return; var $this = $("a[data-tab=" + tab + "]", ".content-tabs"); $("li", $this.closest("ul")).removeClass("current"); $this.closest("li").addClass("current"); var $tab_content_group = $("#tabbed-content-group"); $target = $("#" + $this.data("tab")); $(".tabbed-content", $tab_content_group) .removeClass("visible") .addClass("hidden"); $($target, $tab_content_group) .addClass("visible") .removeClass("hidden"); $("[data-content=list-selection]") .addClass("hidden"); $("[data-content=list-selection][data-tab=" + $this.data("tab") + "]") .removeClass("hidden"); if ($tab_content_group.exists()) { var $list_item_target = $( PF.obj.listing.selectors.list_item + ":not(.jsly)", $target ); if ( $target.data("load") == "ajax" && $target.data("empty") !== "true" && !$(PF.obj.listing.selectors.list_item, $target).exists() ) { PF.fn.listing.queryString.stock_load(); $target.html(PF.obj.listing.template.fill); // PF.fn.loading.inline( // $(PF.obj.listing.selectors.content_listing_loading, $target) // ); PF.fn.listing.queryString.stock_new(); PF.fn.listing.ajax(); $target.addClass("jsly"); } else { PF.fn.listing.queryString.stock_current(); PF.fn.listing.columnizer(false, 0, false); $list_item_target.show(); } } PF.fn.listing.columnizerQueue(); if ( $(PF.obj.listing.selectors.content_listing_visible).data("queued") == true ) { PF.fn.listing.columnizer(true, 0); } }; /** * PEAFOWL LISTINGS * ------------------------------------------------------------------------------------------------- */ PF.obj.listing = { columns: "", columns_number: 1, current_column: "", current_column: "", XHR: {}, query_string: PF.fn.get_url_vars(), calling: false, content_listing_ratio: 1, selectors: { sort: ".sort-listing .current [data-sort]", content_listing: ".content-listing", content_listing_visible: ".content-listing:visible", content_listing_loading: ".content-listing-loading", content_listing_load_more: ".content-listing-more", content_listing_pagination: ".content-listing-pagination", empty_icon: ".icon.fas.fa-inbox", pad_content: ".pad-content-listing", list_item: ".list-item" }, template: { fill: $("[data-template=content-listing]").html(), empty: $("[data-template=content-listing-empty]").html(), loading: $("[data-template=content-listing-loading]").html() } }; PF.fn.listing = {}; PF.fn.listing.show = function (response, callback) { $content_listing = $("#content-listing-tabs").exists() ? $( PF.obj.listing.selectors.content_listing_visible, "#content-listing-tabs" ) : $(PF.obj.listing.selectors.content_listing); PF.fn.loading.inline(PF.obj.listing.selectors.content_listing_loading); var $targets = $( PF.obj.listing.selectors.list_item, $content_listing ); if ( (typeof response !== "undefined" && $(response.html).length < PF.obj.config.listing.items_per_page) || $(PF.obj.listing.selectors.list_item, $content_listing).length < PF.obj.config.listing.items_per_page ) { PF.fn.listing.removeLoader($content_listing); } if ( $( PF.obj.listing.selectors.content_listing_pagination, $content_listing ).is("[data-type=classic]") || !$("[data-action=load-more]", $content_listing).exists() ) { $( PF.obj.listing.selectors.content_listing_loading, $content_listing ).remove(); } PF.fn.listing.columnizer(false, 0); $targets.show(); PF.fn.listing.columnizer(true, 0); $targets.addClass("--show"); PF.obj.listing.calling = false; var visible_loading = $( PF.obj.listing.selectors.content_listing_loading, $content_listing ).exists() && $( PF.obj.listing.selectors.content_listing_loading, $content_listing ).is_in_viewport(); if (typeof PF.obj.listing.show_load_more == typeof undefined) { } PF.obj.listing.show_load_more = visible_loading; $(PF.obj.listing.selectors.content_listing_loading, $content_listing)[ (visible_loading ? "add" : "remove") + "Class" ]("hidden"); $(PF.obj.listing.selectors.content_listing_load_more, $content_listing)[ PF.obj.listing.show_load_more ? "show" : "hide" ](); if (PF.obj.listing.lockClickMore) { PF.obj.listing.lockClickMore = false; } if (typeof callback == "function") { callback(); } }; PF.fn.listing.removeLoader = function (obj) { var remove = [ PF.obj.listing.selectors.content_listing_load_more, PF.obj.listing.selectors.content_listing_loading ]; if ( $(PF.obj.listing.selectors.content_listing_pagination, $content_listing).is( "[data-type=endless]" ) ) { remove.push(PF.obj.listing.selectors.content_listing_pagination); } $.each(remove, function (i, v) { $(v, obj).remove(); }); }; PF.fn.listing.queryString = { // Stock the querystring values from initial load stock_load: function () { var $content_listing = $(PF.obj.listing.selectors.content_listing_visible), params = PF.fn.deparam($content_listing.data("params")); PF.obj.listing.params_hidden = typeof $content_listing.data("params-hidden") !== "undefined" ? PF.fn.deparam($content_listing.data("params-hidden")) : null; if (typeof PF.obj.listing.query_string.action == "undefined") { PF.obj.listing.query_string.action = $content_listing.data("action") || "list"; } if (typeof PF.obj.listing.query_string.list == "undefined") { PF.obj.listing.query_string.list = $content_listing.data("list"); } if (typeof PF.obj.listing.query_string.sort == "undefined") { if (typeof params !== "undefined" && typeof params.sort !== "undefined") { PF.obj.listing.query_string.sort = params.sort; } else { PF.obj.listing.query_string.sort = $( ":visible" + PF.obj.listing.selectors.sort ).data("sort"); } } if (typeof PF.obj.listing.query_string.page == "undefined") { PF.obj.listing.query_string.page = 1; } $content_listing.data("page", PF.obj.listing.query_string.page); // Stock the real ajaxed hrefs for ajax loads $(PF.obj.listing.selectors.content_listing + "[data-load=ajax]").each( function () { var $sortable_switch = $( "[data-tab=" + $(this).attr("id") + "]" + PF.obj.listing.selectors.sort ); var dataParams = PF.fn.deparam($(this).data("params")), dataParamsHidden = PF.fn.deparam($(this).data("params-hidden")), params = { q: dataParams && dataParams.q ? dataParams.q : null, list: $(this).data("list"), sort: $sortable_switch.exists() ? $sortable_switch.data("sort") : dataParams && dataParams.sort ? dataParams.sort : null, page: dataParams && dataParams.page ? dataParams.page : 1 }; if (dataParamsHidden && dataParamsHidden.list) { delete params.list; } for (var k in params) { if (!params[k]) delete params[k]; } } ); // The additional params setted in data-params="" for (var k in params) { if (/action|list|sort|page/.test(k) == false) { PF.obj.listing.query_string[k] = params[k]; } } if (typeof PF.obj.listing.params_hidden !== typeof undefined) { // The additional params setted in data-hidden-params="" for (var k in PF.obj.listing.params_hidden) { if (/action|list|sort|page/.test(k) == false) { PF.obj.listing.query_string[k] = PF.obj.listing.params_hidden[k]; } } PF.obj.listing.query_string["params_hidden"] = PF.obj.listing.params_hidden; PF.obj.listing.params_hidden["params_hidden"] = null; // Add this key for legacy, params_hidden v3.9.0 intro* } }, stock_new: function () { var $content_listing = $(PF.obj.listing.selectors.content_listing_visible), params = PF.fn.deparam($content_listing.data("params")); if ($content_listing.data("offset")) { PF.obj.listing.query_string.offset = $content_listing.data("offset"); } else { delete PF.obj.listing.query_string.offset; } PF.obj.listing.query_string.seek = ''; PF.obj.listing.query_string.action = $content_listing.data("action") || "list"; PF.obj.listing.query_string.list = $content_listing.data("list"); if (typeof params !== "undefined" && typeof params.sort !== "undefined") { PF.obj.listing.query_string.sort = params.sort; } else { PF.obj.listing.query_string.sort = $( ":visible" + PF.obj.listing.selectors.sort ).data("sort"); } PF.obj.listing.query_string.page = 1; }, // Stock querystring values for static tab change stock_current: function () { this.stock_new(); PF.obj.listing.query_string.page = $( PF.obj.listing.selectors.content_listing_visible ).data("page"); } }; // Initial load -> Stock the current querystring PF.fn.listing.queryString.stock_load(); PF.fn.listing.ajax = function () { if (PF.obj.listing.calling == true) { return; } PF.obj.listing.calling = true; var $content_listing = $(PF.obj.listing.selectors.content_listing_visible); var $pad_content_listing = $( PF.obj.listing.selectors.pad_content, $content_listing ); var $content_listing_load_more = $( PF.obj.listing.selectors.content_listing_load_more, $content_listing ); $content_listing_load_more.hide(); $(PF.obj.listing.selectors.content_listing_loading, $content_listing) .removeClass("visibility-hidden") .show(); PF.obj.listing.XHR = $.ajax({ type: "POST", data: $.param( $.extend({}, PF.obj.listing.query_string, $.ajaxSettings.data) ) }).complete(function (XHR) { var response = XHR.responseJSON; var removePagination = function () { $( PF.obj.listing.selectors.content_listing_loading + "," + PF.obj.listing.selectors.content_listing_pagination + ":not([data-visibility=visible])", $content_listing ).remove(); }, setEmptyTemplate = function () { $content_listing .data("empty", "true") .html(PF.obj.listing.template.empty); $( "[data-content=list-selection][data-tab=" + $content_listing.attr("id") + "]" ).addClass("disabled"); }; if (XHR.readyState == 4 && typeof response !== "undefined") { $( "[data-content=list-selection][data-tab=" + $content_listing.attr("id") + "]" ).removeClass("disabled"); // Bad Request Bad Request what you gonna do when they come for ya? if (XHR.status !== 200) { // This is here to inherit the emptys var response_output = typeof response.error !== "undefined" && typeof response.error.message !== "undefined" ? response.error.message : "Bad request"; PF.fn.growl.call("Error: " + response_output); $content_listing.data("load", ""); } // Empty HTML if ( (typeof response.html == "undefined" || response.html == "") && $(PF.obj.listing.selectors.list_item, $content_listing).length == 0 ) { setEmptyTemplate(); } // End of the line if (typeof response.html == "undefined" || response.html == "") { removePagination(); PF.obj.listing.calling = false; if (typeof PF.fn.listing_end == "function") { PF.fn.listing_end(); } return; } // Listing stuff $content_listing.data({ load: "", page: PF.obj.listing.query_string.page }); var url_object = $.extend({}, PF.obj.listing.query_string); for (var k in PF.obj.listing.params_hidden) { if (typeof url_object[k] !== "undefined") { delete url_object[k]; } } delete url_object["action"]; for (var k in url_object) { if (!url_object[k]) delete url_object[k]; } // get the fancy URL with scrollTop attached if (document.URL.indexOf("?" + $.param(url_object)) == -1) { var url = window.location.href; url = url.split("?")[0].replace(/\/$/, "") + "/?" + $.param(url_object); if (window.location.hash) { url = url.replace(window.location.hash, ""); } History.pushState( { pushed: "pagination", scrollTop: $(window).scrollTop() }, document.title, url ); } $("a[data-tab=" + $content_listing.attr("id") + "]").attr( "href", document.URL ); $pad_content_listing.append(response.html); var $loadMore = $(PF.obj.listing.selectors.content_listing_visible).find( "[data-action=load-more]" ); if(response.seekEnd !== '') { $loadMore.attr("data-seek", response.seekEnd); } else { $loadMore.remove(); } PF.fn.listing.show(response, function () { $( PF.obj.listing.selectors.content_listing_loading, $content_listing ).addClass("visibility-hidden"); }); } else { // Network error, abort or something similar PF.obj.listing.calling = false; $content_listing.data("load", ""); removePagination(); if ($(PF.obj.listing.selectors.list_item, $content_listing).length == 0) { setEmptyTemplate(); } if (XHR.readyState !== 0) { PF.fn.growl.call( PF.fn._s("An error occurred. Please try again later.") ); } } if (typeof PF.fn.listing.ajax.callback == "function") { PF.fn.listing.ajax.callback(XHR); } }); }; PF.fn.listing.columnizerQueue = function () { $(PF.obj.listing.selectors.content_listing + ":hidden").data("queued", true); }; PF.fn.listing.refresh = function (animation_time) { PF.fn.listing.columnizer(true, animation_time, false); }; var width = $(window).width(); PF.fn.listing.columnizer = function (forced, animation_time, hard_forced) { var device_to_columns = { // default phone: 1, phablet: 3, tablet: 4, laptop: 5, desktop: 6, largescreen: 7 }; if (typeof forced !== "boolean") var forced = false; if (typeof PF.obj.listing.mode == "undefined") forced = true; if (typeof hard_forced !== "boolean") { var hard_forced = false, default_hard_forced = true; } else { var default_hard_forced = false; } if (!hard_forced && default_hard_forced) { if (width !== $(window).width() || forced) { hard_forced = true; } } if (typeof animation_time == typeof undefined) var animation_time = PF.obj.config.animation.normal; var $container = $("#content-listing-tabs").exists() ? $( PF.obj.listing.selectors.content_listing_visible, "#content-listing-tabs" ) : $(PF.obj.listing.selectors.content_listing), $pad_content_listing = $(PF.obj.listing.selectors.pad_content, $container), list_mode = "responsive", $list_item = $( forced || hard_forced ? PF.obj.listing.selectors.list_item : PF.obj.listing.selectors.list_item + ":not(.jsly)", $container ); if (typeof PF.obj.config.listing.device_to_columns !== "undefined") { device_to_columns = $.extend( {}, device_to_columns, PF.obj.config.listing.device_to_columns ); } if ($container.data("device-columns")) { device_to_columns = $.extend( {}, device_to_columns, $container.data("device-columns") ); } PF.obj.listing.mode = list_mode; PF.obj.listing.device = PF.fn.getDeviceName(); if (!$list_item.exists()) return; if ( typeof $container.data("columns") !== "undefined" && !forced && !hard_forced ) { PF.obj.listing.columns = $container.data("columns"); PF.obj.listing.columns_number = $container.data("columns").length - 1; PF.obj.listing.current_column = $container.data("current_column"); } else { var $list_item_1st = $list_item.first(); $list_item_1st.css("width", ""); PF.obj.listing.columns = new Array(); PF.obj.listing.columns_number = device_to_columns[PF.fn.getDeviceName()]; for (i = 0; i < PF.obj.listing.columns_number; i++) { PF.obj.listing.columns[i + 1] = 0; } PF.obj.listing.current_column = 1; } $container .removeClass("small-cols") .addClass(PF.obj.listing.columns_number > 6 ? "small-cols" : ""); $pad_content_listing.css("width", "100%"); var delay = 0; $list_item.each(function (index) { $(this).addClass("jsly"); var $list_item_img = $(".list-item-image", this), $list_item_src = $(".list-item-image img", this), $list_item_thumbs = $(".list-item-thumbs", this), isJslyLoaded = $list_item_src.hasClass("jsly-loaded"); $list_item_src.show(); if (hard_forced) { $(this).css({ top: "", left: "", height: "", position: "" }); $list_item_img.css({ maxHeight: "", height: "" }); $list_item_src .removeClass("jsly") .css({ width: "", height: "" }) .parent() .css({ marginLeft: "", marginTop: "" }); $("li", $list_item_thumbs).css({ width: "", height: "" }); } var width_responsive = PF.obj.listing.columns_number == 1 ? "100%" : parseFloat( (1 / PF.obj.listing.columns_number) * $container.width() + "px" ); $(this).css("width", width_responsive); if (PF.obj.listing.current_column > PF.obj.listing.columns_number) { PF.obj.listing.current_column = 1; } $(this).attr("data-col", PF.obj.listing.current_column); if (!$list_item_src.exists()) { var empty = true; $list_item_src = $(".image-container .empty", this); } var already_shown = $(this).is(":visible"); $list_item.show(); var isFixed = $list_item_img.hasClass("fixed-size"); var image = { w: parseFloat($list_item_src.attr("width")), h: parseFloat($list_item_src.attr("height")) }; image.ratio = image.w / image.h; if ( empty || ($list_item_img.css("min-height") && !$list_item_src.hasClass("jsly")) ) { var col = { w: $(this).width(), h: isFixed ? $(this).width() : null }, magicWidth = Math.min(image.w, image.w < col.w ? image.w : col.w); if (isFixed) { $list_item_img.css({ height: col.w }); // Sets the item container height if (image.ratio <= 3 && (image.ratio > 1 || image.ratio == 1)) { // Landscape or square image.h = Math.min(image.h, image.w < col.w ? image.w : col.w); image.w = image.h * image.ratio; } else { // Portrait image.w = magicWidth; image.h = image.w / image.ratio; } $list_item_img.css("min-height", 0); } else { // Fluid height image.w = magicWidth; if (image.ratio >= 3 || image.ratio < 1 || image.ratio == 1) { // Portrait or square image.h = image.w / image.ratio; } else { // Landscape image.h = Math.min(image.h, image.w); image.w = image.h * image.ratio; } if (empty) { image.h = col.w; } $list_item_img.css({ height: image.h }); // Fill some gaps } if ($list_item_src.width() == 0) { $list_item_src.css({ width: magicWidth, height: magicWidth / image.ratio }); } if ($(".image-container", this).is(".list-item-avatar-cover")) { $list_item_src.css( isFixed ? { width: "auto", height: "100%" } : { width: "100%", height: "auto" } ); } var list_item_src_pitfall_x = Math.max( $list_item_src.position().left * 2, 0 ), list_item_src_pitfall_y = Math.max( $list_item_src.position().top * 2, 0 ); var pitfall_ratio_x = list_item_src_pitfall_x / $list_item_img.width(), pitfall_ratio_y = list_item_src_pitfall_y / $list_item_img.height(); if ( (list_item_src_pitfall_x > 0 || list_item_src_pitfall_y > 0) && (pitfall_ratio_x <= 0.25 || pitfall_ratio_y <= 0.25) ) { $list_item_img.addClass("--fit"); } if ($list_item_thumbs.exists()) { $("li", $list_item_thumbs) .css({ width: 100 / $("li", $list_item_thumbs).length + "%" }) .css({ height: $("li", $list_item_thumbs).width() }); } if (!already_shown) { $list_item.hide(); } } if (!$list_item_src.hasClass("jsly") && $(this).is(":hidden")) { $(this).css("top", "100%"); } PF.obj.listing.columns[PF.obj.listing.current_column] += $( this ).outerHeight(true); if ($(this).is(":animated")) { animation_time = 0; } $(this).addClass("position-absolute"); var new_left = $(this).outerWidth(true) * (PF.obj.listing.current_column - 1); var must_change_left = parseFloat($(this).css("left")) != new_left; if (must_change_left) { animate_grid = true; $(this).animate( { left: new_left }, animation_time ); } var new_top = PF.obj.listing.columns[PF.obj.listing.current_column] - $(this).outerHeight(true); if (parseFloat($(this).css("top")) != new_top) { animate_grid = true; $(this).animate( { top: new_top }, animation_time ); if (must_change_left) { delay = 1; } } if (already_shown) { $list_item.show(); } PF.obj.listing.current_column++; }); $container.data({ columns: PF.obj.listing.columns, current_column: PF.obj.listing.current_column }).attr('data-columns', PF.obj.listing.columns_number); var content_listing_height = 0; $.each(PF.obj.listing.columns, function (i, v) { if (v > content_listing_height) { content_listing_height = v; } }); PF.obj.listing.width = $container.width(); if (typeof PF.obj.listing.height !== typeof undefined) { var old_listing_height = PF.obj.listing.height; } PF.obj.listing.height = content_listing_height; var do_listing_h_resize = typeof old_listing_height !== typeof undefined && old_listing_height !== PF.obj.listing.height; if (!do_listing_h_resize) { $pad_content_listing.height(content_listing_height); PF.fn.list_fluid_width(); } if (do_listing_h_resize) { $pad_content_listing.height(old_listing_height); setTimeout(function () { $pad_content_listing.animate( { height: content_listing_height }, animation_time, function () { PF.fn.list_fluid_width(); } ); }, animation_time * delay); } $container.data("list-mode", PF.obj.listing.mode); $(PF.obj.listing.selectors.content_listing_visible).data("queued", false); $container.addClass("jsly"); }; /** * PEAFOWL LOADERS * ------------------------------------------------------------------------------------------------- */ PF.fn.loading = { spin: { small: { lines: 11, length: 0, width: 3, radius: 7, speed: 1, trail: 45, blocksize: 20 }, // 20x20 normal: { lines: 11, length: 0, width: 5, radius: 10, speed: 1, trail: 45, blocksize: 30 }, // 30x30 big: { lines: 11, length: 0, width: 7, radius: 13, speed: 1, trail: 45, blocksize: 40 }, // 40x40 huge: { lines: 11, length: 0, width: 9, radius: 16, speed: 1, trail: 45, blocksize: 50 } // 50x50 }, inline: function ($target, options) { if (typeof $target == "undefined") return; if ($target instanceof jQuery == false) { var $target = $($target); } var defaultoptions = { size: "normal", color: $("body").css("color"), center: false, position: "absolute", shadow: false, valign: "top" }; if (typeof options == "undefined") { options = defaultoptions; } else { for (var k in defaultoptions) { if (typeof options[k] == "undefined") { options[k] = defaultoptions[k]; } } } var size = PF.fn.loading.spin[options.size]; PF.fn.loading.spin[options.size].color = options.color; PF.fn.loading.spin[options.size].shadow = options.shadow; $target .html( '<span class="loading-indicator"></span>' + (typeof options.message !== "undefined" ? '<span class="loading-text">' + options.message + "</span>" : "") ) .css({ "line-height": PF.fn.loading.spin[options.size].blocksize + "px" }); $(".loading-indicator", $target) .css({ width: PF.fn.loading.spin[options.size].blocksize, height: PF.fn.loading.spin[options.size].blocksize }) .spin(PF.fn.loading.spin[options.size]); if (options.center) { $(".loading-indicator", $target.css("textAlign", "center")).css({ position: options.position, top: "50%", insetInlineStart: "50%", marginTop: -(PF.fn.loading.spin[options.size].blocksize / 2), marginInlineStart: -(PF.fn.loading.spin[options.size].blocksize / 2) }); } if (options.valign == "center") { $(".loading-indicator,.loading-text", $target).css( "marginTop", ($target.height() - PF.fn.loading.spin[options.size].blocksize) / 2 + "px" ); } $(".spinner", $target).css({ top: PF.fn.loading.spin[options.size].blocksize / 2 + "px", insetInlineStart: PF.fn.loading.spin[options.size].blocksize / 2 + "px" }); }, fullscreen: function () { $("body").append( '<div class="fullscreen" id="pf-fullscreen-loader"><div class="fullscreen-loader black-bkg"><span class="loading-txt">' + PF.fn._s("loading") + "</span></div></div>" ); $(".fullscreen-loader", "#pf-fullscreen-loader").spin( PF.fn.loading.spin.huge ); $("#pf-fullscreen-loader").css("opacity", 1); }, destroy: function ($target) { var $loader_fs = $("#pf-fullscreen-loader"), $loader_os = $("#pf-onscreen-loader"); if ($target == "fullscreen") $target = $loader_fs; if ($target == "onscreen") $target = $loader_os; if (typeof $target !== "undefined") { $target.remove(); } else { $loader_fs.remove(); $loader_os.remove(); } } }; /** * PEAFOWL FORM HELPERS * ------------------------------------------------------------------------------------------------- */ jQuery.fn.disableForm = function () { $(this).data("disabled", true); $(":input", this).each(function () { $(this).attr("disabled", true); }); return this; }; jQuery.fn.enableForm = function () { $(this).data("disabled", false); $(":input", this).removeAttr("disabled"); return this; }; PF.fn.isDevice = function (device) { if (typeof device == "object") { var device = "." + device.join(",."); } else { var device = "." + device; } return $("html").is(device); }; PF.fn.getDeviceName = function () { var current_device; $.each(PF.obj.devices, function (i, v) { if (PF.fn.isDevice(v)) { current_device = v; return true; } }); return current_device; }; PF.fn.topMenu = { vars: { $button: $("[data-action=top-bar-menu-full]", "#top-bar"), menu: "#menu-fullscreen", speed: PF.obj.config.animation.fast, menu_top: parseInt($("#top-bar").outerHeight()) + parseInt($("#top-bar").css("top")) + parseInt($("#top-bar").css("margin-top")) + parseInt($("#top-bar").css("margin-bottom")) - parseInt($("#top-bar").css("border-bottom-width")) + "px" }, show: function (speed) { if ($("body").is(":animated")) return; if (typeof speed == "undefined") { var speed = this.vars.speed; } this.vars.$button.addClass("current"); $("html").addClass("menu-fullscreen-visible"); $("#top-bar") .append( $("<div/>", { id: "menu-fullscreen", class: "touch-scroll", html: $("<div/>", { class: "fullscreen black", }) }) .css({ left: "-100%" }) .append( $("<ul/>", { html: $(".top-bar-left").html() + $(".top-bar-right").html() }) ) ); var $menu = $(this.vars.menu); $( "li.phone-hide, li > .top-btn-text, li > .top-btn-text > span, li > a > .top-btn-text > span", $menu ).each(function () { $(this).removeClass("phone-hide"); }); $("[data-action=top-bar-menu-full]", $menu).remove(); $( ".btn.black, .btn.default, .btn.blue, .btn.green, .btn.orange, .btn.red, .btn.transparent", $menu ).removeClass("btn black default blue green orange red transparent"); setTimeout(function () { $menu.css({ transform: "translateX(100%)" }); $(".fullscreen").css("opacity", 1); }, 1); setTimeout(function () { $menu.css({ transition: "none", transform: "", left: "" }); $("html").css({ backgroundColor: "" }); }, speed); }, hide: function (speed) { if ($("body").is(":animated")) return; if (!$(this.vars.menu).is(":visible")) return; var $menu = $(this.vars.menu); if (typeof speed == "undefined") { var speed = this.vars.speed; } $menu.css({transition: ""}); setTimeout(function () { $menu.css({ transform: "translateX(-100%)" }); }, 1); $("#top-bar").css("position", ""); this.vars.$button.removeClass("current"); $("html").removeClass("menu-fullscreen-visible"); setTimeout(function () { $menu.remove(); }, speed); } }; /** * JQUERY PLUGINS (strictly needed plugins) * ------------------------------------------------------------------------------------------------- */ // http://phpjs.org/functions/sprintf/ function sprintf() { var e = /%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuideEfFgG])/g; var t = arguments; var n = 0; var r = t[n++]; var i = function (e, t, n, r) { if (!n) { n = " "; } var i = e.length >= t ? "" : new Array((1 + t - e.length) >>> 0).join(n); return r ? e + i : i + e; }; var s = function (e, t, n, r, s, o) { var u = r - e.length; if (u > 0) { if (n || !s) { e = i(e, r, o, n); } else { e = e.slice(0, t.length) + i("", u, "0", true) + e.slice(t.length); } } return e; }; var o = function (e, t, n, r, o, u, a) { var f = e >>> 0; n = (n && f && { 2: "0b", 8: "0", 16: "0x" }[t]) || ""; e = n + i(f.toString(t), u || 0, "0", false); return s(e, n, r, o, a); }; var u = function (e, t, n, r, i, o) { if (r != null) { e = e.slice(0, r); } return s(e, "", t, n, i, o); }; var a = function (e, r, a, f, l, c, h) { var p, d, v, m, g; if (e === "%%") { return "%"; } var y = false; var b = ""; var w = false; var E = false; var S = " "; var x = a.length; for (var T = 0; a && T < x; T++) { switch (a.charAt(T)) { case " ": b = " "; break; case "+": b = "+"; break; case "-": y = true; break; case "'": S = a.charAt(T + 1); break; case "0": w = true; S = "0"; break; case "#": E = true; break; } } if (!f) { f = 0; } else if (f === "*") { f = +t[n++]; } else if (f.charAt(0) == "*") { f = +t[f.slice(1, -1)]; } else { f = +f; } if (f < 0) { f = -f; y = true; } if (!isFinite(f)) { throw new Error("sprintf: (minimum-)width must be finite"); } if (!c) { c = "fFeE".indexOf(h) > -1 ? 6 : h === "d" ? 0 : undefined; } else if (c === "*") { c = +t[n++]; } else if (c.charAt(0) == "*") { c = +t[c.slice(1, -1)]; } else { c = +c; } g = r ? t[r.slice(0, -1)] : t[n++]; switch (h) { case "s": return u(String(g), y, f, c, w, S); case "c": return u(String.fromCharCode(+g), y, f, c, w); case "b": return o(g, 2, E, y, f, c, w); case "o": return o(g, 8, E, y, f, c, w); case "x": return o(g, 16, E, y, f, c, w); case "X": return o(g, 16, E, y, f, c, w).toUpperCase(); case "u": return o(g, 10, E, y, f, c, w); case "i": case "d": p = +g || 0; p = Math.round(p - (p % 1)); d = p < 0 ? "-" : b; g = d + i(String(Math.abs(p)), c, "0", false); return s(g, d, y, f, w); case "e": case "E": case "f": case "F": case "g": case "G": p = +g; d = p < 0 ? "-" : b; v = ["toExponential", "toFixed", "toPrecision"][ "efg".indexOf(h.toLowerCase()) ]; m = ["toString", "toUpperCase"]["eEfFgG".indexOf(h) % 2]; g = d + Math.abs(p)[v](c); return s(g, d, y, f, w)[m](); default: return e; } }; return r.replace(e, a); } /*! * imagesLoaded PACKAGED v4.1.4 * JavaScript is all like "You images are done yet or what?" * MIT License */ /** * EvEmitter v1.1.0 * Lil' event emitter * MIT License */ /* jshint unused: true, undef: true, strict: true */ ( function( global, factory ) { // universal module definition /* jshint strict: false */ /* globals define, module, window */ if ( typeof define == 'function' && define.amd ) { // AMD - RequireJS define( 'ev-emitter/ev-emitter',factory ); } else if ( typeof module == 'object' && module.exports ) { // CommonJS - Browserify, Webpack module.exports = factory(); } else { // Browser globals global.EvEmitter = factory(); } }( typeof window != 'undefined' ? window : this, function() { function EvEmitter() {} var proto = EvEmitter.prototype; proto.on = function( eventName, listener ) { if ( !eventName || !listener ) { return; } // set events hash var events = this._events = this._events || {}; // set listeners array var listeners = events[ eventName ] = events[ eventName ] || []; // only add once if ( listeners.indexOf( listener ) == -1 ) { listeners.push( listener ); } return this; }; proto.once = function( eventName, listener ) { if ( !eventName || !listener ) { return; } // add event this.on( eventName, listener ); // set once flag // set onceEvents hash var onceEvents = this._onceEvents = this._onceEvents || {}; // set onceListeners object var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; // set flag onceListeners[ listener ] = true; return this; }; proto.off = function( eventName, listener ) { var listeners = this._events && this._events[ eventName ]; if ( !listeners || !listeners.length ) { return; } var index = listeners.indexOf( listener ); if ( index != -1 ) { listeners.splice( index, 1 ); } return this; }; proto.emitEvent = function( eventName, args ) { var listeners = this._events && this._events[ eventName ]; if ( !listeners || !listeners.length ) { return; } // copy over to avoid interference if .off() in listener listeners = listeners.slice(0); args = args || []; // once stuff var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; for ( var i=0; i < listeners.length; i++ ) { var listener = listeners[i] var isOnce = onceListeners && onceListeners[ listener ]; if ( isOnce ) { // remove listener // remove before trigger to prevent recursion this.off( eventName, listener ); // unset once flag delete onceListeners[ listener ]; } // trigger listener listener.apply( this, args ); } return this; }; proto.allOff = function() { delete this._events; delete this._onceEvents; }; return EvEmitter; })); /*! * imagesLoaded v4.1.4 * JavaScript is all like "You images are done yet or what?" * MIT License */ ( function( window, factory ) { 'use strict'; // universal module definition /*global define: false, module: false, require: false */ if ( typeof define == 'function' && define.amd ) { // AMD define( [ 'ev-emitter/ev-emitter' ], function( EvEmitter ) { return factory( window, EvEmitter ); }); } else if ( typeof module == 'object' && module.exports ) { // CommonJS module.exports = factory( window, require('ev-emitter') ); } else { // browser global window.imagesLoaded = factory( window, window.EvEmitter ); } })( typeof window !== 'undefined' ? window : this, // -------------------------- factory -------------------------- // function factory( window, EvEmitter ) { var $ = window.jQuery; var console = window.console; // -------------------------- helpers -------------------------- // // extend objects function extend( a, b ) { for ( var prop in b ) { a[ prop ] = b[ prop ]; } return a; } var arraySlice = Array.prototype.slice; // turn element or nodeList into an array function makeArray( obj ) { if ( Array.isArray( obj ) ) { // use object if already an array return obj; } var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number'; if ( isArrayLike ) { // convert nodeList to array return arraySlice.call( obj ); } // array of single index return [ obj ]; } // -------------------------- imagesLoaded -------------------------- // /** * @param {Array, Element, NodeList, String} elem * @param {Object or Function} options - if function, use as callback * @param {Function} onAlways - callback function */ function ImagesLoaded( elem, options, onAlways ) { // coerce ImagesLoaded() without new, to be new ImagesLoaded() if ( !( this instanceof ImagesLoaded ) ) { return new ImagesLoaded( elem, options, onAlways ); } // use elem as selector string var queryElem = elem; if ( typeof elem == 'string' ) { queryElem = document.querySelectorAll( elem ); } // bail if bad element if ( !queryElem ) { console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) ); return; } this.elements = makeArray( queryElem ); this.options = extend( {}, this.options ); // shift arguments if no options set if ( typeof options == 'function' ) { onAlways = options; } else { extend( this.options, options ); } if ( onAlways ) { this.on( 'always', onAlways ); } this.getImages(); if ( $ ) { // add jQuery Deferred object this.jqDeferred = new $.Deferred(); } // HACK check async to allow time to bind listeners setTimeout( this.check.bind( this ) ); } ImagesLoaded.prototype = Object.create( EvEmitter.prototype ); ImagesLoaded.prototype.options = {}; ImagesLoaded.prototype.getImages = function() { this.images = []; // filter & find items if we have an item selector this.elements.forEach( this.addElementImages, this ); }; /** * @param {Node} element */ ImagesLoaded.prototype.addElementImages = function( elem ) { // filter siblings if ( elem.nodeName == 'IMG' ) { this.addImage( elem ); } // get background image on element if ( this.options.background === true ) { this.addElementBackgroundImages( elem ); } // find children // no non-element nodes, #143 var nodeType = elem.nodeType; if ( !nodeType || !elementNodeTypes[ nodeType ] ) { return; } var childImgs = elem.querySelectorAll('img'); // concat childElems to filterFound array for ( var i=0; i < childImgs.length; i++ ) { var img = childImgs[i]; this.addImage( img ); } // get child background images if ( typeof this.options.background == 'string' ) { var children = elem.querySelectorAll( this.options.background ); for ( i=0; i < children.length; i++ ) { var child = children[i]; this.addElementBackgroundImages( child ); } } }; var elementNodeTypes = { 1: true, 9: true, 11: true }; ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) { var style = getComputedStyle( elem ); if ( !style ) { // Firefox returns null if in a hidden iframe https://bugzil.la/548397 return; } // get url inside url("...") var reURL = /url\((['"])?(.*?)\1\)/gi; var matches = reURL.exec( style.backgroundImage ); while ( matches !== null ) { var url = matches && matches[2]; if ( url ) { this.addBackground( url, elem ); } matches = reURL.exec( style.backgroundImage ); } }; /** * @param {Image} img */ ImagesLoaded.prototype.addImage = function( img ) { var loadingImage = new LoadingImage( img ); this.images.push( loadingImage ); }; ImagesLoaded.prototype.addBackground = function( url, elem ) { var background = new Background( url, elem ); this.images.push( background ); }; ImagesLoaded.prototype.check = function() { var _this = this; this.progressedCount = 0; this.hasAnyBroken = false; // complete if no images if ( !this.images.length ) { this.complete(); return; } function onProgress( image, elem, message ) { // HACK - Chrome triggers event before object properties have changed. #83 setTimeout( function() { _this.progress( image, elem, message ); }); } this.images.forEach( function( loadingImage ) { loadingImage.once( 'progress', onProgress ); loadingImage.check(); }); }; ImagesLoaded.prototype.progress = function( image, elem, message ) { this.progressedCount++; this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded; // progress event this.emitEvent( 'progress', [ this, image, elem ] ); if ( this.jqDeferred && this.jqDeferred.notify ) { this.jqDeferred.notify( this, image ); } // check if completed if ( this.progressedCount == this.images.length ) { this.complete(); } if ( this.options.debug && console ) { console.log( 'progress: ' + message, image, elem ); } }; ImagesLoaded.prototype.complete = function() { var eventName = this.hasAnyBroken ? 'fail' : 'done'; this.isComplete = true; this.emitEvent( eventName, [ this ] ); this.emitEvent( 'always', [ this ] ); if ( this.jqDeferred ) { var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve'; this.jqDeferred[ jqMethod ]( this ); } }; // -------------------------- -------------------------- // function LoadingImage( img ) { this.img = img; } LoadingImage.prototype = Object.create( EvEmitter.prototype ); LoadingImage.prototype.check = function() { // If complete is true and browser supports natural sizes, // try to check for image status manually. var isComplete = this.getIsImageComplete(); if ( isComplete ) { // report based on naturalWidth this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' ); return; } // If none of the checks above matched, simulate loading on detached element. this.proxyImage = new Image(); this.proxyImage.addEventListener( 'load', this ); this.proxyImage.addEventListener( 'error', this ); // bind to image as well for Firefox. #191 this.img.addEventListener( 'load', this ); this.img.addEventListener( 'error', this ); this.proxyImage.src = this.img.src; }; LoadingImage.prototype.getIsImageComplete = function() { // check for non-zero, non-undefined naturalWidth // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671 return this.img.complete && this.img.naturalWidth; }; LoadingImage.prototype.confirm = function( isLoaded, message ) { this.isLoaded = isLoaded; this.emitEvent( 'progress', [ this, this.img, message ] ); }; // ----- events ----- // // trigger specified handler for event type LoadingImage.prototype.handleEvent = function( event ) { var method = 'on' + event.type; if ( this[ method ] ) { this[ method ]( event ); } }; LoadingImage.prototype.onload = function() { this.confirm( true, 'onload' ); this.unbindEvents(); }; LoadingImage.prototype.onerror = function() { this.confirm( false, 'onerror' ); this.unbindEvents(); }; LoadingImage.prototype.unbindEvents = function() { this.proxyImage.removeEventListener( 'load', this ); this.proxyImage.removeEventListener( 'error', this ); this.img.removeEventListener( 'load', this ); this.img.removeEventListener( 'error', this ); }; // -------------------------- Background -------------------------- // function Background( url, element ) { this.url = url; this.element = element; this.img = new Image(); } // inherit LoadingImage prototype Background.prototype = Object.create( LoadingImage.prototype ); Background.prototype.check = function() { this.img.addEventListener( 'load', this ); this.img.addEventListener( 'error', this ); this.img.src = this.url; // check if image is already complete var isComplete = this.getIsImageComplete(); if ( isComplete ) { this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' ); this.unbindEvents(); } }; Background.prototype.unbindEvents = function() { this.img.removeEventListener( 'load', this ); this.img.removeEventListener( 'error', this ); }; Background.prototype.confirm = function( isLoaded, message ) { this.isLoaded = isLoaded; this.emitEvent( 'progress', [ this, this.element, message ] ); }; // -------------------------- jQuery -------------------------- // ImagesLoaded.makeJQueryPlugin = function( jQuery ) { jQuery = jQuery || window.jQuery; if ( !jQuery ) { return; } // set local variable $ = jQuery; // $().imagesLoaded() $.fn.imagesLoaded = function( options, callback ) { var instance = new ImagesLoaded( this, options, callback ); return instance.jqDeferred.promise( $(this) ); }; }; // try making plugin ImagesLoaded.makeJQueryPlugin(); // -------------------------- -------------------------- // return ImagesLoaded; }); /** * TipTip * Copyright 2010 Drew Wilson * code.drewwilson.com/entry/tiptip-jquery-plugin * * Version 1.3(modified) - Updated: Jun. 23, 2011 * http://drew.tenderapp.com/discussions/tiptip/70-updated-tiptip-with-new-features * * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html */ (function ($) { $.fn.tipTip = function (options) { var defaults = { activation: "hover", keepAlive: false, maxWidth: "200px", edgeOffset: 6, defaultPosition: "bottom", delay: 400, fadeIn: 200, fadeOut: 200, attribute: "title", content: false, enter: function () { }, afterEnter: function () { }, exit: function () { }, afterExit: function () { }, cssClass: "" }; if ($("#tiptip_holder").length <= 0) { var tiptip_holder = $('<div id="tiptip_holder"></div>'); var tiptip_content = $('<div id="tiptip_content"></div>'); var tiptip_arrow = $('<div id="tiptip_arrow"></div>'); $("body").append( tiptip_holder .html(tiptip_content) .prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')) ); } else { var tiptip_holder = $("#tiptip_holder"); var tiptip_content = $("#tiptip_content"); var tiptip_arrow = $("#tiptip_arrow"); } return this.each(function () { var org_elem = $(this), data = org_elem.data("tipTip"), opts = (data && data.options) || $.extend(defaults, options), callback_data = { holder: tiptip_holder, content: tiptip_content, arrow: tiptip_arrow, options: opts }; if (data) { switch (options) { case "show": active_tiptip(); break; case "hide": deactive_tiptip(); break; case "destroy": org_elem.unbind(".tipTip").removeData("tipTip"); break; } } else { var timeout = false; org_elem.data("tipTip", { options: opts }); if (opts.activation == "hover") { org_elem .bind("mouseenter.tipTip", function () { active_tiptip(); }) .bind("mouseleave.tipTip", function () { if (!opts.keepAlive) { deactive_tiptip(); } else { tiptip_holder.one("mouseleave.tipTip", function () { deactive_tiptip(); }); } }); } else { if (opts.activation == "focus") { org_elem .bind("focus.tipTip", function () { active_tiptip(); }) .bind("blur.tipTip", function () { deactive_tiptip(); }); } else { if (opts.activation == "click") { org_elem .bind("click.tipTip", function (e) { e.preventDefault(); active_tiptip(); return false; }) .bind("mouseleave.tipTip", function () { if (!opts.keepAlive) { deactive_tiptip(); } else { tiptip_holder.one("mouseleave.tipTip", function () { deactive_tiptip(); }); } }); } else { if (opts.activation == "manual") { } } } } } function active_tiptip() { if (opts.enter.call(org_elem, callback_data) === false) { return; } var org_title; if (opts.content) { org_title = $.isFunction(opts.content) ? opts.content.call(org_elem, callback_data) : opts.content; } else { org_title = opts.content = org_elem.attr(opts.attribute); org_elem.removeAttr(opts.attribute); } if (!org_title) { return; } tiptip_content.html(org_title); tiptip_holder .hide() .removeAttr("class") .css({ margin: "0px", "max-width": opts.maxWidth }); if (opts.cssClass) { tiptip_holder.addClass(opts.cssClass); } tiptip_arrow.removeAttr("style"); var top = parseInt(org_elem.offset()["top"]), left = parseInt(org_elem.offset()["left"]), org_width = parseInt(org_elem.outerWidth()), org_height = parseInt(org_elem.outerHeight()), tip_w = tiptip_holder.outerWidth(), tip_h = tiptip_holder.outerHeight(), w_compare = Math.round((org_width - tip_w) / 2), h_compare = Math.round((org_height - tip_h) / 2), marg_left = Math.round(left + w_compare), marg_top = Math.round(top + org_height + opts.edgeOffset), t_class = "", arrow_top = "", arrow_left = Math.round(tip_w - 12) / 2; if (opts.defaultPosition == "bottom") { t_class = "_bottom"; } else { if (opts.defaultPosition == "top") { t_class = "_top"; } else { if (opts.defaultPosition == "left") { t_class = "_left"; } else { if (opts.defaultPosition == "right") { t_class = "_right"; } } } } var right_compare = w_compare + left < parseInt($(window).scrollLeft()), left_compare = tip_w + left > parseInt($(window).width()); if ( (right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < tip_w + opts.edgeOffset + 5) ) { t_class = "_right"; arrow_top = Math.round(tip_h - 13) / 2; arrow_left = -12; marg_left = Math.round(left + org_width + opts.edgeOffset); marg_top = Math.round(top + h_compare); } else { if ( (left_compare && w_compare < 0) || (t_class == "_left" && !right_compare) ) { t_class = "_left"; arrow_top = Math.round(tip_h - 13) / 2; arrow_left = Math.round(tip_w); marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5)); marg_top = Math.round(top + h_compare); } } var top_compare = top + org_height + opts.edgeOffset + tip_h + 8 > parseInt($(window).height() + $(window).scrollTop()), bottom_compare = top + org_height - (opts.edgeOffset + tip_h + 8) < 0; if ( top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare) ) { if (t_class == "_top" || t_class == "_bottom") { t_class = "_top"; } else { t_class = t_class + "_top"; } arrow_top = tip_h; marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset)); } else { if ( bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare) ) { if (t_class == "_top" || t_class == "_bottom") { t_class = "_bottom"; } else { t_class = t_class + "_bottom"; } arrow_top = -12; marg_top = Math.round(top + org_height + opts.edgeOffset); } } if (t_class == "_right_top" || t_class == "_left_top") { marg_top = marg_top + 5; } else { if (t_class == "_right_bottom" || t_class == "_left_bottom") { marg_top = marg_top - 5; } } if (t_class == "_left_top" || t_class == "_left_bottom") { marg_left = marg_left + 5; } tiptip_arrow.css({ "margin-left": arrow_left + "px", "margin-top": arrow_top + "px" }); tiptip_holder .css({ "margin-left": marg_left + "px", "margin-top": marg_top + "px" }) .addClass("tip" + t_class); if (timeout) { clearTimeout(timeout); } timeout = setTimeout(function () { tiptip_holder.stop(true, true).fadeIn(opts.fadeIn); }, opts.delay); opts.afterEnter.call(org_elem, callback_data); } function deactive_tiptip() { if (opts.exit.call(org_elem, callback_data) === false) { return; } if (timeout) { clearTimeout(timeout); } tiptip_holder.fadeOut(opts.fadeOut); opts.afterExit.call(org_elem, callback_data); } }); }; })(jQuery); /** * jQuery UI Touch Punch 0.2.2 * Copyright 2011, Dave Furfero * Dual licensed under the MIT or GPL Version 2 licenses. * Depends: jquery.ui.widget jquery.ui.mouse */ (function (b) { b.support.touch = "ontouchend" in document; if (!b.support.touch) { return; } var c = b.ui.mouse.prototype, e = c._mouseInit, a; function d(g, h) { if (g.originalEvent.touches.length > 1) { return; } g.preventDefault(); var i = g.originalEvent.changedTouches[0], f = document.createEvent("MouseEvents"); f.initMouseEvent( h, true, true, window, 1, i.screenX, i.screenY, i.clientX, i.clientY, false, false, false, false, 0, null ); g.target.dispatchEvent(f); } c._touchStart = function (g) { var f = this; if (a || !f._mouseCapture(g.originalEvent.changedTouches[0])) { return; } a = true; f._touchMoved = false; d(g, "mouseover"); d(g, "mousemove"); d(g, "mousedown"); }; c._touchMove = function (f) { if (!a) { return; } this._touchMoved = true; d(f, "mousemove"); }; c._touchEnd = function (f) { if (!a) { return; } d(f, "mouseup"); d(f, "mouseout"); if (!this._touchMoved) { d(f, "click"); } a = false; }; c._mouseInit = function () { var f = this; f.element .bind("touchstart", b.proxy(f, "_touchStart")) .bind("touchmove", b.proxy(f, "_touchMove")) .bind("touchend", b.proxy(f, "_touchEnd")); e.call(f); }; })(jQuery); /** * fileOverview TouchSwipe - jQuery Plugin * version 1.6.5 */ (function (a) { if (typeof define === "function" && define.amd && define.amd.jQuery) { define(["jquery"], a); } else { a(jQuery); } })(function (e) { var o = "left", n = "right", d = "up", v = "down", c = "in", w = "out", l = "none", r = "auto", k = "swipe", s = "pinch", x = "tap", i = "doubletap", b = "longtap", A = "horizontal", t = "vertical", h = "all", q = 10, f = "start", j = "move", g = "end", p = "cancel", a = "ontouchstart" in window, y = "TouchSwipe"; var m = { fingers: 1, threshold: 75, cancelThreshold: null, pinchThreshold: 20, maxTimeThreshold: null, fingerReleaseThreshold: 250, longTapThreshold: 500, doubleTapThreshold: 200, swipe: null, swipeLeft: null, swipeRight: null, swipeUp: null, swipeDown: null, swipeStatus: null, pinchIn: null, pinchOut: null, pinchStatus: null, click: null, tap: null, doubleTap: null, longTap: null, triggerOnTouchEnd: true, triggerOnTouchLeave: false, allowPageScroll: "auto", fallbackToMouseEvents: true, excludedElements: "label, button, input, select, textarea, a, .noSwipe" }; e.fn.swipe = function (D) { var C = e(this), B = C.data(y); if (B && typeof D === "string") { if (B[D]) { return B[D].apply(this, Array.prototype.slice.call(arguments, 1)); } else { e.error("Method " + D + " does not exist on jQuery.swipe"); } } else { if (!B && (typeof D === "object" || !D)) { return u.apply(this, arguments); } } return C; }; e.fn.swipe.defaults = m; e.fn.swipe.phases = { PHASE_START: f, PHASE_MOVE: j, PHASE_END: g, PHASE_CANCEL: p }; e.fn.swipe.directions = { LEFT: o, RIGHT: n, UP: d, DOWN: v, IN: c, OUT: w }; e.fn.swipe.pageScroll = { NONE: l, HORIZONTAL: A, VERTICAL: t, AUTO: r }; e.fn.swipe.fingers = { ONE: 1, TWO: 2, THREE: 3, ALL: h }; function u(B) { if ( B && (B.allowPageScroll === undefined && (B.swipe !== undefined || B.swipeStatus !== undefined)) ) { B.allowPageScroll = l; } if (B.click !== undefined && B.tap === undefined) { B.tap = B.click; } if (!B) { B = {}; } B = e.extend({}, e.fn.swipe.defaults, B); return this.each(function () { var D = e(this); var C = D.data(y); if (!C) { C = new z(this, B); D.data(y, C); } }); } function z(a0, aq) { var av = a || !aq.fallbackToMouseEvents, G = av ? "touchstart" : "mousedown", au = av ? "touchmove" : "mousemove", R = av ? "touchend" : "mouseup", P = av ? null : "mouseleave", az = "touchcancel"; var ac = 0, aL = null, Y = 0, aX = 0, aV = 0, D = 1, am = 0, aF = 0, J = null; var aN = e(a0); var W = "start"; var T = 0; var aM = null; var Q = 0, aY = 0, a1 = 0, aa = 0, K = 0; var aS = null; try { aN.bind(G, aJ); aN.bind(az, a5); } catch (ag) { e.error("events not supported " + G + "," + az + " on jQuery.swipe"); } this.enable = function () { aN.bind(G, aJ); aN.bind(az, a5); return aN; }; this.disable = function () { aG(); return aN; }; this.destroy = function () { aG(); aN.data(y, null); return aN; }; this.option = function (a8, a7) { if (aq[a8] !== undefined) { if (a7 === undefined) { return aq[a8]; } else { aq[a8] = a7; } } else { e.error("Option " + a8 + " does not exist on jQuery.swipe.options"); } return null; }; function aJ(a9) { if (ax()) { return; } if (e(a9.target).closest(aq.excludedElements, aN).length > 0) { return; } var ba = a9.originalEvent ? a9.originalEvent : a9; var a8, a7 = a ? ba.touches[0] : ba; W = f; if (a) { T = ba.touches.length; } else { a9.preventDefault(); } ac = 0; aL = null; aF = null; Y = 0; aX = 0; aV = 0; D = 1; am = 0; aM = af(); J = X(); O(); if (!a || (T === aq.fingers || aq.fingers === h) || aT()) { ae(0, a7); Q = ao(); if (T == 2) { ae(1, ba.touches[1]); aX = aV = ap(aM[0].start, aM[1].start); } if (aq.swipeStatus || aq.pinchStatus) { a8 = L(ba, W); } } else { a8 = false; } if (a8 === false) { W = p; L(ba, W); return a8; } else { ak(true); } return null; } function aZ(ba) { var bd = ba.originalEvent ? ba.originalEvent : ba; if (W === g || W === p || ai()) { return; } var a9, a8 = a ? bd.touches[0] : bd; var bb = aD(a8); aY = ao(); if (a) { T = bd.touches.length; } W = j; if (T == 2) { if (aX == 0) { ae(1, bd.touches[1]); aX = aV = ap(aM[0].start, aM[1].start); } else { aD(bd.touches[1]); aV = ap(aM[0].end, aM[1].end); aF = an(aM[0].end, aM[1].end); } D = a3(aX, aV); am = Math.abs(aX - aV); } if (T === aq.fingers || aq.fingers === h || !a || aT()) { aL = aH(bb.start, bb.end); ah(ba, aL); ac = aO(bb.start, bb.end); Y = aI(); aE(aL, ac); if (aq.swipeStatus || aq.pinchStatus) { a9 = L(bd, W); } if (!aq.triggerOnTouchEnd || aq.triggerOnTouchLeave) { var a7 = true; if (aq.triggerOnTouchLeave) { var bc = aU(this); a7 = B(bb.end, bc); } if (!aq.triggerOnTouchEnd && a7) { W = ay(j); } else { if (aq.triggerOnTouchLeave && !a7) { W = ay(g); } } if (W == p || W == g) { L(bd, W); } } } else { W = p; L(bd, W); } if (a9 === false) { W = p; L(bd, W); } } function I(a7) { var a8 = a7.originalEvent; if (a) { if (a8.touches.length > 0) { C(); return true; } } if (ai()) { T = aa; } a7.preventDefault(); aY = ao(); Y = aI(); if (a6()) { W = p; L(a8, W); } else { if ( aq.triggerOnTouchEnd || (aq.triggerOnTouchEnd == false && W === j) ) { W = g; L(a8, W); } else { if (!aq.triggerOnTouchEnd && a2()) { W = g; aB(a8, W, x); } else { if (W === j) { W = p; L(a8, W); } } } } ak(false); return null; } function a5() { T = 0; aY = 0; Q = 0; aX = 0; aV = 0; D = 1; O(); ak(false); } function H(a7) { var a8 = a7.originalEvent; if (aq.triggerOnTouchLeave) { W = ay(g); L(a8, W); } } function aG() { aN.unbind(G, aJ); aN.unbind(az, a5); aN.unbind(au, aZ); aN.unbind(R, I); if (P) { aN.unbind(P, H); } ak(false); } function ay(bb) { var ba = bb; var a9 = aw(); var a8 = aj(); var a7 = a6(); if (!a9 || a7) { ba = p; } else { if ( a8 && bb == j && (!aq.triggerOnTouchEnd || aq.triggerOnTouchLeave) ) { ba = g; } else { if (!a8 && bb == g && aq.triggerOnTouchLeave) { ba = p; } } } return ba; } function L(a9, a7) { var a8 = undefined; if (F() || S()) { a8 = aB(a9, a7, k); } else { if ((M() || aT()) && a8 !== false) { a8 = aB(a9, a7, s); } } if (aC() && a8 !== false) { a8 = aB(a9, a7, i); } else { if (al() && a8 !== false) { a8 = aB(a9, a7, b); } else { if (ad() && a8 !== false) { a8 = aB(a9, a7, x); } } } if (a7 === p) { a5(a9); } if (a7 === g) { if (a) { if (a9.touches.length == 0) { a5(a9); } } else { a5(a9); } } return a8; } function aB(ba, a7, a9) { var a8 = undefined; if (a9 == k) { aN.trigger("swipeStatus", [a7, aL || null, ac || 0, Y || 0, T]); if (aq.swipeStatus) { a8 = aq.swipeStatus.call(aN, ba, a7, aL || null, ac || 0, Y || 0, T); if (a8 === false) { return false; } } if (a7 == g && aR()) { aN.trigger("swipe", [aL, ac, Y, T]); if (aq.swipe) { a8 = aq.swipe.call(aN, ba, aL, ac, Y, T); if (a8 === false) { return false; } } switch (aL) { case o: aN.trigger("swipeLeft", [aL, ac, Y, T]); if (aq.swipeLeft) { a8 = aq.swipeLeft.call(aN, ba, aL, ac, Y, T); } break; case n: aN.trigger("swipeRight", [aL, ac, Y, T]); if (aq.swipeRight) { a8 = aq.swipeRight.call(aN, ba, aL, ac, Y, T); } break; case d: aN.trigger("swipeUp", [aL, ac, Y, T]); if (aq.swipeUp) { a8 = aq.swipeUp.call(aN, ba, aL, ac, Y, T); } break; case v: aN.trigger("swipeDown", [aL, ac, Y, T]); if (aq.swipeDown) { a8 = aq.swipeDown.call(aN, ba, aL, ac, Y, T); } break; } } } if (a9 == s) { aN.trigger("pinchStatus", [a7, aF || null, am || 0, Y || 0, T, D]); if (aq.pinchStatus) { a8 = aq.pinchStatus.call( aN, ba, a7, aF || null, am || 0, Y || 0, T, D ); if (a8 === false) { return false; } } if (a7 == g && a4()) { switch (aF) { case c: aN.trigger("pinchIn", [aF || null, am || 0, Y || 0, T, D]); if (aq.pinchIn) { a8 = aq.pinchIn.call(aN, ba, aF || null, am || 0, Y || 0, T, D); } break; case w: aN.trigger("pinchOut", [aF || null, am || 0, Y || 0, T, D]); if (aq.pinchOut) { a8 = aq.pinchOut.call( aN, ba, aF || null, am || 0, Y || 0, T, D ); } break; } } } if (a9 == x) { if (a7 === p || a7 === g) { clearTimeout(aS); if (V() && !E()) { K = ao(); aS = setTimeout( e.proxy(function () { K = null; aN.trigger("tap", [ba.target]); if (aq.tap) { a8 = aq.tap.call(aN, ba, ba.target); } }, this), aq.doubleTapThreshold ); } else { K = null; aN.trigger("tap", [ba.target]); if (aq.tap) { a8 = aq.tap.call(aN, ba, ba.target); } } } } else { if (a9 == i) { if (a7 === p || a7 === g) { clearTimeout(aS); K = null; aN.trigger("doubletap", [ba.target]); if (aq.doubleTap) { a8 = aq.doubleTap.call(aN, ba, ba.target); } } } else { if (a9 == b) { if (a7 === p || a7 === g) { clearTimeout(aS); K = null; aN.trigger("longtap", [ba.target]); if (aq.longTap) { a8 = aq.longTap.call(aN, ba, ba.target); } } } } } return a8; } function aj() { var a7 = true; if (aq.threshold !== null) { a7 = ac >= aq.threshold; } return a7; } function a6() { var a7 = false; if (aq.cancelThreshold !== null && aL !== null) { a7 = aP(aL) - ac >= aq.cancelThreshold; } return a7; } function ab() { if (aq.pinchThreshold !== null) { return am >= aq.pinchThreshold; } return true; } function aw() { var a7; if (aq.maxTimeThreshold) { if (Y >= aq.maxTimeThreshold) { a7 = false; } else { a7 = true; } } else { a7 = true; } return a7; } function ah(a7, a8) { if (aq.allowPageScroll === l || aT()) { a7.preventDefault(); } else { var a9 = aq.allowPageScroll === r; switch (a8) { case o: if ((aq.swipeLeft && a9) || (!a9 && aq.allowPageScroll != A)) { a7.preventDefault(); } break; case n: if ((aq.swipeRight && a9) || (!a9 && aq.allowPageScroll != A)) { a7.preventDefault(); } break; case d: if ((aq.swipeUp && a9) || (!a9 && aq.allowPageScroll != t)) { a7.preventDefault(); } break; case v: if ((aq.swipeDown && a9) || (!a9 && aq.allowPageScroll != t)) { a7.preventDefault(); } break; } } } function a4() { var a8 = aK(); var a7 = U(); var a9 = ab(); return a8 && a7 && a9; } function aT() { return !!(aq.pinchStatus || aq.pinchIn || aq.pinchOut); } function M() { return !!(a4() && aT()); } function aR() { var ba = aw(); var bc = aj(); var a9 = aK(); var a7 = U(); var a8 = a6(); var bb = !a8 && a7 && a9 && bc && ba; return bb; } function S() { return !!( aq.swipe || aq.swipeStatus || aq.swipeLeft || aq.swipeRight || aq.swipeUp || aq.swipeDown ); } function F() { return !!(aR() && S()); } function aK() { return T === aq.fingers || aq.fingers === h || !a; } function U() { return aM[0].end.x !== 0; } function a2() { return !!aq.tap; } function V() { return !!aq.doubleTap; } function aQ() { return !!aq.longTap; } function N() { if (K == null) { return false; } var a7 = ao(); return V() && a7 - K <= aq.doubleTapThreshold; } function E() { return N(); } function at() { return (T === 1 || !a) && (isNaN(ac) || ac === 0); } function aW() { return Y > aq.longTapThreshold && ac < q; } function ad() { return !!(at() && a2()); } function aC() { return !!(N() && V()); } function al() { return !!(aW() && aQ()); } function C() { a1 = ao(); aa = event.touches.length + 1; } function O() { a1 = 0; aa = 0; } function ai() { var a7 = false; if (a1) { var a8 = ao() - a1; if (a8 <= aq.fingerReleaseThreshold) { a7 = true; } } return a7; } function ax() { return !!(aN.data(y + "_intouch") === true); } function ak(a7) { if (a7 === true) { aN.bind(au, aZ); aN.bind(R, I); if (P) { aN.bind(P, H); } } else { aN.unbind(au, aZ, false); aN.unbind(R, I, false); if (P) { aN.unbind(P, H, false); } } aN.data(y + "_intouch", a7 === true); } function ae(a8, a7) { var a9 = a7.identifier !== undefined ? a7.identifier : 0; aM[a8].identifier = a9; aM[a8].start.x = aM[a8].end.x = a7.pageX || a7.clientX; aM[a8].start.y = aM[a8].end.y = a7.pageY || a7.clientY; return aM[a8]; } function aD(a7) { var a9 = a7.identifier !== undefined ? a7.identifier : 0; var a8 = Z(a9); a8.end.x = a7.pageX || a7.clientX; a8.end.y = a7.pageY || a7.clientY; return a8; } function Z(a8) { for (var a7 = 0; a7 < aM.length; a7++) { if (aM[a7].identifier == a8) { return aM[a7]; } } } function af() { var a7 = []; for (var a8 = 0; a8 <= 5; a8++) { a7.push({ start: { x: 0, y: 0 }, end: { x: 0, y: 0 }, identifier: 0 }); } return a7; } function aE(a7, a8) { a8 = Math.max(a8, aP(a7)); J[a7].distance = a8; } function aP(a7) { if (J[a7]) { return J[a7].distance; } return undefined; } function X() { var a7 = {}; a7[o] = ar(o); a7[n] = ar(n); a7[d] = ar(d); a7[v] = ar(v); return a7; } function ar(a7) { return { direction: a7, distance: 0 }; } function aI() { return aY - Q; } function ap(ba, a9) { var a8 = Math.abs(ba.x - a9.x); var a7 = Math.abs(ba.y - a9.y); return Math.round(Math.sqrt(a8 * a8 + a7 * a7)); } function a3(a7, a8) { var a9 = (a8 / a7) * 1; return a9.toFixed(2); } function an() { if (D < 1) { return w; } else { return c; } } function aO(a8, a7) { return Math.round( Math.sqrt(Math.pow(a7.x - a8.x, 2) + Math.pow(a7.y - a8.y, 2)) ); } function aA(ba, a8) { var a7 = ba.x - a8.x; var bc = a8.y - ba.y; var a9 = Math.atan2(bc, a7); var bb = Math.round((a9 * 180) / Math.PI); if (bb < 0) { bb = 360 - Math.abs(bb); } return bb; } function aH(a8, a7) { var a9 = aA(a8, a7); if (a9 <= 45 && a9 >= 0) { return o; } else { if (a9 <= 360 && a9 >= 315) { return o; } else { if (a9 >= 135 && a9 <= 225) { return n; } else { if (a9 > 45 && a9 < 135) { return v; } else { return d; } } } } } function ao() { var a7 = new Date(); return a7.getTime(); } function aU(a7) { a7 = e(a7); var a9 = a7.offset(); var a8 = { left: a9.left, right: a9.left + a7.outerWidth(), top: a9.top, bottom: a9.top + a7.outerHeight() }; return a8; } function B(a7, a8) { return ( a7.x > a8.left && a7.x < a8.right && a7.y > a8.top && a7.y < a8.bottom ); } } }); /* * JavaScript Load Image v2.7.0* (added S.originalWidth and S.originalHeight) * https://github.com/blueimp/JavaScript-Load-Image * * Copyright 2011, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ !(function (e) { "use strict"; function t(e, i, a) { var o, r = document.createElement("img"); if ( ((r.onerror = function (o) { return t.onerror(r, o, e, i, a); }), (r.onload = function (o) { return t.onload(r, o, e, i, a); }), t.isInstanceOf("Blob", e) || t.isInstanceOf("File", e)) ) o = r._objectURL = t.createObjectURL(e); else { if ("string" != typeof e) return !1; (o = e), a && a.crossOrigin && (r.crossOrigin = a.crossOrigin); } return o ? ((r.src = o), r) : t.readFile(e, function (e) { var t = e.target; t && t.result ? (r.src = t.result) : i && i(e); }); } function i(e, i) { !e._objectURL || (i && i.noRevoke) || (t.revokeObjectURL(e._objectURL), delete e._objectURL); } var a = (window.createObjectURL && window) || (window.URL && URL.revokeObjectURL && URL) || (window.webkitURL && webkitURL); (t.isInstanceOf = function (e, t) { return Object.prototype.toString.call(t) === "[object " + e + "]"; }), (t.transform = function (e, i, a, o, r) { a(t.scale(e, i, r), r); }), (t.onerror = function (e, t, a, o, r) { i(e, r), o && o.call(e, t); }), (t.onload = function (e, a, o, r, n) { i(e, n), r && t.transform(e, n, r, o, {}); }), (t.transformCoordinates = function () { }), (t.getTransformedOptions = function (e, t) { var i, a, o, r, n = t.aspectRatio; if (!n) return t; i = {}; for (a in t) t.hasOwnProperty(a) && (i[a] = t[a]); return ( (i.crop = !0), (o = e.naturalWidth || e.width), (r = e.naturalHeight || e.height), o / r > n ? ((i.maxWidth = r * n), (i.maxHeight = r)) : ((i.maxWidth = o), (i.maxHeight = o / n)), i ); }), (t.renderImageToCanvas = function (e, t, i, a, o, r, n, s, l, d) { return e.getContext("2d").drawImage(t, i, a, o, r, n, s, l, d), e; }), (t.hasCanvasOption = function (e) { return e.canvas || e.crop || !!e.aspectRatio; }), (t.scale = function (e, i, a) { function o() { var e = Math.max((l || v) / v, (d || P) / P); e > 1 && ((v *= e), (P *= e)); } function r() { var e = Math.min((n || v) / v, (s || P) / P); e < 1 && ((v *= e), (P *= e)); } i = i || {}; var n, s, l, d, u, c, f, g, h, m, p, S = document.createElement("canvas"), b = e.getContext || (t.hasCanvasOption(i) && S.getContext), x = e.naturalWidth || e.width, y = e.naturalHeight || e.height, v = x, P = y; S.originalWidth = x; S.originalHeight = y; if ( (b && ((i = t.getTransformedOptions(e, i, a)), (f = i.left || 0), (g = i.top || 0), i.sourceWidth ? ((u = i.sourceWidth), void 0 !== i.right && void 0 === i.left && (f = x - u - i.right)) : (u = x - f - (i.right || 0)), i.sourceHeight ? ((c = i.sourceHeight), void 0 !== i.bottom && void 0 === i.top && (g = y - c - i.bottom)) : (c = y - g - (i.bottom || 0)), (v = u), (P = c)), (n = i.maxWidth), (s = i.maxHeight), (l = i.minWidth), (d = i.minHeight), b && n && s && i.crop ? ((v = n), (P = s), (p = u / c - n / s), p < 0 ? ((c = (s * u) / n), void 0 === i.top && void 0 === i.bottom && (g = (y - c) / 2)) : p > 0 && ((u = (n * c) / s), void 0 === i.left && void 0 === i.right && (f = (x - u) / 2))) : ((i.contain || i.cover) && ((l = n = n || l), (d = s = s || d)), i.cover ? (r(), o()) : (o(), r())), b) ) { if ( ((h = i.pixelRatio), h > 1 && ((S.style.width = v + "px"), (S.style.height = P + "px"), (v *= h), (P *= h), S.getContext("2d").scale(h, h)), (m = i.downsamplingRatio), m > 0 && m < 1 && v < u && P < c) ) for (; u * m > v;) (S.width = u * m), (S.height = c * m), t.renderImageToCanvas(S, e, f, g, u, c, 0, 0, S.width, S.height), (u = S.width), (c = S.height), (e = document.createElement("canvas")), (e.width = u), (e.height = c), t.renderImageToCanvas(e, S, 0, 0, u, c, 0, 0, u, c); return ( (S.width = v), (S.height = P), t.transformCoordinates(S, i), t.renderImageToCanvas(S, e, f, g, u, c, 0, 0, v, P) ); } return (e.width = v), (e.height = P), e; }), (t.createObjectURL = function (e) { return !!a && a.createObjectURL(e); }), (t.revokeObjectURL = function (e) { return !!a && a.revokeObjectURL(e); }), (t.readFile = function (e, t, i) { if (window.FileReader) { var a = new FileReader(); if (((a.onload = a.onerror = t), (i = i || "readAsDataURL"), a[i])) return a[i](e), a; } return !1; }), "function" == typeof define && define.amd ? define(function () { return t; }) : "object" == typeof module && module.exports ? (module.exports = t) : (e.loadImage = t); })(window), (function (e) { "use strict"; "function" == typeof define && define.amd ? define(["./load-image"], e) : e( "object" == typeof module && module.exports ? require("./load-image") : window.loadImage ); })(function (e) { "use strict"; var t = window.Blob && (Blob.prototype.slice || Blob.prototype.webkitSlice || Blob.prototype.mozSlice); (e.blobSlice = t && function () { var e = this.slice || this.webkitSlice || this.mozSlice; return e.apply(this, arguments); }), (e.metaDataParsers = { jpeg: { 65505: [] } }), (e.parseMetaData = function (t, i, a, o) { (a = a || {}), (o = o || {}); var r = this, n = a.maxMetaDataSize || 262144, s = !( window.DataView && t && t.size >= 12 && "image/jpeg" === t.type && e.blobSlice ); (!s && e.readFile( e.blobSlice.call(t, 0, n), function (t) { if (t.target.error) return console.log(t.target.error), void i(o); var n, s, l, d, u = t.target.result, c = new DataView(u), f = 2, g = c.byteLength - 4, h = f; if (65496 === c.getUint16(0)) { for ( ; f < g && ((n = c.getUint16(f)), (n >= 65504 && n <= 65519) || 65534 === n); ) { if (((s = c.getUint16(f + 2) + 2), f + s > c.byteLength)) { console.log("Invalid meta data: Invalid segment size."); break; } if ((l = e.metaDataParsers.jpeg[n])) for (d = 0; d < l.length; d += 1) l[d].call(r, c, f, s, o, a); (f += s), (h = f); } !a.disableImageHead && h > 6 && (u.slice ? (o.imageHead = u.slice(0, h)) : (o.imageHead = new Uint8Array(u).subarray(0, h))); } else console.log("Invalid JPEG file: Missing JPEG marker."); i(o); }, "readAsArrayBuffer" )) || i(o); }), (e.hasMetaOption = function (e) { return e.meta; }); var i = e.transform; e.transform = function (t, a, o, r, n) { e.hasMetaOption(a || {}) ? e.parseMetaData( r, function (n) { i.call(e, t, a, o, r, n); }, a, n ) : i.apply(e, arguments); }; }), (function (e) { "use strict"; "function" == typeof define && define.amd ? define(["./load-image", "./load-image-meta"], e) : "object" == typeof module && module.exports ? e(require("./load-image"), require("./load-image-meta")) : e(window.loadImage); })(function (e) { "use strict"; (e.ExifMap = function () { return this; }), (e.ExifMap.prototype.map = { Orientation: 274 }), (e.ExifMap.prototype.get = function (e) { return this[e] || this[this.map[e]]; }), (e.getExifThumbnail = function (e, t, i) { var a, o, r; if (!i || t + i > e.byteLength) return void console.log("Invalid Exif data: Invalid thumbnail data."); for (a = [], o = 0; o < i; o += 1) (r = e.getUint8(t + o)), a.push((r < 16 ? "0" : "") + r.toString(16)); return "data:image/jpeg,%" + a.join("%"); }), (e.exifTagTypes = { 1: { getValue: function (e, t) { return e.getUint8(t); }, size: 1 }, 2: { getValue: function (e, t) { return String.fromCharCode(e.getUint8(t)); }, size: 1, ascii: !0 }, 3: { getValue: function (e, t, i) { return e.getUint16(t, i); }, size: 2 }, 4: { getValue: function (e, t, i) { return e.getUint32(t, i); }, size: 4 }, 5: { getValue: function (e, t, i) { return e.getUint32(t, i) / e.getUint32(t + 4, i); }, size: 8 }, 9: { getValue: function (e, t, i) { return e.getInt32(t, i); }, size: 4 }, 10: { getValue: function (e, t, i) { return e.getInt32(t, i) / e.getInt32(t + 4, i); }, size: 8 } }), (e.exifTagTypes[7] = e.exifTagTypes[1]), (e.getExifValue = function (t, i, a, o, r, n) { var s, l, d, u, c, f, g = e.exifTagTypes[o]; if (!g) return void console.log("Invalid Exif data: Invalid tag type."); if ( ((s = g.size * r), (l = s > 4 ? i + t.getUint32(a + 8, n) : a + 8), l + s > t.byteLength) ) return void console.log("Invalid Exif data: Invalid data offset."); if (1 === r) return g.getValue(t, l, n); for (d = [], u = 0; u < r; u += 1) d[u] = g.getValue(t, l + u * g.size, n); if (g.ascii) { for (c = "", u = 0; u < d.length && ((f = d[u]), "\0" !== f); u += 1) c += f; return c; } return d; }), (e.parseExifTag = function (t, i, a, o, r) { var n = t.getUint16(a, o); r.exif[n] = e.getExifValue( t, i, a, t.getUint16(a + 2, o), t.getUint32(a + 4, o), o ); }), (e.parseExifTags = function (e, t, i, a, o) { var r, n, s; if (i + 6 > e.byteLength) return void console.log( "Invalid Exif data: Invalid directory offset." ); if ( ((r = e.getUint16(i, a)), (n = i + 2 + 12 * r), n + 4 > e.byteLength) ) return void console.log("Invalid Exif data: Invalid directory size."); for (s = 0; s < r; s += 1) this.parseExifTag(e, t, i + 2 + 12 * s, a, o); return e.getUint32(n, a); }), (e.parseExifData = function (t, i, a, o, r) { if (!r.disableExif) { var n, s, l, d = i + 10; if (1165519206 === t.getUint32(i + 4)) { if (d + 8 > t.byteLength) return void console.log( "Invalid Exif data: Invalid segment size." ); if (0 !== t.getUint16(i + 8)) return void console.log( "Invalid Exif data: Missing byte alignment offset." ); switch (t.getUint16(d)) { case 18761: n = !0; break; case 19789: n = !1; break; default: return void console.log( "Invalid Exif data: Invalid byte alignment marker." ); } if (42 !== t.getUint16(d + 2, n)) return void console.log( "Invalid Exif data: Missing TIFF marker." ); (s = t.getUint32(d + 4, n)), (o.exif = new e.ExifMap()), (s = e.parseExifTags(t, d, d + s, n, o)), s && !r.disableExifThumbnail && ((l = { exif: {} }), (s = e.parseExifTags(t, d, d + s, n, l)), l.exif[513] && (o.exif.Thumbnail = e.getExifThumbnail( t, d + l.exif[513], l.exif[514] ))), o.exif[34665] && !r.disableExifSub && e.parseExifTags(t, d, d + o.exif[34665], n, o), o.exif[34853] && !r.disableExifGps && e.parseExifTags(t, d, d + o.exif[34853], n, o); } } }), e.metaDataParsers.jpeg[65505].push(e.parseExifData); }), (function (e) { "use strict"; "function" == typeof define && define.amd ? define(["./load-image", "./load-image-exif"], e) : "object" == typeof module && module.exports ? e(require("./load-image"), require("./load-image-exif")) : e(window.loadImage); })(function (e) { "use strict"; (e.ExifMap.prototype.tags = { 256: "ImageWidth", 257: "ImageHeight", 34665: "ExifIFDPointer", 34853: "GPSInfoIFDPointer", 40965: "InteroperabilityIFDPointer", 258: "BitsPerSample", 259: "Compression", 262: "PhotometricInterpretation", 274: "Orientation", 277: "SamplesPerPixel", 284: "PlanarConfiguration", 530: "YCbCrSubSampling", 531: "YCbCrPositioning", 282: "XResolution", 283: "YResolution", 296: "ResolutionUnit", 273: "StripOffsets", 278: "RowsPerStrip", 279: "StripByteCounts", 513: "JPEGInterchangeFormat", 514: "JPEGInterchangeFormatLength", 301: "TransferFunction", 318: "WhitePoint", 319: "PrimaryChromaticities", 529: "YCbCrCoefficients", 532: "ReferenceBlackWhite", 306: "DateTime", 270: "ImageDescription", 271: "Make", 272: "Model", 305: "Software", 315: "Artist", 33432: "Copyright", 36864: "ExifVersion", 40960: "FlashpixVersion", 40961: "ColorSpace", 40962: "PixelXDimension", 40963: "PixelYDimension", 42240: "Gamma", 37121: "ComponentsConfiguration", 37122: "CompressedBitsPerPixel", 37500: "MakerNote", 37510: "UserComment", 40964: "RelatedSoundFile", 36867: "DateTimeOriginal", 36868: "DateTimeDigitized", 37520: "SubSecTime", 37521: "SubSecTimeOriginal", 37522: "SubSecTimeDigitized", 33434: "ExposureTime", 33437: "FNumber", 34850: "ExposureProgram", 34852: "SpectralSensitivity", 34855: "PhotographicSensitivity", 34856: "OECF", 34864: "SensitivityType", 34865: "StandardOutputSensitivity", 34866: "RecommendedExposureIndex", 34867: "ISOSpeed", 34868: "ISOSpeedLatitudeyyy", 34869: "ISOSpeedLatitudezzz", 37377: "ShutterSpeedValue", 37378: "ApertureValue", 37379: "BrightnessValue", 37380: "ExposureBias", 37381: "MaxApertureValue", 37382: "SubjectDistance", 37383: "MeteringMode", 37384: "LightSource", 37385: "Flash", 37396: "SubjectArea", 37386: "FocalLength", 41483: "FlashEnergy", 41484: "SpatialFrequencyResponse", 41486: "FocalPlaneXResolution", 41487: "FocalPlaneYResolution", 41488: "FocalPlaneResolutionUnit", 41492: "SubjectLocation", 41493: "ExposureIndex", 41495: "SensingMethod", 41728: "FileSource", 41729: "SceneType", 41730: "CFAPattern", 41985: "CustomRendered", 41986: "ExposureMode", 41987: "WhiteBalance", 41988: "DigitalZoomRatio", 41989: "FocalLengthIn35mmFilm", 41990: "SceneCaptureType", 41991: "GainControl", 41992: "Contrast", 41993: "Saturation", 41994: "Sharpness", 41995: "DeviceSettingDescription", 41996: "SubjectDistanceRange", 42016: "ImageUniqueID", 42032: "CameraOwnerName", 42033: "BodySerialNumber", 42034: "LensSpecification", 42035: "LensMake", 42036: "LensModel", 42037: "LensSerialNumber", 0: "GPSVersionID", 1: "GPSLatitudeRef", 2: "GPSLatitude", 3: "GPSLongitudeRef", 4: "GPSLongitude", 5: "GPSAltitudeRef", 6: "GPSAltitude", 7: "GPSTimeStamp", 8: "GPSSatellites", 9: "GPSStatus", 10: "GPSMeasureMode", 11: "GPSDOP", 12: "GPSSpeedRef", 13: "GPSSpeed", 14: "GPSTrackRef", 15: "GPSTrack", 16: "GPSImgDirectionRef", 17: "GPSImgDirection", 18: "GPSMapDatum", 19: "GPSDestLatitudeRef", 20: "GPSDestLatitude", 21: "GPSDestLongitudeRef", 22: "GPSDestLongitude", 23: "GPSDestBearingRef", 24: "GPSDestBearing", 25: "GPSDestDistanceRef", 26: "GPSDestDistance", 27: "GPSProcessingMethod", 28: "GPSAreaInformation", 29: "GPSDateStamp", 30: "GPSDifferential", 31: "GPSHPositioningError" }), (e.ExifMap.prototype.stringValues = { ExposureProgram: { 0: "Undefined", 1: "Manual", 2: "Normal program", 3: "Aperture priority", 4: "Shutter priority", 5: "Creative program", 6: "Action program", 7: "Portrait mode", 8: "Landscape mode" }, MeteringMode: { 0: "Unknown", 1: "Average", 2: "CenterWeightedAverage", 3: "Spot", 4: "MultiSpot", 5: "Pattern", 6: "Partial", 255: "Other" }, LightSource: { 0: "Unknown", 1: "Daylight", 2: "Fluorescent", 3: "Tungsten (incandescent light)", 4: "Flash", 9: "Fine weather", 10: "Cloudy weather", 11: "Shade", 12: "Daylight fluorescent (D 5700 - 7100K)", 13: "Day white fluorescent (N 4600 - 5400K)", 14: "Cool white fluorescent (W 3900 - 4500K)", 15: "White fluorescent (WW 3200 - 3700K)", 17: "Standard light A", 18: "Standard light B", 19: "Standard light C", 20: "D55", 21: "D65", 22: "D75", 23: "D50", 24: "ISO studio tungsten", 255: "Other" }, Flash: { 0: "Flash did not fire", 1: "Flash fired", 5: "Strobe return light not detected", 7: "Strobe return light detected", 9: "Flash fired, compulsory flash mode", 13: "Flash fired, compulsory flash mode, return light not detected", 15: "Flash fired, compulsory flash mode, return light detected", 16: "Flash did not fire, compulsory flash mode", 24: "Flash did not fire, auto mode", 25: "Flash fired, auto mode", 29: "Flash fired, auto mode, return light not detected", 31: "Flash fired, auto mode, return light detected", 32: "No flash function", 65: "Flash fired, red-eye reduction mode", 69: "Flash fired, red-eye reduction mode, return light not detected", 71: "Flash fired, red-eye reduction mode, return light detected", 73: "Flash fired, compulsory flash mode, red-eye reduction mode", 77: "Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected", 79: "Flash fired, compulsory flash mode, red-eye reduction mode, return light detected", 89: "Flash fired, auto mode, red-eye reduction mode", 93: "Flash fired, auto mode, return light not detected, red-eye reduction mode", 95: "Flash fired, auto mode, return light detected, red-eye reduction mode" }, SensingMethod: { 1: "Undefined", 2: "One-chip color area sensor", 3: "Two-chip color area sensor", 4: "Three-chip color area sensor", 5: "Color sequential area sensor", 7: "Trilinear sensor", 8: "Color sequential linear sensor" }, SceneCaptureType: { 0: "Standard", 1: "Landscape", 2: "Portrait", 3: "Night scene" }, SceneType: { 1: "Directly photographed" }, CustomRendered: { 0: "Normal process", 1: "Custom process" }, WhiteBalance: { 0: "Auto white balance", 1: "Manual white balance" }, GainControl: { 0: "None", 1: "Low gain up", 2: "High gain up", 3: "Low gain down", 4: "High gain down" }, Contrast: { 0: "Normal", 1: "Soft", 2: "Hard" }, Saturation: { 0: "Normal", 1: "Low saturation", 2: "High saturation" }, Sharpness: { 0: "Normal", 1: "Soft", 2: "Hard" }, SubjectDistanceRange: { 0: "Unknown", 1: "Macro", 2: "Close view", 3: "Distant view" }, FileSource: { 3: "DSC" }, ComponentsConfiguration: { 0: "", 1: "Y", 2: "Cb", 3: "Cr", 4: "R", 5: "G", 6: "B" }, Orientation: { 1: "top-left", 2: "top-right", 3: "bottom-right", 4: "bottom-left", 5: "left-top", 6: "right-top", 7: "right-bottom", 8: "left-bottom" } }), (e.ExifMap.prototype.getText = function (e) { var t = this.get(e); switch (e) { case "LightSource": case "Flash": case "MeteringMode": case "ExposureProgram": case "SensingMethod": case "SceneCaptureType": case "SceneType": case "CustomRendered": case "WhiteBalance": case "GainControl": case "Contrast": case "Saturation": case "Sharpness": case "SubjectDistanceRange": case "FileSource": case "Orientation": return this.stringValues[e][t]; case "ExifVersion": case "FlashpixVersion": if (!t) return; return String.fromCharCode(t[0], t[1], t[2], t[3]); case "ComponentsConfiguration": if (!t) return; return ( this.stringValues[e][t[0]] + this.stringValues[e][t[1]] + this.stringValues[e][t[2]] + this.stringValues[e][t[3]] ); case "GPSVersionID": if (!t) return; return t[0] + "." + t[1] + "." + t[2] + "." + t[3]; } return String(t); }), (function (e) { var t, i = e.tags, a = e.map; for (t in i) i.hasOwnProperty(t) && (a[i[t]] = t); })(e.ExifMap.prototype), (e.ExifMap.prototype.getAll = function () { var e, t, i = {}; for (e in this) this.hasOwnProperty(e) && ((t = this.tags[e]), t && (i[t] = this.getText(t))); return i; }); }), (function (e) { "use strict"; "function" == typeof define && define.amd ? define(["./load-image"], e) : e( "object" == typeof module && module.exports ? require("./load-image") : window.loadImage ); })(function (e) { "use strict"; var t = e.hasCanvasOption, i = e.hasMetaOption, a = e.transformCoordinates, o = e.getTransformedOptions; (e.hasCanvasOption = function (i) { return !!i.orientation || t.call(e, i); }), (e.hasMetaOption = function (t) { return t.orientation === !0 || i.call(e, t); }), (e.transformCoordinates = function (t, i) { a.call(e, t, i); var o = t.getContext("2d"), r = t.width, n = t.height, s = t.style.width, l = t.style.height, d = i.orientation; if (d && !(d > 8)) switch ( (d > 4 && ((t.width = n), (t.height = r), (t.style.width = l), (t.style.height = s)), d) ) { case 2: o.translate(r, 0), o.scale(-1, 1); break; case 3: o.translate(r, n), o.rotate(Math.PI); break; case 4: o.translate(0, n), o.scale(1, -1); break; case 5: o.rotate(0.5 * Math.PI), o.scale(1, -1); break; case 6: o.rotate(0.5 * Math.PI), o.translate(0, -n); break; case 7: o.rotate(0.5 * Math.PI), o.translate(r, -n), o.scale(-1, 1); break; case 8: o.rotate(-0.5 * Math.PI), o.translate(-r, 0); } }), (e.getTransformedOptions = function (t, i, a) { var r, n, s = o.call(e, t, i), l = s.orientation; if ( (l === !0 && a && a.exif && (l = a.exif.get("Orientation")), !l || l > 8 || 1 === l) ) return s; r = {}; for (n in s) s.hasOwnProperty(n) && (r[n] = s[n]); switch (((r.orientation = l), l)) { case 2: (r.left = s.right), (r.right = s.left); break; case 3: (r.left = s.right), (r.top = s.bottom), (r.right = s.left), (r.bottom = s.top); break; case 4: (r.top = s.bottom), (r.bottom = s.top); break; case 5: (r.left = s.top), (r.top = s.left), (r.right = s.bottom), (r.bottom = s.right); break; case 6: (r.left = s.top), (r.top = s.right), (r.right = s.bottom), (r.bottom = s.left); break; case 7: (r.left = s.bottom), (r.top = s.right), (r.right = s.top), (r.bottom = s.left); break; case 8: (r.left = s.bottom), (r.top = s.left), (r.right = s.top), (r.bottom = s.right); } return ( s.orientation > 4 && ((r.maxWidth = s.maxHeight), (r.maxHeight = s.maxWidth), (r.minWidth = s.minHeight), (r.minHeight = s.minWidth), (r.sourceWidth = s.sourceHeight), (r.sourceHeight = s.sourceWidth)), r ); }); }); /** * History.js Core * @author Benjamin Arthur Lupton <contact@balupton.com> * @copyright 2010-2011 Benjamin Arthur Lupton <contact@balupton.com> * @license New BSD License <http://creativecommons.org/licenses/BSD/> */ typeof JSON != "object" && (JSON = {}), (function () { "use strict"; function f(e) { return e < 10 ? "0" + e : e; } function quote(e) { return ( (escapable.lastIndex = 0), escapable.test(e) ? '"' + e.replace(escapable, function (e) { var t = meta[e]; return typeof t == "string" ? t : "\\u" + ("0000" + e.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + e + '"' ); } function str(e, t) { var n, r, i, s, o = gap, u, a = t[e]; a && typeof a == "object" && typeof a.toJSON == "function" && (a = a.toJSON(e)), typeof rep == "function" && (a = rep.call(t, e, a)); switch (typeof a) { case "string": return quote(a); case "number": return isFinite(a) ? String(a) : "null"; case "boolean": case "null": return String(a); case "object": if (!a) return "null"; (gap += indent), (u = []); if (Object.prototype.toString.apply(a) === "[object Array]") { s = a.length; for (n = 0; n < s; n += 1) u[n] = str(n, a) || "null"; return ( (i = u.length === 0 ? "[]" : gap ? "[\n" + gap + u.join(",\n" + gap) + "\n" + o + "]" : "[" + u.join(",") + "]"), (gap = o), i ); } if (rep && typeof rep == "object") { s = rep.length; for (n = 0; n < s; n += 1) typeof rep[n] == "string" && ((r = rep[n]), (i = str(r, a)), i && u.push(quote(r) + (gap ? ": " : ":") + i)); } else for (r in a) Object.prototype.hasOwnProperty.call(a, r) && ((i = str(r, a)), i && u.push(quote(r) + (gap ? ": " : ":") + i)); return ( (i = u.length === 0 ? "{}" : gap ? "{\n" + gap + u.join(",\n" + gap) + "\n" + o + "}" : "{" + u.join(",") + "}"), (gap = o), i ); } } typeof Date.prototype.toJSON != "function" && ((Date.prototype.toJSON = function (e) { return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null; }), (String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function ( e ) { return this.valueOf(); })); var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { "\b": "\\b", " ": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" }, rep; typeof JSON.stringify != "function" && (JSON.stringify = function (e, t, n) { var r; (gap = ""), (indent = ""); if (typeof n == "number") for (r = 0; r < n; r += 1) indent += " "; else typeof n == "string" && (indent = n); rep = t; if ( !t || typeof t == "function" || (typeof t == "object" && typeof t.length == "number") ) return str("", { "": e }); throw new Error("JSON.stringify"); }), typeof JSON.parse != "function" && (JSON.parse = function (text, reviver) { function walk(e, t) { var n, r, i = e[t]; if (i && typeof i == "object") for (n in i) Object.prototype.hasOwnProperty.call(i, n) && ((r = walk(i, n)), r !== undefined ? (i[n] = r) : delete i[n]); return reviver.call(e, t, i); } var j; (text = String(text)), (cx.lastIndex = 0), cx.test(text) && (text = text.replace(cx, function (e) { return ( "\\u" + ("0000" + e.charCodeAt(0).toString(16)).slice(-4) ); })); if ( /^[\],:{}\s]*$/.test( text .replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") .replace( /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]" ) .replace(/(?:^|:|,)(?:\s*\[)+/g, "") ) ) return ( (j = eval("(" + text + ")")), typeof reviver == "function" ? walk({ "": j }, "") : j ); throw new SyntaxError("JSON.parse"); }); })(), (function (e, t) { "use strict"; var n = (e.History = e.History || {}), r = e.jQuery; if (typeof n.Adapter != "undefined") throw new Error("History.js Adapter has already been loaded..."); (n.Adapter = { bind: function (e, t, n) { r(e).bind(t, n); }, trigger: function (e, t, n) { r(e).trigger(t, n); }, extractEventData: function (e, n, r) { var i = (n && n.originalEvent && n.originalEvent[e]) || (r && r[e]) || t; return i; }, onDomLoad: function (e) { r(e); } }), typeof n.init != "undefined" && n.init(); })(window), (function (e, t) { "use strict"; var n = e.document, r = e.setTimeout || r, i = e.clearTimeout || i, s = e.setInterval || s, o = (e.History = e.History || {}); if (typeof o.initHtml4 != "undefined") throw new Error("History.js HTML4 Support has already been loaded..."); (o.initHtml4 = function () { if (typeof o.initHtml4.initialized != "undefined") return !1; (o.initHtml4.initialized = !0), (o.enabled = !0), (o.savedHashes = []), (o.isLastHash = function (e) { var t = o.getHashByIndex(), n; return (n = e === t), n; }), (o.isHashEqual = function (e, t) { return ( (e = encodeURIComponent(e).replace(/%25/g, "%")), (t = encodeURIComponent(t).replace(/%25/g, "%")), e === t ); }), (o.saveHash = function (e) { return o.isLastHash(e) ? !1 : (o.savedHashes.push(e), !0); }), (o.getHashByIndex = function (e) { var t = null; return ( typeof e == "undefined" ? (t = o.savedHashes[o.savedHashes.length - 1]) : e < 0 ? (t = o.savedHashes[o.savedHashes.length + e]) : (t = o.savedHashes[e]), t ); }), (o.discardedHashes = {}), (o.discardedStates = {}), (o.discardState = function (e, t, n) { var r = o.getHashByState(e), i; return ( (i = { discardedState: e, backState: n, forwardState: t }), (o.discardedStates[r] = i), !0 ); }), (o.discardHash = function (e, t, n) { var r = { discardedHash: e, backState: n, forwardState: t }; return (o.discardedHashes[e] = r), !0; }), (o.discardedState = function (e) { var t = o.getHashByState(e), n; return (n = o.discardedStates[t] || !1), n; }), (o.discardedHash = function (e) { var t = o.discardedHashes[e] || !1; return t; }), (o.recycleState = function (e) { var t = o.getHashByState(e); return o.discardedState(e) && delete o.discardedStates[t], !0; }), o.emulated.hashChange && ((o.hashChangeInit = function () { o.checkerFunction = null; var t = "", r, i, u, a, f = Boolean(o.getHash()); return ( o.isInternetExplorer() ? ((r = "historyjs-iframe"), (i = n.createElement("iframe")), i.setAttribute("id", r), i.setAttribute("src", "#"), (i.style.display = "none"), n.body.appendChild(i), i.contentWindow.document.open(), i.contentWindow.document.close(), (u = ""), (a = !1), (o.checkerFunction = function () { if (a) return !1; a = !0; var n = o.getHash(), r = o.getHash(i.contentWindow.document); return ( n !== t ? ((t = n), r !== n && ((u = r = n), i.contentWindow.document.open(), i.contentWindow.document.close(), (i.contentWindow.document.location.hash = o.escapeHash( n ))), o.Adapter.trigger(e, "hashchange")) : r !== u && ((u = r), f && r === "" ? o.back() : o.setHash(r, !1)), (a = !1), !0 ); })) : (o.checkerFunction = function () { var n = o.getHash() || ""; return ( n !== t && ((t = n), o.Adapter.trigger(e, "hashchange")), !0 ); }), o.intervalList.push( s(o.checkerFunction, o.options.hashChangeInterval) ), !0 ); }), o.Adapter.onDomLoad(o.hashChangeInit)), o.emulated.pushState && ((o.onHashChange = function (t) { var n = (t && t.newURL) || o.getLocationHref(), r = o.getHashByUrl(n), i = null, s = null, u = null, a; return o.isLastHash(r) ? (o.busy(!1), !1) : (o.doubleCheckComplete(), o.saveHash(r), r && o.isTraditionalAnchor(r) ? (o.Adapter.trigger(e, "anchorchange"), o.busy(!1), !1) : ((i = o.extractState( o.getFullUrl(r || o.getLocationHref()), !0 )), o.isLastSavedState(i) ? (o.busy(!1), !1) : ((s = o.getHashByState(i)), (a = o.discardedState(i)), a ? (o.getHashByIndex(-2) === o.getHashByState(a.forwardState) ? o.back(!1) : o.forward(!1), !1) : (o.pushState(i.data, i.title, encodeURI(i.url), !1), !0)))); }), o.Adapter.bind(e, "hashchange", o.onHashChange), (o.pushState = function (t, n, r, i) { r = encodeURI(r).replace(/%25/g, "%"); if (o.getHashByUrl(r)) throw new Error( "History.js does not support states with fragment-identifiers (hashes/anchors)." ); if (i !== !1 && o.busy()) return ( o.pushQueue({ scope: o, callback: o.pushState, args: arguments, queue: i }), !1 ); o.busy(!0); var s = o.createStateObject(t, n, r), u = o.getHashByState(s), a = o.getState(!1), f = o.getHashByState(a), l = o.getHash(), c = o.expectedStateId == s.id; return ( o.storeState(s), (o.expectedStateId = s.id), o.recycleState(s), o.setTitle(s), u === f ? (o.busy(!1), !1) : (o.saveState(s), c || o.Adapter.trigger(e, "statechange"), !o.isHashEqual(u, l) && !o.isHashEqual(u, o.getShortUrl(o.getLocationHref())) && o.setHash(u, !1), o.busy(!1), !0) ); }), (o.replaceState = function (t, n, r, i) { r = encodeURI(r).replace(/%25/g, "%"); if (o.getHashByUrl(r)) throw new Error( "History.js does not support states with fragment-identifiers (hashes/anchors)." ); if (i !== !1 && o.busy()) return ( o.pushQueue({ scope: o, callback: o.replaceState, args: arguments, queue: i }), !1 ); o.busy(!0); var s = o.createStateObject(t, n, r), u = o.getHashByState(s), a = o.getState(!1), f = o.getHashByState(a), l = o.getStateByIndex(-2); return ( o.discardState(a, s, l), u === f ? (o.storeState(s), (o.expectedStateId = s.id), o.recycleState(s), o.setTitle(s), o.saveState(s), o.Adapter.trigger(e, "statechange"), o.busy(!1)) : o.pushState(s.data, s.title, s.url, !1), !0 ); })), o.emulated.pushState && o.getHash() && !o.emulated.hashChange && o.Adapter.onDomLoad(function () { o.Adapter.trigger(e, "hashchange"); }); }), typeof o.init != "undefined" && o.init(); })(window), (function (e, t) { "use strict"; var n = e.console || t, r = e.document, i = e.navigator, s = !1, o = e.setTimeout, u = e.clearTimeout, a = e.setInterval, f = e.clearInterval, l = e.JSON, c = e.alert, h = (e.History = e.History || {}), p = e.history; try { (s = e.sessionStorage), s.setItem("TEST", "1"), s.removeItem("TEST"); } catch (d) { s = !1; } (l.stringify = l.stringify || l.encode), (l.parse = l.parse || l.decode); if (typeof h.init != "undefined") throw new Error("History.js Core has already been loaded..."); (h.init = function (e) { return typeof h.Adapter == "undefined" ? !1 : (typeof h.initCore != "undefined" && h.initCore(), typeof h.initHtml4 != "undefined" && h.initHtml4(), !0); }), (h.initCore = function (d) { if (typeof h.initCore.initialized != "undefined") return !1; (h.initCore.initialized = !0), (h.options = h.options || {}), (h.options.hashChangeInterval = h.options.hashChangeInterval || 100), (h.options.safariPollInterval = h.options.safariPollInterval || 500), (h.options.doubleCheckInterval = h.options.doubleCheckInterval || 500), (h.options.disableSuid = h.options.disableSuid || !1), (h.options.storeInterval = h.options.storeInterval || 1e3), (h.options.busyDelay = h.options.busyDelay || 250), (h.options.debug = h.options.debug || !1), (h.options.initialTitle = h.options.initialTitle || r.title), (h.options.html4Mode = h.options.html4Mode || !1), (h.options.delayInit = h.options.delayInit || !1), (h.intervalList = []), (h.clearAllIntervals = function () { var e, t = h.intervalList; if (typeof t != "undefined" && t !== null) { for (e = 0; e < t.length; e++) f(t[e]); h.intervalList = null; } }), (h.debug = function () { (h.options.debug || !1) && h.log.apply(h, arguments); }), (h.log = function () { var e = typeof n != "undefined" && typeof n.log != "undefined" && typeof n.log.apply != "undefined", t = r.getElementById("log"), i, s, o, u, a; e ? ((u = Array.prototype.slice.call(arguments)), (i = u.shift()), typeof n.debug != "undefined" ? n.debug.apply(n, [i, u]) : n.log.apply(n, [i, u])) : (i = "\n" + arguments[0] + "\n"); for (s = 1, o = arguments.length; s < o; ++s) { a = arguments[s]; if (typeof a == "object" && typeof l != "undefined") try { a = l.stringify(a); } catch (f) { } i += "\n" + a + "\n"; } return ( t ? ((t.value += i + "\n-----\n"), (t.scrollTop = t.scrollHeight - t.clientHeight)) : e || c(i), !0 ); }), (h.getInternetExplorerMajorVersion = function () { var e = (h.getInternetExplorerMajorVersion.cached = typeof h.getInternetExplorerMajorVersion.cached != "undefined" ? h.getInternetExplorerMajorVersion.cached : (function () { var e = 3, t = r.createElement("div"), n = t.getElementsByTagName("i"); while ( (t.innerHTML = "<!--[if gt IE " + ++e + "]><i></i><![endif]-->") && n[0] ); return e > 4 ? e : !1; })()); return e; }), (h.isInternetExplorer = function () { var e = (h.isInternetExplorer.cached = typeof h.isInternetExplorer.cached != "undefined" ? h.isInternetExplorer.cached : Boolean(h.getInternetExplorerMajorVersion())); return e; }), h.options.html4Mode ? (h.emulated = { pushState: !0, hashChange: !0 }) : (h.emulated = { pushState: !Boolean( e.history && e.history.pushState && e.history.replaceState && !/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test( i.userAgent ) && !/AppleWebKit\/5([0-2]|3[0-2])/i.test(i.userAgent) ), hashChange: Boolean( !("onhashchange" in e || "onhashchange" in r) || (h.isInternetExplorer() && h.getInternetExplorerMajorVersion() < 8) ) }), (h.enabled = !h.emulated.pushState), (h.bugs = { setHash: Boolean( !h.emulated.pushState && i.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent) ), safariPoll: Boolean( !h.emulated.pushState && i.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent) ), ieDoubleCheck: Boolean( h.isInternetExplorer() && h.getInternetExplorerMajorVersion() < 8 ), hashEscape: Boolean( h.isInternetExplorer() && h.getInternetExplorerMajorVersion() < 7 ) }), (h.isEmptyObject = function (e) { for (var t in e) if (e.hasOwnProperty(t)) return !1; return !0; }), (h.cloneObject = function (e) { var t, n; return e ? ((t = l.stringify(e)), (n = l.parse(t))) : (n = {}), n; }), (h.getRootUrl = function () { var e = r.location.protocol + "//" + (r.location.hostname || r.location.host); if (r.location.port || !1) e += ":" + r.location.port; return (e += "/"), e; }), (h.getBaseHref = function () { var e = r.getElementsByTagName("base"), t = null, n = ""; return ( e.length === 1 && ((t = e[0]), (n = t.href.replace(/[^\/]+$/, ""))), (n = n.replace(/\/+$/, "")), n && (n += "/"), n ); }), (h.getBaseUrl = function () { var e = h.getBaseHref() || h.getBasePageUrl() || h.getRootUrl(); return e; }), (h.getPageUrl = function () { var e = h.getState(!1, !1), t = (e || {}).url || h.getLocationHref(), n; return ( (n = t.replace(/\/+$/, "").replace(/[^\/]+$/, function (e, t, n) { return /\./.test(e) ? e : e + "/"; })), n ); }), (h.getBasePageUrl = function () { var e = h .getLocationHref() .replace(/[#\?].*/, "") .replace(/[^\/]+$/, function (e, t, n) { return /[^\/]$/.test(e) ? "" : e; }) .replace(/\/+$/, "") + "/"; return e; }), (h.getFullUrl = function (e, t) { var n = e, r = e.substring(0, 1); return ( (t = typeof t == "undefined" ? !0 : t), /[a-z]+\:\/\//.test(e) || (r === "/" ? (n = h.getRootUrl() + e.replace(/^\/+/, "")) : r === "#" ? (n = h.getPageUrl().replace(/#.*/, "") + e) : r === "?" ? (n = h.getPageUrl().replace(/[\?#].*/, "") + e) : t ? (n = h.getBaseUrl() + e.replace(/^(\.\/)+/, "")) : (n = h.getBasePageUrl() + e.replace(/^(\.\/)+/, ""))), n.replace(/\#$/, "") ); }), (h.getShortUrl = function (e) { var t = e, n = h.getBaseUrl(), r = h.getRootUrl(); return ( h.emulated.pushState && (t = t.replace(n, "")), (t = t.replace(r, "/")), h.isTraditionalAnchor(t) && (t = "./" + t), (t = t.replace(/^(\.\/)+/g, "./").replace(/\#$/, "")), t ); }), (h.getLocationHref = function (e) { return ( (e = e || r), e.URL === e.location.href ? e.location.href : e.location.href === decodeURIComponent(e.URL) ? e.URL : e.location.hash && decodeURIComponent(e.location.href.replace(/^[^#]+/, "")) === e.location.hash ? e.location.href : e.URL.indexOf("#") == -1 && e.location.href.indexOf("#") != -1 ? e.location.href : e.URL || e.location.href ); }), (h.store = {}), (h.idToState = h.idToState || {}), (h.stateToId = h.stateToId || {}), (h.urlToId = h.urlToId || {}), (h.storedStates = h.storedStates || []), (h.savedStates = h.savedStates || []), (h.normalizeStore = function () { (h.store.idToState = h.store.idToState || {}), (h.store.urlToId = h.store.urlToId || {}), (h.store.stateToId = h.store.stateToId || {}); }), (h.getState = function (e, t) { typeof e == "undefined" && (e = !0), typeof t == "undefined" && (t = !0); var n = h.getLastSavedState(); return ( !n && t && (n = h.createStateObject()), e && ((n = h.cloneObject(n)), (n.url = n.cleanUrl || n.url)), n ); }), (h.getIdByState = function (e) { var t = h.extractId(e.url), n; if (!t) { n = h.getStateString(e); if (typeof h.stateToId[n] != "undefined") t = h.stateToId[n]; else if (typeof h.store.stateToId[n] != "undefined") t = h.store.stateToId[n]; else { for (; ;) { t = new Date().getTime() + String(Math.random()).replace(/\D/g, ""); if ( typeof h.idToState[t] == "undefined" && typeof h.store.idToState[t] == "undefined" ) break; } (h.stateToId[n] = t), (h.idToState[t] = e); } } return t; }), (h.normalizeState = function (e) { var t, n; if (!e || typeof e != "object") e = {}; if (typeof e.normalized != "undefined") return e; if (!e.data || typeof e.data != "object") e.data = {}; return ( (t = {}), (t.normalized = !0), (t.title = e.title || ""), (t.url = h.getFullUrl(e.url ? e.url : h.getLocationHref())), (t.hash = h.getShortUrl(t.url)), (t.data = h.cloneObject(e.data)), (t.id = h.getIdByState(t)), (t.cleanUrl = t.url.replace(/\??\&_suid.*/, "")), (t.url = t.cleanUrl), (n = !h.isEmptyObject(t.data)), (t.title || n) && h.options.disableSuid !== !0 && ((t.hash = h.getShortUrl(t.url).replace(/\??\&_suid.*/, "")), /\?/.test(t.hash) || (t.hash += "?"), (t.hash += "&_suid=" + t.id)), (t.hashedUrl = h.getFullUrl(t.hash)), (h.emulated.pushState || h.bugs.safariPoll) && h.hasUrlDuplicate(t) && (t.url = t.hashedUrl), t ); }), (h.createStateObject = function (e, t, n) { var r = { data: e, title: t, url: n }; return (r = h.normalizeState(r)), r; }), (h.getStateById = function (e) { e = String(e); var n = h.idToState[e] || h.store.idToState[e] || t; return n; }), (h.getStateString = function (e) { var t, n, r; return ( (t = h.normalizeState(e)), (n = { data: t.data, title: e.title, url: e.url }), (r = l.stringify(n)), r ); }), (h.getStateId = function (e) { var t, n; return (t = h.normalizeState(e)), (n = t.id), n; }), (h.getHashByState = function (e) { var t, n; return (t = h.normalizeState(e)), (n = t.hash), n; }), (h.extractId = function (e) { var t, n, r, i; return ( e.indexOf("#") != -1 ? (i = e.split("#")[0]) : (i = e), (n = /(.*)\&_suid=([0-9]+)$/.exec(i)), (r = n ? n[1] || e : e), (t = n ? String(n[2] || "") : ""), t || !1 ); }), (h.isTraditionalAnchor = function (e) { var t = !/[\/\?\.]/.test(e); return t; }), (h.extractState = function (e, t) { var n = null, r, i; return ( (t = t || !1), (r = h.extractId(e)), r && (n = h.getStateById(r)), n || ((i = h.getFullUrl(e)), (r = h.getIdByUrl(i) || !1), r && (n = h.getStateById(r)), !n && t && !h.isTraditionalAnchor(e) && (n = h.createStateObject(null, null, i))), n ); }), (h.getIdByUrl = function (e) { var n = h.urlToId[e] || h.store.urlToId[e] || t; return n; }), (h.getLastSavedState = function () { return h.savedStates[h.savedStates.length - 1] || t; }), (h.getLastStoredState = function () { return h.storedStates[h.storedStates.length - 1] || t; }), (h.hasUrlDuplicate = function (e) { var t = !1, n; return (n = h.extractState(e.url)), (t = n && n.id !== e.id), t; }), (h.storeState = function (e) { return ( (h.urlToId[e.url] = e.id), h.storedStates.push(h.cloneObject(e)), e ); }), (h.isLastSavedState = function (e) { var t = !1, n, r, i; return ( h.savedStates.length && ((n = e.id), (r = h.getLastSavedState()), (i = r.id), (t = n === i)), t ); }), (h.saveState = function (e) { return h.isLastSavedState(e) ? !1 : (h.savedStates.push(h.cloneObject(e)), !0); }), (h.getStateByIndex = function (e) { var t = null; return ( typeof e == "undefined" ? (t = h.savedStates[h.savedStates.length - 1]) : e < 0 ? (t = h.savedStates[h.savedStates.length + e]) : (t = h.savedStates[e]), t ); }), (h.getCurrentIndex = function () { var e = null; return ( h.savedStates.length < 1 ? (e = 0) : (e = h.savedStates.length - 1), e ); }), (h.getHash = function (e) { var t = h.getLocationHref(e), n; return (n = h.getHashByUrl(t)), n; }), (h.unescapeHash = function (e) { var t = h.normalizeHash(e); return (t = decodeURIComponent(t)), t; }), (h.normalizeHash = function (e) { var t = e.replace(/[^#]*#/, "").replace(/#.*/, ""); return t; }), (h.setHash = function (e, t) { var n, i; return t !== !1 && h.busy() ? (h.pushQueue({ scope: h, callback: h.setHash, args: arguments, queue: t }), !1) : (h.busy(!0), (n = h.extractState(e, !0)), n && !h.emulated.pushState ? h.pushState(n.data, n.title, n.url, !1) : h.getHash() !== e && (h.bugs.setHash ? ((i = h.getPageUrl()), h.pushState(null, null, i + "#" + e, !1)) : (r.location.hash = e)), h); }), (h.escapeHash = function (t) { var n = h.normalizeHash(t); return ( (n = e.encodeURIComponent(n)), h.bugs.hashEscape || (n = n .replace(/\%21/g, "!") .replace(/\%26/g, "&") .replace(/\%3D/g, "=") .replace(/\%3F/g, "?")), n ); }), (h.getHashByUrl = function (e) { var t = String(e).replace(/([^#]*)#?([^#]*)#?(.*)/, "$2"); return (t = h.unescapeHash(t)), t; }), (h.setTitle = function (e) { var t = e.title, n; t || ((n = h.getStateByIndex(0)), n && n.url === e.url && (t = n.title || h.options.initialTitle)); try { r.getElementsByTagName("title")[0].innerHTML = t .replace("<", "<") .replace(">", ">") .replace(" & ", " & "); } catch (i) { } return (r.title = t), h; }), (h.queues = []), (h.busy = function (e) { typeof e != "undefined" ? (h.busy.flag = e) : typeof h.busy.flag == "undefined" && (h.busy.flag = !1); if (!h.busy.flag) { u(h.busy.timeout); var t = function () { var e, n, r; if (h.busy.flag) return; for (e = h.queues.length - 1; e >= 0; --e) { n = h.queues[e]; if (n.length === 0) continue; (r = n.shift()), h.fireQueueItem(r), (h.busy.timeout = o(t, h.options.busyDelay)); } }; h.busy.timeout = o(t, h.options.busyDelay); } return h.busy.flag; }), (h.busy.flag = !1), (h.fireQueueItem = function (e) { return e.callback.apply(e.scope || h, e.args || []); }), (h.pushQueue = function (e) { return ( (h.queues[e.queue || 0] = h.queues[e.queue || 0] || []), h.queues[e.queue || 0].push(e), h ); }), (h.queue = function (e, t) { return ( typeof e == "function" && (e = { callback: e }), typeof t != "undefined" && (e.queue = t), h.busy() ? h.pushQueue(e) : h.fireQueueItem(e), h ); }), (h.clearQueue = function () { return (h.busy.flag = !1), (h.queues = []), h; }), (h.stateChanged = !1), (h.doubleChecker = !1), (h.doubleCheckComplete = function () { return (h.stateChanged = !0), h.doubleCheckClear(), h; }), (h.doubleCheckClear = function () { return ( h.doubleChecker && (u(h.doubleChecker), (h.doubleChecker = !1)), h ); }), (h.doubleCheck = function (e) { return ( (h.stateChanged = !1), h.doubleCheckClear(), h.bugs.ieDoubleCheck && (h.doubleChecker = o(function () { return h.doubleCheckClear(), h.stateChanged || e(), !0; }, h.options.doubleCheckInterval)), h ); }), (h.safariStatePoll = function () { var t = h.extractState(h.getLocationHref()), n; if (!h.isLastSavedState(t)) return ( (n = t), n || (n = h.createStateObject()), h.Adapter.trigger(e, "popstate"), h ); return; }), (h.back = function (e) { return e !== !1 && h.busy() ? (h.pushQueue({ scope: h, callback: h.back, args: arguments, queue: e }), !1) : (h.busy(!0), h.doubleCheck(function () { h.back(!1); }), p.go(-1), !0); }), (h.forward = function (e) { return e !== !1 && h.busy() ? (h.pushQueue({ scope: h, callback: h.forward, args: arguments, queue: e }), !1) : (h.busy(!0), h.doubleCheck(function () { h.forward(!1); }), p.go(1), !0); }), (h.go = function (e, t) { var n; if (e > 0) for (n = 1; n <= e; ++n) h.forward(t); else { if (!(e < 0)) throw new Error( "History.go: History.go requires a positive or negative integer passed." ); for (n = -1; n >= e; --n) h.back(t); } return h; }); if (h.emulated.pushState) { var v = function () { }; (h.pushState = h.pushState || v), (h.replaceState = h.replaceState || v); } else (h.onPopState = function (t, n) { var r = !1, i = !1, s, o; return ( h.doubleCheckComplete(), (s = h.getHash()), s ? ((o = h.extractState(s || h.getLocationHref(), !0)), o ? h.replaceState(o.data, o.title, o.url, !1) : (h.Adapter.trigger(e, "anchorchange"), h.busy(!1)), (h.expectedStateId = !1), !1) : ((r = h.Adapter.extractEventData("state", t, n) || !1), r ? (i = h.getStateById(r)) : h.expectedStateId ? (i = h.getStateById(h.expectedStateId)) : (i = h.extractState(h.getLocationHref())), i || (i = h.createStateObject(null, null, h.getLocationHref())), (h.expectedStateId = !1), h.isLastSavedState(i) ? (h.busy(!1), !1) : (h.storeState(i), h.saveState(i), h.setTitle(i), h.Adapter.trigger(e, "statechange"), h.busy(!1), !0)) ); }), h.Adapter.bind(e, "popstate", h.onPopState), (h.pushState = function (t, n, r, i) { if (h.getHashByUrl(r) && h.emulated.pushState) throw new Error( "History.js does not support states with fragement-identifiers (hashes/anchors)." ); if (i !== !1 && h.busy()) return ( h.pushQueue({ scope: h, callback: h.pushState, args: arguments, queue: i }), !1 ); h.busy(!0); var s = h.createStateObject(t, n, r); return ( h.isLastSavedState(s) ? h.busy(!1) : (h.storeState(s), (h.expectedStateId = s.id), p.pushState(s.id, s.title, s.url), h.Adapter.trigger(e, "popstate")), !0 ); }), (h.replaceState = function (t, n, r, i) { if (h.getHashByUrl(r) && h.emulated.pushState) throw new Error( "History.js does not support states with fragement-identifiers (hashes/anchors)." ); if (i !== !1 && h.busy()) return ( h.pushQueue({ scope: h, callback: h.replaceState, args: arguments, queue: i }), !1 ); h.busy(!0); var s = h.createStateObject(t, n, r); return ( h.isLastSavedState(s) ? h.busy(!1) : (h.storeState(s), (h.expectedStateId = s.id), p.replaceState(s.id, s.title, s.url), h.Adapter.trigger(e, "popstate")), !0 ); }); if (s) { try { h.store = l.parse(s.getItem("History.store")) || {}; } catch (m) { h.store = {}; } h.normalizeStore(); } else (h.store = {}), h.normalizeStore(); h.Adapter.bind(e, "unload", h.clearAllIntervals), h.saveState(h.storeState(h.extractState(h.getLocationHref(), !0))), s && ((h.onUnload = function () { var e, t, n; try { e = l.parse(s.getItem("History.store")) || {}; } catch (r) { e = {}; } (e.idToState = e.idToState || {}), (e.urlToId = e.urlToId || {}), (e.stateToId = e.stateToId || {}); for (t in h.idToState) { if (!h.idToState.hasOwnProperty(t)) continue; e.idToState[t] = h.idToState[t]; } for (t in h.urlToId) { if (!h.urlToId.hasOwnProperty(t)) continue; e.urlToId[t] = h.urlToId[t]; } for (t in h.stateToId) { if (!h.stateToId.hasOwnProperty(t)) continue; e.stateToId[t] = h.stateToId[t]; } (h.store = e), h.normalizeStore(), (n = l.stringify(e)); try { s.setItem("History.store", n); } catch (i) { if (i.code !== DOMException.QUOTA_EXCEEDED_ERR) throw i; s.length && (s.removeItem("History.store"), s.setItem("History.store", n)); } }), h.intervalList.push(a(h.onUnload, h.options.storeInterval)), h.Adapter.bind(e, "beforeunload", h.onUnload), h.Adapter.bind(e, "unload", h.onUnload)); if (!h.emulated.pushState) { h.bugs.safariPoll && h.intervalList.push( a(h.safariStatePoll, h.options.safariPollInterval) ); if ( i.vendor === "Apple Computer, Inc." || (i.appCodeName || "") === "Mozilla" ) h.Adapter.bind(e, "hashchange", function () { h.Adapter.trigger(e, "popstate"); }), h.getHash() && h.Adapter.onDomLoad(function () { h.Adapter.trigger(e, "hashchange"); }); } }), (!h.options || !h.options.delayInit) && h.init(); })(window); /* * jQuery Iframe Transport Plugin 1.7 * https://github.com/blueimp/jQuery-File-Upload * * Copyright 2011, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ /*jslint unparam: true, nomen: true */ /*global define, window, document */ (function (factory) { if (typeof define === "function" && define.amd) { define(["jquery"], factory); } else { factory(window.jQuery); } })(function ($) { var counter = 0; $.ajaxTransport("iframe", function (options) { if (options.async) { var form, iframe, addParamChar; return { send: function (_, completeCallback) { form = $('<form style="display:none;"></form>'); form.attr("accept-charset", options.formAcceptCharset); addParamChar = /\?/.test(options.url) ? "&" : "?"; if (options.type === "DELETE") { options.url = options.url + addParamChar + "_method=DELETE"; options.type = "POST"; } else { if (options.type === "PUT") { options.url = options.url + addParamChar + "_method=PUT"; options.type = "POST"; } else { if (options.type === "PATCH") { options.url = options.url + addParamChar + "_method=PATCH"; options.type = "POST"; } } } counter += 1; iframe = $( '<iframe src="javascript:false;" name="iframe-transport-' + counter + '"></iframe>' ).bind("load", function () { var fileInputClones, paramNames = $.isArray(options.paramName) ? options.paramName : [options.paramName]; iframe.unbind("load").bind("load", function () { var response; try { response = iframe.contents(); if (!response.length || !response[0].firstChild) { throw new Error(); } } catch (e) { response = undefined; } completeCallback(200, "success", { iframe: response }); $('<iframe src="javascript:false;"></iframe>').appendTo(form); window.setTimeout(function () { form.remove(); }, 0); }); form .prop("target", iframe.prop("name")) .prop("action", options.url) .prop("method", options.type); if (options.formData) { $.each(options.formData, function (index, field) { $('<input type="hidden"/>') .prop("name", field.name) .val(field.value) .appendTo(form); }); } if ( options.fileInput && options.fileInput.length && options.type === "POST" ) { fileInputClones = options.fileInput.clone(); options.fileInput.after(function (index) { return fileInputClones[index]; }); if (options.paramName) { options.fileInput.each(function (index) { $(this).prop("name", paramNames[index] || options.paramName); }); } form .append(options.fileInput) .prop("enctype", "multipart/form-data") .prop("encoding", "multipart/form-data"); } form.submit(); if (fileInputClones && fileInputClones.length) { options.fileInput.each(function (index, input) { var clone = $(fileInputClones[index]); $(input).prop("name", clone.prop("name")); clone.replaceWith(input); }); } }); form.append(iframe).appendTo(document.body); }, abort: function () { if (iframe) { iframe.unbind("load").prop("src", "javascript".concat(":false;")); } if (form) { form.remove(); } } }; } }); $.ajaxSetup({ converters: { "iframe text": function (iframe) { return iframe && $(iframe[0].body).text(); }, "iframe json": function (iframe) { return iframe && $.parseJSON($(iframe[0].body).text()); }, "iframe html": function (iframe) { return iframe && $(iframe[0].body).html(); }, "iframe xml": function (iframe) { var xmlDoc = iframe && iframe[0]; return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc : $.parseXML( (xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || $(xmlDoc.body).html() ); }, "iframe script": function (iframe) { return iframe && $.globalEval($(iframe[0].body).text()); } } }); }); /** * Copyright (c) 2011-2013 Felix Gnass * Licensed under the MIT license */ //fgnass.github.com/spin.js#v1.3.2 (function (root, factory) { if (typeof exports == "object") { module.exports = factory(); } else { if (typeof define == "function" && define.amd) { define(factory); } else { root.Spinner = factory(); } } })(this, function () { var prefixes = ["webkit", "Moz", "ms", "O"], animations = {}, useCssAnimations; function createEl(tag, prop) { var el = document.createElement(tag || "div"), n; for (n in prop) { el[n] = prop[n]; } return el; } function ins(parent) { for (var i = 1, n = arguments.length; i < n; i++) { parent.appendChild(arguments[i]); } return parent; } var sheet = (function () { var el = createEl("style", { type: "text/css" }); ins(document.getElementsByTagName("head")[0], el); return el.sheet || el.styleSheet; })(); function addAnimation(alpha, trail, i, lines) { var name = ["opacity", trail, ~~(alpha * 100), i, lines].join("-"), start = 0.01 + (i / lines) * 100, z = Math.max(1 - ((1 - alpha) / trail) * (100 - start), alpha), prefix = useCssAnimations .substring(0, useCssAnimations.indexOf("Animation")) .toLowerCase(), pre = (prefix && "-" + prefix + "-") || ""; if (!animations[name]) { sheet.insertRule( "@" + pre + "keyframes " + name + "{0%{opacity:" + z + "}" + start + "%{opacity:" + alpha + "}" + (start + 0.01) + "%{opacity:1}" + ((start + trail) % 100) + "%{opacity:" + alpha + "}100%{opacity:" + z + "}}", sheet.cssRules.length ); animations[name] = 1; } return name; } function vendor(el, prop) { var s = el.style, pp, i; prop = prop.charAt(0).toUpperCase() + prop.slice(1); for (i = 0; i < prefixes.length; i++) { pp = prefixes[i] + prop; if (s[pp] !== undefined) { return pp; } } if (s[prop] !== undefined) { return prop; } } function css(el, prop) { for (var n in prop) { el.style[vendor(el, n) || n] = prop[n]; } return el; } function merge(obj) { for (var i = 1; i < arguments.length; i++) { var def = arguments[i]; for (var n in def) { if (obj[n] === undefined) { obj[n] = def[n]; } } } return obj; } function pos(el) { var o = { x: el.offsetLeft, y: el.offsetTop }; while ((el = el.offsetParent)) { (o.x += el.offsetLeft), (o.y += el.offsetTop); } return o; } function getColor(color, idx) { return typeof color == "string" ? color : color[idx % color.length]; } var defaults = { lines: 12, length: 7, width: 5, radius: 10, rotate: 0, corners: 1, color: "#000", direction: 1, speed: 1, trail: 100, opacity: 1 / 4, fps: 20, zIndex: "auto", className: "spinner", top: "auto", left: "auto", position: "relative" }; function Spinner(o) { if (typeof this == "undefined") { return new Spinner(o); } this.opts = merge(o || {}, Spinner.defaults, defaults); } Spinner.defaults = {}; merge(Spinner.prototype, { spin: function (target) { this.stop(); var self = this, o = self.opts, el = (self.el = css(createEl(0, { className: o.className }), { position: o.position, width: 0, zIndex: o.zIndex })), mid = o.radius + o.length + o.width, ep, tp; if (target) { target.insertBefore(el, target.firstChild || null); tp = pos(target); ep = pos(el); css(el, { left: (o.left == "auto" ? tp.x - ep.x + (target.offsetWidth >> 1) : parseInt(o.left, 10) + mid) + "px", top: (o.top == "auto" ? tp.y - ep.y + (target.offsetHeight >> 1) : parseInt(o.top, 10) + mid) + "px" }); } el.setAttribute("role", "progressbar"); self.lines(el, self.opts); if (!useCssAnimations) { var i = 0, start = ((o.lines - 1) * (1 - o.direction)) / 2, alpha, fps = o.fps, f = fps / o.speed, ostep = (1 - o.opacity) / ((f * o.trail) / 100), astep = f / o.lines; (function anim() { i++; for (var j = 0; j < o.lines; j++) { alpha = Math.max( 1 - ((i + (o.lines - j) * astep) % f) * ostep, o.opacity ); self.opacity(el, j * o.direction + start, alpha, o); } self.timeout = self.el && setTimeout(anim, ~~(1000 / fps)); })(); } return self; }, stop: function () { var el = this.el; if (el) { clearTimeout(this.timeout); if (el.parentNode) { el.parentNode.removeChild(el); } this.el = undefined; } return this; }, lines: function (el, o) { var i = 0, start = ((o.lines - 1) * (1 - o.direction)) / 2, seg; function fill(color, shadow) { return css(createEl(), { position: "absolute", width: o.length + o.width + "px", height: o.width + "px", background: color, boxShadow: shadow, transformOrigin: "left", transform: "rotate(" + ~~((360 / o.lines) * i + o.rotate) + "deg) translate(" + o.radius + "px,0)", borderRadius: ((o.corners * o.width) >> 1) + "px" }); } for (; i < o.lines; i++) { seg = css(createEl(), { position: "absolute", top: 1 + ~(o.width / 2) + "px", transform: o.hwaccel ? "translate3d(0,0,0)" : "", opacity: o.opacity, animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + " " + 1 / o.speed + "s linear infinite" }); if (o.shadow) { ins( seg, css(fill("rgba(0,0,0,.25)", "0 0 4px rgba(0,0,0,.5)"), { top: 2 + "px" }) ); } ins(el, ins(seg, fill(getColor(o.color, i), "0 0 1px rgba(0,0,0,.1)"))); } return el; }, opacity: function (el, i, val) { if (i < el.childNodes.length) { el.childNodes[i].style.opacity = val; } } }); function initVML() { function vml(tag, attr) { return createEl( "<" + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr ); } sheet.addRule(".spin-vml", "behavior:url(#default#VML)"); Spinner.prototype.lines = function (el, o) { var r = o.length + o.width, s = 2 * r; function grp() { return css( vml("group", { coordsize: s + " " + s, coordorigin: -r + " " + -r }), { width: s, height: s } ); } var margin = -(o.width + o.length) * 2 + "px", g = css(grp(), { position: "absolute", top: margin, left: margin }), i; function seg(i, dx, filter) { ins( g, ins( css(grp(), { rotation: (360 / o.lines) * i + "deg", left: ~~dx }), ins( css(vml("roundrect", { arcsize: o.corners }), { width: r, height: o.width, left: o.radius, top: -o.width >> 1, filter: filter }), vml("fill", { color: getColor(o.color, i), opacity: o.opacity }), vml("stroke", { opacity: 0 }) ) ) ); } if (o.shadow) { for (i = 1; i <= o.lines; i++) { seg( i, -2, "progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)" ); } } for (i = 1; i <= o.lines; i++) { seg(i); } return ins(el, g); }; Spinner.prototype.opacity = function (el, i, val, o) { var c = el.firstChild; o = (o.shadow && o.lines) || 0; if (c && i + o < c.childNodes.length) { c = c.childNodes[i + o]; c = c && c.firstChild; c = c && c.firstChild; if (c) { c.opacity = val; } } }; } var probe = css(createEl("group"), { behavior: "url(#default#VML)" }); if (!vendor(probe, "transform") && probe.adj) { initVML(); } else { useCssAnimations = vendor(probe, "animation"); } return Spinner; }); (function (e) { if (typeof exports == "object") { e(require("jquery"), require("spin")); } else if (typeof define == "function" && define.amd) { define(["jquery", "spin"], e); } else { if (!window.Spinner) throw new Error("Spin.js not present"); e(window.jQuery, window.Spinner); } })(function (e, t) { e.fn.spin = function (n, r) { return this.each(function () { var i = e(this), s = i.data(); if (s.spinner) { s.spinner.stop(); delete s.spinner; } if (n !== false) { n = e.extend({ color: r || i.css("color") }, e.fn.spin.presets[n] || n); s.spinner = new t(n).spin(this); } }); }; e.fn.spin.presets = { tiny: { lines: 8, length: 2, width: 2, radius: 3 }, small: { lines: 8, length: 4, width: 3, radius: 5 }, large: { lines: 10, length: 8, width: 4, radius: 8 } }; }); // http://stackoverflow.com/a/21422049 (function (e) { e.fn.hasScrollbar = function () { var e = {}, t = this.get(0); e.vertical = t.scrollHeight > t.clientHeight ? true : false; e.horizontal = t.scrollWidth > t.clientWidth ? true : false; return e; }; })(jQuery); /** * Antiscroll * https://github.com/LearnBoost/antiscroll */ (function ($) { $.fn.antiscroll = function (options) { return this.each(function () { if ($(this).data("antiscroll")) $(this) .data("antiscroll") .destroy(); $(this).data("antiscroll", new $.Antiscroll(this, options)); }); }; $.Antiscroll = Antiscroll; function Antiscroll(el, opts) { this.el = $(el); this.options = opts || {}; this.x = false !== this.options.x || this.options.forceHorizontal; this.y = false !== this.options.y || this.options.forceVertical; this.autoHide = false !== this.options.autoHide; this.padding = undefined == this.options.padding ? 2 : this.options.padding; this.inner = this.el.find(".antiscroll-inner"); this.inner.css({ width: "+=" + (this.y ? scrollbarSize() : 0), height: "+=" + (this.x ? scrollbarSize() : 0) }); this.refresh(); } Antiscroll.prototype.refresh = function () { var needHScroll = this.inner.get(0).scrollWidth > this.el.width() + (this.y ? scrollbarSize() : 0), needVScroll = this.inner.get(0).scrollHeight > this.el.height() + (this.x ? scrollbarSize() : 0); if (this.x) if (!this.horizontal && needHScroll) this.horizontal = new Scrollbar.Horizontal(this); else if (this.horizontal && !needHScroll) { this.horizontal.destroy(); this.horizontal = null; } else if (this.horizontal) this.horizontal.update(); if (this.y) if (!this.vertical && needVScroll) this.vertical = new Scrollbar.Vertical(this); else if (this.vertical && !needVScroll) { this.vertical.destroy(); this.vertical = null; } else if (this.vertical) this.vertical.update(); }; Antiscroll.prototype.destroy = function () { if (this.horizontal) { this.horizontal.destroy(); this.horizontal = null; } if (this.vertical) { this.vertical.destroy(); this.vertical = null; } return this; }; Antiscroll.prototype.rebuild = function () { this.destroy(); this.inner.attr("style", ""); Antiscroll.call(this, this.el, this.options); return this; }; function Scrollbar(pane) { this.pane = pane; this.pane.el.append(this.el); this.innerEl = this.pane.inner.get(0); this.dragging = false; this.enter = false; this.shown = false; this.pane.el.mouseenter($.proxy(this, "mouseenter")); this.pane.el.mouseleave($.proxy(this, "mouseleave")); this.el.mousedown($.proxy(this, "mousedown")); this.innerPaneScrollListener = $.proxy(this, "scroll"); this.pane.inner.scroll(this.innerPaneScrollListener); this.innerPaneMouseWheelListener = $.proxy(this, "mousewheel"); this.pane.inner.bind("mousewheel", this.innerPaneMouseWheelListener); var initialDisplay = this.pane.options.initialDisplay; if (initialDisplay !== false) { this.show(); if (this.pane.autoHide) this.hiding = setTimeout( $.proxy(this, "hide"), parseInt(initialDisplay, 10) || 3e3 ); } } Scrollbar.prototype.destroy = function () { this.el.remove(); this.pane.inner.unbind("scroll", this.innerPaneScrollListener); this.pane.inner.unbind("mousewheel", this.innerPaneMouseWheelListener); return this; }; Scrollbar.prototype.mouseenter = function () { this.enter = true; this.show(); }; Scrollbar.prototype.mouseleave = function () { this.enter = false; if (!this.dragging) if (this.pane.autoHide) this.hide(); }; Scrollbar.prototype.scroll = function () { if (!this.shown) { this.show(); if (!this.enter && !this.dragging) if (this.pane.autoHide) this.hiding = setTimeout($.proxy(this, "hide"), 1500); } this.update(); }; Scrollbar.prototype.mousedown = function (ev) { ev.preventDefault(); this.dragging = true; this.startPageY = ev.pageY - parseInt(this.el.css("top"), 10); this.startPageX = ev.pageX - parseInt(this.el.css("left"), 10); this.el[0].ownerDocument.onselectstart = function () { return false; }; var pane = this.pane, move = $.proxy(this, "mousemove"), self = this; $(this.el[0].ownerDocument) .mousemove(move) .mouseup(function () { self.dragging = false; this.onselectstart = null; $(this).unbind("mousemove", move); if (!self.enter) self.hide(); }); }; Scrollbar.prototype.show = function (duration) { if (!this.shown && this.update()) { this.el.addClass("antiscroll-scrollbar-shown"); if (this.hiding) { clearTimeout(this.hiding); this.hiding = null; } this.shown = true; } }; Scrollbar.prototype.hide = function () { if (this.pane.autoHide !== false && this.shown) { this.el.removeClass("antiscroll-scrollbar-shown"); this.shown = false; } }; Scrollbar.Horizontal = function (pane) { this.el = $( '<div class="antiscroll-scrollbar antiscroll-scrollbar-horizontal">', pane.el ); Scrollbar.call(this, pane); }; inherits(Scrollbar.Horizontal, Scrollbar); Scrollbar.Horizontal.prototype.update = function () { var paneWidth = this.pane.el.width(), trackWidth = paneWidth - this.pane.padding * 2, innerEl = this.pane.inner.get(0); this.el .css("width", (trackWidth * paneWidth) / innerEl.scrollWidth) .css("left", (trackWidth * innerEl.scrollLeft) / innerEl.scrollWidth); return paneWidth < innerEl.scrollWidth; }; Scrollbar.Horizontal.prototype.mousemove = function (ev) { var trackWidth = this.pane.el.width() - this.pane.padding * 2, pos = ev.pageX - this.startPageX, barWidth = this.el.width(), innerEl = this.pane.inner.get(0); var y = Math.min(Math.max(pos, 0), trackWidth - barWidth); innerEl.scrollLeft = ((innerEl.scrollWidth - this.pane.el.width()) * y) / (trackWidth - barWidth); }; Scrollbar.Horizontal.prototype.mousewheel = function (ev, delta, x, y) { if ( (x < 0 && 0 == this.pane.inner.get(0).scrollLeft) || (x > 0 && this.innerEl.scrollLeft + Math.ceil(this.pane.el.width()) == this.innerEl.scrollWidth) ) { ev.preventDefault(); return false; } }; Scrollbar.Vertical = function (pane) { this.el = $( '<div class="antiscroll-scrollbar antiscroll-scrollbar-vertical">', pane.el ); Scrollbar.call(this, pane); }; inherits(Scrollbar.Vertical, Scrollbar); Scrollbar.Vertical.prototype.update = function () { var paneHeight = this.pane.el.height(), trackHeight = paneHeight - this.pane.padding * 2, innerEl = this.innerEl; var scrollbarHeight = (trackHeight * paneHeight) / innerEl.scrollHeight; scrollbarHeight = scrollbarHeight < 20 ? 20 : scrollbarHeight; var topPos = (trackHeight * innerEl.scrollTop) / innerEl.scrollHeight; if (topPos + scrollbarHeight > trackHeight) { var diff = topPos + scrollbarHeight - trackHeight; topPos = topPos - diff - 3; } this.el.css("height", scrollbarHeight).css("top", topPos); return paneHeight < innerEl.scrollHeight; }; Scrollbar.Vertical.prototype.mousemove = function (ev) { var paneHeight = this.pane.el.height(), trackHeight = paneHeight - this.pane.padding * 2, pos = ev.pageY - this.startPageY, barHeight = this.el.height(), innerEl = this.innerEl; var y = Math.min(Math.max(pos, 0), trackHeight - barHeight); innerEl.scrollTop = ((innerEl.scrollHeight - paneHeight) * y) / (trackHeight - barHeight); }; Scrollbar.Vertical.prototype.mousewheel = function (ev, delta, x, y) { if ( (y > 0 && 0 == this.innerEl.scrollTop) || (y < 0 && this.innerEl.scrollTop + Math.ceil(this.pane.el.height()) == this.innerEl.scrollHeight) ) { ev.preventDefault(); return false; } }; function inherits(ctorA, ctorB) { function f() { } f.prototype = ctorB.prototype; ctorA.prototype = new f(); } var size; function scrollbarSize() { if (size === undefined) { var div = $( '<div class="antiscroll-inner" style="width:50px;height:50px;overflow-y:scroll;' + 'position:absolute;top:-200px;left:-200px;"><div style="height:100px;width:100%">' + "</div>" ); $("body").append(div); var w1 = $(div).innerWidth(); var w2 = $("div", div).innerWidth(); $(div).remove(); size = w1 - w2; } return size; } })(jQuery); /** * jQuery Mousewheel * ! Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net) * Licensed under the MIT License (LICENSE.txt). * * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. * Thanks to: Seamus Leahy for adding deltaX and deltaY * * Version: 3.1.3 * * Requires: 1.2.2+ */ (function (factory) { if (typeof define === "function" && define.amd) define(["jquery"], factory); else if (typeof exports === "object") module.exports = factory; else factory(jQuery); })(function ($) { var toFix = ["wheel", "mousewheel", "DOMMouseScroll", "MozMousePixelScroll"]; var toBind = "onwheel" in document || document.documentMode >= 9 ? ["wheel"] : ["mousewheel", "DomMouseScroll", "MozMousePixelScroll"]; var lowestDelta, lowestDeltaXY; if ($.event.fixHooks) for (var i = toFix.length; i;) $.event.fixHooks[toFix[--i]] = $.event.mouseHooks; $.event.special.mousewheel = { setup: function () { if (this.addEventListener) for (var i = toBind.length; i;) this.addEventListener(toBind[--i], handler, false); else this.onmousewheel = handler; }, teardown: function () { if (this.removeEventListener) for (var i = toBind.length; i;) this.removeEventListener(toBind[--i], handler, false); else this.onmousewheel = null; } }; $.fn.extend({ mousewheel: function (fn) { return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); }, unmousewheel: function (fn) { return this.unbind("mousewheel", fn); } }); function handler(event) { var orgEvent = event || window.event, args = [].slice.call(arguments, 1), delta = 0, deltaX = 0, deltaY = 0, absDelta = 0, absDeltaXY = 0, fn; event = $.event.fix(orgEvent); event.type = "mousewheel"; if (orgEvent.wheelDelta) delta = orgEvent.wheelDelta; if (orgEvent.detail) delta = orgEvent.detail * -1; if (orgEvent.deltaY) { deltaY = orgEvent.deltaY * -1; delta = deltaY; } if (orgEvent.deltaX) { deltaX = orgEvent.deltaX; delta = deltaX * -1; } if (orgEvent.wheelDeltaY !== undefined) deltaY = orgEvent.wheelDeltaY; if (orgEvent.wheelDeltaX !== undefined) deltaX = orgEvent.wheelDeltaX * -1; absDelta = Math.abs(delta); if (!lowestDelta || absDelta < lowestDelta) lowestDelta = absDelta; absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX)); if (!lowestDeltaXY || absDeltaXY < lowestDeltaXY) lowestDeltaXY = absDeltaXY; fn = delta > 0 ? "floor" : "ceil"; delta = Math[fn](delta / lowestDelta); deltaX = Math[fn](deltaX / lowestDeltaXY); deltaY = Math[fn](deltaY / lowestDeltaXY); args.unshift(event, delta, deltaX, deltaY); return ($.event.dispatch || $.event.handle).apply(this, args); } }); /** Delayed action http://stackoverflow.com/a/7150496 **/ (function ($) { $.fn.delayedAction = function (options) { var settings = $.extend( {}, { delayedAction: function () { }, cancelledAction: function () { }, hoverTime: 1000 }, options ); return this.each(function () { var $this = $(this); $this.hover( function () { $this.data( "timerId", setTimeout(function () { $this.data("hover", false); settings.delayedAction($this); }, settings.hoverTime) ); $this.data("hover", true); }, function () { if ($this.data("hover")) { clearTimeout($this.data("timerId")); settings.cancelledAction($this); } $this.data("hover", false); } ); }); }; })(jQuery); /** Created: 20060120 Author: Steve Moitozo <god at zilla dot us> -- geekwisdom.com License: MIT License (see below) Copyright (c) 2006 Steve Moitozo <god at zilla dot us> Slightly modified for Peafowl */ function testPassword(e) { var t = 0, n = "weak", r = "", i = 0; if (e.length < 5) { t = t + 3; r = r + "3 points for length (" + e.length + ")\n"; } else if (e.length > 4 && e.length < 8) { t = t + 6; r = r + "6 points for length (" + e.length + ")\n"; } else if (e.length > 7 && e.length < 16) { t = t + 12; r = r + "12 points for length (" + e.length + ")\n"; } else if (e.length > 15) { t = t + 18; r = r + "18 point for length (" + e.length + ")\n"; } if (e.match(/[a-z]/)) { t = t + 1; r = r + "1 point for at least one lower case char\n"; } if (e.match(/[A-Z]/)) { t = t + 5; r = r + "5 points for at least one upper case char\n"; } if (e.match(/\d+/)) { t = t + 5; r = r + "5 points for at least one number\n"; } if (e.match(/(.*[0-9].*[0-9].*[0-9])/)) { t = t + 5; r = r + "5 points for at least three numbers\n"; } if (e.match(/.[!,@,#,$,%,^,&,*,?,_,~]/)) { t = t + 5; r = r + "5 points for at least one special char\n"; } if (e.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) { t = t + 5; r = r + "5 points for at least two special chars\n"; } if (e.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) { t = t + 2; r = r + "2 combo points for upper and lower letters\n"; } if (e.match(/([a-zA-Z])/) && e.match(/([0-9])/)) { t = t + 2; r = r + "2 combo points for letters and numbers\n"; } if ( e.match( /([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/ ) ) { t = t + 2; r = r + "2 combo points for letters, numbers and special chars\n"; } if (e.length == 0) { t = 0; } if (t < 16) { n = "very weak"; } else if (t > 15 && t < 25) { n = "weak"; } else if (t > 24 && t < 35) { n = "average"; } else if (t > 34 && t < 45) { n = "strong"; } else { n = "stronger"; } i = Math.round(Math.min(100, (100 * t) / 45)) / 100; return { score: t, ratio: i, percent: i * 100 + "%", verdict: n, log: r }; } // SparkMD5 (function (factory) { if (typeof exports === "object") { module.exports = factory(); } else if (typeof define === "function" && define.amd) { define(factory); } else { var glob; try { glob = window; } catch (e) { glob = self; } glob.SparkMD5 = factory(); } })(function (undefined) { "use strict"; var add32 = function (a, b) { return (a + b) & 4294967295; }, hex_chr = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" ]; function cmn(q, a, b, x, s, t) { a = add32(add32(a, q), add32(x, t)); return add32((a << s) | (a >>> (32 - s)), b); } function ff(a, b, c, d, x, s, t) { return cmn((b & c) | (~b & d), a, b, x, s, t); } function gg(a, b, c, d, x, s, t) { return cmn((b & d) | (c & ~d), a, b, x, s, t); } function hh(a, b, c, d, x, s, t) { return cmn(b ^ c ^ d, a, b, x, s, t); } function ii(a, b, c, d, x, s, t) { return cmn(c ^ (b | ~d), a, b, x, s, t); } function md5cycle(x, k) { var a = x[0], b = x[1], c = x[2], d = x[3]; a = ff(a, b, c, d, k[0], 7, -680876936); d = ff(d, a, b, c, k[1], 12, -389564586); c = ff(c, d, a, b, k[2], 17, 606105819); b = ff(b, c, d, a, k[3], 22, -1044525330); a = ff(a, b, c, d, k[4], 7, -176418897); d = ff(d, a, b, c, k[5], 12, 1200080426); c = ff(c, d, a, b, k[6], 17, -1473231341); b = ff(b, c, d, a, k[7], 22, -45705983); a = ff(a, b, c, d, k[8], 7, 1770035416); d = ff(d, a, b, c, k[9], 12, -1958414417); c = ff(c, d, a, b, k[10], 17, -42063); b = ff(b, c, d, a, k[11], 22, -1990404162); a = ff(a, b, c, d, k[12], 7, 1804603682); d = ff(d, a, b, c, k[13], 12, -40341101); c = ff(c, d, a, b, k[14], 17, -1502002290); b = ff(b, c, d, a, k[15], 22, 1236535329); a = gg(a, b, c, d, k[1], 5, -165796510); d = gg(d, a, b, c, k[6], 9, -1069501632); c = gg(c, d, a, b, k[11], 14, 643717713); b = gg(b, c, d, a, k[0], 20, -373897302); a = gg(a, b, c, d, k[5], 5, -701558691); d = gg(d, a, b, c, k[10], 9, 38016083); c = gg(c, d, a, b, k[15], 14, -660478335); b = gg(b, c, d, a, k[4], 20, -405537848); a = gg(a, b, c, d, k[9], 5, 568446438); d = gg(d, a, b, c, k[14], 9, -1019803690); c = gg(c, d, a, b, k[3], 14, -187363961); b = gg(b, c, d, a, k[8], 20, 1163531501); a = gg(a, b, c, d, k[13], 5, -1444681467); d = gg(d, a, b, c, k[2], 9, -51403784); c = gg(c, d, a, b, k[7], 14, 1735328473); b = gg(b, c, d, a, k[12], 20, -1926607734); a = hh(a, b, c, d, k[5], 4, -378558); d = hh(d, a, b, c, k[8], 11, -2022574463); c = hh(c, d, a, b, k[11], 16, 1839030562); b = hh(b, c, d, a, k[14], 23, -35309556); a = hh(a, b, c, d, k[1], 4, -1530992060); d = hh(d, a, b, c, k[4], 11, 1272893353); c = hh(c, d, a, b, k[7], 16, -155497632); b = hh(b, c, d, a, k[10], 23, -1094730640); a = hh(a, b, c, d, k[13], 4, 681279174); d = hh(d, a, b, c, k[0], 11, -358537222); c = hh(c, d, a, b, k[3], 16, -722521979); b = hh(b, c, d, a, k[6], 23, 76029189); a = hh(a, b, c, d, k[9], 4, -640364487); d = hh(d, a, b, c, k[12], 11, -421815835); c = hh(c, d, a, b, k[15], 16, 530742520); b = hh(b, c, d, a, k[2], 23, -995338651); a = ii(a, b, c, d, k[0], 6, -198630844); d = ii(d, a, b, c, k[7], 10, 1126891415); c = ii(c, d, a, b, k[14], 15, -1416354905); b = ii(b, c, d, a, k[5], 21, -57434055); a = ii(a, b, c, d, k[12], 6, 1700485571); d = ii(d, a, b, c, k[3], 10, -1894986606); c = ii(c, d, a, b, k[10], 15, -1051523); b = ii(b, c, d, a, k[1], 21, -2054922799); a = ii(a, b, c, d, k[8], 6, 1873313359); d = ii(d, a, b, c, k[15], 10, -30611744); c = ii(c, d, a, b, k[6], 15, -1560198380); b = ii(b, c, d, a, k[13], 21, 1309151649); a = ii(a, b, c, d, k[4], 6, -145523070); d = ii(d, a, b, c, k[11], 10, -1120210379); c = ii(c, d, a, b, k[2], 15, 718787259); b = ii(b, c, d, a, k[9], 21, -343485551); x[0] = add32(a, x[0]); x[1] = add32(b, x[1]); x[2] = add32(c, x[2]); x[3] = add32(d, x[3]); } function md5blk(s) { var md5blks = [], i; for (i = 0; i < 64; i += 4) { md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24); } return md5blks; } function md5blk_array(a) { var md5blks = [], i; for (i = 0; i < 64; i += 4) { md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24); } return md5blks; } function md51(s) { var n = s.length, state = [1732584193, -271733879, -1732584194, 271733878], i, length, tail, tmp, lo, hi; for (i = 64; i <= n; i += 64) { md5cycle(state, md5blk(s.substring(i - 64, i))); } s = s.substring(i - 64); length = s.length; tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (i = 0; i < length; i += 1) { tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3); } tail[i >> 2] |= 128 << (i % 4 << 3); if (i > 55) { md5cycle(state, tail); for (i = 0; i < 16; i += 1) { tail[i] = 0; } } tmp = n * 8; tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); lo = parseInt(tmp[2], 16); hi = parseInt(tmp[1], 16) || 0; tail[14] = lo; tail[15] = hi; md5cycle(state, tail); return state; } function md51_array(a) { var n = a.length, state = [1732584193, -271733879, -1732584194, 271733878], i, length, tail, tmp, lo, hi; for (i = 64; i <= n; i += 64) { md5cycle(state, md5blk_array(a.subarray(i - 64, i))); } a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0); length = a.length; tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (i = 0; i < length; i += 1) { tail[i >> 2] |= a[i] << (i % 4 << 3); } tail[i >> 2] |= 128 << (i % 4 << 3); if (i > 55) { md5cycle(state, tail); for (i = 0; i < 16; i += 1) { tail[i] = 0; } } tmp = n * 8; tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); lo = parseInt(tmp[2], 16); hi = parseInt(tmp[1], 16) || 0; tail[14] = lo; tail[15] = hi; md5cycle(state, tail); return state; } function rhex(n) { var s = "", j; for (j = 0; j < 4; j += 1) { s += hex_chr[(n >> (j * 8 + 4)) & 15] + hex_chr[(n >> (j * 8)) & 15]; } return s; } function hex(x) { var i; for (i = 0; i < x.length; i += 1) { x[i] = rhex(x[i]); } return x.join(""); } if (hex(md51("hello")) !== "5d41402abc4b2a76b9719d911017c592") { add32 = function (x, y) { var lsw = (x & 65535) + (y & 65535), msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 65535); }; } function toUtf8(str) { if (/[\u0080-\uFFFF]/.test(str)) { str = unescape(encodeURIComponent(str)); } return str; } function utf8Str2ArrayBuffer(str, returnUInt8Array) { var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i; for (i = 0; i < length; i++) { arr[i] = str.charCodeAt(i); } return returnUInt8Array ? arr : buff; } function arrayBuffer2Utf8Str(buff) { return String.fromCharCode.apply(null, new Uint8Array(buff)); } function concatenateArrayBuffers(first, second, returnUInt8Array) { var result = new Uint8Array(first.byteLength + second.byteLength); result.set(new Uint8Array(first)); result.set(new Uint8Array(second), first.byteLength); return returnUInt8Array ? result : result.buffer; } function SparkMD5() { this.reset(); } SparkMD5.prototype.append = function (str) { this.appendBinary(toUtf8(str)); return this; }; SparkMD5.prototype.appendBinary = function (contents) { this._buff += contents; this._length += contents.length; var length = this._buff.length, i; for (i = 64; i <= length; i += 64) { md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i))); } this._buff = this._buff.substring(i - 64); return this; }; SparkMD5.prototype.end = function (raw) { var buff = this._buff, length = buff.length, i, tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ret; for (i = 0; i < length; i += 1) { tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3); } this._finish(tail, length); ret = !!raw ? this._hash : hex(this._hash); this.reset(); return ret; }; SparkMD5.prototype.reset = function () { this._buff = ""; this._length = 0; this._hash = [1732584193, -271733879, -1732584194, 271733878]; return this; }; SparkMD5.prototype.getState = function () { return { buff: this._buff, length: this._length, hash: this._hash }; }; SparkMD5.prototype.setState = function (state) { this._buff = state.buff; this._length = state.length; this._hash = state.hash; return this; }; SparkMD5.prototype.destroy = function () { delete this._hash; delete this._buff; delete this._length; }; SparkMD5.prototype._finish = function (tail, length) { var i = length, tmp, lo, hi; tail[i >> 2] |= 128 << (i % 4 << 3); if (i > 55) { md5cycle(this._hash, tail); for (i = 0; i < 16; i += 1) { tail[i] = 0; } } tmp = this._length * 8; tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); lo = parseInt(tmp[2], 16); hi = parseInt(tmp[1], 16) || 0; tail[14] = lo; tail[15] = hi; md5cycle(this._hash, tail); }; SparkMD5.hash = function (str, raw) { return SparkMD5.hashBinary(toUtf8(str), raw); }; SparkMD5.hashBinary = function (content, raw) { var hash = md51(content); return !!raw ? hash : hex(hash); }; SparkMD5.ArrayBuffer = function () { this.reset(); }; SparkMD5.ArrayBuffer.prototype.append = function (arr) { var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i; this._length += arr.byteLength; for (i = 64; i <= length; i += 64) { md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i))); } this._buff = i - 64 < length ? buff.subarray(i - 64) : new Uint8Array(0); return this; }; SparkMD5.ArrayBuffer.prototype.end = function (raw) { var buff = this._buff, length = buff.length, tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], i, ret; for (i = 0; i < length; i += 1) { tail[i >> 2] |= buff[i] << (i % 4 << 3); } this._finish(tail, length); ret = !!raw ? this._hash : hex(this._hash); this.reset(); return ret; }; SparkMD5.ArrayBuffer.prototype.reset = function () { this._buff = new Uint8Array(0); this._length = 0; this._hash = [1732584193, -271733879, -1732584194, 271733878]; return this; }; SparkMD5.ArrayBuffer.prototype.getState = function () { var state = SparkMD5.prototype.getState.call(this); state.buff = arrayBuffer2Utf8Str(state.buff); return state; }; SparkMD5.ArrayBuffer.prototype.setState = function (state) { state.buff = utf8Str2ArrayBuffer(state.buff, true); return SparkMD5.prototype.setState.call(this, state); }; SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy; SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish; SparkMD5.ArrayBuffer.hash = function (arr, raw) { var hash = md51_array(new Uint8Array(arr)); return !!raw ? hash : hex(hash); }; return SparkMD5; }); /*! * clipboard.js v1.5.8 * https://zenorocha.github.io/clipboard.js * * Licensed MIT © Zeno Rocha */ !(function (t) { if ("object" == typeof exports && "undefined" != typeof module) module.exports = t(); else if ("function" == typeof define && define.amd) define([], t); else { var e; (e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this), (e.Clipboard = t()); } })(function () { var t, e, n; return (function t(e, n, r) { function o(a, s) { if (!n[a]) { if (!e[a]) { var c = "function" == typeof require && require; if (!s && c) return c(a, !0); if (i) return i(a, !0); var u = new Error("Cannot find module '" + a + "'"); throw ((u.code = "MODULE_NOT_FOUND"), u); } var l = (n[a] = { exports: {} }); e[a][0].call( l.exports, function (t) { var n = e[a][1][t]; return o(n ? n : t); }, l, l.exports, t, e, n, r ); } return n[a].exports; } for ( var i = "function" == typeof require && require, a = 0; a < r.length; a++ ) o(r[a]); return o; })( { 1: [ function (t, e, n) { var r = t("matches-selector"); e.exports = function (t, e, n) { for (var o = n ? t : t.parentNode; o && o !== document;) { if (r(o, e)) return o; o = o.parentNode; } }; }, { "matches-selector": 5 } ], 2: [ function (t, e, n) { function r(t, e, n, r, i) { var a = o.apply(this, arguments); return ( t.addEventListener(n, a, i), { destroy: function () { t.removeEventListener(n, a, i); } } ); } function o(t, e, n, r) { return function (n) { (n.delegateTarget = i(n.target, e, !0)), n.delegateTarget && r.call(t, n); }; } var i = t("closest"); e.exports = r; }, { closest: 1 } ], 3: [ function (t, e, n) { (n.node = function (t) { return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType; }), (n.nodeList = function (t) { var e = Object.prototype.toString.call(t); return ( void 0 !== t && ("[object NodeList]" === e || "[object HTMLCollection]" === e) && "length" in t && (0 === t.length || n.node(t[0])) ); }), (n.string = function (t) { return "string" == typeof t || t instanceof String; }), (n.fn = function (t) { var e = Object.prototype.toString.call(t); return "[object Function]" === e; }); }, {} ], 4: [ function (t, e, n) { function r(t, e, n) { if (!t && !e && !n) throw new Error("Missing required arguments"); if (!s.string(e)) throw new TypeError("Second argument must be a String"); if (!s.fn(n)) throw new TypeError("Third argument must be a Function"); if (s.node(t)) return o(t, e, n); if (s.nodeList(t)) return i(t, e, n); if (s.string(t)) return a(t, e, n); throw new TypeError( "First argument must be a String, HTMLElement, HTMLCollection, or NodeList" ); } function o(t, e, n) { return ( t.addEventListener(e, n), { destroy: function () { t.removeEventListener(e, n); } } ); } function i(t, e, n) { return ( Array.prototype.forEach.call(t, function (t) { t.addEventListener(e, n); }), { destroy: function () { Array.prototype.forEach.call(t, function (t) { t.removeEventListener(e, n); }); } } ); } function a(t, e, n) { return c(document.body, t, e, n); } var s = t("./is"), c = t("delegate"); e.exports = r; }, { "./is": 3, delegate: 2 } ], 5: [ function (t, e, n) { function r(t, e) { if (i) return i.call(t, e); for ( var n = t.parentNode.querySelectorAll(e), r = 0; r < n.length; ++r ) if (n[r] == t) return !0; return !1; } var o = Element.prototype, i = o.matchesSelector || o.webkitMatchesSelector || o.mozMatchesSelector || o.msMatchesSelector || o.oMatchesSelector; e.exports = r; }, {} ], 6: [ function (t, e, n) { function r(t) { var e; if ("INPUT" === t.nodeName || "TEXTAREA" === t.nodeName) t.focus(), t.setSelectionRange(0, t.value.length), (e = t.value); else { t.hasAttribute("contenteditable") && t.focus(); var n = window.getSelection(), r = document.createRange(); r.selectNodeContents(t), n.removeAllRanges(), n.addRange(r), (e = n.toString()); } return e; } e.exports = r; }, {} ], 7: [ function (t, e, n) { function r() { } (r.prototype = { on: function (t, e, n) { var r = this.e || (this.e = {}); return (r[t] || (r[t] = [])).push({ fn: e, ctx: n }), this; }, once: function (t, e, n) { function r() { o.off(t, r), e.apply(n, arguments); } var o = this; return (r._ = e), this.on(t, r, n); }, emit: function (t) { var e = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[t] || []).slice(), r = 0, o = n.length; for (r; o > r; r++) n[r].fn.apply(n[r].ctx, e); return this; }, off: function (t, e) { var n = this.e || (this.e = {}), r = n[t], o = []; if (r && e) for (var i = 0, a = r.length; a > i; i++) r[i].fn !== e && r[i].fn._ !== e && o.push(r[i]); return o.length ? (n[t] = o) : delete n[t], this; } }), (e.exports = r); }, {} ], 8: [ function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t }; } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function"); } n.__esModule = !0; var i = (function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; (r.enumerable = r.enumerable || !1), (r.configurable = !0), "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r); } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e; }; })(), a = t("select"), s = r(a), c = (function () { function t(e) { o(this, t), this.resolveOptions(e), this.initSelection(); } return ( (t.prototype.resolveOptions = function t() { var e = arguments.length <= 0 || void 0 === arguments[0] ? {} : arguments[0]; (this.action = e.action), (this.emitter = e.emitter), (this.target = e.target), (this.text = e.text), (this.trigger = e.trigger), (this.selectedText = ""); }), (t.prototype.initSelection = function t() { if (this.text && this.target) throw new Error( 'Multiple attributes declared, use either "target" or "text"' ); if (this.text) this.selectFake(); else { if (!this.target) throw new Error( 'Missing required attributes, use either "target" or "text"' ); this.selectTarget(); } }), (t.prototype.selectFake = function t() { var e = this, n = "rtl" == document.documentElement.getAttribute("dir"); this.removeFake(), (this.fakeHandler = document.body.addEventListener( "click", function () { return e.removeFake(); } )), (this.fakeElem = document.createElement("textarea")), (this.fakeElem.style.fontSize = "12pt"), (this.fakeElem.style.border = "0"), (this.fakeElem.style.padding = "0"), (this.fakeElem.style.margin = "0"), (this.fakeElem.style.position = "absolute"), (this.fakeElem.style[n ? "right" : "left"] = "-9999px"), (this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + "px"), this.fakeElem.setAttribute("readonly", ""), (this.fakeElem.value = this.text), document.body.appendChild(this.fakeElem), (this.selectedText = s.default(this.fakeElem)), this.copyText(); }), (t.prototype.removeFake = function t() { this.fakeHandler && (document.body.removeEventListener("click"), (this.fakeHandler = null)), this.fakeElem && (document.body.removeChild(this.fakeElem), (this.fakeElem = null)); }), (t.prototype.selectTarget = function t() { (this.selectedText = s.default(this.target)), this.copyText(); }), (t.prototype.copyText = function t() { var e = void 0; try { e = document.execCommand(this.action); } catch (n) { e = !1; } this.handleResult(e); }), (t.prototype.handleResult = function t(e) { e ? this.emitter.emit("success", { action: this.action, text: this.selectedText, trigger: this.trigger, clearSelection: this.clearSelection.bind(this) }) : this.emitter.emit("error", { action: this.action, trigger: this.trigger, clearSelection: this.clearSelection.bind(this) }); }), (t.prototype.clearSelection = function t() { this.target && this.target.blur(), window.getSelection().removeAllRanges(); }), (t.prototype.destroy = function t() { this.removeFake(); }), i(t, [ { key: "action", set: function t() { var e = arguments.length <= 0 || void 0 === arguments[0] ? "copy" : arguments[0]; if ( ((this._action = e), "copy" !== this._action && "cut" !== this._action) ) throw new Error( 'Invalid "action" value, use either "copy" or "cut"' ); }, get: function t() { return this._action; } }, { key: "target", set: function t(e) { if (void 0 !== e) { if (!e || "object" != typeof e || 1 !== e.nodeType) throw new Error( 'Invalid "target" value, use a valid Element' ); this._target = e; } }, get: function t() { return this._target; } } ]), t ); })(); (n.default = c), (e.exports = n.default); }, { select: 6 } ], 9: [ function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t }; } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function"); } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError( "Super expression must either be null or a function, not " + typeof e ); (t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } })), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : (t.__proto__ = e)); } function a(t, e) { var n = "data-clipboard-" + t; if (e.hasAttribute(n)) return e.getAttribute(n); } n.__esModule = !0; var s = t("./clipboard-action"), c = r(s), u = t("tiny-emitter"), l = r(u), f = t("good-listener"), d = r(f), h = (function (t) { function e(n, r) { o(this, e), t.call(this), this.resolveOptions(r), this.listenClick(n); } return ( i(e, t), (e.prototype.resolveOptions = function t() { var e = arguments.length <= 0 || void 0 === arguments[0] ? {} : arguments[0]; (this.action = "function" == typeof e.action ? e.action : this.defaultAction), (this.target = "function" == typeof e.target ? e.target : this.defaultTarget), (this.text = "function" == typeof e.text ? e.text : this.defaultText); }), (e.prototype.listenClick = function t(e) { var n = this; this.listener = d.default(e, "click", function (t) { return n.onClick(t); }); }), (e.prototype.onClick = function t(e) { var n = e.delegateTarget || e.currentTarget; this.clipboardAction && (this.clipboardAction = null), (this.clipboardAction = new c.default({ action: this.action(n), target: this.target(n), text: this.text(n), trigger: n, emitter: this })); }), (e.prototype.defaultAction = function t(e) { return a("action", e); }), (e.prototype.defaultTarget = function t(e) { var n = a("target", e); return n ? document.querySelector(n) : void 0; }), (e.prototype.defaultText = function t(e) { return a("text", e); }), (e.prototype.destroy = function t() { this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), (this.clipboardAction = null)); }), e ); })(l.default); (n.default = h), (e.exports = n.default); }, { "./clipboard-action": 8, "good-listener": 4, "tiny-emitter": 7 } ] }, {}, [9] )(9); });