/*代码显示窗口*/
Namespace.register("U.CD.CD");


//还需要解决的问题是粘贴过来的多行字符会折换成一行。


//------------------------------------------------------当拖动一个元素到iframe区域后，追加代码到Code区域-------------------------------
//参数h为待追加元素。
U.CD.CD.AppendHTML = function (h) {
    //获取代码区域
    var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
    var _ins = U.CD.CD.SplitHTML(h.outerHTML); //待插入元素数组。//有些浏览器不支持此属性，没办法。只能随主流。
    //找到Body所在节点。
    var _codes = _CA.getElementsByTagName("div"); //获取代码区域div数组，以循环查找body。解决了前后空格问题
    for (var i = 0; i < _codes.length; i++) {
        if (_codes[i].innerText.trim().toLowerCase() == "<body>") {//找到Body后追加添加的元素。
            //找到>符合的位置，下面元素前面追加几个空格
            var _space = _codes[i].innerText.indexOf('>')-1;
            //在元素前面追加空格，封装到U.MS。很多地方要用到。
            for (var j = 0; j < _ins.length; j++) {
                var _d = $$("div", { "className": "UCD_R_C_Line", "innerText": _ins[j].addPreSpace(_space) });  //带插入div内容,addPreSpace在字符串前面追加n个空格
                _CA.insertBefore(_d, _codes[i + 1 + j]); //javascript只有插入前面的函数,插入位置需要计算。
                U.CD.CD.DrawLine(_HH, _CA); //插入行号。
            }
            return; //插入完毕后返回
        }
    }
}

//---------------------------------------------------初始化时根据iframe的内容刷新代码区域的初始内容--------------------------------
//代码区域初始化函数。好像还没有初始化哦。只能在系统第一次运行时调用?
U.CD.CD.Init = function (node) {
    //获取CD文件的内容追加到Code区域，最好能实现换行操作,此种方法由于不支持Chrome，所以另外做了一个函数。
    //var _i = $("#UCD_CT_SM_IF")[0]; _i.src = "http://d.1473.cn/RS.htm?ver="+Math.random();
    //U.MD.IframeLoad(_i, [[U.CD.CD.InitAsyn, ([_i])]]); 
    //用户未登录或者点击新建文件时之前执行的内容。直接获取iframe中内容，反馈到代码窗口。当结果视图有值时，新建文件就会有内容，导出出错，必须重新刷新。
    //U.CD.CD.DrawCode($("#UCD_CT_SM_IF")[0].contentWindow.document.documentElement.outerHTML);
    U.CD.CD.DrawCode(U.CD.CD.InitCode(),false);//初始化代码后绘制在代码窗口
    U.CD.R.Save(node); //初始化保存按钮。此处还可以简化，明天再来。
}
//iframe加载Cd.htm异步回调。
U.CD.CD.InitAsyn = function (i) {
    //如果是Chrome，缓存了上一次iframe的内容，好心做了坏事啊。。iframe还是记录了上一次的内容。
    //看来初始化要换一种方法，直接写入编码到代码区域，然后输出到iframe中。
    U.CD.CD.DrawCode(i.contentWindow.document.documentElement.outerHTML, true); 
} //获取RS.htm的所有内容。

//------------------------------------------------根据代码窗口刷新结果窗口的值。----------------------------------------
//根据代码区域的innerText刷新iframe显示结果，很多地方用到，封装为一个函数。小窗口运行效果。
//参数_CA为$("#UCD_CT_Code_CT")[0]代码元素。给代码窗口赋值,只能通过给代码窗口赋值，然后获取代码窗口innerText，才能最简单的得到给iframe打印的值，否则会带html标签到iframe。
U.CD.CD.DisNode = function (node) {
    var _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
    //数据库中保存的是所有的Div，带了样式，如果不带样式，则javascript,css必须用算法计算出来，比较复杂，暂时解决不了。，
    _CA.innerHTML = node.Content;    //所以暂时浪费存储，求取简单化。,此上下2句话是把包含了hmtl标记的字符全部转换为没有html标记的字符，有技巧。
    //晕，下面这句做执行时做就OK了。
    //_CA.innerText = U.CD.CD.Is1473Domain(_CA.innerText); //检测node.Content是否包含了1473主域，没包含会导致跨域问题，直接追加一个1473主域js。
    U.CD.CD.DrawCode(_CA.innerText, false); //调用统一的往代码窗口赋值函数，包括初始化从iframe中获取，已经装载用户自己的文件代码。
    U.CD.R.Save(node); //保存结果？在打开的时候给保存按钮赋予保存事件！因为会打开多个文件，每个文件都会有对象的事件，一直发生变化
}

