﻿
var map = null;            // 定义实例化图表显示类(名称)
tb.ball = /chartBall/i;    // 球正则判断

/* 图表显示类 */
tb.display = function(nameXML, colspan, showNumber, showTime, vote) {
    this.oXmlDom = tb.xml.callXML(tb.xml.urlXML() + nameXML, false, false);
    this.childNodes = this.oXmlDom.childNodes;
    this.oLen = this.childNodes.length;
    this.colspan = colspan;       // 图表参数
    this.showNumber = showNumber; // 是否显示开奖号码
    this.showTime = showTime;     // 是否显示开奖时间
    this.vote = vote;             // 图表编号（格式："彩种编号_类型_编号"）
    this.indent = null;           // 连线缩减（防止覆盖球）
    this.type = null;             // 图表类型

    this.omit = [];               // 遗漏值
    this.maxomit = [];            // 最大遗漏值
    this.frequency = [];          // 出现次数

    this.gYL = [];                // 遗漏
    this.spaceLine = [];          // 水平分隔线
    this.cLayer = [];             // 遗漏分层列标
    this.gLayer = [];             // 遗漏分层
    this.gB = [];                 // 连线球<td>对象
    this.gT = [];                 // 连线球坐标
    this.joinLine = [];           // 实例化连线类对象    

    this.gYLCSS = "gYL";          // 遗漏CSS
    this.gLayerCSS = "gLayer";    // 遗漏分层CSS
}

