var API = (function(){

    var apikey = '0665e0a66f932da49d9a6cc9deeb8a80';
	var refreshCommands = { 'postComment' : 'true' };
	var token = '';
	var ttl = 0;
	var opened;
	var username = '';
	var email = '';
	
	function open(callback){
		$.get(
			'/api2', {
				action: 'API_open',
				key: apikey
			}, 
			function(data, textStatus, XMLHttpRequest){
				if(data && data.done == 'success'){
					var lol = new Date();
					opened = lol.getTime();
					token = data.data.api_token;
					ttl = data.data.ttl;
					username = (data.data["name"] == false)? '' : data.data["name"];
					email = (data.data["email"] == false)? '' : data.data["email"];
					callback? callback.name(callback.params) : $.noop();
				}else{
					return false;
				}
			},
			'json'
		);
	};
	
	function close(callback){
		$.get(
			'/api2', {
				action: 'API_close',
				api: token
			}, 
			function(data, textStatus, XMLHttpRequest){
				if(data && data.done == 'success'){
					callback? callback.name(callback.params) : $.noop();
				}else{
				    //lol
				}
			},
			'json'
		);
	};
	
	function isOpen(){
		if(token == ''){
			return false;
		}else{
			var lol = new Date();
			return ((lol.getTime() - opened) / 1000)<= ttl;
		}
	}

	return { // public interface
		/* params= {
			action: api action to request
			args: {fields n shit for the action}
			onComplete: function(data) //more like onSuccess but whatever
			onFailure: function(data) 
		}*/
		call: function(params) {
			if(!isOpen()){
				open({name: API.call, params: params});
			}else{
				postdata = $.extend({'api': token, 'action': params.action}, params.args);
				$.get(
					'/api2', 
					postdata,
					function(data, textStatus, XMLHttpRequest){
						if(data && data.done == 'success'){
							var lol = new Date();
							opened = lol.getTime();
							var data = data.data;
                            if(refreshCommands[params.action] == 'true'){
                                open($.noop());
                            }
							(params.onComplete)? params.onComplete(data) : $.noop();
						}else{
							(params.onFailure)? params.onFailure(data) : $.noop();
							return false;
						}
					},
					'json'
				);
			}
		},
		getName: function(){
		    return username;
		},
		getEmail: function(){
		    return email;
		}
	};
})();

