var jg;
var Ox,Oy,Hx,Hy;
var Exct, ExctR, ExctI;
var ZR,ZI,ZZ,ZA;
var VT,VF;
var ZDspl,ThtDspl,RDspl,IDspl; //Display limit
var GrphDrwd=0; //1 after graph is drawded set in ZRfrs() and  ShwTrns()
var GWndwCmpr;


var GFrqnFctr=1;   //FStrt,FCntr,FEnd,FSmpl,FrqnDspl all changed in FRngPrcs, Clcl need in MHz
var GTmFctr=1;
var Nf=1024; //number of point for FFT

var GrphDataSave;  
var GrphDataL,GrphDataTyp,GrphXL,GrphDataR,GrphXR,GrphLUnit,GrphRUnit;
var ClclPrmt1; //which parameter to send to calculation
var ClclPrmt2="ZTht"; // determine r-tht or real-img for Impedance show
var GrphTtl="Transmit Impedance"; //title of the graph
var GTmUnit='ns',GFrqnUnit='MHz';



var GFStrtDiv,GFCntrDiv,GFEndDiv,GFSmplDiv;   //four freqeucny parameters from input box, uin MHz updated by getFrqn()
var FStrt,FCntr,FEnd,FSmpl;  //four F parameters in display system, in current unit
var TmDspl,FrqnDspl  //user defined ranges
var UsrHSet=0; //if user set the horizontal limits
var TmMax;  //maximal time available

var UsrLSet=0,LMn,LMx; //if user set left axis 
var UsrRSet=0,RMn,RMx; //if user set right axis
var LDMn,LDMx,RDMn,RDMx; //data max and min, LMn, LMx are for dsiplay

var DsplOptnOn=0;   //if the display option window is opened.



var Flnm;

var CmprSrs=0;
var PF;	//absolute value of spectrum for bandwidth calculation

