var RESOSCO_module = new Class({
   initialize: function (id, status, contest) {
      this.id = id;
      this.buttonsLocked = false;
      this.status = status;
      this.contest = contest;
      this.items = new Array();
      this.currentItemIndex = null;
      this.favTeam = null;
      this.scroller = RESOSCO_scroller.getInstance(id);
      this.setScrollableElement(null);
   },

   lockButtons: function() {
      this.buttonsLocked = true;
   }, 

   unlockButtons: function() {
      this.buttonsLocked = false;
   }, 
   
   setFavTeam: function(str) {
      this.favTeam = str;
   },
   
   highlightFav: function() {
      if (null == this.favTeam || '' == this.favTeam.trim()) {
         return;
      }
      var curItem = this.getCurrentItem();
      var classType = '';
      if ('standings' == curItem.type) {
         classType = 'resosco_standings_table_row';
      }
      if ('matches' == curItem.type) {
         classType = 'resosco_matches_table_row';
      }
      
      var moduleObj = this;   
      $ES('.' + classType, 'resosco_module_' + this.id).each(function(row) {
         row = $(row);
         if (row.hasClass('resosco_team_' + moduleObj.favTeam)) {
            row.addClass('resosco_team_highlighted');
            $ES('.resosco_module_scroll_outer', 'resosco_module_' + moduleObj.id).each(function(el){
               el = $(el);
               var size = el.getSize().size.y;
               var pos = row.getPosition().y - el.getPosition().y;
               if (pos > size / 2) {
                  var fx = new Fx.Scroll(el);
                  fx.scrollTo(0, 30 + pos - size / 2);
               }
            });
         }
      });
   },
   
   
   addItem: function (item) {
      var exists = false;
      var newItemsIndex = this.items.length;
      
      for (var i = 0; i < this.items.length; i++) {
         var currentItem = this.items[i];
         if (null == currentItem.type || null == item.type || item.type != currentItem.type) {
            break;
         }
         
         if (null == currentItem.properties || null == item.properties) {
            break;
         }
         
         var e = true; //indicates if current item of this.items is equal to item
         $each(currentItem.properties, function(value, key) {
            if (null == item[key]) {
               e = false;
               return false;
            }
            if (item.properties[key] != value) {
               e = false;
               return false;
            }
         });
         if (e) {
            newItemsIndex = i;
            exists = true;
            break;
         }
      }
      
      this.items[newItemsIndex] = item;
      this.currentItemIndex = newItemsIndex;
   },

   getCurrentItem: function() {
      if (null == this.currentItemIndex) {
         return null;
      }
      
      return this.items[this.currentItemIndex];
   },

   showStandings: function() {
      for (var i = 0; i < this.items.length; i++) {
         var currentItem = this.items[i];
         if ('standings' == currentItem.type) {
            this.setModuleData(currentItem.type, currentItem.properties,  currentItem.html);
            return;
         }
      }
      var request = {type: 'standings', contest: this.contest, module_id: this.id};
      updateModuleWithServerData(this, request);
   },

   showMatches: function(step) {
      var currentItem = this.getCurrentItem();
      var dateObj = new Date();
      dateObj.setHours(0);
      dateObj.setMinutes(0);
      dateObj.setSeconds(0);
      var time = 0;
      
      if ('matches' == currentItem.type) {
//         alert(currentItem.toSource());
         if (0 == step) {
            this.setModuleData(currentItem.type, currentItem.properties,  currentItem.html);
            return;
         }
         
         if (step > 0 && null != currentItem.properties.t2) {
            time = currentItem.properties.t2;
         }
         if (step < 0) {
            if (null != currentItem.properties.t1) {
               time = currentItem.properties.t1;
//            alert(2);
            }
            time = -time;
         }
         
         /*
         Seeking among already loaded module items
         */
         for (var i = this.items.length - 1; i >= 0; i--) {
           var item = this.items[i];
            if ('matches' != item.type) {
               continue;
            }

            if (time > 0) {
               if (null != item.properties.t1 && item.properties.t1 > time) {
                  this.setModuleData(item.type, item.properties,  item.html);
                  return;
               }
            }

            if (time < 0) {
               if (null != item.properties.t2 && item.properties.t2 < Math.abs(time)) {
                  this.setModuleData(item.type, item.properties,  item.html);
                  return;
               }
            }
            
         }
      }
      
      if ('matches' != currentItem.type) {
         for (var i = 0; i < this.items.length; i++) {
            currentItem = this.items[i];
            if ('matches' == currentItem.type) {
               this.setModuleData(currentItem.type, currentItem.properties,  currentItem.html);
               return;
            }
         }
      }
      
      
      var d = new Date();
      d.setTime(Math.abs(time) * 1000);
//      alert(d);
      
      var request = {type: 'matches', contest: this.contest, module_id: this.id};
      if (null != time && 0 != time) {
         request['t1'] = time;
      }
      updateModuleWithServerData(this, request);
   },

   setModuleData: function(type, properties, html) {
      var item = new RESOSCO_moduleItem(type, properties, html);
      this.addItem(item);
   
      if (null == $('resosco_module_' + this.id)) {
         return;
      }
   
      var el = $E('.resosco_module_scroll_outer', 'resosco_module_' + this.id);
      if (null == el) {
         return;
      }
      el.innerHTML = html;
      this.scroller.resetPosition();
      this.setScrollableElement(null);
      this.highlightFav();
   },

   showLoader: function(small) {
      this.scroller.resetPosition();
      if (small) {
         var wrapper = $('resosco_module_' + this.id);   
      } else {
         var wrapper = $E('.resosco_module_scroll_outer', 'resosco_module_' + this.id);   
      }
      if (null == wrapper) {
         return false;
      }
      
      var loaderElement = new Element("div");
      loaderElement.addClass("resosco_module_loader");
      if (small) {
         loaderElement.addClass("resosco_module_loader_small");
         loaderElement.innerHTML = RESOSCO_Language.translate("updating") + "...";
      } else {
         loaderElement.addClass("resosco_module_loader_big");
         this.lockButtons();
      }
      wrapper.appendChild(loaderElement);
      
   },

   hideLoader: function() {
      var wrapper = $E('.resosco_module_scroll_outer', 'resosco_module_' + this.id);   
      if (null == wrapper) {
         return false;
      }
      
      $ES('.resosco_module_loader', 'resosco_module_' + this.id).each(function(el){
         el = $(el);
         el.remove();
      });
      this.unlockButtons();
   },
   
   setScrollableElement: function(el) {
//      this.scroller.resetPosition();
      if (null == el) {
         el = $E('.resosco_module_scroll_outer', $('resosco_module_' + this.id));
      }
      this.scroller.setScrollableElement(el);
   }, 
   
   showMatch: function(matchId) {
      var match = RESOSCO_Match.getInstance(matchId);
      if (null == match) {
         return false;
      }
      
      var matchPositionClass = 'resosco_module_scroll_outer';
      if (arguments.length > 1) {
         matchPositionClass = arguments[1];
      }
      
      var moduleContainer = $E('.' + matchPositionClass, 'resosco_module_' + this.id);
      if (null == moduleContainer) {
         moduleContainer = $E('.resosco_module_scroll_outer', 'resosco_module_' + this.id);
      }
      
      if (null == moduleContainer) {
         return false;
      }
      
      var moduleObj = this;
      match.onClose = function() {
         moduleObj.setScrollableElement(null);
      };
      var matchElement = match.renderMatch();
      moduleContainer.appendChild(matchElement);
      matchElement.setStyle('top', this.scroller.getPosition() + 'px');
      
      
      var eventsContainer = $E('.resosco_match_events_outer', 'resosco_module_' + this.id);
      if (null == eventsContainer) {
         return;
      }
      
      var matchContainer = $E('.resosco_standalone_match_outer', 'resosco_module_' + this.id);
      
      var newEventsHeight = moduleContainer.getSize().size.y - matchContainer.getSize().scrollSize.y + eventsContainer.getSize().size.y - 20;
//      alert(moduleContainer.getSize().size.y + '-' + matchWrapper.getSize().size.y + '+' + eventsContainer.getSize().size.y);
      eventsContainer.setStyle('height', newEventsHeight + 'px');
      this.setScrollableElement(eventsContainer);
   },
   
   raiseMessage: function(message) {
      this.setScrollableElement(null);
      this.hideLoader();
      
      var wrapper = $E('.resosco_module_scroll_outer', 'resosco_module_' + this.id);   
      if (null == wrapper) {
         return false;
      }
      wrapper.innerHTML = '';
      
      var messageBox = new Element("div");
      messageBox.addClass("resosco_module_message_box");
      messageBox.addClass("resosco_module_message_box_warning");
      wrapper.appendChild(messageBox);
      
      var messageContent = new Element('span');
      messageContent.innerHTML = message;
      messageBox.appendChild(messageContent);
   }
});

