//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Leif Karlsson"
#property link      ""
#property show_inputs
//+------------------------------------------------------------------+
#include <stdlib.mqh>
//+------------------------------------------------------------------+
#import "kernel32.dll"
   void GetSystemTimeAsFileTime(int& lpSystemTimeAsFileTime[]);

#import "user32.dll"
	int SendMessageA(int hWnd, int Msg, int  wParam, string lParam);	
   int GetParent(int hWnd);	
   int GetWindow(int hWnd, int uCmd);
   bool IsWindow(int hWnd);
#import

#define WM_GETTEXT  	      0x000D
#define WM_SETTEXT         0x000C

#define GW_HWNDFIRST       0
#define GW_HWNDNEXT        2
//+------------------------------------------------------------------+
string   symAll[200];
int      hwndAll[200];
//+------------------------------------------------------------------+
int start() {

   Print("Copyright © 2011, Leif Karlsson");
   
   if(!IsDllsAllowed()) {
      Alert("DLL call must be allowed for this script to work.");
      return(-1);
   }

   Comment("System sync: Waiting for tick...");
   while(!RefreshRates()) Sleep(100);
   double serverTime = TimeCurrent();
   
   double myTime = SysTimeMS();
   double offset = serverTime - myTime/1000.0;
   
   Comment("");      
   
   while(true) {
   
      bool shutDown = IsStopped();   
   
      UpdateSymAll();
      
      RefreshRates();            
   
      myTime = SysTimeMS();
      serverTime = myTime/1000.0 + offset;   
      
      string str = "";
      int i = 0, t, s, m, h, d, p;
      while(hwndAll[i] != 0) {
      
         if(!IsWindow(hwndAll[i])) UpdateSymAll(true);
         
         p = GetPeriod(hwndAll[i]);
         
         if(shutDown) str = "";
         else {
            t = iTime(symAll[i], p , 0) + p*60 - serverTime;
            s = MathAbs(t % 60);
            m = MathAbs((t / 60) % 60);  
            h = MathAbs((t / (60*60)) % 24);
            d = MathAbs(t / (24*60*60));
            
            
            if(t < 0) str = " - WAIT... -";
            else str = " - ";
         
            if(p > PERIOD_D1) str = str + StringSubstr("" + (100 + d), 1) + " ";
            if(p > PERIOD_H1) str = str + StringSubstr("" + (100 + h), 1) + ":";
            str = str + StringSubstr("" + (100 + m), 1) + ":" + StringSubstr("" + (100 + s), 1);            
         }
         
         str = StringConcatenate(symAll[i], ",", PeriodToStr(p), str);
         
         SendMessageA(hwndAll[i], WM_SETTEXT, 0, str);
         
         i++;
      }
      
      if(shutDown) return(0);      
      Sleep(1100 - MathMod(myTime, 1000));    
   }
      
   return(0);
}
//+------------------------------------------------------------------+
string PeriodToStr(int p) {
         
   switch(p) {
         
   case PERIOD_M1: return("M1");
   case PERIOD_M5: return("M5");
   case PERIOD_M15: return("M15");
   case PERIOD_M30: return("M30");
   case PERIOD_H1: return("H1");
   case PERIOD_H4: return("H4");
   case PERIOD_D1: return("Daily");
   case PERIOD_W1: return("Weekly");
   case PERIOD_MN1: return("Monthly");
   }   
   return("");
}
//+------------------------------------------------------------------+
int GetPeriod(int hwnd) {

   string tmp = "GBPUSD,Monthly....";      

   SendMessageA(hwnd, WM_GETTEXT, 17, tmp);
   
   if(StringFind(tmp, "M15") > 0) return(PERIOD_M15);
   if(StringFind(tmp, "M1") > 0) return(PERIOD_M1);
   if(StringFind(tmp, "M5") > 0) return(PERIOD_M5);
   if(StringFind(tmp, "M30") > 0) return(PERIOD_M30);
   if(StringFind(tmp, "H1") > 0) return(PERIOD_H1);
   if(StringFind(tmp, "H4") > 0) return(PERIOD_H4);
   if(StringFind(tmp, "Daily") > 0) return(PERIOD_D1);
   if(StringFind(tmp, "Weekly") > 0) return(PERIOD_W1);
   if(StringFind(tmp, "Monthly") > 0) return(PERIOD_MN1);
   
   return(1);
}
//+------------------------------------------------------------------+
void UpdateSymAll(bool refresh = false) {   

   string tmp = "GBPUSD,Monthly....";   
   int h = GetWindow(GetParent(WindowHandle(Symbol(), Period())), GW_HWNDFIRST);
   
   if(h == hwndAll[0] && !refresh) return;
   else hwndAll[0] = h;
      
   int i = 0;
   while(true) {
   
      SendMessageA(hwndAll[i], WM_GETTEXT, 17, tmp);
      symAll[i] = StringSubstr(tmp, 0, StringFind(tmp, ","));
            
      hwndAll[i+1] = GetWindow(hwndAll[i], GW_HWNDNEXT);
      i++;
      
      if(hwndAll[i] == 0 || hwndAll[i] == hwndAll[0]) break;
   }
   
   symAll[i] = "";
   hwndAll[i] = 0;
}
//+------------------------------------------------------------------+
double SysTimeMS() {

   double ms = 0;
   int fileTime[2];
   
   GetSystemTimeAsFileTime(fileTime);
   
   ms = (fileTime[0] >> 1);               // unsigned div. by 2
   ms += fileTime[1]*MathPow(2,31);       // * 2^32 / 2
   ms /= 5000.0;                          // from 200ns to ms
      
   return(ms);
}
//+------------------------------------------------------------------+


