/**
 * 	File:
 * 		mooServer.js
 * 	Author:
 * 		Nicholas Blackwell BSc. UBCO - Jon Corbett Phd. UBCO
 * 	License:
 * 		Open Source MIT Licence
 *	Description:
 *		generalizes ajax communication between server - client
 *	Date: September 23 2009
 */

var AjaxQuery=new Class({
	options:
	{
	server:"",
	json:{},
	task:'search',
	onComplete:function(){},
	onSuccess:function(response){
		
	},
	onFailure:function(){
		
	}
	},
	initialize:function(options){
		var me=this;
		me.setOptions(options);	
		
		var join='?';
		args="";
		if(me.options.task){
			args+=join+"task="+me.options.task;
			join='&';
		}
		if(me.options.json){
			args+=join+"json="+((AjaxQuery.JsonString(me.options.json)).replace(/&/g, '%26').replace(/#/g,'%23'));
			join='&';
		}
		
		var ajaxPair=AjaxQuery.Ajax(	
					
				me.options.server+args,
				{
					method:me.options.method||"get",
					onSuccess:function(response){
						me.onSuccess(response);
					},
					onFailure:function(){
						me.fireEvent('onFailure');
					},
					onComplete:function(){
						me.fireEvent('onComplete');
					}
				});
		me.ajax=ajaxPair.ajax;
		me.send=ajaxPair.send;
	},
	onSuccess:function(response){
		var me=this;
		me.fireEvent('onSuccess', response);
	},
	execute:function(){
		var me=this;
		me.send();
		return me.ajax;
	},
	cancel:function(){
		var me=this;
		var result = me.ajax.cancel();
		me.fireEvent('onCancel',result);
		return result;
	}
});
AjaxQuery.implement(new Options(), new Events());

AjaxQuery.Ajax=function(url, options){
	var result={};
	if(!(typeof Request == 'undefined')){
		options['url']=url;
		result.ajax=new Request(options);
		result.send=function(){	result.ajax.send();};
	}
	else if(!(typeof Ajax == 'undefined')){
		result.ajax=new Ajax(url,options);
		result.send=function(){	result.ajax.request();};
	}
	return result;
};

AjaxQuery.JsonString=function(mixed){
	if(!(typeof Request == 'undefined'))
	{
		return JSON.encode(object); 
	}
	else if(!(typeof Json == 'undefined'))
	{
		return Json.toString(mixed);
	}
};

AjaxQuery.StringJson=function(string){
	if(!(typeof Request == 'undefined'))
	{
		return text;//TODO: might need to decode 
	}
	else if(!(typeof Json == 'undefined'))
	{
		return Json.evaluate(string); 
	}
};

AjaxQuery.JsonResponse=AjaxQuery.extend({
	initialize:function(server, task, json, options)
	{
	var me=this;
	me.parent($merge({
		'server':server,
		'json':json||{},
		'task':task
	},options||{}));
	},
	onSuccess:function(response){
		var me=this;
		me.fireEvent('onSuccess', AjaxQuery.StringJson(response));
	}
});
