/**
 * according the flex id to get its instance
 * @param appName, flex id
 * @return flex instance
 */
function getFlexApp(appName) {
	if (navigator.appName.indexOf ("Microsoft") !=-1) {
		return window[appName];
	} else {
		return document[appName];
	}
}

function loopCheckAndCall(id, func, data){
	var initChartInterval = setInterval( function(){
		var app = getFlexApp(id);
		if ( typeof(app) != 'undefined' && typeof(app[func]) != 'undefined') {
			try{
				if(data == null)
					app[func]();
				else
					app[func](data);
			}finally{
				clearInterval( initChartInterval );
			}
		}
	}, 500);
}

/**
 * set up a timer loop to check the flex has already embed in html
 * @param id, flex embed id
 * @param dataObj, transfer data
 * @return void
 */
function initChart(id, dataObj) {

//	console.log( app );
	var initChartInterval = setInterval( function(){
		var app = getFlexApp(id);
		if ( typeof(app) != 'undefined' && typeof(app.initChart) != 'undefined') {
			//console.log("succ init")
			try{
				//if app.initChart function occur an error without be try~catched in flex, the js loop will not be terminated;
				app.initChart(dataObj);
			}finally{
				clearInterval( initChartInterval );
			}
		}
//		else
//		console.log("checking");
	}, 500);

//	if (app == undefined){
//	console.log( id + " app:" + app );
//	setTimeout(_initChart(id, dataObj), 500);
//	}
//	else if(app.initChart == undefined){
//	console.log(id + " func:" + app.initChart );
//	setTimeout(_initChart(id, dataObj), 500);
//	}
//	else{
////	console.log(id + " " + "succ" );
//	app.initChart(dataObj);

//	}
}


function displayFlexCompareChart(params){
	var chartParams = formatDataForFlexCompareChart( params );
	if( params.position ){
		initChart(params.position, chartParams);
	}	
}

function displayFlexPieChart(params){
	params.type = "piechart";
	displayFlexCompareChart( params );	
}

function displayFlexColumnChart(params){
	params.type = "columnchart";
	displayFlexCompareChart( params );	
}

/**
 * 
 * @param params
 * @return
 */
function formatDataForFlexPieChart( params ){
	params.type = "piechart";
	return formatDataForFlexCompareChart( params );
}

function formatDataForFlexColumnChart( params ){	
	params.type = "columnchart";
	return formatDataForFlexCompareChart( params );
}

function formatDataForFlexCompareChart( params ){
	var dataObj = new Object();
	dataObj.direction =  params.direction ? params.direction : "S";
	dataObj.type =  params.type ? params.type : "piechart";
	dataObj.outputFormat =  params.outputFormat ? params.outputFormat : "";

	var paramsArray = new Array();
	$.each( params.value, function(k,v){		
		paramsArray.push( k + ":" + v ) ;
	});
	dataObj.values = paramsArray.join( '|' );
	return dataObj;
}

var SWF_ROOT = elggHost + "vendors/kalengo/swfs/";
var LOCALE_ROOT = SWF_ROOT + "locale/en_US/";

var chartTypeMap = {
	'stockChart' : {
		"url":SWF_ROOT + "stockchart.swf",
		"localeUrl": LOCALE_ROOT + "stockChartResources.swf"
	},
	'assetAllocation' : {
		"url":SWF_ROOT + "assetAllocation.swf",
		"localeUrl": LOCALE_ROOT + "assetAllocationResources.swf"
	},
	"optimization" : {
		"url":SWF_ROOT + "optimization.swf",
		"localeUrl": LOCALE_ROOT + "optimizationResources.swf"
	},
	"optimizationPieChart" : {
		"url":SWF_ROOT + "chart2.swf"
	},
	"pieChart" : {
		"url":SWF_ROOT + "chart1.swf",
		"localeUrl": LOCALE_ROOT + "chart1Resources.swf"
	},
	"riskReturnChart" : {
		"url":SWF_ROOT + "RiskReturnChart.swf",
		"localeUrl": LOCALE_ROOT + "riskReturnResources.swf"
	},
	"motionChart" : {
		"url":SWF_ROOT + "motionchart.swf"
	}	
};

/**
 * needed fields
 * @param config.type
 * @param config.htmlId
 *
 * option fields
 * @param config.width
 * @param config.height
 * @param config.flashPlayerVersion
 * @param config.flashVars
 * @param config.flashMode
 */
function embedSWF(config){
	if (!config || (typeof(config.type) == 'undefined') || (typeof(config.htmlId) == 'undefined')) 
		throw new Error("Parameters missing some required fileds");
	
	var flashUrl = chartTypeMap[config.type]['url'];
	var id = config.htmlId;
	
	var width = (typeof(config.width) != 'undefined') ? config.width : 300;
	var height = (typeof(config.height) != 'undefined') ? config.height : 200;
	
	var flashPlayerVersion = (typeof(config.flashPlayerVersion) != 'undefined') ? config.flashPlayerVersion : "9.0.0";
	var flashVars = (typeof(config.flashVars) != 'undefined') ? config.flashVars : {};
	if (chartTypeMap[config.type]['localeUrl']) {
		flashVars.resourceModuleURLs = chartTypeMap[config.type]['localeUrl'];
		flashVars.localeChain = "en_US";
	}
	
	var flashMode = (typeof(config.flashMode) != 'undefined') ? config.flashMode : {wmode:"transparent"};
	
	var expressInstallSrc = SWF_ROOT + "expressInstall.swf";
	
	var callback = (typeof(config.callback) != 'undefined') ? config.callback : null;
	swfobject.embedSWF(flashUrl, id,  width, height, flashPlayerVersion, expressInstallSrc, flashVars, flashMode, null, callback);
}