tb.display.prototype = {

    /* 计算开奖号码 */
    show_st: function(code, id) {
        var i, back = null;
        switch (id) {
            case 1: // 和值
                var sum = 0;
                for (i = 0; i < code.length; i++) {
                    sum += parseInt(code[i], 10);
                }
                back = sum;
                break;
            case 2: // 奇偶比
                var ji = 0;
                for (i = 0; i < code.length; i++) {
                    if (parseInt(code[i], 10) % 2 == 1) ji++;
                }
                back = ji + ":" + (code.length - ji);
                break;
            case 3: // 大小比
                var da = 0;
                for (i = 0; i < code.length; i++) {
                    if (parseInt(code[i], 10) >= 5) da++;
                }
                back = da + ":" + (code.length - da);
                break;
            case 4: // 和尾
                back = this.show_st(code, 1) % 10;
                break;
            case 5: // 跨度
                back = maxValue(code) - minValue(code);
                break;
            case 6: // 大小
                var dx = "";
                for (i = 0; i < code.length; i++) {
                    if (parseInt(code[i], 10) >= 5) dx += "大";
                    else dx += "小";
                }
                back = dx;
                break;
            case 7: // 奇偶
                var jo = "";
                for (i = 0; i < code.length; i++) {
                    if (parseInt(code[i], 10) % 2 == 1) jo += "奇";
                    else jo += "偶";
                }
                back = jo;
                break;
            case 8: // 除3余数
                var ys = "";
                for (i = 0; i < code.length; i++) {
                    ys += parseInt(code[i], 10) % 3;
                }
                back = ys;
                break;
        }
        return back;
    },

    /* 显示开奖号码 */
    show_code: function(code) {
        var back = [], s, t;
        switch (this.vote) {
            case "0_0_1": // （时时乐）开奖分布图
            case "1_1_1": // （时时彩）三星开奖分布图
                s = str_split(code, 1);
                back.push(code.substring(0, 1));
                back.push(code.substring(1, 2));
                back.push(code.substring(2, 3));
                back.push(this.show_st(s, 1)); // 和值
                back.push(this.show_st(s, 2)); // 奇偶比
                back.push(this.show_st(s, 3)); // 大小比
                back.push(s.join(","));        // 0-9分布
                break;
            case "0_0_2": // （时时乐）和值分布图
            case "1_0_2": // （时时彩）五星和值分布图
            case "1_1_2": // （时时彩）三星和值分布图
            case "1_2_2": // （时时彩）二星和值分布图
            case "1_5_2": // （时时彩）四星和值分布图
                t = this.show_st(str_split(code, 1), 1);
                back.push(t);      // 和值
                back.push(t % 10); // 和尾
                break;
            case "0_0_3": // （时时乐）跨度分布图
            case "1_0_3": // （时时彩）五星跨度分布图
            case "1_1_3": // （时时彩）三星跨度分布图
            case "1_2_3": // （时时彩）二星跨度分布图
            case "1_5_3": // （时时彩）四星跨度分布图
                t = this.show_st(str_split(code, 1), 5);
                back.push(t);     // 跨度
                back.push(t % 3); // 除3余数
                back.push(t);     // 跨度值
                break;
            case "0_0_4": // （时时乐）大小分布图
            case "1_1_4": // （时时彩）三星大小分布图
            case "1_2_4": // （时时彩）二星大小分布图
                s = str_split(code, 1);
                back.push(this.show_st(s, 6)); // 大小形态
                back.push(this.show_st(s, 3)); // 大小分布
                break;
            case "0_0_5": // （时时乐）奇偶分布图
            case "1_1_5": // （时时彩）三星奇偶分布图
            case "1_2_5": // （时时彩）二星奇偶分布图
                s = str_split(code, 1);
                back.push(this.show_st(s, 7)); // 奇偶形态
                back.push(this.show_st(s, 2)); // 奇偶分布
                break;
            case "0_0_6": // （时时乐）除3余数分布图
            case "1_1_6": // （时时彩）三星除3余数分布图
                s = str_split(code, 1);
                var a = code.substring(0, 1);
                var b = code.substring(1, 2);
                var c = code.substring(2, 3);
                back.push(a);
                back.push(b);
                back.push(c);
                back.push(this.show_st(s, 8));
                back.push(a % 3);
                back.push(b % 3);
                back.push(c % 3);
                break;
            case "0_0_7": // （时时乐）组选分布图
            case "1_1_7": // （时时彩）三星组选分布图
            case "1_2_7": // （时时彩）二星组选分布图
                t = str_split(code, 1).join(",");
                back.push(t);
                back.push(t);
                back.push(t);
                break;
            case "1_0_1": // （时时彩）五星开奖分布图
                s = str_split(code, 1);
                back.push(code.substring(0, 1));
                back.push(code.substring(1, 2));
                back.push(code.substring(2, 3));
                back.push(code.substring(3, 4));
                back.push(code.substring(4, 5));
                back.push(this.show_st(s, 1)); // 和值
                back.push(this.show_st(s, 2)); // 奇偶比
                back.push(this.show_st(s, 3)); // 大小比
                break;
            case "1_0_4": // （时时彩）五星除3余数分布图
                back.push(code.substring(0, 1));
                back.push(code.substring(1, 2));
                back.push(code.substring(2, 3));
                back.push(code.substring(3, 4));
                back.push(code.substring(4, 5));
                back.push(this.show_st(str_split(code, 1), 8));
                break;
            case "1_2_1": // （时时彩）二星开奖分布图
                s = str_split(code, 1);
                back.push(code.substring(0, 1));
                back.push(code.substring(1));
                back.push(this.show_st(s, 1)); // 和值
                back.push(this.show_st(s, 2)); // 奇偶比
                back.push(this.show_st(s, 3)); // 大小比
                back.push(s.join(","));        // 0-9分布
                break;
            case "1_2_6": // （时时彩）二星除3余数分布图
                var a = code.substring(0, 1);
                var b = code.substring(1);
                back.push(a);
                back.push(b);
                back.push(this.show_st(str_split(code, 1), 8));
                back.push(a % 3);
                back.push(b % 3);
                break;
            case "1_3_1": // （时时彩）一星开奖分布图
                s = str_split(code, 1);
                back.push(code);
                back.push(this.show_st(s, 7)); // 奇偶
                back.push(this.show_st(s, 6)); // 大小
                back.push(this.show_st(s, 8)); // 除3余数
                break;
            case "1_4_1": // （时时彩）大小单双分布图
                var a = code.substring(0, 1);
                var b = code.substring(1);
                if (a > 4 && b > 4) back.push("大大");
                if (a > 4 && b < 5) back.push("大小");
                if (a < 5 && b > 4) back.push("小大");
                if (a < 5 && b < 5) back.push("小小");

                if (a % 2 == 0 && b % 2 == 0) back.push("双双");
                if (a % 2 == 0 && b % 2 == 1) back.push("双单");
                if (a % 2 == 1 && b % 2 == 0) back.push("单双");
                if (a % 2 == 1 && b % 2 == 1) back.push("单单");

                if (a > 4 && b % 2 == 1) back.push("大单");
                if (a > 4 && b % 2 == 0) back.push("大双");
                if (a < 5 && b % 2 == 1) back.push("小单");
                if (a < 5 && b % 2 == 0) back.push("小双");

                if (a % 2 == 1 && b > 4) back.push("单大");
                if (a % 2 == 0 && b > 4) back.push("双大");
                if (a % 2 == 1 && b < 5) back.push("单小");
                if (a % 2 == 0 && b < 5) back.push("双小");

                if (a > 4) back.push("大");
                else back.push("小");

                if (a % 2 == 1) back.push("单");
                else back.push("双");

                if (b > 4) back.push("大");
                else back.push("小");

                if (b % 2 == 1) back.push("单");
                else back.push("双");
                break;
            case "1_5_1": // （江西时时彩）四星开奖分布图
                s = str_split(code, 1);
                back.push(code.substring(0, 1));
                back.push(code.substring(1, 2));
                back.push(code.substring(2, 3));
                back.push(code.substring(3, 4));
                back.push(this.show_st(s, 1)); // 和值
                back.push(this.show_st(s, 2)); // 奇偶比
                back.push(this.show_st(s, 3)); // 大小比
                back.push(s.join(","));        // 0-9分布
                break;
            case "2_0_1": // （11运夺金）开奖分布图
            case "2_1_4": // （11运夺金）前三组选分布图
            case "2_2_4": // （11运夺金）前二组选分布图
                s = code.split(",");
                back.push(code);
                back.push(this.show_st(s, 1)); // 和值
                back.push(this.show_st(s, 2)); // 奇偶比
                break;
            case "2_0_2": // （11运夺金）和值分布图
            case "2_1_2": // （11运夺金）前三和值分布图
            case "2_2_2": // （11运夺金）前二和值分布图
                t = this.show_st(code.split(","), 1);
                back.push(t);      // 和值
                back.push(t % 10); // 和尾
                break;
            case "2_0_3": // （11运夺金）跨度分布图
            case "2_1_3": // （11运夺金）前三跨度分布图
            case "2_2_3": // （11运夺金）前二跨度分布图
                t = this.show_st(code.split(","), 5);
                back.push(t);     // 跨度
                back.push(t % 3); // 除3余数
                back.push(t);     // 跨度值
                break;
            case "2_1_1": // （11运夺金）前三开奖分布图
                s = code.split(",");
                back.push(s[0]);
                back.push(s[1]);
                back.push(s[2]);
                back.push(this.show_st(s, 1)); // 和值
                back.push(this.show_st(s, 2)); // 奇偶比
                break;
            case "2_2_1": // （11运夺金）前二开奖分布图
                s = code.split(",");
                back.push(s[0]);
                back.push(s[1]);
                back.push(this.show_st(s, 1)); // 和值
                back.push(this.show_st(s, 2)); // 奇偶比
                break;
            case "2_3_1": // （11运夺金）前一开奖分布图
                back.push(code);
                back.push(this.show_st(code.split(","), 7)); // 奇偶
                break;
        }
        return back;
    },

    /* 返回图表体 */
    show_map: function(n) {
        var size = 1, len = this.colspan.length;
        for (var i = 0; i < len; i++) {
            size += this.colspan[i].split("$")[0].split(",").length;
        }
        for (i = 0; i < size; i++) {
            this.omit[i] = 0;
            this.maxomit[i] = 0;
            this.frequency[i] = 0;
        }

        if (this.oLen < n) n = this.oLen;
        var expect, number, showcode, html = "<tbody id=\"data\">";
        var rows = 0; cells = 0;
        for (i = n - 1; i >= 0; i--) {
            cells = 0;
            expect = this.childNodes.item(i).getAttribute("qishu");
            number = this.childNodes.item(i).getAttribute("code");
            if (this.type == null) showcode = number;
            else {
                var string = select_code(number, this.type);
                if (string.length < 0) return;
                var h = string.split("?");
                number = h[0]; showcode = h[1];
            }
            html += "<tr> \
                       <td class=\"padd_1\"></td> \
                       <td class=\"qishu\">" + expect.substring(2, expect.length) + "</td> \
                       <td class=\"padd_1\"></td>";
            cells += 3;
            if (this.showNumber) {
                html += "<td class=\"haoma\">" + showcode + "</td><td class=\"padd_1\"></td>";
                cells += 2;
            }
            if (this.showTime) {
                var date = new Date(Date.parse(this.childNodes.item(i).getAttribute("date").replace(/-/g, "/")));
                var h = date.getHours().toString();
                var m = date.getMinutes().toString();
                html += "<td class=\"qishu\">" + padLeft(h, "0", 2) + ":" + padLeft(m, "0", 2) + "</td><td class=\"padd_1\"></td>";
                cells += 2;
            }
            size = 0;
            var js = this.show_code(number);
            if (js.length < 1) return;
            for (var j = 0; j < len; j++) {
                var cols = this.colspan[j].split("$");
                var back = js[j];
                if (cols[0] != "->") {
                    var code = cols[0].split(",");
                    for (var k = 0; k < code.length; k++) {
                        if (code[k] == "-") {
                            html += "<td class=\"" + cols[1] + "\"></td>";
                            cells++;
                            continue;
                        }

                        // 统计遗漏 | 出现次数
                        var t = count(back.toString().split(","), isNaN(code[k]) ? code[k] : parseInt(code[k], 10));
                        if (t > 0) {
                            this.omit[size + k] = 0;     // 遗漏
                            this.frequency[size + k]++;  // 出现次数

                            if (t > 1) {
                                html += "<td class=\"" + cols[1] + " " + cols[3] + "\"> \
                                           <div style=\"position:absolute\"><div class=\"smallball_" + t + "\">" + t + "</div></div> \
                                           " + code[k] + " \
                                         </td>";
                            } else {
                                html += "<td class=\"" + cols[1] + " " + cols[3] + "\">" + code[k] + "</td>";
                            }

                            var joinLine = cols[4];
                            if (joinLine && joinLine.split(",")[0] == 1) {
                                if (this.gT[j] == undefined) this.gT[j] = "";
                                this.gT[j] += "[" + rows + "].cells[" + cells + "]" + ",";
                            }
                        } else {
                            this.omit[size + k]++;

                            // 统计最大遗漏值
                            if (this.omit[size + k] > this.maxomit[size + k]) this.maxomit[size + k] = this.omit[size + k];

                            html += "<td class=\"" + cols[1] + " " + cols[2] + "\">" + this.omit[size + k] + "</td>";

                            this.gYL.push("[" + rows + "].cells[" + cells + "]");

                            if (i == 0) this.cLayer.push(cells);
                        }

                        cells++;
                    }
                    size += code.length;
                } else {
                    html += "<td class=\"" + cols[1] + " " + cols[2] + "\">" + back + "</td>";
                    cells++;
                };

                html += "<td class=\"padd_1\"></td>";
                cells++;
            }
            html += "</tr>";

            if (i % 5 == 0 && i > 0) {
                html += "<tr class=\"hLine\"><td colspan=\"85\"></td></tr>";
                rows++;
                this.spaceLine.push("[" + rows + "].cells[0]");
            }
            rows++;
        }
        html += "</tbody>";

        /* 预选区，统计区 */
        html += "<tbody id=\"elect\">";
        var ahtml = "<tr> \
                       <td class=\"padd_1\"></td> \
                       <td align=\"center\" class=\"tLine\">出现次数</td> \
                       <td class=\"padd_1\"></td>";
        var bhtml = "<tr> \
                       <td class=\"padd_1\"></td> \
                       <td align=\"center\" class=\"bLine\">最大遗漏</td> \
                       <td class=\"padd_1\"></td>";
        var cssLine;
        for (i = 0; i < 5; i++) {
            if (i == 0) cssline = "tLine";
            else cssline = "";
            html += "<tr id=\"tr_vote_" + (i + 1) + "\"> \
                       <td class=\"padd_1\"></td> \
                       <td align=\"center\" class=\"" + cssline + "\">" + "预选区" + (i + 1) + "</td> \
                       <td class=\"padd_1\"></td>";
            if (this.showNumber) {
                html += "<td class=\"" + cssline + "\"> - </td><td class=\"padd_1\"></td>";
                if (i == 0) {
                    ahtml += "<td align=\"center\" class=\"tLine\"> - </td> \
                              <td class=\"padd_1\"></td>";
                    bhtml += "<td align=\"center\" class=\"bLine\"> - </td> \
                              <td class=\"padd_1\"></td>";
                };
            }
            if (this.showTime) {
                html += "<td class=\"" + cssline + "\"> - </td><td class=\"padd_1\"></td>";
                if (i == 0) {
                    ahtml += "<td align=\"center\" class=\"tLine\"> - </td> \
                              <td class=\"padd_1\"></td>";
                    bhtml += "<td align=\"center\" class=\"bLine\"> - </td> \
                              <td class=\"padd_1\"></td>";
                };
            }

            if (i == 0) size = 0;
            for (j = 0; j < len; j++) {
                cols = this.colspan[j].split("$");
                if (cols[0] != "->") {
                    code = cols[0].split(",");
                    for (k = 0; k < code.length; k++) {
                        if (code[k] == "-") {
                            html += "<td class=\"" + cssline + " " + cols[1] + "\"> - </td>";
                            if (i == 0) {
                                ahtml += "<td class=\"" + cols[1] + " tLine\"> - </td>";
                                bhtml += "<td class=\"" + cols[1] + " bLine\"> - </td>";
                            };
                            continue;
                        }
                        html += "<td class=\"" + cssline + " " + cols[1] + " " + cols[2] + "\" onclick=\"select_singleball('" + cols[3] + "',this);\" style=\"cursor:pointer;\">" + code[k] + "</td>";
                        if (i == 0) {
                            ahtml += "<td class=\"" + cols[1] + " " + cols[2] + " tLine\" valign=\"bottom\">" + this.frequency[size + k] + "</td>";
                            bhtml += "<td class=\"" + cols[1] + " " + cols[2] + " bLine\" valign=\"bottom\">" + this.maxomit[size + k] + "</td>";
                        };
                    }
                    if (i == 0) size += code.length;
                } else {
                    html += "<td class=\"" + cssline + " " + cols[1] + "\"> - </td>";
                    if (i == 0) {
                        ahtml += "<td class=\"" + cols[1] + " tLine\"> - </td>";
                        bhtml += "<td class=\"" + cols[1] + " bLine\"> - </td>";
                    };
                };

                html += "<td class=\"padd_1\"></td>";
                if (i == 0) {
                    ahtml += "<td class=\"padd_1\"></td>";
                    bhtml += "<td class=\"padd_1\"></td>";
                };
            }
            html += "</tr>";
        }
        ahtml += "</tr>";
        bhtml += "</tr>";
        html += "</tbody>";
        /* 预选区，统计区 */

        html += "<tbody id=\"count\"> \
                   " + ahtml + bhtml + " \
                 </tbody>";

        return html;
    },

    /* 增加一行 */
    add_row: function(expect, number, time) {
        var trs = $("data").rows, ct = $("count"), rows = trs.length, cells = 0;
        var cs = ct.rows.item(0).cells, mo = ct.rows.item(1).cells;
        var showcode, trNode, tdNode;

        if (this.type == null) showcode = number;
        else {
            var string = select_code(number, this.type);
            if (string.length < 0) return;
            var h = string.split("?");
            number = h[0]; showcode = h[1];
        }

        // 水平分割线
        if ((rows + 1) % 6 == 0) {
            trNode = document.createElement("tr");
            trNode.className = "hLine";
            tdNode = document.createElement("td");
            tdNode.colSpan = 85;
            trNode.appendChild(tdNode);
            $("data").appendChild(trNode);

            eval("this.spaceLine.push(trs[" + rows + "].cells[0])");
            rows++;
        }

        trNode = document.createElement("tr")
        for (var i = 0; i < 3; i++) {
            tdNode = document.createElement("td");
            if (i == 1) {
                tdNode.className = "qishu";
                tdNode.innerHTML = expect;
            } else {
                tdNode.className = "padd_1";
            }
            trNode.appendChild(tdNode);
            cells++;
        }

        if (this.showNumber) {
            tdNode = document.createElement("td");
            tdNode.className = "haoma";
            tdNode.innerHTML = showcode;
            trNode.appendChild(tdNode);

            tdNode = document.createElement("td");
            tdNode.className = "padd_1";
            trNode.appendChild(tdNode);
            cells += 2;
        }

        if (this.showTime) {
            tdNode = document.createElement("td");
            tdNode.className = "qishu";
            tdNode.innerHTML = time;
            trNode.appendChild(tdNode);

            tdNode = document.createElement("td");
            tdNode.className = "padd_1";
            trNode.appendChild(tdNode);
            cells += 2;
        }

        var js = this.show_code(number);
        if (js.length < 1) return;
        var size = 0, gYL = [];
        this.cLayer = [];
        for (var j = 0; j < this.colspan.length; j++) {
            var cols = this.colspan[j].split("$");
            var back = js[j];
            if (cols[0] != "->") {
                var code = cols[0].split(",");
                for (var k = 0; k < code.length; k++) {
                    if (code[k] == "-") {
                        tdNode = document.createElement("td");
                        tdNode.className = cols[1];
                        trNode.appendChild(tdNode);
                        cells++;
                        continue;
                    }

                    var t = count(back.toString().split(","), isNaN(code[k]) ? code[k] : parseInt(code[k], 10));
                    if (t > 0) {
                        this.omit[size + k] = 0;     // 遗漏
                        this.frequency[size + k]++;  // 出现次数

                        tdNode = document.createElement("td");
                        tdNode.className = cols[1] + " " + cols[3];

                        if (t > 1) tdNode.innerHTML = "<DIV STYLE=\"POSITION:ABSOLUTE\"><DIV CLASS=\"smallball_" + t + "\">" + t + "</DIV></DIV>" + code[k];
                        else tdNode.innerHTML = code[k];

                        trNode.appendChild(tdNode);

                        var joinLine = cols[4];
                        if (joinLine && joinLine.split(",")[0] == 1) {
                            if (this.gT[j] == undefined) this.gT[j] = "";
                            this.gT[j] += "[" + rows + "].cells[" + cells + "]" + ",";
                        }
                    } else {
                        this.omit[size + k]++;

                        // 统计最大遗漏值
                        if (this.omit[size + k] > this.maxomit[size + k]) this.maxomit[size + k] = this.omit[size + k];

                        tdNode = document.createElement("td");
                        tdNode.className = cols[1] + " " + cols[2];
                        if ($("c_d") && $("c_d").checked) tdNode.className += " " + this["gYLCSS"];
                        tdNode.innerHTML = this.omit[size + k];
                        trNode.appendChild(tdNode);

                        gYL.push("[" + rows + "].cells[" + cells + "]");
                        this.cLayer.push(cells);
                    }

                    // 更新出现次数，最大遗漏
                    cs.item(cells).innerHTML = this.frequency[size + k];
                    mo.item(cells).innerHTML = this.maxomit[size + k];

                    cells++;
                }
                size += code.length;
            } else {
                tdNode = document.createElement("td");
                tdNode.className = cols[1] + " " + cols[2];
                tdNode.innerHTML = back;
                trNode.appendChild(tdNode);
                cells++;
            };

            tdNode = document.createElement("td");
            tdNode.className = "padd_1";
            trNode.appendChild(tdNode);
            cells++;
        }
        $("data").appendChild(trNode);

        if ($("c_o") && $("c_o").checked) {
            /* 清除表格遗漏分层 */
            for (i = 0; i < this.gLayer.length; i++) {
                var obj = this.gLayer[i];
                obj.className = obj.className.replace(" " + this["gLayerCSS"], "");
            }
        }
        this.gLayer = [];

        /* 更新遗漏， 遗漏分层 */
        var a = gYL.length; b = this.cLayer.length;
        var t = [a, b], max = maxValue(t);

        for (i = 0; i < max; i++) {
            if (i < a) eval("this.gYL.push(trs" + gYL[i] + ")"); // 遗漏
            if (i < b) this.oLayer(trs, i); // 遗漏分层
        }

        if ($("c_o") && $("c_o").checked) {
            /* 更新表格遗漏分层 */
            for (i = 0; i < this.gLayer.length; i++) {
                var obj = this.gLayer[i];
                obj.className += " " + this["gLayerCSS"];
            }
        }

        /* 更新连线 */
        for (i = 0; i < this.joinLine.length; i++) this.joinLine[i].remove();
        this.oJoinLine();
        this.show_joinLine();
    },

    /* 遍历表体 */
    check_tbody: function() {
        var trs = $("data").rows;
        var a = this.gYL.length, b = this.spaceLine.length, c = this.cLayer.length;
        var t = [a, b, c], max = maxValue(t);

        for (var i = 0; i < max; i++) {
            if (i < a) eval("this.gYL[i] = trs" + this.gYL[i]); // 遗漏
            if (i < b) eval("this.spaceLine[i] = trs" + this.spaceLine[i]); // 水平分割线
            if (i < c) this.oLayer(trs, i); // 遗漏分层
        }
    },

    /* 遗漏分层 */
    oLayer: function(trs, n) {
        var x = this.cLayer[n], y = trs.length - 1;

        /* 垂直探视表格 */
        this.gLayer.push(trs[y].cells[x]);
        while ((--y) >= 0) {
            if (trs[y].cells[x]) {
                if (!(tb.ball).test(trs[y].cells[x].className)) {
                    this.gLayer.push(trs[y].cells[x]); // 遗漏
                } else {
                    break;    // 有球跳出
                }
            } else {
                if (trs[y].cells[0] && trs[y].cells[0].parentNode.className == "hLine") {
                    continue; // 水平分割线回跳一行
                } else {
                    break;    // 出界跳出
                }
            }
        }
        /* 垂直探视表格 */
    },

    /* 实例化连线类对象 */
    oJoinLine: function() {
        var trs = $("data").rows;
        var len = this.colspan.length;
        for (var i = 0; i < len; i++) {
            var line = this.colspan[i].split("$")[4];
            if (line) {
                var l = line.split(",");
                var color, size;
                this.gB = [];
                if (l[0] == 1 && this.gT[i] != "") {
                    color = l[1]; size = l[2];
                    var a = this.gT[i].split(",");
                    for (var j = 0; j < a.length - 1; j++) {
                        eval("this.gB.push(trs" + a[j] + ")");
                    }
                    this.joinLine[i] = new tb.joinLine(color, size, this.gB, this.indent);
                }
            }
        };
    },

    /* 复选框勾选事件 */
    select_checkbox: function(type, obj) {
        if (obj.type.toLowerCase() != "checkbox") return;
        if (type != "gLine" && !this[type]) return;

        if (this[type]) {
            for (var i = 0; i < this[type].length; i++) {
                var _this = this[type][i];
                switch (type) {
                    case "spaceLine":
                        if (obj.checked) _this.parentNode.style.display = "";
                        else _this.parentNode.style.display = "none";
                        break;
                    default:
                        if (obj.checked) _this.className += " " + this[type + "CSS"];
                        else _this.className = _this.className.replace(" " + this[type + "CSS"], "");
                        break;
                }
            }
        };

        /* { 开始连线 } */
        if (type == "spaceLine" || type == "gLine") {
            for (var j = 0; j < this.joinLine.length; j++) {
                if (this.joinLine[j] == undefined) continue;
                else {
                    if (type == "gLine") this.joinLine[j].show = (obj.checked) ? true : false;
                    this.joinLine[j].draw();
                }
            }
        };
    },

    /* 复选框复位事件 */
    init: function() {
        var inputs = document.getElementsByTagName("input");
        for (var i = 0; i < inputs.length; i++) {
            var it = inputs[i];
            if (it.type.toLowerCase() == "checkbox") {
                if (it.id == "c_l" || it.id == "c_x") it.checked = true;
                else it.checked = false;
            }
        };
    },

    /* 是否连线 */
    show_joinLine: function() {
        if ($("c_x") && $("c_x").checked) {
            this.select_checkbox("gLine", $("c_x"));
        }
    },

    /* 图表操作 */
    operate: function() {

        this.check_tbody(); // 遍历表体

        this.oJoinLine(); // 实例化连线类对象

        update(); // 更新图表
    }
}