//--------------------------------------------------------------通用方法---------------------------------------------
//当在Code编辑区中按下了回车键时，执行换行符操作，并刷新结果窗口,键盘回车键可能是13，也可能是10
//gs触发的格式：比如通过onkeydown触发的，返回qt。做switch判断到底是什么样子的键盘事件
//r是返回值。
//一个复杂的函数，统一的功能，用户统一处理函数，做一个回调。
U.CD.R.Wrap = function (gs, r) {

    //_HH代码行号 _CA代码区域 _T 提示信息
    var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0], _T = $("#UCD_TP_TB")[0];
    var _k = event.keyCode; //键盘按下的键值
    //U.CD.Tip.KeyDown(_k, r); //转到代码提示窗口判断,由于键盘事件是依附于某一个div。所以要单独做在提示框中。
    //alert(_k); //因为主空函数编辑器区域把光标也监控了，所以排除0这个键值，即光标。
    //如果按下了Tab键盘，空4格子，已经在UC里面统一处理了。。。。
    if (_k == 9) {
        //var _R = U.D.E.GetSelectionRange(window, $("#UCD_CT_Code_CT")[0], document);    //获取光标位置。
        //var _G = _R.Replace("&nbsp;&nbsp;&nbsp;&nbsp;"); //追加4个空格到光标前面
        //U.M.StopDefault();
        //$("#UCD_CT_Code_CT").addAttrArray({ "onkeydown": U.CD.R.Wrap }); //要重新添加代码框键盘事件才能再次触发？
    }
    //如果按下了删除Delete键盘。有可能用户删除了一个字符，也可能删除了一个行的div。需要重新计算行数，才能匹配
    if (_k == 46) {
        //此函数响应不及时，原因还待分析，暂时这样。
        var _last, _lines = _HH.childNodes.length - _CA.childNodes.length;
        for (var i = 0; i <= _lines; i++) {
            _last = _HH.lastElementChild || _HH.lastChild; //兼容写法，其实可以做成自己的函数，这里要做自己的函数！！！
            _HH.removeChild(_last);
        }
    }
    if (_k == 10 || _k == 13) {
        //如果代码输入提示框已经出现，则回车键作用于提示框
        if (_T.style.display == "none") {
            //先检查是否在主域文件之上写了代码，如果写了，在Ie里面会识别不了下面的js,所以，不允许。//获取当前光标选中的字符包含的div。  
            if (!U.CD.CD.StrFilter(U.CD.TipR.GetPStyle())) { U.M.StopDefault(); return; } //首先检测有些特殊字符会导致浏览器假死的问题，例如ie7使用！！会导致浏览器假死。。
            U.CD.CD.DrawLine(_HH, _CA); //添加新行
            //同时需要检测新行的颜色为绿色，则要变成默认的，编辑器比较复杂啊
            //U.CD.CD.FushIframe(_CA); //根据代码窗口内容刷新小窗口iframe中立时显示的内容
        }
    }
    if (_k == 0) { _T.style.display = "none"; U.CD.R.CErrF.style.backgroundColor = "white"; } //获取到编辑区域光标事件后，隐藏提示框,并重置代码窗口错误行的颜色
    //如果是.号，显示代码提示窗口。/如果是鼠标获取到了光标，并按下了，则隐藏提示框。//如果是.和并且没有按住Shift键 
    //代码提示功能要做完善，至少要1个月，还要考虑兼容性问题，暂时不实现！！！！！！！！！！！！！！！！！！！！
    if (_k == 190 && window.event.shiftKey == false) {
        if (U.CD.Tip.IsJs(r[0])) {//判断提示框是否为javascript
            //U.CD.TipR.Replace("."); // //U.CD.TipR.GetGBWZ(r[0]);   //得到位置索引,可以用Replace函数直接替换。
            //U.CD.Tip.Show();
            //U.M.StopDefault();
            return;
        }
        if (U.CD.Tip.IsCss()) { }        //判断提示框是否为css，这部分还没开始做
    }

    //当按了Delete键盘，删除代码时，判断删除的代码是否包含了跨域js文件，如果有，提示用户不能删除。
    if (_k == 46) {
        //判断选择的文件是否包含了跨域文件，如果包含了，则要提示用户。
        //var s = U.CD.TipR.GetSelectedText();
        //if (U.CD.CD.IsDeleteDomain(s)) { U.M.StopDefault(); return; } //U.M.StopDefault可以阻止浏览器默认行为。

    }

    _HH.style.height = _CA.scrollHeight + "px";        //设置行号滚动窗口
}


