TSSGDA.addObserver('onload', initWeather);
MONTHS = ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь']
// Класс контролера с списком погоды на весь год
function ClassWeatherYear (sId)
{
  var oThis = this;
  this.dBody = document.getElementById(sId);
  this.iLeft = this.getLeftOffset(this.body);
  this.iTop = this.getTopOffset(this.body);
  this.iWidth = this.offsetWidth;
  this.iHeight = this.offsetHeight;
  this.dPointer = document.createElement('div');
    this.dBody.appendChild(this.dPointer);
    this.dPointer.style.position = 'absolute';
    this.dPointer.className = "pointer";
  this.aWeek = {'Mon' : 7, 'Tue' : 6, 'Wed' : 5, 'Thu' : 4, 'Fri' : 3, 'Sat' : 2, 'Sun' : 1};
  this.iWeekStart = 0;
  this.iWeekEnd = 0;

    this.dBody.onmouseout = hide_delay;
    this.dBody.onmouseover = function () {try {clearTimeout(hide_timeout)}catch(err){}};

  this.dBody.onmousemove = function (event)
  {
    var i;
    if (!event) event = window.event;
        var x = event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - oThis.iLeft;
        i = Math.floor(x/3);
        if (i > WEATHER_DAYS['last_day']) i = WEATHER_DAYS['last_day'];
        if (i < WEATHER_DAYS['first_day']) i = WEATHER_DAYS['first_day'];

      if ( i + 1 > oThis.iWeekEnd || i - 1 < oThis.iWeekStart)
      {
        oThis.iWeekEnd = oThis.aWeek[WEATHER_DAYS[i].dow] + i;
        oThis.iWeekStart = oThis.iWeekEnd - 7;
        // Если границы недели ушли за границы текущего года - сместить интервал так, чтобы умещаться в год
        if (oThis.iWeekEnd > WEATHER_DAYS['last_day'])
        {
            oThis.iWeekEnd = WEATHER_DAYS['last_day'];
            oThis.iWeekStart = oThis.iWeekEnd - 6;
        }
        if (oThis.iWeekStart < WEATHER_DAYS['first_day'])
        {
            oThis.iWeekStart = WEATHER_DAYS['first_day'];
            oThis.iWeekEnd = oThis.iWeekStart + 6;
        }
        // Если самое начало года и дней меньтше семи - ужать интервал
        if (oThis.iWeekEnd > WEATHER_DAYS['last_day']) 
        {
          oThis.iWeekEnd = WEATHER_DAYS['last_day'];
          oThis.iWeekStart = 0;
        }
        oThis.redraw(oThis.iWeekStart, oThis.iWeekEnd);
       }
  }

     this.dBody.onclick = function (event)
       {
      var i;
      if (!event) event = window.event;
          var x = event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - oThis.iLeft;
          i = Math.floor(x/3);
          i = oThis.aWeek[WEATHER_DAYS[i].dow] + i - 6;
          if (i < WEATHER_DAYS['first_day']) i = WEATHER_DAYS['first_day'];
            oThis.notify('onclick', i, 'not_month_start');
    }

  this.redraw = function (iWeekStart, iWeekEnd)
  {
      var i, max_i, min_i;
      var start = iWeekStart;
      var end = iWeekEnd;
      // Вычисляем минимальную и максимальную температуры за выбранный период
      var min = 200;
      var max = -100;
      for (i = start; i < end; i++)
      {
        if (WEATHER_DAYS[i].tmp < min) {min = WEATHER_DAYS[i].tmp; min_i = i;}
        if (WEATHER_DAYS[i].tmp > max) {max = WEATHER_DAYS[i].tmp; max_i = i;}
      }

    var x = iWeekStart*3 - 1;
        var y = Math.round((min+max)/2) - 12;
        //var w = iWeekEndiWeekStart
      oThis.dPointer.style.left = x + 'px';
      oThis.dPointer.style.bottom = y + 'px';
      oThis.notify('onredraw', start, min_i, max_i);
  }

}
ClassWeatherYear.prototype = new ClassDomObject();

