/*
Requires:
prototype.js
*/

function api_failure(result) {
	alert("failed: "+result);
}


/*
usage of api_call:


	Event.observe('mybutton', "click", update_user_requests);
	Event.observe('userrequestform', "1candela:updateRequestList", function(event) {
		user.setClassRequestList(event.memo.requests);
		refresh_display();
	});
	function update_user_requests_ok(result) {
		$('userrequestform').fire("1candela:updateRequestList", { requests: result.requests });
	}
	function update_user_requests() {
		api_call('userrequestform', update_user_requests_ok, api_failure );
	}

	<div id="mybutton">click me <(slash) div>
	<form id="userrequestform" action="api.php" method="POST"> ... <(slash) form>

*/
function api_call(form_id, success_fn, failure_fn) {
	$(form_id).request.defer({
		onSuccess: function(response) {
			var result = response.responseText.evalJSON();
			if( result ) {
				if( result.status == 'ok' ) {
					success_fn(result);
					return;
				}
				if( result.status == 'error' ) {
					failure_fn(result);
					return;
				}
			}
			else {
				// api not responding?
				alert("Your request failed. The server may be busy -- try again later?");
			}
		},
		onFailure: function() {
			failure_fn({status:"error",message:"1candela temporarily unavailable"});
		}
	});
}

/*
usage of api_event:

	Event.observe('mybutton', "click", function() { api_event('userrequestform','updateRequestList'); });
	Event.observe('userrequestform', "1candela:updateRequestList", function(event) {
		user.setClassRequestList(event.memo.requests);
		refresh_display();
	});

	<div id="mybutton">click me <(slash) div>
	<form id="userrequestform" action="api.php" method="POST"> ... <(slash) form>


alternate way of writing the mybutton observe line:

	Event.observe('testsbuasdfa', "click", api_event.curry('userrequestform','updateRequestList') );

You can also use the api_event function directly , it doesn't have to be an event handler:

		api_event('userrequestform','updateRequestList');

*/

var is_api_up = true;

function api_event(form_id, event_id, dom_event) {
	// the dom event might be a mouse click with coordinates, etc.  we don't really need it but it is passed 
	// to us anyway when we're called as an event handler for button clicks etc.
	// the dom event object will be undefined
	// if( dom_event == undefined ) { alert("called from code"); }
	$(form_id).request({
		onSuccess: function(response) {
			is_api_up = true;
			var result = response.responseText.evalJSON();
			if( result ) {
				if( result.status == 'ok' ) {
					$(form_id).fire("1candela:"+event_id, result);
					return;
				}
				if( result.status == 'error' ) {
					$(form_id).fire("1candela:"+event_id+"Error", result);
					return;
				}
			}
			else {
				// api not responding?
				//alert("Your request failed. The server may be busy -- try again later?");
				$(form_id).fire("1candela:"+event_id+"Failed", {status:"error",message:"1candela temporarily unavailable"});
			}
		},
		onFailure: function() {
			is_api_up = false;
			$(form_id).fire("1candela:"+event_id+"Failed", {status:"failed",message:"1candela temporarily unavailable"});
		}
	});
}

// convenience method for automatic handling of errors:
function api_autoerror(form_id, event_id) {
	$(form_id).observe("1candela:"+event_id+"Error", function(event) {
		/*
		var box = new Element("div");
        Element.hide(box);
		box.addClassName("api_error_box");
		
		var title = new Element("p");
		title.addClassName("error");
		title.update("Error");
		box.insert(title);
		
		var msg = new Element("p");
		msg.update(event.memo.message);
		box.insert(msg);
		
		// this part doesn't work... prototype doesn't wrap the body tag??
		$$('body').insert(box);
        Element.show(box);
        */
		if( event.memo != null && event.memo.message != null ) {
			var msg = event.memo.message; 
			// if this error is from the form validation, it also includes
			// information about which fields are missing or invalid:
			if( event.memo.fields ) {
				// alert(Object.toJSON(event.memo.fields));
				msg += "\n\n" + $H(event.memo.fields).values().join("\n");
			}
			alert(msg);
		}
		else {
			alert("Something has gone wrong!");
		}
	});
}

//convenience method for automatic handling of failures:
function api_autofailure(form_id, event_id) {
	$(form_id).observe("1candela:"+event_id+"Failed", function(event) {
		if( event.memo != null && event.memo.message != null ) {
			alert(event.memo.message);
		}
		else {
			alert("The server is temporarily unavailable.");
		}
	});
}

