var httpRequest = new Object;
var forms = new Array;
var acViaReturn = 0;
var acNoSubmit = 0;
var buttonTimeElapse = 750;
var reasonText = '';
var destElement = new Object;
var blinkSet = 0;

function fetchUriVar(name, value)
{
    return encodeURIComponent(name) + '=' + encodeURIComponent(value);
}

function prepareRequest()
{
    initXmlHttp();

    if (acNoSubmit)
    {
        acNoSubmit = 0;
        return false;
    }

    if (acViaReturn && !isExplorer)
    {
        acViaReturn = 0;
        return false;
    }

    if (this.submitButton && !this.submitButton.submitHandler())
    {
        this.submitButton.disabled = false;
        return false;
    }

    forms[forms.length] = this;

    if (this.elements['do'] && !this.elements['do'].value)
    {
        toggleButton(forms.length-1, 1, 1);

        return false;
    }

    if (this.elements['do'] && this.elements['do'].value.match('url:'))
    {
        var urlRedirect = this.elements['do'].value.substring(4, this.elements['do'].value.length);
    }

    var query = new Array;

    for (var i = 0; i < this.elements.length; i++)
    {
        if (this.elements[i].disabled)
        {
            continue;
        }

        if (urlRedirect && this.elements[i].getAttribute('name') == 'do')
        {
            continue;
        }

        if (this.elements[i].type == 'submit' || this.elements[i].type == 'button')
        {
            continue;
        }

        if (this.elements[i].type == 'select-multiple')
        {
            for (var j = 0; j < this.elements[i].options.length; j++)
            {
                if (this.elements[i].options[j].selected)
                {
                    query[query.length] = fetchUriVar(this.elements[i].name, this.elements[i].options[j].value);
                }
            }

            continue;
        }

        if (this.elements[i].type == 'radio' || this.elements[i].type == 'checkbox')
        {
            if (this.elements[i].checked)
            {
                query[query.length] = fetchUriVar(this.elements[i].name, this.elements[i].value);
            }

            continue;
        }

        query[query.length] = fetchUriVar(this.elements[i].name, this.elements[i].value);
    }

    if (reasonText)
    {
        query[query.length] = fetchUriVar('reason', reasonText);
    }

    if (urlRedirect)
    {
        urlRedirect = urlRedirect + (urlRedirect.indexOf('?') != -1 ? '&' : '?') + query.join('&');

        if (this.target == '_blank')
        {
            window.open(urlRedirect);
        }
        else
        {
            document.location = urlRedirect;
        }

        toggleButton(forms.length-1);

        return false;
    }

    query[query.length] = 'js=1';

    httpRequest.onreadystatechange = handleResponse;

    sendRequest(this.getAttribute('method'), this.getAttribute('action'), query.join('&'));

    return false;
}

function submitHandler()
{
    if (this.disabled)
    {
        return false;
    }

    this.disabled = true;

    if (this.getAttribute('title') && !window.confirm(this.getAttribute('title')))
    {
        return false;
    }

    if (this.form.elements['do'] && this.form.elements['do'].type == 'select-one'
    && (this.form.elements['do'].value.match('confirm') || this.form.elements['do'].value.match('prompt')))
    {
        var windowText = this.form.elements['do'].options[this.form.elements['do'].selectedIndex].getAttribute('title');

        if (this.form.elements['do'].value.match('confirm'))
        {
            if (!confirm((!windowText ? 'Are you certain of proceeding?' : windowText)))
            {
                return false;
            }
        }
        else if(this.form.elements['do'].value.match('prompt'))
        {
            reasonText = prompt((!windowText ? 'Please enter your reason:' : windowText), '');

            if (!reasonText)
            {
                return false;
            }
        }
    }

    this.valueDefault = this.value;
    this.value = 'Loading';
    
    if(getBrowser() == 'Safari')
    {
    	blinkSet = 1;
    	this.style.textDecoration = 'blink';
    }
    else
    {
    	this.style.textDecoration = 'blink';
    }

    return true;
}

function sendRequest(method, action, query)
{
    httpRequest.open(method, action + (method == 'get' ? '?' + query : ''), true);

    if (method == 'post')
    {
        httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    }
    else
    {
        query = null;
    }

    httpRequest.send(query);
}

