var api = function(key) { //key not implemented, enter whatever you want
	if (!key) {
		alert('API Init Error: No API key provided');
		return false;
	}
	this.key = key;
	this.queue = new ajaxQueue(); //use a queue
	this.root = '/api.php'; //make requests to here
}
//All of the below methods are annoying
//they only set up the action and module
//you may as well use request and set
//the request and module yourself
api.prototype.request = function(options) {
	var defaults = {
		url: this.root,
		type: 'post',
		key: this.key,
		dataType: 'json',
		data: {}, //data must contain at least "action" and "method"
		requestFrom: 'unspecified', //useful for debugging, all the requests look the same in firebug until you check the post data.
		callback: function(){}, //success
		error: function(){}, //error from API (method doesn't exist, missing params, etc)
		ajaxerror: function(){} //ajax error (PHP parse error, bad connection, etc.)
	}
	
	var o = jQ.extend(defaults, options);
	
	//check for required options
	var error = 'API Request Error from '+o.requestFrom+':';
	for (var i in o) {
		if (!o[i]) error += ' No '+i+' provided.';
	}
	if (error != 'API Request Error from '+o.requestFrom+':') {
		alert(error);
	} else {
		//required options present, add request to API ajaxQueue
		this.queue.add({
			url: o.url,
			type: o.type,
			data: o.data,
			dataType: o.dataType,
			success: function(data) {
				if (data.success) {
					o.callback(data.result);
					cb.console('API success!');
				} else {
					o.error(data.result);
					cb.console('API Error from '+this.requestFrom+' code '+data.result.error_code+', '+data.result.error_message);
				}
			}, 
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				//trigger standard API ajax error
				//trigger error from request if it has one
				data = {error_code: '-1', error_message: textStatus};
				o.error(data);
				cb.console('AJAX Error from '+this.requestFrom+' code '+data.error_code+', '+data.error_message);
			}
		});
	}
}

//prepares data by extending defaults and module-specific with user supplied data -- used by below "convenience" methods.
api.prototype.run_module = function(defaults, data, options) {
	if (options.data) data = jQ.extend(data, options.data); //extend mod/action data with user supplied data (AJAX POST)
	var o = jQ.extend(defaults, options); //extend defaults with user supplied options
	o.data = data; //inject extended POST data
	this.request(o); //make the request
}

/* 
 * Convenience Methods
 * All require user_id unless otherwise noted
 * Method-specific requirements are listed above the method
 */

////////  ////////  ////////
//        //           //
//  ////  //////       //
//    //  //           //
////////  ////////     //
api.prototype.getContentObjects = function(options) {
	var defaults = {requestFrom: 'getContentObjects'};
	var data = {module:'editor', action:'get_object', format: 'json'};
	this.run_module(defaults, data, options);
}

