//REQUIRES JQUERY & YAHOO CROSS-FRAME+EVENTING TO BE INCLUDED IN HOSTED PAGE 
function DoInkEditor(pathToProxy)
{		
	//CONSTS - RECEIVABLE MESSAGES TO TRANSLATE TO CALLBACKS
	var ERROR_LOADING = "ERROR_LOADING"
	var NO_JAVA = "NO_JAVA"
	var OLD_JAVA = "OLD_JAVA"
	var DONE_LOADING = "DONE_LOADING";
	var FRAME_GAME_SAVED = "FRAME_GAME_SAVED";
	var EDITOR_OPENED = "EDITOR_OPENED";
	var EDITOR_CLOSED = "EDITOR_CLOSED";
	var CLIP_SHARED = "CLIP_SHARED";
	var CLIP_RENDERED = "CLIP_RENDERED";
	var FORCE_SAVE_ALL_COMPLETE = "FORCE_SAVE_ALL_COMPLETE";
	var PROJECT_FULLYPERSISTED = "PROJECT_FULLYPERSISTED";
	var GOTO_BAZAAR = "GOTO_BAZAAR";
	
	//CONSTS - SENDABLE MESSAGES TO DOINK SERVER
	var FORCE_SAVE = "SAVE";
	var FORCE_OPEN = "OPEN";
	var FORCE_RELOAD = "RELOAD";
	var FORCE_UPDATE = "UPDATE";
	var FORCE_RESIZE = "RESIZE";
		
	//PRIVATE VARS
	var editorServer = "http://75.101.128.227";	
	var clientCallbacks = {};
	
	//INITIALIZATION			
	YAHOO.util.CrossFrame.onMessageEvent.subscribe(
	    function (type, args, obj) 
	    {
	        var message = args[0];	        
	        var domain = args[1];

	     	var params = message.split(";");
		 	var functionName = params.shift();		// now params[0] is the first parameter
		 						 			 			 
		 	if(clientCallbacks[functionName] != undefined && clientCallbacks[functionName] != null)
		 	{		 	
		 		clientCallbacks[functionName].apply(this, params); //use apply to make sure arguments are received correctly
		 	}		 		     						     	
	    }
	);
	
	//PRIVATE METHODS
	function sendMessage(message)
	{
		YAHOO.util.CrossFrame.send(
			editorServer + "/static/crossframe/proxy.html",
			"frames['projectFrame']",
			message);
	}

	function injectAppletIframe(containerId, template, options)
	{
		var iframeContainer = $("#"+containerId);
		
		var src = editorServer + '/editoriframe?pathToProxy='+pathToProxy+'&template='+template;
		
		if(options != undefined && options != null)
		{
			for ( optionKey in options ) {  			
				src += "&" + optionKey + "=" + options[optionKey];
			}
		}
						
		$('<iframe id="projectFrame" name="projectFrame"'+
				'src="' + src + '"' +
				'style="overflow: hidden" allowtransparency="true"' +
				'frameborder="0" border="0"'+
				'width="'+options.width+'px"' +
				'height="'+options.height+'px"' +
				'scrolling="no"></iframe>').appendTo(iframeContainer);
	}
	
	//KNOWN options : primeVM = true/false - should we boot the JVM on iframe injection, or wait till someone (or client) tries to open the editor
	
	//PUBLIC METHODS	
	this.embed = function(containerId, options)
	{
		injectAppletIframe(containerId, "embed_create", options);
	}
		
	this.forceSaveAll = function() { sendMessage(FORCE_SAVE); }	
	this.forceOpen = function() { sendMessage(FORCE_OPEN); }
	this.forceReload = function() { sendMessage(FORCE_RELOAD); }
	this.forceUpdate = function(project, props, tools, authToken) {
		if (authToken != null && authToken != "null") {
			authToken = encodeURIComponent(authToken);
		}
		sendMessage(FORCE_UPDATE + ";" + project + ";" + props + ";" + tools + ";" + authToken);
	}
	this.forceResize = function(width, height) { sendMessage(FORCE_RESIZE + ";" + width + ";" + height); }
	
	//PUBLIC REGISTER / OVER-RIDE CALLBACKS	
	this.onBrowserHasNoJava = function(callback) { clientCallbacks[NO_JAVA] = callback; }
	this.onBrowserHasOldJava = function(callback) { clientCallbacks[OLD_JAVA] = callback; }
	this.onLoadError = function(callback) { clientCallbacks[ERROR_LOADING] = callback; }
	this.onLoaded = function(callback) { clientCallbacks[DONE_LOADING] = callback; }
	this.onOpened = function(callback) { clientCallbacks[EDITOR_OPENED] = callback; }
	this.onClipPublished = function(callback) { clientCallbacks[CLIP_SHARED] = callback; }
	this.onClipRendered = function(callback) { clientCallbacks[CLIP_RENDERED] = callback; }
	this.onSaveAllComplete = function(callback) { clientCallbacks[FORCE_SAVE_ALL_COMPLETE] = callback; }
	this.onProjectFullyPersisted = function(callback) { clientCallbacks[PROJECT_FULLYPERSISTED] = callback; }
	this.onGotoBazaar = function(callback) { clientCallbacks[GOTO_BAZAAR] = callback; }
}