///////////////////////////////////////////////////////////////////

/* 截取开奖号码 */
select_code = function(code, choice) {
    var temp = "";
    switch (choice) {
        case "四星":
            temp = str_split_half("right", code, 4);
            break;
        case "三星":
            temp = str_split_half("right", code, 3);
            break;
        case "二星":
        case "大小单双":
            temp = str_split_half("right", code, 2);
            break;
        case "一星":
            temp = str_split_half("right", code, 1);
            break;
        case "11X5前三":
            temp = str_split_half("left", code, 8);
            break;
        case "11X5前二":
            temp = str_split_half("left", code, 5);
            break;
        case "11X5前一":
            temp = str_split_half("left", code, 2);
            break;
    }
    return temp;
}

str_split_half = function(mode, s, n) {
    var temp = "";
    if (s.length > n) {
        if (mode == "left") {
            temp = s.substring(0, n) + "?" + s.substring(0, n) + "<FONT COLOR=\"#000000\">" + s.substring(n) + "</FONT>";
        }
        else if (mode == "right") {
            temp = s.substring(s.length - n) + "?" + "<FONT COLOR=\"#000000\">" + s.substring(0, s.length - n) + "</FONT>" + s.substring(s.length - n);
        }
    } else {
        temp = s;
    }
    return temp;
}