//<script type="text/javascript" src="Fncts.js"></script>  //Nmbr(), Lbl(), MnMx()
function AddMtch(x)  //Called by DivMtchClcl.php
			// this is this.id identify SlctMtchClclP, D or PD, all the components saved in session variables
{
 xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
      { alert("Your browser does not support AJAX!");    return; } 
    xmlHttp.onreadystatechange=ScAddMtch;
    var url="AddMtch.php";   //add the components in session variable to design
    url=url+"?DP="+x.id; //distal or proximal
	MssgWndw='EMRcmnD';     //use distal if there is no cable
    if(x.id=='SlctMtchClclP')
        {    MssgWndw='EMRcmnP';}
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
} 
function ClclSlct(x)    //This the entrance from TrnsLgd.php, GetFrqn() is excuted before this
{
//alert(x)
var BlueMark = document.getElementById('BlueMark');
BlueMark.style.left=Ox+Hx-1;  //Blue mark is a picture, the line is not at beginning
BlueMark.style.top=Oy-2;
BlueMark.innerHTML="<img src='BlueCurs.PNG'></img>";

ClclPrmt1=x;
Clcl();
}
function Clcl()
{  
if(Term!=1)
{
 var r=confirm('Terms of Use: \n The service on biosono.com/bio-sound.com is offered "as is" without warranty of any kind, either expressed or implied. biosono.com/bio-sound.com will not be liable for any damage or loss of data whatsoever due to downloading or using our web-based software. In no event shall biosono.com/bio-sound.com be liable for any damages including, but not limited to, direct, indirect, special, incidental or consequential damages or other losses arising out of the use of the service from biosono.com/bio-sound.com.\n \n I accept the terms by click the "OK" button... \n \n This is a one-time question. You won\'t be asked again once you accept it. ');
      if (r!=true)
                    {document.getElementById("DivStts").innerHTML="You reject the Terms for using the simulation.";
                    return;}
                else
                    {Term=1;TermChck();
                    }
}
    Clr();jg.drawString("Waiting data from server ...", Ox+Hx/2, Oy+Hy/2);jg.paint();
    GFrqnFctr=1; //assume all the values are in MHz.    
    UsrLSet=0;UsrRSet=0;  //calculation will overwrite L R limits, not the horizontal
	UsrHSet=0
	DsplHRst();
    ClsDspl();
  //  alert('ZRdrs FStrt='+FStrt+ ' FEnd='+FEnd+' FDisp[0]='+FrqnDspl[0]+' FrqnDspl[1]'+FrqnDspl[1]+' GFrqnFctr'+GFrqnFctr);

    FStrtIndx=Math.round(GFStrtDiv/GFSmplDiv*Nf); FEndIndx=Math.round(GFEndDiv/GFSmplDiv*Nf); //freqeuncy index for KlmTrns.php
    switch(ClclPrmt1)
        {case 'ZT':
            GrphTtl="Transmit Electrical Impedance";GrphLUnit="&#937";
            Flnm='Transmit Electrical Impedance.csv';
            break;
        case 'ZR':
            GrphTtl="Receive Acoustic Impedance";GrphLUnit="MRayl";
            Flnm='Receive Acoustic Impedance.txt';break;
        case 'ZTx':
            GrphTtl="Transmit Electrical Impedance of the Acoustic Head";GrphLUnit="&#937";
            Flnm='Acoustic Head Transmit Electrical Impedance.txt';break;
        case 'ImplTrns':
            GrphTtl="Transmit Impulse Response";GrphLUnit="Pa";
            Flnm='Transmit Impulse Response.txt';break;
        case 'ImplRcv':
            GrphTtl="Receive Impulse Response";GrphLUnit="V/Pa";
            Flnm='Receive Impulse Response.txt';break;
        case 'ImplEch':
            GrphTtl="Pulse-Echo Impulse Response";GrphLUnit="V/V";
            Flnm='Pulse Echo Impulse Response.txt';break;
        case 'ExctTrns':
            GrphTtl="Transimit Response from Excitation";GrphLUnit="Pa";
            Flnm='Transmit Excitation Response.txt';break;
        case 'ExctEch':
            GrphTtl="Pulse-Echo Response from Excitation";GrphLUnit="V/V";
            Flnm='Pulse Echo Excitation Response.txt';break;
        case 'VTp':
            GrphTtl="Transmit Pulse at Proximal Side: VTp";GrphLUnit="V";
            Flnm='Transmit Voltage VTP.txt';break;
        case 'VTd':
            GrphTtl="Transmit Pulse at Distal Side: VTd";GrphLUnit="V";
            Flnm='Transmit Voltage VTd.txt';break;
        case 'VTx':
            GrphTtl="Transmit Pulse at Acoustic Head: VTx";GrphLUnit="V";            
            Flnm='Transmit Voltage VTx.txt';break;
        case 'Exct':
            GrphTtl="Excitation Waveform";GrphLUnit="V";            
            Flnm='Excitation Waveform.txt';break;
        }
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
      { alert("Your browser does not support AJAX!");    return; } 

    xmlHttp.onreadystatechange=TmData;
    if((ClclPrmt1=='ZT')||(ClclPrmt1=='ZR')||(ClclPrmt1=='ZTx'))
        {xmlHttp.onreadystatechange=ImpdData;}
           
    var url="KlmTrns.php?Typ="+ClclPrmt1+"&FiStrt="+FStrtIndx+"&FiEnd="+FEndIndx+"&SmplFrqn="+GFSmplDiv;     //FSmpl*GFrqnFctr change unit back to MHz
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
}
function Clr()
{
  jg.clear();
}
function CmprAdd(x)  //called by Comparison Add button in TrnsLgd.php
{
CmprSrs=CmprSrs+1;
var r=prompt("Please Enter a Name for the data Series:","Series"+CmprSrs);
if (r==null) //user cancelled
  {return;}
if((typeof(GWndwCmpr) != 'undefined')&&(!GWndwCmpr.closed))
    {  GWndwCmpr.location.reload('CmprAdd.php?SrsName='+r)   }
  else
    {GWndwCmpr=window.open('CmprAdd.php?SrsName='+r,'','scrollbars=1;width=600;');}
GWndwCmpr.focus();
}
function Crdn(event)
{
if(GrphDrwd==0)
    return;  //graph has not been drawn
//alert(event.clientX +'  '+event.y);
x=event.clientX-Ox; 	//event.x only apply to IE, event.clientX apply to both FF and IE
y=event.clientY-Oy;


 
var BlueMark = document.getElementById('BlueMark');

var XT=Nmbr(x/Hx*(TmDspl[1]-TmDspl[0])+TmDspl[0]*1.0);
var XF=x/Hx*(FrqnDspl[1]-FrqnDspl[0])+FrqnDspl[0]*1.0;
var YL,YR;

YL=Nmbr(GrphDataL[Math.round((XF*1.0-FStrt)*Nf/FSmpl)]); 
YR=Nmbr(GrphDataR[Math.round((XF*1.0-FStrt)*Nf/FSmpl)]);

//var XF=(x/Hx*9+FrqnDspl[0]*1.0);

var XFs=Nmbr(x/Hx*(FEnd-FStrt)+FStrt*1.0);  //for spectrum
switch(GrphDataTyp)
    {   case 'ZTht':   
            var Txt='At '+Nmbr(XF)+GFrqnUnit+':<br/> |Z|: '+YL+GrphLUnit+'<br/>'+'&#952:'+YR+"&deg";;
            break;
        case 'RI':   
            var Txt='At '+Nmbr(XF)+'MHz:<br/> Real: '+YL+GrphLUnit+'<br/>'+'Imag:'+YR+GrphRUnit;
            break;
        default:   
		YL=Nmbr(GrphDataL[Math.round(XT*GTmFctr*FSmpl*GFrqnFctr)]);
            var Txt='At '+XT+GTmUnit+':<br/> Amp: '+YL+GrphLUnit+'<br/><br/>At '+XFs+GFrqnUnit+':<br/> Amp: '+YR+'dB';
            break;

    }

//Txt=Txt+'<br/>Freq0:'+FrqnDspl[0]+'Freq1:'+FrqnDspl[1]+'  x:'+XF;
var thisspan = document.getElementById('Crsr');
thisspan.style.left=Ox+x+3;	// the field left and top has to predefine in TrnsLgd.php for FF.
thisspan.style.top=Hy/4+Oy;

if((x>0)&&(x<Hx))
    {if(x>(Hx-100))
        {thisspan.style.posLeft=event.x-100;}
     thisspan.innerHTML=Txt; 
BlueMark.style.left=Ox+x-1;  //Blue mark is a picture, the line is not at beginning
BlueMark.style.top=Oy-2;
    } 
else
    {thisspan.innerHTML='';BlueMark.style.posLeft=Hx+Ox-1;
  
    }
}
function DsplDflt()
{
LMn=LDMn;LMx=LDMx;RMn=RDMn;RMx=RDMx; //yAixs
DsplHRst();  // X-Axis
DsplOptnPrcs();
}
function DsplOptnPrcs()
{var Txt,NameL,NameR;

Txt="<table style='background-color:#6495ed;text-align:center'><tr><td></td><td>Min</td><td>Max</td></tr>"; 

		Txt=Txt+"<tr><td>Y-Left</td><td>";
		Txt=Txt+"<input id='DsplLMn' value='"+Nmbr(LMn)+"' onblur='DsplUpdt(this)' size=2 /></td><td>";
		Txt=Txt+"<input id='DsplLMx' value='"+Nmbr(LMx)+"' onblur='DsplUpdt(this)' size=2 /></td></tr>";
		Txt=Txt+"<tr><td>Y-Right</td><td>";
		Txt=Txt+"<input id='DsplRMn' value='"+Nmbr(RMn)+"' onblur='DsplUpdt(this)' size=2 /></td><td>";
		Txt=Txt+"<input id='DsplRMx' value='"+Nmbr(RMx)+"' onblur='DsplUpdt(this)' size=2 /></td></tr>";

if((ClclPrmt1=='ZT')||(ClclPrmt1=='ZR')||(ClclPrmt1=='ZTx'))
{
Txt=Txt+"<tr><td><i>f</i>:"+Nmbr(FStrt/1)+"~"+Nmbr(FEnd/1)+"</td><td>";
Txt=Txt+"<input id=DsplMinF value='"+Nmbr(FrqnDspl[0])+"' onblur='DsplUpdt(this)' size=2 /></td><td>";
Txt=Txt+"<input id=DsplMaxF value='"+Nmbr(FrqnDspl[1])+"' onblur='DsplUpdt(this)' size=2 /></td></tr><table><br/>";

Txt=Txt+"<input type='button' name='Ok' value='Update'  onclick='ZRfrs(ClclPrmt2)'>  ";
Txt=Txt+"<input type='button' value='Default'  onclick='DsplDflt()'>  ";
Txt=Txt+"<input type='button' name='Close' value='Close'  onclick='ClsDspl()'>";
}
else
{
Txt=Txt+"<tr><td>t:0~"+Nmbr(TmMax)+"</td><td>";
Txt=Txt+"<input id=DsplMinT value='"+Nmbr(TmDspl[0])+"' onblur='DsplUpdt(this)' size=2></td><td>";
Txt=Txt+"<input id=DsplMaxT value='"+Nmbr(TmDspl[1])+"' onblur='DsplUpdt(this)' size=2></td></tr><table><br/>";
Txt=Txt+"<input type='button' name='Ok' value='Update'  onclick='ShwTrns()'>  ";
Txt=Txt+"<input type='button' value='Default'  onclick='DsplDflt()'>  ";
Txt=Txt+"<input type='button' name='Close' value='Close'  onclick='ClsDspl()'>";
}

var thisspan = document.getElementById('DsplOptn');
thisspan.style.left=(Ox+150);
thisspan.style.top=(Oy+100);
thisspan.innerHTML=Txt;
//alert('Ox '+(Ox+150)+'  Oy: ' +Oy);
DsplOptnOn=1;
}
function DsplHRst()
{
TmDspl=new Array();
FrqnDspl=new Array();
//GetFrqn(); frquency may not be available
TmMax=Nf/GFSmplDiv;
//alert("DsplHRst GFCntrDiv="+GFCntrDiv);
TmDspl[0]=0;TmDspl[1]=1/GFCntrDiv*20; //default time shows 20 cycles, unit in us
TRngPrcs();
    FStrt=GFStrtDiv;FEnd=GFEndDiv;
    FCntr=GFCntrDiv; FSmpl=GFSmplDiv;
FrqnDspl[0]=GFStrtDiv;FrqnDspl[1]=GFEndDiv;
FRngPrcs();
UsrLSet=0;UsrRSet=0;
}


