//应用扩展 var TKJ = { config: { NOTICEFREQUENCY: 30 * 1000, AVATARSIZE: { "small": 30, "normal": 45, "big": 90 } }, common: { copy: function(obj, txt, success) { var self = this; $(obj).each(function() { var content = txt; if (typeof ZeroClipboard == "undefined") return false; this.clip = null; if ($.isFunction(txt)) { content = txt.call(this); } ZeroClipboard.setMoviePath(Cute.config.SCRIPTPATH + "ZeroClipboard.swf"); this.clip = new ZeroClipboard.Client(); this.clip.setHandCursor(true); this.clip.setText(content); this.clip.addEventListener('onComplete', success); $(window).resize(function() { this.clip.reposition(); }.bind(this)); this.clip.glue(this); return this.clip; }); }, //ajax加载ajax/write里的页面,一样的内容,只会加载一次 write: function(id, params, fn) { if (!id) return; if (arguments.length < 3) { cache = fn; fn = params; params = {}; } var cachekey = "write" + id; if (params.cachekey) cachekey = params.cachekey; //设置cache的key值,默认为write + 文件ID if (!$(document).data(cachekey)) { Cute.api.get("write", $.extend({ id: id }, params || {}), function(html) { if (html) { $(document).data(cachekey, html); fn(html); } }, false, true); } else { fn($(document).data(cachekey)); } }, bgcolorAnimation: function(obj, color) { Do('animatecolors', function() { obj = $(obj); obj.stop(false, true).focus(); var _o_bgcolor = obj.css("backgroundColor"); obj.css({ backgroundColor: color || "#FFC8C8" }).animate({ backgroundColor: _o_bgcolor }, 1000, function() { this.style.cssText = this.style.cssText.replace(/background\-color[^;]+;/i, ''); }); }); return false; }, showEmoji: function(obj, input, parentEl) { var obj = $(obj); if (obj[0].dialog) { obj[0].dialog.toggle(); } else { Cute.api.get('common/get_emoji', {}, function(json) { var html = ""; $.each(json.data, function(i, item) { html += '<a rel="' + item[0] + '" href="javascript:;" title="' + item[0] + '"><span class="e e' + item[1] + '"></span></a>'; }); obj[0].dialog = new Cute.ui.dialog().tooltip("layer", "", { content: '<div class="d_emoji d_content">' + html + '</div>', className: "tooltip emoji_dialog", parentEl: parentEl, width: 326, pos: { "top": function() { return (parentEl ? obj.position().top : obj.offset().top) + obj.outerHeight() + 2; }, "left": function() { return (parentEl ? obj.position().left : obj.offset().left) - 1; } } }); var form = obj.closest("form"); $(".d_emoji a", obj[0].dialog.pannel).click(function(e) { var _this = $(this); Cute.common.insertSelection(form.find(input || "textarea[name=content]")[0], "[" + _this.attr("rel") + "]"); form.find(input || "textarea[name=content]").trigger("keyup").css("color", "#000").trigger("keyup"); obj[0].dialog.hide(); e.preventDefault(); e.stopPropagation(); }); form.out("click.emoji", function(e) { if (!obj[0].dialog.pannel) { form.unout("click.emoji"); return; } if ($(this).has(e.target).length == 0) { obj[0].dialog.hide(); } }, true); }); } return false; }, emoji: function(str) { if (window['jEmoji']) { if (!jEmoji.EXT_EMOJI_MAP) jEmoji.EXT_EMOJI_MAP = TKJ.config.EXT_EMOJI_MAP || {}; return jEmoji.unifiedToHTML(jEmoji.softbankToUnified(jEmoji.googleToUnified(str))); } else { return str; } }, blockSlide: function(options) { var self = this; var opt = $.extend(true, { width: 468, //宽度 height: null, //高度 data: [], //广告列表,例:[{url:"",image:"",title:"",target:""}], random: false, showpage: true, interval: 5, //轮播间隔 transition: 1000, style: '', styleurl: "" //特殊样式URL }, options); var iframe = $('<iframe />', { frameborder: 0, width: opt.width }).css("visibility", 'hidden').load(function() { var iDoc = iframe.contents(); var _html = []; var _head = "<style>" + "html{overflow:hidden}" + "body{margin:0;padding:0;font-family:Arial;-webkit-text-size-adjust:none;overflow:hidden;position:relative;width:100%;height:100%}" + "img{border:0;}" + ".ad_list,.ad_ids{margin:0;padding:0;list-style:none;}" + ".ad_list li{ position:absolute;top:0;left:0;display:none;}" + ".ad_ids{position:absolute;bottom:10px; right:10px;z-index:50;}" + ".ad_ids li{float:left;margin-left:4px;}" + ".ad_ids li a{display:inline-block;font-size:9px;padding:2px 4px; border:1px solid #c5c3c4;background-color:#c5c3c4;text-decoration:none;color:#c5c3c4 ;zoom:1;}" + ".ad_ids li a:hover{text-decoration:none;}" + ".ad_ids li a.curr{border-color:#da8630;color:#da8630;background-color:#da8630;}" + opt.style + "</style>"; if (opt.styleurl) _head += '<link type="text/css" rel="stylesheet" href="' + opt.styleurl + '" />'; iDoc.find("head").html(_head); var content = iDoc.find("body"); var flag=0; if (opt.data.length > 0) { if (opt.random) opt.data = Cute.Array.shuffle(opt.data); $(this).css('visibility', 'visible'); _html.push('<ul class="ad_list">'); $.each(opt.data, function(i, item) { _html.push('<li><a href="' + item.url + '" target="' + (item.target ? item.target : "_blank") + '"><img dynamic-src="' + item.image + '" alt="' + item.title + '" title="' + item.title + '" width="' + opt.width + '" ' + (opt.height ? 'height="' + opt.height + '"' : '') + ' /></a></li>'); }); _html.push('</ul>'); if (opt.data.length > 1 && opt.showpage) { _html.push('<ul class="ad_ids">'); $.each(opt.data, function(i, item) { _html.push('<li><a href="javascript:void(0)">' + (i + 1) + '</a></li>'); }); _html.push('</ul>'); } var html = $(_html.join('')); html.find('img').on('load', function(){ if(!opt.height && this.height) iframe.height(this.height); }); content.append(html).find(".ad_ids a").click(function() { setAdItem(parseInt($(this).text()) - 1); }); $(".preBg").click(function() { flag-=1; if(flag<0){ flag=opt.data.length-1; } setAdItem(flag); }); $(".nextBg").click(function() { flag+=1; if(flag>opt.data.length-1){ flag=0; } setAdItem(flag); }); setAdItem(0); } function setAdItem(num) { if (num > opt.data.length - 1) { num = 0; } var _ulList = iDoc.find(".ad_list"); var _ulIds = iDoc.find(".ad_ids"); _ulList.children("li").filter(":visible").stop(true, true).fadeOut(opt.transition, function() { $(this).css("z-index", 0); }).end().eq(num).css("z-index", 1).stop(true, true).fadeIn(opt.transition); var img = _ulList.find("img").filter(":eq(" + num + "),:eq(" + (num + 1 > opt.data.length - 1 ? 0 : (num + 1)) + ")").attr("src", function() { var src = $(this).attr("dynamic-src"); $(this).removeAttr("dynamic-src"); return src; }).trigger('load'); if (opt.data.length > 1) { _ulIds.find("a").removeClass().eq(num).addClass("curr"); clearTimeout(self.timer); self.timer = setTimeout(function() { setAdItem(num + 1); }, opt.interval * 1000); } flag=num } }); if(opt.height){ iframe.height(opt.height); } return iframe; }, makeLink: function(str) { // http://, https://, ftp:// var urlPattern = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim; // www. sans http:// or https:// var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim; // Email addresses var emailAddressPattern = /([a-z0-9\-_\.]+?)@([{a-z0-9\/\-_+=.~!%@?#&;:$\|}]+)/gim; // if(!str) // return ''; return str .replace(urlPattern, function(s, t) { return '<a href="' + s + '" target="_blank" title="' + s + '">' + Cute.String.cut(s, 50, '...') + '</a>'; }) .replace(pseudoUrlPattern, '$1<a href="http://$2" target="_blank" title="$2">$2</a>') .replace(emailAddressPattern, '<a href="mailto:$1@$2">$1@$2</a>'); }, editor: function(el, options) { // var policy = { // 'bucket' : 'tukeji-upload', // 'expiration' : Math.floor(new Date().getTime() / 1000) + 1800, // 'save-key': '/tipsimg/{year}{mon}/{random32}{.suffix}', // 'allow-file-type' : 'jpg,jpeg,png,gif', // 'content-length-range' : '0,10240000', // 'return-url' : TKJ.config.SITEURL + '/api/tips/upload_callback', // 'x-gmkerl-quality' : 100, // 'x-gmkerl-unsharp' : false // }; //policy = Cute.String.base64_encode(Cute.Json.stringify(policy)) var policy = { 'scope': 'upload', 'deadline': Math.floor(new Date().getTime() / 1000) + 7200, 'returnUrl': TKJ.config.SITEURL + '/api/tips/upload_callback/trip_id', 'returnBody': '{"hash": $(etag), "key": $(key), "image-width": $(imageInfo.width), "image-height": $(imageInfo.height)}' }; policy = Cute.String.base64_encode(Cute.Json.stringify(policy)).replace(/\+/gi, '-').replace(/\//gi, '_'); var encodedSign = Cute.String.base64_encode(CryptoJS.HmacSHA1(policy, 'O_zZSj1oD9017pzPooIGxx1SBdW9OGv8m57BQELv').toString(CryptoJS.enc.Latin1)).replace(/\+/gi, '-').replace(/\//gi, '_'); var token = 'I_HIbxjxSz6e71PfGl08HUqNQIJTTE-evRJuwDPG:' + encodedSign + ':' + policy; return $(el)[0].editor = UE.getEditor($(el).attr('id'), $.extend({ localDomain: [TKJ.config.SITEURL.replace('http://', '')], initialContent: '', contextMenu: [], wordCount: false, removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var', autoHeightEnabled: false, indentValue: '0em', allowDivTransToP: true, initialFrameWidth: $(el).outerWidth(), initialFrameHeight: $(el).outerHeight(), //policy: policy, //signature: md5(policy + '&gFh8MLAgV4WytOjDEizHn07k3DQ='), token: token, initialStyle: 'body{font-size:14px; margin:8px 7px; }.silver{color:#999}.word_img{background:url(/static/js/plugin/upyun-ueditor/lang/zh-cn/images/localimage.png) no-repeat center center;border:1px solid #ddd}.edui-faked-video{background:url(/static/js/plugin/upyun-ueditor/themes/default/images/videologo.gif) no-repeat center center;border:1px solid #ddd}img{max-width:580px;border:none;}p{line-height:1.6;}', scaleEnabled: true, removeFormatAttributes: 'class,style,lang,width,height,hspace', elementPathEnabled: true, catchRemoteImageEnable: false, toolbars: [ ['fullscreen', 'undo', 'redo', '|', 'bold', 'italic', 'underline', 'strikethrough', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', '|', 'link', 'unlink', 'anchor', '|', 'insertimage', 'insertvideo', 'gmap', 'wordimage', '|', 'horizontal', 'spechars', 'removeformat', '|', 'searchreplace', '|', 'preview'] ], retainOnlyLabelPasted: true, pasteplain:true, autotypeset: { mergeEmptyline: true, //合并空行 removeClass: true, //去掉冗余的class removeEmptyline: true, //去掉空行 textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 pasteFilter: true, //根据规则过滤没事粘贴进来的内容 clearFontSize: true, //去掉所有的内嵌字号,使用编辑器默认的字号 clearFontFamily: true, //去掉所有的内嵌字体,使用编辑器默认的字体 removeEmptyNode: false, // 去掉空节点 //可以去掉的标签 removeTagNames: {}, indent: false, // 行首缩进 indentValue : '2em', //行首缩进的大小 bdc2sb: false, tobdc: false }, "filterTxtRules": function(){ function transP(node){ node.tagName = 'p'; node.setStyle(); } return { //直接删除及其字节点内容 '-' : 'script style object iframe embed input select table', 'p': {$:{}}, 'br':{$:{}}, 'img':{ $: { 'width': 1, 'height': 1, 'word_img': 1, 'src': 1, 'class': 1, '_url': 1 } }, 'div':transP, 'li':{'$':{}}, 'caption':transP, 'th':transP, 'tr':transP, 'h1':{'$':{}},'h2':{'$':{}},'h3':{'$':{}},'h4':{'$':{}},'h5':{'$':{}},'h6':{'$':{}}, 'td':function(node){ //没有内容的td直接删掉 var txt = !!node.innerText(); if(txt){ node.parentNode.insertAfter(UE.uNode.createText(' '),node); } node.parentNode.removeChild(node,node.innerText()) } } }, filterRules: { br: {}, b: function(node) { node.tagName = 'strong' }, strong: { $: {} }, img: { $: { 'width': 1, 'height': 1, 'word_img': 1, 'src': 1, 'class': 1, '_url': 1 } }, p: { 'br': 1, 'BR': 1, 'img': 1, 'IMG': 1, 'embed': 1, 'object': 1, $: {} }, span: { $: { 'class': 1 } }, strong: { $: {} }, i: function(node) { node.tagName = 'em' }, a: function(node) { var url = node.getAttr('href'); var title = node.getAttr('title'); if(!node.firstChild()){ node.parentNode.removeChild(node); return; } node.setAttr(); node.setAttr('href', url); node.setAttr('title', title); node.setAttr('target', '_blank'); //a:{$:{'href': 1,'title': 1, 'target':1}}, }, object: 1, embed: 1, dl: function(node) { node.tagName = 'ul'; node.setAttr() }, dt: function(node) { node.tagName = 'li'; node.setAttr() }, dd: function(node) { node.tagName = 'li'; node.setAttr() }, li: function(node) { var className = node.getAttr('class'); if (!className || !/list\-/.test(className)) { node.setAttr() } var tmpNodes = node.getNodesByTagName('ol ul'); UE.utils.each(tmpNodes, function(n) { node.parentNode.insertAfter(n, node); }) }, div: function(node) { node.tagName = 'p'; node.setAttr(); }, ol: { $: {} }, ul: { $: {} }, table: function(node) { UE.utils.each(node.getNodesByTagName('table'), function(t) { UE.utils.each(t.getNodesByTagName('tr'), function(tr) { var p = UE.uNode.createElement('p'), child, html = []; while (child = tr.firstChild()) { html.push(child.innerHTML()); tr.removeChild(child); } p.innerHTML(html.join(' ')); t.parentNode.insertBefore(p, t); }) t.parentNode.removeChild(t) }); var val = node.getAttr('width'); node.setAttr(); if (val) { node.setAttr('width', val); } }, tbody: { $: {} }, caption: { $: {} }, th: { $: {} }, td: { $: { valign: 1, align: 1, rowspan: 1, colspan: 1, width: 1, height: 1 } }, tr: { $: {} }, h3: { $: {} }, h2: { $: {} }, '-': 'script style meta iframe select input button' }, onready: function(){ this.on('showmessage', function(type, m){ if (m['content'] == '本地保存成功') { return true; } }); } }, options || {})); } }, get_upload_url: function(url, type, size) { if (!url) { if (size !== undefined) { var thumPrefix = TKJ.config[type.toLowerCase()]['thumbPrefix'].split(','); return TKJ.config.UPLOAD + "/images/no_" + type.toLowerCase() + ".png!" + thumPrefix[size]; } else { return TKJ.config.UPLOAD + "/images/no_" + type.toLowerCase() + ".png"; } } else { if (size !== undefined) { var thumPrefix = TKJ.config[type.toLowerCase()]['thumbPrefix'].split(','); var filename = url + '!' + thumPrefix[size]; } else { var filename = url; } return TKJ.config.UPLOAD + "/" + TKJ.config[type.toLowerCase()]['path'] + "/" + filename; } }, validator_fun: function(msg, o, cssctl) { var parent = o.obj.closest('td,p,div'); if (parent.find(".Validform_checktip").length > 0) { var obj = parent.find(".Validform_checktip").html(msg); } else { var obj = $('<span class="Validform_checktip">' + msg + '</span>').insertAfter(o.obj); } if (o.type != 2 || o.obj.attr('ajaxurl')) { cssctl(obj, o.type); } else { obj.remove(); } } };