' Name: Plot_Menu
'
' Title: Plot water quality data (main menu)
'
' Topics: Views
'
' Description: Asks user for specifications for Plot script, which plots INORGANIC.DAT time series
'              Initial idea from:
'              Palle Due Larsen in "Graphics the hard way: Time Series in Avenue"
'              at http://www.esri.com/library/userconf/proc96/TO250/PAP246/P246.HTM
'
' Author: Michael Silberbauer 2001-04-25
' Institute for Water Quality Studies, Department of Water and Sanitation
' Private Bag X313 PRETORIA South Africa 0001
'
'
' Requires: Plot_Menu prompts for the input data and calls Plot
'
' Self:
'
' Results:
' -----------------------------------------------------------------------------

UserTypeList = {"Domestic_Health","Domestic_Salts","Irrigation","None"}
DefaultColourList = {Color.GetBlue,Color.GetCyan,Color.GetGreen,Color.GetYellow,Color.GetMagenta,Color.GetRed,Color.GetGray,Color.GetBlack}
theProject = av.GetProject
DocumentList = theProject.GetDocs
TableList = List.Make
for each anItem in DocumentList
  if (anItem.is(table)) then
    TableList.Add(anItem)
  end
end
InorganicData = MsgBox.ListAsString(TableList,"Select a file with water quality data","DATA TABLES")
if (InorganicData<>nil) then
  theVTab = InorganicData.getVTab
else
  MsgBox.Info("No tables available (yet) in this project","ERROR: NO TABLE")
  exit
end
stnlist = List.Make
Stations = List.Make
if (MsgBox.YesNo("Do you wish to select the stations from a list?","STATION SELECTION MODE",true)) then
  StationData = MsgBox.ListAsString(TableList,"Select a file with monitoring point names","STATION FILE")
  if (StationData<>nil) then
    theStnVTab = StationData.getVTab
  else
    MsgBox.Info("No tables available in this project","ERROR: NO TABLE")
    exit
  end
  FieldList = theStnVTab.GetFields
  shortlist = List.Make
  for each fieldname in FieldList
    if ((fieldname.asString.Contains("st")) or (fieldname.asString.Contains("mon"))) then
      shortlist.Add(fieldname)
      'MsgBox.Info( fieldname.AsString, "FIELD" )

    end
  end
  selfield = MsgBox.ListAsString(shortlist,"Choose a field from"++StationData.AsString,"SELECT FIELD WITH STATION CODES")
  if (selfield=nil) then
    MsgBox.Info("Stopping execution","NO STATION FIELD SELECTED")
    return nil
  else
    StationField = selfield
    'MsgBox.Info( StationField.AsString, "Station field:" )

  end
  theStnField = theStnVTab.FindField(StationField.AsString)
  for each rec in theStnVTab
    stnlist.Add(theStnVTab.ReturnValue(theStnField,rec))
  end
  Stations = MsgBox.MultiListAsString(stnlist,"Choose monitoring points (shift to select many)","SELECT STATIONS TO PLOT")
else
  Stations.Add(MsgBox.Input("Enter name of station to plot:","SINGLE STATION TO PLOT","A2H027Q01"))
end

' Funny things happen to variable names during file conversion: _ValType
' keeps track of this:

_ValType = "Val_info"
if (InorganicData.AsString.Contains(".dbf")) then
  ' text file

  _ValType = "Val_info_dbf"
end
if (InorganicData.AsString.Contains(".txt")) then
  ' text file

  _ValType = "Val_info_txt"
end
theVTab.GetSelection.ClearAll
theVTab.UpdateSelection
FieldList = theVTab.GetFields
shortlist = List.Make
for each fieldname in FieldList
  if (fieldname.asString.Contains("date").Not) then
    shortlist.Add(fieldname)
    'MsgBox.Info( fieldname.AsString, "FIELD" )

  end
end
'selfields = MsgBox.MultiListAsString( shortlist, "Choose fields (Shift to select many)", "SELECT FIELDS TO PLOT" )

selfield = MsgBox.ListAsString(shortlist,"Choose a field from"++InorganicData.AsString,"SELECT FIELD TO PLOT")
if (selfield=nil) then
  MsgBox.Info("NO FIELDS SELECTED","Stopping execution")
  return nil
