var browserType = BrowserSniff();
function BrowserSniff(){
  if (document.layers) return "NS";
  if (document.all) return "IE";
  if (document.getElementById) return "MOZ";
  return "OTHER";
}

function XmlHttpRPC(rspage, callback, func, parms, formdata)
{
   var XmlHttp;
   if (browserType == "IE") {
      
      try { XmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); }
      catch (e) { alert(e); }
   }
   //else if (browserType == "MOZ")
   else if (window.XMLHttpRequest)
   {
      try { XmlHttp = new XMLHttpRequest(); }
      catch (e) { alert(e);}
   }
   if (!XmlHttp) {
      alert("Your browser doesn't support XMLHttpRequest. The request is not sent successfully.")
      return;
   }

   try {
      XmlHttp.open("POST", rspage, false);
   }
   catch (e) { 
      alert("Can't open http connection due to the reason:\n"+e); 
      XmlHttp.abort();
      return;
   }

   XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');   // _POST[]
   
   //var msg = "RPC=1&"+composeURLString(func, parms, formdata);
   var msg = "RPC=1";

   XmlHttp.send(msg);
   
   if (XmlHttp.responseText.indexOf("Fatal error") > 0 || XmlHttp.responseText.indexOf("User error") > 0 )
      popupWindow(XmlHttp.responseText, 600, 500);
   
   if (XmlHttp.status != 200) {
      alert("There was a problem with the request.");
      return;
   }
   
   //if (RPC_DEBUG)
   //   debugWindow(XmlHttp.responseText);
   
   callback(XmlHttp.responseText);
}

function composeURLString(func, parms, formdata)
{
  urlStr = "";
  // func and parms are optional
  if (func != null) {
    urlStr += "F=" + escape(func);
    if (parms != null){
      if (typeof(parms) == "string"){
        // single parameter
        urlStr += "&P0=[" + escape(parms+'') + "]";
      } else {
        // assume parms is array of strings
        for( var i=0; i < parms.length; i++ ){
          urlStr += "&P" + i + "=[" + escape(parms[i]+'') + "]";
        }
      } // parm type
    } // parms
  } // func
  else
    return urlStr;
  
  if (formdata != null) {
      urlStr += "&__FormData=[" + jescape(formdata+'') + "]";
  }
  return urlStr;
}

var targetDiv  
function SetTargetDiv(divid)
{
	targetDiv=divid;
}

