
var pluginVer = [requiredMajorVersion,requiredMinorVersion,requiredRevision].join(".");
var flashlmsadapter;
var API;
var api;
var apiObj;
var debugEnabled = false;
var _GET;
var srch = top.location.search.substring(1);
var embedded = false;
var aiccFound = false;

function doRegExMatch(txt,pattern)
{
	txt = doDecode(txt);
	pattern = doDecode(pattern);
	
	var re = new RegExp(pattern);
	
	if(txt.match(re))
	{
		// We have a match
		flashlmsadapter.setVariable('processEditActionRegex|true');
	}
	else
	{
		// We DON'T have a match
		flashlmsadapter.setVariable('processEditActionRegex|false');
	}
}

function doDecode(txt)
{
	var tmp = "";
	var arrText = txt.split(" ");

	for(var i=0;i<arrText.length;i++)
	{
		tmp += String.fromCharCode(arrText[i]);
	}

	return tmp;
}

function getExternalValue(method)
{
	var result = "some result from javascript";
	flashlmsadapter.setVariable(method+"|"+result);
}

function setFlashFocus()
{
	try
	{
		window.focus(document);
		document.flashObj.focus();
		flashlmsadapter.setVariable("focusEditDefault|");
	}
	catch(e){}
}

function doFocus()
{
	window.focus(document);
}

function GetVars()
{
	var query, qs = top.location.search.substring(1);
	var queries = qs.split(/\&/);
	for (var i=0; i<queries.length; i++)
	{
		query = queries[i].split(/\=/);
		this[query[0]] = (typeof query[1] == 'undefined') ? null : unescape(query[1]).replace(/\+/g," ");
	}
}

function openWindow(url_name,window_name,w,h,options) {
	if (options === null) { options=""; }
	winopts = "toolbar=" + (options.indexOf("toolbar") == -1 ? "no," : "yes,") +
	"location="  + (options.indexOf("location") == -1 ? "no," : "yes,") +
	"menubar=" + (options.indexOf("menubar") == -1 ? "no," : "yes,") +
	"scrollbars=" + (options.indexOf("scrollbars") == -1 ? "no," : "yes,") +
	"status=" + (options.indexOf("status") == -1 ? "no," : "yes,") +
	"resizable=" + (options.indexOf("resizable") == -1 ? "no," : "yes,") +
	"copyhistory=" + (options.indexOf("copyhistory") == -1 ? "no," : "yes,") +
	"width=" + w + ",height=" + h;
	return window.open(url_name,window_name,winopts);
}

function openPrintableSteps()
{
	var simPrintableStepsWin = openWindow('printable/printable.htm','simPrintableSteps',800,600,'scrollbars,resizable');
	if(simPrintableStepsWin)
	{
		simPrintableStepsWin.print();
	}
	else
	{
		alert('Unable to open printable steps window.  Please disable any popup blockers and try again.');
	}
}

function openPrintableDebug(debug)
{
	var simPrintableDebugWin = openWindow('assets/blank.htm','simPrintableDebug',800,600,'scrollbars,resizable');
	if(simPrintableDebugWin)
	{
		setTimeout(function(){simPrintableDebugWin.document.body.innerHTML = unescape(debug);},500);
	}
	else
	{
		alert('Unable to open printable steps window.  Please disable any popup blockers and try again.');
	}
}

function quit()
{
	if(API.__inited__)
	{
		API.LMSCommit();
		API.LMSFinish();
	}
	setTimeout(function(){top.close();},1000);
}

function exposeDataModel(data_model)
{
	//try
	//{
		// do something with the data_model
		if(window.opener)
		{
			if(embedded && window.opener.sendSimApi)
			{
				window.opener.sendSimApi(API.toJSONString());
			}

			if(window.opener.updateStatus)
			{
				window.opener.updateStatus('Exposed Data Model From Simulation:\n'+unescape(data_model));
			}
		}
	//} catch (e) { }
}

function finish()
{
	try {
		if (API && API.__inited__) {
			API.LMSCommit('');
			API.LMSFinish('');
		}
	} catch (e) { }
}

function resizeWindow(p_width,p_height)
{
	var w = 0;
	var h = 0;
	var t = 0;
	var l = 0;

	if(windowControl)
	{
		if(fullscreen)
		{
			w = screen.availWidth;
			h = screen.availHeight;
			top.resizeTo(w,h);
			top.moveTo(0,0);
		}
		else
		{
			w = parseInt(p_width,10);
			h = parseInt(p_height,10);
			top.resizeTo(w,h);
			top.moveTo((screen.availWidth-w)/2,(screen.availHeight-h)/2);
		}
	}
}

function sendResult(lessonName, studentName, totalToInclude, totalIncorrect, score, status, assessmentURI, incNumberList)
{
	var args = {};

	args.lessonName		= lessonName;
	args.studentName	= studentName;
	args.totalToInclude	= totalToInclude;
	args.totalIncorrect	= totalIncorrect;
	args.score			= score;
	args.status			= status;
	args.assessmentURI	= assessmentURI;
	args.incNumberList	= incNumberList;

	ResultHandler.init(args);
	ResultHandler.post();
}