else
  PlotItem = selfield
  'MsgBox.Info( PlotItem.AsString, "Item to plot:" )

end
_UseType = MsgBox.ListAsString(UserTypeList,"Choose a user type for guidelines","SELECT USER TYPE")
av.Run("SetConstants",{})
CutList = _UseVariables.Get(PlotItem.AsString)
'MsgBox.ListAsString( CutList, "CutList", "DEBUG" )

RGBList = _theColourDict.Get(PlotItem.AsString)
'MsgBox.ListAsString( RGBList, "RGBList", "DEBUG" )

ColList = List.Make
labels = {"Start year","Start month","Start day","End year","End month","End day","Y Max"}
default = {"1996","1","1","2000","12","31","Auto"}
if (CutList<>nil) then
  vType = CutList.Get(1)
  nCuts = CutList.Get(2)
  Guideline1 = CutList.Get(3)
  for each nCut in 3..(nCuts+2)
    labels.Add("Cutpoint"++(nCut-2).AsString)
    default.Add(CutList.Get(nCut).AsString)
  end
else
  vType = 1
  nCuts = 1
  labels.Add("Cutpoint default")
  default.Add("42")
  ColList.Add(DefaultColourList.Get(0))
  ColList.Add(DefaultColourList.Get(4))
end
selection = MsgBox.MultiInput("Choose dates and graph limits for"++PlotItem.AsString++"in"++InorganicData.AsString+":","SELECTION PARAMETERS",labels,default)
if (selection=nil) then
  MsgBox.Info("Nothing selected","PLOT STOPPING")
  exit
else
  StartYear = selection.Get(0)
  StartMonth = selection.Get(1)
end
if (StartMonth.Count=1) then
  StartMonth = "0"+StartMonth
end
StartDay = selection.Get(2)
if (StartDay.Count=1) then
  StartDay = "0"+StartDay
end
StartDate = StartYear+StartMonth+StartDay
Date1 = Date.Make(StartDate,"yyyyMMdd")
EndYear = selection.Get(3)
EndMonth = selection.Get(4)
if (EndMonth.Count=1) then
  EndMonth = "0"+EndMonth
end
EndDay = selection.Get(5)
if (EndDay.Count=1) then
  EndDay = "0"+EndDay
end
EndDate = EndYear+EndMonth+EndDay
Date2 = Date.Make(EndDate,"yyyyMMdd")
if ((Date1.AsString="nil") or (Date2.AsString="nil")) then
  MsgBox.Info("Invalid date range"++StartDate++EndDate,"Stopping execution")
  return nil
end
Ymax_set = selection.Get(6)
Guidelines = List.Make
for each nCol in 7..(nCuts+6)
  Guidelines.Add(selection.Get(nCol).AsNumber)
end
for each nCol in 7..(nCuts+7)
  if (RGBList<>nil) then
    ColIndx1 = (nCol-6)*3
    ColIndx2 = ColIndx1+1
    ColIndx3 = ColIndx1+2
    R = RGBList.Get(ColIndx1)
    G = RGBList.Get(ColIndx2)
    B = RGBList.Get(ColIndx3)
    aCol = Color.Make
    aCol.SetRGBList({R,G,B})
    ColList.Add(aCol)
  else
    ColList.Add(DefaultColourList.Get((nCol-7)))
  end
end
if (Date2<Date1) then
  Date0 = Date2
  Date2 = Date1
  Date1 = Date0
end
TypeList = {"Stick","Area","Box"}
GraphType = MsgBox.ChoiceAsString(TypeList,"Please select a graph type:","GRAPH TYPES AVAILABLE")
av.ShowStopButton
av.ShowMsg("Seeking graph limits for"++PlotItem.AsString++"...")
nStn = 0
for each station in stations
  nStn = nStn+1
  av.SetStatus(100*(nStn/stations.Count))
  av.Run("Plot",{theVTab,Station,PlotItem,Date1,Date2,TypeList,GraphType,vType,Ymax_set,ColList,Guidelines})
end