function DsplUpdt(x)
{ 
switch(x.id)
        {
  //Update vertical limits
	case 'DsplLMn':
	    if(isNaN(x.value))   {ErrMssg();x.value=Nmbr(LMn);x.focus();return;} 
 		LMn=x.value;UsrLSet=1;		break;
	case 'DsplLMx':
	    if(isNaN(x.value))   {ErrMssg();x.value=Nmbr(LMx);x.focus();return;} 
 		LMx=x.value;UsrLSet=1;		break;
	case 'DsplRMn':
	    if(isNaN(x.value))   {ErrMssg();x.value=Nmbr(RMn);x.focus();return;} 
 		RMn=x.value;UsrRSet=1;		break;
	case 'DsplRMx':
	    if(isNaN(x.value))   {ErrMssg();x.value=Nmbr(RMx);x.focus();return;} 
 		RMx=x.value;UsrRSet=1;		break;   

//update horizontal limits 
    case 'DsplMinF':
        if(!((x.value>=(FStrt*1.0))&&(x.value<(FEnd*1.0))))
            {alert("value should be withing range: "+Nmbr(FStrt)+" ~ "+Nmbr(FEnd));x.value=Nmbr(FrqnDspl[0]*1.01);x.focus();  return;}
       	FrqnDspl[0]=x.value;
		break;
	case 'DsplMaxF':
        if(!((x.value>(FStrt*1.0))&&(x.value<=(FEnd*1.0))))
            {alert("value should be withing range: "+Nmbr(FStrt)+" ~ "+Nmbr(FEnd));x.value=Nmbr(FrqnDspl[1]*0.99);x.focus();  return;}
       FrqnDspl[1]=x.value;
		break;
	case 'DsplMinT':
        if((x.value<0)||(x.value>=(TmMax*1.0)))
            {alert("value should be withing range: 0 ~ "+Nmbr(TmMax));x.value=Nmbr(TmDspl[0]*1.01);x.focus(); return;}
        TmDspl[0]=x.value;
		break;	
	case 'DsplMaxT':
        if((x.value<=0)||(x.value>=(TmMax*1.0)))
            {alert("value should be withing range: 0 ~ "+Nmbr(TmMax));x.value=Nmbr(TmDspl[1]*0.99); x.focus(); return;}
		TmDspl[1]=x.value;
		break;
	}
UsrHSet=1;
}
function DivDspl(x)
{
 
Txt=document.getElementById(x).innerHTML;
myWindow=window.open('','','width=600,height=520');

//This line method doesn't work June 2010
//myWindow.document.getElementById('FG1').innerHTML="<input type='button' name='Prnt2' value='Print2'  onclick='window.print()' ><br/>";

myWindow.document.writeln("<input type='button' name='Prnt' value='Print'  onclick='window.print()' ><br/>");
myWindow.document.write(Txt);
myWindow.document.close();
myWindow.focus();
}