// Класс контроллера, со списком погоды на выбранную неделю
function ClassWeatherWeek (sId)
{
  var oThis = this;
  this.dBody = document.getElementById(sId);
  this.iLeft = this.getLeftOffset(this.body);
  this.iTop = this.getTopOffset(this.body);
  this.iWidth = this.offsetWidth;
  this.iHeight = this.offsetHeight;


  this.redraw_align = function (sEvent, aAarguments)
  {
      oThis.dBody.innerHTML = '';

    var i, j, cnt, sky, day, ext, cls, left, bottom, start = aAarguments[1], end = start + 7, flag = 1;
    var min_i = aAarguments[2], max_i = aAarguments[3];
    var div = document.createElement('div');
    for (i = 0; i < 7; i++)
    {
      j = i + start;
      left = i*40 + 'px';
//            console.log(j);
            bottom = (WEATHER_DAYS[j].tmp - WEATHER_DAYS[aAarguments[2]].tmp)*3 + 40;
            sky = document.createElement('div');
      day = document.createElement('div');
      // Если выводится текущий день
      if (i + start == WEATHER_DAYS['last_day'] && IS_CURRENT_YEAR)
      {
        sky.id = 'current_sky';
        day.id = 'current_day';
        sky.className = 'sky ' + 'wc_cd_' + CURRENT_WEATHER.sky;
        sky.title = CURRENT_WEATHER.time + ' ' + sky.className;
        sky.style.left = left;
        sky.style.bottom = (bottom - 32 < 5)?'5px':(bottom - 32) + 'px';
        day.innerHTML = 'сейчас';
        tmp = document.createElement('div');
        tmp.id = "current_temp";
        tmp.innerHTML = WEATHER_DAYS[j].tmp - 40 + '°';
        tmp.style.bottom = (bottom - 28 < 15)?'15px': (bottom - 28)+ 'px';
        tmp.style.marginLeft = '0.2em';
        day.appendChild(tmp);
        flag = 0;
      }
      else
      {
        sky.className = 'sky ' + 'wc_' + WEATHER_DAYS[j].sky;
        sky.style.left = left;
        sky.style.bottom = bottom + 'px';
        day.innerHTML = WEATHER_DAYS[j].day;
        }

      day.className = 'day ' + WEATHER_DAYS[j].dow;
      day.style.left = left;
      day.style.bottom = 0;

        if (j == min_i || j == max_i)
        {
        ext = document.createElement('div');
        ext.className = 'day ';
        ext.style.paddingLeft = '0.3em';
        cnt = WEATHER_DAYS[j].tmp - 40;
        ext.innerHTML = Math.abs(cnt) + '°';
        if (cnt < 0) ext.innerHTML = '<span class="minus">−</span>' + ext.innerHTML;
        ext.style.left = left;
        ext.style.bottom = (j == min_i ? 30 :( bottom + 31)) + 'px';
          div.appendChild(ext);
        }

        div.appendChild(sky);
        div.appendChild(day);
      }
      oThis.dBody.appendChild(div);

    if (flag)
    {
      var month_name = document.createElement('div');
      month_name.id = 'month_name';
      month_name.innerHTML = '<span>'+MONTHS[WEATHER_DAYS[start].mnt - 1]+'</span>';
      oThis.dBody.appendChild(month_name);
         flag = 0;
       }
  }

}
ClassWeatherWeek.prototype = new ClassDomObject();

// Класс, отвечающий за подсветку выбранного месяца
function ClassMonthsHighlighter()
{
  var oThis = this;
  this.current;
  this.highlight =  function (sEvent, aArguments)
  {
    var obj;
    //console.log(aArguments[1]);
    var temp = WEATHER_DAYS[aArguments[1]] && WEATHER_DAYS[aArguments[1]].mnt;
    var month = temp || aArguments;
    try {clearTimeout(hide_timeout)}catch(err){};
    if (!document.getElementById('wc_scheme_' + month)) {this.clear(); return false;}
    if (month == oThis.current) return false;

      if (obj = document.getElementById('wc_text_' + month)) obj.className += ' highlighted ';
      if (obj = document.getElementById('wc_month_' + month)) obj.className += ' highlighted ';
      if (obj = document.getElementById('wc_scheme_' + month)) obj.className += ' highlighted ';

    if (oThis.current)
    {
        if (obj = document.getElementById('wc_text_' + oThis.current)) obj.className = obj.className.replace(/highlighted/, '');
        if (obj = document.getElementById('wc_month_' + oThis.current)) obj.className = obj.className.replace(/highlighted/, '');
        if (obj = document.getElementById('wc_scheme_' + oThis.current)) obj.className = obj.className.replace(/highlighted/, '');
    }
        oThis.current = month;
  }

  this.clear = function ()
  {
//  console.log('Clear!');
      if (obj = document.getElementById('wc_text_' + oThis.current)) obj.className = obj.className.replace(/highlighted/, '');
      if (obj = document.getElementById('wc_month_' + oThis.current)) obj.className = obj.className.replace(/highlighted/, '');
      if (obj = document.getElementById('wc_scheme_' + oThis.current)) obj.className = obj.className.replace(/highlighted/, '');
     oThis.current = -1;
  }
}

