(function() {

Preceptor.util.Ajax = function( url ){
	return YAHOO.util.Connect.asyncRequest( "GET" , url );
}

Preceptor.util.AjaxSave = function( url , data ){
	return YAHOO.util.Connect.asyncRequest( "POST" , url , {} , data );
}

Preceptor.util.AjaxUpdate = function( id , url , options ){
	
	var id  			= id || url.split( "/" )[0];
	var options			= options || {};
	var formId 			= options.formId || null;
	var isUpload 		= options.isUpload || false;
	var evalScripts		= options.evalScripts || true;
	var onRequest       = options.onRequest;

	var success = function( o )
	{
		var div = $( id );

		if( o.responseText !== undefined )
		{
			var html = typeof o.responseText == 'undefined' ? '' : o.responseText;
			
			try {
		    	div.innerHTML = html;
			}catch(e){}		
			
			try {
				div.value = html;
			}catch(e){}		   

			if( evalScripts )
			{
		    	setTimeout( function(){ Preceptor.util.evalScripts( html ) } , 10 );
		    }

			if( formId ) disableButton( $( formId ) , false );
		}
		
		//Preceptor.widget.RemoveLoading( id );
		
		if( options.onComplete )
			options.onComplete( o );
	}

	var failure = function( o )
	{
		alert( "Página inacessível. Tente novamente." );
	}

	var callback = {
		success: success,
		failure: failure,
		upload:  success,
		timeout: 600000,
		scope: this
	}

	var disableButton = function( form , isDisabled )
	{
		if( form )
		{
			for( var i = 0 ; i < form.elements.length ; i++ )
			{
				if( form.elements[i].type == 'submit' )
				{
					form.elements[i].disabled = isDisabled;
				}
			}
		}
	}
	
	if ( formId ) {
		var msg = options.msg || "Realizado com sucesso!";
		disableButton( $( formId ), true );
		YAHOO.util.Connect.setForm( $( formId ), isUpload, true );
	}
	
	//Preceptor.widget.Loading( id );
	
	if( onRequest )
		onRequest();
	
	return YAHOO.util.Connect.asyncRequest( "POST", url, callback );
}

Array.prototype.map = function( fn, bind ){
	var results = [];
	for (var i = 0, j = this.length; i < j; i++) results[i] = fn.call(bind, this[i], i, this);
	return results;
}
})();