OSErr GridCurrentMoverSettingsInit(DialogPtr dialog, VOIDPTR data)
{
	char curStr[64], blankStr[32];
	strcpy(blankStr,"");
	
	RegisterPopTable (GridCurrentMoverPopTable, sizeof (GridCurrentMoverPopTable) / sizeof (PopInfoRec));
	RegisterPopUpDialog(M33, dialog);
	
	SetDialogItemHandle(dialog, M33HILITEDEFAULT, (Handle)FrameDefault);
	SetDialogItemHandle(dialog, M33UNCERTAINTYBOX, (Handle)FrameEmbossed);
	
	mysetitext(dialog, M33NAME, sGridCurrentDialogMover->timeGrid->fVar.userName); // use short file name for now
	SetButton(dialog, M33ACTIVE, sGridCurrentDialogMover->bActive);
	
	if (sGridCurrentDialogMover->timeGrid->fTimeShift == 0) SetPopSelection (dialog, M33TIMEZONEPOPUP, 1);
	else SetPopSelection (dialog, M33TIMEZONEPOPUP, 2);
	//Long2EditText(dialog, M33TIMESHIFT, (long) (-1.*sGridCurrentDialogMover->fTimeShift/3600.));
	Float2EditText(dialog, M33TIMESHIFT, (float)(sGridCurrentDialogMover->timeGrid->fTimeShift)/3600.,1);
	
	SetButton(dialog, M33SHOWARROWS, sGridCurrentDialogMover->bShowArrows);
	Float2EditText(dialog, M33ARROWSCALE, sGridCurrentDialogMover->fArrowScale, 6);
	Float2EditText(dialog, M33ARROWDEPTH, sGridCurrentDialogMover->fArrowDepth, 6);
	
	ShowHideDialogItem(dialog, M33MINCURRENTLABEL, false); 
	ShowHideDialogItem(dialog, M33MINCURRENT, false); 
	ShowHideDialogItem(dialog, M33MINCURRENTUNITS, false); 
	
	//ShowHideDialogItem(dialog, M33SCALE, false); 
	//ShowHideDialogItem(dialog, M33SCALELABEL, false); 
	
	//ShowHideDialogItem(dialog, M33ARROWDEPTHAT, sGridCurrentDialogMover->fNumDepthLevels > 1); 
	//ShowHideDialogItem(dialog, M33ARROWDEPTH, sGridCurrentDialogMover->fNumDepthLevels > 1 && sGridCurrentDialogMover->fVar.arrowDepth >= 0); 
	//ShowHideDialogItem(dialog, M33ARROWDEPTHUNITS, sGridCurrentDialogMover->fNumDepthLevels > 1 && sGridCurrentDialogMover->fVar.arrowDepth >= 0); 
	
	if (!gNoaaVersion)
		ShowHideDialogItem(dialog, M33REPLACEMOVER, false);	// code goes here, eventually allow this for outside
	
	SetButton(dialog, M33EXTRAPOLATECHECKBOX, sGridCurrentDialogMover->timeGrid->fAllowExtrapolationInTime);
	//SetButton(dialog, M33EXTRAPOLATEVERTCHECKBOX, ((TimeGridVelRect*) (sGridCurrentDialogMover->timeGrid))->fAllowVerticalExtrapolationOfCurrents);
	SetButton(dialog, M33EXTRAPOLATEVERTCHECKBOX, sGridCurrentDialogMover->timeGrid->fAllowVerticalExtrapolationOfCurrents);
	SetButton(dialog, M33VELOCITYATBOTTOMCHECKBOX, sGridCurrentDialogMover->fArrowDepth < 0);
	
	//ShowHideDialogItem(dialog, M33VELOCITYATBOTTOMCHECKBOX, sGridCurrentDialogMover->fNumDepthLevels > 1); 
	
	//Float2EditText(dialog, M33SCALE, sGridCurrentDialogMover->timeGrid->fVar.fileScaleFactor, 6);
	Float2EditText(dialog, M33SCALE, sGridCurrentDialogMover->fCurScale, 6);
	if(sGridCurrentDialogMover->fUncertainParams.alongCurUncertainty == 0) 
	{	// assume if one is not set, none are
		mysetitext(dialog, M33ALONG, blankStr); // force user to set uncertainty
		mysetitext(dialog, M33CROSS, blankStr); // force user to set uncertainty
		mysetitext(dialog, M33STARTTIME, blankStr); // force user to set
		mysetitext(dialog, M33DURATION, blankStr); // force user to set 
	}
	else
	{
		Float2EditText(dialog, M33ALONG, sGridCurrentDialogMover->fUncertainParams.alongCurUncertainty*100, 6);
		Float2EditText(dialog, M33CROSS, sGridCurrentDialogMover->fUncertainParams.crossCurUncertainty*100, 6);
		Float2EditText(dialog, M33STARTTIME, sGridCurrentDialogMover->fUncertainParams.startTimeInHrs, 6);
		Float2EditText(dialog, M33DURATION, sGridCurrentDialogMover->fUncertainParams.durationInHrs, 6);
	}
	
	Float2EditText(dialog, M33EXTRAPOLATETOVALUE, ((TimeGridVelRect*) (sGridCurrentDialogMover->timeGrid))->fMaxDepthForExtrapolation, 6);
	
	ShowHideVerticalExtrapolationDialogItems2(dialog);
	ShowGridCurrentMoverDialogItems(dialog);
	if (sGridCurrentDialogMover->timeGrid->fTimeShift == 0) MySelectDialogItemText(dialog, M33ALONG, 0, 100);
	else MySelectDialogItemText(dialog, M33TIMESHIFT, 0, 100);
	
	//ShowHideDialogItem(dialog, M33EXTRAPOLATEVERTCHECKBOX, sNetCDFDialogMover->fVar.gridType==TWO_D); 	// if current already has 3D info don't confuse with extrapolation option
	if (!gNoaaVersion) ShowHideDialogItem(dialog, M33EXTRAPOLATEVERTCHECKBOX, false); 	// for now hide until decide how to handle 3D currents...
	
	return 0;
}
short GridCurrentMoverSettingsClick(DialogPtr dialog, short itemNum, long lParam, VOIDPTR data)
{
	long menuID_menuItem;
	switch (itemNum) {
		case M33OK:
		{
			char errmsg[256];
			short timeZone = GetPopSelection(dialog, M33TIMEZONEPOPUP);
			Seconds timeShift = sGridCurrentDialogMover->timeGrid->fTimeShift;
			float arrowDepth = EditText2Float(dialog, M33ARROWDEPTH), maxDepth=0;
			float maxDepthForExtrapolation = EditText2Float(dialog, M33EXTRAPOLATETOVALUE);
			double tempAlong, tempCross, tempDuration, tempStart;
			long timeShiftInHrs;
			Boolean extrapolateVertically = GetButton(dialog, M33EXTRAPOLATEVERTCHECKBOX);
			//Boolean extrapolateVertically = false;
			Boolean showBottomVel = GetButton(dialog, M33VELOCITYATBOTTOMCHECKBOX);
			TMap *map = sGridCurrentDialogMover -> GetMoverMap();
			
			if (showBottomVel) arrowDepth = -2;	//check maxDepth>0
			if (map)
			{
				maxDepth = map -> GetMaxDepth2();	// 2D vs 3D ?
				//arrowDepth = EditText2Float(dialog, M33ARROWDEPTH);
				if (arrowDepth > maxDepth)
				{
					char errStr[64];
					sprintf(errStr,"The maximum depth of the region is %g meters.",maxDepth);
					printError(errStr);
					break;
				}
			}
			else
			{	// only need this if doing something 3D
				maxDepth = ((TimeGridVelRect*) (sGridCurrentDialogMover -> timeGrid)) -> GetMaxDepth();
				//maxDepth = 1000;
				if (arrowDepth > maxDepth)
				{
					char errStr[64];
					sprintf(errStr,"The maximum depth of the region is %g meters.",maxDepth);
					printError(errStr);
					break;
				}
			}
			
			strcpy(errmsg,"");
			tempAlong = EditText2Float(dialog, M33ALONG);
			tempCross = EditText2Float(dialog, M33CROSS);
			tempDuration = EditText2Float(dialog, M33DURATION);
			tempStart = EditText2Float(dialog, M33STARTTIME);
			if(tempAlong <= 0 || tempCross <= 0) strcpy(errmsg,"The uncertainty must be greater than zero.");	
			else if(tempAlong > 100 || tempCross > 100)	strcpy(errmsg,"The uncertainty cannot exceed 100%.");
			
			if(errmsg[0])
			{
				printError(errmsg);
				if (tempAlong <= 0 || (tempAlong > 100 && tempCross > 0)) MySelectDialogItemText(dialog, M33ALONG,0,100);
				else MySelectDialogItemText(dialog, M33CROSS,0,100);
				break;
			}
			
			if(tempDuration < 1) strcpy(errmsg,"The uncertainty duration must be at least 1 hour.");	// maximum?
			if(errmsg[0])
			{
				printError(errmsg);
				MySelectDialogItemText(dialog, M33DURATION,0,100);
				break;
			}
			
			timeShiftInHrs = EditText2Long(dialog, M33TIMESHIFT);
			if (timeShiftInHrs < -12 || timeShiftInHrs > 14)	// what should limits be?
			{
				printError("Time offsets must be in the range -12 : 14");
				MySelectDialogItemText(dialog, M33TIMESHIFT,0,100);
				break;
			}
			
			if (extrapolateVertically)
			{
				if (maxDepthForExtrapolation==0)
				{
					if (maxDepth>0) 
						sprintf(errmsg,"Either set a max depth for extrapolation or turn off option. The maximum depth of the region is %g meters.",maxDepth);
					else
						sprintf(errmsg,"Either set a max depth for extrapolation or turn off option");
					printNote(errmsg);
					break;
				}
				if (maxDepth>0 && maxDepthForExtrapolation>maxDepth)
				{
					sprintf(errmsg,"The maximum depth of the region is %g meters.",maxDepth);
					printNote(errmsg);
					break;
				}
			}
			mygetitext(dialog, M33NAME, sGridCurrentDialogMover->timeGrid->fVar.userName, kPtCurUserNameLen-1);
			sGridCurrentDialogMover->bActive = GetButton(dialog, M33ACTIVE);
			sGridCurrentDialogMover->fVar.bShowArrows = GetButton(dialog, M33SHOWARROWS);
			sGridCurrentDialogMover->fVar.arrowScale = EditText2Float(dialog, M33ARROWSCALE);
			sGridCurrentDialogMover->fVar.arrowDepth = arrowDepth;
			//sGridCurrentDialogMover->timeGrid->fVar.fileScaleFactor = EditText2Float(dialog, M33SCALE);
			sGridCurrentDialogMover->fVar.curScale = EditText2Float(dialog, M33SCALE);
			
			if (sGridCurrentDialogMover->fVar.alongCurUncertainty != tempAlong || sGridCurrentDialogMover->fVar.crossCurUncertainty != tempCross
				|| sGridCurrentDialogMover->fVar.startTimeInHrs != tempStart || sGridCurrentDialogMover->fVar.durationInHrs != tempDuration)
				sDialogUncertaintyChanged2 = true;
			sGridCurrentDialogMover->fVar.alongCurUncertainty = EditText2Float(dialog, M33ALONG)/100;
			sGridCurrentDialogMover->fVar.crossCurUncertainty = EditText2Float(dialog, M33CROSS)/100;
			//sNetCDFDialogMover->fVar.uncertMinimumInMPS = EditText2Float(dialog, M33MINCURRENT);
			sGridCurrentDialogMover->fVar.startTimeInHrs = EditText2Float(dialog, M33STARTTIME);
			sGridCurrentDialogMover->fVar.durationInHrs = EditText2Float(dialog, M33DURATION);
			
			sGridCurrentDialogMover->fDownCurUncertainty = -sGridCurrentDialogMover->fVar.alongCurUncertainty; 
			sGridCurrentDialogMover->fUpCurUncertainty = sGridCurrentDialogMover->fVar.alongCurUncertainty; 	
			sGridCurrentDialogMover->fRightCurUncertainty = sGridCurrentDialogMover->fVar.crossCurUncertainty;  
			sGridCurrentDialogMover->fLeftCurUncertainty = -sGridCurrentDialogMover->fVar.crossCurUncertainty; 
			sGridCurrentDialogMover->fDuration = sGridCurrentDialogMover->fVar.durationInHrs * 3600.;  
			sGridCurrentDialogMover->fUncertainStartTime = (long) (sGridCurrentDialogMover->fVar.startTimeInHrs * 3600.); 
			//if (timeZone>1) sNetCDFDialogMover->fTimeShift = EditText2Long(dialog, M33TIMESHIFT)*3600*-1;
			if (timeZone>1) sGridCurrentDialogMover->timeGrid->fTimeShift =(long)( EditText2Float(dialog, M33TIMESHIFT)*3600);
			else sGridCurrentDialogMover->timeGrid->fTimeShift = 0;	// file is in local time
			
			//if (model->GetStartTime() != startTime || model->GetModelTime()!=model->GetStartTime())
			// code goes here, should also check if start time has been shifted correctly already (if there is another current)
			//if (timeShift != sNetCDFDialogMover->fTimeShift || sNetCDFDialogMover->GetTimeValue(0) != model->GetStartTime())
			// GetTImeValue adds in the time shift
			// What if time zone hasn't changed but start time has from loading in a different file??
			if ((timeShift != sGridCurrentDialogMover->timeGrid->fTimeShift && sGridCurrentDialogMover->timeGrid->GetTimeValue(0) != model->GetStartTime()))
			{
				//model->SetModelTime(model->GetModelTime() - (sNetCDFDialogMover->fTimeShift-timeShift));
				if (model->GetStartTime() + sGridCurrentDialogMover->timeGrid->fTimeShift - timeShift == sGridCurrentDialogMover->timeGrid->GetTimeValue(0))
					model->SetStartTime(model->GetStartTime() + (sGridCurrentDialogMover->timeGrid->fTimeShift-timeShift));
				//model->SetStartTime(sNetCDFDialogMover->GetTimeValue(0));	// just in case a different file has been loaded in the meantime, but what if user doesn't want start time to change???
				//sNetCDFDialogMover->SetInterval(errmsg);
				model->NewDirtNotification(DIRTY_RUNBAR); // must reset the runbar
			}
			sGridCurrentDialogMover->timeGrid->fAllowExtrapolationInTime = GetButton(dialog, M33EXTRAPOLATECHECKBOX);
			((TimeGridVelRect*) (sGridCurrentDialogMover->timeGrid))->fAllowVerticalExtrapolationOfCurrents = GetButton(dialog, M33EXTRAPOLATEVERTCHECKBOX);
			// code goes here, add box to dialog to input desired depth to extrapolate to 
			if (((TimeGridVelRect*) (sGridCurrentDialogMover->timeGrid))-> fAllowVerticalExtrapolationOfCurrents) ((TimeGridVelRect*) (sGridCurrentDialogMover->timeGrid))->fMaxDepthForExtrapolation = EditText2Float(dialog, M33EXTRAPOLATETOVALUE); 
			else ((TimeGridVelRect*) (sGridCurrentDialogMover->timeGrid))->fMaxDepthForExtrapolation = 0.;
			
			return M33OK;
		}
			
		case M33CANCEL: 
			return M33CANCEL;
			
		case M33ACTIVE:
		case M33SHOWARROWS:
		case M33EXTRAPOLATECHECKBOX:
			ToggleButton(dialog, itemNum);
			break;
			
		case M33VELOCITYATBOTTOMCHECKBOX:	// code goes here, showhide the M33ARROWDEPTH, M33ARROWDEPTHUNITS
			ToggleButton(dialog, itemNum);
			ShowHideVerticalExtrapolationDialogItems2(dialog);
			if (!GetButton(dialog,M33VELOCITYATBOTTOMCHECKBOX))
			Float2EditText(dialog, M33ARROWDEPTH, 0, 6);
			break;
			
		case M33EXTRAPOLATEVERTCHECKBOX:
			ToggleButton(dialog, itemNum);
			ShowHideVerticalExtrapolationDialogItems2(dialog);
			break;
			
		case M33ARROWSCALE:
		case M33ARROWDEPTH:
			//case M33SCALE:
		case M33ALONG:
		case M33CROSS:
			//case M33MINCURRENT:
		case M33STARTTIME:
		case M33DURATION:
			//case M33TIMESHIFT:
		case M33EXTRAPOLATETOVALUE:
			CheckNumberTextItem(dialog, itemNum, TRUE);
			break;
		case M33SCALE:
		case M33TIMESHIFT:
			CheckNumberTextItemAllowingNegative(dialog, itemNum, TRUE);	// decide whether to allow half hours
			break;
			
		case M33TIMEZONEPOPUP:
			PopClick(dialog, itemNum, &menuID_menuItem);
			ShowGridCurrentMoverDialogItems(dialog);
			if (GetPopSelection(dialog, M33TIMEZONEPOPUP) == 2) MySelectDialogItemText(dialog, M33TIMESHIFT, 0, 100);
			break;
			
		case M33GMTOFFSETS:
		{
			char gmtStr[512], gmtStr2[512];
			strcpy(gmtStr,"Standard time offsets from GMT\n\nHawaiian Standard -10 hrs\nAlaska Standard -9 hrs\n");
			strcat(gmtStr,"Pacific Standard -8 hrs\nMountain Standard -7 hrs\nCentral Standard -6 hrs\nEastern Standard -5 hrs\nAtlantic Standard -4 hrs\n");
			strcpy(gmtStr2,"Daylight time offsets from GMT\n\nHawaii always in standard time\nAlaska Daylight -8 hrs\n");
			strcat(gmtStr2,"Pacific Daylight -7 hrs\nMountain Daylight -6 hrs\nCentral Daylight -5 hrs\nEastern Daylight -4 hrs\nAtlantic Daylight -3 hrs");
			//printNote(gmtStr);
			short buttonSelected  = MULTICHOICEALERT2(1691,gmtStr,gmtStr2,TRUE);
			switch(buttonSelected){
				case 1:// ok
					//return -1;// 
					break;  
				case 3: // cancel
					//return -1;// 
					break;
			}
			break;
		}
			
		case M33REPLACEMOVER:
		{
			//sGridCurrentDialogMover->ReplaceMover();
			//mysetitext(dialog, M33NAME, sGridCurrentDialogMover->fVar.userName); // use short file name for now		
		}
	}
	
	return 0;
}
OSErr EditProfilesInit(DialogPtr dialog, VOIDPTR data)
{
    Rect r = GetDialogItemBox(dialog, EPLIST);
    float startdepth;
    CProfilesList *tlist;
    DepthValuesSet dvals;
    long i,n;
    OSErr err = 0;
    short IBMoffset;

    //RegisterPopTable(prefPopTable, 3);
    //RegisterPopUpDialog(EDIT_PROFILES_DLGID, dialog);

    //sharedEPDialogNonPtrFields = GetEPDialogNonPtrFields(sgWindMover);// JLM 11/25/98
    memset(&sgObjects,0,sizeof(sgObjects));// JLM 12/10/98

    {
        DepthValuesSetH dvalsh = sgDepthValuesH;

        sgDepthVals = new CProfilesList(sizeof(DepthValuesSet));
        if(!sgDepthVals)return -1;
        if(sgDepthVals->IList())return -1;
        if(dvalsh)
        {
            // copy list to temp list
            n = _GetHandleSize((Handle)dvalsh)/sizeof(DepthValuesSet);
            for(i=0; i<n; i++)
            {
                dvals=(*dvalsh)[i];
                err=sgDepthVals->AppendItem((Ptr)&dvals);
                if(err)return err;
            }
        }
        else  n=0;

        n++; // Always have blank row at bottom

        err = VLNew(dialog, EPLIST, &r,n, DrawProfilesList, &sgObjects);
        if(err) return err;
    }


    SetDialogItemHandle(dialog,EPFRAMEINPUT,(Handle)FrameEmbossed);
    //SetDialogItemHandle(dialog,EPBUTTONFRAME,(Handle)FrameEmbossed);
    SetDialogItemHandle(dialog,EPLIST,(Handle)ProfilesListUpdate);

    //ShowHideDialogItem(dialog,EPBUTTONFRAME,false);//JLM, hide this frame, we have a different button arrangement

    r = GetDialogItemBox(dialog,EPLIST);
#ifdef IBM
    IBMoffset = r.left;
#else
    IBMoffset = 0;
#endif
    r = GetDialogItemBox(dialog, EPDEPTH_LIST_LABEL);
    DEPTH_COL=(r.left+r.right)/2-IBMoffset;
    r = GetDialogItemBox(dialog, EPU_LIST_LABEL);
    U_COL=(r.left+r.right)/2-IBMoffset;
    r = GetDialogItemBox(dialog, EPV_LIST_LABEL);
    V_COL=(r.left+r.right)/2-IBMoffset;
    r = GetDialogItemBox(dialog, EPW_LIST_LABEL);
    W_COL=(r.left+r.right)/2-IBMoffset;
    r = GetDialogItemBox(dialog, EPTEMP_LIST_LABEL);
    TEMP_COL=(r.left+r.right)/2-IBMoffset;
    r = GetDialogItemBox(dialog, EPSAL_LIST_LABEL);
    SAL_COL=(r.left+r.right)/2-IBMoffset;

    // might want to use values of first set if there are any
    Float2EditText(dialog, EPINCREMENT,sIncrementInMeters, 0);
    Float2EditText(dialog, EPDEPTH,0.0, 0);
    Float2EditText(dialog, EPU,0.0, 0);
    Float2EditText(dialog, EPV,0.0, 0);
    //Float2EditText(dialog, EPW,0.0, 0);
    Float2EditText(dialog, EPTEMP,0.0, 0);
    Float2EditText(dialog, EPSAL,0.0, 0);

    //Float2EditText(dialog, EPDXDY,sCellLength, 0);
    //Float2EditText(dialog, EPNUMCELLS,sNumCells, 0);
    //SetPopSelection (dialog, EPSPEEDPOPUP, sgSpeedUnits);
    //MyDisplayTime(dialog,EPMONTHSPOPUP,sgStartTime);

    //////////

    SetDialogItemHandle(dialog, EPHILITEDDEFAULT, (Handle)FrameDefault);

    ShowHideDialogItem(dialog,EPHILITEDDEFAULT,false);//JLM, hide this item, this dialog has no default

    UpdateDisplayWithCurSelection(dialog);

    MySelectDialogItemText(dialog, EPDEPTH, 0, 100);//JLM
    return 0;
}