/* 页面加载完成复位复选框并连线 */
window.onload = function() {
    map.init();
    map.show_joinLine();
}

/* 改变窗口大小重新连线 */
var resizeTimer = null;
window.onresize = function() {
    if (resizeTimer) clearTimeout(resizeTimer);
    resizeTimer = setTimeout("windowResize()", 0);
};
windowResize = function() {
    map.show_joinLine();
}

///////////////////////////////////////////////////////////////////

/* 页面加载错误处理 */
window.onerror = function() {
    return true;
}

/* 禁止选择 */
document.onselectstart = function() {
    return false;
}

/* 禁用右键 */
document.oncontextmenu = function() {
    return false;
}

/* 显示多少期(参数说明：默认显示期数，最小显示期数，最大显示期数) */
nExpect = function(n, min, max) {
    var id = argument("id");
    if (id == "" || isNaN(id)) id = n;
    else {
        id = parseInt(id, 10);
        if (id > max) id = max;
        else if (id < min) id = min;
    }
    return id;
}

/* 载入图表导航 */
load_head = function() {
    tb.ajax.callFile("../include/top.php?cptype=" + map_type + "&r=" + Math.random(), function(response) {
        if (response == false) return;
        $("topmenu").innerHTML = response;
    });

    // 画十字线(支持IE)
    if (document.all) {
        var line = "<img src=\"about:blank\" id=\"leftright\" style=\"width:expression(document.body.clientWidth);height:1px;position:absolute;left:0;top:0;background-color:#999;z-index:100;\" \/>\n";
        line += "<img src=\"about:blank\" id=\"topdown\" style=\"height:expression(document.body.clientHeight);width:1px;position:absolute;left:0;top:0;background-color:#999;z-index:100;\" \/>\n";
        document.writeln(line);
    }
}

