//--------------------------------------------------------------------
function byId(_id) {
    return document.getElementById(_id);
}

//--------------------------------------------------------------------
function show(_id) {
    byId(_id).style.visibility = 'visible';
    byId(_id).style.display = 'block';
}

//--------------------------------------------------------------------
function hide(_id) {
    byId(_id).style.visibility = 'hidden';
    byId(_id).style.display = 'none';
}

//--------------------------------------------------------------------
function clearSelection() {
    return;
    var sel;
    if (document.selection && document.selection.empty) {
        document.selection.empty();
    }
    else if (window.getSelection) {
        sel = window.getSelection();
        if (sel && sel.removeAllRanges) {
            sel.removeAllRanges();
        }
    }
}

//--------------------------------------------------------------------
var dragObject  = null;
var mouseOffset = null;
//var mousePos;
document.onmouseup   = mouseUp;
document.onmousemove = mouseMove;

//--------------------------------------------------------------------
function startDrag(_event) {
    dragObject = this;
    dragObject.style.zIndex = 5;
    dragObject.style.opacity = 0.8;

    mouseOffset = getMouseOffset(this, _event);
    y = mousePos.y - mouseOffset.y;
    x = mousePos.x - mouseOffset.x;

    dragObject.style.position = 'absolute';
    dragObject.style.top = y + 'px';
    dragObject.style.left = x + 'px';

    clearSelection();
}

//--------------------------------------------------------------------
function makeDragable() {
    if (!arguments.length) return false;

    for (i=0; i<arguments.length; i++) {
        _object = arguments[i];
        if (!_object) continue;

        _object.onmousedown = startDrag;
    }
    return false;
}

//--------------------------------------------------------------------
function mouseMove(_event) {
    _event = _event || window.event;
    mousePos = mouseCoords(_event);

    if (dragObject) {
        clearSelection();
        y = mousePos.y - mouseOffset.y;
        x = mousePos.x - mouseOffset.x;
        dragObject.style.position = 'absolute';
        dragObject.style.top = y + 'px';
        dragObject.style.left = x + 'px';
    }
    return false;
}

//--------------------------------------------------------------------
function mouseUp() {
    if (dragObject) {
        dragObject.style.opacity = 1.0;
        dragObject.style.zIndex = 0;

        dragObject = null;
    }
}

//--------------------------------------------------------------------
function mouseCoords(_event) {
    if (_event.pageX || _event.pageY) {
        return {
            x:_event.pageX,
            y:_event.pageY
        };
    }
    return {
        x:_event.clientX + document.body.scrollLeft - document.body.clientLeft,
        y:_event.clientY + document.body.scrollTop  - document.body.clientTop
    };
}

//--------------------------------------------------------------------
function getMouseOffset(_target, _event){
    _event = _event || window.event;

    var docPos    = getPosition(_target);
    mousePos  = mouseCoords(_event);
    return {
        x:mousePos.x - docPos.x,
        y:mousePos.y - docPos.y
    };
}

//--------------------------------------------------------------------
function getPosition(_element){
    var left = 0;
    var top  = 0;

    while (_element.offsetParent){
        left    += _element.offsetLeft;
        top     += _element.offsetTop;
        _element = _element.offsetParent;
    }

    left += _element.offsetLeft;
    top  += _element.offsetTop;

    return {
        x:left,
        y:top
    };
}

//--------------------------------------------------------------------
function createXhr() {
    var xhr;
    try {
        xhr = new XMLHttpRequest();
    }
    catch (e) {
        var msXmlVersion = new Array('MSXML2.XML.Http.6.0', 'MSXML2.XML.Http.5.0', 'MSXML2.XML.Http.4.0', 'MSXML2.XML.Http.3.0', 'MSXML2.XML.Http.2.0', 'Microsoft.XML.Http');
        for (var i = 0; i < msXmlVersion.lenght; i ++) {
            try{
                xhr = new ActiveXObject(msXmlVersion[i]);
            }
            catch (e) {
            }
        }
    }
    if (!xhr) {
        alert("Your browser does not support ajax");
    }
    else  {
        return xhr;
    }
}

