function ajaxGenrator(config) {
	var URL = config.URL || {};
	var HANDLER = config.HANDLER || {};
	var PREFIX_ARGUMENT_LENGTH = config.PREFIX_ARGUMENT_LENGTH || 0;
	var DATA_INIT = config.DATA_INIT || {};
	
	return function(/*prefix..., op, params*/) {
		if (arguments.length == 1 && typeof arguments[0] == 'object') {
			var handler = arguments[0];
			for (var h in handler) {
				HANDLER[h.toUpperCase()] = handler[h];
			};
		} else {
			if (typeof DATA_INIT == 'function') {
				var data = DATA_INIT.apply(window, arguments); 
			} else if (typeof DATA_INIT == 'object'){
				var data = DATA_INIT;
			} else {
				var data = {};
			};
			
			var op = arguments[PREFIX_ARGUMENT_LENGTH];
			var params = arguments[PREFIX_ARGUMENT_LENGTH + 1];
			var method = 'get';
			if (params) {
				for (var k in params) {
					data[k] = params[k];
				};
				method = params._method || method;
			};
			
			var url = URL[op.toUpperCase()];
			if (url.indexOf('?') > -1) {
				url += '&';
			} else {
				url += '?';
			};
			url += 'timestamp=' + new Date().getTime();
			var callback = function(json) {
				var data = eval('('+ json + ')');
				var op = data.op;
				var h = HANDLER[op.toUpperCase()];
				if (h) {
					h.call(HANDLER, data);
				};
				h = HANDLER['_' + op.toUpperCase()];
				if (h) {
					h.call(HANDLER, data);
				};
				data = null;
				delete data;
			};
			if (method == 'get') {
				$.get(url, data, callback);
			} else if (method == 'post') {
				$.post(url, data, callback);
			};
			
			// ga
			//var track = 'webkk-favorite-' + op;
			//ga.track(track);
		};
	};
};

var host = 'http://www.kuaikuai.cn';
var port = window.location.port;
var base_url = '';
if (port == 'null' || port==''){
	base_url = host;
}else{
	base_url = host + ':' + port;
};

var favorite = ajaxGenrator({
	URL : {
		ADD : '/favorite/add/',
		ADD_BATCH : '/favorite/add_batch/',
		DEL : '/favorite/del/',
		LIST : '/favorite/list/',
		MARKSYNC : '/favorite/marksync/',
		MARKSYNC_BATCH : '/favorite/marksync_batch/',		
		UNMARKSYNC : '/favorite/unmarksync/',
		RUN : '/favorite/marksync/'
	},
	PREFIX_ARGUMENT_LENGTH : 2, // app_id, app_name
	DATA_INIT : function(app_id, app_name /*, op, params*/) {
		return {
			'app_id' : app_id,			
			'app_name' : encodeURI(app_name)
		};
	}
});

var software = ajaxGenrator({
	URL : {
		COUNT : '/soft/count/'
	}
});


var user = ajaxGenrator({
	URL : {
		GET_CONFIG : '/user/get_config/',
		SET_CONFIG : '/user/set_config/'
	}
});

var oauth = ajaxGenrator({
	URL : {
		UPDATE : base_url+'/oauth/update/'
	}
});

var rank = ajaxGenrator({
	URL : {
		SAVE_RANK : '/gamerank/save_rank/',
		GET_RANKS : '/gamerank/get_ranks/',
		GET_REPLAY : '/gamerank/get_replay/',
		GET_COMMON_RANKS : '/gamerank/get_common_ranks/'
	}
});

var inlineedit = ajaxGenrator({
	URL : {
		GET_HTML : '/webadmin/inlineeditmanager/get_html/',
		SAVE_HTML : '/webadmin/inlineeditmanager/save_html/'
	}
});

var share = ajaxGenrator({
	URL : {
		SEND_SHARE : '/bo/send_share/',
		REFRESH_SHARE : '/bo/refresh_share/',
		GET_MORE_SHARE : '/bo/get_more_share/'
	}
});