// From http://ejohn.org/blog/simple-javascript-inheritance/
/* Simple JavaScript Inheritance
 * By John Resig http://ejohn.org/
 * MIT Licensed.
 */
// Inspired by base2 and Prototype
(function(){
  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
  // The base Class implementation (does nothing)
  this.Class = function(){};

  // Create a new Class that inherits from this class
  Class.extend = function(prop) {
    var _super = this.prototype;

    // Instantiate a base class (but only create the instance,
    // don't run the init constructor)
    initializing = true;
    var prototype = new this();
    initializing = false;

    // Copy the properties over onto the new prototype
    for (var name in prop) {
      // Check if we're overwriting an existing function
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function(name, fn){
          return function() {
            var tmp = this._super;

            // Add a new ._super() method that is the same method
            // but on the super-class
            this._super = _super[name];

            // The method only need to be bound temporarily, so we
            // remove it when we're done executing
            var ret = fn.apply(this, arguments);
            this._super = tmp;

            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }

    // The dummy class constructor
    function Class() {
      // All construction is actually done in the init method
      if ( !initializing && this.init )
        this.init.apply(this, arguments);
    }

    // Populate our constructed prototype object
    Class.prototype = prototype;

    // Enforce the constructor to be what we expect
    Class.constructor = Class;

    // And make this class extendable
    Class.extend = arguments.callee;

    return Class;
  };


  jQuery.extend({
      put: function(url, data, callback, type) {
        data['_method'] = 'PUT';
        return jQuery.post(url, data, callback, type);
      },
      del: function(url, data, callback, type) {
        data['_method'] = 'DELETE';
        return jQuery.post(url, data, callback, type);
      }
  });

})();

// From http://www.quirksmode.org/js/cookies.html
function createCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else var expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}

function eraseCookie(name) {
  createCookie(name,"",-1);
}

$.newsroom = {};

$.newsroom.Basket = Class.extend({

  /*
   * Note: 'itemId' values are expected to be in the format of
   *       [content type]_[content id]_[content culture code]
   *       or
   *       [content type]_[content id]_[content culture code]_[variant]
   */

  init: function(items) {

    if (this.items == null) {
      this.refresh();
    } else {
      this.items = items;
    }

  },

  _processBasketResponse: function(data) {
    this.items = data;
    $(this).trigger('changed', this);
  },

  add: function(itemId) {
    $(this).trigger('itemAdded', itemId);
    var parts = itemId.split('_');
    $.post('/basket/items', {
      'content_type': parts[0],
      'content_id': parts[1],
      'content_culture_code': parts[2],
      'variant': parts[3]
    }, $.proxy(this._processBasketResponse, this), 'json');
    return true;
  },

	refresh: function() {
    $.get('/basket', { nocache: Math.random() }, $.proxy(this._processBasketResponse, this), 'json');
    return true;
	},

  clear: function() {
    var e = $.Event('willClear');
    $(this).trigger(e);

    if ( e.isDefaultPrevented() ) {
      return false;
    } else {
      $.del('/basket', { nocache: Math.random() }, $.proxy(this._processBasketResponse, this), 'json');
    }

    return true;
  },

  count: function() {
    if (this.items) {
      return this.items.length;
    } else {
      var cookieValue = readCookie('harbor.basket_count');
      if (cookieValue) {
        return parseInt(cookieValue);
      }
      return 0;
    }
  },

  count_releases: function() {
    if (this.items) {
      return $.grep( this.items, function( element, index ) {
        return element.match(/^Release_/);
      }).length;
    }
  },

  count_photos: function() {
    if (this.items) {
      return $.grep( this.items, function( element, index ) {
        return element.match(/^Photo_/);
      }).length;
    }
  },

  count_videos: function() {
    if (this.items) {
      return $.grep( this.items, function( element, index ) {
        return element.match(/^Video_/);
      }).length;
    }
  },

  remove: function(itemId) {
    $(this).trigger('itemRemoved', itemId);
    var parts = itemId.split('_');
    $.del('/basket/items', {
      'content_type': parts[0],
      'content_id': parts[1],
      'content_culture_code': parts[2],
      'variant': parts[3]
    }, $.proxy(this._processBasketResponse, this), 'json');
    return true;
  }

});

$.newsroom.Stats = Class.extend({
  init: function() {
    this.events = [];
  },

  append: function() {
    for (var i = 0; i < arguments.length; i++) {
      this.events.push(arguments[i]);
    }
  },

  commit: function() {
    if (this.events.length > 0) {
      $.post('/.stats', {'events': this.events});
    }
  }
})

$.newsroom.stats = new $.newsroom.Stats;

