/* CORE */
var C = {
   callEach : function(arr, a, b, c, d, e, f, g) {
      C.each(arr, function(callback) {
         callback(a, b, c, d, e, f, g);
      });
   },
   each : function(arr, callback) {
      for (var i = 0; i < arr.length; i++) {
         callback(arr[i]);
      }
   },
   all : function(obj, callback) {
      for (var key in obj) {
         callback(obj[key]);
      }
   },
   map : function(arr, callback) {
      var resp = [];
      C.each(arr, function(val) {
         resp.push(callback(val));
      });
      return resp;
   },
   filter : function(arr, callback) {
      var resp = [];
      C.each(arr, function(val) {
         if (callback(val)) {
            resp.push(val);
         }
      });
      return resp;
   },
   filterNotNull : function(arr) {
      return C.filter(arr, function(val) {
         return val != null;
      });
   }
};

/* Controls the window */
var WalkDBWindow = {
   initialized : false,
   
   /* Set of closures to be called when a window size change occurs */
   windowSizeListeners : [],
   
   /* Called to register a window size change listener */
   registerWindowSizeListener : function(listener) {
      if (WalkDBWindow.initialized) {
         listener();
      }
      WalkDBWindow.windowSizeListeners.push(listener);
   },
   
   /* Call window size change listeners */
   notifyWindowSizeChange : function() {
      C.callEach(WalkDBWindow.windowSizeListeners);
   },
   
   /* Calculate the correct height for the main content div, and change accordingly */
   applyHeights : function() {
      var heightOfHeader = $('#header').height();
      var heightOfFooter = $('#footer').height();
      var heightOfViewport = $(window).height();
      
      var contentHeight = heightOfViewport - (heightOfHeader + heightOfFooter + 1);
      $('#content').height(contentHeight);
      
      WalkDBWindow.initialized = true;
      WalkDBWindow.notifyWindowSizeChange();
   }
};

/* Run now */
$(function() {
   WalkDBWindow.applyHeights();
   $(window).bind('resize', function() {
      WalkDBWindow.applyHeights();
   });
})