if (document.all) {
    /* 鼠标移动事件 */
    document.onmousemove = function() {
        if ($("leftright") && $("topdown")) {
            var mouseY = window.event.clientY;
            var mouseX = window.event.clientX;
            var scrollY = document.documentElement.scrollTop;
            var scrollX = document.documentElement.scrollLeft;
            if (mouseY + scrollY < 300) {
                $("leftright").style.display = "none";
                $("topdown").style.display = "none";
                return;
            } else {
                $("leftright").style.display = "";
                $("topdown").style.display = "";
            }

            $("leftright").style.top = mouseY + scrollY - 1;
            $("topdown").style.left = mouseX + scrollX - 1;
        }
    };
}





/************************ 以下为图表选号 ************************/

/* 复位登录 */
clearLogin = function() {
    if ($("loginDiv").style.display == "") {
        $("Msg").style.color = "#525252";
        $("Msg").innerHTML = "您还没有登录，请登录 ...";
        $("username").value = "";
        $("userpass").value = "";
    }
}

/* 提交登录 */
checkLogin = function() {
    if ($("username").value == "") {
        $("Msg").style.color = "#ff0000";
        $("Msg").innerHTML = "请输入您的会员名！";
        $("username").focus();
        return;
    } else {
        if ($("username").value.length < 2 || $("username").value.length > 20 || (/[.。,，|*]/g.test($("username").value))) {
            $("Msg").style.color = "#ff0000";
            $("Msg").innerHTML = "会员名输入有误！";
            $("username").focus();
            $("username").select();
            return;
        }
    }

    if ($("userpass").value == "") {
        $("Msg").style.color = "#ff0000";
        $("Msg").innerHTML = "请输入您登录密码！";
        $("userpass").focus();
        return;
    }

    var link = "name=" + $("username").value + "&pass=" + $("userpass").value + "&cookie=" + $("cookie").value + "&r=" + Math.random();
    tb.ajax.callFile("../include/ajax_login.php?" + encodeURI(link), function(response) {
        if (response == false) {
            $("Msg").style.color = "#ff0000";
            $("Msg").innerHTML = "对不起，网络传输异常！";
            return;
        }
        if (response == "OK") {
            $("loginDiv").style.display = "none";
            $("mainDiv").style.display = "";
        } else {
            $("Msg").style.color = "#ff0000";
            switch (response) {
                case "NoUser":
                    $("Msg").innerHTML = "登录会员名错误！请重新输入！";
                    $("username").focus();
                    $("username").select();
                    break;
                case "NoPass":
                    $("Msg").innerHTML = "登录密码错误！请重新输入！";
                    $("userpass").focus();
                    $("userpass").select();
                    break;
                default:
                    $("Msg").innerHTML = "对不起，系统未知异常！";
            }
        };
    });
}