// Класс, отвечающий за подсветку выбранного месяца
function ClassMonthsHolder()
{
  var oThis = this;
  this.current;
  oThis.just_changed = 0;
  this.hold =  function (sEvent, aArguments)
  {
    var obj;

    //console.log(aArguments[1]);
    var temp = WEATHER_DAYS[aArguments[1]] && WEATHER_DAYS[aArguments[1]].mnt;
    var month = temp || aArguments;
    if (month == oThis.current) return false;

    //if (!document.getElementById('wc_month_' + month)) return false;
    if (!document.getElementById('wc_scheme_' + month)) return false;


      if (obj = document.getElementById('wc_text_' + month)) obj.className += ' holded ';
      if (obj = document.getElementById('wc_month_' + month)) obj.className += ' holded ';
      if (obj = document.getElementById('wc_scheme_' + month)) obj.className += ' holded ';

        if (!(aArguments[2] && aArguments[2] == 'not_month_start')) window.weather_year.redraw(MONTHS_STARTS[month], MONTHS_STARTS[month] -1 + 7);
        oThis.just_changed = 1;

    if (oThis.current)
    {
        if (obj = document.getElementById('wc_text_' + oThis.current)) obj.className = obj.className.replace(/holded/, '');
        if (obj = document.getElementById('wc_month_' + oThis.current)) obj.className = obj.className.replace(/holded/, '');
        if (obj = document.getElementById('wc_scheme_' + oThis.current)) obj.className = obj.className.replace(/holded/, '');
    }
        oThis.current = month;
  }
  this.clear = function (sEvent, aArguments)
  {
    var obj;
    var temp = WEATHER_DAYS[aArguments[1]] && WEATHER_DAYS[aArguments[1]].mnt;
    var month = temp || aArguments;
    if (month == oThis.current) return false;

    if (oThis.just_changed)
    {
      oThis.just_changed = 0;
    }
    else
    {
        if (obj = document.getElementById('wc_text_' + oThis.current)) obj.className = obj.className.replace(/holded/, '');
        if (obj = document.getElementById('wc_month_' + oThis.current)) obj.className = obj.className.replace(/holded/, '');
        if (obj = document.getElementById('wc_scheme_' + oThis.current)) obj.className = obj.className.replace(/holded/, '');
      oThis.current = -1;
    }
  }

}


function hide_delay()
{
//  console.log('Start!');
  window.hide_timeout = setTimeout(hide, 100);
}

function hide()
{
//  console.log('Hide!');
  window.highlighter.clear();
}


function initWeather()
{
  window.weather_year = new ClassWeatherYear('weather_year');
  window.weather_week = new ClassWeatherWeek('weather_week');
  weather_year.addObserver('onredraw', weather_week, 'redraw_align');

  window.highlighter = new ClassMonthsHighlighter();
  weather_year.addObserver('onredraw', highlighter, 'highlight');

  window.holder = new ClassMonthsHolder();
  weather_year.addObserver('onclick', holder, 'hold');

    TSSGDA.addObserver('onclick', holder, 'clear');

  window.weather_year.redraw(WEATHER_DAYS['last_day'] - 6, WEATHER_DAYS['last_day']);
    window.highlighter.clear();

  MONTHS_STARTS = {};
  var i, j = 0, n = -1;
  for (i in WEATHER_DAYS)
  {
    if (WEATHER_DAYS[i].mnt != n)
    {
      n = WEATHER_DAYS[i].mnt;
      MONTHS_STARTS[n] = i - 1 + 1;
    }
  }
//     console.log(MONTHS_STARTS);

}
