﻿function $(element)
{
    return document.getElementById(element);
}

function fragmentRequest(command, targetPage, targetId, evaulateScripts, gatherParametersFrom)
{
    var params = "cbwCommandName" + "=" + command + "&";

    if (gatherParametersFrom != null) {
        formparams = "";
        getRequestParameters($(gatherParametersFrom));
        params += formparams;
        formparams = "";
    }

    params += "posted=" + Math.random();

    fragmentRequestInternal(command, targetPage, targetId, evaulateScripts, params);
}

function parameterFragmentRequest(command, targetPage, targetId, evaulateScripts)
{
    fragmentRequestInternal(command, targetPage, targetId, evaulateScripts, parameters.getParametersForRequest(command));
}

var parameters = new parametersObj();

//objects for parameter handling
function parametersObj() 
{
    this.paramArray = new Array();
    this.count = parameterCount;
    this.add = addParameter;
    this.clear = clearParameters;
    this.getParametersForRequest = getParametersForRequest;
    this.setHiddenElementsFromParameter = setHiddenElementsFromParameter;
}

function parameterCount()
{
    return this.paramArray.length;
}

function addParameter(name, value)
{
    this.paramArray.push(new parameterObj(name, value));
}

function clearParameters()
{
    this.paramArray = new Array();
}

function setHiddenElementsFromParameter(target)
{
    for (i = 0; i < this.paramArray.length; i++)
    {
        var hiddenElement = document.createElement('input');
        hiddenElement.setAttribute('id', parameters.paramArray[i].name);
        hiddenElement.setAttribute('name', parameters.paramArray[i].name);
        hiddenElement.setAttribute('type', 'hidden');
        hiddenElement.setAttribute('value', parameters.paramArray[i].value);

        target.appendChild(hiddenElement);
    }
}

function getParametersForRequest(command)
{
    var str = "cbwCommandName" + "=" + command + "&";
    for (i = 0; i < this.paramArray.length; i++)
    {
        str += this.paramArray[i].name + "=" + this.paramArray[i].value + "&";
    }

    str += "posted=" + Math.random();

    return str;
}

function parameterObj(name, value)
{
    this.name = name;
    this.value = value;
}
//----


function fragmentRequestInternal(command, targetPage, targetId, evaulateScripts, params) {
    try {
        xmlHttp = InitAjax();
        doOnCallBack = "$('" + targetId + "').innerHTML = xmlHttp.responseText;"
        if (evalScripts)
            doOnCallBack += "evalScripts($('" + targetId + "').innerHTML);";

        setCallBackFunction();

        xmlHttp.open("POST", targetPage, true);
        xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

        xmlHttp.send(params);
    }
    catch (e) {
        alert(e.message);
    }
}

function fullpageRequest(targetPage)
{
    location.replace(targetPage);
}

function fullpageRequestWithParams(targetPage, method)
{
    if (parameters.count() == 0)
    {
        fullpageRequest(targetPage);
        return;
    }

    var form = document.createElement('form');

    form.setAttribute("id", "cbwPostForm");
    form.setAttribute("name", "cbwPostForm");
    form.setAttribute("action", targetPage);
    form.setAttribute("method", method);

    parameters.setHiddenElementsFromParameter(form);

    document.documentElement.appendChild(form);

    $('cbwPostForm').submit();
}

function simpleRequest(targetPage, command, _doOnCallBack)
{
    try
    {
        xmlHttp = InitAjax();
        doOnCallBack = _doOnCallBack + "(xmlHttp.responseText)";        
        setCallBackFunction();
        xmlHttp.open("POST", targetPage, true);        
        xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xmlHttp.send(parameters.getParametersForRequest(command));
    }
    catch (e)
    {
        alert(e.message);
    }
}


var formparams;
function getRequestParameters(obj) {
    var i = 0;
    for (i = 0; i < obj.childNodes.length; i++) {
        if (obj.childNodes[i].tagName != null && obj.childNodes[i].tagName.toUpperCase() == "INPUT") {
            if (obj.childNodes[i].type.toUpperCase() == "TEXT" || obj.childNodes[i].type.toUpperCase() == 'HIDDEN') {
                formparams += obj.childNodes[i].name + "=" + encodeURIComponent(obj.childNodes[i].value) + "&";
            }
            if (obj.childNodes[i].type.toUpperCase() == "CHECKBOX") {
                if (obj.childNodes[i].checked) {
                    formparams += obj.childNodes[i].name + "=" + encodeURIComponent(obj.childNodes[i].value) + "&";
                } else {
                    formparams += obj.childNodes[i].name + "=&";
                }
            }
            if (obj.childNodes[i].type.toUpperCase() == "RADIO") {
                if (obj.childNodes[i].checked)
                    formparams += obj.childNodes[i].name + "=" + encodeURIComponent(obj.childNodes[i].value) + "&";
            }
        }
        if (obj.childNodes[i].tagName != null && obj.childNodes[i].tagName.toUpperCase() == "SELECT") {
            formparams += obj.childNodes[i].name + "=" + encodeURIComponent(obj.childNodes[i].options[obj.childNodes[i].selectedIndex].value) + "&";
        }

        if (obj.childNodes[i].tagName != null && obj.childNodes[i].tagName.toUpperCase() == "TEXTAREA") {
            formparams += obj.childNodes[i].name + "=" + encodeURIComponent(obj.childNodes[i].value) + "&";
        }

        if (obj.childNodes[i].tagName != null &&
            (obj.childNodes[i].tagName.toUpperCase() == "DIV" || obj.childNodes[i].tagName.toUpperCase() == "SPAN"
                || obj.childNodes[i].tagName.toUpperCase() == "H1")) 
        {
            getRequestParameters(obj.childNodes[i]);
        }
    }
}

function evalScripts(str)
{
    myRe = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'gi');
    myRe.lastIndex = 0;
    while ((a = myRe.exec(str)) != null)
    {
        eval(a[1]);
    }
}

var doOnCallBack;
function setCallBackFunction() {
    xmlHttp.onreadystatechange =
        function() {
            try {
                if (xmlHttp.readyState == 4) {
                    if (xmlHttp.status == 200) {
                        eval(doOnCallBack);
                    }
                    else alert('Ajax error (ErrorCode: ' + xmlHttp.status + ')');
                    return;
                }
            }
            catch (e) {
                alert(e.message);
            }
        }
}

function InitAjax() {
    try {
        var xmlHttp = new XMLHttpRequest();
    }
    catch (e) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support Ajax!");
                return false;
            }
        }
    }
    return xmlHttp;
}