api.prototype.getEvents = function(options) {
	var defaults = {requestFrom: 'getEvents'};
	var data = {module:'events', action:'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getEventCats = function(options) {
	var defaults = {requestFrom: 'getEventCats' };
	var data = {module:'events', action:'get_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.getBlogCats = function(options) {
	var defaults = {requestFrom: 'getBlogCats' };
	var data = {module:'blog', action:'get_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.getFlash = function(options) {
	var defaults = {requestFrom: 'getFlash'};
	var data = {module:'flash', action:'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getFlashForm = function(options) {
	var defaults = {requestFrom: 'getFlash'};
	var data = {module:'flash', action:'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getFlashCats = function(options) {
	var defaults = {requestFrom: 'getFlashCats'};
	var data = {module:'flash', action:'get_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.getMusic = function(options) {
	var defaults = {requestFrom: 'getMusic'};
	var data = {module:'music', action:'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getMusicCats = function(options) {
	var defaults = {requestFrom: 'getMusicCats'};
	var data = {module:'music', action:'get_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.getPages = function(options) {
	var defaults = {requestFrom: 'getPages'};
	var data = {module:'page', action:'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getTips = function(options) {
	var defaults = {requestFrom:'getTips'};
	var data = {module:'editor', action:'get_tips'};
	this.run_module(defaults, data, options);
}

api.prototype.loadPage = function(options) {
	var defaults = {requestFrom: 'loadPage'};
	var data = {module:'page', action:'load'};
	this.run_module(defaults, data, options);
}

api.prototype.getStockImages = function(options) {
	var defaults = {requestFrom: 'getStockImages'};
	var data = {module:'photos', action:'get_stock'};
	this.run_module(defaults, data, options);
}

api.prototype.getScratch = function(options) {
	var defaults = {requestFrom: 'getScratch'};
	var data = {module:'editor', action:'get_scratch'};
	this.run_module(defaults, data, options);	
}

api.prototype.getScratchPage = function(options) {
	var defaults = {requestFrom: 'getScratchPage'};
	var data = {module:'editor', action:'get_template_page'};
	this.run_module(defaults, data, options);	
}

//requires hash or id of page
api.prototype.getPageThumb = function(options) {
	var defaults = {requestFrom: 'getPageThumb' };
	var data = {module:'page', action:'get_thumbnail'};
	this.run_module(defaults, data, options);
}

api.prototype.getPeople = function(options) {
	var defaults = {requestFrom: 'getPeople'};
	var data = {module:'people', action:'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getPeopleCats = function(options) {
	var defaults = {requestFrom: 'getPeopleCats'};
	var data = {module:'people', action:'get_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.getPhotos = function(options) {
	var defaults = {requestFrom: 'getPhotos'};
	var data = {module:'photos', action:'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getPhotoCats = function(options) {
	var defaults = {requestFrom: 'getPhotoCats'};
	var data = {module:'photos', action:'get_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.getSiteStyle = function(options) {
	var defaults = {requestFrom: 'getSiteStyle'};
	var data = {module:'page', action:'getSiteStyle'};
	this.run_module(defaults, data, options);
}

/**
* get Editor global Navigations
*/
api.prototype.getNavigations = function(options) {
	var defaults = {requestFrom: 'getNavigations'};
	var data = {module:'nav', action:'get_navigations'};
	this.run_module(defaults, data, options);	
}
/**
* save the nav screenshot generated
*/
api.prototype.saveNavScreenshot = function(options) {
	var defaults = {requestFrom: 'getNavigations'};
	var data = {module:'nav', action:'save_img'};
	this.run_module(defaults, data, options);
}
/**
* get Editor global Media Players
*/
api.prototype.getMediaPlayers = function(options) {
	var defaults = {requestFrom:'getMediaPlayers'};
	var data = {module:'editor', action:'get_media'};
	this.run_module(defaults, data, options);
}
/**
* get Editor Global User Products
*/
api.prototype.getProducts = function(options) {
	var defaults = {requestFrom: 'getProducts'};
	var data = {module:'products', action:'get'};
	this.run_module(defaults, data, options);	
}

api.prototype.getSavedNavs = function(options) {
	var defaults = {requestFrom: 'getSavedNavigations'};
	var data = {module:'nav', action:'get_saved_navigations'};
	this.run_module(defaults, data, options);	
}

api.prototype.getUser = function(options) {
	var defaults = {requestFrom: 'getUser'};
	var data = {module:'user', action:'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getVideos = function(options) {
	var defaults = {requestFrom: 'getVideos'};
	var data = {module:'videos', action:'get'};
	this.run_module(defaults, data, options);
}

//ew
api.prototype.getVideo = function(options) {
	var defaults = {requestFrom: 'getVideo'};
	var data = {module:'videos', action: 'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getVideoCats = function(options) {
	var defaults = {requestFrom: 'getVideos'};
	var data = {module:'videos', action:'get_cat'};
	this.run_module(defaults, data, options);
}

//user_id sends all playlists for user, id sends single playlist with that id
api.prototype.getVideoPlaylist = function(options) {
	var defaults = {requestFrom: 'getVideos'};
	var data = {module:'videos', action:'get_playlist'};
	this.run_module(defaults, data, options);
}

api.prototype.getFonts = function(options) {
	var defaults = {requestFrom: 'getFonts'};
	var data = {module:'editor', action:'get_fancytext_fonts', format: 'json'};
	this.run_module(defaults, data, options);
}

api.prototype.getUserNavigation = function(options) {
	var defaults = {requestFrom: 'getUserNavigation'};
	var data = {module:'nav', action:'get', format: 'json'};
	this.run_module(defaults, data, options);
}

api.prototype.getTemplates = function(options) {
	var defaults = {requestFrom: 'getTemplatePages'};
	var data = {module:'user', action:'get_templates', format: 'json'};
	this.run_module(defaults, data, options);	
}

api.prototype.getMBCats = function(options) {
	var defaults = {requestFrom: 'getMessageBoardCats'};
	var data = {module:'messages', action:'get_cat', format: 'json'};
	this.run_module(defaults, data, options);	
}

api.prototype.getLinkCats = function(options) {
	var defaults = {requestFrom: 'getLinkCats'};
	var data = {module:'links', action:'get_cat', format: 'json'};
	this.run_module(defaults, data, options);	
}

api.prototype.getMListCats = function(options) {
	var defaults = {requestFrom: 'getMListCats'};
	var data = {module:'mailinglist', action:'get_cat', format: 'json'};
	this.run_module(defaults, data, options);		
}

api.prototype.getComments = function(options) {
	var module = (options.module) ? options.module : 'blog';
	var defaults = {requestFrom: 'getComments'};
	var data = {module:module, action:'get_comments'};
	this.run_module(defaults, data, options);	
}

api.prototype.getGallery = function(options) {
	var defaults = {requestFrom: 'getGallery'};
	var data = {module:'gallery', action:'get_gallery'};
	this.run_module(defaults, data, options);
}

api.prototype.getGalleryList = function(options) {
	var defaults = {requestFrom: 'getGalleryChooser'};
	var data = {module:'gallery', action:'get_gallery_list'};
	this.run_module(defaults, data, options);
}

api.prototype.getHeadlines = function(options) {
	var defaults = {requestFrom: 'getHeadlines'};
	var data = {module:'blog', action:'get_headline'};
	this.run_module(defaults, data, options);
}

api.prototype.getLinks = function(options) {
	var defaults = {requestFrom: 'getUserLinks'};
	var data = {module:'links', action:'get'};
	this.run_module(defaults, data, options);
}

api.prototype.getTeamMembers = function(options) {
	var defaults = {requestFrom: 'getPeople'};
	var data = {module:'people', action:'get'};
	this.run_module(defaults, data, options);	
}

api.prototype.getPerson = function(options) {
	var defaults = {requestFrom: 'getPerson'};
	var data = {module:'people', action:'get_person'};
	this.run_module(defaults, data, options);		
}

api.prototype.getBio = function(options) {
	var defaults = {requestFrom:'getBio'};
	var data = {module:'user', action: 'get_bio'};
	this.run_module(defaults, data, options);
}

api.prototype.getMessages = function(options) {
	var defaults = {requestFrom:'getMessages'};
	var data = {module:'messages', action: 'get'};
	this.run_module(defaults, data, options);
}
// get blog object html
api.prototype.getBlogObject = function(options) {
	var defaults = {requestFrom:'getBlogObject'};
	var data = {module:'blog', action: 'get_object', format:'html'};
	this.run_module(defaults, data, options);	
}
// get product object with product category list by comma seperated ids
api.prototype.getProductObject = function(options) {
	var defaults = {requestFrom:'getProductObject'};
	var data = {module:'products', action: 'get_object'};
	this.run_module(defaults, data, options);	
}
// get product object with product list by comma seperated ids. returns html
api.prototype.getProductObjectList = function(options){
	var defaults = {requestFrom:'getProductList'};
	var data = {module:'products', action:'get_object_list', format:'html'};
	this.run_module(defaults, data, options);
}

api.prototype.getProductObjectNew = function(options){
	var defaults = {requestFrom:'getProductNew'};
	var data = {module:'products', action:'get_object_new', format:'html'};
	this.run_module(defaults, data, options);
}

api.prototype.getChannelXML = function(options){
	var defaults = {requestFrom:'getMediaPlayerXML'};
	var data = {module:'xml', action:'channelXML', format:'xml'};
	this.run_module(defaults, data, options);
}

////////  ///////   ///////
//    //  //    //  //    //
////////  //    //  //    //
//    //  //    //  //    //
//    //  ///////   /////// 
api.prototype.addPhoto = function(options) {
	var defaults = {requestFrom: 'addPhotos'};
	var data = {module:'photos', action:'add'};
	this.run_module(defaults, data, options);
}

api.prototype.addPhotoCat = function(options) {
	var defaults = {requestFrom: 'addPhotoCat'};
	var data = {module:'photos', action:'add_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.addMailingList = function(options) {
	var defaults = {requestFrom: 'addMailingList'};
	var data = {module:'mailinglist', action:'add_mailinglist'};
	this.run_module(defaults, data, options);
}


api.prototype.saveNavigation = function(options) {
	var defaults = {requestFrom:'saveNavigation'};
	var data = {module:'nav', action:'save', format:'json'};
	this.run_module(defaults, data, options);
}

api.prototype.saveBio = function(options) {
	var defaults = {requestFrom:'saveBio'};
	var data = {module:'user', action:'save_bio', format:'json'};
	this.run_module(defaults, data, options);	
}

api.prototype.postMessage = function(options) {
	var defaults = {requestFrom:'addMessage'};
	var data = {module:'messages', action:'add'};
	this.run_module(defaults, data, options);	
}

api.prototype.addComment = function(options) {
	var defaults = {requestFrom:'addComment'};
	var data = {module:'blog', action:'add_comment'};
	this.run_module(defaults, data, options);	
}

api.prototype.addBlog = function(options) {
	var defaults = {requestFrom:'addComment'};
	var data = {module:'blog', action:'add'};
	this.run_module(defaults, data, options);	
}

api.prototype.addMBCat = function(options) {
	var defaults = {requestFrom: 'addMessageBoardCats'};
	var data = {module:'messages', action:'add_cat'};
	this.run_module(defaults, data, options);	
}

api.prototype.addMLCat = function(options) {
	var defaults = {requestFrom: 'addMailingListCats'};
	var data = {module:'mailinglist', action:'add_cat'};
	this.run_module(defaults, data, options);	
}



////////  ////////  ////////
//        //           //
 //////   //////       //
      //  //           //
////////  ////////     //
api.prototype.saveGallery = function(options) {
	var defaults = {requestFrom:'saveGallery'};
	var data = {module:'gallery', action:'save', format:'json'};
	this.run_module(defaults, data, options);	
}
api.prototype.savePreview = function(options) {
	var defaults = {requestFrom:'savePreview'};
	var data = {module:'pages', action:'savePreview'};
	this.run_module(defaults, data, options);	
}
api.prototype.setPage = function(options) {
	var defaults = {requestFrom: 'setPage'};
	var data = {module:'page', action:'set'};
	this.run_module(defaults, data, options);
}

api.prototype.setPageScreenShot = function(options) {
	var defaults = {requestFrom: 'setPageScreenShot'};
	var data = {module:'page', action:'set_thumbnail'};
	this.run_module(defaults, data, options);
}

api.prototype.setPageActivity = function(options) {
	var defaults = {requestFrom: 'setPageActivity'};
	var data = {module:'pages', action:'activity'};
	this.run_module(defaults, data, options);	
}

api.prototype.setSiteStyle = function(options) {
	var defaults = {requestFrom: 'setSiteStyle'};
	var data = {module:'page', action:'setSiteStyle'};
	this.run_module(defaults, data, options);
}

api.prototype.setPhotoCat = function(options) {
	var defaults = {requestFrom: 'setPhotoCat'};
	var data = {module:'photos', action:'set_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.setPhoto = function(options) {
	var defaults = {requestFrom: 'setPhoto'};
	var data = {module:'photos', action:'set'};
	this.run_module(defaults, data, options);
}

api.prototype.setComment = function(options) {
	var module = (options.module) ? options.module : 'blog';
	var defaults = {requestFrom: 'setComment'};
	var data = {module:module, action:'set_comment'};
	this.run_module(defaults, data, options);
}

api.prototype.setBlog = function(options) {
	var defaults = {requestFrom: 'setBlog'};
	var data = {module:'blog', action:'set'};
	this.run_module(defaults, data, options);	
}

api.prototype.addCat = function(options) {
	var defaults = {requestFrom: 'addCat'};
	var data = {module:options.data.module, action:'add_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.setFlash = function(options) {
	var defaults = {requestFrom: 'setFlash'};
	var data = {module:'flash', action:'set', format:'html'};
	this.run_module(defaults, data, options);	
}

api.prototype.getFlashEmbed = function(options) {
	var defaults = {requestFrom: 'getFlashEmbed'};
	var data = {module:'flash', action:'get', format:'html'};
	this.run_module(defaults, data, options);	
}

///////   ////////  //
//    //  //        //
//    //  ///////   //
//    //  //        //
///////   ////////  ////////
api.prototype.delPhotoCat = function(options) {
	var defaults = {requestFrom: 'delPhotoCat'};
	var data = {module:'photos', action:'del_cat'};
	this.run_module(defaults, data, options);
}

api.prototype.delPhoto = function(options) {
	var defaults = {requestFrom: 'delPhoto'};
	var data = {module:'photos', action:'del'};
	this.run_module(defaults, data, options);
}

api.prototype.delComment = function(options) {
	var module = (options.module) ? options.module : 'blog';
	var defaults = {requestFrom: 'delComments'};
	var data = {module:module, action:'del_comment'};
	this.run_module(defaults, data, options);	
}

api.prototype.delBlog = function(options) {
	var defaults = {requestFrom: 'delBlog'};
	var data = {module:'blog', action:'del'};
	this.run_module(defaults, data, options);
}

api.prototype.delPage = function(options) {
	var defaults = {requestFrom:'delPage'};
	var data = {module:'pages', action:'del'};
	this.run_module(defaults, data, options);
}

// MISC STUFF LIKE EDITOR
api.prototype.customizerEditBlog = function(options) {
	var defaults = {requestFrom: 'customizerEditBlog'};
	var data = {module:'blog', action:'customizer_edit', format:'html'};
	this.run_module(defaults, data, options);
}

api.prototype.reportProblem = function(options) {
	var defaults = {requestFrom: 'reportProblem'};
	var data = {module:'editor', action:'report'};
	this.run_module(defaults, data, options);	
}

api.prototype.saveVPlaylist= function(options) {
	var defaults = {requestFrom: 'savePlaylist'};
	var data = {module:'videos', action:'add_playlist'};
	this.run_module(defaults, data, options);	
}

api.prototype.getVPlaylist= function(options) {
	var defaults = {requestFrom: 'getPlaylist'};
	var data = {module:'videos', action:'get_playlist'};
	this.run_module(defaults, data, options);	
}

// PHOTO EDITOR STUFF
api.prototype.saveNew = function(options) {
	var defaults = {requestFrom: 'saveImage'};
	var data = {module:'photos', action:'add'};
	this.run_module(defaults, data, options);	
}

