/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * File:		MashScript.js
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *
 * Purpose:	MashScript API  "Connecting Flash to JavaScript"
 *			
 * Copyright:	Synaptic Mash 2009 All Rights Reserved
 *
 * Classes:
 *		
 * Requirements:
 *
 * Developer contact:	Sina Yeganeh <sina.yeganeh@synapticmash.com>
 * 
 * Notes:
 * ------
 * Jason Hiller was here.
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */


var MashScript =
{
	_Instances: [],
	
	GetInstance: function(object_id)
	{
		for(var i=0; i<MashScript._Instances.length; i++)
		{
			if (MashScript._Instances[i].flashID == object_id)
			{
				return MashScript._Instances[i];
			}
		}
		
		return null;
	},
	
	Register: function(api_instance)
	{
		MashScript._Instances.push(api_instance);
	},
	
	UnRegister: function(api_instance)
	{
		for (var x = 0; x < MashScript._Instances.length; x++)
		{
			if (MashScript._Instances[x].flashID == api_instance.flashID)
			{
				MashScript._Instances.splice(x, 1);
			}
		}
	}
}

var MashScriptAPI = Class.create({

	flashMovie: null,
	flashID: null,
	context: null,
	pathToGallery:null,
	isFlashInit: false,
	
	onFlashInit: null,
	
	initialize: function(flashID)
	{
		MashScript.Register(this);
		
		this.flashID = flashID;
	},
	
	VersionCheck: function(version)
	{
		if (version == "1.11")
		{
			this.flashMovie.VersionCheck(true);
		}
		else
		{
			this.flashMovie.VersionCheck(false);
		}
	},
	
	GetUserName: function(Parcel, RequestCounter)
	{
		
		SMLayoutManager.Log.Debug("[MashScript.GetUserName] - hit");
		
		var RenderUserName = "RenderUserName";
		
		var message = "Invoke {BOFlashInterface} '"+RenderUserName+"' out {Result}\n";
		
		SMLayoutManager.Log.Debug("[MashScript.GetUserName] - " + message);
		
		this.GetResults(message, RequestCounter);
		
	},
	
	Log: function(Parcel, RequestCounter)
	{
		SMLayoutManager.Log.Debug("[MashScript.Log] - Log - " + Parcel.logTypeString);
		
		Parcel = this.SetupInvoke("Log", null, null, Parcel.Message, Parcel.logTypeString);
		
		this.GetResults(Parcel, RequestCounter);
		
	},
	
	SetValue: function(Parcel, RequestCounter) 
	{
		var junk = this.SetupFlashParameters(this.context, Parcel.SubContext, Parcel.PropertyName, Parcel.Value, Parcel.ValueNumeric);
		junk += this.SetupInvoke("SaveHash", null);
		
		this.GetResults(junk, RequestCounter);
	},
	GetValue: function(Parcel, RequestCounter) 
	{
		var junk = this.SetupFlashParameters(this.context,Parcel.SubContext,Parcel.PropertyName);
		junk += this.SetupInvoke("GetHash", null);
		
		SMLayoutManager.Log.Debug("[MashScript.GetValue] - Junk - " + junk);
		
		this.GetResults(junk, RequestCounter);
	},
	GetValueList: function(Parcel, RequestCounter) 
	{

		var junk = this.SetupFlashParameters(this.context,Parcel.SubContext,Parcel.PropertyName, '', '', Parcel.PageStart, Parcel.PageSize);
		junk += this.SetupInvoke("GetHashListJavascript", Parcel.JoinMethodString, Parcel.SortOrderString);
		
		SMLayoutManager.Log.Debug("[MashScript.GetValueList] - JoinMethod - " + Parcel.JoinMethod);
		SMLayoutManager.Log.Debug("[MashScript.GetValueList] - JoinMethodString - " + Parcel.JoinMethodString);
		SMLayoutManager.Log.Debug("[MashScript.GetValueList] - " + junk);
		
		this.GetResults(junk, RequestCounter);
	},
	
	SetFlashParameters: function(context)
	{		
		this.flashMovie = document.getElementById(this.flashID);	
		this.context = context;
		this.isFlashInit = true;
		
		SMLayoutManager.Log.Debug("[MashScript.initialize]" +this.flashMovie);
		
		if (this.onFlashInit != null)
		{
			SMLayoutManager.Log.Debug("[MashScript.SetFlashParams] onFlashInit()");
			this.onFlashInit(this);
		}
	},
	
	SetupFlashParameters: function(Context, SubContext, PropertyName, PropertyValue, PropertyValueNumeric, PageStart, PageSize) 
	{
		SMLayoutManager.Log.Debug("[MashScript.SetupFlashParameters] SetupFlashParameters hit");
		var result = "";
		
		result  += "Construct 'SynapticMash.BOFlashInterface+FlashParameters, SynapticMashBusinessObjects' out {Hash}\n";
		result  += "Assign {Hash:context} '"+ Context +"'\n";
		result  += "Assign {Hash:subContext} '"+ SubContext +"'\n";
		result  += "Assign {Hash:propertyName} '"+ PropertyName+"'\n";
		if (PropertyValue != null && PropertyValue != 'undefined' && PropertyValue != '')
		{
			result  += "Assign {Hash:value} '"+ PropertyValue+"'\n";
		}
		if (PropertyValueNumeric != null && PropertyValueNumeric != 'undefined' && PropertyValueNumeric != '')
		{	
			result  += "Assign {Hash:valueNumericString} '"+ PropertyValueNumeric+"'\n";
		}
		if (PageStart != null && PageStart != 'undefined' && PageStart != '')
		{
			result  += "Assign {Hash:PageStartString} '"+ PageStart+"'\n";	
		}
		if (PageSize != null && PageSize != 'undefined' && PageSize != '')
		{
			result  += "Assign {Hash:PageSizeString} '"+ PageSize+"'\n";	
		}
		
		SMLayoutManager.Log.Debug("[MashScript.SetupFlashParameters] results -" + result);
		return result;
		
	},
	
	SetupInvoke: function(functionName, joinMethod, sortOrder, message, messageType)
	{
		if (joinMethod != null && joinMethod != 'undefined' && joinMethod != '')
		{
			var result = "Invoke {BOFlashInterface} '"+functionName+"' {Hash} '"+joinMethod+"' '"+sortOrder+"' out {Result}\n";
		}
		else if (functionName == "Log" && this.context != null)
		{
			var result = "Invoke {BOFlashInterface} '"+functionName+"' '"+message+"' '"+messageType+"' '"+this.context+"' out {Result}\n";
		}
		else
		{
			var result = "Invoke {BOFlashInterface} '"+functionName+"' {Hash} out {Result}\n";
		}
		
		return result;
	},
		
	GetResults: function (resultData, RequestCounter)
	{
		SMLayoutManager.Log.Debug("[MashScript.GetResults] " + resultData);
		
		var junk = resultData;
		
		var templateControl = SMLayoutManager.GetControl(this.flashID.split('_')[0] + ".TemplateControl");
		
		var templateObjects = new Array();
		templateObjects.push(templateControl.CreateTemplateObject('CreateObject', 'BOFlashInterface', 'BOFlashInterface'));
		
		SMLayoutManager.Log.Debug("[MashScript.GetResults] - Didn't Break - " + junk);
		
		templateControl.ExecuteTemplate('{Result}', junk, templateObjects, this._TemplateCB.bindAsEventListener(this, RequestCounter));

	},
	
	_TemplateCB: function (result, RequestCounter)
	{
		
		SMLayoutManager.Log.Debug("[MashScript.FlashInitializer] " + RequestCounter);
		
		SMLayoutManager.Log.Debug(result);
		
		if (result.Output.isJSON())
		{
			result = result.Output.evalJSON();
			
			if (result.Text.isJSON())
			{
				result = result.Text.evalJSON();
			}
		}
		
		SMLayoutManager.Log.Debug(result);
		
		this.flashMovie.SMJavascriptReturn(result, RequestCounter);
	},
	
	FlashInitializer: function (param1)
	{
		SMLayoutManager.Log.Debug("[MashScript.FlashInitializer] " + arguments);
		SMLayoutManager.Log.Debug("[MashScript.FlashInitializer] " + param1);
		SMLayoutManager.Log.Debug("[MashScript.FlashInitializer] " + (this.flashMovie));
		SMLayoutManager.Log.Debug("[MashScript.FlashInitializer] FI =" + this.flashMovie.FlashInitializer);
		
		this.flashMovie.FlashInitializer(param1);
	},
	
	FlashDebug: function (trace)
	{
		SMLayoutManager.Log.Debug(trace);
	}

});