function DivPrnt(x)
{
//alert('DP');
SaveFrame.document.open("text/html","replace"); 
Txt=document.getElementById(x).innerHTML;

//SaveFrame.document.writeln("<input type='button' name='Prnt' value='Print'  onclick='window.print()' ><br/>");
SaveFrame.document.write(Txt);
SaveFrame.document.close();
SaveFrame.focus();
SaveFrame.window.print();

}





function DivWndw(Div)  //Currently is not used
{
alert('wndw');

w1=window.open('','Graph1','width=600,height=400');
var Txt=document.getElementById(Div).innerHTML;
w1.document.write(Txt);

}


function DrwStrn(Str,Clr,RL,TF,YLbl,YLbl2) // two lines of ylabel
{   //TF: T F F2, F2: for spectrum of time domain curve,need frequency label under the time 
    var Y=Str;
    var X=new Array(Y.length);

	jg.setColor(Clr); // red
	var DStrt=1;
	var DEnd=Y.length;

//Prepare horizontal axis---------------------------------
    switch(TF)
        {case 'T':
        if(TmDspl[0]>TmDspl[1])
            {var tmp=TmDspl[0];TmDspl[0]=TmDspl[1];TmDspl[1]=tmp;alert('Start and End Time have been swapped!');
            if(DsplOptnOn==1) //update the display option window if it opens
                {DsplOptnPrcs() }
            }
            DStrt=Math.round(TmDspl[0]*GTmFctr*(FSmpl*GFrqnFctr));DEnd=Math.round(TmDspl[1]*GTmFctr*(FSmpl*GFrqnFctr));
            //Tm
          break;
        case 'F':
           if((FrqnDspl[0]*1.0)>(FrqnDspl[1]*1.0))
            {var tmp=FrqnDspl[0];FrqnDspl[0]=FrqnDspl[1];FrqnDspl[1]=tmp;alert('Start and End Frequency have been swapped!');
            if(DsplOptnOn==1) //update the display option window if it opens
                {DsplOptnPrcs() }
            }
            DStrt=Math.round((FrqnDspl[0]*1-FStrt)/FSmpl*Nf);
            DEnd=Math.round((FrqnDspl[1]*1-FStrt)/FSmpl*Nf); 
    //The frequency data is from Fstrt to FEnd
         break;
        }

//alert(DStrt+' '+DEnd);
   if(DStrt>(Y.length-10))
        {DStrt=Y.length-10;alert('Start value is too big');}

    if(DEnd>(Y.length))
        {DStrt=Y.length;alert('End value is too big');}    
 
    var Tmp=MnMx(Y);
    var MxY,MnY;

// draw the labels
    switch(RL)
        {case 'L':
            if(UsrLSet==0)  //if user hasn't set vertical limit for left axis, set it by default
                {LMx=Tmp[1];LMn=Tmp[0];}
            LDMn=Tmp[0];LDMx=Tmp[1];    
            //alert('LMn '+LMn+' LMx '+LMx);
            if((LMn*1.0)>(LMx*1.0))
                {var x1=LMn;LMn=LMx;LMx=x1;alert('The upper and lower limits of Y-Left axis have been swapped!');
                if(DsplOptnOn==1) //update the display option window if it opens
                    {DsplOptnPrcs() }   
                }
            Lbls=Lbl(LMn,LMx);  //get lables
            MnY=Lbls[0];MxY=Lbls[Lbls.length-1];
            var YTckLngt=5;
            var YTckNmbr=Lbls.length-2;
            for (var i=1;i<=YTckNmbr;i=i+1)
                {
                //jg.drawLine(Ox-YTckLngt,Hy-i*Hy/YTckNmbr+Oy, Ox,Hy-i*Hy/YTckNmbr+Oy);
                jg.drawLine(Ox-YTckLngt,Hy-(Lbls[i]-MnY)/(MxY-MnY)*Hy+Oy, Ox,Hy-(Lbls[i]-MnY)/(MxY-MnY)*Hy+Oy);
               //  var Tmp=((MxY-MnY)/YTckNmbr*i+MnY*1.0);
                  jg.drawString(Nmbr(Lbls[i]),Ox-53,Hy-(Lbls[i]-MnY)/(MxY-MnY)*Hy+Oy);
                }
            jg.drawString(YLbl,Ox-40,Oy-30);jg.drawString(YLbl2,Ox-40,Oy-15);
            jg.drawLine(Ox,Oy, Ox,Hy+Oy);
            break;
        case 'R':
            RDMn=Tmp[0];RDMx=Tmp[1];
            if(UsrRSet==0)  //if user hasn't set vertical limit for left axis, set it by default
                {RMx=Tmp[1];RMn=Tmp[0];}
            if((RMn*1.0)>(RMx*1.0))
                {var x1=RMn;RMn=RMx;RMx=x1;alert('The upper and lower limits of Y-Right axis have been swapped!');
                if(DsplOptnOn==1) //update the display option window if it opens
                    {DsplOptnPrcs() }  
                }
            Lbls=Lbl(RMn,RMx);  //get lables
            MnY=Lbls[0];MxY=Lbls[Lbls.length-1];
            var YTckNmbr=Lbls.length-2;;
            var YTckLngt=5;
            for (var i=1;i<=YTckNmbr;i=i+1)
                {jg.drawLine(Ox+Hx,Hy-(Lbls[i]-MnY)/(MxY-MnY)*Hy+Oy, Ox+Hx+YTckLngt,Hy-(Lbls[i]-MnY)/(MxY-MnY)*Hy+Oy);
                //var Tmp=((MxY-MnY)/YTckNmbr*i+MnY*1.0);
                jg.drawString(Nmbr(Lbls[i]),Ox+Hx+5,Hy-(Lbls[i]-MnY)/(MxY-MnY)*Hy+Oy);
                }
            jg.drawString(YLbl,Ox+Hx,Oy-30); jg.drawString(YLbl2,Ox+Hx,Oy-15);
		jg.drawLine(Ox+Hx,Oy, Ox+Hx,Hy+Oy);

            break;
        }

//Draw horizontal axis
            var XTckLngt=5;
            if(TF=='T')
                {
                        Lbls=Lbl(TmDspl[0],TmDspl[1]);
                        var XTckNmbr=Lbls.length-2;
                        for (var i=1;i<=XTckNmbr;i=i+1)
                            {
                            var LblX=Ox+(Lbls[i]-TmDspl[0])/(TmDspl[1]-TmDspl[0])*Hx;
                            jg.drawLine(LblX,Hy+Oy,LblX,Hy+Oy+XTckLngt);
                            jg.drawString(Nmbr(Lbls[i]),LblX,Hy+Oy);
                            }
                        jg.drawString('Time: '+GTmUnit,Ox+0.4*Hx,Hy+Oy+15);
                        jg.drawLine(Ox,Hy+Oy, Ox+Hx,Hy+Oy);
                }
            else    //in frequency  labels
                {
                if((TF=='F')||(TF=='F2'))  //for phase, imaginary, TF=''
                    {
                        Lbls=Lbl(FrqnDspl[0],FrqnDspl[1]);
                        var F2Offs=0;
                        if(TF=='F2') F2Offs=35; //frequency label is under the time lables
                        var XTckNmbr=Lbls.length-2;
                                for (var i=1;i<=XTckNmbr;i=i+1)
                                    {
                                    var LblX=Ox+(Lbls[i]-FrqnDspl[0])/(FrqnDspl[1]-FrqnDspl[0])*Hx;
                                    jg.drawLine(LblX,Hy+Oy+F2Offs,LblX,Hy+Oy+XTckLngt+F2Offs);
                                    jg.drawString(Nmbr(Lbls[i]),LblX,Hy+Oy+F2Offs);
                                    }
                        jg.drawLine(Ox,Hy+Oy+F2Offs, Ox+Hx,Hy+Oy+F2Offs);                            
                        jg.drawString('Frequency: '+GFrqnUnit,Ox+0.4*Hx,Hy+Oy+F2Offs+15);
                    }
               }

 //Draw the curves
    var DltX=Hx/(DEnd-DStrt);
    var x1=Ox;
    var y1=(1-(Y[DStrt]-MnY)/(MxY-MnY+1e-12))*Hy+Oy;

    for (var i=DStrt;i<DEnd;i=i+1)      // draw the curve
        {var x2=Math.round(Ox+DltX*(i-DStrt));
        y2=Math.round((1-(Y[i]-MnY)/(MxY-MnY+1e-12))*Hy+Oy);
        if((y1<=(Oy+Hy))&&(y1>=Oy)&&(y2<=(Oy+Hy))&&(y2>=Oy))  //only draw if it is within the div
            {jg.drawLine(x1, y1, x2, y2);}
        x1=x2;y1=y2;
        }

 jg.drawString(GrphTtl,Ox+Hx/4,Oy-15);
    jg.paint();
 
}
function FRngPrcs()  //find Frequency range 
{
var k1=1e3; //default fime unit is MHz
var k=k1;
var FrqnUnits=['MHz','kHz','Hz'];
GFrqnUnit='GHz';
for(var i=0;i<FrqnUnits.length;i=i+1)
    {
    if(FrqnDspl[1]<k1)    //TmDspl[1] is the default maximal time in ns
        {k1=k1/1000;k=k1;GFrqnUnit=FrqnUnits[i];}
    }    
FrqnDspl[1]=Nmbr(FrqnDspl[1]/k);
FrqnDspl[0]=Nmbr(FrqnDspl[0]/k);
GFrqnFctr=k;
FStrt=Nmbr(FStrt/k);
FCntr=Nmbr(FCntr/k);FEnd=Nmbr(FEnd/k);FSmpl=FSmpl/k;

}
function GetFrqn()   // the freqeuncy information is require for calculation
{   //called by TrnsLgd.php, ScMssgWndw() in TrnLgd.js response to freqeuncy box update
    GFStrtDiv=document.getElementById("Strt").value;
    GFEndDiv=document.getElementById("End").value;
    GFCntrDiv=document.getElementById("Cntr").value;
    GFSmplDiv=(GFEndDiv-GFStrtDiv)*4;
    FStrt=GFStrtDiv;FEnd=GFEndDiv;
    FCntr=GFCntrDiv; FSmpl=GFSmplDiv;
}
function GrphIntt()
{

var cnv = document.getElementById("DivGrph");
 jg = new jsGraphics(cnv);   
jg.setPrintable(true); 
  Ox=DivGrph.offsetLeft+TblGrph.offsetLeft+TdGrph.offsetLeft+FldsGrph.offsetLeft+55;
  //alert("TblBdy.offsetLeft="+TblBdy.offsetLeft+" TblGrph.offsetLef="+TblGrph.offsetLeft)
 // Hx=DivGrph.style.width.replace('%','')/100*screen.availWidth-110;
 //alert('width='+document.getElementByID("DivGrph").style);
 //Hx=document.getElementByID("DivGrph").style.width;
 Hx=DivGrph.style.width.replace('px','')-110;
  Oy=DivGrph.offsetTop+TblGrph.offsetTop+TdGrph.offsetTop+FldsGrph.offsetTop+40;
  Hy=DivGrph.style.height.replace('px','')-100;
 //  alert("GrphIntt Hx="+Hx+' Hy='+Hy);
  jg.paint();
}

