/** ***** 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); };
})();