function getRequestObject()
{
 			var A;
			try {
				A=new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					A=new ActiveXObject("Microsoft.XMLHTTP");
				} catch (oc) {
					A=null;
				}
			}
			if(!A && typeof XMLHttpRequest != "undefined")
				A = new XMLHttpRequest();
      return A;
}
         

function remoteCall(ob,module,method,call)
{
	o = ob;
	o.module=module;
	o.method=method;
	//alert('webcall:'+JSON.stringify(o));
	var i, x, n;
	var uri;
	var post_data;
	uri = "index_back.php";
	var sajax_request_type = "POST";
	if (sajax_request_type == "GET") 
	{
		if (uri.indexOf("?") == -1) 
			uri = uri + "?mode=SERVICE&obj=" + escape(myEncode(o));
		else
			uri = uri + "?mode=SERVICE&obj=" + escape(myEncode(o));
		post_data = null;
	} 
	else 
	{
		post_data = "mode=SERVICE&obj=" + escape(myEncode(o));
	}
	x = getRequestObject();
	x.open(sajax_request_type, uri, true);
	if (sajax_request_type == "POST") 
	{
		x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
		x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	}
	x.onreadystatechange = function() 
	{
		if (x.readyState != 4) 
		return;			
		var status;
		var data;
		//alert(x.responseText);
		var y;
		/*try
		{*/
			y =JSON.parse(x.responseText);
			eval(call+"(y)");
		/*}catch(e)
		{
			document.write(x.responseText);
		}	*/			
		
	
	}
	x.send(post_data);
	delete x;
}

function webCall(ob,module,method,doClose,w,callFunc)
{
		//gaComponents.state.setValue("<font color='RED'>WAIT</font>");
      //o = new Object();
      //o.data=ob;
      o = ob;
      o.module=module;
      o.method=method;
      
      showWaiting();
      
      //alert('webcall:'+JSON.stringify(o));
      var i, x, n;
			var uri;
			var post_data;
			uri = "index.php";
      var sajax_request_type = "POST";
			if (sajax_request_type == "GET") 
      {
				if (uri.indexOf("?") == -1) 
					uri = uri + "?mode=SERVICE&obj=" + escape(myEncode(o));
				else
					uri = uri + "?mode=SERVICE&obj=" + escape(myEncode(o));
				post_data = null;
			} 
      else 
      {
				post_data = "mode=SERVICE&obj=" + escape(myEncode(o));
			}
			x = getRequestObject();
			x.open(sajax_request_type, uri, true);
			if (sajax_request_type == "POST") 
      {
				x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
				x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			}
			x.onreadystatechange = function() 
			{
				if (x.readyState != 4) 
					return;			
				var status;
				var data;
				//alert(x.responseText);
				var y;
				try
				{
					y =JSON.parse(x.responseText);
				}catch(e)
				{
					alert(x.responseText);
				}
				
				process(y,w);
				gaComponents.state.setValue("<font color='green'>READY</font>");
				
				//richiama metodo se specificato
				if (callFunc)
					eval(callFunc+"()");
				
				if(doClose)
					window.close();
					
				hideWaiting();	
			}
			x.send(post_data);
			delete x;
}

function myEncode(o)
{
  return JSON.stringify(o);
}

function processString(str)
{
  process(JSON.parse(str));
}

function process(data,window)
{
  //alert(JSON.stringify(data));
  //alert(1);
  for(i in data) 
  {
  		//alert(2)
		if(window)
		{
			//alert(3);
	  		processIn(data[i],window+'.gaComponents.','set'+i);	  	
	  		//alert(4);
		}
	  	else
	  	{
	  		//alert(5);
	  		processIn(data[i],'gaComponents.','set'+i);
	  		//alert(6);
	  	}
  }

}

function processIn(data,prefix,method)
{
  for(i in data) 
  {
    //alert(prefix+i+' start');
    comp = eval(prefix+i);
    if(comp)
    {
        if(eval('comp.'+method))
        {
        	var vsEval = 'comp.'+method+'(data[i])';
        	//alert(vsEval+"\r\n"+data[i]);
         	eval(vsEval);
        }
        else
        {
         processIn(data[i],prefix+i+'.',method);
        }
    }
    //alert(prefix+i+' end');
  } 
}

function fetchObject(obj)
{
  if(obj.getValue)
    var res = obj.getValue();
  else
  {
    var res = new Object();
    for( i in obj)
    {
      res[i] = fetchObject(obj[i]);
    }
  }
  return res;
}

function operate(op)
{
	var vsEval ="op"+op+"()";
	eval(vsEval);
}

 
function fetchFormData(psForm)
{
	//psForm.elements.length=0;
	var cnt = 0;
	var elmCount = psForm.elements.length;
	var vaRes = new Array();
	for(var i=0;i<elmCount;i++)
	{
		if(psForm.elements[i].type=='select-multiple')
		{
			
			var optCount = psForm.elements[i].options.length;
			for(var j=0;j<optCount;j++)
			{
				if(psForm.elements[i].options[j].selected)
				{
					var voObj = new Object();
					voObj.name=	 psForm.elements[i].name;
					voObj.value= psForm.elements[i].options[j].value;
					vaRes[cnt++] = voObj;
				}
			}
		}
		else
		{
			var ok=false;
			if( (psForm.elements[i].type=='checkbox')|| (psForm.elements[i].type=='radio'))
				ok = psForm.elements[i].checked;
			else
				ok = true;
			if(ok)
			{
				var voObj = new Object();
				voObj.name=	 psForm.elements[i].name;
				voObj.value= psForm.elements[i].value;
				vaRes[cnt++] = voObj;
			}
		}
	}
	return vaRes;
}

function validate(poForm,module,component,submit)
{
	var data = fetchFormData(poForm);
	
	/*
	var dataStr = JSON.stringify(data);
	alert(dataStr);
	*/
	
	var o = new Object();
	o.validate = data;
	if(component)
		o.component=component;
	o.submit = (submit==true);
	webCall(o,module,'validate');
}

function combo(poForm,module,component,submit)
{
	var data = fetchFormData(poForm);
	

//	var dataStr = JSON.stringify(data);
//	alert(dataStr);
	
	var o = new Object();
	o.combo = data;
	if(component)
		o.component=component;
	o.submit = (submit==true);
	//alanic
	//sfrutto component anche come nome del metodo js da richiamare
	webCall(o,module,component);
}