function CallbackFunction(returval) 
{

   document.getElementById(targetDiv).innerHTML=returval;
}


 // obj_method_params as format "obj.method('string',value)"
 // service, method, params, ...
 // funcType can be 
 //   'RPC'(default)
 //   'Page'(reload url), 
 //   'Form'(submit form with post), 
 //   'Popup'(open popup with url), 
 //   'FormPopup'(open popup with form submit)
 function CallFunction(obj_method_params, funcType, loadPageTarget)
 {
   if (funcType == null || funcType == '')
      funcType = "RPC";

   // find the first "(" 
   var pos0 = obj_method_params.indexOf("("); 
   var obj_method = obj_method_params.substring (0,pos0); 
   
   pos0 = obj_method.lastIndexOf(".");
   // parse object name
   var obj = "NULL";
   var attachData= null;
   if (pos0>0)
      obj = obj_method.substring(0,pos0);
   // parse method/function name
   var pos1 = obj_method_params.indexOf("(");
   if (pos1>pos0)
   {
      var method = obj_method_params.substring(pos0+1,pos1); 
      var pos2 = obj_method_params.indexOf(")");
      if (pos1>pos0)
      {
         // get parameters
         var params = obj_method_params.substring(pos1+1,pos2);
         var params_array = new Array(); 
         if (params) 
            params_array = params.split(","); 
         var paramArray = new Array(2+params_array.length);
         paramArray[0] = obj;
         paramArray[1] = method;
         
         for(i=0;i<params_array.length;i++)   {
           paramArray[2+i] = params_array[i];
           
         }
         
         // try to call client object function
         var client_obj = GetObject(obj);
         //alert(obj);
         if (client_obj)
         {
            client_obj.m_FunctionType = funcType;
            client_obj.m_LoadPageTarget = loadPageTarget;
            if (client_obj[method]) {
               client_obj[method](params_array);
           
            } else { 
            
               client_obj.CallFunction(method,params_array);
            }
            return;
         } 
         if (funcType=="RPC") {
         	
            XmlHttpRPC(bizsrvr, CallbackFunction, "RPCInvoke", paramArray, null);
            return;
         }
         
         URL = composeURL(bizsrvr, "Invoke", paramArray, null, funcType, loadPageTarget);        
         if (funcType=="Page") 
            loadPage(URL, loadPageTarget); 
         else if (funcType=="Popup")
            loadPopup(URL);
         else if (funcType=="Form") 
            alert("Cannot submit an unknown form."); 
         else if (funcType=="FormPopup")
            alert("Cannot submit an unknown form to show a popup.");
         else
            alert("invalid function type '"+funcType+"'");
      }
    }
 }  
  
  
  
  
  function findPosX(obj)
  {
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
  }

  function findPosY(obj)
  {
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
  }
  
  function makeDivProgressBar(divName) {
    var  BlockLoading=document.getElementById(divName);
    var  divhtml ="<table border='0' width='100%' cellpadding='2' cellspacing='0'>";
         divhtml+="  <tr>";
         divhtml+="    <td colspan='3' height='10'>&nbsp;</td>";
         divhtml+="  </tr>";
         divhtml+="  <tr>";
         divhtml+="    <td rowspan='2' width='5%'>&nbsp;</td>";
         divhtml+="    <td align='left'  bgcolor='#C7C7C7'><font size='2'><b>Loading...<b></font></td>";
         divhtml+="    <td rowspan='2' width='5%'>&nbsp;</td>";
         divhtml+="  </tr>";
         divhtml+="  <tr>";
         divhtml+="    <td align='left' height='20' background='modules/globals/template/default/media/progress.gif' >&nbsp;</td>";
         divhtml+="    </td>";
         divhtml+="  </tr>";
         divhtml+="  <tr>";
         divhtml+="    <td colspan='3' height='10'>&nbsp;</td>";
         divhtml+="  </tr>";
         divhtml+="</table>";
         
	//var w = document.body.clientWidth;
	//var h = document.body.clientHeight;         
    //if (!document.getElementById(ajClient_LoadDiv)) {
    //  var div_progressbar = BlockLoading.cloneNode(true)
    //  var div_progressbar = document.createElement('div');
    //  div_progressbar.id=ajClient_LoadDiv;
    //  document.body.appendChild(div_progressbar);
    //  var div_progressbar= document.getElementById(ajClient_LoadDiv);
    //}
    //div_progressbar.style.top=findPosY(BlockLoading);
    //div_progressbar.style.left=findPosX(BlockLoading);
	//div_progressbar.style.position = "absolute";
    //div_progressbar.style.display = 'block';
    BlockLoading.innerHTML=divhtml;



  }
  
  function js_urlloading(link,divName) {
    var BlockLoading=document.getElementById(divName);
    var div_progressbar= document.getElementById('acLoadDiv');
    makeDivProgressBar(divName);
    if (BlockLoading && link) {
	  advAJAX.get({
        url: link,
 
        onSuccess : function(obj) {
           BlockLoading.innerHTML=obj.responseText;
           if (document.getElementById('acLoadDiv'))
             document.getElementById('acLoadDiv').style.display = 'none';
        },
        onError : function(obj){
           alert("Error: " + obj.status);
        }
      });  
    }
  }
  
  function divURLLoading(link,divName,fcallback) {
    var ajClient_LoadDiv="acLoadDiv";
    var BlockLoading=document.getElementById(divName);
    var div_progressbar= document.getElementById('acLoadDiv');
    makeDivProgressBar(divName);
    if (BlockLoading && link) {
	  advAJAX.get({
        url: link,
        onSuccess : function(obj) {
           BlockLoading.innerHTML=obj.responseText;
           if (document.getElementById('acLoadDiv'))
             document.getElementById('acLoadDiv').style.display = 'none';
           if (fcallback)
           {
             eval(fcallback+'()');
           }
        },
        onError : function(obj){
           alert("Error: " + obj.status);
        }
      });  
    }
  }
  
  function replaceAll( str, from, to ) 
  {
    var idx = str.indexOf( from );


    while ( idx > -1 ) 
    {
        str = str.replace( from, to );
        idx = str.indexOf( from );
    }

    return str;
  }    