//+------------------------------------------------------------------+
//|  BUTTONS                                                         |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 0
#property strict

extern string  Symbols="USDCAD;USDJPY;GBPUSD;EURUSD;AUDUSD;EURJPY;GBPAUD;EURAUD;NZDUSD;AUDJPY;GBPNZD;EURNZD;AUDCAD;NZDJPY;GBPCAD;EURCAD;NZDCAD;CADJPY;GBPJPY;EURGBP"; // List of symbols (separated by ";")
extern string  TimeFrame="W1;D1;H4;";
extern string  Suffix="";
extern int     ButtonsInARow = 4;      // Buttons in a horizontal row
extern int     Corner        = 1;      // Corner
extern int     XShift        = 60;    // Horizontal shift
extern int     YShift        = 20;     // Vertical shift
extern int     XSize         = 55;     // Width of buttons
extern int     YSize         = 16;     // Height of buttons
extern int     FSize         = 8;     // Font size
extern string  FontType      = "Consolas" ; // Font
extern color   Bcolor=clrWheat;        // Button color
extern color   Dcolor=clrBeige;        // Button border color
extern color   Tncolor=clrBlack;       // Text color - normal
extern color   Sncolor= clrMagenta;    // Text color - selected
extern bool    Transparent= false;     // Transparent buttons?

//+------------------------------------------------------------------+
string sTfTable[];
string aSymbols[];
string  UniqueID="changer";     // Indicator unique ID
                                                               
//+------------------------------------------------------------------+
int OnInit()
{

   Symbols=StringTrimLeft(StringTrimRight(Symbols));
   if(StringSubstr(Symbols,StringLen(Symbols)-1,1)!=";")
      Symbols=StringConcatenate(Symbols,";");
      
   TimeFrame=StringTrimLeft(StringTrimRight(TimeFrame));
   if(StringSubstr(TimeFrame,StringLen(TimeFrame)-1,1)!=";")
      TimeFrame=StringConcatenate(TimeFrame,";");
   
   int s=0,i=StringFind(Symbols,";",s), j=StringFind(TimeFrame,";",s);
   string current;
   while(i>0)
     {
      current=StringSubstr(Symbols,s,i-s)+Suffix;
      ArrayResize(aSymbols,ArraySize(aSymbols)+1);
      aSymbols[ArraySize(aSymbols)-1]=current;
      s = i + 1;
      i = StringFind(Symbols,";",s);
     }
   s=0;
   while(j>0)
     {
      current=StringSubstr(TimeFrame,s,j-s);
      ArrayResize(sTfTable,ArraySize(sTfTable)+1);
      sTfTable[ArraySize(sTfTable)-1]=current;
      s = j + 1;
      j = StringFind(TimeFrame,";",s);
     }
 
   int xpos=0,ypos=0;
   for(i=0; i<ArraySize(aSymbols); i++)   { 
     if(i>0 && MathMod(i,ButtonsInARow)==0) { 
     xpos=0; ypos+=YSize+1; 
     } 
     createButton(UniqueID+":symbol:"+string(i),aSymbols[i],XShift+xpos,YShift+ypos); 
     xpos+=XSize+1; 
   }
   xpos=0; ypos+=YSize*2;
   for(i=0; i<ArraySize(sTfTable); i++)   { 
     if(i>0 && MathMod(i,ButtonsInARow)==0) { 
     xpos=0; ypos+=YSize+1; 
     } 
     createButton(UniqueID+":time:"+string(i),sTfTable[i],XShift+xpos,YShift+ypos); 
     xpos+=XSize+1; 
   }
 
   setSymbolButtonColor();
   setTimeFrameButtonColor();
   
   return(0);
  } 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   switch(reason)
     {
      case REASON_CHARTCHANGE :
      case REASON_RECOMPILE   :
      case REASON_CLOSE       : break;
      default :
        {
         string lookFor       = UniqueID+":";
         int    lookForLength = StringLen(lookFor);
         for(int i=ObjectsTotal()-1; i>=0; i--)
           {
            string objectName=ObjectName(i);  if(StringSubstr(objectName,0,lookForLength)==lookFor) ObjectDelete(objectName);
           }
        }
     }
  }