//嗯，原来javascript本身是有回车换行符号的，不过用记事本看不到的。这解决了一个问题。
//但也引起了一个新的问题。
//暂时用传入参数区分是初始化还是从数据库中获取，从数据库中获取回车换行是正确的，初始化时取iframe的outerhtml回车换行是不正确的
U.CD.CD.SplitHTML = function (h, init) {
    if (init) return U.CD.CD.SplitHTMLInit(h);
    //如果是Chrome或者FireFox，换行符号是'\n'
    //如果是ie8，换行符号是空格。这就很难办了
    //如果是ie7，换行符号是'\r\n'
    var _B = U.CI.getBrowser(); //获取浏览器信息
    //if (_B.browser == "msie" && _B.ver == "7.0") return h.split('\r\n');
    //为了识别换行，暂时强制让浏览器兼容ie7.
    //if (_B.browser == "msie" && _B.ver == "8.0") {  return U.CD.CD.SplitHTMLInit(h); }
    //替换所有的\r\n为\n，但苹果好像不是这样兼容的
    return h.replace(/\r\n/g, '\n').split('\n');


}

 //拆分HTML编码，适合于编辑器，不止是拆分html编码，同时还需要把中间的文字提出出来，例如javascript代码，div中间的文字等。
 //在IE7浏览器下面，通过下标[]操作尽然无法获取到此下标对应的字符，得到undefined,所以采用charAt函数。
 //最基本的字符串拆分，才是最复杂的，比如json增删查改。Google，百度就靠这个
 //做得不完善，还需要继续完善。还差前面4个空格的判断了。。！！
 U.CD.CD.SplitHTMLInit = function (h) {
     //h = h.trim(); //看1473U.MS里面，去掉所有空格回车。晕，此函数不正确。
     //h = h.replace(/\s+/g, "");//这句正确，修改到1473UC中。但对于本项目不起作用，因为有些地方还必须要空格
     var i, s, e = 0, a = []; //a为返回的数组，i循环变量。s为<的起始点位置记录。e为单个字符的起始位置。
     for (i = 0; i < h.length; i++) {
         if (h.charAt(i) == "<") {
             if (e > s) {//如果e>s，表示e的记录晚于上一个s。
                 if (h.substring(e, i).replace(/\s+/g, "") != "")//有时候把前面4个空格,Tab等也作为一个数组了，需呀判断剔除，暂时这样写，以后用1473的函数，
                     a.push(h.substring(e, i)); //记录文本数据。还差一个记录前面空格了
             }
             s = i;
         }
         if (h.charAt(i) == ">") {
             if (h.charAt(i + 1) != "<") {
                 e = i + 1; //记录不是html标记的起始位置。
             }
             a.push(h.substring(s, i + 1));
         }
     };
     return a;
 }


//把传入进来的html内容，不带<div></div>的加上div分行标签。此处在控件中追加控件后会调用。。。比较重要。
 U.CD.CD.DrawCode = function (h, init) {
     //这里为什么不原样获取数据库内容和RS.htm中的内容，然后原样输出呢？因为获取RS.htm里面的内容排版是混乱的。同时有些特殊标记，例如注释等需要特别解析。
     //$("#UCD_CT_Code_CT").addAttrArray({ "onkeydown": U.CD.R.Wrap }); //给键盘事件，比如回车键赋予新函数。监控回车变化。
     var _HH = $("#UCD_CT_HH_CT")[0], _CA = $("#UCD_CT_Code_CT")[0]; //行号和代码区域
     var _a = U.CD.CD.SplitHTML(h, init), i; //行号
     _CA.innerHTML = ""; //代码内容清空。
     _HH.innerHTML = ""; //行号清空
     for (i = 0; i < _a.length; i++) {
         $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号
         //如果是注释，则标记绿色
         U.CD.CD.AllFilComments(_a[i], _CA);
     }
     _HH.style.height = _CA.scrollHeight+"px";        //设置行号滚动窗口
     //U.CD.CD.FushIframe(_CA); //反馈到结果视图中。

 }