/* 获取cookie */
getCookie = function(name) {
    var cookies = document.cookie.split("; ");
    for (var i = 0; i < cookies.length; i++) {
        var t = cookies[i].split("=");
        if (name == t[0]) {
            if (t.length > 1) return unescape(t[1]);
            else return "";
        }
    }
    return "";
}

/* 弹出层HTML */
show_layerHTML = function(n) {
    var id = getCookie("Ls178id");
    var loginDiv = (id == "") ? "" : "none";
    var mainDiv = (id == "") ? "none" : "";

    var html = '<div id="codeLayer" class="login" style="position: absolute; z-index: 1001; display: none;"> \
			    <div class="login_title"> \
			      <a onclick="close_layer()" style="cursor:pointer;"><img src="../images/Login_title_close.gif" /></a> \
			    </div> \
			    <div id="loginDiv" class="content" style="display:' + loginDiv + ';"> \
			      <div class="content_left"><img src="../images/Login_pic.gif" /></div> \
			      <div class="content_right"> \
			         <div class="font_warn" id="Msg">您还没有登录，请登录 ...</div> \
			         <ul> \
			            <li class="li1">会员名称：</li><li class="li2"><input type="text" id="username" class="password" /></li> \
			            <li class="li1">登录密码：</li><li class="li2"><input type="password" id="userpass" class="password" /></li> \
			            <li class="li1">上 网 地：</li><li class="li2"><select id="cookie"><option value="365">在家上网</option><option value="7">公司上网</option><option value="0">网吧上网</option></select></li> \
			         </ul> \
			         <div class="clear"></div> \
			         <div class="font_login">您还没有178帐号？<a href="../../Member/reg.php" class="login_a">立刻注册</a></div> \
			         <div class="btn"><img src="../images/Login_btn1.gif"  border="0" style="cursor:pointer;" onclick="checkLogin();"/></div> \
			      </div> \
			      <div class="login_footer clear"><img src="../images/Login_footer.gif" border="0" /></div> \
			    </div> \
			    <div id="mainDiv" class="content" style="display:' + mainDiv + ';"> \
			      <table align="center" border="0" cellpadding="0" cellspacing="0"> \
				    <tr> \
				      <td height="30" align="left">';

    switch (map_type) {
        case "ssl":
            html += '<input type="radio" name="bet_type" id="bet_1" value="直选" onclick="change_choice(this);" checked="checked" /><label for="bet_1">直选</label> \
				     <input type="radio" name="bet_type" id="bet_2" value="组选" onclick="change_choice(this);" /><label for="bet_2">组选</label> \
				     <input type="radio" name="bet_type" id="bet_3" value="组三" onclick="change_choice(this);" /><label for="bet_3">组三</label> \
				     <input type="radio" name="bet_type" id="bet_4" value="组六" onclick="change_choice(this);" /><label for="bet_4">组六</label>';
            break;
        case "ssc":
        case "jxssc":
            switch (n) {
                case 5:
                    html += '<input type="radio" name="bet_type" id="bet_1" value="五星直选" onclick="change_choice(this);" checked="checked" /><label for="bet_1">五星直选</label> \
	                         <input type="radio" name="bet_type" id="bet_2" value="五星通选" onclick="change_choice(this);" /><label for="bet_2">五星通选</label>';
                    break;
                case 3:
                    html += '<input type="radio" name="bet_type" id="bet_1" value="三星直选" onclick="change_choice(this);" checked="checked" /><label for="bet_1">三星直选</label> \
		                     <input type="radio" name="bet_type" id="bet_2" value="三星组三" onclick="change_choice(this);" /><label for="bet_2">三星组三</label> \
		                     <input type="radio" name="bet_type" id="bet_3" value="三星组六" onclick="change_choice(this);" /><label for="bet_3">三星组六</label>';
                    break;
                case 2:
                    html += '<input type="radio" name="bet_type" id="bet_1" value="二星直选" onclick="change_choice(this);" checked="checked" /><label for="bet_1">二星直选</label> \
	                         <input type="radio" name="bet_type" id="bet_2" value="二星组选" onclick="change_choice(this);" /><label for="bet_2">二星组选</label>';
                    break;
                default:
                    html += '<input type="radio" name="bet_type" id="bet_1" value="' + n + '" onclick="change_choice(this);" checked="checked" /><label for="bet_1">' + n + '</label>';
            }
            break;
        case "11x5":
            switch (n) {
                case "任选":
                    html += '<input type="radio" name="bet_type" id="bet_1" value="前一" onclick="change_choice(this);" checked="checked" /><label for="bet_1">前一</label> \
	                         <input type="radio" name="bet_type" id="bet_2" value="任选二" onclick="change_choice(this);" /><label for="bet_2">任选二</label> \
	                         <input type="radio" name="bet_type" id="bet_3" value="任选三" onclick="change_choice(this);" /><label for="bet_3">任选三</label> \
	                         <input type="radio" name="bet_type" id="bet_4" value="任选四" onclick="change_choice(this);" /><label for="bet_4">任选四</label> \
	                         <input type="radio" name="bet_type" id="bet_5" value="任选五" onclick="change_choice(this);" /><label for="bet_5">任选五</label> \
	                         <input type="radio" name="bet_type" id="bet_6" value="任选六" onclick="change_choice(this);" /><label for="bet_6">任选六</label> \
	                         <input type="radio" name="bet_type" id="bet_7" value="任选七" onclick="change_choice(this);" /><label for="bet_7">任选七</label><br /> \
	                         <input type="radio" name="bet_type" id="bet_8" value="任选八" onclick="change_choice(this);" /><label for="bet_8">任选八</label>';
                    break;
                case "前二和值":
                    html += '<input type="radio" name="bet_type" id="bet_1" value="前二直选" onclick="change_choice(this);" checked="checked" /><label for="bet_1">前二直选</label> \
	                         <input type="radio" name="bet_type" id="bet_2" value="前二组选" onclick="change_choice(this);" /><label for="bet_2">前二组选</label>';
                    break;
                case "前三和值":
                    html += '<input type="radio" name="bet_type" id="bet_1" value="前三直选" onclick="change_choice(this);" checked="checked" /><label for="bet_1">前三直选</label> \
	                         <input type="radio" name="bet_type" id="bet_2" value="前三组选" onclick="change_choice(this);" /><label for="bet_2">前三组选</label>';
                    break;                    
                default:
                    html += '<input type="radio" name="bet_type" id="bet_1" value="' + n + '" onclick="change_choice(this);" checked="checked" /><label for="bet_1">' + n + '</label>';
            }
            break;
    }

    html += '</td> \
		    </tr> \
	      </table> \
	      <table align="center" border="0" cellpadding="0" cellspacing="1" id="tr_select"> \
		    <tr class="tr_1"> \
		      <td width="55">号码状态</td> \
		      <td>您选择的号码</td> \
		      <td width="30">注数</td> \
		      <td width="55">选号方法</td> \
		      <td width="30">操作</td> \
		      <td width="30">清除</td> \
		    </tr>';

    for (var i = 1; i <= 5; i++) {
        html += '<tr class="tr_2"> \
			       <td class="td_1"></td> \
			       <td></td> \
			       <td></td> \
			       <td></td> \
			       <td class="td_3"></td> \
			       <td></td> \
			     </tr>';
    }

    html += '</table> \
	         <table align="center" border="0" cellpadding="0" cellspacing="0"> \
		        <tr><td height="10" colspan="2"></td></tr> \
		        <tr><td height="20" colspan="2" id="info" style="text-align:left;font-size:14px;font-weight:bold;color:#ff0000;padding-left:8px;display:none;">您选择的号码有误，请按照号码状态指示修改后再进行代购。</td></tr> \
		        <tr><td height="40" colspan="2" align="center"> \
		          <img src="../images/Login_btn2.gif"  border="0" style="cursor:pointer;" onclick="submit_code();"/> \
		        </td></tr> \
		        <tr><td height="10" colspan="2"></td></tr> \
	         </table> \
	         <div class="login_footer clear"><img src="../images/Login_footer.gif" border="0" /></div> \
	       </div> \
	       </div> \
	       <div id="layer" style="position: absolute; z-index:1000; top: 0px; left: 0px; filter: alpha(opacity = 20); opacity: 0.2; height:100%; width:100%; background-color: #999; display: none;"></div>';

    document.write(html);
}

