/***************************************** Proprietary software **********************************
    File: async.js
    Project: phprel (www.phprel.ro)
    Developed by: Marian Fechete <marian.fechete@phprel.ro>
    
    USE IS SUBJECT TO LICENSE. 
*************************************************************************************************/

var xmlhttp = new Array();
var idreq = -1;

function getResponse ( idreq )
{           
    if (xmlhttp[idreq].readyState == 4) 
    if (xmlhttp[idreq].status == 200) 
		return xmlhttp[idreq].responseXML;
    else 
        return false;
    else 
    	return false;
}

function processRequest ( idreq )
{              
    var response = getResponse(idreq);
    var tagid = 0, value = 0, selectid = 0, selectopts = false, func = false;  
    var i;

    if (!response)
        return false; 

    response = response.getElementsByTagName('document')[0];
    if (!response)
        return false;
                           
    var contents = response.getElementsByTagName('contents');
    if (contents)
    {
        contents = contents[0].getElementsByTagName('content');
        for (i=0;i<contents.length;i++)
        {                                                      
            tagid=contents[i].getAttribute('id');              
            value=_reformat(contents[i].getAttribute('value'));
            changeDiv(tagid, value);
        }
	}

    var displays = response.getElementsByTagName('displays');
    if (displays)
    {
        displays = displays[0].getElementsByTagName('display');
        for (i=0;i<displays.length;i++)
        {
            tagid=displays[i].getAttribute('id');
            value=_reformat(displays[i].getAttribute('value'));
            if (document.getElementById(tagid))
            {
                document.getElementById(tagid).style.display=value;
            }
        }                                                               
    }                                                         
                                                            
    var selects = response.getElementsByTagName('selects');
    if (selects)
    {
        selects = selects[0].getElementsByTagName('select');    
        for (sel=0;sel<selects.length;sel++)
        {
            selectid = selects[sel].getElementsByTagName('id')[0].getAttribute('value');
            if (document.getElementById(selectid))
            {
                selectopts = selects[sel].getElementsByTagName('options');
                if (selectopts)
                {
                    selectopts = selectopts[0].getElementsByTagName('option');
                    if (selectopts)
                    {
                        changeSelect(selectid, selectopts);
                    }
                }
            }
        }
    }

    var inputs = response.getElementsByTagName('fields');
    if (inputs)
    {
        inputs = inputs[0].getElementsByTagName('field');
        for (i=0;i<inputs.length;i++)
        {
            tagid = inputs[i].getAttribute('id');
            value = _reformat(inputs[i].getAttribute('value'));
            if (document.getElementById(tagid))
            {
                if (document.getElementById(tagid).type != 'checkbox' || document.getElementById(tagid).type != 'radio')
                    document.getElementById(tagid).value = value;
                else
                    document.getElementById(tagid).checked = value;
            }
        }                                                               
    }                                                         

    var calls = response.getElementsByTagName('calls');
    if (calls)
    {
        calls = calls[0].getElementsByTagName('call');
        for (i=0;i<calls.length;i++)
        {
            tagid = calls[i].getAttribute('function');
            value = _reformat(calls[i].getAttribute('parameter'));
            func = new Function(tagid+'('+value+')');
            func();
        }                                                               
    }                                                         

    return true;
}

function asyncrequest (url, caller, target, procesor)
{             
    idreq++;
    /*@cc_on @*/
    /*@if (@_jscript_version >= 5)
     try {
      xmlhttp[idreq] = new ActiveXObject("Msxml2.XMLHTTP");
     } catch (e) {
      try {
       xmlhttp[idreq] = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
       xmlhttp[idreq] = false;
      }
     }
    @end @*/   
    if (!xmlhttp[idreq] && typeof XMLHttpRequest!='undefined') {
	    try {
		    xmlhttp[idreq] = new XMLHttpRequest();
	    } catch (e) {
		    xmlhttp[idreq] =false;
	    }
    }
    if (!xmlhttp[idreq] && window.createRequest) {
	    try {
		    xmlhttp[idreq] = window.createRequest();
	    } catch (e) {
		    xmlhttp[idreq] =false;
	    }
    }
           
    if (!procesor)
        procesor = 'processRequest';
     
    var call;   
    call = 0;
    if (obj = document.getElementById(caller))
    {
	    if (obj.type == 'checkbox')
	        call = (obj.checked ? '1' : '0');
	    else
	        call = _asyncformat(obj.value);
    }
    else
    if (caller)
        call = caller;
    
    if (!xmlhttp[idreq])
    {
        if (document.getElementById(caller))
            if (document.getElementById(caller).type == 'select-one' && document.getElementById(caller).form)
                document.getElementById(caller).form.submit();
	
        if (document.getElementById(target))
            if (document.getElementById(target).type == 'select-one' && document.getElementById(target).form)
                document.document.getElementById(target).form.submit();
        return false;
    }
        
    url = url + '&call=' + call + '&target=' + target;
            
    xmlhttp[idreq].onreadystatechange = new Function(procesor+'('+idreq+');');
    xmlhttp[idreq].open('GET',url, true);
	xmlhttp[idreq].setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    xmlhttp[idreq].send(null);
    
    return true;
}

function _reformat ( value )
{
	var value;
    value = value.replace(/\[lt]/g, '<');
    value = value.replace(/\[gt]/g, '>');
    value = value.replace(/\[qout]/g, '"');
    return value;
}

function changeSelect(select, elems) 
{
    var selObj = document.getElementById(select);
    if (!selObj)
        return false;        
    if (!elems)
        return false;
        
    selObj.length=0;
    for(i=0;i<elems.length;i++) {
        val=elems[i].getAttribute("value");
        txt=_reformat(elems[i].getAttribute("text"));
        selObj[i]=new Option(txt,val);
    }
    
    return true;
}

function changeDiv(div, content) 
{
    var divtag = document.getElementById(div);
    if (!divtag)
        return false;
        
    divtag.innerHTML=content;
    return true;
}

function asynclistdetails (list, row, linkrequest, caller, target)
{
	var div, div2;
	div = document.getElementById(list+'.details.'+row);
	div2= document.getElementById(list+'.details.tr.'+row);
	if (!div)
		return false;
    if (div.style.display == 'block')
    {
    	div.style.display = 'none'; 
    	div2.style.display = 'none'; 
    	return false;
    } 
    else 
    {
    	div.style.display = 'block';
    	div2.style.display = (navigator.appName.indexOf('Microsoft') == -1) ? 'table-row' : 'block';
    	return (!asyncrequest(linkrequest, caller, target));
    }
}

function _asyncformat( value )
{
    var value;
	if (Tsys_asyncKey)
	{
		if (value)
		{
			value = _verysimplecrypt(value);
			value = '~E~'+value;
		}
		else
			return value;
	}
	else
	{
		value = value.replace(/#/g, '--shift-3--');
		value = value.replace(/&/g, '--amp--');
		value = value.replace(/\+/g, '--plus--');
	}
	return value;
}                     			

function _verysimplecrypt(str)
{
	var newstr = '';  
	for (var i=0; i<str.length; i++)
	{
		newstr += String.fromCharCode(str.charCodeAt(i)^Tsys_asyncKey.charCodeAt(i % 32));
	}
 	var res = '';  
 	var sir = '0123456789ABCDEF';
 	var b, i;
    for (i=0; i<newstr.length;i++ ) {  
       b = newstr.charCodeAt(i);  
       res += sir.charAt(b>>4&0xF);  
       res += sir.charAt(b&0xF);  
    }  
    return res;  
}