//绘制行号
U.CD.CD.DrawLine = function (_HH,_CA) {
    var _line = _HH.getElementsByTagName("div").length + 1; //增加一个行号
    $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": _line }, _HH); //绘制行号
    _HH.style.height = _CA.scrollHeight+"px";        //设置行号滚动窗口
}









//初始化代码区域,不传递
U.CD.CD.InitCode = function () {
    return U.CD.CL.LangArr[U.CD.CL.Lang(U.CD.USLang)][0]; //初始化默认返回每种语言的第一位。
    //var _d = "#include <stdio.h>\nvoid main(){\n    printf(\"hello world\");\n}\n";
    //if (s) _d += s + "\n"; //如果传递了参数，则把参数加在body里面，否则执行初始化代码
    //_d += "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
    //return _d;
}

//在字符串前面追加n个空格,参数s为待插入字符，n为在第几个字符位置插入，以后还可以继续改写
U.M.Setprototype(String, "InsertStr", function (s, n) {  var t = this.substr(0, n); var e = this.substr(n, this.length);  return t + s + e;});
//返回元素位于父亲节点的索引位置,返回-1表示错误。因为有可能为0，不能返回false.
U.M.IndexOfParent = function (o) {
    var f = o.parentNode, i, s;
    if (!f) return -1; //找不到父亲节点，返回
    s = f.childNodes;
    for (i = 0; i < s.length; i++) if (s[i] == o) return i;
    return -1;
}
//首先检测有些特殊字符会导致浏览器假死的问题，例如ie7使用！！会导致浏览器假死。。
U.CD.CD.StrFilter = function (SO) {
    var s = SO.innerText;
    //判断SO是否位于跨域js之前，如果是之前，返回false。并提示用户在正确的地方输入。使用新方法解决了此问题
    //先检查是否在主域文件之上写了代码，如果写了，在Ie里面会识别不了下面的js
    //if (U.CD.CD.GetInPos(SO) < 4) { alert("输入位置不对，请看下面注释！"); return false; }
    U.CD.CD.FilterComments(s);
    var _B = U.CI.getBrowser(); //获取浏览器信息
    if (_B.browser == "msie" && (_B.ver == "7.0" || _B.ver == "8.0")) {
        //如果包含了！！号，则提示用户ie7不允许输入！！号，返回
        if (s.indexOf("!!") > -1) { alert("IE7,8输入'!!'会导致浏览器假死,请仔细检查!"); return false; }
    }
    return true;
}

//用户用户回车时的位置。
U.CD.CD.GetInPos = function (SO) {
    var _C,i;
    //如果用户拷贝代码，则会出现多层div。需要找到id为UCD_CT_Code_CT的div。
    for (i = 0; i < 100; i++) {
        if (SO.parentNode.id != "UCD_CT_Code_CT") { SO = SO.parentNode;}
        else { _C = SO; break;}
    }
    return U.M.IndexOfParent(_C);
}


 //添加注释函数，还没完成，以后继续。主要用户按下回车键获取当前行的判断
U.CD.CD.FilterComments = function (s) {
    //如果是//，则表示注释，标记为绿色。怎么标记?插入span标签？
    var _G = U.CD.TipR.GetPStyle(),_fz=false; //获取当前光标选中的字符包含的div。 
    if (s.indexOf("<!--") >= 0 && s.indexOf("-->") >= 0) { _fz = true; } //<!--  -->html注释。
    if (s.lTrim().substr(0, 2) == "//") { _fz = true; } //  //注释。
    if (_fz) { $(_G).addAttrArray({ "style": { "cssText": "color:green"} }); }
    else { $(_G).addAttrArray({ "style": { "cssText": "color:#333"} }); }
}
//添加注释，当获取用户文件数据时使用。会循环调用此函数
U.M.Setprototype(String, "lTrim", function () { return this.replace(/(^\s*)/g, ""); }); //去掉左边空格
U.CD.CD.AllFilComments = function (s, _CA) {
    //这里是复杂条件，该如何做？暂时如此，因为以后还会添加
    var _fz = false;
    if (s.indexOf("<!--") >= 0 && s.indexOf("-->") >= 0) { _fz = true; } //<!--  -->html注释。
    if (s.lTrim().substr(0, 2) == "//") { _fz = true; } //  //注释。
    //实际添加条目。
    if (_fz) { $$("div", { "style": { "color": "green" }, "className": "UCD_R_C_Line", "innerText": s }, _CA); }
    else { $$("div", { "className": "UCD_R_C_Line", "innerText": s }, _CA); }  //如果没有内容，则追加一行div，以后的新行都会是div，否则是p标签。 
}

