OSErr GridCurrentMover_c::TextRead(char *path, char *topFilePath) 
{
	// this code is for curvilinear grids
	OSErr err = 0;
	short gridType, selectedUnits;
	char fileNamesPath[256], filePath[256];
	Boolean isNetCDFPathsFile = false;
	TimeGridVel *newTimeGrid = nil;

	memset(fileNamesPath, 0, 256);
	memset(filePath, 0, 256);
	strcpy(filePath,path);	// this gets altered in IsNetCDFPathsFile, eventually change that function

	//  NetCDF is a binary file format, so we will continue to just pass in a path.
	if (IsNetCDFFile(path, &gridType) ||
		IsNetCDFPathsFile(filePath, &isNetCDFPathsFile, fileNamesPath, &gridType))
	{
		if (gridType == CURVILINEAR) {
			newTimeGrid = new TimeGridVelCurv();
		}
		else if (gridType == TRIANGULAR) {
			newTimeGrid = new TimeGridVelTri();
		}
		else {
			newTimeGrid = new TimeGridVelRect();
		}

		if (newTimeGrid) {
			// TODO: This would be more efficient if IsNetCDFFile() would leave the file
			//       open and pass back an active ncid
			err = newTimeGrid->TextRead(filePath, topFilePath);
			if(err) return err;
			this->SetTimeGrid(newTimeGrid);
		}

		if (isNetCDFPathsFile) {
			//char errmsg[256];

			err = timeGrid->ReadInputFileNames(fileNamesPath);
			if (err)
				return err;

			timeGrid->DisposeAllLoadedData();
			//err = ((NetCDFMover*)newMover)->SetInterval(errmsg);	// if set interval here will get error if times are not in model range
		}

		return err;
	}

	// All other file formats are line-formatted text files
	vector<string> linesInFile;
	if (ReadLinesInFile(path, linesInFile)) {
		linesInFile = rtrim_empty_lines(linesInFile);
	}
	else
		return -1; // we failed to read in the file.

	if (IsPtCurFile(linesInFile))
	{
		newTimeGrid = new TimeGridCurTri();
		if (newTimeGrid)
		{
			//err = this->InitMover(newTimeGrid);
			//if(err) goto Error;
			// do this in two steps since we need the uncertainty parameters for the grid mover
			err = dynamic_cast<TimeGridCurTri*>(newTimeGrid)->ReadHeaderLines(path,&fUncertainParams);
			err = newTimeGrid->TextRead(path,"");
			if(err) return err;

			// set the TCurrentMover uncertainty parameters 
			// only along and across can be set in the file (uncertainty min is not implemented so should stay zero
			fDownCurUncertainty = -fUncertainParams.alongCurUncertainty; 
			fUpCurUncertainty = fUncertainParams.alongCurUncertainty; 	

			fRightCurUncertainty = fUncertainParams.crossCurUncertainty;  
			fLeftCurUncertainty = -fUncertainParams.crossCurUncertainty; 
			
			this->SetTimeGrid(newTimeGrid);
			if (!err) /// JLM 5/3/10
			{
				//char errmsg[256];
				//err = timeGrid->ReadInputFileNames(fileNamesPath);
				timeGrid->DisposeAllLoadedData();
				//if(!err) err = timeGrid->SetInterval(errmsg,model->GetModelTime()); // if set interval here will get error if times are not in model range
			}
		}
	}
	else if (IsGridCurTimeFile(linesInFile, &selectedUnits))
	{
		//cerr << "we are opening a GridCurTimeFile..." << "'" << path << "'" << endl;
		newTimeGrid = new TimeGridCurRect();
		//timeGrid = new TimeGridVel();
		if (newTimeGrid)
		{			
			//err = this->InitMover(timeGrid);
			//if(err) goto Error;
			dynamic_cast<TimeGridCurRect*>(newTimeGrid)->fUserUnits = selectedUnits;
			err = newTimeGrid->TextRead(path,"");
			if(err) goto Error;
			this->SetTimeGrid(newTimeGrid);
			if (!err /*&& isNetCDFPathsFile*/) /// JLM 5/3/10
			{
				//char errmsg[256];
				//err = timeGrid->ReadInputFileNames(fileNamesPath);
				/*if(!err)*/ timeGrid->DisposeAllLoadedData();
				//if(!err) err = timeGrid->SetInterval(errmsg,model->GetModelTime()); // if set interval here will get error if times are not in model range
			}
		}
	}
	else {
		err = -1; return err;
	}

	Error: // JLM 	 10/27/98
	//if(newMover) {newMover->Dispose();delete newMover;newMover = 0;};
	//return 0;
	return err;

}
OSErr GridWindMover_c::TextRead(char *path, char *topFilePath) 
{
	// this code is for curvilinear grids
	OSErr err = 0;
	char fileNamesPath[256], filePath[256];

	short gridType, selectedUnits;
	Boolean isNetCDFPathsFile = false;
	TimeGridVel *newTimeGrid = 0;

	//cerr << "GridWindMover_c::TextRead(): path = " << endl << path << endl;

	// this gets altered in IsNetCDFPathsFile, eventually change that function
	strcpy(filePath, path);
	if (IsNetCDFFile(path, &gridType) ||
		IsNetCDFPathsFile(filePath, &isNetCDFPathsFile, fileNamesPath, &gridType))
	{
		if (gridType == CURVILINEAR) {
			newTimeGrid = new TimeGridWindCurv();
		}
		else {
			newTimeGrid = new TimeGridWindRect();
		}

		if (newTimeGrid) {
			 //err = newGridWindMover->InitMover(timeGrid);
			 //if(err) goto Error;
			 if (!err) {
				 err = newTimeGrid->TextRead(filePath, topFilePath);
			 }
			 if (err)
				 goto Error;
			 this->SetTimeGrid(newTimeGrid);
		}

		if (!err && isNetCDFPathsFile)
		{
			//char errmsg[256];
			err = timeGrid->ReadInputFileNames(fileNamesPath);
			if (!err)
				timeGrid->DisposeAllLoadedData();

			//if(!err) err = newMover->SetInterval(errmsg); // if set interval here will get error if times are not in model range
			if (err)
				return err;
		}
	}
	else if (IsGridWindFile(path, &selectedUnits))
	{
		char errmsg[256];
		newTimeGrid = new TimeGridCurRect();
		//timeGrid = new TimeGridVel();
		if (newTimeGrid) {
			//err = this->InitMover(timeGrid);
			//if(err) goto Error;
			dynamic_cast<TimeGridCurRect*>(newTimeGrid)->fUserUnits = selectedUnits;
			err = newTimeGrid->TextRead(path,"");
			if(err) goto Error;
			this->SetTimeGrid(newTimeGrid);
			if (!err) {
				//char errmsg[256];
				//err = timeGrid->ReadInputFileNames(fileNamesPath);
				//if(!err)
				timeGrid->DisposeAllLoadedData();
				//if(!err) err = timeGrid->SetInterval(errmsg,model->GetModelTime()); // if set interval here will get error if times are not in model range
			}
		}
	}
Error: // JLM 	 10/27/98
	//if(newMover) {newMover->Dispose();delete newMover;newMover = 0;};
	//return 0;
	return err;
	
}