  var globalResponseFunction;
		var stealthDownloadUniqueID;
		var g_rollback;//0==formObject, 1==form attributes, 2==rollbacks, 3==removes.
			
		var g_currentFormName=false;
		
  function StealthDownload( formObject, subAction, servlet, target, additionalUrl, functionPointer, noShield, allowMultiSubmit )
  {		
		  g_rollback=[ new Array(), false, new Array(), new Array() ];				
			 if ( !formObject ) 
				{
					  formObject = target && target.body ? target.createElement("form") : document.createElement("form");
							formObject.method='post';
							formObject.style.display='none';
							formObject.name='temp_Form';//removed by rollback cause it has to recorded attributes.
							if ( target && target.body )
							{
							  target.body.insertBefore( formObject, target.body.firstChild );
							  target='_self';
							} else document.body.insertBefore( formObject, document.body.firstChild );														
				} else 
				{					 
						if ( !doc(formObject) )
					   formObject = document.getElementById(formObject);						
						recordFormAttributes( formObject );
				}
				//prevent multi submit unless specificaly requested....ie. for email preview.
				if ( formObject.name == g_currentFormName && !allowMultiSubmit && (!target || target.length < 1) )
				{
					  //alert("cancel mulit submit attempt.  subAction="+subAction + ", servlet="+servlet + ", target="+target + ", formName="+g_currentFormName);
							//return;
				}
				if ( target && target.length > 0 )
				{//as target is set then these extra features are not possible because there is no way to reset them.
				  g_currentFormName=false;
						noShield=true;
				}	else
				  g_currentFormName = formObject.name;
				//end prevent multi submit;
				g_rollback[0]=formObject;
				addAdditionalUrlToForm( formObject, "session="+top.g_session );
				var actionType = "data_only";				
	   if ( servlet && servlet.length > 0 ) formObject.action=servlet;
				else if ( !formObject.action || formObject.action.length < 5 ) { alert("Form Action has not been set....not submitting form ["+formObject.name+"] called by " + StealthDownload.caller); g_currentFormName=false; return; }
	   if ( target && target.length > 0 ) { formObject.target=target;	actionType="htm_page";}
				else formObject.target="STEALTH_DOWNLOADER"+stealthDownloadUniqueID;
    globalResponseFunction = !functionPointer ? StealthDownloadDefaultReply : functionPointer;				
				addAdditionalUrlToForm( formObject, "subAction="+subAction+"&actionType="+actionType );				
				if ( top.g_debug >= 2 ) addAdditionalUrlToForm( formObject, "scriptHandler=null" ).value="\n  "+functionPointer;
				if ( top.g_debug >= 3 ) addAdditionalUrlToForm( formObject, "caller=null" ).value="\n  "+StealthDownload.caller;
	   if ( additionalUrl && additionalUrl.length > 2 ) addAdditionalUrlToForm( formObject, additionalUrl );
				subForm( formObject, actionType, noShield );
				StealthRollback();    
  }
  function subForm( formObject, actionType, noShield ) 
		{ 
		  if ( canSubmit( formObject ) ) 
				{  				  
						if ( actionType != 'htm_page' && !noShield )
						{							
							 top.submitShieldUp();
						}
						formObject.submit();
				}
		}
		
		function recordFormAttributes( formObject )
		{
					g_rollback[1]=new Array();
     g_rollback[1]['action']=formObject.action;
					g_rollback[1]['target']=formObject.target;
					g_rollback[1]['encoding']=formObject.encoding;
		}
		
		function canSubmit(f)
		{
	   var a = []; if (f.onsubmit) a.push(f.onsubmit);
	   var can=true;
	   for (var i in a) can = a[i]();				
				return can;
		}
  function StealthDownloadDefaultReply( data ) { findAndExecuteScripts(data); }
		
  function addAdditionalUrlToForm( formObject, additionalUrl )
  {			
    var pairs = additionalUrl.split("&");
				var fc;
	   for ( p = 0; p < pairs.length; p++ )
	   {
					 if ( pairs[p].length > 0 )
						{
        var name_value = pairs[p].split("=");
	       if ( formObject.elements[name_value[0]] )
	       {			
								  g_rollback[2][ name_value[0] ] = formObject.elements[name_value[0]].value;
		        formObject.elements[name_value[0]].value = name_value[1];
										fc=formObject.elements[name_value[0]];
	       }else
	       {		
								  g_rollback[3][ g_rollback[3].length ] = name_value[0];
          fc = createHiddenField( formObject, name_value[0], name_value[1] );
										if ( formObject.childNodes.length > 0 )
            formObject.insertBefore(fc, formObject.childNodes.item(0));
										else
										  formObject.appendChild(fc);
	       }	  
						}
	   }
				return fc;
  }

  function createHiddenField( formObject, name, value )
  {
    var hf = doc(formObject).createElement("input");
	   hf.type="hidden";  hf.name=name;  hf.id=formObject.name + "_" + name; hf.value=value;
	   return hf;
  }
		
  function StealthRollback()
		{
			  if ( !g_rollback[1] ) 
					{
						 rn(g_rollback[0]); 
							return;
					}
			  for ( attName in g_rollback[1] )
					  g_rollback[0].setAttribute( attName, g_rollback[1][attName] );
					for ( elName in g_rollback[2] )
					  g_rollback[0].elements[ elName ].value=g_rollback[2][elName];
					for ( d = 0; d < g_rollback[3].length; d++ )
					  rn( document.getElementById( g_rollback[0].name+"_"+g_rollback[3][d] ) );
		}		
  
  function formToUrl( frm, additionalUrl ) 
  {
	   if ( !additionalUrl || additionalUrl.length < 3 ) additionalUrl = "";
	   else additionalUrl = additionalUrl.substring(additionalUrl.length-1) == "&" ? additionalUrl : additionalUrl + "&"; 
	   var url = "";
	   for ( i = 0; i < frm.elements.length; i++ )
	   {
		    url+= "&"+frm.elements[i].name + "=" + frm.elements[i].value;
	   }
	   url = url.substring(1);//remove first '&'
  	 frm.action = frm.action.indexOf("?") > -1 ? frm.action.substring(0,frm.action.indexOf("?")) : frm.action;
	   return frm.action + "?" + additionalUrl + url;	  
  }
    
  function findAndExecuteScripts(data) 
  {
    var si = data.indexOf("<script");
				var csi = data.indexOf('>', si)+1;
	   var ei = data.indexOf("<\/script>");
	   while ( csi > 7 && ei > csi )
	   {
					 var exu = data.substring(csi,ei);
	     data = data.substring(0,si) + data.substring(ei+9);
      eval(exu);						
      si = data.indexOf("<script");
						csi = data.indexOf('>', si)+1;
	     ei = data.indexOf("<\/script>");	  
	   }
				return data;
  } 
		var cnt=0;
		var g_multiFrm;
		function checkMultiPart( obj, id, replyFunction, servlet ) 
		{
			 if ( event.propertyName != 'value' ) return false;
				if ( document.all[id+"_Fake"].value !=  document.all[id].value)
				{
      document.all[id+"_Fake"].value=document.all[id].value;
      document.all[id].title=document.all[id].value;				
				}
    obj.form.encoding = "multipart/form-data";
			 if ( replyFunction != null )
				{
					 g_multiFrm=obj.form;
					 if ( !servlet || servlet.length < 1 ) servlet = "/servlet/com.isa.balmoral.admin.process.MatServlet";
      StealthDownload( obj.form.name, 'uploadFile', servlet, null, 'subTask=uploadFile&FileBrowseField='+id, replyFunction, false, true );
				}
				else
				  addAdditionalUrlToForm( obj.form, "FileBrowseField="+id );			  
  }
		function checkMultiPartReply( data )
		{
     data = findAndExecuteScripts(data);					
					if ( data.length < 1 ) return;
			  var da = data.split(",");
					
					if ( g_multiFrm )
					{
						 g_multiFrm.encoding = "application/x-www-form-urlencoded";
							g_multiFrm.removeAttribute("requestInProcess");
					  insertAdjacentHTML( g_multiFrm.elements[0], "BeforeBegin", "<input type=hidden name="+da[1]+" id="+da[1]+" value='"+da[0]+"'>");
							var name = da[1].replace(/_Path/g,"");
							var preview = document.all[name+"_Preview"];
							if ( preview )
							{
								  preview.href=da[0].substring( da[0].indexOf("\\Uploads\\")).replace(/\\/g,'/');
										var parts = da[0].split('\\');
										preview.innerHTML=parts[parts.length-1];
							}
					}else
					{
						 document.forms["view"].encoding = "application/x-www-form-urlencoded";
					  insertAdjacentHTML(document.getElementById(da[1]), "BeforeBegin", "<input type=hidden name="+da[1]+" id="+da[1]+" value='"+da[0]+"'>");					  
							var name = da[1].replace(/_Path/g,"");
							var preview = document.all[name+"_Preview"];
							if ( preview )
							{
								  preview.href=da[0].substring( da[0].indexOf("\\Uploads\\")).replace(/\\/g,'/');
										var parts = da[0].split('\\');
										preview.innerHTML=parts[parts.length-1];
							}							
					}
		}
		function resetMultipartForm(formName)
		{
    document.forms[formName].encoding = "application/x-www-form-urlencoded";	
		}