U.M.Setprototype(String, "RemoveNBSP", function () { return this.replace(/&nbsp;/ig, ""); }); //去掉所有的&nbsp标签

//去掉运行结果或者错误结果中每行字符的右边空格以及目录标识。
U.CD.CD.ExecLangBack = function (s) {
    //如果用户在ide中输入的是数字，则s.replace会出错。需要转换为字符串
    if (typeof (s) == "number") s = s.toString();

    //截取掉以./userfiles/开始的+32位guid字符,. / 在正则表达式中必须加转义字符反斜杠\,有些编译型的格式为/output/userfiles，解释型的为./output
    //s = s.replace(/\.\/userfiles\/\w{32}/g, "test");
    s = s.replace(/(\.\/output|\.|)\/userfiles\/\w{32}/g, "test"); //(\.\/output|\.|)表示或者.或者./output或者什么都没有(在nodejs中会什么什么都没有), 所有转义前面加反斜杠\

    var z = s.replace(/\r\n/g, '\n').split('\n'), i, s = "";

    for (i = 0; i < z.length; i++) {
        //晕，昨天发现Chrome在div的中间有空格都不行。需要判断div中是否有nbsp字符？
        //if (z[i].indexOf("<") >= 0 && z[i].indexOf(">") >= 0){ z[i] = z[i].RemoveNBSP(); }//去掉所有$nbsp。不起作用！！很难调试。
        //else { z[i] = z[i].lTrim().Rtrim(); } //去掉左右空格
        z[i] = z[i].lTrim().Rtrim();
        s += z[i] + "\n"; //添加换行符
        //昨天遇到样式表前面留空格，在Chrome中也会运行错误。实现此函数比较麻烦。也不麻烦，有了思路再看。因为此处是运行时，所以其实不需要前面的if判断，所有空格全部清除。
    }
    //return z.join(""); //这是把字符串数组转为字符串的函数，但会去掉回车符号，不能使用。
    return s;
}
U.CD.CD.ExecIFCompChrome = function (s) {
    var z = s.replace(/\r\n/g, '\n').split('\n'), i, s = "";
    for (i = 0; i < z.length; i++) {
        //晕，昨天发现Chrome在div的中间有空格都不行。需要判断div中是否有nbsp字符？
        //if (z[i].indexOf("<") >= 0 && z[i].indexOf(">") >= 0){ z[i] = z[i].RemoveNBSP(); }//去掉所有$nbsp。不起作用！！很难调试。
        //else { z[i] = z[i].lTrim().Rtrim(); } //去掉左右空格
        z[i] = z[i].Rtrim();
        //Python居然用空格作为标识来运行程序，晕了！只能排出掉Python语言
        if(U.CD.USLang!="Python")
            z[i] = z[i].lTrim();  //Chrome浏览器必须要截取掉左边的空格，奇怪了
        s += z[i] + "\n"; //添加换行符
        //昨天遇到样式表前面留空格，在Chrome中也会运行错误。实现此函数比较麻烦。也不麻烦，有了思路再看。因为此处是运行时，所以其实不需要前面的if判断，所有空格全部清除。
    }
    //return z.join(""); //这是把字符串数组转为字符串的函数，但会去掉回车符号，不能使用。
    return s;
}








