/** ***** BEGIN LICENSE BLOCK ***** * |------------------------------------------------------------------------------| * | O2OA 活力办公 创意无限 o2.js | * |------------------------------------------------------------------------------| * | Distributed under the AGPL license: | * |------------------------------------------------------------------------------| * | Copyright © 2018, o2oa.net, o2server.io O2 Team | * | All rights reserved. | * |------------------------------------------------------------------------------| * * This file is part of O2OA. * * O2OA is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * O2OA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . * * ***** END LICENSE BLOCK ******/ /* load o2 Core * |------------------------------------------------------------------------------| * |addReady: o2.addReady(fn), | * |------------------------------------------------------------------------------| * |load: o2.load(urls, callback, reload) | * |loadCss: o2.loadCss(urls, dom, callback, reload, doc) | * |------------------------------------------------------------------------------| * |typeOf: o2.typeOf(o) | * |------------------------------------------------------------------------------| * |uuid: o2.uuid() | * |------------------------------------------------------------------------------| */ //Element.firstElementChild Polyfill (function(constructor) { if (constructor && constructor.prototype && constructor.prototype.firstElementChild == null) { Object.defineProperty(constructor.prototype, 'firstElementChild', { get: function() { var node, nodes = this.childNodes, i = 0; while (node = nodes[i++]) { if (node.nodeType === 1) { return node; } } return null; } }); } })(window.Node || window.Element); (function(){ var _href = window.location.href; var _debug = (_href.indexOf("debugger")!==-1); var _par = _href.substr(_href.lastIndexOf("?")+1, _href.length); var _lp = "zh-cn"; if (_par){ var _parList = _par.split("&"); for (var i=0; i<_parList.length; i++){ var _v = _parList[i]; var _kv = _v.split("="); if (_kv[0].toLowerCase()==="lg") _lp = _kv[1]; if (_kv[0].toLowerCase()==="lp") _lp = _kv[1]; } } this.o2 = window.o2 || {}; this.o2.version = { "v": "2.3.1", "build": "2019.07.31", "info": "O2OA 活力办公 创意无限. Copyright © 2018, o2oa.net O2 Team All rights reserved." }; if (!this.o2.session) this.o2.session ={ "isDebugger": _debug, "path": "/o2_core/o2" }; this.o2.language = _lp; this.o2.splitStr = /\s*(?:,|;)\s*/; // this.o2 = { // "version": { // "v": "2.3.1", // "build": "2019.07.31", // "info": "O2OA 活力办公 创意无限. Copyright © 2018, o2oa.net O2 Team All rights reserved." // }, // "session": { // "isDebugger": _debug, // "path": "/o2_core/o2" // }, // "language": _lp, // "splitStr": /\s*(?:,|;)\s*/ // }; this.wrdp = this.o2; var _attempt = function(){ for (var i = 0, l = arguments.length; i < l; i++){ try { arguments[i](); return arguments[i]; } catch (e){} } return null; }; var _typeOf = function(item){ if (item == null) return 'null'; if (item.$family != null) return item.$family(); if (item.constructor == window.Array) return "array"; if (item.nodeName){ if (item.nodeType == 1) return 'element'; if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace'; } else if (typeof item.length == 'number'){ if (item.callee) return 'arguments'; } return typeof item; }; this.o2.typeOf = _typeOf; var _addListener = function(dom, type, fn){ if (type == 'unload'){ var old = fn, self = this; fn = function(){ _removeListener(dom, 'unload', fn); old(); }; } if (dom.addEventListener) dom.addEventListener(type, fn, !!arguments[2]); else dom.attachEvent('on' + type, fn); }; var _removeListener = function(dom, type, fn){ if (dom.removeEventListener) dom.removeEventListener(type, fn, !!arguments[2]); else dom.detachEvent('on' + type, fn); }; //http request class var _request = (function(){ var XMLHTTP = function(){ return new XMLHttpRequest(); }; var MSXML2 = function(){ return new ActiveXObject('MSXML2.XMLHTTP'); }; var MSXML = function(){ return new ActiveXObject('Microsoft.XMLHTTP'); }; return _attempt(XMLHTTP, MSXML2, MSXML); })(); var _returnBase = function(number, base) { return (number).toString(base).toUpperCase(); }; var _getIntegerBits = function(val, start, end){ var base16 = _returnBase(val, 16); var quadArray = new Array(); var quadString = ''; var i = 0; for (i = 0; i < base16.length; i++) { quadArray.push(base16.substring(i, i + 1)); } for (i = Math.floor(start / 4); i <= Math.floor(end / 4); i++) { if (!quadArray[i] || quadArray[i] == '') quadString += '0'; else quadString += quadArray[i]; } return quadString; }; var _rand = function(max) { return Math.floor(Math.random() * (max + 1)); }; this.o2.addListener = _addListener; this.o2.removeListener = _removeListener; //uuid var _uuid = function(){ var dg = new Date(1582, 10, 15, 0, 0, 0, 0); var dc = new Date(); var t = dc.getTime() - dg.getTime(); var tl = _getIntegerBits(t, 0, 31); var tm = _getIntegerBits(t, 32, 47); var thv = _getIntegerBits(t, 48, 59) + '1'; var csar = _getIntegerBits(_rand(4095), 0, 7); var csl = _getIntegerBits(_rand(4095), 0, 7); var n = _getIntegerBits(_rand(8191), 0, 7) + _getIntegerBits(_rand(8191), 8, 15) + _getIntegerBits(_rand(8191), 0, 7) + _getIntegerBits(_rand(8191), 8, 15) + _getIntegerBits(_rand(8191), 0, 15); return tl + tm + thv + csar + csl + n; }; this.o2.uuid = _uuid; var _runCallback = function(callback, key, par){ if (typeOf(callback).toLowerCase() === 'function'){ if (key.toLowerCase()==="success") callback.apply(callback, par); }else{ if (typeOf(callback).toLowerCase()==='object'){ var name = ("on-"+key).camelCase(); if (callback[name]) callback[name].apply(callback, par); } } }; this.o2.runCallback = _runCallback; //load js, css, html adn all. var _getAllOptions = function(options){ var doc = (options && options.doc) || document; if (!doc.unid) doc.unid = _uuid(); return { "noCache": !!(options && options.nocache), "reload": !!(options && options.reload), "sequence": !!(options && options.sequence), "doc": doc, "dom": (options && options.dom) || document.body, "module": (options && options.module) || null, "noConflict": (options && options.noConflict) || false, "bind": (options && options.bind) || null, "position": (options && options.position) || "beforeend" //'beforebegin' 'afterbegin' 'beforeend' 'afterend'debugger } }; var _getCssOptions = function(options){ var doc = (options && options.doc) || document; if (!doc.unid) doc.unid = _uuid(); return { "noCache": !!(options && options.nocache), "reload": !!(options && options.reload), "sequence": !!(options && options.sequence), "doc": doc, "dom": (options && options.dom) || null } }; var _getJsOptions = function(options){ var doc = (options && options.doc) || document; if (!doc.unid) doc.unid = _uuid(); return { "noCache": !!(options && options.nocache), "reload": !!(options && options.reload), "sequence": (!(options && options.sequence == false)), "doc": doc } }; var _getHtmlOptions = function(options){ var doc = (options && options.doc) || document; if (!doc.unid) doc.unid = _uuid(); return { "noCache": !!(options && options.nocache), "reload": !!(options && options.reload), "sequence": !!(options && options.sequence), "doc": doc, "dom": (options && options.dom) || null, "module": (options && options.module) || null, "noConflict": (options && options.noConflict) || false, "bind": (options && options.bind) || null, "position": (options && options.position) || "beforeend" //'beforebegin' 'afterbegin' 'beforeend' 'afterend' } }; _filterUrl = function(url){ if (o2.base){ if (url.indexOf(":")===-1){ var s = url.substring(0, url.indexOf("/")+1); var r = url.substring(url.indexOf("/")+1, url.length); if ("../"===s || "./"===s || "/"===s){ return s+o2.base+r; }else{ return o2.base+url } } } return url; }; this.o2.filterUrl = _filterUrl; var _xhr_get = function(url, success, failure, completed){ var xhr = new _request(); url = _filterUrl(url); xhr.open("GET", url, true); var _checkCssLoaded= function(_, err){ if (!(xhr.readyState == 4)) return; if (err){ if (completed) completed(xhr); return; } _removeListener(xhr, 'readystatechange', _checkCssLoaded); _removeListener(xhr, 'load', _checkCssLoaded); _removeListener(xhr, 'error', _checkCssErrorLoaded); if (err) {failure(xhr); return} var status = xhr.status; status = (status == 1223) ? 204 : status; if ((status >= 200 && status < 300)) success(xhr); else if ((status >= 300 && status < 400)) failure(xhr); else failure(xhr); if (completed) completed(xhr); }; var _checkCssErrorLoaded= function(err){ _checkCssLoaded(err) }; if ("load" in xhr) _addListener(xhr, "load", _checkCssLoaded); if ("error" in xhr) _addListener(xhr, "load", _checkCssErrorLoaded); _addListener(xhr, "readystatechange", _checkCssLoaded); xhr.send(); }; var _loadSequence = function(ms, cb, op, n, thisLoaded, loadSingle, uuid, fun){ loadSingle(ms[n], function(module){ if (module) thisLoaded.push(module); n++; if (fun) fun(module); if (n===ms.length){ if (cb) cb(thisLoaded); }else{ _loadSequence(ms, cb, op, n, thisLoaded, loadSingle, uuid, fun); } }, op, uuid); }; var _loadDisarray = function(ms, cb, op, thisLoaded, loadSingle, uuid, fun){ var count=0; for (var i=0; i1){ node.addEventListener(evs[0], function(e){ if (m[evs[1]]) m[evs[1]].apply(m, [e]); }, false); } }); } var _bindToModule = function(m, node, name){ // if (m[name]){ // if (o2.typeOf(m[name])!=="array"){ // var tmp = m[name]; // m[name] = []; // m[name].push(tmp); // } // m[name].push(node); // }else{ m[name] = node; // } }; var _loadHtml = function(modules, options, callback){ var ms = (_typeOf(modules)==="array") ? modules : [modules]; var op = (_typeOf(options)==="object") ? _getHtmlOptions(options) : _getHtmlOptions(null); var cb = (_typeOf(options)==="function") ? options : callback; var thisLoaded = []; if (op.sequence){ _loadSequence(ms, cb, op, 0, thisLoaded, _loadSingleHtml, null, function(html){ if (html) _injectHtml(op, html.data ); }); }else{ _loadDisarray(ms, cb, op, thisLoaded, _loadSingleHtml, null, function(html){ if (html) _injectHtml(op, html.data ); }); } }; this.o2.loadHtml = _loadHtml; if (window.Element) Element.prototype.loadHtml = function(modules, options, callback){ var op = (_typeOf(options)==="object") ? options : {}; var cb = (_typeOf(options)==="function") ? options : callback; op.dom = this; _loadHtml(modules, op, cb); }; this.o2.injectHtml = function(html, op){ _injectHtml(op, html); }; if (window.Element) Element.prototype.injectHtml = function(html, options){ var op = (_typeOf(options)==="object") ? options : {}; op.dom = this; op.position = (options && options.position) || "beforeend" _injectHtml(op, html); }; //load all _loadAll = function(modules, options, callback){ //var ms = (_typeOf(modules)==="array") ? modules : [modules]; var op = (_typeOf(options)==="object") ? _getAllOptions(options) : _getAllOptions(null); var cb = (_typeOf(options)==="function") ? options : callback; var ms, htmls, styles, sctipts; var _htmlLoaded=(!modules.html), _cssLoaded=(!modules.css), _jsLoaded=(!modules.js); var _checkloaded = function(){ if (_htmlLoaded && _cssLoaded && _jsLoaded) if (cb) cb(htmls, styles, sctipts); }; if (modules.html){ _loadHtml(modules.html, op, function(h){ htmls = h; _htmlLoaded = true; _checkloaded(); }); } if (modules.css){ _loadCss(modules.css, op, function(s){ styles = s; _cssLoaded = true; _checkloaded(); }); } if (modules.js){ _load(modules.js, op, function(s){ sctipts = s; _jsLoaded = true; _checkloaded(); }); } }; this.o2.loadAll = _loadAll; if (window.Element) Element.prototype.loadAll = function(modules, options, callback){ var op = (_typeOf(options)==="object") ? options : {}; var cb = (_typeOf(options)==="function") ? options : callback; op.dom = this; _loadAll(modules, op, cb); }; var _getIfBlockEnd = function(v){ var rex = /(\{\{if\s+)|(\{\{\s*end if\s*\}\})/gmi; var rexEnd = /\{\{\s*end if\s*\}\}/gmi; var subs = 1; while ((match = rex.exec(v)) !== null) { var fullMatch = match[0]; if (fullMatch.search(rexEnd)!==-1){ subs--; if (subs==0) break; }else{ subs++ } } if (match) return {"codeIndex": match.index, "lastIndex": rex.lastIndex}; return {"codeIndex": v.length-1, "lastIndex": v.length-1}; } var _getEachBlockEnd = function(v){ var rex = /(\{\{each\s+)|(\{\{\s*end each\s*\}\})/gmi; var rexEnd = /\{\{\s*end each\s*\}\}/gmi; var subs = 1; while ((match = rex.exec(v)) !== null) { var fullMatch = match[0]; if (fullMatch.search(rexEnd)!==-1){ subs--; if (subs==0) break; }else{ subs++; } } if (match) return {"codeIndex": match.index, "lastIndex": rex.lastIndex}; return {"codeIndex": v.length-1, "lastIndex": v.length-1}; } var _parseHtml = function(str, json){ var v = str; var rex = /(\{\{\s*)[\s\S]*?(\s*\}\})/gmi; var match; while ((match = rex.exec(v)) !== null) { var fullMatch = match[0]; var offset = 0; //if statement begin if (fullMatch.search(/\{\{if\s+/i)!==-1){ //找到对应的end if var condition = fullMatch.replace(/^\{\{if\s*/i, ""); condition = condition.replace(/\s*\}\}$/i, ""); var flag = _jsonText(json, condition, "boolean"); var tmpStr = v.substring(rex.lastIndex, v.length); var endIfIndex = _getIfBlockEnd(tmpStr); if (flag){ //if 为 true var parseStr = _parseHtml(tmpStr.substring(0, endIfIndex.codeIndex), json); var vLeft = v.substring(0, match.index); var vRight = v.substring(rex.lastIndex+endIfIndex.lastIndex, v.length); v = vLeft + parseStr + vRight; offset = parseStr.length - fullMatch.length; }else{ v = v.substring(0, match.index) + v.substring(rex.lastIndex+endIfIndex.lastIndex, v.length); offset = 0-fullMatch.length; } }else if (fullMatch.search(/\{\{each\s+/)!==-1) { //each statement var itemString = fullMatch.replace(/^\{\{each\s*/, ""); itemString = itemString.replace(/\s*\}\}$/, ""); var eachValue = _jsonText(json, itemString, "object"); var tmpEachStr = v.substring(rex.lastIndex, v.length); var endEachIndex = _getEachBlockEnd(tmpEachStr); var parseEachStr = tmpEachStr.substring(0, endEachIndex.codeIndex); var eachResult = ""; if (eachValue && _typeOf(eachValue)==="array"){ for (var i=0; i/g, ">"); returnValue = returnValue.replace(/*/ // doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/ // testElement.doScroll() throws when the DOM is not ready, only in the top window doScrollWorks: function(){ try { _dom.testElement.doScroll(); return true; } catch (e){} return false; }, /**/ onReady: function(){ for (var i=0; i<_dom.readys.length; i++){ this.readys[i].apply(window); } }, addReady: function(fn){ if (_dom.loaded){ if (fn) fn.apply(window); }else{ if (fn) _dom.readys.push(fn); } return _dom; }, checkReady: function(){ _dom.checks.push(function(){return true}); _dom.check(); } }; var _loadO2 = function(){ this.o2.load("o2.core", _dom.check); this.o2.load("o2.more", _dom.check); }; _addListener(document, 'DOMContentLoaded', _dom.checkReady); /**/ // If doScroll works already, it can't be used to determine domready // e.g. in an iframe if (_dom.testElement.doScroll && !_dom.doScrollWorks()){ _dom.checks.push(_dom.doScrollWorks); _dom.shouldPoll = true; } /**/ if (document.readyState) _dom.checks.push(function(){ var state = document.readyState; return (state == 'loaded' || state == 'complete'); }); if ('onreadystatechange' in document) _addListener(document, 'readystatechange', _dom.check); else _dom.shouldPoll = true; if (_dom.shouldPoll) _dom.poll(); if (!window.MooTools){ this.o2.load("mootools", function(){ _loadO2(); _dom.check(); }); }else{ _loadO2(); } this.o2.addReady = function(fn){ _dom.addReady.call(_dom, fn); }; })();