/*
Библиотека улучшения javascript, написанная под вдохновением от javascript.crockford.com, откуда взята часть кода.
http://javascript.crockford.com/remedial.html
*/

/**
Создание объекта, использующего в качастве прототипа переданный.
Забудьте о классах, создавайте объекты, и наследуйте их!
Читать тут: http://javascript.crockford.com/prototypal.html
*/
if( typeof Object.create !== 'function' ) {
	Object.create = function ( o ) {
		function F() {}
		F.prototype = o;
		return new F();
    };
}

/**
	Оператор typeof работает неправильно — для массивов и null возвращается тип 'object'.
	Функция Object.typeof призвана исправить эту ситуацию.
*/
if( typeof Object.typeOf !== 'function' ) {
	Object.typeOf = function ( value ) {
		var s = typeof value;
		if( s === 'object' ) {
			if( value ) {
				if( value instanceof Array ) {
					s = 'array';
				}
			} else {
				s = 'null';
			}
		}
		return s;
	};
}

/**
	Создание делегата метода объекта.
	Фозвращает функцию, при вызове вызыващую переданный метод в контексте переданного объекта с реальными аргументами.
	Возвращает результат выполнения метода.
*/
if( typeof Function.delegate !== 'function' ) {
	Function.delegate = function ( object, method ) {
		return function () {
			return method.apply( object, arguments );
		};
	};
}

/**
	Создание коллбэка функции с «замороженными» аргументами.
	Фозвращает функцию, при вызове вызывающую переданную функцию с переданными аргументами.
	Возвращает результат выполнения функции.
*/
if( typeof Function.callback !== 'function' ) {
	Function.callback = function ( fnct ) {
		// «Замораживаем» аргументы и саму функцию
		var args = [];
		for( var i = 0; i < arguments.length; i++ ) {
			args[i] = arguments[i];
		}
		return function () {
			return args[0].apply( null, args.slice( 1 ) );
		};
	};
}
