若依 2.0
This commit is contained in:
BIN
src/main/resources/static/js/.DS_Store
vendored
Normal file
BIN
src/main/resources/static/js/.DS_Store
vendored
Normal file
Binary file not shown.
7
src/main/resources/static/js/bootstrap.min.js
vendored
Normal file
7
src/main/resources/static/js/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
12
src/main/resources/static/js/jquery-ui-1.10.4.min.js
vendored
Normal file
12
src/main/resources/static/js/jquery-ui-1.10.4.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4
src/main/resources/static/js/jquery.min.js
vendored
Normal file
4
src/main/resources/static/js/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
src/main/resources/static/js/plugins/.DS_Store
vendored
Normal file
BIN
src/main/resources/static/js/plugins/.DS_Store
vendored
Normal file
Binary file not shown.
4463
src/main/resources/static/js/plugins/fileinput/fileinput.js
Normal file
4463
src/main/resources/static/js/plugins/fileinput/fileinput.js
Normal file
File diff suppressed because it is too large
Load Diff
12
src/main/resources/static/js/plugins/fileinput/fileinput.min.js
vendored
Normal file
12
src/main/resources/static/js/plugins/fileinput/fileinput.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
100
src/main/resources/static/js/plugins/fileinput/locales/zh.js
Normal file
100
src/main/resources/static/js/plugins/fileinput/locales/zh.js
Normal file
@ -0,0 +1,100 @@
|
||||
/*!
|
||||
* FileInput Chinese Translations
|
||||
*
|
||||
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||
* any HTML markup tags in the messages must not be converted or translated.
|
||||
*
|
||||
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||
* @author kangqf <kangqingfei@gmail.com>
|
||||
*
|
||||
* NOTE: this file must be saved in UTF-8 encoding.
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.fileinputLocales['zh'] = {
|
||||
fileSingle: '文件',
|
||||
filePlural: '个文件',
|
||||
browseLabel: '选择 …',
|
||||
removeLabel: '移除',
|
||||
removeTitle: '清除选中文件',
|
||||
cancelLabel: '取消',
|
||||
cancelTitle: '取消进行中的上传',
|
||||
uploadLabel: '上传',
|
||||
uploadTitle: '上传选中文件',
|
||||
msgNo: '没有',
|
||||
msgNoFilesSelected: '未选择文件',
|
||||
msgCancelled: '取消',
|
||||
msgPlaceholder: '选择 {files}...',
|
||||
msgZoomModalHeading: '详细预览',
|
||||
msgFileRequired: '必须选择一个文件上传.',
|
||||
msgSizeTooSmall: '文件 "{name}" (<b>{size} KB</b>) 必须大于限定大小 <b>{minSize} KB</b>.',
|
||||
msgSizeTooLarge: '文件 "{name}" (<b>{size} KB</b>) 超过了允许大小 <b>{maxSize} KB</b>.',
|
||||
msgFilesTooLess: '你必须选择最少 <b>{n}</b> {files} 来上传. ',
|
||||
msgFilesTooMany: '选择的上传文件个数 <b>({n})</b> 超出最大文件的限制个数 <b>{m}</b>.',
|
||||
msgFileNotFound: '文件 "{name}" 未找到!',
|
||||
msgFileSecured: '安全限制,为了防止读取文件 "{name}".',
|
||||
msgFileNotReadable: '文件 "{name}" 不可读.',
|
||||
msgFilePreviewAborted: '取消 "{name}" 的预览.',
|
||||
msgFilePreviewError: '读取 "{name}" 时出现了一个错误.',
|
||||
msgInvalidFileName: '文件名 "{name}" 包含非法字符.',
|
||||
msgInvalidFileType: '不正确的类型 "{name}". 只支持 "{types}" 类型的文件.',
|
||||
msgInvalidFileExtension: '不正确的文件扩展名 "{name}". 只支持 "{extensions}" 的文件扩展名.',
|
||||
msgFileTypes: {
|
||||
'image': 'image',
|
||||
'html': 'HTML',
|
||||
'text': 'text',
|
||||
'video': 'video',
|
||||
'audio': 'audio',
|
||||
'flash': 'flash',
|
||||
'pdf': 'PDF',
|
||||
'object': 'object'
|
||||
},
|
||||
msgUploadAborted: '该文件上传被中止',
|
||||
msgUploadThreshold: '处理中...',
|
||||
msgUploadBegin: '正在初始化...',
|
||||
msgUploadEnd: '完成',
|
||||
msgUploadEmpty: '无效的文件上传.',
|
||||
msgUploadError: '上传出错',
|
||||
msgValidationError: '验证错误',
|
||||
msgLoading: '加载第 {index} 文件 共 {files} …',
|
||||
msgProgress: '加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.',
|
||||
msgSelected: '{n} {files} 选中',
|
||||
msgFoldersNotAllowed: '只支持拖拽文件! 跳过 {n} 拖拽的文件夹.',
|
||||
msgImageWidthSmall: '图像文件的"{name}"的宽度必须是至少{size}像素.',
|
||||
msgImageHeightSmall: '图像文件的"{name}"的高度必须至少为{size}像素.',
|
||||
msgImageWidthLarge: '图像文件"{name}"的宽度不能超过{size}像素.',
|
||||
msgImageHeightLarge: '图像文件"{name}"的高度不能超过{size}像素.',
|
||||
msgImageResizeError: '无法获取的图像尺寸调整。',
|
||||
msgImageResizeException: '调整图像大小时发生错误。<pre>{errors}</pre>',
|
||||
msgAjaxError: '{operation} 发生错误. 请重试!',
|
||||
msgAjaxProgressError: '{operation} 失败',
|
||||
ajaxOperations: {
|
||||
deleteThumb: '删除文件',
|
||||
uploadThumb: '上传文件',
|
||||
uploadBatch: '批量上传',
|
||||
uploadExtra: '表单数据上传'
|
||||
},
|
||||
dropZoneTitle: '拖拽文件到这里 …<br>支持多文件同时上传',
|
||||
dropZoneClickTitle: '<br>(或点击{files}按钮选择文件)',
|
||||
fileActionSettings: {
|
||||
removeTitle: '删除文件',
|
||||
uploadTitle: '上传文件',
|
||||
uploadRetryTitle: '重试',
|
||||
zoomTitle: '查看详情',
|
||||
dragTitle: '移动 / 重置',
|
||||
indicatorNewTitle: '没有上传',
|
||||
indicatorSuccessTitle: '上传',
|
||||
indicatorErrorTitle: '上传错误',
|
||||
indicatorLoadingTitle: '上传 ...'
|
||||
},
|
||||
previewZoomButtonTitles: {
|
||||
prev: '预览上一个文件',
|
||||
next: '预览下一个文件',
|
||||
toggleheader: '缩放',
|
||||
fullscreen: '全屏',
|
||||
borderless: '无边界模式',
|
||||
close: '关闭当前预览'
|
||||
}
|
||||
};
|
||||
})(window.jQuery);
|
2471
src/main/resources/static/js/plugins/fileinput/plugins/piexif.js
Normal file
2471
src/main/resources/static/js/plugins/fileinput/plugins/piexif.js
Normal file
File diff suppressed because it is too large
Load Diff
1
src/main/resources/static/js/plugins/fileinput/plugins/piexif.min.js
vendored
Normal file
1
src/main/resources/static/js/plugins/fileinput/plugins/piexif.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
812
src/main/resources/static/js/plugins/fileinput/plugins/purify.js
Normal file
812
src/main/resources/static/js/plugins/fileinput/plugins/purify.js
Normal file
@ -0,0 +1,812 @@
|
||||
;(function(factory) {
|
||||
'use strict';
|
||||
/* global window: false, define: false, module: false */
|
||||
var root = typeof window === 'undefined' ? null : window;
|
||||
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(function(){ return factory(root); });
|
||||
} else if (typeof module !== 'undefined') {
|
||||
module.exports = factory(root);
|
||||
} else {
|
||||
root.DOMPurify = factory(root);
|
||||
}
|
||||
}(function factory(window) {
|
||||
'use strict';
|
||||
|
||||
var DOMPurify = function(window) {
|
||||
return factory(window);
|
||||
};
|
||||
|
||||
/**
|
||||
* Version label, exposed for easier checks
|
||||
* if DOMPurify is up to date or not
|
||||
*/
|
||||
DOMPurify.version = '0.7.4';
|
||||
|
||||
if (!window || !window.document || window.document.nodeType !== 9) {
|
||||
// not running in a browser, provide a factory function
|
||||
// so that you can pass your own Window
|
||||
DOMPurify.isSupported = false;
|
||||
return DOMPurify;
|
||||
}
|
||||
|
||||
var document = window.document;
|
||||
var originalDocument = document;
|
||||
var DocumentFragment = window.DocumentFragment;
|
||||
var HTMLTemplateElement = window.HTMLTemplateElement;
|
||||
var NodeFilter = window.NodeFilter;
|
||||
var NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap;
|
||||
var Text = window.Text;
|
||||
var Comment = window.Comment;
|
||||
var DOMParser = window.DOMParser;
|
||||
|
||||
// As per issue #47, the web-components registry is inherited by a
|
||||
// new document created via createHTMLDocument. As per the spec
|
||||
// (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
|
||||
// a new empty registry is used when creating a template contents owner
|
||||
// document, so we use that as our parent document to ensure nothing
|
||||
// is inherited.
|
||||
if (typeof HTMLTemplateElement === 'function') {
|
||||
var template = document.createElement('template');
|
||||
if (template.content && template.content.ownerDocument) {
|
||||
document = template.content.ownerDocument;
|
||||
}
|
||||
}
|
||||
var implementation = document.implementation;
|
||||
var createNodeIterator = document.createNodeIterator;
|
||||
var getElementsByTagName = document.getElementsByTagName;
|
||||
var createDocumentFragment = document.createDocumentFragment;
|
||||
var importNode = originalDocument.importNode;
|
||||
|
||||
var hooks = {};
|
||||
|
||||
/**
|
||||
* Expose whether this browser supports running the full DOMPurify.
|
||||
*/
|
||||
DOMPurify.isSupported =
|
||||
typeof implementation.createHTMLDocument !== 'undefined' &&
|
||||
document.documentMode !== 9;
|
||||
|
||||
/* Add properties to a lookup table */
|
||||
var _addToSet = function(set, array) {
|
||||
var l = array.length;
|
||||
while (l--) {
|
||||
if (typeof array[l] === 'string') {
|
||||
array[l] = array[l].toLowerCase();
|
||||
}
|
||||
set[array[l]] = true;
|
||||
}
|
||||
return set;
|
||||
};
|
||||
|
||||
/* Shallow clone an object */
|
||||
var _cloneObj = function(object) {
|
||||
var newObject = {};
|
||||
var property;
|
||||
for (property in object) {
|
||||
if (object.hasOwnProperty(property)) {
|
||||
newObject[property] = object[property];
|
||||
}
|
||||
}
|
||||
return newObject;
|
||||
};
|
||||
|
||||
/**
|
||||
* We consider the elements and attributes below to be safe. Ideally
|
||||
* don't add any new ones but feel free to remove unwanted ones.
|
||||
*/
|
||||
|
||||
/* allowed element names */
|
||||
var ALLOWED_TAGS = null;
|
||||
var DEFAULT_ALLOWED_TAGS = _addToSet({}, [
|
||||
|
||||
// HTML
|
||||
'a','abbr','acronym','address','area','article','aside','audio','b',
|
||||
'bdi','bdo','big','blink','blockquote','body','br','button','canvas',
|
||||
'caption','center','cite','code','col','colgroup','content','data',
|
||||
'datalist','dd','decorator','del','details','dfn','dir','div','dl','dt',
|
||||
'element','em','fieldset','figcaption','figure','font','footer','form',
|
||||
'h1','h2','h3','h4','h5','h6','head','header','hgroup','hr','html','i',
|
||||
'img','input','ins','kbd','label','legend','li','main','map','mark',
|
||||
'marquee','menu','menuitem','meter','nav','nobr','ol','optgroup',
|
||||
'option','output','p','pre','progress','q','rp','rt','ruby','s','samp',
|
||||
'section','select','shadow','small','source','spacer','span','strike',
|
||||
'strong','style','sub','summary','sup','table','tbody','td','template',
|
||||
'textarea','tfoot','th','thead','time','tr','track','tt','u','ul','var',
|
||||
'video','wbr',
|
||||
|
||||
// SVG
|
||||
'svg','altglyph','altglyphdef','altglyphitem','animatecolor',
|
||||
'animatemotion','animatetransform','circle','clippath','defs','desc',
|
||||
'ellipse','filter','font','g','glyph','glyphref','hkern','image','line',
|
||||
'lineargradient','marker','mask','metadata','mpath','path','pattern',
|
||||
'polygon','polyline','radialgradient','rect','stop','switch','symbol',
|
||||
'text','textpath','title','tref','tspan','view','vkern',
|
||||
|
||||
// SVG Filters
|
||||
'feBlend','feColorMatrix','feComponentTransfer','feComposite',
|
||||
'feConvolveMatrix','feDiffuseLighting','feDisplacementMap',
|
||||
'feFlood','feFuncA','feFuncB','feFuncG','feFuncR','feGaussianBlur',
|
||||
'feMerge','feMergeNode','feMorphology','feOffset',
|
||||
'feSpecularLighting','feTile','feTurbulence',
|
||||
|
||||
//MathML
|
||||
'math','menclose','merror','mfenced','mfrac','mglyph','mi','mlabeledtr',
|
||||
'mmuliscripts','mn','mo','mover','mpadded','mphantom','mroot','mrow',
|
||||
'ms','mpspace','msqrt','mystyle','msub','msup','msubsup','mtable','mtd',
|
||||
'mtext','mtr','munder','munderover',
|
||||
|
||||
//Text
|
||||
'#text'
|
||||
]);
|
||||
|
||||
/* Allowed attribute names */
|
||||
var ALLOWED_ATTR = null;
|
||||
var DEFAULT_ALLOWED_ATTR = _addToSet({}, [
|
||||
|
||||
// HTML
|
||||
'accept','action','align','alt','autocomplete','background','bgcolor',
|
||||
'border','cellpadding','cellspacing','checked','cite','class','clear','color',
|
||||
'cols','colspan','coords','datetime','default','dir','disabled',
|
||||
'download','enctype','face','for','headers','height','hidden','high','href',
|
||||
'hreflang','id','ismap','label','lang','list','loop', 'low','max',
|
||||
'maxlength','media','method','min','multiple','name','noshade','novalidate',
|
||||
'nowrap','open','optimum','pattern','placeholder','poster','preload','pubdate',
|
||||
'radiogroup','readonly','rel','required','rev','reversed','rows',
|
||||
'rowspan','spellcheck','scope','selected','shape','size','span',
|
||||
'srclang','start','src','step','style','summary','tabindex','title',
|
||||
'type','usemap','valign','value','width','xmlns',
|
||||
|
||||
// SVG
|
||||
'accent-height','accumulate','additivive','alignment-baseline',
|
||||
'ascent','attributename','attributetype','azimuth','basefrequency',
|
||||
'baseline-shift','begin','bias','by','clip','clip-path','clip-rule',
|
||||
'color','color-interpolation','color-interpolation-filters','color-profile',
|
||||
'color-rendering','cx','cy','d','dx','dy','diffuseconstant','direction',
|
||||
'display','divisor','dur','edgemode','elevation','end','fill','fill-opacity',
|
||||
'fill-rule','filter','flood-color','flood-opacity','font-family','font-size',
|
||||
'font-size-adjust','font-stretch','font-style','font-variant','font-weight',
|
||||
'fx', 'fy','g1','g2','glyph-name','glyphref','gradientunits','gradienttransform',
|
||||
'image-rendering','in','in2','k','k1','k2','k3','k4','kerning','keypoints',
|
||||
'keysplines','keytimes','lengthadjust','letter-spacing','kernelmatrix',
|
||||
'kernelunitlength','lighting-color','local','marker-end','marker-mid',
|
||||
'marker-start','markerheight','markerunits','markerwidth','maskcontentunits',
|
||||
'maskunits','max','mask','mode','min','numoctaves','offset','operator',
|
||||
'opacity','order','orient','orientation','origin','overflow','paint-order',
|
||||
'path','pathlength','patterncontentunits','patterntransform','patternunits',
|
||||
'points','preservealpha','r','rx','ry','radius','refx','refy','repeatcount',
|
||||
'repeatdur','restart','result','rotate','scale','seed','shape-rendering',
|
||||
'specularconstant','specularexponent','spreadmethod','stddeviation','stitchtiles',
|
||||
'stop-color','stop-opacity','stroke-dasharray','stroke-dashoffset','stroke-linecap',
|
||||
'stroke-linejoin','stroke-miterlimit','stroke-opacity','stroke','stroke-width',
|
||||
'surfacescale','targetx','targety','transform','text-anchor','text-decoration',
|
||||
'text-rendering','textlength','u1','u2','unicode','values','viewbox',
|
||||
'visibility','vert-adv-y','vert-origin-x','vert-origin-y','word-spacing',
|
||||
'wrap','writing-mode','xchannelselector','ychannelselector','x','x1','x2',
|
||||
'y','y1','y2','z','zoomandpan',
|
||||
|
||||
// MathML
|
||||
'accent','accentunder','bevelled','close','columnsalign','columnlines',
|
||||
'columnspan','denomalign','depth','display','displaystyle','fence',
|
||||
'frame','largeop','length','linethickness','lspace','lquote',
|
||||
'mathbackground','mathcolor','mathsize','mathvariant','maxsize',
|
||||
'minsize','movablelimits','notation','numalign','open','rowalign',
|
||||
'rowlines','rowspacing','rowspan','rspace','rquote','scriptlevel',
|
||||
'scriptminsize','scriptsizemultiplier','selection','separator',
|
||||
'separators','stretchy','subscriptshift','supscriptshift','symmetric',
|
||||
'voffset',
|
||||
|
||||
// XML
|
||||
'xlink:href','xml:id','xlink:title','xml:space','xmlns:xlink'
|
||||
]);
|
||||
|
||||
/* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */
|
||||
var FORBID_TAGS = null;
|
||||
|
||||
/* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */
|
||||
var FORBID_ATTR = null;
|
||||
|
||||
/* Decide if custom data attributes are okay */
|
||||
var ALLOW_DATA_ATTR = true;
|
||||
|
||||
/* Decide if unknown protocols are okay */
|
||||
var ALLOW_UNKNOWN_PROTOCOLS = false;
|
||||
|
||||
/* Output should be safe for jQuery's $() factory? */
|
||||
var SAFE_FOR_JQUERY = false;
|
||||
|
||||
/* Output should be safe for common template engines.
|
||||
* This means, DOMPurify removes data attributes, mustaches and ERB
|
||||
*/
|
||||
var SAFE_FOR_TEMPLATES = false;
|
||||
|
||||
/* Specify template detection regex for SAFE_FOR_TEMPLATES mode */
|
||||
var MUSTACHE_EXPR = /\{\{[\s\S]*|[\s\S]*\}\}/gm;
|
||||
var ERB_EXPR = /<%[\s\S]*|[\s\S]*%>/gm;
|
||||
|
||||
/* Decide if document with <html>... should be returned */
|
||||
var WHOLE_DOCUMENT = false;
|
||||
|
||||
/* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html string.
|
||||
* If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead
|
||||
*/
|
||||
var RETURN_DOM = false;
|
||||
|
||||
/* Decide if a DOM `DocumentFragment` should be returned, instead of a html string */
|
||||
var RETURN_DOM_FRAGMENT = false;
|
||||
|
||||
/* If `RETURN_DOM` or `RETURN_DOM_FRAGMENT` is enabled, decide if the returned DOM
|
||||
* `Node` is imported into the current `Document`. If this flag is not enabled the
|
||||
* `Node` will belong (its ownerDocument) to a fresh `HTMLDocument`, created by
|
||||
* DOMPurify. */
|
||||
var RETURN_DOM_IMPORT = false;
|
||||
|
||||
/* Output should be free from DOM clobbering attacks? */
|
||||
var SANITIZE_DOM = true;
|
||||
|
||||
/* Keep element content when removing element? */
|
||||
var KEEP_CONTENT = true;
|
||||
|
||||
/* Tags to ignore content of when KEEP_CONTENT is true */
|
||||
var FORBID_CONTENTS = _addToSet({}, [
|
||||
'audio', 'head', 'math', 'script', 'style', 'svg', 'video'
|
||||
]);
|
||||
|
||||
/* Tags that are safe for data: URIs */
|
||||
var DATA_URI_TAGS = _addToSet({}, [
|
||||
'audio', 'video', 'img', 'source'
|
||||
]);
|
||||
|
||||
/* Attributes safe for values like "javascript:" */
|
||||
var URI_SAFE_ATTRIBUTES = _addToSet({}, [
|
||||
'alt','class','for','id','label','name','pattern','placeholder',
|
||||
'summary','title','value','style','xmlns'
|
||||
]);
|
||||
|
||||
/* Keep a reference to config to pass to hooks */
|
||||
var CONFIG = null;
|
||||
|
||||
/* Ideally, do not touch anything below this line */
|
||||
/* ______________________________________________ */
|
||||
|
||||
var formElement = document.createElement('form');
|
||||
|
||||
/**
|
||||
* _parseConfig
|
||||
*
|
||||
* @param optional config literal
|
||||
*/
|
||||
var _parseConfig = function(cfg) {
|
||||
/* Shield configuration object from tampering */
|
||||
if (typeof cfg !== 'object') {
|
||||
cfg = {};
|
||||
}
|
||||
|
||||
/* Set configuration parameters */
|
||||
ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ?
|
||||
_addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS;
|
||||
ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ?
|
||||
_addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR;
|
||||
FORBID_TAGS = 'FORBID_TAGS' in cfg ?
|
||||
_addToSet({}, cfg.FORBID_TAGS) : {};
|
||||
FORBID_ATTR = 'FORBID_ATTR' in cfg ?
|
||||
_addToSet({}, cfg.FORBID_ATTR) : {};
|
||||
ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true
|
||||
ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false
|
||||
SAFE_FOR_JQUERY = cfg.SAFE_FOR_JQUERY || false; // Default false
|
||||
SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false
|
||||
WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false
|
||||
RETURN_DOM = cfg.RETURN_DOM || false; // Default false
|
||||
RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false
|
||||
RETURN_DOM_IMPORT = cfg.RETURN_DOM_IMPORT || false; // Default false
|
||||
SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true
|
||||
KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true
|
||||
|
||||
if (SAFE_FOR_TEMPLATES) {
|
||||
ALLOW_DATA_ATTR = false;
|
||||
}
|
||||
|
||||
if (RETURN_DOM_FRAGMENT) {
|
||||
RETURN_DOM = true;
|
||||
}
|
||||
|
||||
/* Merge configuration parameters */
|
||||
if (cfg.ADD_TAGS) {
|
||||
if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
|
||||
ALLOWED_TAGS = _cloneObj(ALLOWED_TAGS);
|
||||
}
|
||||
_addToSet(ALLOWED_TAGS, cfg.ADD_TAGS);
|
||||
}
|
||||
if (cfg.ADD_ATTR) {
|
||||
if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
|
||||
ALLOWED_ATTR = _cloneObj(ALLOWED_ATTR);
|
||||
}
|
||||
_addToSet(ALLOWED_ATTR, cfg.ADD_ATTR);
|
||||
}
|
||||
|
||||
/* Add #text in case KEEP_CONTENT is set to true */
|
||||
if (KEEP_CONTENT) { ALLOWED_TAGS['#text'] = true; }
|
||||
|
||||
// Prevent further manipulation of configuration.
|
||||
// Not available in IE8, Safari 5, etc.
|
||||
if (Object && 'freeze' in Object) { Object.freeze(cfg); }
|
||||
|
||||
CONFIG = cfg;
|
||||
};
|
||||
|
||||
/**
|
||||
* _forceRemove
|
||||
*
|
||||
* @param a DOM node
|
||||
*/
|
||||
var _forceRemove = function(node) {
|
||||
try {
|
||||
node.parentNode.removeChild(node);
|
||||
} catch (e) {
|
||||
node.outerHTML = '';
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* _initDocument
|
||||
*
|
||||
* @param a string of dirty markup
|
||||
* @return a DOM, filled with the dirty markup
|
||||
*/
|
||||
var _initDocument = function(dirty) {
|
||||
/* Create a HTML document using DOMParser */
|
||||
var doc, body;
|
||||
try {
|
||||
doc = new DOMParser().parseFromString(dirty, 'text/html');
|
||||
} catch (e) {}
|
||||
|
||||
/* Some browsers throw, some browsers return null for the code above
|
||||
DOMParser with text/html support is only in very recent browsers. */
|
||||
if (!doc) {
|
||||
doc = implementation.createHTMLDocument('');
|
||||
body = doc.body;
|
||||
body.parentNode.removeChild(body.parentNode.firstElementChild);
|
||||
body.outerHTML = dirty;
|
||||
}
|
||||
|
||||
/* Work on whole document or just its body */
|
||||
if (typeof doc.getElementsByTagName === 'function') {
|
||||
return doc.getElementsByTagName(
|
||||
WHOLE_DOCUMENT ? 'html' : 'body')[0];
|
||||
}
|
||||
return getElementsByTagName.call(doc,
|
||||
WHOLE_DOCUMENT ? 'html' : 'body')[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* _createIterator
|
||||
*
|
||||
* @param document/fragment to create iterator for
|
||||
* @return iterator instance
|
||||
*/
|
||||
var _createIterator = function(root) {
|
||||
return createNodeIterator.call(root.ownerDocument || root,
|
||||
root,
|
||||
NodeFilter.SHOW_ELEMENT
|
||||
| NodeFilter.SHOW_COMMENT
|
||||
| NodeFilter.SHOW_TEXT,
|
||||
function() { return NodeFilter.FILTER_ACCEPT; },
|
||||
false
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* _isClobbered
|
||||
*
|
||||
* @param element to check for clobbering attacks
|
||||
* @return true if clobbered, false if safe
|
||||
*/
|
||||
var _isClobbered = function(elm) {
|
||||
if (elm instanceof Text || elm instanceof Comment) {
|
||||
return false;
|
||||
}
|
||||
if ( typeof elm.nodeName !== 'string'
|
||||
|| typeof elm.textContent !== 'string'
|
||||
|| typeof elm.removeChild !== 'function'
|
||||
|| !(elm.attributes instanceof NamedNodeMap)
|
||||
|| typeof elm.removeAttribute !== 'function'
|
||||
|| typeof elm.setAttribute !== 'function'
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* _sanitizeElements
|
||||
*
|
||||
* @protect nodeName
|
||||
* @protect textContent
|
||||
* @protect removeChild
|
||||
*
|
||||
* @param node to check for permission to exist
|
||||
* @return true if node was killed, false if left alive
|
||||
*/
|
||||
var _sanitizeElements = function(currentNode) {
|
||||
var tagName, content;
|
||||
/* Execute a hook if present */
|
||||
_executeHook('beforeSanitizeElements', currentNode, null);
|
||||
|
||||
/* Check if element is clobbered or can clobber */
|
||||
if (_isClobbered(currentNode)) {
|
||||
_forceRemove(currentNode);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Now let's check the element's type and name */
|
||||
tagName = currentNode.nodeName.toLowerCase();
|
||||
|
||||
/* Execute a hook if present */
|
||||
_executeHook('uponSanitizeElement', currentNode, {
|
||||
tagName: tagName
|
||||
});
|
||||
|
||||
/* Remove element if anything forbids its presence */
|
||||
if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
|
||||
/* Keep content except for black-listed elements */
|
||||
if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]
|
||||
&& typeof currentNode.insertAdjacentHTML === 'function') {
|
||||
try {
|
||||
currentNode.insertAdjacentHTML('AfterEnd', currentNode.innerHTML);
|
||||
} catch (e) {}
|
||||
}
|
||||
_forceRemove(currentNode);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Convert markup to cover jQuery behavior */
|
||||
if (SAFE_FOR_JQUERY && !currentNode.firstElementChild &&
|
||||
(!currentNode.content || !currentNode.content.firstElementChild)) {
|
||||
currentNode.innerHTML = currentNode.textContent.replace(/</g, '<');
|
||||
}
|
||||
|
||||
/* Sanitize element content to be template-safe */
|
||||
if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
|
||||
/* Get the element's text content */
|
||||
content = currentNode.textContent;
|
||||
content = content.replace(MUSTACHE_EXPR, ' ');
|
||||
content = content.replace(ERB_EXPR, ' ');
|
||||
currentNode.textContent = content;
|
||||
}
|
||||
|
||||
/* Execute a hook if present */
|
||||
_executeHook('afterSanitizeElements', currentNode, null);
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
var DATA_ATTR = /^data-[\w.\u00B7-\uFFFF-]/;
|
||||
var IS_ALLOWED_URI = /^(?:(?:(?:f|ht)tps?|mailto|tel):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i;
|
||||
var IS_SCRIPT_OR_DATA = /^(?:\w+script|data):/i;
|
||||
/* This needs to be extensive thanks to Webkit/Blink's behavior */
|
||||
var ATTR_WHITESPACE = /[\x00-\x20\xA0\u1680\u180E\u2000-\u2029\u205f\u3000]/g;
|
||||
|
||||
/**
|
||||
* _sanitizeAttributes
|
||||
*
|
||||
* @protect attributes
|
||||
* @protect nodeName
|
||||
* @protect removeAttribute
|
||||
* @protect setAttribute
|
||||
*
|
||||
* @param node to sanitize
|
||||
* @return void
|
||||
*/
|
||||
var _sanitizeAttributes = function(currentNode) {
|
||||
var attr, name, value, lcName, idAttr, attributes, hookEvent, l;
|
||||
/* Execute a hook if present */
|
||||
_executeHook('beforeSanitizeAttributes', currentNode, null);
|
||||
|
||||
attributes = currentNode.attributes;
|
||||
|
||||
/* Check if we have attributes; if not we might have a text node */
|
||||
if (!attributes) { return; }
|
||||
|
||||
hookEvent = {
|
||||
attrName: '',
|
||||
attrValue: '',
|
||||
keepAttr: true
|
||||
};
|
||||
l = attributes.length;
|
||||
|
||||
/* Go backwards over all attributes; safely remove bad ones */
|
||||
while (l--) {
|
||||
attr = attributes[l];
|
||||
name = attr.name;
|
||||
value = attr.value;
|
||||
lcName = name.toLowerCase();
|
||||
|
||||
/* Execute a hook if present */
|
||||
hookEvent.attrName = lcName;
|
||||
hookEvent.attrValue = value;
|
||||
hookEvent.keepAttr = true;
|
||||
_executeHook('uponSanitizeAttribute', currentNode, hookEvent );
|
||||
value = hookEvent.attrValue;
|
||||
|
||||
/* Remove attribute */
|
||||
// Safari (iOS + Mac), last tested v8.0.5, crashes if you try to
|
||||
// remove a "name" attribute from an <img> tag that has an "id"
|
||||
// attribute at the time.
|
||||
if (lcName === 'name' &&
|
||||
currentNode.nodeName === 'IMG' && attributes.id) {
|
||||
idAttr = attributes.id;
|
||||
attributes = Array.prototype.slice.apply(attributes);
|
||||
currentNode.removeAttribute('id');
|
||||
currentNode.removeAttribute(name);
|
||||
if (attributes.indexOf(idAttr) > l) {
|
||||
currentNode.setAttribute('id', idAttr.value);
|
||||
}
|
||||
} else {
|
||||
// This avoids a crash in Safari v9.0 with double-ids.
|
||||
// The trick is to first set the id to be empty and then to
|
||||
// remove the attriubute
|
||||
if (name === 'id') {
|
||||
currentNode.setAttribute(name, '');
|
||||
}
|
||||
currentNode.removeAttribute(name);
|
||||
}
|
||||
|
||||
/* Did the hooks approve of the attribute? */
|
||||
if (!hookEvent.keepAttr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Make sure attribute cannot clobber */
|
||||
if (SANITIZE_DOM &&
|
||||
(lcName === 'id' || lcName === 'name') &&
|
||||
(value in window || value in document || value in formElement)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Sanitize attribute content to be template-safe */
|
||||
if (SAFE_FOR_TEMPLATES) {
|
||||
value = value.replace(MUSTACHE_EXPR, ' ');
|
||||
value = value.replace(ERB_EXPR, ' ');
|
||||
}
|
||||
|
||||
if (
|
||||
/* Check the name is permitted */
|
||||
(ALLOWED_ATTR[lcName] && !FORBID_ATTR[lcName] && (
|
||||
/* Check no script, data or unknown possibly unsafe URI
|
||||
unless we know URI values are safe for that attribute */
|
||||
URI_SAFE_ATTRIBUTES[lcName] ||
|
||||
IS_ALLOWED_URI.test(value.replace(ATTR_WHITESPACE,'')) ||
|
||||
/* Keep image data URIs alive if src is allowed */
|
||||
(lcName === 'src' && value.indexOf('data:') === 0 &&
|
||||
DATA_URI_TAGS[currentNode.nodeName.toLowerCase()])
|
||||
)) ||
|
||||
/* Allow potentially valid data-* attributes:
|
||||
* At least one character after "-" (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)
|
||||
* XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)
|
||||
* We don't need to check the value; it's always URI safe.
|
||||
*/
|
||||
(ALLOW_DATA_ATTR && DATA_ATTR.test(lcName)) ||
|
||||
/* Allow unknown protocols:
|
||||
* This provides support for links that are handled by protocol handlers which may be unknown
|
||||
* ahead of time, e.g. fb:, spotify:
|
||||
*/
|
||||
(ALLOW_UNKNOWN_PROTOCOLS && !IS_SCRIPT_OR_DATA.test(value.replace(ATTR_WHITESPACE,'')))
|
||||
) {
|
||||
/* Handle invalid data-* attribute set by try-catching it */
|
||||
try {
|
||||
currentNode.setAttribute(name, value);
|
||||
} catch (e) {}
|
||||
}
|
||||
}
|
||||
|
||||
/* Execute a hook if present */
|
||||
_executeHook('afterSanitizeAttributes', currentNode, null);
|
||||
};
|
||||
|
||||
/**
|
||||
* _sanitizeShadowDOM
|
||||
*
|
||||
* @param fragment to iterate over recursively
|
||||
* @return void
|
||||
*/
|
||||
var _sanitizeShadowDOM = function(fragment) {
|
||||
var shadowNode;
|
||||
var shadowIterator = _createIterator(fragment);
|
||||
|
||||
/* Execute a hook if present */
|
||||
_executeHook('beforeSanitizeShadowDOM', fragment, null);
|
||||
|
||||
while ( (shadowNode = shadowIterator.nextNode()) ) {
|
||||
/* Execute a hook if present */
|
||||
_executeHook('uponSanitizeShadowNode', shadowNode, null);
|
||||
|
||||
/* Sanitize tags and elements */
|
||||
if (_sanitizeElements(shadowNode)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Deep shadow DOM detected */
|
||||
if (shadowNode.content instanceof DocumentFragment) {
|
||||
_sanitizeShadowDOM(shadowNode.content);
|
||||
}
|
||||
|
||||
/* Check attributes, sanitize if necessary */
|
||||
_sanitizeAttributes(shadowNode);
|
||||
}
|
||||
|
||||
/* Execute a hook if present */
|
||||
_executeHook('afterSanitizeShadowDOM', fragment, null);
|
||||
};
|
||||
|
||||
/**
|
||||
* _executeHook
|
||||
* Execute user configurable hooks
|
||||
*
|
||||
* @param {String} entryPoint Name of the hook's entry point
|
||||
* @param {Node} currentNode
|
||||
*/
|
||||
var _executeHook = function(entryPoint, currentNode, data) {
|
||||
if (!hooks[entryPoint]) { return; }
|
||||
|
||||
hooks[entryPoint].forEach(function(hook) {
|
||||
hook.call(DOMPurify, currentNode, data, CONFIG);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* sanitize
|
||||
* Public method providing core sanitation functionality
|
||||
*
|
||||
* @param {String} dirty string
|
||||
* @param {Object} configuration object
|
||||
*/
|
||||
DOMPurify.sanitize = function(dirty, cfg) {
|
||||
var body, currentNode, oldNode, nodeIterator, returnNode;
|
||||
/* Make sure we have a string to sanitize.
|
||||
DO NOT return early, as this will return the wrong type if
|
||||
the user has requested a DOM object rather than a string */
|
||||
if (!dirty) {
|
||||
dirty = '';
|
||||
}
|
||||
|
||||
/* Stringify, in case dirty is an object */
|
||||
if (typeof dirty !== 'string') {
|
||||
if (typeof dirty.toString !== 'function') {
|
||||
throw new TypeError('toString is not a function');
|
||||
} else {
|
||||
dirty = dirty.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/* Check we can run. Otherwise fall back or ignore */
|
||||
if (!DOMPurify.isSupported) {
|
||||
if (typeof window.toStaticHTML === 'object'
|
||||
|| typeof window.toStaticHTML === 'function') {
|
||||
return window.toStaticHTML(dirty);
|
||||
}
|
||||
return dirty;
|
||||
}
|
||||
|
||||
/* Assign config vars */
|
||||
_parseConfig(cfg);
|
||||
|
||||
/* Exit directly if we have nothing to do */
|
||||
if (!RETURN_DOM && !WHOLE_DOCUMENT && dirty.indexOf('<') === -1) {
|
||||
return dirty;
|
||||
}
|
||||
|
||||
/* Initialize the document to work on */
|
||||
body = _initDocument(dirty);
|
||||
|
||||
/* Check we have a DOM node from the data */
|
||||
if (!body) {
|
||||
return RETURN_DOM ? null : '';
|
||||
}
|
||||
|
||||
/* Get node iterator */
|
||||
nodeIterator = _createIterator(body);
|
||||
|
||||
/* Now start iterating over the created document */
|
||||
while ( (currentNode = nodeIterator.nextNode()) ) {
|
||||
|
||||
/* Fix IE's strange behavior with manipulated textNodes #89 */
|
||||
if (currentNode.nodeType === 3 && currentNode === oldNode) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Sanitize tags and elements */
|
||||
if (_sanitizeElements(currentNode)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Shadow DOM detected, sanitize it */
|
||||
if (currentNode.content instanceof DocumentFragment) {
|
||||
_sanitizeShadowDOM(currentNode.content);
|
||||
}
|
||||
|
||||
/* Check attributes, sanitize if necessary */
|
||||
_sanitizeAttributes(currentNode);
|
||||
|
||||
oldNode = currentNode;
|
||||
}
|
||||
|
||||
/* Return sanitized string or DOM */
|
||||
if (RETURN_DOM) {
|
||||
|
||||
if (RETURN_DOM_FRAGMENT) {
|
||||
returnNode = createDocumentFragment.call(body.ownerDocument);
|
||||
|
||||
while (body.firstChild) {
|
||||
returnNode.appendChild(body.firstChild);
|
||||
}
|
||||
} else {
|
||||
returnNode = body;
|
||||
}
|
||||
|
||||
if (RETURN_DOM_IMPORT) {
|
||||
/* adoptNode() is not used because internal state is not reset
|
||||
(e.g. the past names map of a HTMLFormElement), this is safe
|
||||
in theory but we would rather not risk another attack vector.
|
||||
The state that is cloned by importNode() is explicitly defined
|
||||
by the specs. */
|
||||
returnNode = importNode.call(originalDocument, returnNode, true);
|
||||
}
|
||||
|
||||
return returnNode;
|
||||
}
|
||||
|
||||
return WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
|
||||
};
|
||||
|
||||
/**
|
||||
* addHook
|
||||
* Public method to add DOMPurify hooks
|
||||
*
|
||||
* @param {String} entryPoint
|
||||
* @param {Function} hookFunction
|
||||
*/
|
||||
DOMPurify.addHook = function(entryPoint, hookFunction) {
|
||||
if (typeof hookFunction !== 'function') { return; }
|
||||
hooks[entryPoint] = hooks[entryPoint] || [];
|
||||
hooks[entryPoint].push(hookFunction);
|
||||
};
|
||||
|
||||
/**
|
||||
* removeHook
|
||||
* Public method to remove a DOMPurify hook at a given entryPoint
|
||||
* (pops it from the stack of hooks if more are present)
|
||||
*
|
||||
* @param {String} entryPoint
|
||||
* @return void
|
||||
*/
|
||||
DOMPurify.removeHook = function(entryPoint) {
|
||||
if (hooks[entryPoint]) {
|
||||
hooks[entryPoint].pop();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* removeHooks
|
||||
* Public method to remove all DOMPurify hooks at a given entryPoint
|
||||
*
|
||||
* @param {String} entryPoint
|
||||
* @return void
|
||||
*/
|
||||
DOMPurify.removeHooks = function(entryPoint) {
|
||||
if (hooks[entryPoint]) {
|
||||
hooks[entryPoint] = [];
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* removeAllHooks
|
||||
* Public method to remove all DOMPurify hooks
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
DOMPurify.removeAllHooks = function() {
|
||||
hooks = [];
|
||||
};
|
||||
|
||||
return DOMPurify;
|
||||
}));
|
1
src/main/resources/static/js/plugins/fileinput/plugins/purify.min.js
vendored
Normal file
1
src/main/resources/static/js/plugins/fileinput/plugins/purify.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1590
src/main/resources/static/js/plugins/fileinput/plugins/sortable.js
Normal file
1590
src/main/resources/static/js/plugins/fileinput/plugins/sortable.js
Normal file
File diff suppressed because it is too large
Load Diff
1
src/main/resources/static/js/plugins/fileinput/plugins/sortable.min.js
vendored
Normal file
1
src/main/resources/static/js/plugins/fileinput/plugins/sortable.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* metismenu - v1.1.3
|
||||
* Easy menu jQuery plugin for Twitter Bootstrap 3
|
||||
* https://github.com/onokumus/metisMenu
|
||||
*
|
||||
* Made by Osman Nuri Okumus
|
||||
* Under MIT License
|
||||
*/
|
||||
;(function($, window, document, undefined) {
|
||||
|
||||
var pluginName = "metisMenu",
|
||||
defaults = {
|
||||
toggle: true,
|
||||
doubleTapToGo: false
|
||||
};
|
||||
|
||||
function Plugin(element, options) {
|
||||
this.element = $(element);
|
||||
this.settings = $.extend({}, defaults, options);
|
||||
this._defaults = defaults;
|
||||
this._name = pluginName;
|
||||
this.init();
|
||||
}
|
||||
|
||||
Plugin.prototype = {
|
||||
init: function() {
|
||||
|
||||
var $this = this.element,
|
||||
$toggle = this.settings.toggle,
|
||||
obj = this;
|
||||
|
||||
if (this.isIE() <= 9) {
|
||||
$this.find("li.active").has("ul").children("ul").collapse("show");
|
||||
$this.find("li").not(".active").has("ul").children("ul").collapse("hide");
|
||||
} else {
|
||||
$this.find("li.active").has("ul").children("ul").addClass("collapse in");
|
||||
$this.find("li").not(".active").has("ul").children("ul").addClass("collapse");
|
||||
}
|
||||
|
||||
//add the "doubleTapToGo" class to active items if needed
|
||||
if (obj.settings.doubleTapToGo) {
|
||||
$this.find("li.active").has("ul").children("a").addClass("doubleTapToGo");
|
||||
}
|
||||
|
||||
$this.find("li").has("ul").children("a").on("click" + "." + pluginName, function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
//Do we need to enable the double tap
|
||||
if (obj.settings.doubleTapToGo) {
|
||||
|
||||
//if we hit a second time on the link and the href is valid, navigate to that url
|
||||
if (obj.doubleTapToGo($(this)) && $(this).attr("href") !== "#" && $(this).attr("href") !== "") {
|
||||
e.stopPropagation();
|
||||
document.location = $(this).attr("href");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$(this).parent("li").toggleClass("active").children("ul").collapse("toggle");
|
||||
|
||||
if ($toggle) {
|
||||
$(this).parent("li").siblings().removeClass("active").children("ul.in").collapse("hide");
|
||||
}
|
||||
|
||||
});
|
||||
},
|
||||
|
||||
isIE: function() { //https://gist.github.com/padolsey/527683
|
||||
var undef,
|
||||
v = 3,
|
||||
div = document.createElement("div"),
|
||||
all = div.getElementsByTagName("i");
|
||||
|
||||
while (
|
||||
div.innerHTML = "<!--[if gt IE " + (++v) + "]><i></i><![endif]-->",
|
||||
all[0]
|
||||
) {
|
||||
return v > 4 ? v : undef;
|
||||
}
|
||||
},
|
||||
|
||||
//Enable the link on the second click.
|
||||
doubleTapToGo: function(elem) {
|
||||
var $this = this.element;
|
||||
|
||||
//if the class "doubleTapToGo" exists, remove it and return
|
||||
if (elem.hasClass("doubleTapToGo")) {
|
||||
elem.removeClass("doubleTapToGo");
|
||||
return true;
|
||||
}
|
||||
|
||||
//does not exists, add a new class and return false
|
||||
if (elem.parent().children("ul").length) {
|
||||
//first remove all other class
|
||||
$this.find(".doubleTapToGo").removeClass("doubleTapToGo");
|
||||
//add the class on the current element
|
||||
elem.addClass("doubleTapToGo");
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
remove: function() {
|
||||
this.element.off("." + pluginName);
|
||||
this.element.removeData(pluginName);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
$.fn[pluginName] = function(options) {
|
||||
this.each(function () {
|
||||
var el = $(this);
|
||||
if (el.data(pluginName)) {
|
||||
el.data(pluginName).remove();
|
||||
}
|
||||
el.data(pluginName, new Plugin(this, options));
|
||||
});
|
||||
return this;
|
||||
};
|
||||
|
||||
})(jQuery, window, document);
|
15
src/main/resources/static/js/plugins/slimscroll/jquery.slimscroll.min.js
vendored
Normal file
15
src/main/resources/static/js/plugins/slimscroll/jquery.slimscroll.min.js
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
|
||||
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
||||
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
||||
*
|
||||
* Version: 1.3.0
|
||||
*
|
||||
*/
|
||||
(function(f){jQuery.fn.extend({slimScroll:function(h){var a=f.extend({width:"auto",height:"250px",size:"4px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:0.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},h);this.each(function(){function r(d){if(s){d=d||
|
||||
window.event;var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);f(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&m(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function m(d,f,h){k=!1;var e=d,g=b.outerHeight()-c.outerHeight();f&&(e=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),e=Math.min(Math.max(e,0),g),e=0<d?Math.ceil(e):Math.floor(e),c.css({top:e+"px"}));l=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());
|
||||
e=l*(b[0].scrollHeight-b.outerHeight());h&&(e=d,d=e/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),g),c.css({top:d+"px"}));b.scrollTop(e);b.trigger("slimscrolling",~~e);v();p()}function C(){window.addEventListener?(this.addEventListener("DOMMouseScroll",r,!1),this.addEventListener("mousewheel",r,!1),this.addEventListener("MozMousePixelScroll",r,!1)):document.attachEvent("onmousewheel",r)}function w(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),D);c.css({height:u+"px"});
|
||||
var a=u==b.outerHeight()?"none":"block";c.css({display:a})}function v(){w();clearTimeout(A);l==~~l?(k=a.allowPageScroll,B!=l&&b.trigger("slimscroll",0==~~l?"top":"bottom")):k=!1;B=l;u>=b.outerHeight()?k=!0:(c.stop(!0,!0).fadeIn("fast"),a.railVisible&&g.stop(!0,!0).fadeIn("fast"))}function p(){a.alwaysVisible||(A=setTimeout(function(){a.disableFadeOut&&s||(x||y)||(c.fadeOut("slow"),g.fadeOut("slow"))},1E3))}var s,x,y,A,z,u,l,B,D=30,k=!1,b=f(this);if(b.parent().hasClass(a.wrapperClass)){var n=b.scrollTop(),
|
||||
c=b.parent().find("."+a.barClass),g=b.parent().find("."+a.railClass);w();if(f.isPlainObject(h)){if("height"in h&&"auto"==h.height){b.parent().css("height","auto");b.css("height","auto");var q=b.parent().parent().height();b.parent().css("height",q);b.css("height",q)}if("scrollTo"in h)n=parseInt(a.scrollTo);else if("scrollBy"in h)n+=parseInt(a.scrollBy);else if("destroy"in h){c.remove();g.remove();b.unwrap();return}m(n,!1,!0)}}else{a.height="auto"==a.height?b.parent().height():a.height;n=f("<div></div>").addClass(a.wrapperClass).css({position:"relative",width:a.width,height:a.height});b.css({width:a.width,height:a.height});var g=f("<div></div>").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=f("<div></div>").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?
|
||||
"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,WebkitBorderRadius:a.borderRadius,zIndex:99}),q="right"==a.position?{right:a.distance}:{left:a.distance};g.css(q);c.css(q);b.wrap(n);b.parent().append(c);b.parent().append(g);a.railDraggable&&c.bind("mousedown",function(a){var b=f(document);y=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);m(0,c.position().top,!1)});
|
||||
b.bind("mouseup.slimscroll",function(a){y=!1;p();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll",function(a){a.stopPropagation();a.preventDefault();return!1});g.hover(function(){v()},function(){p()});c.hover(function(){x=!0},function(){x=!1});b.hover(function(){s=!0;v();p()},function(){s=!1;p()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(z=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&
|
||||
(m((z-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),z=b.originalEvent.touches[0].pageY)});w();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),m(0,!0)):"top"!==a.start&&(m(f(a.start).position().top,null,!0),a.alwaysVisible||c.hide());C()}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
|
Reference in New Issue
Block a user