//==============MASTER OBJECT, ALWAYS INSTANTIATED AS TOOLSCONTEXT IN PAGE ONLOAD==================
TOOLSCONTEXT_Master_LoadScript = function(scriptName) {
	//console.log('loading ' + scriptName);
	if (TOOLSCONTEXT_Master_ScriptLoadStarted[scriptName]) {
		//console.log(scriptName + ' already loading');
		return 'already loading';
	}
	TOOLSCONTEXT_Master_ScriptLoadStarted[scriptName] = true;
	var scriptPath = TOOLSCONTEXT_Master_ScriptRootPath + 'js/' + scriptName;
	if (scriptName.indexOf('.php') == -1) {
		scriptPath += '.js';
	}
	//this.uriRoot + this.rootToVersion  + 'js/' + scriptName + '.js';
	var loadScript = document.createElement('script');
	
   	loadScript.src = scriptPath;
	//this.scriptLoadCallbacks[scriptName] = onloadcallback; //different browsers have different support for script.onload handler so better to use our own registration method
   	loadScript.type="text/javascript";
   	document.getElementsByTagName('head')[0].appendChild(loadScript); 

};
TOOLSCONTEXT_Master.prototype.loadScript = function(scriptName, onloadcallback) {
	this.loadedScripts[scriptName] = true;
	var scriptPath = this.uriRoot + this.rootToVersion  + 'js/' + scriptName + '.js';
	var loadScript = document.createElement('script');
   	loadScript.src = scriptPath;
	this.scriptLoadCallbacks[scriptName] = onloadcallback; //different browsers have different support for script.onload handler so better to use our own registration method
   	loadScript.type="text/javascript";
   	document.getElementsByTagName('head')[0].appendChild(loadScript); 	
};

TOOLSCONTEXT_Master.prototype.registerLoaded = function(scriptName) {
	if (this.scriptLoadCallbacks[scriptName]) {
		this.scriptLoadCallbacks[scriptName]();
	}
};

function TOOLSCONTEXT_Master_LoadScriptsInOrder() {
	//load scripts delaying so that later scripts don't try to load before earlier ones they depend on are loaded
	var currentScriptInfo = TOOLSCONTEXT_Master_ScriptsInOrder[TOOLSCONTEXT_Master_ScriptLoadIndex];
	var currentScriptName = currentScriptInfo[0];
	var currentScriptPath = currentScriptInfo[1];
	if (typeof TOOLSCONTEXT == 'object') {
		if (TOOLSCONTEXT[currentScriptName]) {
			TOOLSCONTEXT_Master_ScriptLoadIndex++;
			var currentScriptInfo = TOOLSCONTEXT_Master_ScriptsInOrder[TOOLSCONTEXT_Master_ScriptLoadIndex];
			if (!currentScriptInfo) {
				return;
			}
			currentScriptName = currentScriptInfo[0];
			currentScriptPath = currentScriptInfo[1];
			//console.log('moving on to ' + currentScriptName + ' = ' + currentScriptPath);
		} 
	}
	TOOLSCONTEXT_Master_LoadScript(currentScriptPath);
	window.setTimeout("TOOLSCONTEXT_Master_LoadScriptsInOrder()", 100);
}

//function TOOLSCONTEXT_Master(uriRoot, rootToVersion, accessLevel, submitTo) {
function TOOLSCONTEXT_Master(uriRoot, rootToVersion, pathToRoot, submitTo, baseRef, pagesFile, accessLevel, pageId) {
	var browser=navigator.appName;
	var b_version=navigator.appVersion;
	var version=parseFloat(b_version);
	
	if (document.all) { //todo: merge with dom/utility method
		this.classAttName = 'className';
	} else {
		this.classAttName = 'class';
	}
	//if (typeof parent.TOOLSCONTEXT == 'undefined') {
		this.pagesFile = pagesFile;
		this.loadedScripts = new Array();
		this.scriptLoadCallbacks = new Array();
		this.mainWindow = self;
		this.mainDocument = this.mainWindow.document;
		this.mainEditorWindow = self;
		this.mainEditorDocument = this.mainEditorWindow.document;
		this.uriRoot = uriRoot;
		this.rootToVersion = rootToVersion;
		if (uriRoot == '/') {
			this.uriToVersion = '/' + rootToVersion;
		} else {
			this.uriToVersion = uriRoot + '/' + rootToVersion;
		}
		this.submitTo = submitTo;
		this.pageId = pageId;
		this.baseRef = baseRef;
		this.accessLevel = accessLevel;
		this.pathToRoot = pathToRoot;
		this.doNothing = function() { return null; };
		if (typeof TOOLSCONTEXT_editAreaMap != 'undefined') this.editAreaMap = TOOLSCONTEXT_editAreaMap;
		if (typeof TOOLSCONTEXT_data != 'undefined') {
			for (key in TOOLSCONTEXT_data) {
				this[key] = TOOLSCONTEXT_data[key];
			}
		}
	//} else {
	//	TOOLSCONTEXT = parent.TOOLSCONTEXT;
	//}
}
function TOOLSCONTEXT_loadMaster(uriRoot, rootToVersion, pathToRoot, submitTo, baseRef, pagesFile, accessLevel, pageId, addScripts) {
	if (typeof parent.TOOLSCONTEXT == 'undefined') {
		if (typeof TOOLSCONTEXT == 'object') {
			alert('TOOLSCONTEXT master object may only be loaded once');
			return;
		}
		TOOLSCONTEXT = new TOOLSCONTEXT_Master(uriRoot, rootToVersion, pathToRoot, submitTo, baseRef, pagesFile, accessLevel, pageId);
	} else {
		if ((typeof TOOLSCONTEXT != 'undefined') && (TOOLSCONTEXT.editor)) {
			TOOLSCONTEXT = parent.TOOLSCONTEXT;
			//instant editor toolbar expanded - stop here, do not reload scripts and data
			return;
		} else {
			TOOLSCONTEXT = new TOOLSCONTEXT_Master(uriRoot, rootToVersion, pathToRoot, submitTo, baseRef, pagesFile, accessLevel, pageId);
		}
		// load data in current frame
		if (typeof TOOLSCONTEXT_data != 'undefined') {
			for (key in TOOLSCONTEXT_data) {
				TOOLSCONTEXT[key] = TOOLSCONTEXT_data[key];
			}
		}
	}
	TOOLSCONTEXT_Master_ScriptRootPath = uriRoot + rootToVersion;
	TOOLSCONTEXT_Master_ScriptsInOrder = [['dom', 'include/dom'],['ajax', 'include/ajax'], ['utility', 'include/utility']];
	for (var i = 0; i < addScripts.length; i++) {
		TOOLSCONTEXT_Master_ScriptsInOrder.push(addScripts[i]);
	}
	
	window.setTimeout("TOOLSCONTEXT_Master_LoadScriptsInOrder()", 100);
}
	var TOOLSCONTEXT;
	var TOOLSCONTEXT_Master_ScriptLoadIndex = 0;
	var TOOLSCONTEXT_Master_ScriptsInOrder = new Array();
	var TOOLSCONTEXT_Master_ScriptLoadStarted = new Array();
	var TOOLSCONTEXT_Master_ScriptRootPath = '';

