/**
* shift 键配合的多选 checkbox
* 使用方法 new MultiCheckBox(box_name) ，也就是说 box的name一定要相同才行，另外此文件
* 依赖 prototypejs
* 代码需要简练一些，待改进
* 
* @author Kafeifei<kafeifei@gmail.com>
* $Id: MultiCheckBox.js 9764 2008-05-22 06:06:08Z kafeifei $
*/

// 全局变量
var __mckSt = null;
var __mckSe = null;
var __mcked = null;
var __keyCode = null;

function MultiCheckBox(box_name) {
    // 绑定键盘动作
    // 这里应该判断一下两个动作是否已经被其他程序修改并给出提示
    YAHOO.util.Event.addListener(document, 'keydown', function(e){__keyCode = e.keyCode;});
   	YAHOO.util.Event.addListener(document, 'keyup', function(e){
        __keyCode   = null;
        __mckSe     = null;
        __mcked     = null;
    });
    // 取得所需checkbox，并绑定操作
   var cks = document.getElementsByName(box_name);
    for (var i = 0; i < cks.length; i++) {
        cks[i].myidx = i;
        cks[i].style.cursor = 'pointer';
        //cks[i].observe('change', this.change); // IE 不支持
        YAHOO.util.Event.addListener(cks[i], 'click', click);
//            Event.observe(cks[i], 'change', this.change);
    }
}
function click(event) {
    // 获取被按的元素
    var obj = YAHOO.util.Event.getTarget(event);
    if (obj.checked) { // --------标记
        obj.parentNode.parentNode.parentNode.style.backgroundColor = '#ffeeee';
    } else {
        obj.parentNode.parentNode.parentNode.style.backgroundColor = '';
    }
    
    // 如果没有按下 shift 键，记录第一点击
    if (16 !== __keyCode || __mckSt === null) {
        __mckSt = obj.myidx;
        return ;
    }
    
    // 第一次应该执行的操作
    if (null === __mcked) __mcked = obj.checked;
    
    // 所有元素
    var cks = document.getElementsByName(obj.name);
    
    // 上一次被按的元素
    var pobj = cks[__mckSt]
    
    // 选中
    while (true) {
        if (obj.myidx > pobj.myidx) {
            // 回滚操作
            if (__mckSe !== null) {
                // 中途反向操作，改变起始点
                if (__mckSe < pobj.myidx) {
                    pobj = cks[__mckSe];
                    __mckSt = pobj.myidx;
                    continue;
                }
                // 回滚操作
                if (__mckSe > obj.myidx) {
                    for (var i = __mckSe; i > obj.myidx; i--) {
                        cks[i].checked = false;
                        cks[i].parentNode.parentNode.parentNode.style.backgroundColor = ''; // --------标记
                    }
                }
            }
            for (var i = pobj.myidx; i < obj.myidx; i++) {
                cks[i].checked = __mcked;
                cks[i].parentNode.parentNode.parentNode.style.backgroundColor = (__mcked) ? '#ffeeee' : ''; // --------标记
            }
        } else if (obj.myidx < pobj.myidx){
            if (__mckSe !== null) {
                // 中途反向操作，改变起始点
                if (__mckSe > pobj.myidx) {
                    pobj = cks[__mckSe];
                    __mckSt = pobj.myidx;
                    continue;
                }
                
                // 回滚操作
                if (__mckSe < obj.myidx) {
                    for (var i = __mckSe; i <= obj.myidx; i++) {
                        cks[i].checked = false;
                        cks[i].parentNode.parentNode.parentNode.style.backgroundColor = ''; // --------标记
                    }
                }
            }
            for (var i = pobj.myidx; i > obj.myidx; i--) {
                cks[i].checked = __mcked;
                cks[i].parentNode.parentNode.parentNode.style.backgroundColor = (__mcked) ? '#ffeeee' : ''; // --------标记
            }
        } else if (__mckSe !== null) { // 只是需要滚回的情况
            if (__mckSe < obj.myidx) {
                for (var i = __mckSe; i <= obj.myidx; i++) {
                    cks[i].checked = false;
                    cks[i].parentNode.parentNode.parentNode.style.backgroundColor = ''; // --------标记
                }
            } else {
                for (var i = __mckSe; i > obj.myidx; i--) {
                    cks[i].checked = false;
                    cks[i].parentNode.parentNode.parentNode.style.backgroundColor = ''; // --------标记
                }
            }
        }
        break;
    }
    
    // 后续操作
    if (__mcked) {
        __mckSe = obj.myidx;
    } else {
        __mcked = null;
        __mckSe = null;
        __mckSt = obj.myidx;
    }
}

function change(event) { // 有问题，而且IE下的onchangge有老年痴呆症状
    var obj = YAHOO.util.Event.getTarget(event);
//        alert(obj.checked);return;
    if (obj.checked) {
        obj.parentNode.parentNode.parentNode.style.backgroundColor = '#ffeeee';
    } else {
        obj.parentNode.parentNode.parentNode.style.backgroundColor = '';
    }
}

function addColor(c1, c2) {
    // 颜色相加
}

function subColor(c1, c2) {
    // 颜色相减
}
