// ========================================================================== // Project: SproutCore Costello - Property Observing Library // Copyright: ©2006-2011 Strobe Inc. and contributors. // Portions ©2008-2011 Apple Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ==========================================================================

sc_require('mixins/array');

SC.supplement(Array.prototype, SC.CoreArray);

// Because Arrays are dealt with so much, we add specialized functions.

SC.mixin(Array.prototype,

/** @lends Array.prototype */ {

// primitive for array support.
replace: function (idx, amt, objects) {
  if (this.isFrozen) { throw new Error(SC.FROZEN_ERROR); }

  var args;
  var len = objects ? (objects.get ? objects.get('length') : objects.length) : 0;

  // Notify that array content is about to mutate.
  this.arrayContentWillChange(idx, amt, len);

  if (len === 0) {
    this.splice(idx, amt);
  } else {
    args = [idx, amt].concat(objects);
    this.splice.apply(this, args);
  }

  this.arrayContentDidChange(idx, amt, len);

  return this;
},

// If you ask for an unknown property, then try to collect the value
// from member items.
unknownProperty: function (key, value) {
  var ret = this.reducedProperty(key, value);
  if ((value !== undefined) && ret === undefined) {
    ret = this[key] = value;
  }
  return ret;
}

});

if (Array.prototype.indexOf === SC.CoreArray.indexOf) {

/**
  Returns the index for a particular object in the index.

  @param {Object} object the item to search for
  @param {Number} startAt optional starting location to search, default 0
  @returns {Number} index of -1 if not found
*/
Array.prototype.indexOf = function (object, startAt) {
  var idx, len = this.length;

  if (startAt === undefined) startAt = 0;
  else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
  if (startAt < 0) startAt += len;

  for (idx = startAt; idx < len; idx++) {
    if (this[idx] === object) return idx;
  }
  return -1;
};

}

if (Array.prototype.lastIndexOf === SC.CoreArray.lastIndexOf) {

/**
  Returns the last index for a particular object in the index.

  @param {Object} object the item to search for
  @param {Number} startAt optional starting location to search, default 0
  @returns {Number} index of -1 if not found
*/
Array.prototype.lastIndexOf = function (object, startAt) {
  var idx, len = this.length;

  if (startAt === undefined) startAt = len - 1;
  else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
  if (startAt < 0) startAt += len;

  for (idx = startAt; idx >= 0; idx--) {
    if (this[idx] === object) return idx;
  }
  return -1;
};

}