function DrwTest()  
{
    jg.drawLine(170, 150, 180, 180);
    jg.paint();
}




function ImpdData()     //get impedance data from KlmTrns.php
{if (xmlHttp.readyState==4)
 {
//alert("ImpdData <br/> "+xmlHttp.responseText);
// return;
 var Str=xmlHttp.responseText.split('#');      //real and imaginary seperated by #

//document.getElementById("DivGnrlMssg").innerHTML=xmlHttp.responseText;

   var tmp=Str[0];
   ZR=tmp.split(' '); tmp=Str[1];ZI=tmp.split(' ');
   ZZ=new Array(ZI.length);ZA=new Array(ZI.length);
   for (var i=0;i<ZR.length;i=i+1)
        {ZZ[i]=Math.sqrt(ZR[i]*ZR[i]+ZI[i]*ZI[i]);
         ZA[i]=Math.atan(ZI[i]/(ZR[i]))*180/3.1415926;     
        }
  GrphLUnit="&#937";
  if(ClclPrmt1=='ZR')
    { GrphLUnit="MRayl";}
  RngFnd('ZZ'); //ZZ are global, only need pass the name;

//alert('K  ' +GrphLUnit);
  ZRfrs(ClclPrmt2);
    ShwMtch(); //send content to Statistical window
  Str="<select id='ZRfrs' onchange='ZRfrs(this.value)'>";
    if(ClclPrmt2=='ZTht')
        { Str+="<option value='ZTht' selected>Z-theta</option><option value='RI'>Real-Imag</option></select>";}
    else
        { Str+="<option value='ZTht'>Z-theta</option><option value='RI' selected>Real-Imag</option></select>";}
        
document.getElementById("DivGrphCntr").innerHTML=Str;

 }

}
function TermChck()
{ xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
      { alert("Your browser does not support AJAX!");    return; } 
    MssgWndw='DivGnrlMssg';
    xmlHttp.onreadystatechange=UpdtDiv;
    var url="TermCnsn.php";    //term consent
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
}