function handleResponse()
{
    if (httpRequest.readyState != 4)
    {
        return;
    }

    handleCoreXml();

    if (forms[forms.length-1].submitButton)
    {
        toggleButton(forms.length-1, handleCoreXml.errorStatus, handleCoreXml.errorCount);
    }
}

function handleCoreXml()
{
    handleCoreXml.errorStatus = 0;
    handleCoreXml.errorCount = 0;

    if (httpRequest.getResponseHeader('Content-Type') == 'application/xml' && httpRequest.responseXML
    && httpRequest.responseXML.getElementsByTagName('document').length)
    {
        if (httpRequest.responseXML.getElementsByTagName('alert').length)
        {
            for (var i = 0; i < httpRequest.responseXML.getElementsByTagName('alert').length; i++)
            {
                if (httpRequest.responseXML.getElementsByTagName('alert')[i].firstChild)
                {
                    alert(httpRequest.responseXML.getElementsByTagName('alert')[i].firstChild.nodeValue);
                }
            }
        }

        if (httpRequest.responseXML.getElementsByTagName('element').length)
        {
            var elements = httpRequest.responseXML.getElementsByTagName('element');

            for (var i = 0; i < elements.length; i++)
            {
                var element;

                if (elements[i].parentNode.nodeName == 'form')
                {
                    if (document.forms[elements[i].parentNode.getAttribute('id')])
                    {
                        element = document.forms[elements[i].parentNode.getAttribute('id')].elements[elements[i].getAttribute('id')];
                    }
                    else
                    {
                        alert('apply(): "'+elements[i].parentNode.getAttribute('id')+'" not defined.');
                        handleCoreXml.errorCount++;

                        break;
                    }
                }
                else if (document.getElementById(elements[i].getAttribute('id')))
                {
                    if (elements[i].getAttribute('byForm'))
                    {
                        element = document.getElementById(elements[i].getAttribute('byForm')).elements[elements[i].getAttribute('id')];
                    }
                    else
                    {
                        element = document.getElementById(elements[i].getAttribute('id'));
                    }
                }

                if (element)
                {
                    for (var j = 0; j < elements[i].childNodes.length; j++)
                    {
                        var attribute = elements[i].childNodes[j];

                        if (attribute.firstChild && attribute.firstChild.nodeType == 1)
                        {
                            for (var k = 0; k < attribute.childNodes.length; k++)
                            {
                                element[attribute.nodeName][attribute.childNodes[k].nodeName] =
                                    (attribute.childNodes[k].firstChild ? attribute.childNodes[k].firstChild.nodeValue : '');
                            }
                        }
                        else
                        {
                            if (attribute.nodeName == 'value')
                            {
                                clearError(element.getAttribute('id'));

                                if (element.type == 'checkbox' || element.type == 'radio')
                                {
                                    element.checked = (attribute.firstChild && attribute.firstChild.nodeValue == false ? false : true);
                                    continue;
                                }

                                if (element.type == 'select-multiple')
                                {
                                    for (var z = 0; z < element.options.length; z++)
                                    {
                                        if (attribute.firstChild && element.options[z].value == attribute.firstChild.nodeValue)
                                        {
                                            element.options[z].selected = true;
                                        }
                                    }

                                    continue;
                                }
                            }

                            element[attribute.nodeName] = (attribute.firstChild ? attribute.firstChild.nodeValue : '');
                        }
                    }
                }
                else
                {
                    alert('setElement(): "'+elements[i].getAttribute('id')+'" not defined.');
                    handleCoreXml.errorCount++;
                }
            }
        }

        if (httpRequest.responseXML.getElementsByTagName('error').length)
        {
            handleCoreXml.errorStatus = 1;
            handleCoreXml.errorCount = httpRequest.responseXML.getElementsByTagName('error').length;

            for (var i = 0; i < httpRequest.responseXML.getElementsByTagName('error').length; i++)
            {
                if (httpRequest.responseXML.getElementsByTagName('error')[i])
                {
                    var error = httpRequest.responseXML.getElementsByTagName('error')[i];

                    if (error.getAttribute('id'))
                    {
                        if (!forms[forms.length-1].elements[error.getAttribute('id')])
                        {
                            alert('Set Error: element "'+error.getAttribute('id')+'" not defined.');
                            handleCoreXml.errorCount++;

                            continue;
                        }

                        if (!forms[forms.length-1].elements[error.getAttribute('id')].errorSpan)
                        {
                            var errorSpan = document.createElement('span');
                            forms[forms.length-1].elements[error.getAttribute('id')].parentNode.parentNode.getElementsByTagName('td')[0].appendChild(document.createElement('br'));
                            forms[forms.length-1].elements[error.getAttribute('id')].parentNode.parentNode.getElementsByTagName('td')[0].appendChild(errorSpan);
                            errorSpan.appendChild(document.createTextNode(''));
                            errorSpan.setAttribute('id', '_' + error.getAttribute('id'));
                            errorSpan.className = 'highlight';
                            forms[forms.length-1].elements[error.getAttribute('id')].errorSpan = errorSpan;
                        }

                        forms[forms.length-1].elements[error.getAttribute('id')].errorSpan.firstChild.nodeValue = error.firstChild.nodeValue;
                    }
                    else
                    {
                        alert(error.firstChild.nodeValue);
                    }
                }
            }
        }

        if (httpRequest.responseXML.getElementsByTagName('evaluate').length)
        {
            for (var i = 0; i < httpRequest.responseXML.getElementsByTagName('evaluate').length; i++)
            {
                if (httpRequest.responseXML.getElementsByTagName('evaluate')[i].firstChild)
                {
                    eval(httpRequest.responseXML.getElementsByTagName('evaluate')[i].firstChild.nodeValue);
                }
            }
        }

        if (httpRequest.responseXML.getElementsByTagName('evaluateLast').length)
        {
            forms[forms.length-1].evaluateLast = httpRequest.responseXML.getElementsByTagName('evaluateLast');
        }
    }
    else
    {
        alert('Errors detected; please inform an administrator for help.');
        document.write ("<textarea cols=\"75\" rows=\"30\">"+ httpRequest.responseText +"</textarea>");
        

        handleCoreXml.errorCount = 1;
    }

    if (handleCoreXml.errorCount)
    {
        handleCoreXml.errorStatus = 1;
    }

    return !handleCoreXml.errorStatus;
}