//+------------------------------------------------------------------+ 
void createButton(string name,string caption,int xpos,int ypos)
  {
   if(ObjectFind(name)!=0)
      ObjectCreate(name,OBJ_BUTTON,0,0,0);
   ObjectSet(name,OBJPROP_CORNER,0);
   ObjectSet(name,OBJPROP_XDISTANCE,xpos);
   ObjectSet(name,OBJPROP_YDISTANCE,ypos);
   ObjectSet(name,OBJPROP_XSIZE,XSize);
   ObjectSet(name,OBJPROP_YSIZE,YSize);
   ObjectSetText(name,caption,FSize,FontType,Tncolor);
   ObjectSet(name,OBJPROP_FONTSIZE,FSize);
   ObjectSet(name,OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSet(name,OBJPROP_COLOR,Tncolor);
   ObjectSet(name,OBJPROP_BGCOLOR,Bcolor);
   ObjectSet(name,OBJPROP_BACK,Transparent);
   ObjectSet(name,OBJPROP_BORDER_COLOR,Dcolor);
   ObjectSet(name,OBJPROP_STATE,false);
   ObjectSet(name,OBJPROP_HIDDEN,true);
   ObjectSet(name,OBJPROP_CORNER,Corner);
   
  }
//+------------------------------------------------------------------+ 
void setSymbolButtonColor()
  {
   string lookFor       = UniqueID+":symbol:";
   int    lookForLength = StringLen(lookFor);
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      string objectName=ObjectName(i);
      if(StringSubstr(objectName,0,lookForLength)==lookFor)
        {
         string symbol=ObjectGetString(0,objectName,OBJPROP_TEXT);
         if(symbol!=_Symbol)
            ObjectSet(objectName,OBJPROP_COLOR,Tncolor);
         else  ObjectSet(objectName,OBJPROP_COLOR,Sncolor);
        }
     }
  } 
//+------------------------------------------------------------------+
void setTimeFrameButtonColor()
  {
   string lookFor       = UniqueID+":time:";
   int    lookForLength = StringLen(lookFor);
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      string objectName=ObjectName(i);
      if(StringSubstr(objectName,0,lookForLength)==lookFor)
        {
         int time = stringToTimeFrame(ObjectGetString(0,objectName,OBJPROP_TEXT));
         if(time != _Period)
            ObjectSet(objectName,OBJPROP_COLOR,Tncolor);
         else  ObjectSet(objectName,OBJPROP_COLOR,Sncolor);
        }
     }
  }


//+------------------------------------------------------------------+ 

/*+------------------------------------------------------------------+
string timeFrameToString(int tf)
  {
   for(int i=ArraySize(iTfTable)-1; i>=0; i--)
      if(tf==iTfTable[i]) return(sTfTable[i]);
   return("");
  }*/ 
//+------------------------------------------------------------------+
int stringToTimeFrame(string tf)
  {
    if(tf=="M1") return(PERIOD_M1);
    if(tf=="M5") return(PERIOD_M5);
    if(tf=="M15") return(PERIOD_M15);
    if(tf=="H1") return(PERIOD_H1);
    if(tf=="H4") return(PERIOD_H4);
    if(tf=="D1") return(PERIOD_D1);
    if(tf=="W1") return(PERIOD_W1); 
    if(tf=="MN") return(PERIOD_MN1);            
    return(0);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_CLICK && ObjectGet(sparam,OBJPROP_TYPE)==OBJ_BUTTON)
     {
      if(StringFind(sparam,UniqueID+":symbol:",0)==0) ChartSetSymbolPeriod(0,ObjectGetString(0,sparam,OBJPROP_TEXT),_Period);
      if(StringFind(sparam,UniqueID+":time:"  ,0)==0) ChartSetSymbolPeriod(0,_Symbol,stringToTimeFrame(ObjectGetString(0,sparam,OBJPROP_TEXT)));
      if(StringFind(sparam,UniqueID+":back:"  ,0)==0) ObjectSet(sparam,OBJPROP_STATE,false);
     }
  }
//+------------------------------------------------------------------+
int start() { return(0); }
//+------------------------------------------------------------------+