RESOSCO_module.getInstance = function (id) {
   if (null == RESOSCO_modules[id]) {
      return null;
   }
   return RESOSCO_modules[id];
}

RESOSCO_module.standings = function (id) {
   var module = RESOSCO_module.getInstance(id);
   if (null == module) {
      return false;
   }
   if (module.buttonsLocked) {
      return false;
   }
   module.showStandings();
}

RESOSCO_module.matches = function (id, step) {
   if (null == RESOSCO_modules[id]) {
      return;
   }
   var module = RESOSCO_modules[id];
   if (module.buttonsLocked) {
      return false;
   }
   module.showMatches(step);
}

RESOSCO_module.match = function (matchId, moduleId) {
   var module = RESOSCO_module.getInstance(moduleId);
   if (module.buttonsLocked) {
      return false;
   }
   if (arguments.length < 3) {
      module.showMatch(matchId);
   } else {
      module.showMatch(matchId, arguments[2]);
   }
}

RESOSCO_module.scrollUp = function (moduleId) {
   var module = RESOSCO_module.getInstance(moduleId);
   if (module.buttonsLocked) {
      return false;
   }
   module.scroller.up(); 
}

RESOSCO_module.scrollDown = function (moduleId) {
   var module = RESOSCO_module.getInstance(moduleId);
   if (module.buttonsLocked) {
      return false;
   }
   module.scroller.down(); 
}

RESOSCO_module.stopScroll = function () {
   RESOSCO_scroller.stop();
}


var RESOSCO_moduleItem = new Class({
   initialize: function(type, properties, html) {
      this.type = type;
      this.properties = properties;
      this.html = html;
   }
});