function toggleButton(formIndex, errorStatus, errorCount)
{
	
    var button = forms[formIndex].submitButton;
		
    if (button.style.textDecoration || blinkSet == 1)
    {
        button.style.textDecoration = '';
        button.value = forms[forms.length-1].submitButton.valueDefault;
        button.valueDefault = '';
        blinkSet = 0;
    }

    if (errorStatus == 2 && button.valueDefault)
    {
        button.disabled = false;
        button.value = button.valueDefault;
        
        if (button.style.backgroundColor)
        {
            button.style.backgroundColor = '';
            button.style.color = '';
        }

        if (forms[formIndex].evaluateLast)
        {
            for (i = 0; i < forms[formIndex].evaluateLast.length; i++)
            {
                if (forms[formIndex].evaluateLast[i].firstChild)
                {
                    eval(forms[formIndex].evaluateLast[i].firstChild.nodeValue);
                }
            }
        }

        forms[formIndex].evaluateLast = null;

        button.valueDefault = '';
    }
    else
    {
        button.valueDefault = button.value;

        button.value = (errorStatus ? 'Errors Reported ('+errorCount+')' : 'Action Completed');

        if (errorStatus)
        {
            button.style.backgroundColor = '#813131';
            button.style.color = '#FFFFFF';
        }
        else
        {
            button.style.backgroundColor = '#235CDB';
            button.style.color = '#FFFFFF';
        }
    }

    if (button.disabled && button.valueDefault)
    {
        setTimeout(new Function('toggleButton('+formIndex+', 2);'), buttonTimeElapse);
    }
}

function prepareAcRequest(e)
{
    var event = (window.event ? window.event : e);

    if (event.keyCode == 13)
    {
        return;
    }

    initXmlHttp();

    var query = new Array;

    query[0] = fetchUriVar('do', this.getAttribute('name').split('[')[0]);
    query[1] = 'ac=1&js=1';
    query[2] = fetchUriVar('query', this.value);
    //query[3] = fetchUriVar('foreignIds', this.parentNode.childNodes[5].getAttribute('value'));
    query[3] = fetchUriVar('foreignIds', this.ownerDocument.getElementById('foreignIds').value);
    
    handleAcResponse.inputField = this;
    httpRequest.onreadystatechange = handleAcResponse;

    sendRequest('get', this.form.action, query.join('&'));
}