//--------------------------------------暂时无用的函数-------------------------------------------------------------------------
//绘制运行窗口的代码！初始化时会运行，从数据库中获取代码后也会运行。在代码窗口输入内容时不执行。
U.CD.R.NoUse = function (_CA) {
    var _HH = $("#UCD_CT_HH_CT")[0];
    //判断代码内容是否有多个<div style="line-height:20px;">嵌套。只允许出现一个，但徐嘉伟那边可以有多个，代码难度很大。
    var _code = U.CD.R.RemoveMoreLine(_CA); //计算是否有重复的div，历史遗留问题。
    _CA.innerHTML = _code.innerHTML; //反向赋值，否则无法显示，这处逻辑比较乱。思路不是很流畅。
    _HH.innerHTML = ""; //清空所有行号？
    var _nodes = _code.getElementsByTagName("div");
    //如果没有内容，则追加一行div，以后的新行都会是div，否则是p标签。
    if (_nodes.length == 0) { $$("div", { "className": "UCD_R_C_Line", "innerHTML": "" }, $("#UCD_CT_Code_CT")[0]); }
    //循环绘制行号。内容已经有了，不需要绘制了
    for (var i = 0; i < _nodes.length; i++) {
        $$("div", { "className": "UCD_R_Tab_Line", "innerHTML": i + 1 }, _HH); //绘制行号
    }
    //_HH.scrollTop = $("#UCD_CT_Code_CT")[0].scrollHeight;        //设置行号滚动窗口
}
//判断代码内容是否有多个<div style="line-height:20px;">嵌套。只允许出现一个，但徐嘉伟那边可以有多个，代码难度很大。解决历史遗留问题。
U.CD.R.RemoveMoreLine = function (c) {
    if (c.innerHTML == "") return c; //如果code为空，返回
    //var _r = c.cloneNode(); //用赋值语句是无法清除节点的，因为赋值2个对象修改任何一个另外一个也会修改，只能克隆。。使用克隆方法会遇到节点减少的问题。 //采用创建新节点的方式。
    var _r = document.createElement("div"); //创建一个新的div接受代码窗口赋值，否则，会出现引用循环问题。
    var _nodes = c.getElementsByTagName("div");
    for (var i = 0; i < _nodes.length; i++) {
        if (!_nodes[i].getElementsByTagName("div").length > 0)
            _r.appendChild(_nodes[i].cloneNode(true)); //克隆节点带true才能把里面内容全部拷贝。
    }
    return _r;
}


//此函数可以刷新子iframe框架的内容。如果是Chrome浏览器，则不能，Chrome不支持iframe窗口的location.reload。是Chrome的一个Bug
U.CD.CD.IFReload = function () {
    //$("#UCD_CT_SM_IF")[0].contentWindow.document.body.innerHTML += ""; //执行iframe中的内容，这是bug？
    //var _jr = $("#UCD_CT_SM_IF")[0].contentDocument || $("#UCD_CT_SM_IF")[0].contentWindow.document;
    //判断浏览器。
    if (U.CI.getBrowser().browser == "chrome") { U.CD.CD.ExecIF($("#UCD_CT_Code_CT")[0]); }
    else {
        var _jr = window.frames["UCD_CT_SM_IF"].document;
        _jr.location.reload();
    }
}
//检查是否为htm
U.UP.IsHTML = function () {}
//是否删除了UJ.js文件，如果删除了，提示用户，用于键盘回车键按下的时候。
U.CD.CD.IsDeleteDomain = function (s) {
    var z = s.replace(/\r\n/g, '\n').split('\n'), i;
    for (i = 0; i < z.length; i++) {
        if (z[i].lTrim().Rtrim() == "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>") {
            U.CD.CD.AlertDomain();
            return true;
        }
    }
    return false;
}
//当出现错误时在视图页面填充错误信息以及用户提醒。
U.CD.CD.FillErrorInfo = function () {
    var _d = "<html  xmlns='http://www.w3.org/1999/xhtml'>\n<head>\n    <title></title>\n    <link href='http://d.1473.cn/UJ.css' rel='stylesheet' type='text/css' />\n    <script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>\n</head>\n<body>\n<div style='color:red; font-size:20px;'>\n出错啦！！！\n</div>\n<div>\n代码中必须包含跨域文件http://d.1473.cn/uj.js。这是所有浏览器公有问题。\n</div>\n</body>\n</html>";
    U.CD.CD.DrawCode(_d, false);
}

//US.G = {}; //做一个统一的全部变量存放地方。否则，变量比较乱。
//US.G.ImgType = ["jpg", "gif", "png", "bmp", "jpeg"]; //太多地方要判断是否为图片了。做一个全局变量，否则很乱。为了避免重复，循环是全部转小写判断
//判断是否为图片类型,filename为文件名,辅助函数，以后可删除。放在UC里面了
//U.UP.IsImg = function (filename) {
//    var ext = U.UP.GetUpName(filename)[1].toLowerCase(); //得到文件扩展名并转换为小写。
//    var _A = US.G.ImgType, i; //全部转小写。
//    for (i = 0; i < _A.length; i++) {
//        if (ext == _A[i])
//            return true;
//    }
//    return false;
//}