function noFlash()
{
	document.getElementById('noFlashContent').style.display = 'block';
	document.getElementById('flashContent').style.display = 'none';
}

// Catch extraneous FSCommands from within Flash
allowScale = function(){ };
allowscale = function(){ };
showMenu = function(){ };
showmenu = function(){ };

// ----------------------------------------------
// Events
// ----------------------------------------------

window.onload=function()
{
	BrowserHandler.init();
	resizeWindow(simWidth,simHeight);
	document.body.scroll="no";

	doFocus();
};

window.onunload=function()
{
	finish();
	
	if(window.opener && !window.opener.closed)
	{
		if(window.opener.__is_uPerform_Sim_Index__ && window.opener.opener && !window.opener.opener.closed)
		{
			window.opener.close();
		}
	}
	
};

window.onbeforeunload=function(evnt)
{
	if(!evnt)
	{
		evnt = window.event;
	}

	// Implement a beforeunload handler
	//checkExit(evnt); 
};

// ----------------------------------------------
// Page initialization
// ----------------------------------------------
function init()
{
	document.getElementById('noFlashContent').style.display = 'none';

	_GET = new GetVars();
	var lesson_status;

	if(window.opener && !window.opener.closed)
	{
		if(window.opener.__is_uPerform_Sim_Index__)
		{
			API = window.opener.API;
			apiVer = window.opener.apiVer;
		}
	}

	if(parent.document.location.search)
	{
		var aiccparms_raw = parent.document.location.search;
		var aiccparms = aiccparms_raw.toLowerCase();
		if (aiccparms.indexOf('aicc_sid') >=0 && aiccparms.indexOf('aicc_url') >=0)
		{
			if (lmsDebug)
			{
				alert('AICC API PARAMS FOUND');
			}
			var params = parseParams(aiccparms_raw);
			var protocol = parent.document.location.protocol;
			if (params['aicc_url'].indexOf(protocol) == -1)
			{
				params['aicc_url'] = protocol + "//" + params['aicc_url'];
			}
			
			// AICC STUB

			alert('Content launched via AICC.  Please configure your LMS to utilize the correct version of SCORM for this content.');

			parent.apiVer = "1.2";
			aiccFound = true;
		}
	}

	if(!aiccFound)
	{
		if(API == null && (srch.indexOf("embedded=true") < 0))
		{
			// 1.2 check
			if(apiVer == "SCORM1.2")
			{
				API = getAPI_12();
				if (API != null)
				{
					if (_Debug)
					{
						alert('SCORM 1.2 API FOUND');
					}
					// Wrap 1.2 API with CheckedAPI to maintain initialization status
					API = new CheckedAPI(API);
				}
			}
			
			// 1.2 check
			if(apiVer == "SCORM2004")
			{
				// 2004 check
				api = getAPIHandle();
				if(api != null)
				{
					if (_Debug)
					{
						alert('SCORM 2004 API FOUND');
					}
					// Create fake wrapper API to map 1.2 calls to 2004
					API = new APIObject();
				}
			}
		}
	}

	// No valid SCORM or AICC API can be found.
	// Use cookie-based LocalAPI to catch all 1.2 calls
	if(API == null)
	{
		API = new LocalAPI({name:simAPIName+mode,'lifetime':48});
		apiVer = "Local";
	}

	if(srch.indexOf("embedded=true") > -1)
	{
		embedded = true;
		apiVer = "SCORM1.2";
	}

	if(API && !API.__inited__ && hasFlash)
	{
		API.LMSInitialize('');
	}

	if(API && API.__inited__ && hasFlash)
	{
		lesson_status = API.LMSGetValue('cmi.core.lesson_status');
		
		if(lesson_status)
		{
			if(lesson_status.indexOf('n') == 0)
			{
				API.LMSSetValue('cmi.core.lesson_status','incomplete');
				API.LMSCommit('');
			}
		}
	}

	flashlmsadapter = new FlashLMSAdapter(API);
	flashlmsadapter.register();

	var varsObj = {};
	varsObj.__SIM_MODE__ = mode;
	varsObj.__REVIEWER_ENABLED__ = reviewerEnabled;
	varsObj.__API_DATA_MODEL__ = flashlmsadapter._data_model;
	varsObj.__DEBUG_ENABLED__ = debugEnabled;
	varsObj.__API_VER__ = apiVer;
	varsObj.__BROWSER__ = BrowserHandler.browser;
	varsObj.__BROWSER_VER__ = BrowserHandler.version;
	varsObj.__OS__ = BrowserHandler.OS;

	flashlmsadapter.loadFlash('assets/rwd_simulation_output.swf','#FFFFFF', varsObj);

	if(handleRightClick)
	{
		RightClickHandler.init();
	}
	KeyHandler.init();
	MouseWheelHandler.init();
}