function handleAcResponse()
{
    if (httpRequest.readyState != 4)
    {	
        return;
    }

    var acSelect = handleAcResponse.inputField.parentNode.getElementsByTagName('select')[0];

    if (handleCoreXml() && httpRequest.responseXML.getElementsByTagName('result').length)
    {
        acSelect.options.length = 0;

        acSelect.onkeydown = selectAcResult;
        acSelect.onclick = selectAcResult;

        if (httpRequest.responseXML.getElementsByTagName('result').length)
        {
            if (httpRequest.responseXML.getElementsByTagName('result')[0].getAttribute('value').toLowerCase() == handleAcResponse.inputField.value.toLowerCase())
            {
                acSelect.style.display = 'none';
                return;
            }

            for (var i = 0; i < httpRequest.responseXML.getElementsByTagName('result').length; i++)
            {
                acSelect.options.add(new Option);
                acSelect.lastChild.text = httpRequest.responseXML.getElementsByTagName('result')[i].firstChild.nodeValue;
                acSelect.lastChild.value = httpRequest.responseXML.getElementsByTagName('result')[i].getAttribute('value');
            }

            acSelect.style.display = '';
        }
    }
    else
    {
        acSelect.style.display = 'none';
    }
}

function selectAcResult(e)
{
    var event = (window.event ? window.event : e);

    if (event.which && event.which == 1)
    {
        event.keyCode = 0;
    }

    if (event.keyCode != 13 && event.keyCode != 0)
    {
        return
    }

    if (handleAcResponse.inputField.getAttribute('id'))
    {
        if (document.getElementById(handleAcResponse.inputField.getAttribute('name')))
        {
            document.getElementById(handleAcResponse.inputField.getAttribute('name')).value = this.value
            handleAcResponse.inputField.value = this.options[this.selectedIndex].text;
        }
        else
        {
            handleAcResponse.inputField.value = this.value;
        }

        this.style.display = 'none';
        handleAcResponse.inputField.focus();

        if (event.keyCode == 13)
        {
            acViaReturn = 1;
        }
    }
    else
    {
        document.location = document.location.pathname + '?id=' + this.value;
    }
}

function clearForm(formId)
{
    var elements = document.getElementById(formId).elements;

    for (var i = 0; i < elements.length; i++)
    {
        if (elements[i].getAttribute('name') == 'id' || elements[i].getAttribute('name') == 'do' ||
            elements[i].type == 'button' || elements[i].type == 'submit')
        {
            continue;
        }

        clearError(elements[i].getAttribute('id'));

        elements[i].value = '';
    }
}

function clearError(elementId)
{
    if (document.getElementById('_' + elementId) &&
        document.getElementById('_' + elementId).firstChild)
    {
        document.getElementById('_' + elementId).firstChild.nodeValue = '';
    }
}

function setRowDeleted(selectorId)
{
    document.getElementById(selectorId).checked = false;
    document.getElementById(selectorId).style.display = 'none';

    selectors[selectorId].className = selectors[selectorId].altClass = 'rowDeleted';
    document.getElementById(selectorId).form.submitButton.previousSibling.previousSibling.selectedIndex = 0;
    document.getElementById(selectorId).form.submitButton.previousSibling.previousSibling.disabled = true;
    document.getElementById(selectorId).form.submitButton.disabled = true;
}

function setRowUpdated(selectorId)
{
    selectors[selectorId].className = selectors[selectorId].altClass =
        (document.getElementById(selectorId).checked ? 'rowUpdatedSel' : 'rowUpdated');
}

function setRowChecked(selectorId)
{
        document.getElementById(selectorId).innerHTML = '<img height=\"15\" src=\"images/check.gif\" />';
}


function getData(method, action, query, elementObj, field)
{
	destElement = elementObj;
	  
	initXmlHttp();

	
	sendGetRequest(method, action, query.join('&'));
	
	if (httpRequest.readyState == 4)
	    {
		processResult(httpRequest.responseXML, field);
	    }
	    
	
}

function sendGetRequest(method, action, query)
{
    httpRequest.open(method, action + (method == 'get' ? '?' + query : ''), false);

    if (method == 'post')
    {
        httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    }
    else
    {
        query = null;
    }

    httpRequest.send(query);

}


function processResult(result, field)
{
	textResult = result.getElementsByTagName(field)[0].firstChild.nodeValue;
	destElement.innerHTML = textResult;
}


