Namespace.register("U.CD.Tip");


//一个包含提示值得数组
U.CD.Tip.d = ["getElementById", "getElementsByTagName", "toString", "valueOf", "appendChild", "apply", "call", "removeChild", "style", "getElementsByTagName", "getElementsByTagName", "getElementsByTagName"];
U.CD.Tip.d.style = ["width", "height", "top", "left", "backgroundColor", "color", "", "", ""];
//代码提示时响应此函数。
U.CD.Tip.Init = function () {
    //创建tips菜单在document.body中
    var _TBOX = $$("div", { "id": "UCD_TP_TB", "style": { "display": "none"} }, document.body); //document.body
    for (var i = 0; i < U.CD.Tip.d.length; i++) {//循环提示值数组
        var _ct = $$("div", { "className": "UCD_TP_TB_N" }, _TBOX); //追加变量图标 
        $$("div", { "className": "UCD_TP_TB_N_T", "innerHTML": "☆" }, _ct); //追加变量图标
        $$("div", { "className": "UCD_TP_TB_N_D", "innerHTML": U.CD.Tip.d[i], "onmouseover": [U.CD.Tip.Active, ([i])], "onmousedown": [U.CD.Tip.SI, ([U.CD.Tip.d[i]])] }, _ct); //追加文件值和事件
    }
}


//显示提示框函数
U.CD.Tip.Show = function () {
    var _T = $("#UCD_TP_TB")[0]; //提示框最大外框
    //var _R = U.D.E.GetSelectionRange(window, $("#UCD_CT_Code_CT")[0], { "TF": "UCD_CODE", "CB": U.CD.R.Wrap }); //获取光标位置。必须重新获取光标位置，奇怪，以后研究
    var _R = U.CD.TipR; //从全局变量获取
    var _G = _R.GetPStyle(); //获取当前光标选中的字符包含的div。  
    var _GWZ = _R.GetGBWZ(_G); //返回光标位于div行第几个的字符位置
    var _if = U.M.GetElementInfo(_G);   //获取div的各种间距
    if (_T.style.display == "none") { //如果存在tips框
        _T.style.display = "block"; //不用创建直接显示
        //获取行的距离+字符间距约为10*字符序列 //高度要加上行高   
        _T.style.left = _if.BCRL + U.CD.Tip.GetStrWidth(_GWZ) + "px"; //_T.style.left = _if.BCRL + _GWZ * 10 + "px"; 
        _T.style.top = _if.BCRT + 10 + "px"; _T.firstChild.style.backgroundColor = "silver"; _T.firstChild.focus(); //聚集
        _T.onkeydown = U.M.apply(this, [[U.CD.Tip.KeyDown, ([_R])]]); //赋予键盘事件
    }
}
//计算提示框的垂直位置，因为有些地方会导致下面看不到，以后再搞了。
U.CD.Tip.YPosition = function () { }
//获取光标坐标位置的函数，其他地方没有的，需要封装在编辑器中。临时创建一个span，字体大小和字体设置得和编辑器一样，计算宽度，用完删除。
U.CD.Tip.GetStrWidth = function (_GWZ) {
    var i, _re = ""; for (i = 0; i < _GWZ; i++) { _re += "a"; } //有些空格及特殊字符会导致问题，现在采用追加"aaaaaaaaaaaaaaa"试一下
    var _w, _a = $$("div", { "innerHTML": _re, "style": { "cssText": "font-family:Consolas; font-size:14px; position:absolute;top:5000px;left:0px;"} }, document.body);
    _w = _a.offsetWidth; document.body.removeChild(_a); return _w; //移除临时节点
}

//在body区域按下左键，隐藏提示框,还差一个在iframe区域如何判断是否按下左键。光标置于提示区域之外都要隐藏//提示框外壳//判断鼠标是否在提示框之外。
U.CD.Tip.HidTip = function () { $("#UCD_TP_TB")[0].style.display = "none"; }