function RngFnd(Name)
{       var k1=1e12;
        var k=k1;
        var UntPres=['G','M','k','','m','&#956','n','p'];
        var UntPre='kG';
switch(Name)
    {case 'ZZ':
        ZDspl=MnMx(ZZ);
        var MxAbs=Math.abs(ZDspl[1])
        if(MxAbs<Math.abs(ZDspl[0]))
            { MxAbs=Math.abs(ZDspl[0])}
        for(var i=0;i<UntPres.length;i=i+1)
            {
            if(MxAbs<k1)
                {k1=k1/1000;k=k1;UntPre=UntPres[i];}
            }             
        for (var i=0;i<ZZ.length;i=i+1)
            {ZZ[i]=ZZ[i]/k;ZR[i]=ZR[i]/k;ZI[i]=ZI[i]/k; }

       break;
    case 'VT':
          TDspl=MnMx(VT);
          var MxAbs=Math.abs(TDspl[1])
          if(MxAbs<Math.abs(TDspl[0]))
            { MxAbs=Math.abs(TDspl[0])}
          for(var i=0;i<UntPres.length;i=i+1)
            {
            if(MxAbs<k1)
                {k1=k1/1000;k=k1;UntPre=UntPres[i];}
            }       
        for (var i=0;i<VT.length;i=i+1)
            {VT[i]=VT[i]/k;}

       break;
    }
GrphLUnit=UntPre+GrphLUnit;    
//return k;
}