//--------------------------------------------------------------------
function updateMap(_url, _form) {
    xhr = createXhr();
    xhr.open("POST", _url, true);
    xhr.setRequestHeader(
        "Content-Type",
        "application/x-www-form-urlencoded"
    );
    var vars = new Array();
 
    for (i=0; i<_form.elements.length; i++) {
        if (_form.elements[i].type != 'radio'
        || (_form.elements[i].type=='radio'
        && _form.elements[i].checked)) {
            vars.push(_form.elements[i].name+'='+_form.elements[i].value);
        }
    }

    var postStr = vars.join('&');

    xhr.onreadystatechange = function() {
        var done = 4, ok = 200;
        if (xhr.readyState == done && xhr.status == ok) {
            if (xhr.responseText) {
                command = eval("("+xhr.responseText+")");
                status = command.status;
                error = command.error;
                if (status == 0) {
                    hideAllPath();
                    unTagAll();
                    unTagAllUnits();
                    myTurn = command.my_turn;
                    canMove = command.can_move;
                    _event = command.event;
                    for (i=0; i<command.map.length; i++) {
                        tile = command.map[i];
                        x = tile.x;
                        y = tile.y;

                        byId('link_'+tile.hex_id).title = tile.alt;
                        log("src: "+tile.src);
                        byId('hex_'+x+'_'+y).src = tile.src;
                        byId('hex_'+x+'_'+y).alt = tile.alt;

                        hexMap['_'+x]['_'+y]['side'] = tile.side;
                        if (tile.side<0) {
                            hexMap['_'+x]['_'+y]['unit'] = null;
                            hexMap['_'+x]['_'+y]['passable'] = 1;
                        }
                        else if (_event == 'move-result') {
                            hexMap['_'+x]['_'+y]['passable'] = 0;
                            hexMap['_'+x]['_'+y]['unit'] = new Array();
                            hexMap['_'+x]['_'+y]['unit']['id']     = tile.unit_id;
                            hexMap['_'+x]['_'+y]['unit']['mp']     = tile.unit_mp;
                            hexMap['_'+x]['_'+y]['unit']['attack'] = tile.unit_attack;
                            hexMap['_'+x]['_'+y]['unit']['health'] = tile.unit_health;
                            hexMap['_'+x]['_'+y]['unit']['name']   = tile.unit_name;
                        }
                    }
                    changeMode(command['next-mode']);
                    if (command.event == 'move-result') {
                        myUnit = selectUnit(command.new_x, command.new_y);
                    }
                    if (command['next-mode']=='attack') {
                        tagPossibleTargets();
                    }
                    if (command['event'] == 'attack-result') {
                        unTagActiveUnit();
                    }
                }
                else {
                    //alert(status+': '+error);
                }
            }
        }
    };
    xhr.send(postStr);
}

//--------------------------------------------------------------------
function sendAjaxForm(_url, _form, _id) {
    xhr = createXhr();
    xhr.open("POST", _url, true);
    xhr.setRequestHeader(
        "Content-Type",
        "application/x-www-form-urlencoded"
    );
    var vars = new Array();
 
    for (i=0; i<_form.elements.length; i++) {
        if (_form.elements[i].type != 'radio'
        || (_form.elements[i].type=='radio'
        && _form.elements[i].checked)) {
            vars.push(_form.elements[i].name+'='+_form.elements[i].value);
        }
    }

    var postStr = vars.join('&');

    xhr.onreadystatechange = function() {
        var done = 4, ok = 200;
        if (xhr.readyState == done && xhr.status == ok) {
            if (xhr.responseText
            && _id!=null) {
                byId(_id).innerHTML = xhr.responseText;;
            }
        }
    };
    xhr.send(postStr);
}

//--------------------------------------------------------------------
function sendAjaxPost(_url, _postStr, _id) {
    xhr = createXhr();
    xhr.open("POST", _url, true);
    xhr.setRequestHeader(
        "Content-Type",
        "application/x-www-form-urlencoded"
    );

    xhr.onreadystatechange = function() {
        var done = 4, ok = 200;
        if (xhr.readyState == done && xhr.status == ok) {
            if (xhr.responseText) {
                byId(_id).innerHTML = xhr.responseText;;
            }
        }
    };
    xhr.send(_postStr);
}