//js实现hover;
U.CD.Tip.Active = function (_index) {
    var _t = $("#UCD_TP_TB")[0], _z = _t.childNodes; //获取tips菜单框 //获取提示数组
    for (var i = 0; i < _z.length; i++) {
        if (i == _index) { _z[i].style.backgroundColor = "rgb(255,236,181)"; }        //选中的索引数字
        else { _z[i].style.backgroundColor = ""; }
    }
}

//判断提示框的第几个元素被选中，也可做全局变量，暂时用局部变量。//循环选择返回选中的索引
U.CD.Tip.CurPosition = function () {
    var _t = $("#UCD_TP_TB")[0], _z = _t.childNodes; //获取tips菜单框     //获取提示数组 
    for (var i = 0; i < _z.length; i++) { if (_z[i].style.backgroundColor != "") return i; }
    return 0; //默认返回第一个。
}

//选择提示菜单单击时追加代码到代码区域.tipvalue 这是选中的值。_R为所选择的光标,参数r为选项的值。
U.CD.Tip.SI = function (r) {
    var _R = U.CD.TipR; //从全局变量获取
    var _G = _R.Replace(r); //追加值到光标后面
    $("#UCD_TP_TB")[0].style.display = "none"; // //获取Tip菜单隐藏
    //U.M.StopBubble();此处会触发代码区域的回车键，如何阻止？
}

//键盘控制函数，一个程序只能有1个键盘控制函数，因此把此键盘函数注入到主程序键盘中。
U.CD.Tip.KeyDown = function (_R) {
    var _k = event.keyCode, _i = 0, _t = $("#UCD_TP_TB")[0], _z = _t.childNodes.length, _d; //获取tips菜单框 ,_z为数组长度,_d为选中的提示符。//获取提示数组
    _i = U.CD.Tip.CurPosition();    //获取提示框的当前位置
    if (_t.style.display != "none") {
        if (_k == 38) { if (_i > 0) _i--; } //按下↑//初始>0//减一
        if (_k == 40) { if (_i < _z) { _i++; } else { _i = _z - 1; } } //按下↓//小于数组长度//加一//选择最后一个
        //按下回车键
        if (_k == 10 || _k == 13) {
            _R.Replace(""); _d = _t.childNodes[_i]; U.CD.Tip.SI(U.CD.Tip.d[_i], _R); U.M.StopDefault(); return;
        }
        if (_k == 8 || _k == 27) { U.CD.Tip.HidTip(); _R.Replace(""); } //按下了退格键，则隐藏提示框_k == 8  表示Backspace键盘  27代码esc键盘 //创建光标,使用空字符串
        U.CD.Tip.Active(_i);

    }
}

//判断是否该弹出提示框，条件为：从当前行往上找，没有找到script标签，则不弹出，如果找到script标签，则弹出。参数为当前行
//以后的工作更加繁重，因为还有css样式的智能弹出。这个工作量比较大了
U.CD.Tip.IsJs = function (h) {
    //如果上一行为</sciprt>跳出  如果上一行是否有"<script" 这几个字符，则弹出提示
    var _ch; //
    //判断本行元素，判断字符前面是否有变量,如何判断呢？.前面是否有字符作为判断,并且中间没有.号，如果有.号，可以显示字符串函数！如有改动，以后再说。
    //整个判断比较复杂，思路以后再理。
    var _R = U.CD.TipR; var _G = _R.GetPStyle(); var _GWZ = _R.GetGBWZ(_G);
    var _z = h.innerText.substr(0, _GWZ).trim(); //得到前面的字符。
    if (_z.length <= 0) { return false; } // <=1是因为有1个.号
    //判断上一行元素
    while (h.previousSibling != null) {
        h = h.previousSibling, _ch = h.innerText.trim();
        if (_ch.substr(0, 9).toLowerCase() == "</script>") break; //跳出循环。
        if (_ch.substr(0, 7).toLowerCase() == "<script") { return true; }
    }
    return false;
}
//判断提示框是否为css，包含了在html元素中的以及独立的css。
U.CD.Tip.IsCss = function () { return false; }