/* 显示层 */
show_layer = function() {
    $("layer").style.display = "";
    $("codeLayer").style.display = "";

    clearLogin();

    move_layer();
}

/* 关闭层 */
close_layer = function() {
    $("codeLayer").style.display = "none";
    $("layer").style.display = "none";
}

/* 定位层 */
move_layer = function() {
    var availWidth = window.screen.availWidth - (tb.isIE ? 21 : 18);
    var clientWidth = document.body.clientWidth;
    if (availWidth > clientWidth) clientWidth = availWidth;

    var availHeight = window.screen.availHeight;
    var clientHeight = document.body.clientHeight;

    $("layer").style.width = clientWidth + "px";
    $("layer").style.height = clientHeight + "px";

    var obj = $("codeLayer").style;
    var width = 500; height = 200;
    obj.left = (clientWidth - width) / 2 + "px";
    obj.top = clientHeight - (availHeight + height) / 2 + "px";

    docompose_select_code();
}

/* 解析选号 */
docompose_select_code = function() {
    $("info").style.display = "none";

    var codes = select_yx_code();
    for (var i = 0; i < codes.length; i++) {
        /* 解析行选号 */
        var td_select = $("tr_select").rows.item(i + 1).cells;
        var single = docompose_code(codes[i]);
        for (var j = 0; j < single.length; j++) {
            td_select.item(j).innerHTML = single[j];
        };

        /* 清除行标记 */
        var tr_Node = $("tr_vote_" + (i + 1));
        var regExp = new RegExp(map["gLayerCSS"], "i");
        if (regExp.test(tr_Node.cells.item(0).className)) {
            for (j = 0; j < tr_Node.childNodes.length; j++) {
                var td_Node = tr_Node.cells.item(j);
                if (td_Node.className == map["gLayerCSS"]) td_Node.className = "";
                else td_Node.className = td_Node.className.replace(" " + map["gLayerCSS"], "");
            }
        };
    }
}