//重新刷新iframe的新方法。。看起来无刷新，参数为代码区域的div...这句会到处调用，，这样可以做立时显示了，效果更好。
U.CD.CD.FushIframe = function (_CA) {
    //下面用try catch做功能，。
    try { U.CD.CD.ExecIF(_CA); }
    catch (e) { U.CD.CD.AlertDomain(); }
}
//独立出这个函数是为了加try catch。,暂时无用。
U.CD.CD.ExecIF = function (_CA) {
    //直接执行下面一句话会不停的往iframe里面追加内容，是追加，不是替换，会导致重复，
    //$("#UCD_CT_SM_IF")[0].contentWindow.document.write(_CA.innerText);
    //晕了，搞了半天，其实只需要做运行时自动追加一个<script src="http://d.1473.cn/UJ.js" type="text/javascript"></script>即可。
    //_CA.innerText=U.CD.CD.Is1473Domain(_CA.innerText);

    var s = U.CD.CD.ExecIFText(_CA); //判断Chrome浏览器在效果左右边加&nbsp的问题。

    //用这几句话会替换iframe中的内容，并且无需重新装载iframe，像本机操作。
    var newDoc = $("#UCD_CT_SM_IF")[0].contentWindow.document.open("text/html", "replace");
    newDoc.write(s);
    //if()  ie7有Bug,按道理需要newDoc.close(),但ie7敲入特殊字符（!!）会导致整个屏幕死掉。解决方案可以判断ie7，不关闭。暂时全部不要close。
    //排除会导致ie7假死的字符。
    //if (U.CI.getBrowser().browser != "rv") newDoc.close(); //rv是firefox的标记，奇怪了
    newDoc.close();
}
U.M.Setprototype(String, "Rtrim", function () { return this.replace(/(\s*$)/g, ""); }); //去掉右边空格
//传入代码窗口div，得到里面的innerText,由于兼容性问题，需要独立一个函数。
U.CD.CD.ExecIFText = function (_CA) {
    var s = _CA.innerText || _CA.textContent; //textContent兼容FireFox，但好像还是有问题
    //s = s.replace(/&nbsp;/ig, ""); //去掉所有的nbsp,因为是输出结果，所有可以这样做。
    //如果是chrome浏览器，需要去掉除html标签行的左右空格。
    if (U.CI.getBrowser().browser == "chrome") { s = U.CD.CD.ExecIFCompChrome(s); }
    if (U.CI.getBrowser().browser == "firefox") { s = U.CD.CD.ExecIFCompChrome(s); }
    if (U.CI.getBrowser().browser == "rv") { s = U.CD.CD.ExecIFCompChrome(s); } //rv也是firefox的

    //强制追加一行，不管有没有<script src="http://d.1473.cn/UJ.js" type="text/javascript"></script>。只是做执行时追加，以前想得太复杂。
    s = s + "\n" + "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>";
    s = s + "\n" + "<link href='http://d.1473.cn/UJ.css' rel='stylesheet' type='text/css' />";
    return s;
}
//判断是否有1473主域，否则会出现跨域访问。如果没有，则需要在head中追加。
U.CD.CD.Is1473Domain = function (s) {
    var i, _t = s.replace(/\r\n/g, '\n').split('\n');
    //找到1473主域js，不理会，直接返回
    for (i = 0; i < _t.length; i++) { if (_t[i].toLowerCase().indexOf("http://d.1473.cn/UJ.js".toLowerCase()) > -1) return s; }
    //大于7行，则插入到head中插入比较复杂，暂时不理会这个函数
    if (_t.length > 7) {
        _t.splice(5, 0, "<script src='http://d.1473.cn/UJ.js' type='text/javascript'></script>");
        //合并输出到s。此功能暂未实现。
    }
    //小于4行，则视为乱码，另外初始化代码区域，把内容追加到body中。
    if (_t.length < 4) {
        s = U.CD.CD.InitCode(s); //追加s到初始化代码的body中。
    }
    return s;
}


