(function() {

   var preOnLoadWindow = function() {};
   if (window.onload && typeof window.onload == 'function')
     preOnLoadWindow = window.onload;

   window.onload = function() {
     preOnLoadWindow();
     startLottery();
   };


   var maxCheckedCells = 5;

   var lotteryState = {
     active: false,
     name: null,
     currentDate: null,
     startDate: null,
     endDate: null,
     hasPast: false,
     today: {
       completed: false,
       checksum: null,
       games: null,
       selectedNumbers: [],
       pointsRate: null,
       coeff: []
     },
     past: {
     }
   };

   var elems = {
     today: {
     },
     past: {
       wait: null,
       info: null,
       winNumbers: null,
       winNumbersWrapper: null,
       selectedNumbers: null,
       selectedNumbersWrapper: null,
       matchedNumbers: null,
       matchedNumbersWrapper: null,
       betSum: null,
       betSumWrapper: null,
       pointsReceived: null,
       pointsReceivedWrapper: null,
       pointsTotal: null,
       pointsTotalWrapper: null
     }
   };


   function startLottery() {
     if (!isLotteryPage())
       return;
     findLotteryElements();
     getLotteryStatus(function() {
       drawTodayLottery();
       drawPastLottery();
     });
   }


   function isLotteryPage() {
     if ($id('lottery'))
       return true;
     else
       return false;
   }


   function findLotteryElements() {
     var base = $id('lottery');
     elems.past.wait = $class('past-lottery-wait', base)[0];
     elems.past.info = $class('lottery-info-past', base)[0];
     elems.past.winNumbersWrapper = $class('lottery-info-past-winning', base)[0];
     elems.past.winNumbers = $tag('b', elems.past.winNumbersWrapper)[0];
     elems.past.selectedNumbersWrapper = $class('lottery-info-past-selected', base)[0];
     elems.past.selectedNumbers = $tag('b', elems.past.selectedNumbersWrapper)[0];
     elems.past.matchedNumbersWrapper = $class('lottery-info-past-matched', base)[0];
     elems.past.matchedNumbers = $tag('b', elems.past.matchedNumbersWrapper)[0];
     elems.past.betSumWrapper = $class('lottery-info-past-bet', base)[0];
     elems.past.betSum = $tag('b', elems.past.betSumWrapper)[0];
     elems.past.pointsReceivedWrapper = $class('lottery-info-past-points', base)[0];
     elems.past.pointsReceived = $tag('b', elems.past.pointsReceivedWrapper)[0];
     elems.past.pointsTotalWrapper = $class('lottery-info-past-total', base)[0];
     elems.past.pointsTotal = $tag('b', elems.past.pointsTotalWrapper)[0];
  }


   function getLotteryStatus(onSuccess) {
     var options = {};
     if (userInfo && userInfo.sid && userInfo.sid != 0)
       options.sid = userInfo.sid;
     lotteryServer.sendRequest('lottery_data', options, function(response) {
       if (response.status != 'ok') {
         lotteryState.active = false;
       }
       if (response.status == 'ok') {
         if (response.result.sha256)
           lotteryState.active = true;
         else
           lotteryState.active = false;
         if (response.result.start_date && response.result.start_date != response.result.day)
           lotteryState.hasPast = true;
         else
           lotteryState.hasPast = false;
         lotteryState.name = response.result.name;
         lotteryState.currentDate = response.result.day;
         lotteryState.startDate = response.result.start_date;
         lotteryState.endDate = response.result.end_date;
         lotteryState.today.checksum = response.result.sha256;
         lotteryState.today.games = response.result.games;
         if (response.result.selected_numbers) {
           lotteryState.today.completed = true;
           for (var j = 0; j < response.result.selected_numbers.length; j++) {
             if (response.result.selected_numbers[j]) {
               lotteryState.today.completed = true;
               lotteryState.today.selectedNumbers.push(response.result.selected_numbers[j]);
             }
           }
         }
         lotteryState.today.pointsRate = response.result.points_rate;
         if (response.result.coeff) {
           for (var k = 0; k < response.result.coeff.length; k++) {
             lotteryState.today.coeff.push(response.result.coeff[k]);
           }
         }
       }
       onSuccess();
     });
   }


   function drawTodayLottery() {

     if (!lotteryState.active) {
       $class('no-lottery-today')[0].style.display = 'block';
       $class('lottery-text-today')[0].style.display = 'none';
       $class('lottery-ticket')[0].style.display = 'none';
       $class('lottery-complete-form')[0].style.display = 'none';
       return;
     }

     // Today's lottery name and duration
     var duration = dateRange(lotteryState.startDate, lotteryState.endDate, true);
     var lotteryName  = $class('lottery-name')[0];
     lotteryName.innerHTML = lotteryState.name + ' <small>(' + duration[0][1] + ' &mdash; ' + duration[duration.length-1][1] + ')</small>';
     lotteryName.style.display = 'block';

     // Today's sha-256 checksum
     var lotteryChecksum = $class('lottery-sha256')[0];
     $tag('b', lotteryChecksum)[0].innerHTML = lotteryState.today.checksum;
     lotteryChecksum.style.display = 'block';

     // Today's games
     var lotteryGames = $class('lottery-gamelist')[0];
     var lotteryGamesHTML = '';
     for (var i = 0; i < lotteryState.today.games.length; i++) {
       lotteryGamesHTML += '<li class="game-block" id="' + lotteryState.today.games[i] + '">' + '<a href="' + games[lotteryState.today.games[i]].rules + '">' + games[lotteryState.today.games[i]].name + '</a>' + '</li>';
     }
     $tag('ul', lotteryGames)[0].innerHTML = lotteryGamesHTML;
     lotteryGames.style.display = 'block';
     buildLobbies();

     // Today's coeff rate
     var lotteryRate = $class('lottery-rate')[0];
     $class('points', lotteryRate)[0].innerHTML = lotteryState.today.pointsRate + ' ';
     lotteryRate.style.display = 'block';

     // Today's coeff
     if (lotteryState.today.coeff) {
       var lotteryCoeff = $class('lottery-coeff')[0];
       var lotteryCoeffCells = $tag('td', $class('lottery-coeff-values-row', lotteryCoeff)[0]);
       for (var i = 0; i < lotteryCoeffCells.length; i++) {
         lotteryCoeffCells[i].innerHTML = lotteryState.today.coeff[i];
       }
       lotteryCoeff.style.display = 'block';
     }

     // Today's lottery ticket
     if (userInfo && userInfo.sid && userInfo.sid == 0) {
       $class('lottery-complete-message')[0].innerHTML = 'In order to participate in today&rsquo;s lottery you must be signed in.';
     }
     else if (lotteryState.today.completed) {
       $class('lottery-complete-message')[0].innerHTML = 'You have selected your numbers.';
       $class('lottery-info-today')[0].style.display = 'block';
       $tag('b', $class('lottery-info-today')[0])[0].innerHTML = lotteryState.today.selectedNumbers.join(', ');
       var todayLotteryCells = $tag('td', $class('lottery-ticket-today')[0]);
       for (var i = 0; i < lotteryState.today.selectedNumbers.length; i++) {
         var cellNo = parseInt(lotteryState.today.selectedNumbers[i]) - 1;
         todayLotteryCells[cellNo].style.backgroundImage = 'url(/i/lottery_x.gif)';
       }
     }
     else {
       $class('lottery-complete-message')[0].innerHTML = 'The ticket hasn&rsquo;t been filled out.';
       var lotteryTicket = $class('lottery-ticket-today')[0];
       lotteryTicket.className = lotteryTicket.className.replace(/lottery\-ticket\-disabled/i, '');
       var lotteryCells = $tag('td', $class('lottery-ticket-today')[0]);
       var totalCheckedCells = 0;

       for (var i = 0; i < lotteryCells.length; i++) {

         (function() {

            var that = lotteryCells[i];

            that.isChecked = false;

            that.onmouseover = function() {
              if (lotteryState.today.completed) return;
              that.style.backgroundColor = '#fbfbe1';
            };

            that.onmouseout = function() {
              if (lotteryState.today.completed) return;
              that.style.backgroundColor = '#fff';
            };

            that.onclick = function() {

              if (lotteryState.today.completed) return;

              if (that.isChecked) {
                that.style.backgroundImage = 'none';
                that.isChecked = false;
                totalCheckedCells--;
              }
              else {
                if (totalCheckedCells == maxCheckedCells)
                  return;
                this.style.backgroundImage = 'url(/i/lottery_x.gif)';
                that.isChecked = true;
                totalCheckedCells++;
              }
              if (totalCheckedCells == maxCheckedCells) {
                $id('lottery-complete').disabled = false;
                $class('lottery-complete-message')[0].style.display = 'none';
              }
              else {
                $id('lottery-complete').disabled = true;
                $class('lottery-complete-message')[0].style.display = 'inline';
              }
            };
          })();
       }

       $id('lottery-complete').onclick = function() {
         lotteryState.today.completed = true;
         $id('lottery-complete').disabled = 'disabled';
         $class('lottery-complete-message')[0].style.display = 'inline';
         $class('lottery-complete-message')[0].innerHTML = '<img src="/i/ajax-loading.gif"> Please wait...';
         $class('lottery-ticket-today')[0].className = 'lottery-ticket-today lottery-ticket-disabled';
         var result = [];
         for (var i = 0; i < lotteryCells.length; i++) {
           if (lotteryCells[i].isChecked) {
             result.push(i + 1);
           }
         }
         var options = {};
         options.sid = userInfo.sid;
         for (var i = 0; i < maxCheckedCells; i++) {
           options['n' + (i + 1)] = parseInt(result[i]);
         }
         lotteryServer.sendRequest('lottery_bet', options, function(response) {
           if (response.status == 'ok') {
             $class('lottery-complete-message')[0].innerHTML = 'You have selected your numbers.';
             $class('lottery-info-today')[0].style.display = 'block';
             $tag('b', $class('lottery-info-today')[0])[0].innerHTML = result.join(', ');
           }
           else {
             $class('lottery-complete-message')[0].innerHTML = 'We are sorry, but something went wrong on our server. Please try again later.';
           }
         });
       };
     }
   }


   function drawPastLottery() {

     if (!lotteryState.hasPast) {
       $class('no-lottery-past')[0].style.display = 'block';
       elems.past.wait.style.display = 'none';
       $class('lottery-text-past')[0].style.display = 'none';
       $class('lottery-date-chooser')[0].style.display = 'none';
       $class('lottery-ticket')[2].style.display = 'none';
       return;
     }

     var dateChooserDiv = $class('lottery-date-chooser')[0];

     var dates = dateRange(lotteryState.startDate,
                           lotteryState.currentDate > lotteryState.endDate ? lotteryState.endDate : lotteryState.currentDate,
                           lotteryState.currentDate > lotteryState.endDate ? true : false);
     var dateChooserOptions = '';
     for (var i = dates.length; i > 0; i--) {
       dateChooserOptions += '<option value="' + dates[i-1][0] + '">' + dates[i-1][1] + '</option>';
     }
     dateChooserDiv.innerHTML = '<select>' + dateChooserOptions + '</select>';

     var dateChooser = $tag('select', dateChooserDiv)[0];
     dateChooser.onchange = function() {
       var date = dateChooser[dateChooser.selectedIndex].value;
       clearPastLottery();
       if (!lotteryState.past[date]) {
         var options = {};
         options.day = date;
         if (userInfo && userInfo.sid && userInfo.sid != 0)
           options.sid = userInfo.sid;
         lotteryServer.sendRequest('lottery_data', options, function(response) {
           if (response.status != 'ok') {
             lotteryState.past[date] = {
               active: false
             };
           }
           if (response.status == 'ok') {
             lotteryState.past[date] = {
               numbers: response.result.numbers,
               rc_string: response.result.rc_string,
               checksum: response.result.sha256,
               selected_numbers: response.result.selected_numbers,
               matched_numbers: response.result.matched_numbers,
               bet: response.result.bet ? response.result.bet : 0,
               points: response.result.points ? response.result.points : 0,
               total_points: response.result.total_points ? response.result.total_points : 0
             };
             if (!response.result.sha256)
               lotteryState.past[date].active = false;
             else
               lotteryState.past[date].active = true;
           }
           drawPastLotteryForDate(date);
         });
       }
       else {
         drawPastLotteryForDate(date);
       }
     };

     dateChooser.onchange();

     $class('past-lottery-checksum-button')[0].onclick = function() {
       var pastLotteryResult = $class('past-lottery-result')[0].value;
       var pastLotteryChecksum = hex_sha256(pastLotteryResult);
       $class('past-lottery-checksum-data')[0].innerHTML = '<b>' + pastLotteryChecksum  + '</b>';
     };
   }


   function drawPastLotteryForDate(date) {
     elems.past.wait.style.display = 'none';
     if (!lotteryState.past[date].active)
       return;
     $class('past-lottery-result')[0].value = lotteryState.past[date].rc_string;
     $class('past-lottery-checksum')[0].style.display = 'block';
     elems.past.info.style.display = 'block';
     if (lotteryState.past[date].selected_numbers) {
       elems.past.selectedNumbers.innerHTML = lotteryState.past[date].selected_numbers.join(', ');
       elems.past.selectedNumbersWrapper.style.display = 'block';
       elems.past.matchedNumbers.innerHTML = lotteryState.past[date].matched_numbers;
       elems.past.matchedNumbersWrapper.style.display = 'block';
     }
     // Show winning numbers
     elems.past.winNumbers.innerHTML = lotteryState.past[date].numbers.join(', ');
     elems.past.winNumbersWrapper.style.display = 'block';
     var pastLotteryCells = $tag('td', $class('lottery-ticket-past')[0]);
     for (var i = 0; i < lotteryState.past[date].numbers.length; i++) {
       var cellNo = parseInt(lotteryState.past[date].numbers[i]) - 1;
       pastLotteryCells[cellNo].className = 'number-winning';
     }
     if (lotteryState.past[date].selected_numbers) {
       for (var i = 0; i < lotteryState.past[date].selected_numbers.length; i++) {
         var cellNo = parseInt(lotteryState.past[date].selected_numbers[i]) - 1;
         if (pastLotteryCells[cellNo].className == 'number-winning')
           pastLotteryCells[cellNo].className = 'number-matched';
         else
           pastLotteryCells[cellNo].className = 'number-selected';
       }
     }
     // Show points and bet sum
     if (userInfo && userInfo.sid && userInfo.sid != 0) {
       elems.past.betSum.innerHTML = lotteryState.past[date].bet;
       elems.past.betSumWrapper.style.display = 'block';
       elems.past.pointsReceived.innerHTML = lotteryState.past[date].points;
       elems.past.pointsReceivedWrapper.style.display = 'block';
       elems.past.pointsTotal.innerHTML = lotteryState.past[date].total_points;
       elems.past.pointsTotalWrapper.style.display = 'block';
     }
   }


   function clearPastLottery() {
     elems.past.wait.style.display = 'block';
     elems.past.info.style.display = 'none';
     elems.past.winNumbers.innerHTML = '';
     elems.past.winNumbersWrapper.style.display = 'none';
     elems.past.selectedNumbers.innerHTML = '';
     elems.past.selectedNumbersWrapper.style.display = 'none';
     elems.past.matchedNumbers.innerHTML = '';
     elems.past.matchedNumbersWrapper.style.display = 'none';
     elems.past.betSum.innerHTML = '';
     elems.past.betSumWrapper.style.display = 'none';
     elems.past.pointsReceived.innerHTML = '';
     elems.past.pointsReceivedWrapper.style.display = 'none';
     elems.past.pointsTotal.innerHTML = '';
     elems.past.pointsTotalWrapper.style.display = 'none';
     var pastLotteryCells = $tag('td', $class('lottery-ticket-past')[0]);
     for (var i = 0; i < pastLotteryCells.length; i++) {
       pastLotteryCells[i].className = '';
     }
     $class('past-lottery-result')[0].value = '';
     $class('past-lottery-checksum-data')[0].innerHTML = '&nbsp;';
     $class('past-lottery-checksum')[0].style.display = 'none';
   }


   function dateRange(from, to, withLastDay) {

     if (!withLastDay)
       withLastDay = false;

     var months = {
       '01': 'January',
       '02': 'February',
       '03': 'March',
       '04': 'April',
       '05': 'May',
       '06': 'June',
       '07': 'July',
       '08': 'August',
       '09': 'September',
       '10': 'October',
       '11': 'November',
       '12': 'December'
     };

     var result = [];

     var fromSplit = from.split('-');
     var start = {
       year: parseInt(fromSplit[0], 10),
       month: parseInt(fromSplit[1], 10) - 1,
       day: parseInt(fromSplit[2], 10)
     };
     var startDate = new Date(Date.UTC(start.year, start.month, start.day));

     var toSplit = to.split('-');
     var end = {
       year: parseInt(toSplit[0], 10),
       month: parseInt(toSplit[1], 10) - 1,
       day: parseInt(toSplit[2], 10)
     };
     var endDate = new Date(Date.UTC(end.year, end.month, end.day));

     function formatDate(date) {
       var dateYear = date.getUTCFullYear().toString();
       var dateMonth = date.getUTCMonth() + 1;
       if (parseInt(dateMonth, 10) < 10)
         dateMonth = '0' + dateMonth;
       var dateDay = date.getUTCDate();
       if (parseInt(dateDay, 10) < 10)
         dateDay = '0' + dateDay;
       return [dateYear + '-' + dateMonth + '-' + dateDay, months[dateMonth] + ' ' + dateDay];
     }

     result.push(formatDate(startDate));

     var finished = false;
     while (!finished) {
       startDate.setDate(startDate.getDate() + 1);
       if (startDate < endDate)
         result.push(formatDate(startDate));
       else {
         if (withLastDay) result.push(formatDate(startDate));
         finished = true;
       }
     }

     return result;
   }
})();