/* 获取图表预选区选号 */
select_yx_code = function() {
    var a = [];
    for (var i = 1; i <= 5; i++) {
        var l = 3;
        if (map.showNumber) l += 2;
        if (map.showTime) l += 2;

        var b = [];
        var td_votes = $("tr_vote_" + i).cells;
        for (var j = 0; j < map.colspan.length; j++) {
            var cols = map.colspan[j].split("$");
            if (cols[0] == "->") {
                l += 2;
                continue;
            }

            var c = [];
            var code = cols[0].split(",");
            for (k = 0; k < code.length; k++) {
                if (code[k] == "-") {
                    l++;
                    continue;
                }
                if ((tb.ball).test(td_votes.item(l).className)) {
                    c.push(td_votes.item(l).innerHTML);
                }
                l++;
            }
            l++;
            b.push(c.join(","));
        }
        a.push(b.join("|"));
    };
    return a;
}

/* 添加/修改选号 */
change_code = function(oNode) {
    close_layer();
    var tr_Node = $("tr_vote_" + oNode.parentNode.parentNode.rowIndex);
    for (var i = 0; i < tr_Node.childNodes.length; i++) {
        tr_Node.cells.item(i).className += " " + map["gLayerCSS"];
    }
}

/* 删除选号 */
delete_code = function(oNode) {
    $("info").style.display = "none";

    var td_select = oNode.parentNode.parentNode.cells;
    var s = ["未选择", "", "", "", "<a href=\"javascript:void(0);\" onclick=\"change_code(this);\">添加</a>", ""];
    for (var i = 0; i < s.length; i++) {
        td_select.item(i).innerHTML = s[i];
    }
}

/* 选号类型 */
select_choice = function() {
    var radio = document.getElementsByName("bet_type");
    for (var i = 0; i < radio.length; i++) {
        if (radio[i].type.toLowerCase() == "radio" && radio[i].checked) {
            return radio[i].value;
        }
    }
}

/* 切换类型 */
change_choice = function(obj) {
    $("info").style.display = "none";

    var td_select, status;
    var tr_select = $("tr_select").rows;
    var len = tr_select.length - 1;
    for (var i = 1; i <= len; i++) {
        td_select = tr_select.item(i).cells;
        status = td_select.item(0).innerHTML;
        if (status == "未选择" || status == "号码不足") continue;
        var code = td_select.item(1).innerHTML;
        var zhu = getnzhu(code, obj.value);
        if (zhu > 0) {
            td_select.item(0).innerHTML = "√";
            td_select.item(2).innerHTML = zhu;
        } else {
            td_select.item(0).innerHTML = "玩法不符";
            td_select.item(2).innerHTML = "";
        }
    }
}

/* 提交选号 */
submit_code = function() {
    var td_select, status, nselect = 0;
    var tr_select = $("tr_select").rows;
    var len = tr_select.length - 1;
    for (var i = 1; i <= len; i++) {
        td_select = tr_select.item(i).cells;
        status = td_select.item(0).innerHTML;
        if (status == "未选择") nselect++;
        if (status != "未选择" && status != "√") {
            $("info").style.display = "";
            return;
        }
    }
    if (nselect == len) return;

    var code = [];
    var choice = select_choice();
    for (i = 1; i <= len; i++) {
        td_select = tr_select.item(i).cells;
        status = td_select.item(0).innerHTML;
        if (status == "√") {
            var codes = td_select.item(1).innerHTML;
            var method = td_select.item(3).innerHTML;
            switch (method) {
                case "大小投注":
                    codes = codes.replace(/大/g, "56789");
                    codes = codes.replace(/小/g, "01234");
                    method = "常规投注";
                    break;
                case "奇偶投注":
                    codes = codes.replace(/奇/g, "13579");
                    codes = codes.replace(/偶/g, "02468");
                    method = "常规投注";
                    break;
            }

            /* 格式：号码|注数|玩法|选号方法 */
            if (codes.indexOf(".") == -1) {
                code.push(codes + "|" + td_select.item(2).innerHTML + "|" + choice + "|" + method); // 复式
            } else {
                var t = codes.split(".");
                for (var j = 0; j < t.length; j++) {
                    code.push(t[j] + "|1|" + choice + "|" + method); // 单式
                }
            };
        }
    }

    var file = "";
    switch (map_type) {
        case "ssl":
            file = "shishile";
            break;
        case "ssc":
            file = "shishicai";
            break;
        case "11x5":
            file = "11x5";
            break;
        default:
            alert("“江西时时彩”暂不支持选号投注。")
            return;
    }

    var id = code.join(".");
    window.location.href = "http://" + location.host + "/" + file + "/?link=" + location.href + "&id=" + escape(id) + "&key=" + escape("图表选号" + id);
}
