/* Copyright © 2011-2012 by Neil Jenkins. Licensed under the MIT license. */

( function () {

/*jshint strict: false */

// Note: Does not inclue the `if ( i in this ) {}` check these function should
// have, as IE8 will return false if this[i] is undefined (at least if the array
// was defined with a literal, e.g. `[ undefined, undefined ]`).

Array.prototype.indexOf = function ( item, from ) {
    var l = this.length;
    for ( var i = ( from < 0 ) ? Math.max( 0, l + from ) : from || 0;
            i < l; i += 1 ) {
        if ( this[i] === item ) {
            return i;
        }
    }
    return -1;
};

Array.prototype.forEach = function ( fn, bind ) {
    var l = this.length >>> 0;
    if ( typeof fn !== 'function' ) {
        throw new TypeError();
    }
    for ( var i = 0; i < l; i += 1 ) {
        fn.call( bind, this[i], i, this );
    }
};

Array.prototype.filter = function ( fn, bind ) {
    var results = [];
    for ( var i = 0, l = this.length; i < l; i += 1 ) {
        var value = this[i];
        if ( fn.call( bind, value, i, this ) ) {
            results.push( value );
        }
    }
    return results;
};

Object.keyOf = function ( object, value ) {
    for ( var key in object ) {
        if ( object[ key ] === value ) {
            return key;
        }
    }
};

Date.now = function () {
    return +( new Date() );
};

String.prototype.trim = function () {
    var str = this.replace( /^\s\s*/, '' ),
        ws = /\s/,
        i = str.length;
    while ( ws.test( str.charAt( i -= 1 ) ) ) {/* Empty! */}
    return str.slice( 0, i + 1 );
};

}() );