﻿/**
 * Rivet Software Inc.
 * ©Copyright 2006-2009 Rivet Software, Inc. All rights reserved.
 **/

function isArray(obj) {
	return isTypeOf(obj, Array);
}

function isObjective( obj ){
	return obj != null && isTypeOf( obj, Object );
}

function isScalar( obj ){
	return obj == null || !isObjective( obj );
}

function isString( val ){
	return val.toString() === val;
}

function isTypeOf( obj, cls ){
	return obj instanceof cls;
}

function object2Query( object ){
	var query = '';
	if( object ){
		for( var prop in object ){
			var value = [];
			if( tryGetSafe( object, prop, value ) ){
				value = value[0];

				if( isScalar( value ) ){
					query += escape( prop ) +'='+ escape( value.toString() ) +'&';
				}else if( isArray( value ) ){
					for( var i = 0; i < value.length; i++ ){
						query += escape( prop ) +'[]='+ escape( value[ i ].toString() ) +'&';
					}
				}
			}
		}
	}

	return query.trimRight( '&' );
}

function objectiveReference(){
	args = Array.toArray( arguments );
	var method = args.shift();
	var object = args.shift();

	return function(){
		return method.apply( object, arguments || args );
	}
}

function toArray( list ){
	var array = [];
	if (!isString(list)) {
		for (var i = 0; i < list.length; i++) {
			array.push(list[i]);
		}
	}
	return array;
}

function tryGetSafe( obj, prop, val ){
	try{
		val.push( obj[ prop ] );
		return true;
	}catch( e ){
		return false;
	}
}

Array.toArray = function( list ){
	var array = [];
	if( !isString( list ) ){
		for( var i = 0; i < list.length; i++ ){
			array.push( list[ i ] );
		}
	}
	return array;
}

String.prototype.trim = function( charList ){
	return this.trimLeft( charList ).trimRight( charList );
}
String.prototype.trimLeft = function( charList ){
	var rex = charList ?
		new RegExp( '^['+ charList +']+' ) :
		/^\s+/;

	return this.replace( rex, '' );	
}
String.prototype.trimRight = function( charList ){
	var rex = charList ?
		new RegExp( '['+ charList +']+$' ) :
		/\s+$/;

	return this.replace( rex, '' );	
}