2014-06-08 17:57:19 +08:00
|
|
|
|
// leanote 通用方法
|
|
|
|
|
|
|
|
|
|
//--------------
|
|
|
|
|
// 命名空间
|
|
|
|
|
//--------------
|
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// 最上级变量
|
2015-09-05 23:30:24 +08:00
|
|
|
|
if(typeof LEA === 'undefined') {
|
|
|
|
|
var LEA = {};
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// 命名空间
|
|
|
|
|
var Notebook = {
|
|
|
|
|
cache: {}, // notebookId => {Title, Seq}
|
|
|
|
|
}
|
|
|
|
|
var Note = {
|
|
|
|
|
cache: {}, // noteId => {Title, Tags, Content, Desc}
|
|
|
|
|
};
|
|
|
|
|
// var UserInfo = {}; // 博客有问题, 会覆盖
|
|
|
|
|
var Tag = {};
|
|
|
|
|
var Notebook = {};
|
|
|
|
|
var Share = {};
|
2014-10-22 16:20:45 +08:00
|
|
|
|
var Mobile = {}; // 手机端处理
|
2015-01-08 00:36:28 +08:00
|
|
|
|
var LeaAce = {};
|
2014-05-07 13:06:24 +08:00
|
|
|
|
|
|
|
|
|
// markdown
|
|
|
|
|
var Converter;
|
|
|
|
|
var MarkdownEditor;
|
|
|
|
|
var ScrollLink;
|
2015-01-08 00:36:28 +08:00
|
|
|
|
var MD;
|
2014-05-07 13:06:24 +08:00
|
|
|
|
|
2015-10-10 16:10:54 +08:00
|
|
|
|
//-------------
|
|
|
|
|
// 全局事件机制
|
|
|
|
|
|
|
|
|
|
$.extend(LEA, {
|
|
|
|
|
_eventCallbacks: {},
|
|
|
|
|
_listen: function(type, callback) {
|
|
|
|
|
var callbacks = this._eventCallbacks[type] || (this._eventCallbacks[type] = []);
|
|
|
|
|
callbacks.push(callback);
|
|
|
|
|
},
|
|
|
|
|
// on('a b', function(params) {})
|
|
|
|
|
on: function(name, callback) {
|
|
|
|
|
var names = name.split(/\s+/);
|
|
|
|
|
for (var i = 0; i < names.length; ++i) {
|
|
|
|
|
this._listen(names[i], callback);
|
|
|
|
|
}
|
|
|
|
|
return this;
|
|
|
|
|
},
|
|
|
|
|
// off('a b', function(params) {})
|
|
|
|
|
off: function(name, callback) {
|
|
|
|
|
var types = name.split(/\s+/);
|
|
|
|
|
var i, j, callbacks, removeIndex;
|
|
|
|
|
for (i = 0; i < types.length; i++) {
|
|
|
|
|
callbacks = this._eventCallbacks[types[i].toLowerCase()];
|
|
|
|
|
if (callbacks) {
|
|
|
|
|
removeIndex = null;
|
|
|
|
|
for (j = 0; j < callbacks.length; j++) {
|
|
|
|
|
if (callbacks[j] == callback) {
|
|
|
|
|
removeIndex = j;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (removeIndex !== null) {
|
|
|
|
|
callbacks.splice(removeIndex, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// LEA.trigger('a', {});
|
|
|
|
|
trigger: function(type, params) {
|
|
|
|
|
var callbacks = this._eventCallbacks[type] || [];
|
|
|
|
|
if (callbacks.length === 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
for (var i = 0; i < callbacks.length; i++) {
|
|
|
|
|
callbacks[i].call(this, params);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
//---------------------
|
|
|
|
|
// 公用方法
|
|
|
|
|
|
|
|
|
|
function trimLeft(str, substr) {
|
|
|
|
|
if(!substr || substr == " ") {
|
|
|
|
|
return $.trim(str);
|
|
|
|
|
}
|
|
|
|
|
while(str.indexOf(substr) == 0) {
|
|
|
|
|
str = str.substring(substr.length);
|
|
|
|
|
}
|
|
|
|
|
return str;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function json(str) {
|
|
|
|
|
return eval("(" + str + ")")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// '<div id="?" class="?" onclick="?">'
|
|
|
|
|
function t() {
|
|
|
|
|
var args = arguments;
|
|
|
|
|
if(args.length <= 1) {
|
|
|
|
|
return args[0];
|
|
|
|
|
}
|
|
|
|
|
var text = args[0];
|
|
|
|
|
if(!text) {
|
|
|
|
|
return text;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 先把所有的?替换成, 很有可能替换的值有?会造成循环,没有替换想要的
|
|
|
|
|
var pattern = "LEAAEL"
|
|
|
|
|
text = text.replace(/\?/g, pattern);
|
|
|
|
|
|
|
|
|
|
// args[1] 替换第一个?
|
|
|
|
|
for(var i = 1; i <= args.length; ++i) {
|
|
|
|
|
text = text.replace(pattern, args[i]);
|
|
|
|
|
}
|
|
|
|
|
return text;
|
|
|
|
|
}
|
2014-09-22 20:21:58 +08:00
|
|
|
|
var tt = t; // 当slimscroll滑动时t被重新赋值了
|
2014-05-07 13:06:24 +08:00
|
|
|
|
|
|
|
|
|
// 判断数组是否相等
|
|
|
|
|
function arrayEqual(a, b) {
|
|
|
|
|
a = a || [];
|
|
|
|
|
b = b || [];
|
|
|
|
|
return a.join(",") == b.join(",");
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-08 17:57:19 +08:00
|
|
|
|
// 是否是数组
|
2014-05-07 13:06:24 +08:00
|
|
|
|
function isArray(obj) {
|
|
|
|
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 是否为空
|
|
|
|
|
* 可判断任意类型,string array
|
|
|
|
|
*/
|
|
|
|
|
function isEmpty(obj) {
|
|
|
|
|
if(!obj) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(isArray(obj)) {
|
|
|
|
|
if(obj.length == 0) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------
|
|
|
|
|
//得到form的数据
|
|
|
|
|
//返回json
|
|
|
|
|
function getFormJsonData(formId) {
|
|
|
|
|
var data = formArrDataToJson($('#' + formId).serializeArray());
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//$('#form').serializeArray()的数据[{name: a, value: b}, {name: "c[]", value: d}]
|
|
|
|
|
//转成{a:b}
|
|
|
|
|
function formArrDataToJson(arrData) {
|
|
|
|
|
var datas = {};
|
|
|
|
|
var arrObj= {}; // {a:[1, 2], b:[2, 3]};
|
|
|
|
|
for(var i in arrData) {
|
|
|
|
|
var attr = arrData[i].name;
|
|
|
|
|
var value = arrData[i].value;
|
|
|
|
|
// 判断是否是a[]形式
|
|
|
|
|
if(attr.substring(attr.length-2, attr.length) == '[]') {
|
|
|
|
|
attr = attr.substring(0, attr.length-2);
|
|
|
|
|
if(arrObj[attr] == undefined) {
|
|
|
|
|
arrObj[attr] = [value];
|
|
|
|
|
} else {
|
|
|
|
|
arrObj[attr].push(value);
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
datas[attr] = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $.extend(datas, arrObj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//将serialize的的form值转成json
|
|
|
|
|
function formSerializeDataToJson(formSerializeData) {
|
|
|
|
|
var arr = formSerializeData.split("&");
|
|
|
|
|
var datas = {};
|
|
|
|
|
var arrObj= {}; // {a:[1, 2], b:[2, 3]};
|
|
|
|
|
for(var i = 0; i < arr.length; ++i) {
|
|
|
|
|
var each = arr[i].split("=");
|
|
|
|
|
var attr = decodeURI(each[0]);
|
|
|
|
|
var value = decodeURI(each[1]);
|
|
|
|
|
// 判断是否是a[]形式
|
|
|
|
|
if(attr.substring(attr.length-2, attr.length) == '[]') {
|
|
|
|
|
attr = attr.substring(0, attr.length-2);
|
|
|
|
|
if(arrObj[attr] == undefined) {
|
|
|
|
|
arrObj[attr] = [value];
|
|
|
|
|
} else {
|
|
|
|
|
arrObj[attr].push(value);
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
datas[attr] = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $.extend(datas, arrObj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ajax请求返回结果后的操作
|
|
|
|
|
// 用于ajaxGet(), ajaxPost()
|
|
|
|
|
function _ajaxCallback(ret, successFunc, failureFunc) {
|
|
|
|
|
// 总会执行
|
|
|
|
|
if(ret === true || ret == "true" || typeof ret == "object") {
|
|
|
|
|
// 是否是NOTELOGIN
|
|
|
|
|
if(ret && typeof ret == "object") {
|
|
|
|
|
if(ret.Msg == "NOTLOGIN") {
|
2015-11-28 21:31:56 +08:00
|
|
|
|
alert(getMsg("Please sign in firstly!"));
|
2014-05-07 13:06:24 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(typeof successFunc == "function") {
|
|
|
|
|
successFunc(ret);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if(typeof failureFunc == "function") {
|
|
|
|
|
failureFunc(ret);
|
|
|
|
|
} else {
|
|
|
|
|
alert("error!")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function _ajax(type, url, param, successFunc, failureFunc, async) {
|
2015-10-30 14:02:28 +08:00
|
|
|
|
// log("-------------------ajax:");
|
|
|
|
|
// log(url);
|
|
|
|
|
// log(param);
|
2014-05-07 13:06:24 +08:00
|
|
|
|
if(typeof async == "undefined") {
|
|
|
|
|
async = true;
|
|
|
|
|
} else {
|
|
|
|
|
async = false;
|
|
|
|
|
}
|
2014-10-22 16:20:45 +08:00
|
|
|
|
return $.ajax({
|
2014-05-07 13:06:24 +08:00
|
|
|
|
type: type,
|
|
|
|
|
url: url,
|
|
|
|
|
data: param,
|
|
|
|
|
async: async, // 是否异步
|
|
|
|
|
success: function(ret) {
|
|
|
|
|
_ajaxCallback(ret, successFunc, failureFunc);
|
|
|
|
|
},
|
|
|
|
|
error: function(ret) {
|
|
|
|
|
_ajaxCallback(ret, successFunc, failureFunc);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 发送ajax get请求
|
|
|
|
|
* @param url
|
|
|
|
|
* @param param
|
|
|
|
|
* @param successFunc
|
|
|
|
|
* @param failureFunc
|
|
|
|
|
* @param hasProgress
|
|
|
|
|
* @param async 是否异步
|
|
|
|
|
* @returns
|
|
|
|
|
*/
|
|
|
|
|
function ajaxGet(url, param, successFunc, failureFunc, async) {
|
2014-10-22 16:20:45 +08:00
|
|
|
|
return _ajax("GET", url, param, successFunc, failureFunc, async);
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 发送post请求
|
|
|
|
|
* @param url
|
|
|
|
|
* @param param
|
|
|
|
|
* @param successFunc
|
|
|
|
|
* @param failureFunc
|
|
|
|
|
* @param hasProgress
|
|
|
|
|
* @param async 是否异步, 默认为true
|
|
|
|
|
* @returns
|
|
|
|
|
*/
|
|
|
|
|
function ajaxPost(url, param, successFunc, failureFunc, async) {
|
|
|
|
|
_ajax("POST", url, param, successFunc, failureFunc, async);
|
|
|
|
|
}
|
|
|
|
|
function ajaxPostJson(url, param, successFunc, failureFunc, async) {
|
2015-10-30 14:02:28 +08:00
|
|
|
|
// log("-------------------ajaxPostJson:");
|
|
|
|
|
// log(url);
|
|
|
|
|
// log(param);
|
2014-05-07 13:06:24 +08:00
|
|
|
|
|
|
|
|
|
// 默认是异步的
|
|
|
|
|
if(typeof async == "undefined") {
|
|
|
|
|
async = true;
|
|
|
|
|
} else {
|
|
|
|
|
async = false;
|
|
|
|
|
}
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : url,
|
|
|
|
|
type : "POST",
|
|
|
|
|
contentType: "application/json; charset=utf-8",
|
|
|
|
|
datatype: "json",
|
|
|
|
|
async: async,
|
|
|
|
|
data : JSON.stringify(param),
|
|
|
|
|
success : function(ret, stats) {
|
|
|
|
|
_ajaxCallback(ret, successFunc, failureFunc);
|
|
|
|
|
},
|
|
|
|
|
error: function(ret) {
|
|
|
|
|
_ajaxCallback(ret, successFunc, failureFunc);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function findParents(target, selector) {
|
|
|
|
|
if($(target).is(selector)) {
|
|
|
|
|
return $(target);
|
|
|
|
|
}
|
|
|
|
|
var parents = $(target).parents();
|
|
|
|
|
for(var i = 0; i < parents.length; ++i) {
|
|
|
|
|
log(parents.eq(i))
|
|
|
|
|
if(parents.eq(i).is(selector)) {
|
|
|
|
|
return parents.seq(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
ajaxPostJson(
|
|
|
|
|
"http://localhost:9000/notebook/index?i=100&name=life",
|
|
|
|
|
{Title: "you can", UserId:"52a9e409f4ea49d6576fdbca", Subs:[{title: "xxxxx", Seq:11}, {title:"life..."}]},
|
|
|
|
|
function(e) {
|
|
|
|
|
log(e);
|
|
|
|
|
});
|
|
|
|
|
*/
|
|
|
|
|
|
2015-01-08 00:36:28 +08:00
|
|
|
|
function getVendorPrefix() {
|
|
|
|
|
// 使用body是为了避免在还需要传入元素
|
|
|
|
|
var body = document.body || document.documentElement,
|
|
|
|
|
style = body.style,
|
|
|
|
|
vendor = ['webkit', 'khtml', 'moz', 'ms', 'o'],
|
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
|
|
while (i < vendor.length) {
|
|
|
|
|
// 此处进行判断是否有对应的内核前缀
|
|
|
|
|
if (typeof style[vendor[i] + 'Transition'] === 'string') {
|
|
|
|
|
return vendor[i];
|
|
|
|
|
}
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
//-----------------
|
2014-05-13 16:47:06 +08:00
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
//切换编辑器
|
2014-09-21 22:05:04 +08:00
|
|
|
|
LEA.isM = false;
|
|
|
|
|
LEA.isMarkdownEditor = function() {
|
|
|
|
|
return LEA.isM;
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
function switchEditor(isMarkdown) {
|
2014-09-21 22:05:04 +08:00
|
|
|
|
LEA.isM = isMarkdown;
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// 富文本永远是2
|
|
|
|
|
if(!isMarkdown) {
|
|
|
|
|
$("#editor").show();
|
2015-01-08 00:36:28 +08:00
|
|
|
|
$("#mdEditor").css("z-index", 1).hide();
|
2014-05-13 16:47:06 +08:00
|
|
|
|
|
|
|
|
|
// 刚开始没有
|
2014-05-13 17:17:13 +08:00
|
|
|
|
$("#leanoteNav").show();
|
2014-05-07 13:06:24 +08:00
|
|
|
|
} else {
|
|
|
|
|
$("#mdEditor").css("z-index", 3).show();
|
2014-05-13 16:47:06 +08:00
|
|
|
|
|
2014-05-13 17:17:13 +08:00
|
|
|
|
$("#leanoteNav").hide();
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// editor 设置内容
|
|
|
|
|
// 可能是tinymce还没有渲染成功
|
|
|
|
|
var previewToken = "<div style='display: none'>FORTOKEN</div>"
|
2015-01-08 00:36:28 +08:00
|
|
|
|
var clearIntervalForSetContent;
|
2015-06-15 18:01:48 +08:00
|
|
|
|
function setEditorContent(content, isMarkdown, preview, callback) {
|
2014-05-07 13:06:24 +08:00
|
|
|
|
if(!content) {
|
|
|
|
|
content = "";
|
|
|
|
|
}
|
2015-01-08 00:36:28 +08:00
|
|
|
|
if(clearIntervalForSetContent) {
|
|
|
|
|
clearInterval(clearIntervalForSetContent);
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
if(!isMarkdown) {
|
2015-01-08 00:36:28 +08:00
|
|
|
|
// 先destroy之前的ace
|
|
|
|
|
/*
|
|
|
|
|
if(typeof tinymce != "undefined" && tinymce.activeEditor) {
|
|
|
|
|
var editor = tinymce.activeEditor;
|
|
|
|
|
var everContent = $(editor.getBody());
|
|
|
|
|
if(everContent) {
|
|
|
|
|
LeaAce.destroyAceFromContent(everContent);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*/
|
2015-10-17 15:51:21 +08:00
|
|
|
|
// $("#editorContent").html(content);
|
|
|
|
|
// 不能先setHtml, 因为在tinymce的setContent前要获取之前的content, destory ACE
|
2014-10-22 16:20:45 +08:00
|
|
|
|
if(typeof tinymce != "undefined" && tinymce.activeEditor) {
|
|
|
|
|
var editor = tinymce.activeEditor;
|
2014-05-07 13:06:24 +08:00
|
|
|
|
editor.setContent(content);
|
2015-06-15 18:01:48 +08:00
|
|
|
|
callback && callback();
|
2014-05-07 13:06:24 +08:00
|
|
|
|
editor.undoManager.clear(); // 4-7修复BUG
|
|
|
|
|
} else {
|
|
|
|
|
// 等下再设置
|
2015-01-08 00:36:28 +08:00
|
|
|
|
clearIntervalForSetContent = setTimeout(function() {
|
2015-06-15 18:01:48 +08:00
|
|
|
|
setEditorContent(content, false, false, callback);
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}, 100);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2015-01-08 00:36:28 +08:00
|
|
|
|
/*
|
2014-05-07 13:06:24 +08:00
|
|
|
|
$("#wmd-input").val(content);
|
2014-05-10 16:50:03 +08:00
|
|
|
|
$("#wmd-preview").html(""); // 防止先点有的, 再点tinymce再点没内容的
|
2014-05-07 13:06:24 +08:00
|
|
|
|
if(!content || preview) { // 没有内容就不要解析了
|
|
|
|
|
$("#wmd-preview").html(preview).css("height", "auto");
|
2014-05-13 16:54:41 +08:00
|
|
|
|
if(ScrollLink) {
|
|
|
|
|
ScrollLink.onPreviewFinished(); // 告诉scroll preview结束了
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
} else {
|
|
|
|
|
// 还要清空preview
|
|
|
|
|
if(MarkdownEditor) {
|
|
|
|
|
$("#wmd-preview").html(previewToken + "<div style='text-align:center; padding: 10px 0;'><img src='http://leanote.com/images/loading-24.gif' /> 正在转换...</div>");
|
|
|
|
|
MarkdownEditor.refreshPreview();
|
|
|
|
|
} else {
|
|
|
|
|
// 等下再设置
|
2015-01-08 00:36:28 +08:00
|
|
|
|
clearIntervalForSetContent = setTimeout(function() {
|
2014-05-07 13:06:24 +08:00
|
|
|
|
setEditorContent(content, true, preview);
|
|
|
|
|
}, 200);
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-01-08 00:36:28 +08:00
|
|
|
|
*/
|
|
|
|
|
if(MD) {
|
|
|
|
|
MD.setContent(content);
|
2015-11-28 15:33:13 +08:00
|
|
|
|
MD.clearUndo && MD.clearUndo();
|
2015-06-15 18:01:48 +08:00
|
|
|
|
callback && callback();
|
2015-01-08 00:36:28 +08:00
|
|
|
|
} else {
|
|
|
|
|
clearIntervalForSetContent = setTimeout(function() {
|
2015-06-15 18:01:48 +08:00
|
|
|
|
setEditorContent(content, true, false, callback);
|
2015-01-08 00:36:28 +08:00
|
|
|
|
}, 100);
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// preview是否为空
|
|
|
|
|
function previewIsEmpty(preview) {
|
|
|
|
|
if(!preview || preview.substr(0, previewToken.length) == previewToken) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-15 18:01:48 +08:00
|
|
|
|
// ace的值有误?
|
|
|
|
|
function isAceError(val) {
|
|
|
|
|
if(!val) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return val.indexOf('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') != -1;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// 有tinymce得到的content有<html>包围
|
2015-10-17 15:51:21 +08:00
|
|
|
|
// 总会出现<p> <br></p>, 原因, setContent('<p><br data-mce-bogus="1" /></p>') 会设置成 <p> <br></p>
|
|
|
|
|
// 所以, 要在getContent时, 当是<p><br data-mce-bogus="1"></p>, 返回 <p><br/></p>
|
2014-05-07 13:06:24 +08:00
|
|
|
|
function getEditorContent(isMarkdown) {
|
2015-10-17 15:51:21 +08:00
|
|
|
|
var content = _getEditorContent(isMarkdown);
|
|
|
|
|
if (content === '<p><br data-mce-bogus="1"></p>') {
|
|
|
|
|
return '<p><br></p>';
|
|
|
|
|
}
|
|
|
|
|
return content;
|
|
|
|
|
}
|
|
|
|
|
function _getEditorContent(isMarkdown) {
|
2014-05-07 13:06:24 +08:00
|
|
|
|
if(!isMarkdown) {
|
|
|
|
|
var editor = tinymce.activeEditor;
|
|
|
|
|
if(editor) {
|
2015-01-08 00:36:28 +08:00
|
|
|
|
var content = $(editor.getBody()).clone();
|
|
|
|
|
// 删除toggle raw
|
|
|
|
|
content.find('.toggle-raw').remove();
|
|
|
|
|
|
2015-06-15 18:01:48 +08:00
|
|
|
|
// single页面没有LeaAce
|
|
|
|
|
if(window.LeaAce && LeaAce.getAce) {
|
|
|
|
|
// 替换掉ace editor
|
|
|
|
|
var pres = content.find('pre');
|
|
|
|
|
for(var i = 0 ; i < pres.length; ++i) {
|
|
|
|
|
var pre = pres.eq(i);
|
|
|
|
|
var id = pre.attr('id');
|
|
|
|
|
var aceEditor = LeaAce.getAce(id);
|
|
|
|
|
if(aceEditor) {
|
|
|
|
|
var val = aceEditor.getValue();
|
|
|
|
|
// 表示有错
|
|
|
|
|
if(isAceError(val)) {
|
|
|
|
|
val = pre.html();
|
|
|
|
|
}
|
|
|
|
|
val = val.replace(/</g, '<').replace(/>/g, '>');
|
|
|
|
|
pre.removeAttr('style', '').removeAttr('contenteditable').removeClass('ace_editor');
|
|
|
|
|
pre.html(val);
|
|
|
|
|
}
|
2015-01-08 00:36:28 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// 去掉恶心的花瓣注入
|
|
|
|
|
// <pinit></pinit>
|
|
|
|
|
// 把最后的<script>..</script>全去掉
|
|
|
|
|
content.find("pinit").remove();
|
|
|
|
|
content.find(".thunderpin").remove();
|
|
|
|
|
content.find(".pin").parent().remove();
|
|
|
|
|
content = $(content).html();
|
|
|
|
|
if(content) {
|
|
|
|
|
while(true) {
|
|
|
|
|
var lastEndScriptPos = content.lastIndexOf("</script>");
|
|
|
|
|
if (lastEndScriptPos == -1) {
|
|
|
|
|
return content;
|
|
|
|
|
}
|
|
|
|
|
var length = content.length;
|
|
|
|
|
// 证明</script>在最后, 去除之
|
|
|
|
|
if(length - 9 == lastEndScriptPos) {
|
|
|
|
|
var lastScriptPos = content.lastIndexOf("<script ");
|
|
|
|
|
if(lastScriptPos == -1) {
|
|
|
|
|
lastScriptPos = content.lastIndexOf("<script>");
|
|
|
|
|
}
|
|
|
|
|
if(lastScriptPos != -1) {
|
|
|
|
|
content = content.substring(0, lastScriptPos);
|
|
|
|
|
} else {
|
|
|
|
|
return content;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 不在最后, 返回
|
|
|
|
|
return content;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return content;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2015-01-08 00:36:28 +08:00
|
|
|
|
// return [$("#wmd-input").val(), $("#wmd-preview").html()]
|
|
|
|
|
return [MD.getContent(), '<div>' + $("#preview-contents").html() + '</div>']
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 禁用编辑
|
|
|
|
|
LEA.editorStatus = true;
|
|
|
|
|
function disableEditor() {
|
|
|
|
|
var editor = tinymce.activeEditor;
|
|
|
|
|
if(editor) {
|
|
|
|
|
editor.hide();
|
|
|
|
|
LEA.editorStatus = false;
|
|
|
|
|
$("#mceTollbarMark").show().css("z-index", 1000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// toolbar 来个遮着...
|
|
|
|
|
}
|
|
|
|
|
function enableEditor() {
|
|
|
|
|
if(LEA.editorStatus) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
$("#mceTollbarMark").css("z-index", -1).hide();
|
|
|
|
|
var editor = tinymce.activeEditor;
|
|
|
|
|
if(editor) {
|
|
|
|
|
editor.show();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------
|
|
|
|
|
// dialog
|
|
|
|
|
//-----------
|
|
|
|
|
function showDialog(id, options) {
|
|
|
|
|
$("#leanoteDialog #modalTitle").html(options.title);
|
|
|
|
|
$("#leanoteDialog .modal-body").html($("#" + id + " .modal-body").html());
|
|
|
|
|
$("#leanoteDialog .modal-footer").html($("#" + id + " .modal-footer").html());
|
|
|
|
|
delete options.title;
|
|
|
|
|
options.show = true;
|
|
|
|
|
$("#leanoteDialog").modal(options);
|
|
|
|
|
}
|
|
|
|
|
function hideDialog(timeout) {
|
|
|
|
|
if(!timeout) {
|
|
|
|
|
timeout = 0;
|
|
|
|
|
}
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
$("#leanoteDialog").modal('hide');
|
|
|
|
|
}, timeout);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更通用
|
|
|
|
|
function closeDialog() {
|
|
|
|
|
$(".modal").modal('hide');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 原生的
|
|
|
|
|
function showDialog2(id, options) {
|
|
|
|
|
options = options || {};
|
|
|
|
|
options.show = true;
|
|
|
|
|
$(id).modal(options);
|
|
|
|
|
}
|
|
|
|
|
function hideDialog2(id, timeout) {
|
|
|
|
|
if(!timeout) {
|
|
|
|
|
timeout = 0;
|
|
|
|
|
}
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
$(id).modal('hide');
|
|
|
|
|
}, timeout);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 远程
|
|
|
|
|
function showDialogRemote(url, data) {
|
|
|
|
|
data = data || {};
|
|
|
|
|
url += "?";
|
|
|
|
|
for(var i in data) {
|
|
|
|
|
url += i + "=" + data[i] + "&";
|
|
|
|
|
}
|
|
|
|
|
$("#leanoteDialogRemote").modal({remote: url});
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-22 16:20:45 +08:00
|
|
|
|
function hideDialogRemote(timeout) {
|
|
|
|
|
if(timeout) {
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
$("#leanoteDialogRemote").modal('hide');
|
|
|
|
|
}, timeout);
|
|
|
|
|
} else {
|
|
|
|
|
$("#leanoteDialogRemote").modal('hide');
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
|
|
|
|
//---------------
|
|
|
|
|
// notify
|
2014-06-08 17:57:19 +08:00
|
|
|
|
// 没用
|
2014-05-07 13:06:24 +08:00
|
|
|
|
$(function() {
|
|
|
|
|
if($.pnotify) {
|
|
|
|
|
$.pnotify.defaults.delay = 1000;
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
function notifyInfo(text) {
|
|
|
|
|
$.pnotify({
|
|
|
|
|
title: '通知',
|
|
|
|
|
text: text,
|
|
|
|
|
type: 'info',
|
|
|
|
|
styling: 'bootstrap'
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
function notifyError(text) {
|
|
|
|
|
$.pnotify.defaults.delay = 2000
|
|
|
|
|
$.pnotify({
|
|
|
|
|
title: '通知',
|
|
|
|
|
text: text,
|
|
|
|
|
type: 'error',
|
|
|
|
|
styling: 'bootstrap'
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
function notifySuccess(text) {
|
|
|
|
|
$.pnotify({
|
|
|
|
|
title: '通知',
|
|
|
|
|
text: text,
|
|
|
|
|
type: 'success',
|
|
|
|
|
styling: 'bootstrap'
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 对Date的扩展,将 Date 转化为指定格式的String
|
|
|
|
|
//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
|
|
|
|
|
//年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
|
|
|
|
|
//例子:
|
|
|
|
|
//(new Date()).format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
|
|
|
|
|
//(new Date()).format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
|
|
|
|
|
Date.prototype.format = function(fmt) { //author: meizz
|
|
|
|
|
var o = {
|
|
|
|
|
"M+" : this.getMonth()+1, //月份
|
|
|
|
|
"d+" : this.getDate(), //日
|
|
|
|
|
"h+" : this.getHours(), //小时
|
|
|
|
|
"m+" : this.getMinutes(), //分
|
|
|
|
|
"s+" : this.getSeconds(), //秒
|
|
|
|
|
"q+" : Math.floor((this.getMonth()+3)/3), //季度
|
|
|
|
|
"S" : this.getMilliseconds() //毫秒
|
|
|
|
|
};
|
|
|
|
|
if(/(y+)/.test(fmt))
|
|
|
|
|
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
|
|
|
|
|
for(var k in o)
|
|
|
|
|
if(new RegExp("("+ k +")").test(fmt))
|
|
|
|
|
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
|
|
|
|
|
return fmt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//2014-01-06T18:29:48.802+08:00
|
|
|
|
|
function goNowToDatetime(goNow) {
|
|
|
|
|
if(!goNow) {
|
|
|
|
|
return "";
|
|
|
|
|
}
|
2015-10-30 14:02:28 +08:00
|
|
|
|
if (typeof goNow == 'object') {
|
|
|
|
|
try {
|
|
|
|
|
return goNow.format("yyyy-M-d hh:mm:ss");
|
|
|
|
|
} catch(e) {
|
|
|
|
|
return getCurDate();
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
return goNow.substr(0, 10) + " " + goNow.substr(11, 8);
|
|
|
|
|
}
|
|
|
|
|
function getCurDate() {
|
|
|
|
|
return (new Date()).format("yyyy-M-d");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 回车键的动作
|
|
|
|
|
function enter(parent, children, func) {
|
|
|
|
|
if(!parent) {
|
|
|
|
|
parent = "body";
|
|
|
|
|
}
|
|
|
|
|
$(parent).on("keydown", children, function(e) {
|
|
|
|
|
if (e.keyCode == 13) {
|
|
|
|
|
func.call(this);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 回车则blue
|
|
|
|
|
function enterBlur(parent, children) {
|
|
|
|
|
if(!parent) {
|
|
|
|
|
parent = "body";
|
|
|
|
|
}
|
|
|
|
|
if(!children) {
|
|
|
|
|
children = parent;
|
|
|
|
|
parent = "body";
|
|
|
|
|
}
|
|
|
|
|
$(parent).on("keydown", children, function(e) {
|
|
|
|
|
if (e.keyCode == 13) {
|
|
|
|
|
$(this).trigger("blur");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 生成mongodb ObjectId
|
|
|
|
|
function getObjectId() {
|
|
|
|
|
return ObjectId();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------
|
|
|
|
|
function resizeEditor(second) {
|
2015-11-28 15:33:13 +08:00
|
|
|
|
LEA.isM && MD && MD.resize && MD.resize();
|
2015-06-15 18:01:48 +08:00
|
|
|
|
return;
|
2014-05-07 13:06:24 +08:00
|
|
|
|
var ifrParent = $("#editorContent_ifr").parent();
|
|
|
|
|
ifrParent.css("overflow", "auto");
|
|
|
|
|
var height = $("#editorContent").height();
|
|
|
|
|
ifrParent.height(height);
|
|
|
|
|
// log(height + '---------------------------------------')
|
|
|
|
|
$("#editorContent_ifr").height(height);
|
2015-01-08 00:36:28 +08:00
|
|
|
|
|
|
|
|
|
// life 12.9
|
|
|
|
|
// inline editor
|
2015-06-15 18:01:48 +08:00
|
|
|
|
// $("#editorContent").css("top", $("#mceToolbar").height());
|
2014-05-07 13:06:24 +08:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
// 第一次时可能会被改变
|
|
|
|
|
if(!second) {
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
resizeEditorHeight(true);
|
|
|
|
|
}, 1000);
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//----------
|
|
|
|
|
// msg位置固定
|
|
|
|
|
function showMsg(msg, timeout) {
|
|
|
|
|
$("#msg").html(msg);
|
|
|
|
|
if(timeout) {
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
$("#msg").html("");
|
|
|
|
|
}, timeout)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function showMsg2(id, msg, timeout) {
|
|
|
|
|
$(id).html(msg);
|
|
|
|
|
if(timeout) {
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
$(id).html("");
|
|
|
|
|
}, timeout)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//--------------
|
|
|
|
|
// type == danger, success, warning
|
|
|
|
|
function showAlert(id, msg, type, id2Focus) {
|
|
|
|
|
$(id).html(msg).removeClass("alert-danger").removeClass("alert-success").removeClass("alert-warning").addClass("alert-" + type).show();
|
|
|
|
|
if(id2Focus) {
|
|
|
|
|
$(id2Focus).focus();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function hideAlert(id, timeout) {
|
|
|
|
|
if(timeout) {
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
$(id).hide();
|
|
|
|
|
}, timeout);
|
|
|
|
|
} else {
|
|
|
|
|
$(id).hide();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-------------------
|
|
|
|
|
// for leanote ajax
|
|
|
|
|
|
|
|
|
|
// post
|
|
|
|
|
// return {Ok, Msg, Data}
|
|
|
|
|
// btnId 是按钮包括#
|
|
|
|
|
function post(url, param, func, btnId) {
|
|
|
|
|
var btnPreText;
|
|
|
|
|
if(btnId) {
|
2014-10-22 16:20:45 +08:00
|
|
|
|
$(btnId).button("loading"); // html("正在处理").addClass("disabled");
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
|
|
|
|
ajaxPost(url, param, function(ret) {
|
2014-10-22 16:20:45 +08:00
|
|
|
|
if(btnId) {
|
|
|
|
|
$(btnId).button("reset");
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
|
|
|
|
if (typeof ret == "object") {
|
|
|
|
|
if(typeof func == "function") {
|
|
|
|
|
func(ret);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
alert("leanote出现了错误!");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 是否是正确的email
|
|
|
|
|
function isEmail(email) {
|
2015-03-31 14:27:26 +08:00
|
|
|
|
var myreg = /^([a-zA-Z0-9]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+@([a-zA-Z0-9\-]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+\.[0-9a-zA-Z]{2,3}$/;
|
2014-05-07 13:06:24 +08:00
|
|
|
|
return myreg.test(email);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 正确返回该email
|
|
|
|
|
function isEmailFromInput(inputId, msgId, selfBlankMsg, selfInvalidMsg) {
|
|
|
|
|
var val = $(inputId).val();
|
|
|
|
|
var msg = function() {};
|
|
|
|
|
if(msgId) {
|
|
|
|
|
msg = function(msgId, msg) {
|
|
|
|
|
showAlert(msgId, msg, "danger", inputId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(!val) {
|
2014-10-22 16:20:45 +08:00
|
|
|
|
msg(msgId, selfBlankMsg || getMsg("inputEmail"));
|
2014-05-07 13:06:24 +08:00
|
|
|
|
} else if(!isEmail(val)) {
|
2014-10-22 16:20:45 +08:00
|
|
|
|
msg(msgId, selfInvalidMsg || getMsg("errorEmail"));
|
2014-05-07 13:06:24 +08:00
|
|
|
|
} else {
|
|
|
|
|
return val;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 复制文本
|
|
|
|
|
function initCopy(aId, postFunc) {
|
|
|
|
|
// 定义一个新的复制对象
|
|
|
|
|
var clip = new ZeroClipboard(document.getElementById(aId), {
|
|
|
|
|
moviePath: "/js/ZeroClipboard/ZeroClipboard.swf"
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 复制内容到剪贴板成功后的操作
|
|
|
|
|
clip.on('complete', function(client, args) {
|
|
|
|
|
postFunc(args);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function showLoading() {
|
|
|
|
|
$("#loading").css("visibility", "visible");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function hideLoading() {
|
|
|
|
|
$("#loading").css("visibility", "hidden");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 注销, 先清空cookie
|
2015-10-10 16:10:54 +08:00
|
|
|
|
function setCookie(c_name, value, expiredays) {
|
2015-01-08 00:36:28 +08:00
|
|
|
|
var exdate = new Date();
|
|
|
|
|
exdate.setDate(exdate.getDate() + expiredays);
|
2015-10-10 16:10:54 +08:00
|
|
|
|
document.cookie = c_name+ "=" + escape(value) + ((expiredays==null) ? "" : ";expires="+exdate.toGMTString()) + 'path=/';
|
|
|
|
|
document.cookie = c_name+ "=" + escape(value) + ((expiredays==null) ? "" : ";expires="+exdate.toGMTString()) + 'path=/note';
|
2015-01-08 00:36:28 +08:00
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
function logout() {
|
2015-11-28 21:31:56 +08:00
|
|
|
|
Note.curChangedSaveIt(true);
|
|
|
|
|
LEA.isLogout = true;
|
|
|
|
|
|
2015-01-08 00:36:28 +08:00
|
|
|
|
setCookie("LEANOTE_SESSION", '', -1);
|
2014-10-22 16:20:45 +08:00
|
|
|
|
location.href = UrlPrefix + "/logout?id=1";
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 得到图片width, height, callback(ret); ret = {width:11, height:33}
|
|
|
|
|
function getImageSize(url, callback) {
|
|
|
|
|
var img = document.createElement('img');
|
|
|
|
|
|
|
|
|
|
function done(width, height) {
|
|
|
|
|
img.parentNode.removeChild(img);
|
|
|
|
|
callback({width: width, height: height});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
img.onload = function() {
|
|
|
|
|
done(img.clientWidth, img.clientHeight);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
img.onerror = function() {
|
|
|
|
|
done();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
img.src = url;
|
|
|
|
|
|
|
|
|
|
var style = img.style;
|
|
|
|
|
style.visibility = 'hidden';
|
|
|
|
|
style.position = 'fixed';
|
|
|
|
|
style.bottom = style.left = 0;
|
|
|
|
|
style.width = style.height = 'auto';
|
|
|
|
|
|
|
|
|
|
document.body.appendChild(img);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 插件中使用
|
|
|
|
|
function hiddenIframeBorder() {
|
|
|
|
|
$('.mce-window iframe').attr("frameborder", "no").attr("scrolling", "no");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var email2LoginAddress = {
|
|
|
|
|
'qq.com': 'http://mail.qq.com',
|
|
|
|
|
'gmail.com': 'http://mail.google.com',
|
|
|
|
|
'sina.com': 'http://mail.sina.com.cn',
|
|
|
|
|
'163.com': 'http://mail.163.com',
|
|
|
|
|
'126.com': 'http://mail.126.com',
|
|
|
|
|
'yeah.net': 'http://www.yeah.net/',
|
|
|
|
|
'sohu.com': 'http://mail.sohu.com/',
|
|
|
|
|
'tom.com': 'http://mail.tom.com/',
|
|
|
|
|
'sogou.com': 'http://mail.sogou.com/',
|
|
|
|
|
'139.com': 'http://mail.10086.cn/',
|
|
|
|
|
'hotmail.com': 'http://www.hotmail.com',
|
|
|
|
|
'live.com': 'http://login.live.com/',
|
|
|
|
|
'live.cn': 'http://login.live.cn/',
|
|
|
|
|
'live.com.cn': 'http://login.live.com.cn',
|
|
|
|
|
'189.com': 'http://webmail16.189.cn/webmail/',
|
|
|
|
|
'yahoo.com.cn': 'http://mail.cn.yahoo.com/',
|
|
|
|
|
'yahoo.cn': 'http://mail.cn.yahoo.com/',
|
|
|
|
|
'eyou.com': 'http://www.eyou.com/',
|
|
|
|
|
'21cn.com': 'http://mail.21cn.com/',
|
|
|
|
|
'188.com': 'http://www.188.com/',
|
2015-09-05 23:30:24 +08:00
|
|
|
|
'foxmail.com': 'http://mail.foxmail.com'
|
2014-05-07 13:06:24 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function getEmailLoginAddress(email) {
|
|
|
|
|
if(!email) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var arr = email.split('@');
|
|
|
|
|
if(!arr || arr.length < 2) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var addr = arr[1];
|
|
|
|
|
return email2LoginAddress[addr] || "http://mail." + addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 返回是否是re.Ok == true
|
|
|
|
|
function reIsOk(re) {
|
|
|
|
|
return re && typeof re == "object" && re.Ok;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// marker
|
2014-06-08 17:57:19 +08:00
|
|
|
|
// 下拉扩展工具栏用, 点击文档导航用, 切换编辑模式时用
|
2014-05-07 13:06:24 +08:00
|
|
|
|
LEA.bookmark = null;
|
2014-06-05 19:04:39 +08:00
|
|
|
|
LEA.hasBookmark = false;
|
2014-05-07 13:06:24 +08:00
|
|
|
|
function saveBookmark() {
|
|
|
|
|
try {
|
2014-06-05 19:04:39 +08:00
|
|
|
|
LEA.bookmark = tinymce.activeEditor.selection.getBookmark(); // 光标, 为了处理后重新定位到那个位置
|
|
|
|
|
// 如果之前没有focus, 则会在文档开头设置bookmark, 添加一行, 不行.
|
|
|
|
|
// $p不是<p>, 很诡异
|
|
|
|
|
// 6-5
|
|
|
|
|
if(LEA.bookmark && LEA.bookmark.id) {
|
|
|
|
|
var $ic = $($("#editorContent_ifr").contents());
|
|
|
|
|
var $body = $ic.find("body");
|
|
|
|
|
var $p = $body.children().eq(0);
|
|
|
|
|
// 找到
|
|
|
|
|
if($p.is("span")) {
|
|
|
|
|
var $children = $p;
|
|
|
|
|
var $c = $children.eq(0);
|
|
|
|
|
if($c.attr("id") == LEA.bookmark.id + "_start") {
|
|
|
|
|
LEA.hasBookmark = false;
|
|
|
|
|
$c.remove();
|
|
|
|
|
} else {
|
|
|
|
|
LEA.hasBookmark = true;
|
|
|
|
|
}
|
|
|
|
|
} else if($p.is("p")) {
|
|
|
|
|
var $children = $p.children();
|
|
|
|
|
if($children.length == 1 && $.trim($p.text()) == "") {
|
|
|
|
|
var $c = $children.eq(0);
|
|
|
|
|
if($c.attr("id") == LEA.bookmark.id + "_start") {
|
|
|
|
|
LEA.hasBookmark = false;
|
|
|
|
|
$p.remove();
|
|
|
|
|
} else {
|
|
|
|
|
LEA.hasBookmark = true;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
LEA.hasBookmark = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
} catch(e) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function restoreBookmark() {
|
|
|
|
|
try {
|
2014-06-05 19:04:39 +08:00
|
|
|
|
if(LEA.hasBookmark) {
|
|
|
|
|
// 必须要focus()!!!
|
|
|
|
|
var editor = tinymce.activeEditor;
|
|
|
|
|
editor.focus();
|
|
|
|
|
editor.selection.moveToBookmark(LEA.bookmark);
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
} catch(e) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 是否是手机浏览器
|
2014-10-22 16:20:45 +08:00
|
|
|
|
// var u = navigator.userAgent;
|
|
|
|
|
// LEA.isMobile = /Mobile|Android|iPhone/i.test(u);
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// LEA.isMobile = u.indexOf('Android')>-1 || u.indexOf('Linux')>-1;
|
|
|
|
|
// LEA.isMobile = false;
|
|
|
|
|
//if($("body").width() < 600) {
|
|
|
|
|
// location.href = "/mobile/index";
|
|
|
|
|
//}
|
|
|
|
|
|
2014-10-22 16:20:45 +08:00
|
|
|
|
// 表单验证
|
|
|
|
|
var vd = {
|
|
|
|
|
isInt: function(o) {
|
|
|
|
|
var intPattern=/^0$|^[1-9]\d*$/; //整数的正则表达式
|
|
|
|
|
result=intPattern.test(o);
|
|
|
|
|
return result;
|
|
|
|
|
},
|
|
|
|
|
isNumeric: function(o) {
|
|
|
|
|
return $.isNumeric(o);
|
|
|
|
|
},
|
|
|
|
|
isFloat: function(floatValue){
|
|
|
|
|
var floatPattern=/^0(\.\d+)?$|^[1-9]\d*(\.\d+)?$/; //小数的正则表达式
|
|
|
|
|
result=floatPattern.test(floatValue);
|
|
|
|
|
return result;
|
|
|
|
|
},
|
|
|
|
|
isEmail: function(emailValue){
|
2015-03-31 14:27:26 +08:00
|
|
|
|
var emailPattern=/^([a-zA-Z0-9]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+@([a-zA-Z0-9\-]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+\.[0-9a-zA-Z]{2,3}$/; //邮箱的正则表达式
|
2014-10-22 16:20:45 +08:00
|
|
|
|
result=emailPattern.test(emailValue);
|
2015-03-31 14:27:26 +08:00
|
|
|
|
|
2014-10-22 16:20:45 +08:00
|
|
|
|
return result;
|
|
|
|
|
},
|
|
|
|
|
isBlank: function(o) {
|
|
|
|
|
return !$.trim(o);
|
|
|
|
|
},
|
|
|
|
|
has_special_chars: function(o) {
|
|
|
|
|
return /['"#$%&\^<>\?*]/.test(o);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// life
|
|
|
|
|
// 动态验证
|
|
|
|
|
// rules = {max: function() {}};
|
|
|
|
|
// <input data-rules='[{rule: 'requried', msg:"请填写标题"}]' data-msg_target="#msg"/>
|
|
|
|
|
init: function(form, rule_funcs) {
|
|
|
|
|
var get_val = function(target) {
|
|
|
|
|
if(target.is(":checkbox")) {
|
|
|
|
|
var name = target.attr('name');
|
|
|
|
|
var val = $('input[name="' + name + '"]:checked').length;
|
|
|
|
|
return val;
|
|
|
|
|
} else if(target.is(":radio")) {
|
|
|
|
|
} else {
|
|
|
|
|
return target.val();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var default_rule_funcs = {
|
|
|
|
|
// 必须输入
|
|
|
|
|
required: function(target) {
|
|
|
|
|
return get_val(target);
|
|
|
|
|
},
|
|
|
|
|
// 最少
|
|
|
|
|
min: function(target, rule) {
|
|
|
|
|
var val = get_val(target);
|
|
|
|
|
if(val === "" && !is_required(target)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if(val < rule.data) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
},
|
|
|
|
|
minLength: function(target, rule) {
|
|
|
|
|
var val = get_val(target);
|
|
|
|
|
if(val === "" && !is_required(target)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if(val.length < rule.data) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
},
|
|
|
|
|
email: function(target, rule) {
|
|
|
|
|
var val = get_val(target);
|
|
|
|
|
if(val === "" && !is_required(target)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2015-03-31 14:27:26 +08:00
|
|
|
|
return vd.isEmail(val);
|
2014-10-22 16:20:45 +08:00
|
|
|
|
},
|
|
|
|
|
noSpecialChars: function(target) {
|
|
|
|
|
var val = get_val(target);
|
|
|
|
|
if(!val) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if(/[^0-9a-zzA-Z_\-]/.test(val)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
},
|
|
|
|
|
password: function(target, rule) {
|
|
|
|
|
var val = get_val(target);
|
|
|
|
|
if(val === "" && !is_required(target)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return val.length >= 6
|
|
|
|
|
},
|
|
|
|
|
equalTo: function(target, rule) {
|
|
|
|
|
var val = get_val(target);
|
|
|
|
|
if(val === "" && !is_required(target)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return $(rule.data).val() == val;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
rule_funcs = rule_funcs || {};
|
|
|
|
|
rule_funcs = $.extend(default_rule_funcs, rule_funcs);
|
|
|
|
|
var rules = {}; // name对应的
|
|
|
|
|
var msg_targets = {};
|
|
|
|
|
// 是否是必须输入的
|
|
|
|
|
function is_required(target) {
|
|
|
|
|
var name = get_name(target);
|
|
|
|
|
var rules = get_rules(target, name);
|
|
|
|
|
var required_rule = rules[0];
|
|
|
|
|
if(required_rule['rule'] == "required") {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
// 先根据msg_target_name, 再根据name
|
|
|
|
|
function get_rules(target, name) {
|
|
|
|
|
if(!rules[name]) {
|
|
|
|
|
rules[name] = eval("(" + target.data("rules") + ")");
|
|
|
|
|
}
|
|
|
|
|
return rules[name];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 以name为索引, 如果多个input name一样, 但希望有不同的msg怎么办?
|
|
|
|
|
// 添加data-u_name=""
|
|
|
|
|
function get_msg_target(target, name) {
|
|
|
|
|
if(!msg_targets[name]) {
|
|
|
|
|
var t = target.data("msg_target");
|
|
|
|
|
if(!t) {
|
|
|
|
|
// 在其父下append一个
|
|
|
|
|
var msg_o = $('<div class="help-block alert alert-warning" style="display: block;"></div>');
|
|
|
|
|
target.parent().append(msg_o);
|
|
|
|
|
msg_targets[name] = msg_o;
|
|
|
|
|
} else {
|
|
|
|
|
msg_targets[name] = $(t);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return msg_targets[name];
|
|
|
|
|
}
|
|
|
|
|
function hide_msg(target, name) {
|
|
|
|
|
var msgT = get_msg_target(target, name);
|
|
|
|
|
// 之前是正确信息, 那么不隐藏
|
|
|
|
|
if(!msgT.hasClass("alert-success")) {
|
|
|
|
|
msgT.hide();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function show_msg(target, name, msg, msgData) {
|
|
|
|
|
var t = get_msg_target(target, name);
|
|
|
|
|
t.html(getMsg(msg, msgData)).removeClass("hide alert-success").addClass("alert-danger").show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证前修改
|
|
|
|
|
function pre_fix(target) {
|
|
|
|
|
var fix_name = target.data("pre_fix");
|
|
|
|
|
if(!fix_name) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
switch(fix_name) {
|
|
|
|
|
case 'int': int_fix(target);
|
|
|
|
|
break;
|
|
|
|
|
case 'price': price_fix(target);
|
|
|
|
|
break;
|
|
|
|
|
case 'decimal': decimal_fix(target);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证各个rule
|
|
|
|
|
// 正确返回true
|
|
|
|
|
function apply_rules(target, name) {
|
|
|
|
|
var rules = get_rules(target, name);
|
|
|
|
|
|
|
|
|
|
// 是否有前置fix data-pre_fix
|
|
|
|
|
pre_fix(target);
|
|
|
|
|
|
|
|
|
|
if(!rules) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
for(var i = 0; i < rules.length; ++i) {
|
|
|
|
|
var rule = rules[i];
|
|
|
|
|
var rule_func_name = rule.rule;
|
|
|
|
|
var msg = rule.msg;
|
|
|
|
|
var msgData = rule.msgData;
|
|
|
|
|
if(!rule_funcs[rule_func_name](target, rule)) {
|
|
|
|
|
show_msg(target, name, msg, msgData);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hide_msg(target, name);
|
|
|
|
|
|
|
|
|
|
// 这里, 如果都正确, 是否有sufix验证其它的
|
|
|
|
|
var post_rule = target.data('post_rule');
|
|
|
|
|
if(post_rule) {
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
var post_target = $(post_rule);
|
|
|
|
|
apply_rules(post_target, get_name(post_target));
|
|
|
|
|
},0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function focus_func(e) {
|
|
|
|
|
var target = $(e.target);
|
|
|
|
|
var name = get_name(target);
|
|
|
|
|
// 验证如果有错误, 先隐藏
|
|
|
|
|
hide_msg(target, name);
|
|
|
|
|
|
|
|
|
|
// key up的时候pre_fix
|
|
|
|
|
pre_fix(target);
|
|
|
|
|
}
|
|
|
|
|
function unfocus_func(e) {
|
|
|
|
|
var target = $(e.target);
|
|
|
|
|
var name = get_name(target);
|
|
|
|
|
// 验证各个rule
|
|
|
|
|
apply_rules(target, name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// u_name是唯一名, msg, rule的索引
|
|
|
|
|
function get_name(target) {
|
|
|
|
|
return target.data('u_name') || target.attr("name") || target.attr("id");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var $allElems = $(form).find('[data-rules]');
|
|
|
|
|
var $form = $(form);
|
|
|
|
|
$form.on({
|
|
|
|
|
keyup: function(e) {
|
|
|
|
|
if(e.keyCode != 13) { // 不是enter
|
|
|
|
|
focus_func(e)
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
blur: unfocus_func,
|
|
|
|
|
}, 'input[type="text"], input[type="password"]');
|
|
|
|
|
$form.on({
|
|
|
|
|
change: function(e) {
|
|
|
|
|
if($(this).val()) {
|
|
|
|
|
focus_func(e);
|
|
|
|
|
} else {
|
|
|
|
|
unfocus_func(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, 'select');
|
|
|
|
|
$form.on({
|
|
|
|
|
change: function(e) {
|
|
|
|
|
unfocus_func(e);
|
|
|
|
|
}
|
|
|
|
|
}, 'input[type="checkbox"]');
|
|
|
|
|
|
|
|
|
|
// 验证所有的
|
|
|
|
|
this.valid = function() {
|
|
|
|
|
var $ts = $allElems;
|
|
|
|
|
var is_valid = true;
|
|
|
|
|
for(var i = 0; i < $ts.length; ++i) {
|
|
|
|
|
var target = $ts.eq(i);
|
|
|
|
|
var name = get_name(target);
|
|
|
|
|
// 验证各个rule
|
|
|
|
|
if(!apply_rules(target, name)) {
|
|
|
|
|
is_valid = false;
|
|
|
|
|
target.focus();
|
|
|
|
|
return false
|
|
|
|
|
} else {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return is_valid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证某一元素(s)
|
|
|
|
|
// .num-in, #life
|
|
|
|
|
this.validElement = function(targets) {
|
|
|
|
|
var targets = $(targets);
|
|
|
|
|
var ok = true;
|
|
|
|
|
for(var i = 0; i < targets.length; ++i) {
|
|
|
|
|
var target = targets.eq(i);
|
|
|
|
|
var name = get_name(target);
|
|
|
|
|
// 验证各个rule
|
|
|
|
|
if(!apply_rules(target, name)) {
|
|
|
|
|
ok = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ok;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-12-09 23:17:36 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 返回hash的#a=1&b=3 返回{a:1, b:3}
|
|
|
|
|
function getHashObject() {
|
|
|
|
|
var hash = location.hash; // #life
|
|
|
|
|
if(!hash) {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
var hashKV = hash.substr(1);
|
|
|
|
|
var kvs = hashKV.split("&");
|
|
|
|
|
var kvsObj = {};
|
|
|
|
|
for(var i = 0; i < kvs.length; ++i) {
|
|
|
|
|
var kv = kvs[i].split('=');
|
|
|
|
|
if(kv.length == 2) {
|
|
|
|
|
kvsObj[kv[0]] = kv[1];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return kvsObj;
|
|
|
|
|
}
|
|
|
|
|
function getHash(key, value) {
|
|
|
|
|
var kvs = getHashObject();
|
|
|
|
|
return kvs[key];
|
|
|
|
|
}
|
|
|
|
|
function setHash(key, value) {
|
|
|
|
|
var hash = location.hash; // #life
|
|
|
|
|
if(!hash) {
|
|
|
|
|
location.href = "#" + key + "=" + value;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var kvs = getHashObject();
|
|
|
|
|
kvs[key] = value;
|
|
|
|
|
var str = "";
|
|
|
|
|
for(var i in kvs) {
|
|
|
|
|
if(kvs[i]) {
|
|
|
|
|
if(str) {
|
|
|
|
|
str += "&";
|
|
|
|
|
}
|
|
|
|
|
str += i + '=' + kvs[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
location.href = "#" + str;
|
2015-03-31 14:27:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
2015-06-15 18:01:48 +08:00
|
|
|
|
var trimTitle = function(title) {
|
2015-09-05 23:30:24 +08:00
|
|
|
|
if(!title || typeof title != 'string') {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
return title.replace(/</g, "<").replace(/>/g, ">");
|
|
|
|
|
// return title.replace(/<.*?script.*?>/g, '');
|
2015-10-17 15:51:21 +08:00
|
|
|
|
};
|