<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">(function ($) {
    if($.fn.TCSayPub) {//避免重复初始化
        return;
    }
    var debug = function(){
        if (window.console &amp;&amp; typeof console.log === 'function') {
            console.log.apply(console, arguments);
        }
        if (window.console &amp;&amp; typeof console.log === 'object') { //ie8|9
            Function.prototype.apply.apply(console.log, [console, arguments]);
        }
    };
    //类:Say
    var Say = function ($Container, options) {

            this._init($Container, options); //调用初始化方法

        },
        _helpers = {}; //辅助函数集合


    //扩展_helpers
    $.extend(_helpers, {
        getMaxZindex: function () {//获取页面最大z-index
            var $Zindexs = $("body &gt; *").filter(function () {
                    return $(this).css("z-index") !== 'undefined' &amp;&amp; $(this).css("z-index") !== 'auto';
                }),
                arrZindexs = $Zindexs.map(function () {
                    return +$(this).css("z-index");
                }).toArray();

            return arrZindexs.length === 0 ? 0 : Math.max.apply(Math, arrZindexs);
        },
        loadImg: function (opitons) {//动态加载图片,返回img对象,可同时设定显示尺寸
            var img = new Image(),
                isSupportMaxW = ('maxWidth' in img.style), //是否支持'maxWidth'和'maxHeight'
                fnFixSize = function (width, height) {//ie6调整显示尺寸
                    if(opitons.width !== 'auto' || opitons.height !== 'auto') {//固定尺寸的图片则直接返回
                        return;
                    }
                    if(!!opitons.maxWidth &amp;&amp; !opitons.maxHeight) {//限宽不限高
                        img.style.width = Math.min(opitons.maxWidth, width) + 'px';
                        return;
                    }
                    else if(!opitons.maxWidth &amp;&amp; !!opitons.maxHeight) {//限高不限宽
                        img.style.height = Math.min(opitons.maxHeight, height) + 'px';
                        return;
                    }
                    else if(!!opitons.maxWidth &amp;&amp; !!opitons.maxHeight) {//限宽限高
                        img.style.width = Math.min(opitons.maxWidth, width * opitons.maxHeight / height, width) + 'px';
                        return;
                    }
                },
                fnLoaded = function () {
                    if(!isSupportMaxW) {
                        img.onload = null; //ie6加载gif图片会重复触发onload
                        fnFixSize(img.width, img.height); //调整显示尺寸
                    }
                    opitons.onLoad.call(img); //调用回调函数 
                };
            opitons = {
                src: opitons.src || '', //图片地址
                alt: opitons.alt || '', //图片替换文字
                title: opitons.title || '', //鼠标悬移提示文字
                width: opitons.width || 'auto', //图片显示宽度
                height: opitons.height || 'auto', //图片显示高度
                maxWidth: opitons.maxWidth || '', //图片最大显示宽度
                maxHeight: opitons.maxHeight || '', //图片最大显示高度
                onLoad: opitons.onLoad || function () { } //加载完成事件,this指向返加的img对象
            };
            if(!opitons.src) {
                return;
            }

            img.setAttribute('src', opitons.src); //加载图片
            img.setAttribute('alt', opitons.alt); //图片替换文字
            img.setAttribute('title', opitons.title); //图片替换文字
            img.setAttribute('width', opitons.width); //设置显示宽度
            img.setAttribute('height', opitons.height); //设置显示高度

            //ie7|8默认只显示1px*1px,添加宽高属性就可以正常显示了，原因不详
            img.style.width = opitons.width;
            img.style.height = opitons.height;

            if(!!opitons.maxWidth &amp;&amp; isSupportMaxW) {//最大宽度
                img.style.maxWidth = opitons.maxWidth + 'px';
            }
            if(!!opitons.maxHeight &amp;&amp; isSupportMaxW) {//最大高度
                img.style.maxHeight = opitons.maxHeight + 'px';
            }

            if(img.complete) {
                fnLoaded();
            }
            else {
                img.onload = function () {
                    fnLoaded();
                }
            }
            img.onerror = function () {
                window.console &amp;&amp; window.console.log('加载图片出错');
            }

            return img;
        },
        loadSource: function (arrSource, callback) {//动态加载脚本或样式
            var hasCallBack = false, //是否已执行过回调函数，ie6有时会执行两次...
                nLoaded = 0, //加载完成统计
                nRequest = arrSource.length, //请求数
                head = document.getElementsByTagName('head')[0],
                fnRun = function () {
                    if(!!callback &amp;&amp; !!nLoaded &amp;&amp; nLoaded === nRequest &amp;&amp; !hasCallBack) {
                        hasCallBack = true;
                        callback();
                    }
                },
                arr = [],
                regJs = /.+\.js$/i,
                regCss = /.+\.css$/i,
                fnLoad = function (sSrc) {
                    var
                        source;
                    if(regJs.test(sSrc)) {
                        source = document.createElement('script');
                        source.type = 'text/javascript';
                        source.src = sSrc + '?preventCaching=' + Math.floor(Math.random() * Math.pow(10, 13)); //避免缓存
                    }
                    else if(regCss.test(sSrc)) {
                        source = document.createElement('link');
                        source.rel = 'stylesheet';
                        source.href = sSrc + '?preventCaching=' + Math.floor(Math.random() * Math.pow(10, 13)); //避免缓存
                    }
                    else {
                        return;
                    }
                    head.appendChild(source);

                    if(!!callback) {
                        if('onload' in source) {
                            source.onload = function () {

                                nLoaded++;
                                fnRun();
                            };
                        }
                        else {
                            source.attachEvent('onreadystatechange', function () {

                                if(source.readyState === "loaded" || source.readyState === "complete") {
                                    source.onreadystatechange = null;
                                    nLoaded++;
                                    fnRun();
                                }
                            });
                        }
                    }
                };

            for(var i = 0; i &lt; nRequest; i++) {
                fnLoad(arrSource[i]);
            }
        },
        getFlashVertion: function () {//获取flash版本号，不支持的返回'0,0,0'
            try {
                try {
                    // avoid fp6 minor version lookup issues
                    // see: http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/
                    var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
                    try {
                        axo.AllowScriptAccess = 'always';
                    } catch(e) { return '6,0,0'; }

                } catch(e) {

                }
                return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];

                // other browsers
            } catch(e) {

                try {
                    if(navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) {
                        return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
                    }
                } catch(e) { }
            }
            return '0,0,0';
        },
        createLocalStorage: function (nID, maxBytes) {//创建一个本地存储对象
            var sID = 'memory_' + nID || 'tc108.com', //唯一标识,保证在硬盘的唯一性
                memory,
                fnGetBytes = function (sInput) {
                    return sInput ? sInput.replace(/[^\x00-\xff]/gi, "--").length : 0;
                },
                isSupportW3C = !!window.localStorage;
            maxBytes = maxBytes || 15 * 1024, //对象允许存储的最大字节数
            sID = sID + '_';
            if(!isSupportW3C) {
                memory = document.createElement("div");
                memory.style.display = "none";
                memory.style.behavior = "url('#default#userData')";
                document.body.insertBefore(memory, document.body.firstChild); //不用append,dom未加载完用append会报错
                memory.load(sID); //加载存储文件			
            }

            return {
                'sID': sID, //唯一编号
                'read': (function () {//读取数据
                    if(isSupportW3C) {
                        return function (name) {
                            return window.localStorage.getItem(sID + name) || null;
                        }
                    }
                    else {
                        return function (name) {
                            return memory.getAttribute(name) || null;
                        }
                    }
                })(),
                'write': (function () {//写入数据，会覆盖选前已存在的name的value
                    if(isSupportW3C) {
                        return function (name, value) {
                            var
                                nOldBytes = fnGetBytes(window.localStorage.getItem(sID + name) || ""), //先前相应字段的字节数
                                newBytes = (this.bytes || 0) + fnGetBytes(value) - nOldBytes; //将产生的新的字节数

                            if(newBytes &gt; maxBytes) {//超过最大限制则不存入
                                return;
                            }
                            window.localStorage.setItem(sID + name, value);
                            this.bytes = newBytes; //更新占用字节数
                        }
                    }
                    else {
                        return function (name, value) {
                            var
                                nOldBytes = fnGetBytes(memory.getAttribute(name) || ""), //先前相应字段的字节数
                                newBytes = (this.bytes || 0) + fnGetBytes(value) - nOldBytes; //将产生的新的字节数

                            if(newBytes &gt; maxBytes) {//超过最大限制则不存入
                                return;
                            }
                            memory.setAttribute(name, value);
                            memory.save(sID); //存入
                            this.bytes = newBytes; //更新占用字节数
                        }
                    }
                })(),
                'remove': (function () {//删除某一条数据
                    if(isSupportW3C) {
                        return function (name) {
                            window.localStorage.removeItem(sID + name);
                            this.bytes = this.bytes - fnGetBytes(window.localStorage.getItem(sID + name) || ""); //更新占用字节数
                        }
                    }
                    else {
                        return function (name) {
                            memory.removeAttribute(name);
                            memory.save(sID); //存入
                            this.bytes = this.bytes - fnGetBytes(memory.getAttribute(name) || ""); //更新占用字节数
                        }
                    }
                })(),
                'getBytes': (function () {//获取该存储对象占用的字节数
                    return this.bytes || 0;
                })()
            }
        },
        getSelection: function (el) {//获取选区
            var nStart,
                nEnd,
                sVal,
                range,
                range2,
                bookmark;

            if(document.selection) {
                try {//加try防止插件初始化时为不可见状态，ie会报错
                    el.focus();
                } catch(e) { }
                range = document.selection.createRange();
                range2 = range.duplicate();
                range2.moveToElementText(el);
                nStart = 0;
                nEnd = 0;

                while(range2.compareEndPoints('StartToStart', range) === -1) {//循环移动range2的开始到选区开头，计算偏移字符数
                    range2.moveStart("character", 1);
                    nStart++;
                }
                nEnd = nStart;
                while(range2.compareEndPoints('StartToEnd', range) === -1) {//循环移动range2的开始到选区结尾，计算偏移字符数
                    range2.moveStart("character", 1);
                    nEnd++;
                }
            }
            else if(!isNaN(el.selectionStart)) {
                nStart = el.selectionStart;
                nEnd = el.selectionEnd;
                if($.browser.opera) {//opera每一个\n后的开始索引会加1
                    var
                        sVal = el.value,
                        sPart = sVal.slice(0, nStart),
                        sPart2 = sVal.slice(0, nEnd),
                        nCounts = +sPart.length - (+sPart.replace(/\n/g, "").length),
                        nCounts2 = +sPart2.length - (+sPart2.replace(/\n/g, "").length);

                    nStart = nStart - nCounts;
                    nEnd = nEnd - nCounts2;
                }
            }

            return [nStart, nEnd];
        },
        setSelection: function (el, nStart, nEnd) {//设置选区
            var range;
            try
            {
                if(el.setSelectionRange) {
                    el.focus();
                    el.setSelectionRange(nStart, nEnd);
                }
                else if(el.createTextRange) {
                    range = el.createTextRange();
                    range.collapse(true);
                    range.moveEnd("character", nEnd);
                    range.moveStart("character", nStart);
                    range.select();
                }
            }
            catch(e)
            {}
        },
        insertText: function ($El, sText, nStart, nEnd, callback) {//指定位置插入文本，并把光标置于插入文本末尾
            var
                el = $El[0],
                sVal = $El.val(),
                nLength = +sVal.length,
                sText = sText || "",
                nInsertLength = +sText.length,
                nStart = nStart || 0,
                nEnd = nEnd || 0,
                callback = callback || function () { },
                range;

            el.focus();
            if(!isNaN(el.selectionStart)) {
                $El.val([sVal.slice(0, nStart), sText, sVal.slice(nEnd)].join(""));
                el.setSelectionRange(nStart + nInsertLength, nStart + nInsertLength);
            }
            else if(document.selection) {
                range = el.createTextRange();
                range.collapse(true); //合并选区到开端
                range.moveEnd("character", nEnd);
                range.moveStart("character", nStart);
                range.text = sText;
                range.collapse(); //合并选区到末端
                range.select();
            }
            if(!!callback) {
                callback();
            }
        },
        limitLength: function ($El, nMaxLength, onMax, onNotMax) {//限制字符长度，超出上限则保留前nMaxLength个字符
            var
                sVal = $El.val() || "",
                sNewVal,
                nMaxLength = nMaxLength || 0,
                nLastValueLength = $El.data('lastValueLength') || 0,
                onMax = onMax || function () { },
                onNotMax = onNotMax || function () { },
                range,
                range2,
                bookmark,
                nStart,
                nEnd;

            if(!!sVal &amp;&amp; !!nMaxLength &amp;&amp; +sVal.length &gt;= nMaxLength) {

                $El.focus();

                //保存更换value前的选区
                if(document.selection) {
                    bookmark = document.selection.createRange().getBookmark();
                    range = $El[0].createTextRange();
                    range2 = range.duplicate();

                    range.moveToBookmark(bookmark);
                    range2.setEndPoint("EndToEnd", range);
                    nEnd = Math.min(+range2.text.length, nMaxLength);
                }
                else if($El[0].selectionEnd) {
                    nEnd = Math.min($El[0].selectionEnd, nMaxLength);
                }

                sNewVal = sVal.slice(0, nMaxLength);

                if(sNewVal !== sVal) {//注意赋值会使光标跳至最后
                    $El.val(sNewVal);
                }
                $El.data('lastValueLength', nMaxLength);

                //重置光标到新增文本之后

                nStart = nEnd + nMaxLength - nLastValueLength;

                if(document.selection) {
                    range.moveStart('character', nStart);
                    range.collapse(true); //合并选区到开始处
                    range.select();
                }
                else if($El[0].selectionEnd) {
                    $El[0].setSelectionRange(nStart, nStart);
                }
                $El.data('isMax', true);
                onMax();
            }
            else {
                $El.data('lastValueLength', +sVal.length); //保存前一次有效值的长度
                if($El.data('isMax')) {
                    $El.removeData('isMax');
                    onNotMax();
                }
            }
        },
        placeholder: function ($El, sText, sClass) {
            var sText = sText || '',
                sClass = sClass || '',
                $Simulate;
            if('placeholder' in document.createElement('textarea')) { //支持placehodler
                $El.attr('placeholder', sText);
            }
            else {
                $Simulate = $('&lt;placeholder /&gt;');
                $Simulate.append(sText).insertAfter($El).on('click', function () {
                    $(this).addClass('TCSay_hide');
                    $El.focus();
                });
                $El.on({
                    'focus': function () {
                        $Simulate.addClass('TCSay_hide');
                    },
                    'blur': function () {
                        if(!$El.val().length) {
                            $Simulate.removeClass('TCSay_hide');
                        }
                    }
                });
            }
        }
    });

    //扩展Say[添加静态属性]
    $.extend(Say, {
        emt: {
            'default': {
                name: 'default',
                alias : '常用', //表情分类名
                size : 22, //尺寸
                pageShow : 40, //单页显示数量
                decs: ['微笑','可爱','捂脸哭','傲慢','幸福','666','机智','裂开','偷笑','可怜','酷','哈哈','爱你','笑哭','送花花','合十','比心','赞','抱抱','生日蛋糕','抱拳','差','OK','好色','庆祝','吐','尖叫','鬼脸','尴尬','鄙视','打哈哈','鼓掌','哈欠','害羞','黑线','加油','狂晕','怒骂','委屈','嘻嘻','嘘','旺柴','白眼','闭嘴','便便','馋','打喷嚏','流泪','呆住','恶魔','汗颜','惊呆','沮丧','怒气冲冲','抛媚眼','亲亲','生病中','生气','失落','好困','调皮','泄气','晕','爱心传递','给力','互粉','蜡烛','钱','伤心','挖鼻屎','围观','我打','小丑','再见','左哼哼']
            },
            'xiaoba': {
                name: 'xiaoba',
                alias: '小八', //表情分类名
                size: 32, //尺寸
                pageShow: 32, //单页显示数量
                decs: ["小八打招呼", "小八卖萌", "小八馋嘴", "小八捏脸", "小八惊吓", "小八擦汗", "小八美梦", "小八花痴", "小八石化", "小八犯困", "小八委屈", "小八大哭", "小八发火", "小八怒骂", "小八得意", "小八白眼", "小八奋斗", "小八抠鼻", "小八赞", "小八傲慢", "小八闭嘴", "小八调皮", "小八饿", "小八通知", "小八咧嘴", "小八撇嘴", "小八亲", "小八生日", "小八衰", "小八偷笑", "小八吓", "小八嘘", "小八疑问", "小八晕倒", "小八抓狂", "小八耶","小八你走", "小八吃货", "小八喝彩", "小八得瑟", "小八忧郁", "小八怕怕", "小八怪我咯", "小八笑拒", "小八算账"]
            },
            'changchang': {
                name: 'changchang',
                alias : '畅畅',
                size : 32,
                pageShow : 32,
                decs: ["爱钱", "安静", "安慰", "巴掌", "白眼", "抱歉", "鼻血", "鄙视", "闭嘴", "吃饭", "呲牙", "打牌", "大哭", "呆住", "调皮", "发怒", "犯困", "飞吻", "恭喜", "鼓掌", "害羞", "好色", "好衰", "坏笑", "魂魄", "加油", "惊愕", "惊吓", "囧囧", "抠鼻", "流汗", "卖萌", "没钱", "嗯哈", "呕吐", "佩服", "敲打", "庆祝", "弱小", "生病", "生气", "胜利", "耍酷", "睡觉", "偷笑", "头晕", "投降", "微笑", "委屈", "无辜", "无聊", "无奈", "捂耳", "羡慕", "邪恶", "胭脂", "摇头", "疑问", "有钱", "玉女", "再见", "炸弹", "咒骂", "猪头", "自摸"]
            },
            'tangtang': {
                name: 'tangtang',
                alias : '唐唐',
                size : 32,
                pageShow : 32,
                decs: ["爱钱", "安静", "安慰", "白眼", "抱歉", "鼻血", "鄙视", "闭嘴", "抽烟", "呲牙", "打牌", "大兵", "大哭", "呆住", "调皮", "发怒", "犯困", "飞吻", "恭喜", "鼓掌", "害羞", "好色", "好衰", "胡牌", "坏笑", "魂魄", "饥饿", "加油", "惊愕", "惊吓", "囧囧", "抠鼻", "流汗", "没钱", "嗯哈", "呕吐", "拍砖", "佩服", "敲打", "庆祝", "弱小", "生病", "生气", "胜利", "耍酷", "睡觉", "偷笑", "头晕", "投降", "微笑", "委屈", "无辜", "无聊", "无奈", "捂耳", "羡慕", "邪恶", "摇头", "疑问", "有钱", "再见", "炸弹", "咒骂", "猪头"]
            }
        }
    });
    //扩展Say.prototype[添加原型属性]
    $.extend(Say.prototype, {
        _init: function ($Container, options) {//初始化
            var self = this; //保存对当前实例的引用
            self._iCode = new Date().getTime(); //创建唯一标识符,适合创建各类唯一id用
            self.$Container = $Container; //存储对容器的引用
            self.arrPrevSel = [0, 0]; //存储之前的选区
            //配置信息
            options = self.options = $.extend(true, {
                sourceURL: 'TCSay/', //插件文件夹对应资源绝对地址
                hasImgTips: false, //是否有图片提示语功能
                hasRecommend: false, //是否有推荐信息功能
                hasEmt: false, //是否有插入表情功能
                hasImg: false, //是否有插入图片功能
                hasTopic: false, //是否有插入话题功能
                hasTitle: false, //是否有添加标题功能
                hasCount: false, //是否有字符统计功能
                nLocalStorageID: null, //对应本地存储文件唯一ID号，不需要本地存储则不需要此属性
                isSaveByUser: false, //是否按用户进行存储，不同登录用户将保存不同的数据,默认是不与用户绑定的，所有本机用户都可见,若为true,需要调用setCurrentUserID为其设置当前用户ID
                nCurrentUserID: null, //当前用户ID
                imgTipsSrc: '', //图片提示语路径,推荐用绝对路径
                imgTipsWidth: 128, //图片提示语的宽度
                imgTipsHeight: 15, //图片提示语的高度
                imgTipsAlt: '想说点什么？', //图片提示语的alt说明文字
                recommendLabel: '大家都在讨论：', //推荐信息文本
                recommendTopic: '钓鱼岛是中国的领土', //推荐话题名称	
                symTopic: "#", //话题标识
                defaultTopic: "在这里输入你想说的话题", //默认话题
                maxTitleLength: 28, //最长标题字符数
                titleTips: '您可以在此输入标题…', //默认标题提示文本
                showTitle: 50, //自动出现标题时的字符数
                arrEmt : ['default', 'xiaoba'], //包含的表情类型
                symEmtLeft: " /", //表情左标识
                symEmtRight: "/ ", //表情右标识
                symDelimiter: ':', //表情类型与表情说明之间的分隔符		
                showCount: 100, //自动出现字符统计时的字符数
                placeholder: '', //内容输入提示文本
                maxLength: 140, //最大字符数,0为不限
                isAutoHeight: true, //是否自适应高
                minHeight: 50, //textarea的最小高度,单位px
                maxHeight: 100, //textarea的最大高度,单位px
                allowBlank: false, //是否允许空值发布,只包含空格跟换行符的内容同样认为为空
                textAtBlankSubmit: '', //为空提交时自动添加的文本
                tipsSubmit: {//提交相关文本提示集合
                    'blank': '请输入要发布的内容！', //空内容时
                    'btnText': '发布', //提交按钮文字
                    'success': '发布成功', //提交成功文字提示
                    'successCheck': '发布成功，信息正在审核中…', //提交成功待审核提示
                    'waiting': '正在发布，请稍候…'//提交等待文字提示
                },
                prmUploadImg: {//上传图片相关配置
                    isInsertText : true, //是否插入文本到编缉区
                    limit: 1000, //默认限制1000张
                    maxHeight: 1600, //客户端自动缩图片高度,flash模式才支持
                    maxWidth: 1600,  //客户端自动缩图片宽度,flash模式才支持
                    quality: 100, //处理的清晰度,flash模式才支持
                    requestVertion: 10, //flash最低版本要求
                    src: '', //添加图片接口
                    showHost: '', //显示图片接口
                    deleteURL: '', //删除图片接口
                    params: {}//参数集合,所有值必须是字符串类型
                },
                prmSubmit: {//提交完整数据相关配置, 默认提交机制下才有效
                    url: '', //提交接口
                    params: {}//参数集合,所有值必须是字符串类型
                },
                onInit: function () { }, //初始化完成事件
                onKeyup: null, //对外的键盘事件接口
                beforeRead: function () { }, //读取本地存储之前事件
                beforeOpenUploadImg: function () { }, //打开上传图片面板事件,return false时不会打开面板
                beforeSubmit: function () { }, //发布前事件,return false时不发布
                onSuccess: function () { }, //发布完成事件, 只有用默认提交机制才有作用
                onComplete: function () { }, //发布完成事件，调用clear()后,只有用默认提交机制才有作用
                onOpenPopup: function () { }, //打开弹出面板事件
                onClosePopup: function () { }, //关闭弹出面板事件
                customSubmit : '' //如果有自定义提交方法，则不执行默认提交机制,原来提交相关的配置可能会失效
            }, options);


            //添加编辑器，只包含最基本的功能
            $Container
                .html('&lt;div class="TCSay"&gt;&lt;div class="TCSay_maskTips TCSay_hide"&gt;&lt;div class="tips"&gt;&lt;b&gt;&lt;/b&gt;&lt;span class="success2"&gt;&lt;/span&gt;&lt;span class="success"&gt;&lt;/span&gt;&lt;span class="waiting"&gt;&lt;/span&gt;&lt;span class="fail"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="mask"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="TCSay_head TCSay_hide"&gt;&lt;/div&gt;&lt;div class="TCSay_body"&gt;&lt;div class="TCSay_extend"&gt;&lt;!----&gt;&lt;/div&gt;&lt;div class="TCSay_body_main"&gt;&lt;div class="TCSay_body_content"&gt;&lt;div class="TCSay_body_content_text"&gt;&lt;fieldset&gt;&lt;div class="preWrap"&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;textarea&gt;&lt;/textarea&gt;&lt;/fieldset&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="TCSay_body_handler TCSay_clear"&gt;&lt;ul class="handlerList"&gt;&lt;/ul&gt;&lt;span class="btnSubmit btnSubmit_disabled"&gt;' + options.tipsSubmit.btnText + '&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;');

            var
            //存储对整个编辑器的引用
                $EditorWhole = self.$EditorWhole = $Container.children(".TCSay"),

            //存储对编辑器容器的引用	
                $EditorWrap = self.$EditorWrap = $EditorWhole.find(".TCSay_body_content"),

            //存储对编辑器的引用
                $Editor = self.$Editor = $EditorWrap.find("textarea").height(options.minHeight),

            //存储对模拟编辑器pre的引用
                $Simulate = self.$Simulate = $Editor.prev().children("pre"),

            //存储对遮罩提示层的引用
                $MaskTips = self.$MaskTips = $EditorWhole.children(".TCSay_maskTips"),

            //存储对操作列表容器的引用
                $HandlerList = self.$HandlerList = $EditorWhole.find(".TCSay_body_handler &gt; .handlerList"),

            //存储对发布按钮的引用
                $BtnSubmit = self.$BtnSubmit = $HandlerList.next(".btnSubmit").on({
                    'mouseenter': function () {
                        if(!$(this).is('.btnSubmit_disabled')) {
                            $(this).addClass('btnSubmit_hover');
                        }
                    },
                    'mouseleave': function () {
                        $(this).removeClass('btnSubmit_hover btnSubmit_down');
                    },
                    'mousedown': function () {
                        if(!$(this).is('.btnSubmit_disabled')) {
                            $(this).addClass('btnSubmit_down');
                        }
                    },
                    'mouseup': function () {
                        $(this).removeClass('btnSubmit_down');
                    },
                    'click': function () {
                        if(!$(this).is('.btnSubmit_disabled')) { //避免重复提交
                            self._submit();
                        }
                    }

                });

            //添加placeholder
            if(!!options.placeholder) {
                _helpers.placeholder($Editor, options.placeholder, 'placeholder');
            }

            //监听事件
            $Editor
                .on({
                    "focus": function () {//添加获取焦点样式
                        $EditorWrap.addClass("TCSay_body_content_focus");

                        if(!!self.$InsertRecommend) {//触发弱化推荐话题机制
                            self.$InsertRecommend.data("triggerWeaken", true).addClass('TCSay_head_topic_weaken');
                        }
                    },
                    "blur": function () {//删除获取焦点样式
                        $EditorWrap.removeClass("TCSay_body_content_focus");
                    },
                    "keyup click select": function () {//更新选区记录
                        self._evtSeletionChange(); //触发选区改变事件
                    }
                });

            $EditorWrap.on({
                "mouseenter": function () {
                    $(this).addClass('TCSay_body_content_hover');
                },
                "mouseleave": function () {
                    $(this).removeClass('TCSay_body_content_hover');
                }
            });


            //设置最大字符数
            if(!!options.maxLength) {
                self._setMaxLength(options.maxLength);
            }
            //自适应高
            if(!!options.isAutoHeight) {
                $Editor.on({
                    "keydown": function () {//用keydown可以监听持续按键,keyup只能触发一次
                        if(self._keydownID) {
                            clearTimeout(self._keydownID);
                        }
                        self._keydownID = setTimeout(function () {
                            self._adaptHeight();
                        }, 25);
                    }
                });
                //ie6|7回车不触发keydown
                if($.browser.msie &amp;&amp; +$.browser.version &lt; 8) {
                    $Editor.on({
                        "keypress": function (e) {
                            if(e.which === 13) {
                                self._adaptHeight();
                            }
                        }
                    });
                }
            }
            //是否添加提示语功能
            if(!!options.hasImgTips) {
                options.imgTipsSrc = options.imgTipsSrc || options.sourceURL + 'tips.png'; //没有配置提示图片地址时就用默认

                $EditorWhole.children(".TCSay_head").removeClass("TCSay_hide").prepend(['&lt;img src="', options.imgTipsSrc, '" width=', options.imgTipsWidth, ' height=', options.imgTipsHeight, ' alt="', options.imgTipsAlt, '" /&gt;'].join(""));
            }

            //添加并保存对推荐信息的引用
            if(!!options.hasRecommend) {
                self.$InsertRecommend = $(['&lt;a href="javascript:;" class="TCSay_head_topic"&gt;', options.symTopic, options.recommendTopic, options.symTopic, '&lt;/a&gt;'].join("")).on({
                    "click": function (e) {
                        if(!$(this).is(".TCSay_head_topic_disabled")) {
                            self._insertTopic(options.recommendTopic); //插入话题
                        }
                        e.preventDefault(); //防止修改url,同时又可以冒泡事件		
                    },
                    "mouseenter": function () {//删除弱化样式
                        $(this).removeClass('TCSay_head_topic_weaken');
                    },
                    "mouseleave": function () {//增加弱化样式
                        if(!!$(this).data("triggerWeaken")) {
                            $(this).addClass('TCSay_head_topic_weaken');
                        }
                    }
                });

                $EditorWhole.children(".TCSay_head").removeClass("TCSay_hide").append(options.recommendLabel).append(self.$InsertRecommend);
            }
            //添加表情及图片功能相关
            if(!!options.hasEmt || !!options.hasImg) {

                //添加弹出层
                self.$Popup = $('&lt;div class="TCSay_popup"&gt;&lt;em class="arrow"&gt;&lt;/em&gt;&lt;div class="title"&gt;&lt;div class="titleList"&gt;&lt;div class="titleList_inner"&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="" class="close" title="关闭"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="content"&gt;&lt;/div&gt;&lt;/div&gt;').prependTo($('body'));

                self.$Popup
                    .click(function (e) {//点击弹出层内部区域不关闭
                        e.stopPropagation();
                    })
                    .find('.close')
                    .click(function () {
                        self._closePopup();
                        return false;
                    })
                    .trigger('click');


                //添加预览层
                self.$ImgList = $('&lt;div class="TCSay_body_content_imgList TCSay_clear"&gt;&lt;/div&gt;').appendTo($EditorWrap);


                if(!!options.hasEmt) {

                    //大表情预览容器
                    self.$PreviewEmtList = $('&lt;ul /&gt;').appendTo(self.$ImgList)
                        .on({
                            "mouseenter": function () {
                                var $This = $(this);
                                self._openPreviewBigEmt($This, $This.attr('data-src')); //打开大表情预览面板

                            },
                            "mouseleave": function () {
                                self._closePopup(); //关闭面板
                            }
                        }, "li")
                        .on("click", "a.delete", function (e) {
                            self._deleteBigEmt(); //删除大表情
                            e.preventDefault(); //阻止跳转
                        });

                    //添加并保存对插入表情的引用
                    self.$InsertEmt = $('&lt;li&gt;&lt;b class="emt"&gt;&lt;/b&gt;&lt;strong&gt;表情&lt;/strong&gt;&lt;/li&gt;').appendTo($HandlerList).click(function (e) {

                        if(!$(this).is(".handler_disabled")) {
                            self._openEmt(); //打开表情面板
                            e.stopPropagation(); //避免关闭弹出层
                        }

                    });
                }
                if(!!options.hasImg) {
                    //存储上传图片的参数配置
                    self.nUploadedCount = 0; //存储对已上传图片的统计信息
                    self.nLastIndex = 0; //存储对上一次上传的最后一张图片索引

                    //上传的图片预览容器
                    self.$PreviewImgList = $('&lt;ul /&gt;').prependTo(self.$ImgList)
                        .on({
                            "mouseenter": function () {
                                var $This = $(this);
                                self._openPreviewImg($This, { src: options.prmUploadImg.showHost + $This.attr('data-src') }); //打开预览图片面板
                            },
                            "mouseleave": function () {
                                self._closePopup(); //关闭面板
                            }
                        }, "li")
                        .on("click", "a.delete", function (e) {
                            self._deleteImg(+$(this).closest('li').attr('data-index'));
                            e.preventDefault(); //阻止跳转
                        });

                    //添加并保存对插入图片的引用
                    self.$InsertImg = $('&lt;li&gt;&lt;b class="img"&gt;&lt;/b&gt;&lt;strong&gt;图片&lt;/strong&gt;&lt;/li&gt;').appendTo($HandlerList).click(function (e) {
                        if(!self.isFullImg) {
                            self._openUploadImg(); //打开上传图片面板
                            e.stopPropagation(); //避免关闭弹出层	
                        }
                    });
                }

                self.$ImgList.append('&lt;div style="clear:both"&gt;&lt;/div&gt;')//ie6|7 float margin-bottom 失效

            }

            //添加并保存对插入话题的引用
            if(!!options.hasTopic) {
                self.$InsertTopic = $('&lt;li&gt;&lt;b class="topic"&gt;&lt;/b&gt;&lt;strong&gt;话题&lt;/strong&gt;&lt;/li&gt;').appendTo($HandlerList).click(function () {
                    if(!$(this).is(".handler_disabled")) {
                        self._insertTopic(); //插入话题
                    }
                });
            }
            //添加并保存对添加标题的引用
            if(!!options.hasTitle) {
                self.$InsertTitle = $('&lt;li&gt;&lt;b class="title"&gt;&lt;/b&gt;&lt;strong&gt;标题&lt;/strong&gt;&lt;/li&gt;').appendTo($HandlerList).click(function () {
                    if(!$(this).is('.handler_disabled')) {
                        self._openTitle(); //打开标题
                    }
                });
                self.$Title = $('&lt;div class="TCSay_body_title TCSay_hide"&gt;&lt;input type="text" /&gt;&lt;a href="" class="TCSay_body_titile_hide" title="隐藏标题"&gt;&lt;/a&gt;&lt;/div&gt;').insertBefore($EditorWrap);

                if(!!options.maxTitleLength) {
                    self.$Title.children("input:text").attr('maxlength', options.maxTitleLength);
                }
                if(!!options.titleTips) {
                    self.$Title.children("input:text")
                        .val(options.titleTips)
                        .addClass("default")
                        .on({
                            "focus": function () {
                                var
                                    $This = $(this),
                                    sVal = $This.val();
                                if(sVal === options.titleTips) {
                                    $This.val("");
                                }
                                $This.removeClass("default");
                            },
                            "blur": function () {
                                var
                                    $This = $(this),
                                    sVal = $This.val();
                                if(!sVal || sVal === options.titleTips) {
                                    $This.val(options.titleTips);
                                    $This.addClass("default");
                                }
                            },
                            "change": function () {
                                self._evtTitleChange();
                            }
                        });
                }
                //隐藏标题
                self.$Title.children(".TCSay_body_titile_hide").click(function (e) {
                    self._closeTitle();
                    e.preventDefault(); //防止修改url,同时又可以冒泡事件		
                });
            }
            //添加并保存对字符统计功能的引用
            if(!!options.hasCount) {
                self.$Count = $(['&lt;div class="count TCSay_hide"&gt;&lt;span class="current"&gt;&lt;/span&gt;/&lt;span class="total"&gt;', options.maxLength, '&lt;/span&gt;字&lt;/div&gt;'].join("")).insertAfter($BtnSubmit);
            }

            //创建本地存储对象
            if(!!options.nLocalStorageID) {
                self.localStorage = _helpers.createLocalStorage(options.nLocalStorageID);
            }


            //对外的键盘事件接口
            if(!!options.onKeyup &amp;&amp; $.isFunction(options.onKeyup)) {
                $Editor.on('keyup', function () {
                    options.onKeyup.call(self); //传入self对象
                });
            }

            self._isEditable = true; //设置编辑器处于可编辑状态

            if(!!self.localStorage) {//读取本地存储
                options.beforeRead.call(self);
                self._initFromLocalStorage();
            }

            //触发提交准备事件，初始化编辑器
            self._evtReadySubmit();

            //对外的键盘事件接口
            if(!!options.onInit &amp;&amp; $.isFunction(options.onInit)) {
                options.onInit.call(self); //传入self对象
            }
        },
        _evtSeletionChange: function () {//选区改变事件
            this.arrPrevSel = _helpers.getSelection(this.$Editor[0]); //更新选区记录
        },
        _evtContentChange: function (isNotFocus) {//值改变事件
            var
                self = this,
                $Editor = self.$Editor,
                options = self.options,
                nLength = self.getContentLength();

            self._evtReadySubmit(); //触发提交准备事件

            //调用字符限制函数	
            _helpers.limitLength($Editor, options.maxLength, function () {
                self.$EditorWrap.addClass('TCSay_body_content_warn');
            }, function () {
                self.$EditorWrap.removeClass('TCSay_body_content_warn');
            });

            if(!isNotFocus) {
                self._evtSeletionChange(); //触发选区改变事件
            }


            if(!!options.isAutoHeight) {//自适应高度
                self._adaptHeight();
            }

            if(!!options.hasCount) {//控制是否显示字符统计
                self._updateCount();
            }

            //自动显示标题
            if(!!options.showTitle &amp;&amp; !self.hasShowTitle &amp;&amp; nLength &gt;= options.showTitle) {
                self._openTitle();
            }
            //是否需要将改变数据更新存入本地
            if(!!self.localStorage) {
                self._writeContent();
            }

            return self;
        },
        _evtReadySubmit: function () {//提交准备事件
            var
                self = this;
            if(self.$MaskTips &amp;&amp; !self.$MaskTips.hasClass('TCSay_hide')) { //提示层显示时也为禁用状态
                self._disableSubmit();
            }
            else {
                self._enableSubmit(); //启用提交按钮
            }
            return self;
        },
        _evtTitleChange: function () {//标题值改变事件
            var
                self = this;

            //是否需要将改变数据更新存入本地
            if(!!self.localStorage) {
                self._writeTitle();
            }

            return self;
        },
        _evtImgChange: function () {//上传图片改变事件
            var
                self = this;

            //是否需要将改变数据更新存入本地
            if(!!self.localStorage) {
                self._writeImg();
            }

            return self;
        },
        _evtBigEmtChange: function () {//大尺寸表情改变事件
            var
                self = this;

            //是否需要将改变数据更新存入本地
            if(!!self.localStorage) {
                self._writeBigEmt();
            }

            return self;
        },
        _writeContent: function () {//保存内容数据到本地
            var
                self = this,
                localStorage = self.localStorage,
                sContent = self.getContentValue(), //当前内容
                isSaveByUser = self.options.nCurrentUserID, //是否按用户存储
                nCurrentUserID = self.options.nCurrentUserID; //当前用户ID


            if(isSaveByUser &amp;&amp; !isNaN(nCurrentUserID)) {//如果存在登录用户,清空匿名用户的数据,并更新其私人数据

                localStorage.remove('content');

                if(!sContent) {
                    localStorage.remove('content_' + nCurrentUserID);
                }
                else {
                    localStorage.write('content_' + nCurrentUserID, sContent);
                }

            }
            else {//如果是匿名用户则更新公开数据

                if(!sContent) {
                    localStorage.remove('content');
                }
                else {
                    localStorage.write('content', sContent);
                }
            }

            return self;
        },
        _readContent: function () {//从本地中读取内容数据到编辑器中
            var
                self = this,
                sContent,
                isSaveByUser = self.options.nCurrentUserID, //是否按用户存储
                nCurrentUserID = self.options.nCurrentUserID; //当前用户ID


            if(isSaveByUser &amp;&amp; !isNaN(nCurrentUserID)) {
                sContent = self.localStorage.read('content_' + nCurrentUserID);
            }
            else {
                sContent = self.localStorage.read('content');
            }

            if(!!sContent) {
                self.setContentValue(sContent);
            }

            return self;
        },
        _writeTitle: function () {//保存标题数据到本地
            var
                self = this,
                localStorage = self.localStorage,
                sTitle = self.getTitleValue(), //当前内容
                isSaveByUser = self.options.nCurrentUserID, //是否按用户存储
                nCurrentUserID = self.options.nCurrentUserID; //当前用户ID

            if(isSaveByUser &amp;&amp; !isNaN(nCurrentUserID)) {//如果存在登录用户,清空匿名用户的数据,并更新其私人数据
                localStorage.remove('title');
                if(!sTitle) {
                    localStorage.remove('title_' + nCurrentUserID);
                }
                else {
                    localStorage.write('title_' + nCurrentUserID, sTitle);
                }
            }
            else {//如果是匿名用户则更新公开数据
                if(!sTitle) {
                    localStorage.remove('title');
                }
                else {
                    localStorage.write('title', sTitle);
                }
            }

            return self;
        },
        _readTitle: function () {//从本地中读取标题数据到编辑器中
            var
                self = this,
                sTitle,
                isSaveByUser = self.options.nCurrentUserID, //是否按用户存储
                nCurrentUserID = self.options.nCurrentUserID; //当前用户ID

            if(isSaveByUser &amp;&amp; !isNaN(nCurrentUserID)) {
                sTitle = self.localStorage.read('title_' + nCurrentUserID);
            }
            else {
                sTitle = self.localStorage.read('title');
            }

            if(!!sTitle) {
                self._openTitle(); //打开标题
                self.$Title.children("input:text").val(sTitle);
            }

            return self;
        },
        _writeImg: function () {//保存图片数据到本地
            var
                self = this,
                localStorage = self.localStorage,
                arrImgs,
                sImgs,
                $Images = self.$PreviewImgList.children("li"),
                isSaveByUser = self.options.nCurrentUserID, //是否按用户存储
                nCurrentUserID = self.options.nCurrentUserID; //当前用户ID

            if(!!$Images.length) {
                arrImgs = [];
                for(var i = 0, len = $Images.length; i &lt; len; i++) {
                    arrImgs.push([
                        '{"pid":', $Images[i].getAttribute("data-pid"),
                        ',"src":"', $Images[i].getAttribute("data-src"), '"',
                        ',"index":', $Images[i].getAttribute("data-index"),
                        ',"size":"', $Images[i].getAttribute("data-size"), '"',
                        "}"].join(""));
                }
                sImgs = ['[', arrImgs.join(), ']'].join("");
            }

            if(isSaveByUser &amp;&amp; !isNaN(nCurrentUserID)) {//如果存在登录用户,清空匿名用户的数据,并更新其私人数据
                localStorage.remove('images');
                if(!sImgs) {
                    localStorage.remove('images_' + nCurrentUserID);
                }
                else {
                    localStorage.write('images_' + nCurrentUserID, sImgs);
                }

            }
            else {//如果是匿名用户则更新公开数据
                if(!sImgs) {
                    localStorage.remove('images');
                }
                else {
                    localStorage.write('images', sImgs);
                }
            }

            return self;
        },
        _readImg: function () {//从本地中读取图片数据到编辑器中
            var
                self = this,
                sImages,
                $PreviewImgList,
                arrImgs,
                isSaveByUser = self.options.nCurrentUserID, //是否按用户存储
                nCurrentUserID = self.options.nCurrentUserID; //当前用户ID

            if(isSaveByUser &amp;&amp; !isNaN(nCurrentUserID)) {
                sImages = self.localStorage.read('images_' + nCurrentUserID);
            }
            else {
                sImages = self.localStorage.read('images');
            }

            if(!!sImages) {
                arrImgs = $.parseJSON(sImages);
                $PreviewImgList = self.$PreviewImgList; //预览图片容器
                len = arrImgs.length;
                i = 0;
                sHTML = "";

                for(; i &lt; len; i++) {

                    sHTML += self._createImgLi({
                        index : arrImgs[i]['index'],
                        id : arrImgs[i]['pid'],
                        src : arrImgs[i]['src'],
                        size : arrImgs[i]['size']
                    });

                }

                $PreviewImgList.append(sHTML); //更新预览列表

                self.nUploadedCount = len; //更新已传图片数
                self.nLastIndex = +arrImgs[len - 1]['index']; //更新最新一张图片的索引

                if(self.nUploadedCount === self.options.prmUploadImg.limit) {//是否达到上传上限
                    self.isFullImg = true; //添加达到上限标识
                    self._disableInsertImg(); //禁用上传操作
                }

                self._evtImgChange(); //触发图片改变事件

            }

            return self;
        },
        _writeBigEmt: function () {//保存大表情数据到本地
            var
                self = this,
                localStorage = self.localStorage,
                sBigEmt,
                $BigEmt = self.$PreviewEmtList.children("li"),
                isSaveByUser = self.options.nCurrentUserID, //是否按用户存储
                nCurrentUserID = self.options.nCurrentUserID; //当前用户ID

            if(!!$BigEmt.length) {
                sBigEmt = ['{"src":"', $BigEmt.attr('data-src'), '", "dec":"', $BigEmt.attr('data-dec'), '", "type":"', $BigEmt.attr('data-type'), '", "name":"', $BigEmt.attr('data-name'), '"}'].join("");
            }

            if(isSaveByUser &amp;&amp; !isNaN(nCurrentUserID)) {//如果存在登录用户,清空匿名用户的数据,并更新其私人数据
                localStorage.remove('bigEmt');
                if(!sBigEmt) {
                    localStorage.remove('bigEmt_' + nCurrentUserID);
                }
                else {
                    localStorage.write('bigEmt_' + nCurrentUserID, sBigEmt);
                }
            }
            else {//如果是匿名用户则更新公开数据
                if(!sBigEmt) {
                    localStorage.remove('bigEmt');
                }
                else {
                    localStorage.write('bigEmt', sBigEmt);
                }
            }

            return self;
        },
        _readBigEmt: function () {//从本地中读取大表情数据到编辑器中
            var
                self = this,
                sBigEmt,
                isSaveByUser = self.options.nCurrentUserID, //是否按用户存储
                nCurrentUserID = self.options.nCurrentUserID; //当前用户ID

            if(isSaveByUser &amp;&amp; !isNaN(nCurrentUserID)) {
                sBigEmt = self.localStorage.read('bigEmt_' + nCurrentUserID);
            }
            else {
                sBigEmt = self.localStorage.read('bigEmt');
            }

            if(!!sBigEmt) {
                jsonBigEmt = $.parseJSON(sBigEmt);
                self._addBigEmt(jsonBigEmt.src, jsonBigEmt.dec, jsonBigEmt.type, jsonBigEmt.name);
            }

            return self;
        },
        _initFromLocalStorage: function () {//从本地存储中初始化数据
            var
                self = this,
                options = self.options;

            if(!!options.hasTitle) {//初始化标题的值
                self._readTitle();
            }
            if(!!options.hasEmt &amp;&amp; !!self.$PreviewEmtList) {//初始化大尺寸表情
                self._readBigEmt();
            }
            if(!!options.hasImg &amp;&amp; !!self.$PreviewImgList) {//初始化图片
                self._readImg();
            }
            self._readContent(); //初始化内容

            return self;
        },
        _isBlank: function () {//值是否只包含空白字符,只有空格和换行的字符串则认为是空字符串
            var sVal = this.getContentValue(),
                regValid = /[\S]+?/ig;
            return !regValid.test(sVal);
        },
        _setMaxLength: function (nMaxLength) {//设置字符数限制
            var
                self = this,
                $Editor = self.$Editor,
                options = self.options,
                nMaxLength = nMaxLength || options.maxLength || 0;

            if(!nMaxLength) {//不限制字符数
                return;
            }
            else {
                var
                    fnLimitChars = function () {
                        if(self._limitCharsID) {
                            clearTimeout(self._limitCharsID);
                        }
                        self._limitCharsID = setTimeout(function () {//加延时,让浏览器先更新UI再去获取value
                            self._evtContentChange(); //调用字符改变事件
                        }, 25);
                    };

                $Editor.on({
                    "keydown keyup": function (e) {

                        if(!!e.ctrlKey || e.which === 9) {//特殊键不做控制,目前包括['Ctrl','Tab']
                            return;
                        }

                        fnLimitChars();
                    }
                });
                //ie6|7回车不触发keydown
                if($.browser.msie &amp;&amp; +$.browser.version &lt; 8) {
                    $Editor.on({
                        "keypress": function (e) {
                            if(e.which === 13) {
                                fnLimitChars();
                            }
                        }
                    });
                }
            }
            //监听粘贴事件
            $Editor.on({
                "paste": function () {
                    if(self._pasteID) {
                        clearTimeout(self._pasteID);
                    }
                    self._pasteID = setTimeout(function () {//增加延时,等value更新后再调用_evtContentChange
                        self._evtContentChange.call(self);
                    }, 25);
                }
            });
            return self;
        },
        _adaptHeight: function () {//自适应高度
            var
                self = this,
                $Editor = self.$Editor,
                $Simulate = self.$Simulate,
                options = self.options,
                nHeight,
                sVal = $Editor.val().replace(/(.+)?\n$/, "$1\n\n"), //最后一个\n不产生断行
                nMaxHeight = options.maxHeight || 0, //最大高度,0为不限制
                nMinHeight = options.minHeight || 0; //最小高度

            if($.browser.msie &amp;&amp; +$.browser.version &lt; 8) {//ie6|7 \n 不换行，替换成\r
                sVal = sVal.replace(/\n/g, "\r");
            }
            $Simulate.text(sVal);
            nHeight = $Simulate.height();

            if(nMaxHeight === 0) {//不限制最大高度
                $Editor
                    .css({
                        'height': Math.max(nHeight, nMinHeight),
                        'overflow-y': 'hidden'
                    });
            }
            else if(nHeight &lt;= nMaxHeight) {//高度小于最大高度时

                $Editor
                    .css({
                        'height': Math.max(nHeight, nMinHeight),
                        'overflow-y': 'hidden'
                    });
                $Simulate
                    .css({
                        'overflow-y': 'hidden'
                    })
                    .parent()
                    .css({
                        'height': 'auto'
                    });
            }
            else {//高度超过最大高度
                $Editor
                    .css({
                        'height': nMaxHeight,
                        'overflow-y': 'auto'
                    });
                $Simulate
                    .css({
                        'overflow-y': 'scroll'
                    })
                    .parent()
                    .css({
                        'height': nMaxHeight
                    });
            }

            return self;
        },
        _insertTopic: function (sTopic) {//插入话题
            var
                self = this,
                options = self.options,
                sTopic = sTopic || options.defaultTopic,
                arrPrevSel = self.arrPrevSel,
                arrIndex = self._getTopicIndex(sTopic),
                sText;
            //话题不存在时才插入新的话题，存在则选中已有话题
            if(arrIndex !== -1) {
                self._selectTopic(sTopic);
            }
            else {

                sText = [options.symTopic, sTopic, options.symTopic].join(""); //添加话题标识符号
                _helpers.insertText(self.$Editor, sText, arrPrevSel[0], arrPrevSel[1], function () {
                    self._evtContentChange(); //调用字符改变事件
                    if(sTopic === options.defaultTopic) {//高亮选择默认话题标题
                        self._selectTopic(sTopic);
                    }

                });
            }
            return self;

        },
        _getTopicIndex: function (sTopic) {//搜索指定话题,并返回相应索引,未匹配则返回-1
            var
                self = this,
                options = self.options,
                sTopic = sTopic || options.defaultTopic,
                symTopic = options.symTopic,
                sText = [symTopic, sTopic, symTopic].join(""), //添加话题标识符号
                nIndex = self.getContentValue().indexOf(sText),
                nStart,
                nEnd;

            if(nIndex === -1) {
                return -1;
            }
            else {
                nStart = nIndex + (+symTopic.length);
                nEnd = nStart + (+sTopic.length);
                return [nStart, nEnd];
            }
        },
        _selectTopic: function (sTopic) {//选择话题
            var
                self = this,
                $Editor = self.$Editor,
                options = self.options,
                symTopic = options.symTopic,
                arrIndex = self._getTopicIndex(sTopic);

            if(arrIndex !== -1) {
                if(sTopic !== options.defaultTopic) {//指定话题不是默认话题时，光标定位在话题后
                    arrIndex[1] = arrIndex[1] + (+symTopic.length);
                    arrIndex[0] = arrIndex[1];
                }
                _helpers.setSelection($Editor[0], arrIndex[0], arrIndex[1]); //设置选区
                self._evtSeletionChange(); //触发选区改变事件
            }

            return self;
        },
        _updateCount: function () {//更新当前字符统计信息
            var
                self = this,
                options = self.options,
                nLength = self.getContentLength(),
                $Count = self.$Count;

            if(nLength &gt;= options.showCount) {
                $Count.removeClass('TCSay_hide');
            }
            else {
                $Count.addClass('TCSay_hide');
            }
            if(!!options.maxLength &amp;&amp; nLength &gt;= options.maxLength) {
                $Count.addClass('alert');
            }
            else {
                $Count.removeClass('alert');
            }
            $Count.find(".current").empty().text(nLength);
            return self;
        },
        _openTitle: function () {//打开标题
            var
                self = this,
                options = self.options;
            if(!!options.hasTitle) {
                self.$Title.removeClass('TCSay_hide').children("input:text"); //显示标题
                self.$InsertTitle.addClass('handler_disabled'); //禁用打开按钮
            }
            self.hasShowTitle = true;
            return self;
        },
        _closeTitle: function () {//关闭标题
            var
                self = this,
                options = self.options;
            if(!!options.hasTitle) {
                self.$Title.addClass('TCSay_hide');
                self.$InsertTitle.removeClass('handler_disabled');
            }
            self.hasShowTitle = false;
            return self;
        },
        _openPopup: function ($Trigger) {//打开弹出面板,遮罩标题+内容区
            var self = this,
                options = self.options,
                $Popup = self.$Popup,
                $Arrow = $Popup.children('.arrow').removeClass('arrow_bottom'),
                tHeight = $Trigger.height(),
                offset = $Trigger.offset(),
                nOffsetX = offset.left,
                nOffsetY = offset.top + tHeight + 12,
                nZIndex = _helpers.getMaxZindex();

            if(self._closePreviewID) {
                clearTimeout(self._closePreviewID);
            }
            //显示
            $Popup.removeClass("TCSay_hide");
            var docHeight = $(document).height();
            var height = $Popup.height();
            //定位
            if(docHeight - nOffsetY &lt; height){
                $Arrow.addClass('arrow_bottom');
                nOffsetY = offset.top - height - 12;
            }
            $Popup.css({
                'top': nOffsetY,
                'left': nOffsetX,
                'z-index': nZIndex + 1
            });


            options.onOpenPopup.call(self); //触发打开弹出面板事件

            //点击文档关闭弹出层
            $(document).click(function () {
                self._closePopup();
            });

            self._isOpenPopup = true;

            return self;
        },
        _closePopup: function () {//关闭弹出面板
            var self = this,
                options = self.options;

            //取消关闭弹出层监听
            $(document).off('click');

            if(self._closePreviewID) {
                clearTimeout(self._closePreviewID);
            }

            if(self._isOpenPopup) {
                self.$Popup.css({ //不用隐藏的原因是flash上传图片，若隐藏会中断上传操作
                    'top': '-3000px',
                    'left': '-3000px'
                });

                options.onClosePopup.call(self); //触发关闭弹出面板事件

                self._isOpenPopup = false;
            }


            return self;
        },
        _openEmt: function () {//打开表情面板
            var
                self = this,
                options = self.options,
                $Popup = self.$Popup,
                hasInitEmt = self.hasInitEmt, //是否已初始化过插入表情
                $InsertEmt = self.$InsertEmt,
                $EmtContainer;

            if(!hasInitEmt) {//未初始化时创建表情结构

                for (var i = 0, len = options.arrEmt.length, emt, $List = $('&lt;div class="titleList_emt"&gt;&lt;/div&gt;'), sEmtContainer = ''; i &lt; len; i++) {
                    emt = Say.emt[options.arrEmt[i]];
                    $List.append(['&lt;a href="javascript:;" data-type="', emt.name, '" data-size="', emt.size, '" data-pageShow="', emt.pageShow, '" data-total="', emt.decs.length, '"&gt;', emt.alias, '&lt;/a&gt;'].join(""));
                    sEmtContainer += ['&lt;div data-name="', emt.alias, '" class="emotions_', emt.size, ' emotions_', emt.name, ' TCSay_hide"&gt;&lt;div class="list TCSay_clear"&gt;&lt;div class="waiting"&gt;&lt;strong&gt;表情加载中&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="pagination"&gt;&lt;/div&gt;&lt;/div&gt;'].join("");
                }

                $Popup.find(".titleList_inner").append($List); //添加表情类别

                $EmtContainer = self.$EmtContainer = $(['&lt;div class="emotions"&gt;', sEmtContainer, '&lt;/div&gt;'].join("")).appendTo($Popup.children(".content")); //添加表情容器

                //监听选择表情类型	
                $Popup.find(".titleList_inner &gt; .titleList_emt").click(function (e) {

                    var $Target = $(e.target);

                    if($Target.is('a') &amp;&amp; !$Target.is(".current")) {

                        //更新箭头显示
                        if(!$Target.prev().length) {//如果表情位于第一位，则去除灰色箭头样式
                            $Popup.children('.arrow').removeClass('arrow_gray');
                        }
                        else {
                            $Popup.children('.arrow').addClass('arrow_gray');
                        }

                        $Target.addClass("current").siblings().removeClass("current"); //添加当前标识

                        $EmtContainer.children(".emotions_" + $Target.attr('data-type')).removeClass('TCSay_hide').siblings().addClass("TCSay_hide"); //显示相应表情容器

                        if(!$Target.data('hasLoaded')) {//如果是第一次点击则创建页码同时去加载相应的第一页表情
                            self._createEmtPage($Target.attr('data-type'), +$Target.attr('data-size'), +$Target.attr('data-pageShow'), +$Target.attr('data-total'));
                            $EmtContainer.children(".emotions_" + $Target.attr('data-type')).find('.pagination &gt; a').first().click();
                            $Target.data('hasLoaded', true);
                        }

                        e.preventDefault(); //防止跳转
                    }
                });


                $EmtContainer
                    .on("click", ".list a", function (e) {//取消表情外层a的默认点击动作
                        e.preventDefault();
                    })
                    .on("click", ".list", function (e) {//监听选择表情
                        var
                            $This = $(this),
                            $Target = $(e.target),
                            sType = $Target.attr("data-type"),
                            sName = $This.parent().attr("data-name");

                        if($Target.is('img')) {
                            if(sType === 'default' || sType === 'xiaoba') {//如果选择的是默认表情
                                self._insertEmot($Target.attr("alt"));
                            }
                            else {//选择具体非默认表情
                                self._addBigEmt($Target.attr("src"), $Target.attr("alt"), sType, sName);
                            }
                        }
                    });

                $List.children().first().trigger('click'); //默认打开第一个表情的第一页

                self.hasInitEmt = true; //添加完成初始化标识


            }

            $Popup.removeClass().addClass("TCSay_popup TCSay_popup_emt"); //添加上传图片class
            self._openPopup($InsertEmt); //打开面板
            return self;
        },
        _createEmtPage: function (sType, nSize, nPageShow, nTotal) {//创建表情页码
            var
                self = this,
                nPages = nTotal / nPageShow + (nTotal % nPageShow === 0 ? 0 : 1),
                $EmtContainer = self.$EmtContainer,
                $Pagination = $EmtContainer.children('.emotions_' + sType).children('.pagination'), //页码容器
                $List = $Pagination.siblings('.list'), //对应表情显示容器
                sHTML = "";

            for(var i = 1; i &lt;= nPages; ) {
                sHTML += ['&lt;a href=""&gt;', i++, '&lt;/a&gt;'].join("");
            }
            $Pagination.append(sHTML).click(function (e) {
                var
                    $Target = $(e.target);

                if($Target.is('a') &amp;&amp; !$Target.is(".current")) {

                    $Target.addClass("current").siblings().removeClass("current"); //添加当前标识

                    if(!$List.children('.js_page_' + $Target.text()).length) {//如果不存在相应页的表情则去加载

                        self._loadEmt(sType, nSize, nPageShow, nTotal, +$Target.text());
                    }
                    else {
                        $List.children('.js_page_' + $Target.text()).removeClass('TCSay_hide').siblings().addClass("TCSay_hide"); //显示相应表情容器
                    }

                }
                e.preventDefault(); //防止跳转
            });
            return self;
        },
        _loadEmt: function (sType, nSize, nPageShow, nTotal, nPageNum) {//加载表情,(类型, 尺寸, 单页显示数量, 总数量, 第几页)
            var folder = sType == 'xiaoba' ? 'default' : sType;
            var self = this,
                options = self.options,
                emt = Say.emt, //表情说明
                $EmtContainer = self.$EmtContainer, //所有表情容器
                nIndex = sType == 'xiaoba' ? 75 : 0, // 小八是从75开始的
                nStart = nPageShow * (nPageNum - 1) + nIndex + 1, //页码开始序号
                nEnd = Math.min(nPageShow * nPageNum + nIndex, nTotal + nIndex), //结束序号
                $List = $EmtContainer.children('.emotions_' + sType).children('.list'), //对应表情显示容器
                sImgFileURL = [options.sourceURL, 'emotion/', folder, '/'].join(""), //对应表情文件夹地址
                img, //动态创建的图片对象
                $Temp = $("&lt;div /&gt;"),
                fnAddEmt = function () {//添加表情
                    for (; nStart &lt;= nEnd; nStart++) {
                        img = _helpers.loadImg({//加载相应图片
                            src: [sImgFileURL, nStart, sType == 'xiaoba' ? '.gif' : '.png'].join(""),
                            alt: emt[sType]['decs'][nStart - nIndex - 1],
                            title: emt[sType]['decs'][nStart - nIndex - 1],
                            width: nSize,
                            height: nSize
                        });
                        img.setAttribute('data-type', sType);
                        $Temp.append($('&lt;a href=""&gt;&lt;/a&gt;').append(img));
                    }
                    $Temp.appendTo($List).addClass('js_page_' + nPageNum).siblings().addClass('TCSay_hide');
                };

            if (nPageShow * nPageNum - nTotal &gt; nPageShow || nEnd &lt; nStart) {//无效页
                return self;
            }

            fnAddEmt();
            return self;
        },
        _insertEmot: function (sDec) {//插入表情
            var
                self = this,
                options = self.options,
                sText = [options.symEmtLeft, sDec, options.symEmtRight].join(""),
                arrPrevSel = self.arrPrevSel;

            _helpers.insertText(self.$Editor, sText, arrPrevSel[0], arrPrevSel[1], function () {
                self._closePopup(); //关闭弹出面板
                self._evtContentChange(); //调用字符改变事件

            });

            return self;
        },
        _addBigEmt: function (sSrc, sDec, sType, sName) {//添加大尺寸表情
            var
                self = this,
                $PreviewEmtList = self.$PreviewEmtList,
                $Li = $(['&lt;li data-src="', sSrc, '" data-dec="', sDec, '" data-type="', sType, '" data-name="', sName, '"&gt;&lt;b&gt;&lt;/b&gt;&lt;strong&gt;', sDec, '&lt;/strong&gt;&lt;a href="" class="delete" title="删除"&gt;&lt;/a&gt;&lt;/li&gt;'].join(""));

            self._closePopup(); //关闭弹出面板
            $PreviewEmtList.empty().append($Li);

            self._evtBigEmtChange(); //触发大尺寸表情改变事件

            return self;
        },
        _deleteBigEmt: function () {//删除大尺寸表情
            var
                self = this;
            self.$PreviewEmtList.empty();

            self._evtBigEmtChange(); //触发大尺寸表情改变事件

            return self;
        },
        _openUploadImg: function () {//打开上传图片面板

            var self = this,
                options = self.options,
                hasInitUpload = self.hasInitUpload, //是否已创建过上传方式
                $InsertImg = self.$InsertImg,
                $Popup = self.$Popup;

            if($InsertImg.hasClass('handler_disabled')) {//按钮不可用时直接返回
                return false;
            }

            if(options.beforeOpenUploadImg.call(self) === false) {//打开事件
                return false;
            }

            if(hasInitUpload) {
                $Popup.removeClass().addClass("TCSay_popup TCSay_popup_upload"); //添加上传图片class
                self._openPopup($InsertImg); //打开面板
                return self;
            }
            else {

                $Popup.find(".titleList_inner").append('&lt;div class="titleList_uploadImg"&gt;&lt;a href=""&gt;上传图片&lt;/a&gt;&lt;/div&gt;'); //添加上传图片弹出层标题
                $('&lt;div class="uploadImg"&gt;&lt;/div&gt;').appendTo($Popup.children(".content")); //创建容器
                $Popup.removeClass().addClass("TCSay_popup TCSay_popup_upload"); //添加上传class
                self._openPopup($InsertImg); //打开面板

                self._readyUploadImg(function () {//调用准备上传方法
                    self.hasInitUpload = true; //添加完成初始化标识	
                    return self;
                });

            }
        },
        _readyUploadImg: function (callback) {//上传图片准备
            var self = this,
                options = self.options,
                prmUploadImg = options.prmUploadImg, //上传图片的参数
                nImgLimite = prmUploadImg.limit, //总共可以上传多少张
                $Container = self.$Popup.find('.content &gt; .uploadImg'), //上传容器
                regServerError = { //服务器返回信息正则集合
                    'size': /^上传的图片不能大于/, //'上传的图片不能大于800KB'
                    'extension': /^目前本系统支持的格式为/ //'目前本系统支持的格式为：jpg|jpeg|png'
                },
                errorTips = {//错误文本提示
                    'missing': '成功上传n张，失败m张',
                    'size': '图片太大，上传失败！',
                    'extension': '请检查图片格式',
                    'busy': '系统繁忙，请稍后再试', //您的网络不太稳定，请稍候或换张稍小的图片试试。
                    'flash': '您的机子未安装flash或版本太低，请安装10以上版本的flash。'
                },
                arrTempUploads = [], //临时上传图片数组，用于存储每次上传成功的图片
                nSelected = 0, //本次选中的有效文件数
                isTimeout, //本次上传是否超时
                fnLongTimeListening = function (nDelay) {//长时间上传等待监听,默认等待10秒,超过将给予错误提示
                    isTimeout = false; //重置超时标识
                    self._uploadWaitingID = setTimeout(function () {
                        isTimeout = true;
                        self._failTips(errorTips.busy, 3000, self._hideMaskTips, self); //显示提示
                    }, nDelay || 10000);
                },
                fnClearLongTimeListening = function () {//清除长时间上传等待监听
                    isTimeout = false;
                    if(self._uploadWaitingID) {
                        clearTimeout(self._uploadWaitingID);
                    }
                },
                sflashID = 'flashBtn_' + self._iCode,
                replaceBtn = '&lt;b id="' + sflashID + '"&gt;&lt;/b&gt;';
            callback = callback || function () { };
            prmUploadImg.params.script = 'no'; //flash模式不返回脚本,返回普通文本
            if(parseInt(_helpers.getFlashVertion(), 10) &lt; prmUploadImg.requestVertion){
                self._failTips(errorTips.flash, 2000, self._hideMaskTips, self); //显示提示
                return self;
            }
            //显示初始化中
            $Container.append('&lt;div class="flash"&gt;&lt;div class="waiting"&gt;&lt;strong&gt;初始化中&lt;/strong&gt;&lt;/div&gt;&lt;div class="init TCSay_hide"&gt;&lt;div class="buttonWrap"&gt;&lt;span class="button"&gt;' + replaceBtn + '&lt;/span&gt;&lt;/div&gt;&lt;div class="tips"&gt;&lt;strong&gt;最多上传4张图片，单张大小不得超过10M&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;');
            //加载相应脚本
            _helpers.loadSource([options.sourceURL + 'flash/swfupload.js'], function () {
                $Container.children('.flash').find('.waiting').addClass('TCSay_hide').siblings('.init').removeClass('TCSay_hide'); //显示上传按钮
                //定义flash操作
                var flashHandlers = {
                    regSeverData: {//服务器返回数据格式类型
                        success: /^bindMethod\.Success\((.+)\);$/,
                        fail: /^bindMethod\.Fail\((.+)\);$/
                    },
                    accept: function (sData) {//服务器成功接收
                        var arryData = sData.split(',');

                        if(!isTimeout) {//不超时的时候提示相关提示
                            fnClearLongTimeListening(); //清除超时提示延时
                            arrTempUploads.push({
                                pid: arryData[0],
                                src: arryData[1].slice(1, -1),
                                size: arryData[2].slice(1, -1)
                            });
                        }
                    },
                    reject: function (sData) {//服务器拒绝接收
                        if(!isTimeout) {//不超时的时候提示相关提示
                            fnClearLongTimeListening(); //清除超时提示延时
                            var sTips = sData.slice(1, -1);

                            if(regServerError.size.test(sTips)) {
                                sTips = errorTips.size;
                            }
                            else if(regServerError.extension.test(sTips)) {
                                sTips = errorTips.extension;
                            }
                            else {
                                sTips = errorTips.busy;
                            }

                            self._failTips(sTips, 2000, self._hideMaskTips, self); //显示提示
                        }
                    },
                    complete: function () {//本次上传操作完成
                        var nMissing = nSelected - arrTempUploads.length; //被拒绝接收的张数
                        if(!!nMissing) {
                            self._failTips(errorTips.missing.replace(/n/, arrTempUploads.length).replace(/m/, nMissing), 3000, function () {
                                self._hideMaskTips(); //隐藏上传中提示
                                self._addImgs(arrTempUploads);
                            });
                        }
                        else {
                            self._hideMaskTips(); //隐藏上传中提示
                            self._addImgs(arrTempUploads);
                        }
                    },
                    preLoad: function () {//加载flash前
                        if(!this.support.loading || !this.support.imageResize) {
                            self._closePopup(); //选中了文件才关闭面板
                            self._failTips(errorTips.flash, 2000, self._hideMaskTips, self); //显示提示
                        }
                    },
                    loadFailed: function () {//加载flash失败
                        self._closePopup(); //选中了文件才关闭面板
                        self._failTips(errorTips.flash, 2000, self._hideMaskTips, self); //显示提示
                    },
                    fileDialogComplete: function (numSelected, numQueued, numTotal) {//关闭选择框，自动调整尺寸上传
                        try {
                            if(numQueued &gt; 0) {
                                self._closePopup(); //选中了文件才关闭面板
                                nSelected = numSelected; //重新计数选中的文件数
                                arrTempUploads = []; //清空临时上传图片数组
                                self._waitingTips('上传图片中'); //显示上传中提示
                                var file = this.getFile(0);
                                if(!file){
                                    return;
                                }
                                if(file.type.toLowerCase() === '.gif'){
                                    this.startUpload(this.getFile(0).ID);
                                }
                                else{
                                    this.startResizedUpload(file.ID, this.customSettings.thumbnail_width, this.customSettings.thumbnail_height, SWFUpload.RESIZE_ENCODING.JPEG, this.customSettings.thumbnail_quality, false);
                                }
                                fnClearLongTimeListening(); //清除超时提示延时
                                fnLongTimeListening(30000); //等待30秒延时，超出认为上传失败
                            }
                        } catch(ex) {
                            this.debug(ex);
                        }

                    },
                    fileQueueError: function (file, code, message) {//选择错误
                        if(!this.getStats().files_queued) {//一个有效文件都没有才提示错误
                            self._closePopup(); //关闭面板
                            var sTips = errorTips.busy;

                            switch(code) {
                                case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
                                    sTips = errorTips.size;
                                    break;
                                case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
                                    sTips = errorTips.extension;
                                    break;
                            }

                            self._failTips(sTips, 2000, self._hideMaskTips, self); //显示提示
                        }
                    },
                    uploadStart: function (file) {//开始上传
                        if(self.nUploadedCount + arrTempUploads.length &gt;= nImgLimite) {//超过上传限制就不给上传
                            this.stopUpload();
                        }
                    },
                    uploadError: function (file, errorCode, message) {//上传出错
                        if(!isTimeout) {//不超时的时候提示相关提示
                            fnClearLongTimeListening(); //清除超时提示延时
                            self._failTips(message, 2000, self._hideMaskTips, self); //显示提示
                        }
                    },
                    uploadSuccess: function (file, serverData, responseCode) {//客户端上传成功

                        if(flashHandlers.regSeverData.success.test(serverData)) {//如果服务器成功接收
                            flashHandlers.accept(serverData.match(flashHandlers.regSeverData.success)[1]);
                        }
                        if(this.getStats().files_queued &gt; 0 &amp;&amp; self.nUploadedCount + arrTempUploads.length &lt; nImgLimite) {//如果还未超出上传上限并且，还有图片等待上传，则继续上传
                            if(this.getFile(0).type.toLowerCase() === '.gif'){
                                this.startUpload(this.getFile(0).ID);
                            }
                            else{
                                this.startResizedUpload(this.getFile(0).ID, this.customSettings.thumbnail_width, this.customSettings.thumbnail_height, SWFUpload.RESIZE_ENCODING.JPEG, this.customSettings.thumbnail_quality, false);
                            }
                        }
                        else{
                            createSwf(); //ie 下第二次上传无法读取选中的文件
                            if(!!arrTempUploads.length) {
                                flashHandlers.complete(); //调用本次上传完成事件
                            }
                            else if(flashHandlers.regSeverData.fail.test(serverData)) {//如果服务器拒绝接收
                                flashHandlers.reject(serverData.match(flashHandlers.regSeverData.fail)[1]);
                            }
                        }
                    }
                };
                var createSwf = function(){
                    $Container.find('span.button')[0].innerHTML = replaceBtn; //$.html() ie9会报错
                    if(self.swfUploadImg){
                        self.swfUploadImg.destroy();
                    }
                    //初始化flash实例
                    self.swfUploadImg = new SWFUpload({

                        upload_url: prmUploadImg.src,  //上传地址

                        // Flash Settings
                        flash_url: options.sourceURL + "flash/swfupload.swf",
                        flash9_url: options.sourceURL + "flash/swfupload_fp9.swf",

                        post_params: prmUploadImg.params, //上传参数

                        // 文件上传设置
                        file_size_limit: "10 MB", //配置客户端图片大小，超出不会提交给服务器，并以错误提示用户
                        file_types: "*.jpg;*.png;*.jpeg;*.gif", //客户端能选择的文件类型
                        file_types_description: "JPG Images; PNG Image; JPEG Image; GIF Image", //文件类型择提示

                        // 事件监听
                        swfupload_preload_handler: flashHandlers.preLoad, //加载flash前
                        swfupload_load_failed_handler: flashHandlers.loadFailed, //加载flash失败,通常是因为没有安装Flash Player或者它的版本低于 9.0.28


                        file_dialog_complete_handler: flashHandlers.fileDialogComplete, //关闭选择框
                        file_queue_error_handler: flashHandlers.fileQueueError, //选择错误
                        upload_start_handler: flashHandlers.uploadStart, //开始上传
                        upload_success_handler: flashHandlers.uploadSuccess, //上传成功
                        upload_error_handler: flashHandlers.uploadError, //上传失败

                        button_placeholder_id: sflashID,
                        button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
                        button_cursor: SWFUpload.CURSOR.HAND,
						
                        custom_settings: {
                            thumbnail_height: prmUploadImg.maxHeight, //客户端自动缩图片高度
                            thumbnail_width: prmUploadImg.maxWidth,  //客户端自动缩图片宽度
                            thumbnail_quality: prmUploadImg.quality //处理的清晰度
                        },

                        // true 调试
                        debug: false
                    });
                };
                createSwf();
                callback();
            });
            return self;
        },
        _createImgLi : function(opt){
            opt = $.extend({
                index : 0,
                id : 0,
                src : '',
                size : ''
            }, opt);
            //return ['&lt;li data-index="', opt.index, '" data-size="', opt.size || '', '" data-pid="', opt.id, '" data-src="', opt.src, '"&gt;&lt;b&gt;&lt;/b&gt;&lt;strong&gt;', opt.index, '&lt;/strong&gt;&lt;a href="javascript:;" class="delete" title="删除"&gt;&lt;/a&gt;&lt;/li&gt;'].join("");
            return ['&lt;li data-index="', opt.index, '" data-size="', opt.size || '', '" data-pid="', opt.id, '" data-src="', opt.src, '"&gt;&lt;span class="TCSay_body_content_imgBox"&gt;&lt;img src="'+(this.options.prmUploadImg.showHost+opt.src)+'" /&gt;&lt;/span&gt;&lt;a href="javascript:;" class="delete" title="删除"&gt;&lt;/a&gt;&lt;/li&gt;'].join("");
        },
        checkImg:function(){
            var self = this;
            var showsize=40;
            self.$PreviewImgList.find("img:not(overed)").each(function(){
                var src = $(this).attr("src");
                var _$this = $(this);
                _helpers.loadImg({
                    src:src,
                    onLoad:function(){
                        var realWidth=this.width,realHeight=this.height,temph,tempw,top,left,fw;
                        if (realHeight &gt; realWidth) {
                            temph = parseInt((showsize * realHeight) / realWidth);
                            top = parseInt((showsize - temph) / 2);
                            fw = showsize;
                            _$this.css({ position:"absolute",left: left + "px", top: top + "px", width: fw + "px" }).addClass('overed');
                        } else {
                            tempw = parseInt((showsize * realWidth) / realHeight);
                            left = parseInt((showsize - tempw) / 2);
                            fh = showsize;
                            _$this.css({position:"absolute", left: left + "px", top: top + "px", height: fh + "px" }).addClass('overed');
                        }
                    }
                })
            });
        },
        _addImgs: function (arrImgs) {//添加图片[{pid:,src:}]
            var self = this,
                $PreviewImgList = self.$PreviewImgList, //预览图片容器
                arrPrevSel = self.arrPrevSel, //之前的选区
                nImgLimite = self.options.prmUploadImg.limit, //总共可以上传多少张
                nUploadedCount = self.nUploadedCount, //已上传多少张
                nLastIndex = self.nLastIndex, //上一次上传的索引
                len = arrImgs.length,
                i = 0,
                sHTML = [],
                sText = [];
            arrImgs = arrImgs.slice(0, Math.max(0, nImgLimite - nUploadedCount)); //只添加不超出添加上限的前几张图片
            if(!len) {
                return self;
            }
            for(; i &lt; len; i++) {
                sHTML.push(self._createImgLi({
                    index : nLastIndex + i + 1,
                    id : arrImgs[i]['pid'],
                    src : arrImgs[i]['src'],
                    size : arrImgs[i]['size']
                }));
                sText.push(['[图片', nLastIndex + i + 1, ']'].join(""));
            }
            sHTML = sHTML.join('');
            sText = sText.join('');
            $PreviewImgList.append(sHTML); //更新预览列表
            self.checkImg();//设置图片位置
            //更新编辑区
            if(self.options.prmUploadImg.isInsertText){
                _helpers.insertText(self.$Editor, sText, arrPrevSel[0], arrPrevSel[1], function () {
                    //显示本次上传的第一张图片
                    $PreviewImgList.find("li[data-index=" + (nLastIndex + 1) + "]").trigger("mouseenter");
                    self._evtContentChange(); //调用字符改变事件
                    //2秒后自动消失
                    self._closePreviewID = setTimeout(function () {
                        self._closePopup();
                    }, 2000);
                });
            }
            else{
                //显示本次上传的第一张图片
                $PreviewImgList.find("li[data-index=" + (nLastIndex + 1) + "]").trigger("mouseenter");
            }
            self.nUploadedCount += len; //更新已传图片数
            self.nLastIndex += len; //更新最新一张图片的索引

            if(self.nUploadedCount === nImgLimite) {//是否达到上传上限
                self.isFullImg = true; //添加达到上限标识
                self._disableInsertImg(); //禁用上传操作
            }

            self._evtImgChange(); //触发图片改变事件

            return self;
        },
        _deleteImg: function (nIndex) {//删除某张图片
            var self = this;
            if(!confirm('确定要删除吗？')) {
                return self;
            }
            var prmUploadImg = self.options.prmUploadImg,
                sURL = prmUploadImg.deleteURL, //删除图片接口路径
                reg = new RegExp('\\[图片' + nIndex + '\\]', 'g'),
                $PreviewImgList = self.$PreviewImgList, //预览图片容器
                $Li = $PreviewImgList.children('li[data-index=' + nIndex + ']'), //目录li
                sIframeId = 'delIframe_' + self._iCode;
            var $Div = $(['&lt;div style="display:none;"&gt;&lt;form action="', sURL, '" method="post" target="', sIframeId, '"&gt;&lt;input type="hidden" name="id" value="" /&gt;&lt;/form&gt;&lt;iframe name="', sIframeId, '"&gt;&lt;/iframe&gt;&lt;/div&gt;'].join("")).prependTo($('body'));
            $Div.find('form').submit(); //提交删除请求
            if(self.options.prmUploadImg.isInsertText){
                self.$Editor.val(self.getContentValue().replace(reg, "")); //更新编辑器
                self._evtContentChange(); //调用值改变事件
            }
            $Li.remove(); //更新预览列表
            self.nUploadedCount--; //更新上传统计
            self.isFullImg = false; //更新上传上限标识
            self._enableInsertImg(); //启用上传操作
            self._evtImgChange(); //触发图片改变事件
            setTimeout(function(){
                $Div.remove();
            }, 10);
            return self;
        },
        _openPreviewImg: function ($Trigger, optImg) {//打开图片预览面板
            var self = this,
                $Popup = self.$Popup,
                $Container = $Popup.children('.content').children(".previewImg"), //图片显示容器
                img;

            if(!$Container.length) {
                $Container = $('&lt;div class="previewImg"&gt;&lt;i&gt;&lt;/i&gt;&lt;img /&gt;&lt;/div&gt;').appendTo($Popup.children('.content'));
            }
            $Container.children('img').remove(); //删除老图片
            $Popup.removeClass().addClass("TCSay_popup TCSay_popup_preview")//添加预览图片class

            self._openPopup($Trigger); //显示弹出面板


            if(!optImg.width &amp;&amp; !optImg.height &amp;&amp; !optImg.maxWidth &amp;&amp; !optImg.maxHeight) {//如果图片没有设定显示尺寸参数，则限制其最大显示尺寸为容器尺寸
                optImg.maxWidth = $Container.width();
                optImg.maxHeight = $Container.height();
            }


            $Container.append(function () {//加载显示图片
                return _helpers.loadImg(optImg);
            });



            return self;
        },
        _openPreviewBigEmt: function ($Trigger, sSrc) {//打开大表情预览面板
            var
                self = this,
                regBig = /(\/emotion\/)(.+)(\/\d+\.gif)$/i,
                sBigSrc = sSrc.replace(regBig, '$1$2_big$3'); //替换成大图路径

            self._openPreviewImg($Trigger, {
                src: sBigSrc,
                width: 72,
                height: 72
            });

            return self;
        },
        _disableSubmit: function () {//禁用发布按钮

            this.$BtnSubmit.addClass('btnSubmit_disabled').removeAttr('title');

            return this;

        },
        _enableSubmit: function () {//启用发布按钮,不为空时才能启用

            var
                self = this;

            self.$BtnSubmit.removeClass('btnSubmit_disabled').attr('title', self.options.tipsSubmit.btnText);

            return self;
        },
        _disableInsertRecommend: function () {//禁用推荐话题功能
            var
                self = this;

            if(!!self.$InsertRecommend) {
                self.$InsertRecommend.addClass('TCSay_head_topic_disabled');
            }

            return self;

        },
        _enableInsertRecommend: function () {//启用推荐话题功能
            var
                self = this;

            if(!!self.$InsertRecommend) {
                self.$InsertRecommend.removeClass('TCSay_head_topic_disabled');
            }

            return self;

        },
        _disableInsertEmt: function () {//禁用表情按钮
            var
                self = this;

            if(!!self.$InsertEmt) {
                self.$InsertEmt.addClass('handler_disabled');
            }

            return self;

        },
        _enableInsertEmt: function () {//启用表情按钮
            var
                self = this;

            if(!!self.$InsertEmt) {
                self.$InsertEmt.removeClass('handler_disabled');
            }

            return self;

        },
        _disableInsertImg: function () {//禁用上传图片按钮
            var
                self = this;

            if(!!self.$InsertImg) {
                self.$InsertImg.addClass('handler_disabled');
            }

            return self;

        },
        _enableInsertImg: function () {//启用上传图片按钮
            var
                self = this;

            if(!self.isFullImg &amp;&amp; !!self.$InsertImg) {
                self.$InsertImg.removeClass('handler_disabled');
            }

            return self;

        },
        _disableInsertTopic: function () {//禁用话题按钮
            var
                self = this;

            if(!!self.$InsertTopic) {
                self.$InsertTopic.addClass('handler_disabled');
            }

            return self;

        },
        _enableInsertTopic: function () {//启用话题按钮
            var
                self = this;

            if(!!self.$InsertTopic) {
                self.$InsertTopic.removeClass('handler_disabled');
            }

            return self;

        },
        _disableInsertTitle: function () {//禁用标题按钮
            var
                self = this;

            if(!!self.$InsertTitle) {
                self.$InsertTitle.addClass('handler_disabled');
            }

            return self;

        },
        _enableInsertTitle: function () {//启用标题按钮，只有标题栏不显示时才可用
            var
                self = this;

            if(!!self.$InsertTitle &amp;&amp; self.$Title.is(".TCSay_hide")) {
                self.$InsertTitle.removeClass('handler_disabled');
            }

            return self;

        },
        _showMaskTips: function (nDelay, callback, context) {//显示遮罩层,同时禁用所有功能,编辑器处于不可编辑状态
            var self = this,
                $EditorWhole = self.$EditorWhole,
                $TCSay_body_main = $EditorWhole.find(".TCSay_body_main"), //被遮罩对象
                $MaskTips = self.$MaskTips,
                $Tips = $MaskTips.find('.tips'),
                nBorderWidth = 1; //边框宽度
            nDelay = nDelay || 0; //延迟消失时间
            callback = callback || function () { }; //回调函数
            context = context || window; //运行环境

            $MaskTips.removeClass("TCSay_hide").css({
                top: $TCSay_body_main.offset().top - $EditorWhole.offset().top,
                left: $TCSay_body_main.offset().left - $EditorWhole.offset().left,
                width: $TCSay_body_main.width() - 2 * nBorderWidth,
                height: $TCSay_body_main.height() - 2 * nBorderWidth
            });

            //垂直居中
            $Tips.css('margin-top', -$Tips.height() / 2);

            self._isEditable = false; //禁用编辑器
            self._evtReadySubmit(); //触发提交准备事件
            self._disableInsertRecommend(); //禁用推荐话题功能
            self._disableInsertEmt(); //禁用插入表情功能
            self._disableInsertImg(); //禁用插入图片功能
            self._disableInsertTopic(); //禁用插入话题功能
            self._disableInsertTitle(); //禁用标题功能

            if(!!nDelay) {
                if(self.delayID) {
                    clearTimeout(self.delayID);
                }
                self.delayID = setTimeout(function () {
                    callback.call(context);
                }, nDelay);
            }

            return self;
        },
        _hideMaskTips: function () { //隐藏遮罩层，同时恢复所有可用功能,编辑器恢复可编辑状态
            var
                self = this;
            if(self.delayID) {
                clearTimeout(self.delayID);
            }
            self.$MaskTips.addClass("TCSay_hide");
            self._isEditable = true; //启用编辑器
            self._evtReadySubmit(); //触发提交准备事件
            self._enableInsertRecommend(); //启用推荐话题功能
            self._enableInsertEmt(); //启用插入表情功能
            self._enableInsertImg(); //启用插入图片功能
            self._enableInsertTopic(); //启用插入话题功能
            self._enableInsertTitle(); //启用标题功能

            return self;
        },
        _waitingTips: function (sTips, nDelay, callback, context) {//等待提示
            var self = this,
                $MaskTips = self.$MaskTips;
            sTips = sTips || "";
            nDelay = nDelay || 0;
            $MaskTips
                .removeClass()
                .addClass('TCSay_maskTips TCSay_maskTips_waiting')
                .find('.waiting')
                .text(sTips);
            self._showMaskTips(nDelay, callback, context);

            return self;
        },
        _successTips: function (sTips, nDelay, callback, context) {//成功提示
            var self = this,
                sTips = sTips || "",
                nDelay = nDelay || 0,
                $MaskTips = self.$MaskTips;

            $MaskTips
                .removeClass('TCSay_maskTips_waiting TCSay_maskTips_fail TCSay_maskTips_success2')
                .addClass('TCSay_maskTips_success')
                .find('.success')
                .text(sTips)
                .siblings('.success2').remove();

            self._showMaskTips(nDelay, callback, context);

            return self;
        },
        _successTips2: function (opt) {
            var self = this,
                arrTips = [],
                $MaskTips = self.$MaskTips;

            opt = $.extend({
                sTips: self.options.tipsSubmit.success,
                nIntegral: 0, //积分
                nPrestige: 0, //威望
                nDelay: 0,
                isInline : false, //是否单行显示
                callback: function () { },
                context: ''
            }, opt);
            if (opt.nIntegral) {
                arrTips.push(['积分', '&lt;strong&gt;+', opt.nIntegral, '&lt;/strong&gt;'].join(''))
            }
            if (opt.nPrestige) {
                arrTips.push(['威望', '&lt;strong&gt;+', opt.nPrestige, '&lt;/strong&gt;'].join(''))
            }
            $MaskTips
                .removeClass()
                .addClass(['TCSay_maskTips TCSay_maskTips_success2', opt.isInline ? ' TCSay_maskTips_success2_inline' : ''].join(''))
                .find('.success2')
                .html(['&lt;em&gt;', opt.sTips, '&lt;/em&gt;', arrTips.join('')].join(''));

            self._showMaskTips(opt.nDelay, opt.callback, opt.context);

            return self;
        },
        _failTips: function (sTips, nDelay, callback, context) {//失败提示
            var self = this,
                sTips = sTips || "",
                nDelay = nDelay || 0,
                $MaskTips = self.$MaskTips;

            $MaskTips
                .removeClass()
                .addClass('TCSay_maskTips TCSay_maskTips_fail')
                .find('.fail')
                .text(sTips);

            self._showMaskTips(nDelay, callback, context);

            return self;
        },
        _submit: function () {//提交
            var self = this,
                options = self.options,
                sContent,
                prmSubmit = options.prmSubmit,
                $BigEmt,
                regTopic;
            if (!options.allowBlank &amp;&amp; self._isBlank()) { //内容为空又不允许为空时返回提示
                self._failTips(options.tipsSubmit.blank, 2000, self._hideMaskTips, self);
                return self;
            }
            if(!!options.customSubmit){ //如果有自定义提交方法，则不执行默认提交机制
                options.customSubmit.call(self);
                return self;
            }
            if(options.beforeSubmit.call(self) === false) {//调用打开前事件
                return self;
            }
            //如果有标题
            if(!!options.hasTitle &amp;&amp; self.getTitleValue()) {
                prmSubmit.params.txtTitle = self.getTitleValue();
            }
            //如果有图片
            if(!!options.hasImg &amp;&amp; self.getImgValue()) {
                prmSubmit.params.hidImage = self.getImgValue();
            }

            sContent = self.getContentValue(); //内容文本

            //合并话题间的连续空白符
            if(!!options.hasTopic &amp;&amp; sContent) {
                regTopic = new RegExp([options.symTopic, '([^', options.symTopic, ']+)', options.symTopic].join(''), 'g');
                sContent = sContent.replace(regTopic, function (sMatch, sSub) {
                    var sSub = sSub.replace(/\s+/g, ' '); //合并连续空白
                    if(sSub.charAt(0) === ' ') {//去除最前面的空白
                        sSub = sSub.slice(1);
                    }
                    if(sSub.charAt(sSub.length - 1) === ' ') {
                        sSub = sSub.slice(0, sSub.length - 1);
                    }
                    return [options.symTopic, sSub, options.symTopic].join('');
                });
            }

            if(!!options.textAtBlankSubmit &amp;&amp; !sContent) {// 需要的话，空内容提交时自动补上系统文本
                sContent = options.textAtBlankSubmit;
            }

            //如果有大尺寸表情，则将大尺寸表情的文本标识加入内容末尾传给服务器
            if(self.$PreviewEmtList) {
                $BigEmt = self.$PreviewEmtList.children('li');
                if($BigEmt.length) {
                    sContent += [options.symEmtLeft, $BigEmt.attr('data-name'), options.symDelimiter, $BigEmt.attr('data-dec'), options.symEmtRight].join('');
                }
            }

            //设置文本内容
            prmSubmit.params.txtContent = sContent;
            self._waitingTips(options.tipsSubmit.waiting);
            return self;
        },
        //对外方法
        getTitleValue: function () {//获取标题value
            var
                self = this,
                options = self.options,
                sVal;

            if(!!options.hasTitle) {
                sVal = self.$Title.children("input:text").val();
                if(!!sVal &amp;&amp; sVal !== options.titleTips) {
                    return sVal;
                }
            }
        },
        getImgValue: function () {//获取图片value, '580,/1.thumb.jpg,1|581,/2.thumb.jpg,2|582,/160.thumb.jpg,3'
            var self = this,
                options = self.options,
                $Images,
                len,
                arrVal;
            if(!options.hasImg){
                return '';
            }
            $Images = self.$PreviewImgList.children('li');
            len = $Images.length;
            arrVal = [];
            for(var i = 0; i &lt; len; i++) {
                arrVal.push([
                    $Images[i].getAttribute('data-pid'),
                    $Images[i].getAttribute('data-src'),
                    $Images[i].getAttribute('data-index'),
                    $Images[i].getAttribute('data-size')
                ].join(","));
            }
            return arrVal.join("|");
        },
        getFormatBigImg : function(sText){ //获取格式化后的大图地址集合
            var self = this,
                imgages = [];
            if(!sText){
                return imgages;
            }
            sText = sText.split('|');
            $.each(sText, function(i, v){
                imgages.push(self.options.prmUploadImg.showHost + v.split(',')[1].replace('.thumb.', '.'));
            });
            return imgages;
        },
        getContentValue: function () {//获取有效内容value字符串
            return this.$Editor.val() || "";
        },
        setContentValue: function (sValue, isNotFocus) {//设置value
            var
                self = this;
            if(!self._isEditable) {//编辑器不可编辑时直接返回
                return self;
            }
            self.$Editor.val(sValue);
            self._evtContentChange(isNotFocus);

            return self;
        },
        getContentLength: function () {//读取当前内容字符数
            return +this.getContentValue().length;
        },
        getCaretOffset: function () {//获取光标相对body的偏移
            var
                self = this,
                $Editor = self.$Editor,
                $Simulate,
                sVal,
                range,
                $El,
                nScrollTop,
                nSelectionStart,
                nX = 0,
                nY = 0;

            $Editor.focus();
            if(document.selection) {
                range = document.selection.createRange();
                nX = range.offsetLeft;
                nY = range.offsetTop;
            }
            else if(!isNaN($Editor[0].selectionStart)) {
                $Simulate = self.$Simulate;
                sVal = $Editor.val();
                $Simulate.empty().text(sVal);
                nSelectionStart = $Editor[0].selectionStart;
                if($.browser.opera) {//opera每一个\n后的开始索引会加1
                    var
                        sPart = sVal.slice(0, nSelectionStart),
                        nCounts = +sPart.length - (+sPart.replace(/\n/g, "").length);
                    nSelectionStart = nSelectionStart - nCounts;
                }
                range = document.createRange();
                range.setStart($Simulate[0].firstChild, nSelectionStart);
                range.collapse(true); //合并选区到开始处
                $El = $('&lt;span style="display:inline-block;width:0;overflow:hidden;"&gt;.&lt;/span&gt;').css('height', +$Simulate.css('line-height'));
                range.insertNode($El[0]);
                nX = $El.offset().left;
                nScrollTop = $Editor.scrollTop(); //读取编辑器的垂直滚动高度
                nY = $El.offset().top - nScrollTop; //垂直偏移要减去编辑器的垂直滚动高度
                range.detach();
            }

            return { 'x': nX, 'y': nY };
        },
        setUploadImgURL: function (sUrl) {//设置上传图片提交地址
            var
                self = this;

            self.options.prmUploadImg.src = sUrl; //更新配置

            if(!!self.swfUploadImg) {//flash上传
                self.swfUploadImg.setUploadURL(sUrl);
            }
            else if(!!self.formUploadImg) {
                self.formUploadImg.attr('action', sUrl);
            }
            return self;
        },
        setUploadImgLimite: function (nLimite) {//设置上传图片数量限制
            var self = this;
            self.options.prmUploadImg.limit = nLimite; //更新配置
            if(!!self.swfUploadImg) {
                self.swfUploadImg.setFileUploadLimit(nLimite);
            }
            return self;
        },
        setUploadImgParams: function (params) {//设置上传图片参数
            var self = this,
                prmUploadImg = self.options.prmUploadImg;
            prmUploadImg.params = self._convertUploadParams(params);//更新配置
            if(!!self.swfUploadImg) {
                self.swfUploadImg.setPostParams(prmUploadImg.params);
            }
            return self;
        },
        _convertUploadParams : function(params){
            var result = {};
            for(var k in params){
                if(params.hasOwnProperty(k)){
                    result[k] = params[k].toString();
                }
            }
            return result;
        },
        setSubmitParams: function (params) {//设置发布提交时的参数
            var self = this;
            self.options.prmSubmit.params = params; //更新配置
            return self;
        },
        setCurrentUserID: function (nID, isInit) {//设置当前登录用户ID
            var self = this,
                options = self.options,
                isInit = isInit || false; //是否是初始化时设置,初始化时只读取数据不更新本地存储
            options.nCurrentUserID = nID || null;
            if(!!self.localStorage &amp;&amp; !isInit) {//更新本地存储

                if(!!options.hasTitle) {//更新标题的值
                    self._writeTitle();
                }
                if(!!options.hasEmt &amp;&amp; !!self.$PreviewEmtList) {//更新大尺寸表情
                    self._writeBigEmt();
                }
                if(!!options.hasImg &amp;&amp; !!self.$PreviewImgList) {//更新图片
                    self._writeImg();
                }
                self._writeContent(); //更新内容
            }

            return self;
        },
        clear: function () {//重置所有数据，返回到最干净状态
            var self = this,
                options = self.options;
            self.arrPrevSel = [0, 0]; //重置先前的选区
            //重置表情相关
            if(!!self.$PreviewEmtList) {
                self.$PreviewEmtList.empty(); //清空大尺寸表情
                self._evtBigEmtChange(); //调用大尺寸表情改变事件
            }

            //重置图片相关
            if(!!self.$PreviewImgList) {
                self.nUploadedCount = 0; //重置对已上传图片的统计信息
                self.nLastIndex = 0; //重置对上一次上传的最后一张图片索引
                self.isFullImg = false; //重置图片饱合标识
                self.$PreviewImgList.empty(); //清空图片预览
                options.prmSubmit.hidImage = undefined; //清空提交参数中的图片参数
                self._enableInsertImg(); //启用上传操作
                self._evtImgChange(); //调用图片改变事件
            }

            //重置标题相关
            if(!!self.$Title) {
                self.$Title.children("input:text").val("").trigger("blur"); //重置标题文本框
                self._closeTitle(); //关闭标题
                self.hasShowTitle = false;
                options.prmSubmit.txtTitle = undefined; //清空提交参数中的标题参数
                self._evtTitleChange(); //调用标题改变事件
            }
            //重置推荐话题相关

            if(!!self.$InsertRecommend) {
                self.$InsertRecommend.removeData("triggerWeaken").trigger('mouseenter');

            }
            //重置内容相关
            options.prmSubmit.txtContent = ''; //清空提交参数中的内容参数

            self.setContentValue("", true); //清空内容

            self._isEditable = true;

            return self;
        },
        setContentCaretAt: function (nPosition) {//设置编辑框的光标位置
            var self = this,
                nPosition = nPosition || 0;

            if(!self._isEditable){ //编辑器不可编辑时直接返回
                return self;
            }

            _helpers.setSelection(self.$Editor[0], nPosition, nPosition);

            return self;
        },
        setContentFocus : function(){ //设置编辑框获取焦点
            var self = this;
            self.setContentCaretAt(self.getContentValue().length);
            return self;
        },
        parseEmtTextToImg: function (sVal, arrTypes) {//将表情文本标识替换为表情图标
            // var self = this,
            //     options,
            //     sVal = sVal || '',
            //     emt = Say.emt, //对应的表情说明对象
            //     arrTypes = arrTypes || ['default', 'xiaoba'], //要替换的表情类型集合
            //     arrNames = [],
            //     fnReplace; //替换函数
            // if(!sVal) {
            //     return '';
            // }
            // else {
            //     options = self.options;
            //     fnReplace = function (type) {
            //         var nIndex,
            //             sFileName,
            //             sType,
            //             regEmt, //表情标识
            //             sImgSrc,
            //             folder = ''; //表情图片路径

            //         regEmt = new RegExp(['\\s?\\/((', arrNames.join('|'), '):)?([^/\\:\\s]+)\\/\\s?'].join(""), 'g');
            //         sVal = sVal.replace(regEmt, function (total, sub, sub2, sub3) {
            //             // if(!sub) {//默认表情
            //             //     sType = 'default';
            //             //     sFileName = 'default/';
            //             // }
            //             // else {
            //             //     sType = arrTypes[$.inArray(sub2, arrNames)];
            //             //     sFileName = sType + '_big/';
            //             // }
            //             if (type == 'default' || type == 'xiaoba') {
            //                 folder = 'default/';
            //             }
            //             nIndex = $.inArray(sub3, emt[type]['decs']);
            //             console.log(sub3 + ', ' + nIndex + ' , ' + JSON.stringify(emt[type]['decs']))
            //             if(nIndex !== -1) {//确实存在相应表情
            //             nIndex = type == 'xiaoba' ? nIndex + 40 : nIndex;
            //                 sImgSrc = [options.sourceURL, 'emotion/', folder, nIndex + 1, '.gif'].join("");
            //                 return ['&lt;img src="', sImgSrc, '" title="', sub3.replace(/"/g, ""), '" alt="', sub3, '" /&gt;'].join("");
            //             }
            //             else {
            //                 return total;
            //             }
            //         });
            //     };
            // }

            // for(var i = 0, len = arrTypes.length; i &lt; len; i++) {
            //     arrNames = [];
            //     arrNames.push(emt[arrTypes[i]]['name']);

            //     console.info(arrNames);
            //     fnReplace(arrTypes[i]);

            // }
            var self = this,
                types = arrTypes || ['default', 'xiaoba'];


            var replaceEmotions = function(type) {
                var emotions = Say.emt[type]['decs'],
                    reg = new RegExp('\\/(' + emotions.join('|') + ')\\/', 'g'),
                    folder = type == 'default' || type == 'xiaoba' ? 'default/' : type;
                    sVal = sVal.replace(reg, function () { // 0: /小八../   1: 小八..
                        var index = $.inArray(arguments[1], emotions);
                        index = type == 'xiaoba' ? index + 75 : index;
                        var classname = type == 'xiaoba' ? 'emotion-xiaoba' : '';
                        var src = [self.options.sourceURL, 'emotion/', folder, index + 1, type == 'xiaoba' ? '.gif' : '.png'].join("");
                        return ['&lt;img class="', classname,'" src="', src, '" title="', arguments[1], '" alt="', arguments[0], '"',' height="22" width="22"',' /&gt;'].join("");
                    });
            };

            for (var i = 0, l = types.length; i &lt; l; i ++) {
                replaceEmotions(types[i]);
            }

            return sVal;
        },
        successTips2 : function(opt){ //成功提示2
            return this._successTips2(opt);
        },
        successTips : function(opt){ //成功提示
            var self = this;
            opt = $.extend({
                sTips: '',
                nDelay: 0,
                callback: function () { },
                context: ''
            }, opt);
            return self._successTips(opt.sTips, opt.nDelay, opt.callback, opt.context);
        },
        failTips : function(opt){ //失败提示
            var self = this;
            opt = $.extend({
                sTips: '',
                nDelay: 0,
                callback: function () { },
                context: ''
            }, opt);
            return self._failTips(opt.sTips, opt.nDelay, opt.callback, opt.context);
        },
        waitingTips : function(opt){ //等待提示
            var self = this;
            opt = $.extend({
                sTips: '',
                nDelay: 0,
                callback: function (){},
                context: ''
            }, opt);
            return self._waitingTips(opt.sTips, opt.nDelay, opt.callback, opt.context);
        },
        hideMaskTips : function(){
            return this._hideMaskTips();
        },
        submit : function(){
            return this._submit();
        }
});
    //扩展$.fn
        $.extend($.fn, {
            TCSayPub: function (options) {
                return new Say(this.first(), options); //返回一个Say实例
            }
        });
        //扩展$.fn.TCSay
        $.extend($.fn.TCSayPub, {
            vertion: '1.0',
            emt : Say.emt
        });
})(jQuery);</pre></body></html>