﻿function toggle(sender, id)
{
    var node = document.getElementById(id);
    if (node)
    {
        if (node.style.display == 'none')
        {
            node.style.display = 'block';
            sender.src = '/images/tree/minus.png';
        }
        else
        {
            node.style.display = 'none';
            sender.src = '/images/tree/plus.png';
        }
    }
    return false;
}

function insideElement(x, y, element)
{
    var top = getOffsetY(element);
    var left = getOffsetX(element);
    return y > top &&
           y < top + element.offsetHeight &&
           x > left &&
           x < left + element.offsetWidth;
}

function getOffsetX(element)
{
    if (element)
    {
        if (element.offsetParent)
        {
            var x = 0;
            while (element)
            {
                x += element.offsetLeft;
                element = element.offsetParent;
            }
            return x;
        }
    }
}

function getMouseX(event)
{
    if (window.event)
        event = window.event;

    var x;
    if (event.pageX)
        x = event.pageX;
    if (event.clientX)
        x = event.clientX;
    return x;
}

function getMouseY(event)
{
    if (window.event)
        event = window.event;

    var y;
    if (event.pageY)
        y = event.pageY;
    if (event.clientY)
    {
        y = event.clientY;
        if (document.documentElement.scrollTop)
            y += document.documentElement.scrollTop;
        else if (document.body.scrollTop)
            y += document.body.scrollTop;
    }
    return y;
}

function getOffsetY(element)
{
    if (element)
    {
        if (element.offsetParent)
        {
            var y = 0;
            while (element)
            {
                y += element.offsetTop;
                element = element.offsetParent;
            }
            return y;
        }
    } 
}

function asyncCall(id)
{
    var ajax = new AJAXRequest();
    ajax.Url = '/AsyncRequest.ashx';
    ajax.OnComplete = callback;
    ajax.AddParam('id', id);
    ajax.Send();
}

function callback(responseText)
{
    var arr = responseText.split('|');
    if (arr && arr.length == 2)
    {
        var id = arr[0];
        var box = document.getElementById('chk_' + id);
        var span = document.getElementById('cnt_' + id);

        if (box && box.checked && span)
        {
            var count = parseInt(arr[1]);
            if (count == 1)
                span.innerHTML = '(' + count + ' skærm)';
            else
                span.innerHTML = '(' + count + ' skærme)';
        }
    }
}

function check(sender, id, parentId)
{
    var nodeId = sender.id.substring(4);
    var childNode = document.getElementById(id);
    if (sender.checked == true)
    {
        asyncCall(nodeId);

        if (childNode) //if not leaf node
        {
            var ul = document.getElementById(nodeId);
            if (ul && ul.style.display == 'none' && nodeId)
            {
                toggle(document.getElementById('tgl_' + nodeId), nodeId);
            }

            var list = childNode.getElementsByTagName('input');
            for (var i = 0; i < list.length; i++)
            {
                var box = list[i];
                box.checked = true;

                var tmpId = box.id.substring(4);
                ul = document.getElementById(tmpId);
                if (ul && ul.style.display == 'none' && tmpId)
                {
                    toggle(document.getElementById('tgl_' + tmpId), tmpId);
                }

                asyncCall(tmpId);
            }
        }
    }
    else if (sender.checked == false)
    {
        document.getElementById('cnt_' + nodeId).innerHTML = '';

        if (childNode) //if not leaf node
        {
            var allChecked = true;
            var list = childNode.getElementsByTagName('input');
            for (var i = 0; i < list.length; i++)
            {
                var box = list[i];
                if (box.checked == false)
                {
                    allChecked = false;
                    break;
                }
            }
            if (allChecked)
            {
                for (var i = 0; i < list.length; i++)
                {
                    var box = list[i];
                    var tmpId = box.id.substring(4);

                    box.checked = false;

                    document.getElementById('cnt_' + tmpId).innerHTML = '';
                }
            }
        }
    }

    var parentChk = document.getElementById('chk_' + parentId);
    if (parentChk && parentChk.checked == true)
    {
        parentChk.checked = false;
        parentChk.onclick();
    }

    var parent = document.getElementById(parentId);
    if (parent && parentChk)
    {
        var flag = true;
        var list = parent.getElementsByTagName('input');
        for (var i = 0; i < list.length; i++)
        {
            var box = list[i];
            if (box.checked == false)
            {
                flag = false;
                break;
            }
        }
        if (flag && list.length > 0)
        {
            parentChk.checked = true;
            parentChk.onclick();
        }
    }
}




function AJAXRequest()
{
    this.Count = 0;
    this.Params = new Array();
    this.Timeout = 10000;

    this.Method = 'GET';
    this.PreventCache = true;
    this.Url = null;

    this.OnComplete = null;

    this.AddParam = function (key, value)
    {
        this.Params[this.Count++] = encode(key) + '=' + encode(value);
    };

    this.ClearParams = function ()
    {
        this.Count = 0;
        this.Params = new Array();
    };

    this.Send = function ()
    {
        if (!this.Url)
        {
            alert('Invalid url.');
            return;
        }
        if (!this.OnComplete)
        {
            alert('Invalid OnComplete function.');
            return;
        }

        var xmlHttp = getXMLHttp();
        if (xmlHttp)
        {
            xmlHttp.OnComplete = this.OnComplete;

            //The method to be called when request is done
            xmlHttp.onreadystatechange = function ()
            {
                //0 (Uninitialized)
                //    The object has been created, but not initialized (the open method has not been called).
                //1 (Open)
                //    The object has been created, but the send method has not been called. 
                //2 (Sent)
                //    The send method has been called. responseText is not available. responseBody is not available. 
                //3 (Receiving)
                //    Some data has been received. responseText is not available. responseBody is not available. 
                //4 (Loaded)
                //    All the data has been received. responseText is available. responseBody is available. 

                if (xmlHttp.readyState == 4)
                {
                    xmlHttp.OnComplete(xmlHttp.responseText);
                }
            }

            var uri = this.Url;
            var parameters = '';
            for (var i = 0; i < this.Count; i++)
            {
                parameters += this.Params[i];
                if (i + 1 < this.Count)
                    parameters += '&';
            }

            if (this.PreventCache == true)
            {
                if (uri.indexOf('?') > -1)
                {
                    uri += '&rnd=' + Math.floor(Math.random() * 348);
                }
                else
                {
                    uri += '?rnd=' + Math.floor(Math.random() * 348);
                }
            }

            if (this.Method.toUpperCase() == 'POST')
            {
                xmlHttp.open('POST', uri, true);
                xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xmlHttp.setRequestHeader("Content-Length", parameters.length);
                xmlHttp.send(parameters);
            }
            else
            {
                if (uri.indexOf('?') > -1)
                    parameters = '&' + parameters;
                else
                    parameters = '?' + parameters;

                xmlHttp.open('GET', uri + parameters, true);
                xmlHttp.send(null);
            }
        }
    };
}

function encode(str)
{
    return encodeURIComponent(str);
}



//Creates a new instance of XMLHttpRequest or ActiveXObject
function getXMLHttp()
{
    var xmlHttp;
    try
    {
        //Firefox, Opera 8.0, Safari
        xmlHttp = new XMLHttpRequest();
    }
    catch (e)
    {
        //Internet Explorer
        try
        {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            try
            {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e)
            {
                alert("Your browser does not support AJAX!");
                return;
            }
        }
    }
    return xmlHttp;
}
