949 lines
28 KiB
JavaScript
949 lines
28 KiB
JavaScript
/**
|
|
* (c) jSuites Javascript Web Components (v3.9.3)
|
|
*
|
|
* Website: https://jsuites.net
|
|
* Description: Create amazing web based applications.
|
|
*
|
|
* MIT License
|
|
*
|
|
*/
|
|
;(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
typeof define === 'function' && define.amd ? define(factory) :
|
|
global.jSuites = factory();
|
|
}(this, (function () {
|
|
|
|
'use strict';
|
|
|
|
jSuites.app = (function(el, options) {
|
|
var obj = {};
|
|
obj.options = {};
|
|
|
|
// Default configuration
|
|
var defaults = {
|
|
path: 'views',
|
|
onbeforechangepage: null,
|
|
onchangepage: null,
|
|
onbeforecreatepage: null,
|
|
oncreatepage: null,
|
|
onloadpage: null,
|
|
toolbar: null,
|
|
detachHiddenPages: false
|
|
}
|
|
|
|
// Loop through our object
|
|
for (var property in defaults) {
|
|
if (options && options.hasOwnProperty(property)) {
|
|
obj.options[property] = options[property];
|
|
} else {
|
|
obj.options[property] = defaults[property];
|
|
}
|
|
}
|
|
|
|
// App
|
|
el.classList.add('japp');
|
|
|
|
// Toolbar
|
|
var toolbar = document.createElement('div');
|
|
|
|
obj.setToolbar = function(o) {
|
|
if (o) {
|
|
obj.options.toolbar = o;
|
|
}
|
|
obj.toolbar = jSuites.toolbar(toolbar, {
|
|
app: obj,
|
|
items: obj.options.toolbar,
|
|
});
|
|
el.appendChild(toolbar);
|
|
}
|
|
|
|
obj.hideToolbar = function() {
|
|
if (toolbar.style.display == '') {
|
|
toolbar.style.display = 'none';
|
|
}
|
|
}
|
|
|
|
obj.showToolbar = function() {
|
|
if (toolbar.style.display == 'none') {
|
|
toolbar.style.display = '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Pages
|
|
*/
|
|
obj.pages = function() {
|
|
/**
|
|
* Create or access a page
|
|
*/
|
|
var component = function(route, o, callback) {
|
|
var options = {};
|
|
|
|
if (o) {
|
|
if (typeof(o) == 'object') {
|
|
var options = o;
|
|
} else {
|
|
if (! callback && typeof(o) == 'function') {
|
|
callback = o;
|
|
}
|
|
}
|
|
}
|
|
|
|
// If exists just open
|
|
if (component.container[route]) {
|
|
component.show(component.container[route], options, callback);
|
|
} else {
|
|
// Create a new page
|
|
if (! route) {
|
|
console.error('JSUITES: Error, no route provided');
|
|
} else {
|
|
// Closed
|
|
options.closed = options.closed ? 1 : 0;
|
|
// Keep Route
|
|
options.route = route;
|
|
|
|
// New page url
|
|
if (! options.url) {
|
|
options.url = obj.options.path + route + '.html';
|
|
}
|
|
|
|
// Create new page
|
|
component.create(options, callback);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create a new page
|
|
*/
|
|
component.create = function(o, callback) {
|
|
// Create page
|
|
var page = document.createElement('div');
|
|
page.classList.add('page');
|
|
|
|
// Container
|
|
component.container[o.route] = page;
|
|
|
|
// Keep options
|
|
page.options = o ? o : {};
|
|
|
|
// Always hidden when created
|
|
page.style.display = 'none';
|
|
|
|
var updateDOM = function() {
|
|
// Remove to avoid id conflicts
|
|
if (component.current && obj.options.detachHiddenPages == true) {
|
|
while (component.element.children[0]) {
|
|
component.element.children[0].parentNode.removeChild(component.element.children[0]);
|
|
}
|
|
}
|
|
|
|
if (! component.current) {
|
|
component.element.appendChild(page);
|
|
} else {
|
|
component.element.insertBefore(page, component.current.nextSibling);
|
|
}
|
|
}
|
|
|
|
if (obj.options.detachHiddenPages == false) {
|
|
updateDOM();
|
|
}
|
|
|
|
// Create page overwrite
|
|
var ret = null;
|
|
if (typeof(obj.options.onbeforecreatepage) == 'function') {
|
|
var ret = obj.options.onbeforecreatepage(obj, page);
|
|
if (ret === false) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
jSuites.ajax({
|
|
url: o.url,
|
|
method: 'GET',
|
|
dataType: 'html',
|
|
queue: true,
|
|
success: function(result) {
|
|
if (! page.parentNode) {
|
|
// Update DOM
|
|
updateDOM();
|
|
}
|
|
|
|
// Create page overwrite
|
|
var ret = null;
|
|
if (typeof(obj.options.oncreatepage) == 'function') {
|
|
ret = obj.options.oncreatepage(obj, page, result);
|
|
}
|
|
|
|
// Push to refresh controls
|
|
if (typeof(page.options.onpush) == 'function') {
|
|
jSuites.refresh(page, page.options.onpush);
|
|
}
|
|
|
|
// Ignore create page actions
|
|
if (ret !== false) {
|
|
// Open page
|
|
page.innerHTML = result;
|
|
// Get javascript
|
|
try {
|
|
parseScript(page);
|
|
} catch (e) {
|
|
console.log(e);
|
|
}
|
|
}
|
|
|
|
// Navbar
|
|
if (page.querySelector('.navbar')) {
|
|
page.classList.add('with-navbar');
|
|
}
|
|
|
|
// Global onload callback
|
|
if (typeof(obj.options.onloadpage) == 'function') {
|
|
obj.options.onloadpage(page);
|
|
}
|
|
|
|
// Specific online callback
|
|
if (typeof(o.onload) == 'function') {
|
|
o.onload(page);
|
|
}
|
|
|
|
// Show page
|
|
if (! page.options.closed) {
|
|
component.show(page, o, callback);
|
|
}
|
|
}
|
|
});
|
|
|
|
return page;
|
|
}
|
|
|
|
component.show = function(page, o, callback) {
|
|
var pageIsReady = function() {
|
|
if (component.current) {
|
|
component.current.style.display = 'none';
|
|
|
|
if (component.current && obj.options.detachHiddenPages == true) {
|
|
if (component.current.parentNode) {
|
|
component.current.parentNode.removeChild(component.current);
|
|
}
|
|
}
|
|
}
|
|
|
|
// New page
|
|
if (typeof(obj.options.onchangepage) == 'function') {
|
|
obj.options.onchangepage(obj, component.current, page, o);
|
|
}
|
|
|
|
// Enter event
|
|
if (typeof(page.options.onenter) == 'function') {
|
|
page.options.onenter(obj, page, component.current);
|
|
}
|
|
|
|
// Callback
|
|
if (typeof(callback) == 'function') {
|
|
callback(obj, page);
|
|
}
|
|
|
|
// Current page
|
|
component.current = page;
|
|
}
|
|
|
|
// Append page in case was detached
|
|
if (! page.parentNode) {
|
|
component.element.appendChild(page);
|
|
}
|
|
|
|
if (component.current) {
|
|
if (component.current != page) {
|
|
// Show page
|
|
page.style.display = '';
|
|
|
|
var a = Array.prototype.indexOf.call(component.element.children, component.current);
|
|
var b = Array.prototype.indexOf.call(component.element.children, page);
|
|
|
|
// Before leave the page
|
|
if (typeof(obj.options.onbeforechangepage) == 'function') {
|
|
var ret = obj.options.onbeforechangepage(obj, component.current, page, o);
|
|
if (ret === false) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Leave event
|
|
if (typeof(page.options.onleave) == 'function') {
|
|
page.options.onleave(obj, component.current);
|
|
}
|
|
|
|
// Animation only on mobile
|
|
var rect = component.element.getBoundingClientRect();
|
|
|
|
// Move to the top
|
|
window.scrollTo({ top: 0 });
|
|
|
|
// Page is ready
|
|
if (rect.width < 800 && obj.options.detachHiddenPages == false) {
|
|
jSuites.animation.slideLeft(component.element, (a < b ? 0 : 1), function() {
|
|
if (component.current != page) {
|
|
pageIsReady();
|
|
}
|
|
});
|
|
} else {
|
|
if (component.current != page) {
|
|
pageIsReady();
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
// Show
|
|
page.style.display = '';
|
|
|
|
// Page is ready
|
|
pageIsReady();
|
|
}
|
|
|
|
// Select toolbar item
|
|
if (page.options.toolbarItem) {
|
|
obj.toolbar.selectItem(page.options.toolbarItem);
|
|
}
|
|
|
|
// Add history
|
|
if (! o || ! o.ignoreHistory) {
|
|
// Add history
|
|
window.history.pushState({ route: page.options.route }, page.options.title, page.options.route);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get a page by route
|
|
*/
|
|
component.get = function(route) {
|
|
if (component.container[route]) {
|
|
return component.container[route];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reset the page container
|
|
*/
|
|
component.reset = function() {
|
|
// Container
|
|
component.element.innerHTML = '';
|
|
// Current
|
|
component.current = null;
|
|
}
|
|
|
|
/**
|
|
* Reset the page container
|
|
*/
|
|
component.destroy = function() {
|
|
// Reset container
|
|
component.reset();
|
|
// Destroy references
|
|
component.container = {};
|
|
}
|
|
/**
|
|
* Page container controller
|
|
*/
|
|
component.container = {};
|
|
|
|
/**
|
|
* Pages DOM container
|
|
*/
|
|
var pagesContainer = el.querySelector('.pages');
|
|
if (pagesContainer) {
|
|
component.element = pagesContainer;
|
|
} else {
|
|
component.element = document.createElement('div');
|
|
component.element.className = 'pages';
|
|
}
|
|
|
|
// Prefetched content
|
|
if (el.innerHTML) {
|
|
// Create with the prefetched content
|
|
var page = document.createElement('div');
|
|
page.classList.add('page');
|
|
while (el.childNodes[0]) {
|
|
page.appendChild(el.childNodes[0]);
|
|
}
|
|
if (el.innerHTML) {
|
|
var div = document.createElement('div');
|
|
div.innerHTML = component.element.innerHTML;
|
|
page.appendChild(div);
|
|
}
|
|
// Container
|
|
var route = window.location.pathname;
|
|
component.container[route] = page;
|
|
|
|
// Keep options
|
|
page.options = {};
|
|
page.options.route = route;
|
|
|
|
// Current page
|
|
component.current = page;
|
|
|
|
// Place the page to the right container
|
|
if (! component.current) {
|
|
component.element.appendChild(page);
|
|
} else {
|
|
component.element.insertBefore(page, component.current.nextSibling);
|
|
}
|
|
}
|
|
|
|
// Append page container to the application
|
|
el.appendChild(component.element);
|
|
|
|
return component;
|
|
}();
|
|
|
|
/**
|
|
* Panel methods
|
|
*/
|
|
obj.panel = function() {
|
|
var panel = null;
|
|
|
|
var component = function(route, o) {
|
|
if (! panel) {
|
|
// Create element
|
|
panel = document.createElement('div');
|
|
panel.classList.add('panel');
|
|
panel.classList.add('panel-left');
|
|
panel.style.display = 'none';
|
|
|
|
// Bind to the app
|
|
el.appendChild(panel);
|
|
}
|
|
|
|
// Remote content
|
|
if (route) {
|
|
// URL
|
|
if (! o) {
|
|
o = {};
|
|
}
|
|
if (! o.url) {
|
|
o.url = obj.options.path + route + '.html';
|
|
}
|
|
// Route
|
|
o.route = route;
|
|
// Panel
|
|
panel.options = o;
|
|
|
|
// Request remote data
|
|
jSuites.ajax({
|
|
url: o.url,
|
|
method: 'GET',
|
|
dataType: 'html',
|
|
success: function(result) {
|
|
// Create page overwrite
|
|
var ret = null;
|
|
if (typeof(obj.options.oncreatepage) == 'function') {
|
|
ret = obj.options.oncreatepage(obj, panel, result);
|
|
}
|
|
|
|
// Ignore create page actions
|
|
if (ret !== false) {
|
|
// Open page
|
|
panel.innerHTML = result;
|
|
// Get javascript
|
|
parseScript(page);
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
component.show();
|
|
}
|
|
}
|
|
|
|
component.show = function() {
|
|
// Show panel
|
|
if (panel && panel.style.display == 'none') {
|
|
panel.style.display = '';
|
|
// Add animation
|
|
if (panel.classList.contains('panel-left')) {
|
|
jSuites.animation.slideLeft(panel, 1);
|
|
} else {
|
|
jSuites.animation.slideRight(panel, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
component.hide = function() {
|
|
if (panel && panel.style.display == '') {
|
|
// Animation
|
|
if (panel.classList.contains('panel-left')) {
|
|
jSuites.animation.slideLeft(panel, 0, function() {
|
|
panel.style.display = 'none';
|
|
});
|
|
} else {
|
|
jSuites.animation.slideRight(panel, 0, function() {
|
|
panel.animation.style.display = 'none';
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
component.get = function() {
|
|
return panel;
|
|
}
|
|
|
|
component.destroy = function() {
|
|
el.removeChild(panel);
|
|
panel = null;
|
|
}
|
|
|
|
return component;
|
|
}();
|
|
|
|
// Actionsheet
|
|
obj.actionsheet = jSuites.actionsheet(el, obj);
|
|
|
|
/*
|
|
* Parse javascript from an element
|
|
*/
|
|
var parseScript = function(element) {
|
|
// Get javascript
|
|
var script = element.getElementsByTagName('script');
|
|
// Run possible inline scripts
|
|
for (var i = 0; i < script.length; i++) {
|
|
// Get type
|
|
var type = script[i].getAttribute('type');
|
|
if (! type || type == 'text/javascript' || type == 'text/loader') {
|
|
eval(script[i].text);
|
|
}
|
|
}
|
|
}
|
|
|
|
var controlSwipeLeft = function(e) {
|
|
var element = jSuites.findElement(e.target, 'option');
|
|
|
|
if (element && element.querySelector('.option-actions')) {
|
|
element.scrollTo({
|
|
left: 100,
|
|
behavior: 'smooth'
|
|
});
|
|
} else {
|
|
obj.panel.hide();
|
|
}
|
|
}
|
|
|
|
var controlSwipeRight = function(e) {
|
|
var element = jSuites.findElement(e.target, 'option');
|
|
if (element && element.querySelector('.option-actions')) {
|
|
element.scrollTo({
|
|
left: 0,
|
|
behavior: 'smooth'
|
|
});
|
|
} else {
|
|
obj.panel.show();
|
|
}
|
|
}
|
|
|
|
var actionElement = null;
|
|
|
|
var actionDown = function(e) {
|
|
// Grouped options
|
|
if (e.target.classList.contains('option-title')) {
|
|
if (e.target.classList.contains('selected')) {
|
|
e.target.classList.remove('selected');
|
|
} else {
|
|
e.target.classList.add('selected');
|
|
}
|
|
}
|
|
|
|
// Grouped buttons
|
|
if (e.target.parentNode.classList.contains('jbuttons-group')) {
|
|
for (var j = 0; j < e.target.parentNode.children.length; j++) {
|
|
e.target.parentNode.children[j].classList.remove('selected');
|
|
}
|
|
e.target.classList.add('selected');
|
|
}
|
|
|
|
// App links
|
|
actionElement = jSuites.findElement(e.target, function(e) {
|
|
return e.tagName == 'A' && e.getAttribute('href') ? e : false;
|
|
});
|
|
|
|
if (actionElement) {
|
|
var link = actionElement.getAttribute('href');
|
|
if (link == '#back') {
|
|
window.history.back();
|
|
} else if (link == '#panel') {
|
|
obj.panel();
|
|
} else {
|
|
if (actionElement.classList.contains('link')) {
|
|
actionElement = null;
|
|
} else {
|
|
obj.pages(link);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var actionUp = function(e) {
|
|
obj.actionsheet.close();
|
|
|
|
if (actionElement) {
|
|
e.preventDefault();
|
|
actionElement = null;
|
|
}
|
|
}
|
|
|
|
el.addEventListener('swipeleft', controlSwipeLeft);
|
|
el.addEventListener('swiperight', controlSwipeRight);
|
|
|
|
if ('ontouchstart' in document.documentElement === true) {
|
|
document.addEventListener('touchstart', actionDown);
|
|
document.addEventListener('touchend', actionUp);
|
|
} else {
|
|
document.addEventListener('mousedown', actionDown);
|
|
document.addEventListener('click', function(e) {
|
|
actionUp(e);
|
|
});
|
|
}
|
|
|
|
window.onpopstate = function(e) {
|
|
if (e.state && e.state.route) {
|
|
if (obj.pages.get(e.state.route)) {
|
|
obj.pages(e.state.route, { ignoreHistory: true });
|
|
}
|
|
}
|
|
}
|
|
|
|
if (obj.options.toolbar) {
|
|
obj.setToolbar();
|
|
}
|
|
|
|
el.app = obj;
|
|
|
|
return obj;
|
|
});
|
|
|
|
jSuites.actionsheet = (function(el, component) {
|
|
var obj = function(options) {
|
|
// Reset container
|
|
actionContent.innerHTML = '';
|
|
|
|
// Create new elements
|
|
for (var i = 0; i < options.length; i++) {
|
|
var actionGroup = document.createElement('div');
|
|
actionGroup.className = 'jactionsheet-group';
|
|
|
|
for (var j = 0; j < options[i].length; j++) {
|
|
var v = options[i][j];
|
|
var actionItem = document.createElement('div');
|
|
var actionInput = document.createElement('input');
|
|
actionInput.type = 'button';
|
|
actionInput.value = v.title;
|
|
if (v.className) {
|
|
actionInput.className = v.className;
|
|
}
|
|
if (v.onclick) {
|
|
actionInput.event = v.onclick;
|
|
actionInput.onclick = function() {
|
|
this.event(component, this);
|
|
}
|
|
}
|
|
if (v.action == 'cancel') {
|
|
actionInput.style.color = 'red';
|
|
}
|
|
actionItem.appendChild(actionInput);
|
|
actionGroup.appendChild(actionItem);
|
|
}
|
|
|
|
actionContent.appendChild(actionGroup);
|
|
}
|
|
|
|
// Show
|
|
actionsheet.style.display = '';
|
|
|
|
// Animation
|
|
jSuites.animation.slideBottom(actionContent, true);
|
|
}
|
|
|
|
obj.close = function() {
|
|
if (actionsheet.style.display != 'none') {
|
|
// Remove any existing actionsheet
|
|
jSuites.animation.slideBottom(actionContent, false, function() {
|
|
actionsheet.style.display = 'none';
|
|
});
|
|
}
|
|
}
|
|
|
|
obj.get = function() {
|
|
return actionsheet;
|
|
}
|
|
|
|
// Init action sheet
|
|
var actionsheet = document.createElement('div');
|
|
actionsheet.className = 'jactionsheet';
|
|
actionsheet.style.display = 'none';
|
|
|
|
var actionContent = document.createElement('div');
|
|
actionContent.className = 'jactionsheet-content';
|
|
actionsheet.appendChild(actionContent);
|
|
|
|
// Append actionsheet container to the application
|
|
el.appendChild(actionsheet);
|
|
|
|
el.actionsheet = obj;
|
|
|
|
return obj;
|
|
});
|
|
|
|
jSuites.dialog = (function() {
|
|
var obj = {};
|
|
obj.options = {};
|
|
|
|
var dialog = null;
|
|
var dialogTitle = null;
|
|
var dialogHeader = null;
|
|
var dialogMessage = null;
|
|
var dialogFooter = null;
|
|
var dialogContainer = null;
|
|
var dialogConfirm = null;
|
|
var dialogConfirmButton = null;
|
|
var dialogCancel = null;
|
|
var dialogCancelButton = null;
|
|
|
|
obj.open = function(options) {
|
|
if (! jSuites.dialog.hasEvents) {
|
|
obj.init();
|
|
|
|
jSuites.dialog.hasEvents = true;
|
|
}
|
|
obj.options = options;
|
|
|
|
if (obj.options.title) {
|
|
dialogTitle.innerHTML = obj.options.title;
|
|
}
|
|
|
|
if (obj.options.message) {
|
|
dialogMessage.innerHTML = obj.options.message;
|
|
}
|
|
|
|
if (! obj.options.confirmLabel) {
|
|
obj.options.confirmLabel = 'OK';
|
|
}
|
|
dialogConfirmButton.value = obj.options.confirmLabel;
|
|
|
|
if (! obj.options.cancelLabel) {
|
|
obj.options.cancelLabel = 'Cancel';
|
|
}
|
|
dialogCancelButton.value = obj.options.cancelLabel;
|
|
|
|
if (obj.options.type == 'confirm') {
|
|
dialogCancelButton.parentNode.style.display = '';
|
|
} else {
|
|
dialogCancelButton.parentNode.style.display = 'none';
|
|
}
|
|
|
|
// Append element to the app
|
|
dialog.style.opacity = 100;
|
|
|
|
// Append to the page
|
|
if (jSuites.el) {
|
|
jSuites.el.appendChild(dialog);
|
|
} else {
|
|
document.body.appendChild(dialog);
|
|
}
|
|
|
|
// Focus
|
|
dialog.focus();
|
|
|
|
// Show
|
|
setTimeout(function() {
|
|
dialogContainer.style.opacity = 100;
|
|
}, 0);
|
|
}
|
|
|
|
obj.close = function() {
|
|
dialog.style.opacity = 0;
|
|
dialogContainer.style.opacity = 0;
|
|
setTimeout(function() {
|
|
dialog.remove();
|
|
}, 100);
|
|
}
|
|
|
|
obj.init = function() {
|
|
dialog = document.createElement('div');
|
|
dialog.setAttribute('tabindex', '901');
|
|
dialog.className = 'jdialog';
|
|
dialog.id = 'dialog';
|
|
|
|
dialogHeader = document.createElement('div');
|
|
dialogHeader.className = 'jdialog-header';
|
|
|
|
dialogTitle = document.createElement('div');
|
|
dialogTitle.className = 'jdialog-title';
|
|
dialogHeader.appendChild(dialogTitle);
|
|
|
|
dialogMessage = document.createElement('div');
|
|
dialogMessage.className = 'jdialog-message';
|
|
dialogHeader.appendChild(dialogMessage);
|
|
|
|
dialogFooter = document.createElement('div');
|
|
dialogFooter.className = 'jdialog-footer';
|
|
|
|
dialogContainer = document.createElement('div');
|
|
dialogContainer.className = 'jdialog-container';
|
|
dialogContainer.appendChild(dialogHeader);
|
|
dialogContainer.appendChild(dialogFooter);
|
|
|
|
// Confirm
|
|
dialogConfirm = document.createElement('div');
|
|
dialogConfirmButton = document.createElement('input');
|
|
dialogConfirmButton.value = obj.options.confirmLabel;
|
|
dialogConfirmButton.type = 'button';
|
|
dialogConfirmButton.onclick = function() {
|
|
if (typeof(obj.options.onconfirm) == 'function') {
|
|
obj.options.onconfirm();
|
|
}
|
|
obj.close();
|
|
};
|
|
dialogConfirm.appendChild(dialogConfirmButton);
|
|
dialogFooter.appendChild(dialogConfirm);
|
|
|
|
// Cancel
|
|
dialogCancel = document.createElement('div');
|
|
dialogCancelButton = document.createElement('input');
|
|
dialogCancelButton.value = obj.options.cancelLabel;
|
|
dialogCancelButton.type = 'button';
|
|
dialogCancelButton.onclick = function() {
|
|
if (typeof(obj.options.oncancel) == 'function') {
|
|
obj.options.oncancel();
|
|
}
|
|
obj.close();
|
|
}
|
|
dialogCancel.appendChild(dialogCancelButton);
|
|
dialogFooter.appendChild(dialogCancel);
|
|
|
|
// Dialog
|
|
dialog.appendChild(dialogContainer);
|
|
|
|
document.addEventListener('keydown', function(e) {
|
|
if (e.which == 13) {
|
|
if (typeof(obj.options.onconfirm) == 'function') {
|
|
jSuites.dialog.options.onconfirm();
|
|
}
|
|
obj.close();
|
|
} else if (e.which == 27) {
|
|
obj.close();
|
|
}
|
|
});
|
|
}
|
|
|
|
return obj;
|
|
})();
|
|
|
|
jSuites.confirm = (function(message, onconfirm) {
|
|
if (jSuites.getWindowWidth() < 800) {
|
|
jSuites.dialog.open({
|
|
type: 'confirm',
|
|
message: message,
|
|
title: 'Confirmation',
|
|
onconfirm: onconfirm,
|
|
});
|
|
} else {
|
|
if (confirm(message)) {
|
|
onconfirm();
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
jSuites.refresh = (function(el, options) {
|
|
// Controls
|
|
var touchPosition = null;
|
|
var pushToRefresh = null;
|
|
|
|
// Page touch move
|
|
var pageTouchMove = function(e, page) {
|
|
if (typeof(page.options.onpush) == 'function') {
|
|
if (page.scrollTop < 5) {
|
|
if (! touchPosition) {
|
|
touchPosition = {};
|
|
touchPosition.x = e.touches[0].clientX;
|
|
touchPosition.y = e.touches[0].clientY;
|
|
}
|
|
|
|
var height = e.touches[0].clientY - touchPosition.y;
|
|
if (height > 70) {
|
|
if (! pushToRefresh.classList.contains('ready')) {
|
|
pushToRefresh.classList.add('ready');
|
|
}
|
|
} else {
|
|
if (pushToRefresh.classList.contains('ready')) {
|
|
pushToRefresh.classList.remove('ready');
|
|
}
|
|
pushToRefresh.style.height = height + 'px';
|
|
|
|
if (height > 20) {
|
|
if (! pushToRefresh.classList.contains('holding')) {
|
|
pushToRefresh.classList.add('holding');
|
|
page.insertBefore(pushToRefresh, page.firstChild);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Page touch end
|
|
var pageTouchEnd = function(e, page) {
|
|
if (typeof(page.options.onpush) == 'function') {
|
|
// Remove holding
|
|
pushToRefresh.classList.remove('holding');
|
|
// Refresh or not refresh
|
|
if (! pushToRefresh.classList.contains('ready')) {
|
|
// Reset and not refresh
|
|
pushToRefresh.style.height = '';
|
|
obj.hide();
|
|
} else {
|
|
pushToRefresh.classList.remove('ready');
|
|
// Loading indication
|
|
setTimeout(function() {
|
|
obj.hide();
|
|
}, 1000);
|
|
|
|
// Refresh
|
|
if (typeof(page.options.onpush) == 'function') {
|
|
page.options.onpush(page);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var obj = function(element, callback) {
|
|
if (! pushToRefresh) {
|
|
pushToRefresh = document.createElement('div');
|
|
pushToRefresh.className = 'jrefresh';
|
|
}
|
|
|
|
element.addEventListener('touchmove', function(e) {
|
|
pageTouchMove(e, element);
|
|
});
|
|
element.addEventListener('touchend', function(e) {
|
|
pageTouchEnd(e, element);
|
|
});
|
|
if (! element.options) {
|
|
element.options = {};
|
|
}
|
|
if (typeof(callback) == 'function') {
|
|
element.options.onpush = callback;
|
|
}
|
|
}
|
|
|
|
obj.hide = function() {
|
|
if (pushToRefresh.parentNode) {
|
|
pushToRefresh.parentNode.removeChild(pushToRefresh);
|
|
}
|
|
touchPosition = null;
|
|
}
|
|
|
|
return obj;
|
|
})();
|
|
|
|
|
|
|
|
return jSuites;
|
|
|
|
}))); |