function SaveVarAsFile()
{   var ClclPrmt = document.getElementById("SlctClcl");
 
  SaveFrame.contentWindow.open("text/html","replace") 
  SaveFrame.document.write(GrphDataSave) 
  SaveFrame.document.close() 
  SaveFrame.focus() 
  SaveFrame.document.execCommand('SaveAs',false,Flnm) 
} 
function ShwMtch()
{   var Indx=Math.round((FCntr-FStrt)*Nf/FSmpl);
    var Txt="<table border='1'><caption>Impedance: ";
    Txt+="At "+ Nmbr(FCntr) +GFrqnUnit+"</caption>";
    Txt+="<tr><th>|Z|</th><th> &#952</th><th>Real</th><th>Imaginary</th><tr>";
    Txt+="<tr><td>"+Nmbr(ZZ[Indx])+GrphLUnit+"</td><td>";
	Txt+=Nmbr(ZA[Indx])+"&deg</td><td>"+Nmbr(ZR[Indx])+GrphLUnit+"</td><td>"+Nmbr(ZI[Indx])+GrphLUnit+"</td></tr></table>";
    Txt+="<div id='DivMtchClcl'></div>";
document.getElementById("DivStts").innerHTML=Txt;
ShwDivMtchClcl();
}
function ShwDivMtchClcl()
{   xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
      { alert("Your browser does not support AJAX!");    return; } 
    MssgWndw='DivMtchClcl';
    xmlHttp.onreadystatechange=UpdtDiv;
    var url="DivMtchClclCntr.php";    
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
}

function SlctMtchClcl(x) //response to the impedance match type selection
                        // called in DivMtchClclCntr.php
{   xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
      { alert("Your browser does not support AJAX!");    return; } 
    xmlHttp.onreadystatechange=UpdtDiv;
    var url="DivMtchClcl.php";   
    url=url+"?DP="+x.id; //distal or proximal
    url=url+"&Typ="+x.value; // single inductor, L-shape
    MssgWndw='EMRcmnD'; // default is distal 
    if(x.id=='SlctMtchClclP')
        {    MssgWndw='EMRcmnP';}
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
}

function ScAddMtch()
{if (xmlHttp.readyState==4)
    {
    document.getElementById(MssgWndw).innerHTML=xmlHttp.responseText;
//	if(MssgWndw=='EMRcmnP')
        RLDivEMPrxm();  // RLDivEMDstl() wil be called in the response to RLDivEMPrxm(), in TrnsLgd.js
//    else 
  //      {RLDivEMDstl();}
    }
 }

function TmData()
{if (xmlHttp.readyState==4)
     {
    //document.getElementById("DivGnrlMssg").innerHTML=xmlHttp.responseText;
    var Str=xmlHttp.responseText.split('#');     
    VT=Str[0].split(' ');VF=Str[1].split(' ');
    GrphRUnit="dB";
    RngFnd('VT'); //ZZ are global, only need pass the name;

    GrphDataSave="Time: us	Amplitude:"+GrphLUnit+"<br/>";
    for (var i=0;i<VT.length;i=i+1)
        {GrphDataSave+=((i+1)/FSmpl)+' '+VT[i]+'<br/>';}  // time unit is us
    ShwTrns()
     }
}
function ShwTrns()
{
    GrphDataL=VT;GrphXL='T';GrphDataR=VF,GrphXR='F';
    GrphDataTyp='TF';  
    Clr();
    DrwStrn(VT,'#FF0000','L','T','Amplitude',GrphLUnit);
    DrwStrn(VF,'#0000FF','R','F2','Spectrum',GrphRUnit);
    document.getElementById("DivGrphCntr").innerHTML=' ';
    GrphDrwd=1; //graph is Drawn.
    ShwStts();
    
}

