10436 lines
384 KiB
JavaScript
10436 lines
384 KiB
JavaScript
/**
|
|
* Peafowl JS
|
|
* Copyright 2016 Rodolfo Berrios <www.rodolfoberrios.com>
|
|
*/
|
|
|
|
/**
|
|
* Peafowl DOM functions and event listeners
|
|
*/
|
|
$(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 PF.fn._s(
|
|
"All the changes that you have made will be lost if you continue."
|
|
);
|
|
}
|
|
});
|
|
|
|
$(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 resizeTimer,
|
|
scrollTimer,
|
|
width = $(window).width();
|
|
// Fluid width on resize
|
|
$(window).on("resize", function () {
|
|
PF.fn.growl.fixPosition();
|
|
PF.fn.modal.fixScrollbars();
|
|
|
|
var device = PF.fn.getDeviceName(),
|
|
handled = ["phone", "phablet"],
|
|
desktop = ["tablet", "laptop", "desktop"];
|
|
|
|
clearTimeout(resizeTimer);
|
|
clearTimeout(scrollTimer);
|
|
|
|
scrollTimer = setTimeout(function () {
|
|
$(".follow-scroll-wrapper, .follow-scroll-placeholder")
|
|
.removeClass("position-fixed")
|
|
.attr("style", "");
|
|
if ($("html").hasScrollBar().vertical) {
|
|
PF.obj.follow_scroll.set(true);
|
|
PF.obj.follow_scroll.process(true);
|
|
}
|
|
}, 25);
|
|
|
|
//PF.fn.window_to_device(); // handled by window event parent
|
|
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", "");
|
|
$(PF.fn.topMenu.vars.menu).css("height", $(window).height());
|
|
|
|
$("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()) {
|
|
if (
|
|
$("[data-action=top-bar-menu-full]", "#top-bar").hasClass("current")
|
|
) {
|
|
PF.fn.topMenu.hide(0);
|
|
}
|
|
|
|
var cols_fn = function () {
|
|
PF.fn.listing.columnizer(true, 0);
|
|
$(PF.obj.listing.selectors.list_item).show();
|
|
};
|
|
cols_fn();
|
|
}
|
|
|
|
width = $(window).width();
|
|
});
|
|
|
|
// Close the opened pop-boxes on HTML click
|
|
$(document).on("click", "html", function () {
|
|
PF.fn.close_pops();
|
|
});
|
|
|
|
/**
|
|
* SMALL HELPERS AND THINGS --> "things" que chucha yo en ese tiempo wn
|
|
* -------------------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
// Attemp to replace .svg with .png for browsers that doesn't support it
|
|
if ($("html").hasClass("no-svg")) {
|
|
$("img.replace-svg").replace_svg();
|
|
}
|
|
|
|
// 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.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");
|
|
});
|
|
});
|
|
|
|
// Y COMO DICE: ESCAPE FROM THE PLANET OF THE APES
|
|
$(document).on("keyup", function (e) {
|
|
$this = $(e.target);
|
|
if (e.keyCode == 27) {
|
|
if (
|
|
$(PF.obj.modal.selectors.root).is(":visible") &&
|
|
!$this.is(":input")
|
|
) {
|
|
$(
|
|
"[data-action=cancel],[data-action=close-modal]",
|
|
PF.obj.modal.selectors.root
|
|
)
|
|
.first()
|
|
.click();
|
|
}
|
|
}
|
|
});
|
|
|
|
// 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);
|
|
});
|
|
|
|
// Select all on an input type
|
|
$(document).on("click", ":input[data-focus=select-all]", function () {
|
|
this.select();
|
|
});
|
|
|
|
// 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 (
|
|
href.substring(0, 6) == "mailto" &&
|
|
PF.fn.isDevice(["phone", "phablet"])
|
|
) {
|
|
window.location = href;
|
|
return false;
|
|
}
|
|
PF.fn.popup({ href: href });
|
|
});
|
|
|
|
/**
|
|
* FOWLLOW SCROLL
|
|
* -------------------------------------------------------------------------------------------------
|
|
*/
|
|
$(window).scroll(function () {
|
|
PF.obj.follow_scroll.process(); // todo:optimize
|
|
});
|
|
|
|
/**
|
|
* 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")]
|
|
};
|
|
|
|
// Window functions failed? Maybe those are named fn...
|
|
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>' +
|
|
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">' +
|
|
PF.fn._s("Go back to form") +
|
|
'</button> <span class="btn-alt">' +
|
|
PF.fn._s("or") +
|
|
' <a data-action="submit">' +
|
|
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));
|
|
}
|
|
}
|
|
);
|
|
|
|
// Check user login modal -> Must be login to continue
|
|
if (!PF.fn.is_user_logged()) {
|
|
$("[data-login-needed]:input, [data-user-logged=must]:input").each(
|
|
function () {
|
|
$(this).attr("readonly", true);
|
|
}
|
|
);
|
|
}
|
|
|
|
// Modal form keydown listener
|
|
$(document).on("keydown", PF.obj.modal.selectors.root + " input", function (
|
|
e
|
|
) {
|
|
// nota: solia ser keyup
|
|
var $this = $(e.target),
|
|
key = e.charCode || e.keyCode;
|
|
if (key !== 13) {
|
|
PF.fn.growl.close();
|
|
return;
|
|
}
|
|
if (
|
|
key == 13 &&
|
|
$("[data-action=submit]", PF.obj.modal.selectors.root).exists() &&
|
|
!$this.is(".prevent-submit")
|
|
) {
|
|
// 13 == enter key
|
|
$("[data-action=submit]", PF.obj.modal.selectors.root).click();
|
|
}
|
|
});
|
|
|
|
// 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", "[data-action=top-bar-menu-full]", function () {
|
|
var hasClass = $("[data-action=top-bar-menu-full]", "#top-bar").hasClass(
|
|
"current"
|
|
);
|
|
PF.fn.topMenu[hasClass ? "hide" : "show"]();
|
|
});
|
|
|
|
/**
|
|
* 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();
|
|
if (
|
|
is_ios() &&
|
|
$(this)
|
|
.closest("#top-bar")
|
|
.css("position") !== "fixed"
|
|
) {
|
|
$(".top-bar").css("position", "fixed");
|
|
}
|
|
}
|
|
} 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");
|
|
|
|
$(".pop-box-inner", $pop_box).css("max-height", "");
|
|
|
|
if (PF.fn.isDevice(devices)) {
|
|
var text = $(".btn-text,.text,.pop-btn-text", $pop_btn)
|
|
.first()
|
|
.text();
|
|
if (typeof text == "undefined" || text == "") {
|
|
text = PF.fn._s("Select");
|
|
}
|
|
if (!$(".pop-box-header", $pop_box).exists()) {
|
|
$pop_box.prepend(
|
|
$("<div/>", {
|
|
class: "pop-box-header",
|
|
html: text + '<span class="btn-icon icon-close"></span></span>'
|
|
})
|
|
);
|
|
}
|
|
} else {
|
|
$(".pop-box-header", $pop_box).remove();
|
|
$pop_box.css({ bottom: "" });
|
|
}
|
|
if (
|
|
$pop_box.hasClass("anchor-center") &&
|
|
typeof $pop_box.data("guidstr") == typeof undefined
|
|
) {
|
|
if (!PF.fn.isDevice(devices)) {
|
|
$pop_box.css("margin-left", -($pop_box.width() / 2));
|
|
} else {
|
|
$pop_box.css("margin-left", "");
|
|
}
|
|
}
|
|
|
|
// 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;
|
|
|
|
// Click inside the bubble only for .pop-keep-click
|
|
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")) {
|
|
var guidstr = $pop_box.attr("data-guidstr");
|
|
$pop_box
|
|
.css("marginLeft", "")
|
|
.removeClass(guidstr)
|
|
.removeAttr("data-guidstr")
|
|
.closest(".pop-btn")
|
|
.removeClass("opened");
|
|
if (typeof guidstr !== typeof undefined) {
|
|
$("style#" + guidstr).remove();
|
|
}
|
|
} else {
|
|
if (!PF.fn.isDevice(devices)) {
|
|
var posMargin = $pop_box.css("marginLeft");
|
|
if (typeof posMargin !== typeof undefined) {
|
|
posMargin = parseFloat(posMargin);
|
|
$pop_box.css("marginLeft", "");
|
|
}
|
|
var cutoff = $pop_box.getWindowCutoff();
|
|
if (
|
|
cutoff &&
|
|
(cutoff.left || cutoff.right) &&
|
|
cutoff.right < posMargin
|
|
) {
|
|
var guidstr = "guid-" + PF.fn.guid();
|
|
$pop_box
|
|
.css("marginLeft", cutoff.right + "px")
|
|
.addClass(guidstr)
|
|
.attr("data-guidstr", guidstr);
|
|
var posArrow =
|
|
$this.outerWidth() / 2 +
|
|
$this.offset().left -
|
|
$pop_box.offset().left;
|
|
var selectors = [];
|
|
$.each(["top", "bottom"], function (i, v) {
|
|
$.each(["after", "before"], function (ii, vv) {
|
|
selectors.push("." + guidstr + ".arrow-box-" + v + ":" + vv);
|
|
});
|
|
});
|
|
$(
|
|
'<style id="' +
|
|
guidstr +
|
|
'">' +
|
|
selectors.join() +
|
|
" { left: " +
|
|
posArrow +
|
|
"px; }</style>"
|
|
).appendTo("head");
|
|
} else {
|
|
$pop_box.css("marginLeft", posMargin + "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";
|
|
|
|
// hide
|
|
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" });
|
|
$(PF.fn.topMenu.vars.menu).css({
|
|
height: $(window).height() + parseInt(menu_top)
|
|
});
|
|
}
|
|
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
|
|
);
|
|
}
|
|
}, PF.obj.config.animation.normal);
|
|
if (!$("body").data("hasOverflowHidden")) {
|
|
$("body").removeClass("overflow-hidden");
|
|
}
|
|
} else {
|
|
// show
|
|
$("#pop-box-mask").remove();
|
|
$pop_box.parent().prepend(
|
|
$("<div/>", {
|
|
id: "pop-box-mask",
|
|
class: "fullscreen soft-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: $(window).height(),
|
|
zIndex: 1000,
|
|
transform: "translate(0,0)"
|
|
});
|
|
|
|
setTimeout(function () {
|
|
$pop_box.css({ transform: "translate(0,-" + pop_box_h + ")" });
|
|
}, 1);
|
|
|
|
setTimeout(function () {
|
|
callback($pop_box);
|
|
}, PF.obj.config.animation.normal);
|
|
|
|
if ($("body").hasClass("overflow-hidden")) {
|
|
$("body").data("hasOverflowHidden", 1);
|
|
} else {
|
|
$("body").addClass("overflow-hidden");
|
|
}
|
|
|
|
if ($this.closest(PF.fn.topMenu.vars.menu).exists()) {
|
|
$(".top-bar").css({
|
|
transform: "translate(0, -" + menu_top + ")"
|
|
});
|
|
$(PF.fn.topMenu.vars.menu).css({
|
|
height: $(window).height() + parseInt(menu_top)
|
|
});
|
|
}
|
|
$(".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;
|
|
}
|
|
|
|
if (
|
|
!PF.fn.isDevice(["phone", "phablet", "tablet"]) &&
|
|
$(this).hasClass("pop-btn-delayed")
|
|
) {
|
|
$(this).removeClass("pop-btn-auto");
|
|
}
|
|
|
|
$pop_box
|
|
.hide()
|
|
.closest(".pop-btn")
|
|
.removeClass("opened");
|
|
});
|
|
|
|
$(".pop-btn-delayed").delayedAction({
|
|
delayedAction: function ($element) {
|
|
if (PF.fn.isDevice(["phone", "phablet", "tablet"])) return;
|
|
var $el = $(".pop-box-inner", $element);
|
|
if ($el.is(":hidden")) {
|
|
$element.addClass("pop-btn-auto").click();
|
|
}
|
|
},
|
|
hoverTime: 2000
|
|
});
|
|
|
|
/**
|
|
* 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").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";
|
|
|
|
// This helps to avoid issues on ?same and ?same#else
|
|
/*dataTab.statenum = 0;
|
|
console.log({
|
|
data: History.getState().data,
|
|
state: History.getState().data.statenum
|
|
})
|
|
if(History.getState().data && typeof History.getState().data.statenum !== "undefined") {
|
|
dataTab.statenum = History.getState().data.statenum + 1
|
|
}*/
|
|
|
|
/*if($(this).attr("href") && $(this).attr("href").indexOf("#") === 0) { // to ->#Hash
|
|
PF.obj.tabs.hashdata = dataTab;
|
|
if(typeof e.originalEvent == "undefined") {
|
|
window.location.hash = PF.obj.tabs.hashdata.href.substring(1);
|
|
}
|
|
} else { // to ->?anything
|
|
if($("#" + dataTab["data-tab"]).data("load") != "classic") {
|
|
History.pushState(dataTab, document.title, $(this).attr("href"));
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
*/
|
|
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());
|
|
|
|
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"),
|
|
$this = $(this);
|
|
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", ".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) {
|
|
$(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();
|
|
|
|
// Seek hack
|
|
PF.obj.listing.query_string.seek = $(this).attr("data-seek");
|
|
|
|
// Page hack
|
|
PF.obj.listing.query_string.page = $(
|
|
PF.obj.listing.selectors.content_listing_visible
|
|
).data("page");
|
|
PF.obj.listing.query_string.page++;
|
|
|
|
// Offset hack
|
|
// var offset = $(PF.obj.listing.selectors.content_listing_visible).data("offset");
|
|
|
|
// if(typeof offset !== "undefined") {
|
|
// PF.obj.listing.query_string.offset = offset;
|
|
// if(typeof PF.obj.listing.params_hidden == "undefined") {
|
|
// PF.obj.listing.params_hidden = {};
|
|
// }
|
|
// PF.obj.listing.params_hidden.offset = offset;
|
|
// } else {
|
|
// if(typeof PF.obj.listing.query_string.offset !== "undefined") {
|
|
// delete PF.obj.listing.query_string.offset;
|
|
// }
|
|
// if(PF.obj.listing.params_hidden && typeof PF.obj.listing.params_hidden.offset !== "undefined") {
|
|
// delete PF.obj.listing.params_hidden.offset;
|
|
// }
|
|
// }
|
|
|
|
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]");
|
|
// console.log($loadMore.length);
|
|
if (
|
|
$loadMore.length > 0 &&
|
|
$(window).scrollTop() + $(window).innerHeight() >
|
|
$(document).height() - 300 &&
|
|
PF.obj.listing.calling == false
|
|
) {
|
|
$loadMore.click();
|
|
}
|
|
});
|
|
}
|
|
|
|
// 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();
|
|
});
|
|
|
|
// One-click input copy
|
|
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();
|
|
});
|
|
});
|
|
|
|
/**
|
|
* 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) return;
|
|
if (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)\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 jqNode = $(this),
|
|
jqNode_position = jqNode.css("position");
|
|
|
|
if (!jqNode_position.match("relative|absolute|fixed"))
|
|
jqNode.css({ position: "relative" });
|
|
|
|
var jqNode_left = parseInt(jqNode.css("left"));
|
|
|
|
if (!jqNode_left.toString().isNumeric()) jqNode_left = 0;
|
|
|
|
if (!jqNode.is(":animated")) {
|
|
for (var x = 1; x <= 2; x++) {
|
|
jqNode
|
|
.animate(
|
|
{
|
|
left: jqNode_left - 10
|
|
},
|
|
0
|
|
)
|
|
.animate(
|
|
{
|
|
left: jqNode_left
|
|
},
|
|
30
|
|
)
|
|
.animate(
|
|
{
|
|
left: jqNode_left + 10
|
|
},
|
|
30
|
|
)
|
|
.animate(
|
|
{
|
|
left: jqNode_left
|
|
},
|
|
30
|
|
);
|
|
}
|
|
if (jqNode_position !== "static")
|
|
jqNode.css({ position: jqNode_position });
|
|
}
|
|
});
|
|
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 }, 800, 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;
|
|
};
|
|
|
|
/**
|
|
* Peafowl visible on viewport
|
|
*/
|
|
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) /*or $(window).height() */ &&
|
|
rect.right <=
|
|
(window.innerWidth ||
|
|
document.documentElement.clientWidth) /*or $(window).width() */
|
|
);
|
|
};
|
|
|
|
/**
|
|
* 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")
|
|
.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">' +
|
|
growl_options.message +
|
|
'<span class="icon icon-close" 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());
|
|
}
|
|
|
|
if ($(".fullscreen").is(":visible")) {
|
|
$growl.css({ "z-index": parseInt($(".fullscreen").css("z-index")) + 1 });
|
|
}
|
|
|
|
if ($(PF.obj.modal.selectors.root).is(":visible")) {
|
|
var $modal_box = $(
|
|
PF.obj.modal.selectors.box,
|
|
PF.obj.modal.selectors.root
|
|
);
|
|
$growl.show();
|
|
$growl.css(
|
|
"top",
|
|
($("#top-bar").outerHeight(true) - $growl.outerHeight(true)) / 2
|
|
);
|
|
|
|
PF.fn.growl.fixPosition();
|
|
|
|
$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);
|
|
}
|
|
|
|
console.log(growl_options.message);
|
|
},
|
|
|
|
/**
|
|
* 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();
|
|
}
|
|
});
|
|
},
|
|
|
|
fixPosition: function () {
|
|
var $growl = $(PF.fn.growl.selectors.root);
|
|
|
|
if (!$growl.exists() || !$(PF.obj.modal.selectors.root).exists()) {
|
|
return;
|
|
}
|
|
|
|
if (
|
|
$growl.data("fixedPosition") == "scrollbar" &&
|
|
$(PF.obj.modal.selectors.root).hasScrollBar().vertical
|
|
) {
|
|
return;
|
|
}
|
|
|
|
var offsetX = {
|
|
modal: $(PF.obj.modal.selectors.box).offset().left,
|
|
growl: $growl.offset().left
|
|
},
|
|
growlCompensate = offsetX.modal - offsetX.growl,
|
|
marginLeft =
|
|
growlCompensate < 0
|
|
? "-=" + Math.abs(growlCompensate)
|
|
: "-" + parseInt($growl.css("width")) / 2;
|
|
|
|
if (!PF.fn.isDevice(["phone", "phablet"])) {
|
|
$growl.css("marginLeft", marginLeft + "px");
|
|
}
|
|
|
|
$growl.data(
|
|
"fixedPosition",
|
|
$(PF.obj.modal.selectors.root).hasScrollBar().vertical
|
|
? "scrollbar"
|
|
: "no-scrollbar"
|
|
);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 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.obj.modal.$submit_button = $(
|
|
PF.obj.modal.selectors.submit_button,
|
|
PF.obj.modal.selectors.root
|
|
);
|
|
|
|
PF.fn.modal = {
|
|
str: {
|
|
transition: "all " + PF.obj.config.animation.fast + "ms ease"
|
|
},
|
|
|
|
/**
|
|
* 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 = "soft-black";
|
|
if ($("html").hasClass("tone-dark")) {
|
|
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" data-action="close-modal"></span></div></div>'
|
|
].join("");
|
|
|
|
var modal_buttons = modal_options.buttons
|
|
? [
|
|
'<div class="',
|
|
PF.obj.modal.selectors.btn_container.replace(".", ""),
|
|
'"><button class="btn btn-input default" data-action="submit" type="submit">',
|
|
modal_options.button_submit,
|
|
'</button> <span class="btn-alt">',
|
|
modal_options.txt_or,
|
|
'<a class="cancel" data-action="cancel">',
|
|
modal_options.button_cancel,
|
|
"</a></span></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("overflow-hidden", $("body").hasClass("overflow-hidden"));
|
|
$("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).css({ display: "block" });
|
|
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 () {
|
|
// Stock default modal values
|
|
$("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);
|
|
}, 1);
|
|
|
|
// Bind the modal events
|
|
$(PF.obj.modal.selectors.root).click(function (e) {
|
|
var $this = $(e.target),
|
|
_this = this;
|
|
|
|
if (PF.obj.modal.locked) {
|
|
return;
|
|
}
|
|
|
|
// Changes confirm?
|
|
if (
|
|
$this.closest(PF.obj.modal.selectors.changes_confirm).exists() &&
|
|
($this.is(PF.obj.modal.selectors.close_buttons) ||
|
|
$this.is(PF.obj.modal.selectors.submit_button))
|
|
) {
|
|
$(PF.obj.modal.selectors.changes_confirm).remove();
|
|
|
|
if ($this.is(PF.obj.modal.selectors.close_buttons)) {
|
|
$(PF.obj.modal.selectors.box, _this).fadeIn("fast", function () {
|
|
$(this).css("transition", PF.fn.modal.str.transition);
|
|
});
|
|
} else {
|
|
PF.fn.modal.close();
|
|
}
|
|
|
|
// Modal
|
|
} else {
|
|
if (
|
|
!$this.closest(".clickable").exists() ||
|
|
$this.is(PF.obj.modal.selectors.close_buttons)
|
|
) {
|
|
PF.fn.growl.close();
|
|
modal_options.cancel();
|
|
}
|
|
|
|
if ($this.is(PF.obj.modal.selectors.submit_button)) {
|
|
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());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 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: $(".top-bar, .fixed, .position-fixed"),
|
|
margin: $("html")
|
|
};
|
|
var properties = {};
|
|
if (
|
|
PF.str.ScrollBarWidth > 0 &&
|
|
$("html").hasScrollBar().vertical &&
|
|
!$("body").data("overflow-hidden")
|
|
) {
|
|
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) {
|
|
$(".top-bar, .fixed, .position-fixed").css({ paddingRight: "" });
|
|
}
|
|
$("html").css({ marginRight: "" });
|
|
if (!$("body").data("overflow-hidden")) {
|
|
$("body").removeClass("overflow-hidden");
|
|
}
|
|
$("body").removeData("overflow-hidden");
|
|
$(PF.obj.modal.selectors.root).remove();
|
|
if (typeof callback == "function") callback();
|
|
}, PF.obj.config.animation.normal);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Peafowlesque popups
|
|
*/
|
|
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;
|
|
}
|
|
|
|
if (PF.fn.isDevice(["tablet", "laptop", "desktop"])) {
|
|
// $pad_content_listing.width((PF.obj.listing.content_listing_ratio * list_item_width) - list_item_gutter);
|
|
}
|
|
|
|
if (PF.obj.follow_scroll.$node.hasClass("position-fixed")) {
|
|
PF.obj.follow_scroll.$node.width(
|
|
$(".content-width")
|
|
.first()
|
|
.width()
|
|
);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 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")
|
|
.hide();
|
|
$($target, $tab_content_group)
|
|
.addClass("visible")
|
|
.show();
|
|
|
|
// Show/hide the listing sorting
|
|
$("[data-content=list-selection]")
|
|
.removeClass("visible")
|
|
.addClass("hidden");
|
|
$("[data-content=list-selection][data-tab=" + $this.data("tab") + "]")
|
|
.removeClass("hidden")
|
|
.addClass("visible");
|
|
|
|
if ($tab_content_group.exists()) {
|
|
var $list_item_target = $(
|
|
PF.obj.listing.selectors.list_item + ":not(.jsly)",
|
|
$target
|
|
),
|
|
target_fade = !$target.hasClass("jsly");
|
|
|
|
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();
|
|
} else {
|
|
PF.fn.listing.queryString.stock_current();
|
|
PF.fn.listing.columnizer(false, 0, false);
|
|
$list_item_target[target_fade ? "fadeIn" : "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 icon-drawer",
|
|
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);
|
|
|
|
$(PF.obj.listing.selectors.list_item + ":not(.jsly)", $content_listing).each(
|
|
function () {
|
|
$(this).imagesLoaded(function (i) {
|
|
var items = PF.obj.listing.selectors.list_item,
|
|
$subjects = $(
|
|
items + ":visible",
|
|
PF.obj.listing.selectors.content_listing_visible
|
|
),
|
|
$targets = $(i.elements);
|
|
|
|
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();
|
|
}
|
|
|
|
if ($subjects.length == 0) {
|
|
$targets.show();
|
|
PF.fn.listing.columnizer(false, 0);
|
|
PF.obj.listing.recolumnize = true;
|
|
}
|
|
|
|
//var animation_time = $subjects.length == 0 ? 0 : null;
|
|
var animation_time = 0;
|
|
|
|
PF.fn.listing.columnizer(
|
|
PF.obj.listing.recolumnize,
|
|
animation_time,
|
|
$subjects.length == 0
|
|
);
|
|
|
|
$targets.hide();
|
|
PF.obj.listing.recolumnize = false;
|
|
|
|
if (PF.fn.isDevice(["laptop", "desktop"])) {
|
|
$targets.each(function () {
|
|
// too much CPU for this
|
|
|
|
$(this)
|
|
.show()
|
|
.find(".image-container")
|
|
.hide();
|
|
|
|
var callTime = $.now();
|
|
var $this = $(this);
|
|
var $target = $(".image-container", $this);
|
|
|
|
$(".image-container", this).imagesLoaded(function () {
|
|
var loadTime = $.now() - callTime;
|
|
|
|
if ($subjects.length == 0) {
|
|
if (loadTime > PF.obj.config.animation.normal) {
|
|
$target.fadeIn(PF.obj.config.animation.normal);
|
|
} else {
|
|
$target.show();
|
|
}
|
|
} else {
|
|
$target.fadeIn(PF.obj.config.animation.normal);
|
|
}
|
|
});
|
|
});
|
|
} else {
|
|
$targets.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"
|
|
]("visibility-hidden");
|
|
$(PF.obj.listing.selectors.content_listing_load_more, $content_listing)[
|
|
PF.obj.listing.show_load_more ? "show" : "hide"
|
|
]();
|
|
|
|
var State = History.getState();
|
|
if (State.data && typeof State.data.scrollTop !== "undefined") {
|
|
if ($(window).scrollTop() !== State.data.scrollTop) {
|
|
//$(window).scrollTop(State.data.scrollTop);
|
|
}
|
|
}
|
|
|
|
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 querystring values for initial ajax call
|
|
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.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);
|
|
|
|
$("[data-action=load-more]", $content_listing_load_more).attr(
|
|
"data-seek",
|
|
response.seekEnd
|
|
);
|
|
|
|
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);
|
|
$(PF.obj.listing.selectors.list_item).show();
|
|
};
|
|
|
|
// Peafowl's masonry approach... Just because godlike.
|
|
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;
|
|
|
|
//animation_time = 0;
|
|
|
|
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
|
|
);
|
|
|
|
$container.addClass("jsly");
|
|
|
|
// Get the device columns from global config
|
|
if (typeof PF.obj.config.listing.device_to_columns !== "undefined") {
|
|
device_to_columns = $.extend(
|
|
{},
|
|
device_to_columns,
|
|
PF.obj.config.listing.device_to_columns
|
|
);
|
|
}
|
|
|
|
// Get the device columns from the dom
|
|
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;
|
|
}
|
|
|
|
var special_margin = PF.obj.listing.columns_number == 1 ? "-10px" : "";
|
|
|
|
$("#tabbed-content-group").css({
|
|
marginLeft: special_margin,
|
|
marginRight: special_margin
|
|
});
|
|
|
|
$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%"
|
|
: parseInt(
|
|
(1 / PF.obj.listing.columns_number) *
|
|
($container.width() - 10 * (PF.obj.listing.columns_number - 1)) +
|
|
"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: parseInt($list_item_src.attr("width")),
|
|
h: parseInt($list_item_src.attr("height"))
|
|
};
|
|
image.ratio = image.w / image.h;
|
|
|
|
//$list_item_src.removeAttr("width height"); // para fixed
|
|
|
|
if (hard_forced && PF.obj.listing.columns_number > 1) {
|
|
$list_item_src.css({ width: "auto", height: "auto" });
|
|
$(".image-container:not(.list-item-avatar-cover)", this).css({
|
|
width: "",
|
|
height: "auto"
|
|
});
|
|
} else {
|
|
if (image.w > $container.width()) {
|
|
$(".image-container:not(.list-item-avatar-cover)", this).css(
|
|
image.ratio < 1
|
|
? { maxWidth: "100%", height: "auto" }
|
|
: { height: "100%", width: "auto" }
|
|
);
|
|
$list_item_src.css(
|
|
image.ratio < 1
|
|
? { maxWidth: "100%", height: "auto" }
|
|
: { height: "100%", width: "auto" }
|
|
);
|
|
}
|
|
}
|
|
|
|
// Meet the minHeight?
|
|
|
|
if (
|
|
empty ||
|
|
($list_item_img.css("min-height") && !$list_item_src.hasClass("jsly"))
|
|
) {
|
|
var list_item_img_min_height = parseInt($list_item_img.css("height")),
|
|
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;
|
|
}
|
|
var list_item_img_min_h = parseInt($list_item_img.css("min-height"));
|
|
$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
|
|
}
|
|
$list_item_src.css({ width: image.w, height: image.h });
|
|
|
|
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" }
|
|
);
|
|
}
|
|
if (
|
|
$list_item_src.height() !== 0 &&
|
|
($list_item_img.height() > $list_item_src.height() || isFixed)
|
|
) {
|
|
$list_item_src.parent().css({
|
|
marginTop:
|
|
($list_item_img.outerHeight() - $list_item_src.height()) / 2
|
|
});
|
|
}
|
|
if ($list_item_img.width() < $list_item_src.width()) {
|
|
$list_item_src.parent().css({
|
|
marginLeft:
|
|
-(($list_item_src.outerWidth() - $list_item_img.width()) / 2) + "px"
|
|
});
|
|
}
|
|
|
|
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
|
|
);
|
|
|
|
// Do we need upscale? It is safe to upscale?
|
|
if (
|
|
PF.obj.listing.columns_number > 6 &&
|
|
(list_item_src_pitfall_x > 0 || list_item_src_pitfall_y > 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(),
|
|
pitfall = {};
|
|
if (pitfall_ratio_x <= 0.25 && pitfall_ratio_y <= 0.25) {
|
|
if (pitfall_ratio_x > pitfall_ratio_y) {
|
|
pitfall.width = list_item_src_pitfall_x + $list_item_img.width();
|
|
pitfall.height = pitfall.width / image.ratio;
|
|
} else {
|
|
pitfall.height = list_item_src_pitfall_y + $list_item_src.height();
|
|
pitfall.width = pitfall.height * image.ratio;
|
|
}
|
|
$list_item_src.css(pitfall);
|
|
$list_item_src.parent().css({
|
|
marginLeft: -(
|
|
($list_item_src.width() - $list_item_img.width()) /
|
|
2
|
|
),
|
|
marginTop: 0
|
|
});
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
|
|
//$pad_content_listing.css("visibility", "visible");
|
|
|
|
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 (PF.obj.listing.columns_number == 1) {
|
|
$(this).removeClass("position-absolute");
|
|
} else {
|
|
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 = parseInt($(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 (parseInt($(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();
|
|
}
|
|
|
|
if (!isJslyLoaded) {
|
|
$list_item_src
|
|
.addClass("jsly")
|
|
.hide()
|
|
.imagesLoaded(function (i) {
|
|
$(i.elements)
|
|
.show()
|
|
.addClass("jsly-loaded");
|
|
});
|
|
}
|
|
|
|
// Fill the shortest column (fluid view only)
|
|
if (!isFixed) {
|
|
var minCol, minH, currentH;
|
|
for (var i = 1; i <= PF.obj.listing.columns_number; i++) {
|
|
currentH = PF.obj.listing.columns[i];
|
|
|
|
if (typeof minH == "undefined") {
|
|
minH = currentH;
|
|
minCol = i;
|
|
}
|
|
|
|
if (PF.obj.listing.columns[i] == 0) {
|
|
minCol = i;
|
|
break;
|
|
}
|
|
if (currentH < minH) {
|
|
minH = PF.obj.listing.columns[i];
|
|
minCol = i;
|
|
}
|
|
}
|
|
|
|
PF.obj.listing.current_column = minCol;
|
|
} else {
|
|
PF.obj.listing.current_column++;
|
|
}
|
|
});
|
|
|
|
$container.data({
|
|
columns: PF.obj.listing.columns,
|
|
current_column: PF.obj.listing.current_column
|
|
});
|
|
|
|
var content_listing_height = 0;
|
|
$.each(PF.obj.listing.columns, function (i, v) {
|
|
if (v > content_listing_height) {
|
|
content_listing_height = v;
|
|
}
|
|
});
|
|
|
|
if (content_listing_height > 10) {
|
|
content_listing_height -= 10;
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
// Magic!
|
|
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);
|
|
};
|
|
|
|
/**
|
|
* 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%",
|
|
left: "50%",
|
|
marginTop: -(PF.fn.loading.spin[options.size].blocksize / 2),
|
|
marginLeft: -(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",
|
|
left: 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;
|
|
};
|
|
|
|
/**
|
|
* PEAFOWL FOLLOW SCROLL
|
|
* -------------------------------------------------------------------------------------------------
|
|
*/
|
|
PF.obj.follow_scroll = {
|
|
Y: 0,
|
|
y: 0,
|
|
$node: $(".follow-scroll"),
|
|
node_h: 0,
|
|
base_h: $(".follow-scroll").outerHeight(),
|
|
set: function (reset) {
|
|
if (reset) {
|
|
PF.obj.follow_scroll.base_h = $(".follow-scroll").outerHeight();
|
|
}
|
|
var exists = PF.obj.follow_scroll.$node
|
|
.closest(".follow-scroll-wrapper")
|
|
.exists();
|
|
if (exists) {
|
|
PF.obj.follow_scroll.$node
|
|
.closest(".follow-scroll-wrapper")
|
|
.css("position", "static");
|
|
}
|
|
PF.obj.follow_scroll.y = PF.obj.follow_scroll.$node.exists()
|
|
? PF.obj.follow_scroll.$node.offset().top
|
|
: null;
|
|
PF.obj.follow_scroll.node_h = PF.obj.follow_scroll.$node.outerHeight();
|
|
if (exists) {
|
|
PF.obj.follow_scroll.$node
|
|
.closest(".follow-scroll-wrapper")
|
|
.css("position", "");
|
|
}
|
|
},
|
|
checkDocumentHeight: function () {
|
|
var lastHeight = document.body.clientHeight,
|
|
newHeight,
|
|
timer;
|
|
(function run() {
|
|
newHeight = document.body.clientHeight;
|
|
if (lastHeight != newHeight) {
|
|
PF.obj.follow_scroll.set();
|
|
}
|
|
lastHeight = newHeight;
|
|
timer = setTimeout(run, 200);
|
|
})();
|
|
}
|
|
};
|
|
PF.obj.follow_scroll.set();
|
|
//PF.obj.follow_scroll.checkDocumentHeight();
|
|
|
|
PF.obj.follow_scroll.process = function (forced) {
|
|
if (forced) {
|
|
PF.obj.follow_scroll.node_h = PF.obj.follow_scroll.base_h;
|
|
}
|
|
|
|
if (!PF.obj.follow_scroll.$node.exists()) return; // Nothing to do here
|
|
|
|
var $parent = PF.obj.follow_scroll.$node.closest(
|
|
"[data-content=follow-scroll-parent]"
|
|
);
|
|
if (!$parent.exists()) {
|
|
$parent = PF.obj.follow_scroll.$node.closest(".content-width");
|
|
}
|
|
|
|
var $wrapper = PF.obj.follow_scroll.$node.closest(".follow-scroll-wrapper");
|
|
|
|
var top = PF.obj.follow_scroll.node_h;
|
|
var cond = $(window).scrollTop() > PF.obj.follow_scroll.y - top;
|
|
|
|
if ($("#top-bar").css("position") !== "fixed") {
|
|
PF.obj.follow_scroll.Y -= $(window).scrollTop();
|
|
if (PF.obj.follow_scroll.Y < 0) PF.obj.follow_scroll.Y = 0;
|
|
cond = cond && $(window).scrollTop() > PF.obj.follow_scroll.y;
|
|
}
|
|
|
|
if (
|
|
(cond && $wrapper.hasClass("position-fixed")) ||
|
|
(!cond && !$wrapper.hasClass("position-fixed"))
|
|
) {
|
|
return;
|
|
}
|
|
|
|
if (!$wrapper.exists()) {
|
|
PF.obj.follow_scroll.$node.wrapAll('<div class="follow-scroll-wrapper" />');
|
|
$wrapper = PF.obj.follow_scroll.$node.closest(".follow-scroll-wrapper");
|
|
}
|
|
|
|
$wrapper.css("min-height", PF.obj.follow_scroll.node_h);
|
|
|
|
PF.obj.follow_scroll.Y =
|
|
$("#top-bar").outerHeight(true) +
|
|
parseFloat($("#top-bar").css("top")) -
|
|
0.5;
|
|
|
|
if (cond) {
|
|
var placeholderHeight = PF.obj.follow_scroll.node_h;
|
|
$wrapper.addClass("position-fixed").css({ top: PF.obj.follow_scroll.Y });
|
|
if (!$wrapper.next().is(".follow-scroll-placeholder")) {
|
|
$wrapper.after(
|
|
$('<div class="follow-scroll-placeholder" />').css(
|
|
"min-height",
|
|
placeholderHeight
|
|
)
|
|
);
|
|
} else {
|
|
$wrapper
|
|
.parent()
|
|
.find(".follow-scroll-placeholder")
|
|
.css("min-height", placeholderHeight)
|
|
.show();
|
|
}
|
|
} else {
|
|
$wrapper
|
|
.removeClass("position-fixed")
|
|
.css({ top: "", width: "", minHeight: "" });
|
|
$wrapper
|
|
.parent()
|
|
.find(".follow-scroll-placeholder")
|
|
.hide();
|
|
}
|
|
|
|
$("[data-show-on=follow-scroll]")[(cond ? "remove" : "add") + "Class"](
|
|
"hidden soft-hidden"
|
|
);
|
|
|
|
if (!$("html").data("top-bar-box-shadow-prevent")) {
|
|
$("html")[(cond ? "add" : "remove") + "Class"]("top-bar-box-shadow-none");
|
|
}
|
|
|
|
PF.obj.follow_scroll.$node[(cond ? "add" : "remove") + "Class"](
|
|
"content-width"
|
|
);
|
|
};
|
|
|
|
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")
|
|
.css("position", "fixed")
|
|
.append(
|
|
$("<div/>", {
|
|
id: "menu-fullscreen",
|
|
class: "touch-scroll",
|
|
html: $("<ul/>", {
|
|
html: $(".top-bar-left").html() + $(".top-bar-right").html()
|
|
})
|
|
}).css({
|
|
borderTopWidth: this.vars.menu_top,
|
|
left: "-100%"
|
|
//height: $(window).height(), // aca
|
|
})
|
|
);
|
|
|
|
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: "translate(100%, 0)" });
|
|
}, 1);
|
|
setTimeout(function () {
|
|
$("html").css({ backgroundColor: "" });
|
|
}, this.vars.speed);
|
|
},
|
|
hide: function (speed) {
|
|
if ($("body").is(":animated")) return;
|
|
|
|
if (!$(this.vars.menu).is(":visible")) return;
|
|
|
|
if (typeof speed == "undefined") {
|
|
var speed = this.vars.speed;
|
|
}
|
|
|
|
$("#top-bar").css("position", "");
|
|
|
|
this.vars.$button.removeClass("current");
|
|
$("html").removeClass("menu-fullscreen-visible");
|
|
var $menu = $(this.vars.menu);
|
|
$menu.css({
|
|
transform: "none"
|
|
});
|
|
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.0
|
|
* JavaScript is all like "You images are done yet or what?"
|
|
* MIT License
|
|
*/
|
|
|
|
!(function (t, e) {
|
|
"function" == typeof define && define.amd
|
|
? define("ev-emitter/ev-emitter", e)
|
|
: "object" == typeof module && module.exports
|
|
? (module.exports = e())
|
|
: (t.EvEmitter = e());
|
|
})(this, function () {
|
|
function t() { }
|
|
var e = t.prototype;
|
|
return (
|
|
(e.on = function (t, e) {
|
|
if (t && e) {
|
|
var i = (this._events = this._events || {}),
|
|
n = (i[t] = i[t] || []);
|
|
return -1 == n.indexOf(e) && n.push(e), this;
|
|
}
|
|
}),
|
|
(e.once = function (t, e) {
|
|
if (t && e) {
|
|
this.on(t, e);
|
|
var i = (this._onceEvents = this._onceEvents || {}),
|
|
n = (i[t] = i[t] || []);
|
|
return (n[e] = !0), this;
|
|
}
|
|
}),
|
|
(e.off = function (t, e) {
|
|
var i = this._events && this._events[t];
|
|
if (i && i.length) {
|
|
var n = i.indexOf(e);
|
|
return -1 != n && i.splice(n, 1), this;
|
|
}
|
|
}),
|
|
(e.emitEvent = function (t, e) {
|
|
var i = this._events && this._events[t];
|
|
if (i && i.length) {
|
|
var n = 0,
|
|
o = i[n];
|
|
e = e || [];
|
|
for (var r = this._onceEvents && this._onceEvents[t]; o;) {
|
|
var s = r && r[o];
|
|
s && (this.off(t, o), delete r[o]),
|
|
o.apply(this, e),
|
|
(n += s ? 0 : 1),
|
|
(o = i[n]);
|
|
}
|
|
return this;
|
|
}
|
|
}),
|
|
t
|
|
);
|
|
}),
|
|
(function (t, e) {
|
|
"use strict";
|
|
"function" == typeof define && define.amd
|
|
? define(["ev-emitter/ev-emitter"], function (i) {
|
|
return e(t, i);
|
|
})
|
|
: "object" == typeof module && module.exports
|
|
? (module.exports = e(t, require("ev-emitter")))
|
|
: (t.imagesLoaded = e(t, t.EvEmitter));
|
|
})(window, function (t, e) {
|
|
function i(t, e) {
|
|
for (var i in e) t[i] = e[i];
|
|
return t;
|
|
}
|
|
function n(t) {
|
|
var e = [];
|
|
if (Array.isArray(t)) e = t;
|
|
else if ("number" == typeof t.length)
|
|
for (var i = 0; i < t.length; i++) e.push(t[i]);
|
|
else e.push(t);
|
|
return e;
|
|
}
|
|
function o(t, e, r) {
|
|
return this instanceof o
|
|
? ("string" == typeof t && (t = document.querySelectorAll(t)),
|
|
(this.elements = n(t)),
|
|
(this.options = i({}, this.options)),
|
|
"function" == typeof e ? (r = e) : i(this.options, e),
|
|
r && this.on("always", r),
|
|
this.getImages(),
|
|
h && (this.jqDeferred = new h.Deferred()),
|
|
void setTimeout(
|
|
function () {
|
|
this.check();
|
|
}.bind(this)
|
|
))
|
|
: new o(t, e, r);
|
|
}
|
|
function r(t) {
|
|
this.img = t;
|
|
}
|
|
function s(t, e) {
|
|
(this.url = t), (this.element = e), (this.img = new Image());
|
|
}
|
|
var h = t.jQuery,
|
|
a = t.console;
|
|
(o.prototype = Object.create(e.prototype)),
|
|
(o.prototype.options = {}),
|
|
(o.prototype.getImages = function () {
|
|
(this.images = []), this.elements.forEach(this.addElementImages, this);
|
|
}),
|
|
(o.prototype.addElementImages = function (t) {
|
|
"IMG" == t.nodeName && this.addImage(t),
|
|
this.options.background === !0 && this.addElementBackgroundImages(t);
|
|
var e = t.nodeType;
|
|
if (e && d[e]) {
|
|
for (var i = t.querySelectorAll("img"), n = 0; n < i.length; n++) {
|
|
var o = i[n];
|
|
this.addImage(o);
|
|
}
|
|
if ("string" == typeof this.options.background) {
|
|
var r = t.querySelectorAll(this.options.background);
|
|
for (n = 0; n < r.length; n++) {
|
|
var s = r[n];
|
|
this.addElementBackgroundImages(s);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
var d = { 1: !0, 9: !0, 11: !0 };
|
|
return (
|
|
(o.prototype.addElementBackgroundImages = function (t) {
|
|
var e = getComputedStyle(t);
|
|
if (e)
|
|
for (
|
|
var i = /url\((['"])?(.*?)\1\)/gi, n = i.exec(e.backgroundImage);
|
|
null !== n;
|
|
|
|
) {
|
|
var o = n && n[2];
|
|
o && this.addBackground(o, t), (n = i.exec(e.backgroundImage));
|
|
}
|
|
}),
|
|
(o.prototype.addImage = function (t) {
|
|
var e = new r(t);
|
|
this.images.push(e);
|
|
}),
|
|
(o.prototype.addBackground = function (t, e) {
|
|
var i = new s(t, e);
|
|
this.images.push(i);
|
|
}),
|
|
(o.prototype.check = function () {
|
|
function t(t, i, n) {
|
|
setTimeout(function () {
|
|
e.progress(t, i, n);
|
|
});
|
|
}
|
|
var e = this;
|
|
return (
|
|
(this.progressedCount = 0),
|
|
(this.hasAnyBroken = !1),
|
|
this.images.length
|
|
? void this.images.forEach(function (e) {
|
|
e.once("progress", t), e.check();
|
|
})
|
|
: void this.complete()
|
|
);
|
|
}),
|
|
(o.prototype.progress = function (t, e, i) {
|
|
this.progressedCount++,
|
|
(this.hasAnyBroken = this.hasAnyBroken || !t.isLoaded),
|
|
this.emitEvent("progress", [this, t, e]),
|
|
this.jqDeferred &&
|
|
this.jqDeferred.notify &&
|
|
this.jqDeferred.notify(this, t),
|
|
this.progressedCount == this.images.length && this.complete(),
|
|
this.options.debug && a && a.log("progress: " + i, t, e);
|
|
}),
|
|
(o.prototype.complete = function () {
|
|
var t = this.hasAnyBroken ? "fail" : "done";
|
|
if (
|
|
((this.isComplete = !0),
|
|
this.emitEvent(t, [this]),
|
|
this.emitEvent("always", [this]),
|
|
this.jqDeferred)
|
|
) {
|
|
var e = this.hasAnyBroken ? "reject" : "resolve";
|
|
this.jqDeferred[e](this);
|
|
}
|
|
}),
|
|
(r.prototype = Object.create(e.prototype)),
|
|
(r.prototype.check = function () {
|
|
var t = this.getIsImageComplete();
|
|
return t
|
|
? void this.confirm(0 !== this.img.naturalWidth, "naturalWidth")
|
|
: ((this.proxyImage = new Image()),
|
|
this.proxyImage.addEventListener("load", this),
|
|
this.proxyImage.addEventListener("error", this),
|
|
this.img.addEventListener("load", this),
|
|
this.img.addEventListener("error", this),
|
|
void (this.proxyImage.src = this.img.src));
|
|
}),
|
|
(r.prototype.getIsImageComplete = function () {
|
|
return this.img.complete && void 0 !== this.img.naturalWidth;
|
|
}),
|
|
(r.prototype.confirm = function (t, e) {
|
|
(this.isLoaded = t), this.emitEvent("progress", [this, this.img, e]);
|
|
}),
|
|
(r.prototype.handleEvent = function (t) {
|
|
var e = "on" + t.type;
|
|
this[e] && this[e](t);
|
|
}),
|
|
(r.prototype.onload = function () {
|
|
this.confirm(!0, "onload"), this.unbindEvents();
|
|
}),
|
|
(r.prototype.onerror = function () {
|
|
this.confirm(!1, "onerror"), this.unbindEvents();
|
|
}),
|
|
(r.prototype.unbindEvents = function () {
|
|
this.proxyImage.removeEventListener("load", this),
|
|
this.proxyImage.removeEventListener("error", this),
|
|
this.img.removeEventListener("load", this),
|
|
this.img.removeEventListener("error", this);
|
|
}),
|
|
(s.prototype = Object.create(r.prototype)),
|
|
(s.prototype.check = function () {
|
|
this.img.addEventListener("load", this),
|
|
this.img.addEventListener("error", this),
|
|
(this.img.src = this.url);
|
|
var t = this.getIsImageComplete();
|
|
t &&
|
|
(this.confirm(0 !== this.img.naturalWidth, "naturalWidth"),
|
|
this.unbindEvents());
|
|
}),
|
|
(s.prototype.unbindEvents = function () {
|
|
this.img.removeEventListener("load", this),
|
|
this.img.removeEventListener("error", this);
|
|
}),
|
|
(s.prototype.confirm = function (t, e) {
|
|
(this.isLoaded = t),
|
|
this.emitEvent("progress", [this, this.element, e]);
|
|
}),
|
|
(o.makeJQueryPlugin = function (e) {
|
|
(e = e || t.jQuery),
|
|
e &&
|
|
((h = e),
|
|
(h.fn.imagesLoaded = function (t, e) {
|
|
var i = new o(this, t, e);
|
|
return i.jqDeferred.promise(h(this));
|
|
}));
|
|
}),
|
|
o.makeJQueryPlugin(),
|
|
o
|
|
);
|
|
});
|
|
|
|
/**
|
|
* 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);
|
|
});
|