// --------------------- 命名空间 // 最上级变量 var LEA = {}; // 命名空间 var Notebook = { cache: {}, // notebookId => {Title, Seq} } var Note = { cache: {}, // noteId => {Title, Tags, Content, Desc} }; // var UserInfo = {}; // 博客有问题, 会覆盖 var Tag = {}; var Notebook = {}; var Share = {}; // markdown var Converter; var MarkdownEditor; var ScrollLink; //--------------------- // 公用方法 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; } // 判断数组是否相等 function arrayEqual(a, b) { a = a || []; b = b || []; return a.join(",") == b.join(","); } //是否是数组 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") { alert("你还没有登录, 请先登录!"); 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) { log("-------------------ajax:"); log(url); log(param); if(typeof async == "undefined") { async = true; } else { async = false; } $.ajax({ 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) { _ajax("GET", url, param, successFunc, failureFunc, async); } /** * 发送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) { log("-------------------ajaxPostJson:"); log(url); log(param); // 默认是异步的 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); }); */ //----------------- // 切换编辑器时要修改tabIndex function editorIframeTabindex(index) { var $i = $("#editorContent_ifr"); if($i.size() == 0) { setTimeout(function() { editorIframeTabindex(index); }, 100); } else { $i.attr("tabindex", index); } } //切换编辑器 function switchEditor(isMarkdown) { // 富文本永远是2 if(!isMarkdown) { $("#editor").show(); $("#mdEditor").css("z-index", 1); // 刚开始没有 editorIframeTabindex(2); $("#wmd-input").attr("tabindex", 3); $("#leanoteNav").show(); } else { $("#mdEditor").css("z-index", 3).show(); editorIframeTabindex(3); $("#wmd-input").attr("tabindex", 2); $("#leanoteNav").hide(); } } // editor 设置内容 // 可能是tinymce还没有渲染成功 var previewToken = "<div style='display: none'>FORTOKEN</div>" function setEditorContent(content, isMarkdown, preview) { if(!content) { content = ""; } if(!isMarkdown) { $("#editorContent").html(content); var editor = tinymce.activeEditor; if(editor) { editor.setContent(content); editor.undoManager.clear(); // 4-7修复BUG } else { // 等下再设置 setTimeout(function() { setEditorContent(content, false); }, 100); } } else { $("#wmd-input").val(content); $("#wmd-preview").html(""); // 防止先点有的, 再点tinymce再点没内容的 if(!content || preview) { // 没有内容就不要解析了 $("#wmd-preview").html(preview).css("height", "auto"); if(ScrollLink) { ScrollLink.onPreviewFinished(); // 告诉scroll preview结束了 } } 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 { // 等下再设置 setTimeout(function() { setEditorContent(content, true, preview); }, 200); } } } } // preview是否为空 function previewIsEmpty(preview) { if(!preview || preview.substr(0, previewToken.length) == previewToken) { return true; } return false; } // 有tinymce得到的content有<html>包围 function getEditorContent(isMarkdown) { if(!isMarkdown) { var editor = tinymce.activeEditor; if(editor) { var content = $(editor.getBody()); // 去掉恶心的花瓣注入 // <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 { return [$("#wmd-input").val(), $("#wmd-preview").html()] } } // 禁用编辑 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(); } } //--------------- // notify $(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' }); } //----------- // 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}); } function hideDialogRemote() { $("#leanoteDialogRemote").modal('hide'); } //--------------- // notify $(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 ""; } 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) { var ifrParent = $("#editorContent_ifr").parent(); ifrParent.css("overflow", "auto"); var height = $("#editorContent").height(); ifrParent.height(height); // log(height + '---------------------------------------') $("#editorContent_ifr").height(height); /* // 第一次时可能会被改变 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) { btnPreText = $(btnId).html(); $(btnId).html("正在处理").addClass("disabled"); } ajaxPost(url, param, function(ret) { if(btnPreText) { $(btnId).html(btnPreText).removeClass("disabled"); } if (typeof ret == "object") { if(typeof func == "function") { func(ret); } } else { alert("leanote出现了错误!"); } }); } // 是否是正确的email function isEmail(email) { var myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[0-9a-zA-Z]{2,3}$/; 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) { msg(msgId, selfBlankMsg || "请输入邮箱"); } else if(!isEmail(val)) { msg(msgId, selfInvalidMsg || "请输入正确的邮箱"); } 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 function logout() { $.removeCookie("LEANOTE_SESSION"); location.href = "/logout?id=1"; } // 得到图片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/', 'foxmail.coom': 'http://www.foxmail.com' }; 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 // 下拉扩展工具栏用, 点击文档导航用 LEA.bookmark = null; function saveBookmark() { try { bookmark = tinymce.activeEditor.selection.getBookmark(); // 光标, 为了处理后重新定位到那个位置 } catch(e) { } } function restoreBookmark() { try { // 必须要focus()!!! var editor = tinymce.activeEditor; editor.focus(); editor.selection.moveToBookmark(LEA.bookmark); } catch(e) { } } // 是否是手机浏览器 var u = navigator.userAgent; LEA.isMobile = /Mobile|Android|iPhone/i.test(u); // LEA.isMobile = u.indexOf('Android')>-1 || u.indexOf('Linux')>-1; // LEA.isMobile = false; //if($("body").width() < 600) { // location.href = "/mobile/index"; //} // 国际化 i18n function getMsg(key) { return MSG[key] || key; }