function ShwStts()
{

var MxY=VF[0]*1.0;MxI=0;
    var MnY=VF[0]*1.0;MnI=0;
	// find the Maximal of the curve
    for (var i=1;i<VF.length;i=i+1)
        {if((VF[i]*1.0)>MxY)
            {MxY=VF[i];MxI=i;}
            if(VF[i]*1.0<MnY)
            {MnY=VF[i];MnI=i;}
        }
//Find B3- 20;

B3L=MxI;B3H=MxI;B6L=MxI;B6H=MxI;B12L=MxI;B12H=MxI;B20L=MxI;B20H=MxI;

for (var i=MxI;i<VF.length;i=i+1)
{if(VF[i]>(MxY-3))
	{B3H=i;}
if(VF[i]>(MxY-6))
	{B6H=i;}
if(VF[i]>(MxY-12))
	{B12H=i;}
if(VF[i]>(MxY-20))
	{B20H=i;}
}

for (var i=MxI;i>0;i=i-1)
{if(VF[i]>(MxY-3))
	{B3L=i;}
if(VF[i]>(MxY-6))
	{B6L=i;}
if(VF[i]>(MxY-12))
	{B12L=i;}
if(VF[i]>(MxY-20))
	{B20L=i;}
}

//calculate center frequence and bandwidth 
//FStrt=document.getElementById("Strt").value;
FStrt=FStrt*1.0;   //force to a number
F3=(B3H+B3L)/2*FSmpl/Nf+FStrt; B3=(B3H-B3L)*FSmpl/Nf/(F3*1.0+1e-3)*100;
//alert("ShwStts F3="+F3+ "FSmpl="+FSmpl+" FStrt="+FStrt +"B3H="+B3H+" B3L=" +B3L);
B3=Nmbr(B3);F3=Nmbr(F3);
F6=(B6H+B6L)/2*FSmpl/Nf+FStrt;B6=(B6H-B6L)*FSmpl/Nf/(F6*1.0+1e-3)*100;B6=Nmbr(B6);F6=Nmbr(F6);
F12=(B12H+B12L)/2*FSmpl/Nf+FStrt;B12=(B12H-B12L)*FSmpl/Nf/(F12*1.0+1e-3)*100;B12=Nmbr(B12);F12=Nmbr(F12);
F20=(B20H+B20L)/2*FSmpl/Nf+FStrt;B20=(B20H-B20L)*FSmpl/Nf/(F20*1.0+1e-3)*100;B20=Nmbr(B20);F20=Nmbr(F20);
//output the statistic parameter in a table
var Txt="<table border='1' ><caption>Center Frequency & Bandwidth </h3></caption>";
Txt=Txt+"<tr><th>dB Level</th><th>Center Freq("+GFrqnUnit+")</th><th>Bandwidth(%)</th></tr>";
Txt=Txt+"<tr><td>-3</td><td>"+F3+"</td><td>"+B3+"</td></tr>";
Txt=Txt+"<tr><td>-6</td><td>"+F6+"</td><td>"+B6+"</td></tr>";
Txt=Txt+"<tr><td>-12</td><td>"+F12+"</td><td>"+B12+"</td></tr>";
Txt=Txt+"<tr><td>-20</td><td>"+F20+"</td><td>"+B20+"</td></tr>";
Txt=Txt+"</table>"; 
//Txt=Txt+"MxY "+MxY+" MxI "+MxI+" BH"+B3H+" BL "+B3L;  //Debug: check variables


document.getElementById("DivStts").innerHTML=Txt;

}
function TRngPrcs()  //find time range of Y(2D), and MnY, MxY
{
var k1=1e6; //default fime unit is us
var k=k1;
var TmUnits=['ms','&#956s','ns','ps'];
GTmUnit='s';
for(var i=0;i<TmUnits.length;i=i+1)
    {
    if(TmDspl[1]<k1)    //TmDspl[1] is the default maximal time in ns
        {k1=k1/1000;k=k1;GTmUnit=TmUnits[i];}
    }    
TmDspl[1]=TmDspl[1]/k;
GTmFctr=k;
TmMax=TmMax/k;
//alert("TmDspl[1]="+TmDspl[1]+" GTmUnit="+GTmUnit);
}


function ClsDspl()
{
var thisspan = document.getElementById('DsplOptn');
thisspan.innerHTML='';
DsplOptnOn=0;
}


function Clr()
{
  jg.clear();
}
function UpdtDiv()
{if (xmlHttp.readyState==4)
    {
    document.getElementById(MssgWndw).innerHTML=xmlHttp.responseText;
    }
 }
function ZRfrs(x)
{
 //FStrt=document.getElementById("Strt").value;var FEnd=document.getElementById("End").value;
 FGStrt=FStrt;
    GrphDataTyp=x;ClclPrmt2=x;
  switch(ClclPrmt2)
        {case 'ZTht':
            GrphDataL=ZZ;GrphXL='F';GrphDataR=ZA;GrphXR='F';
            Clr();   
            GrphRUnit='Deg'; 
            DrwStrn(ZZ,'#FF0000','L','F','','|Z|: '+GrphLUnit);DrwStrn(ZA,'#0000FF','R','F','','&#952:Deg');
            
            FGStp=(FEnd-FStrt)/ZZ.length;
            GrphDataSave="Frequency(MHz),   Impedance:"+GrphLUnit+",  Angle(degree)\r\n";           
            for (var i=0;i<ZZ.length;i=i+1)
                {GrphDataSave+=(FGStrt*1.0+FGStp*i)+', '+ZZ[i]+', '+ZA[i]+'\r\n';}
            break;
        case 'RI':   
          GrphDataL=ZR;GrphXL='F';GrphDataR=ZI;GrphXR='F';
            GrphRUnit=GrphLUnit
            Clr();DrwStrn(ZR,'#FF0000','L','F','Real',GrphLUnit);DrwStrn(ZI,'#0000FF','R','F','Imag',GrphRUnit);
            FGStp=(FEnd-FStrt)/ZR.length;
            GrphDataSave="Frequency(MHz),           Real:"+GrphLUnit+",          Imaginary"+ GrphLUnit+"<br/>";           
            for (var i=0;i<ZR.length;i=i+1)
                {GrphDataSave+=(FGStrt*1.0+FGStp*i)+', '+ZI[i]+', '+ZA[i]+'<br/>';}
            break;
         }
         GrphDrwd=1; //graph is Drawn.
}

