var appManager;
var windowManager

var debugMode = false;
var mail = false;
var events = false;
var myLocationsApp = false;
var mySchoolsApp = false;
var myFriendsApp = false;
var mapApp = false;
var dashApp = false;
var exportApp = false;

var locationId = false;
var editLocationId = false;

var mailToName = false;
var mailToUserName = false;

var addLocationToEvent = false;

var suggestFriendsName = false;
var suggestFriendsUserName = false;
var suggestFriendsImagePath = false;

var sendFriendRequestUserUrlName = false;
var sendFriendRequestUserName = false;
var sendFriendRequestUserImagePath = false;

var addEvent = false;
var addPrivateEvent = false;
var editEventId = false;
var duplicateEventId = false;
var eventObjectType = false;
var eventObjectId = false;

var mailToName = false;
var mailToUserName = false;

function AppManagerClass() {
	var apps = new Array;
	var appCounter = 0;
	var requirements = new Array;
	var appStarts = 0;
		
	this.init = function() {
		apps = new Array;
		appCounter = 0;
		requirements = new Array;
		
		mousePointerLabel = new MousePointerLabelClass();
		
		this.runningApps = new Array;

		windowManager = new AppWindowManagerClass();
		windowManager.name = 'windowManager';
		windowManager.init();
		
		if(userLoggedIn) {
			this.addApp('mail');
			this.addApp('events');
			this.addApp('myFriendsApp');
			this.addApp('dashApp');
		}
		
		this.addApp('MYLOCATIONSAPP');
	}

	this.addApp = function(appId, startParam, call) {
		apps[appId] = new Array;
		apps[appId]['id'] = appId;
		apps[appId]['startParam'] = startParam;
		apps[appId]['failedStarts'] = 0;
		apps[appId]['ready'] = false;
		
		if(call) {
			apps[appId]['call'] = call;
		}
		
		appCounter++;
		jsonGetData('json/applications/getAppInfo.php?appId=' + appId, 'appManager.addAppInt');				
	}

	this.addAppInt = function(Object) {
		if(Object["status"] && Object["status"] == 'ok') {
			var appId = Object["appId"];
			if(apps[appId]['call']) {
				apps[appId]['onloadFunction'] = apps[appId]['call'];
			} else {
				apps[appId]['onloadFunction'] = Object["onloadFunction"];
			}
			
			if(Object["requirements"]) {
				apps[appId]['requirements'] = new Array;

				for(fCnt = 0; fCnt < Object["requirements"].length; fCnt++) {
					path = Object["requirements"][fCnt]['Path'];
				
					if(!requirements[path]) {
						requirements[path] = new Array;
						requirements[path]["type"] = Object["requirements"][fCnt]['Type'];
						requirements[path]["loaded"] = false;
						requirements[path]["loading"] = false;
					}
			
					apps[appId]['requirements'][fCnt] = new Array;
					apps[appId]['requirements'][fCnt] = path;
				}
			} else {
				apps[appId]['requirements'] = false;		
			}
			apps[appId]['status'] = 'active';
		}
	}

	this.isAppReady = function(appId) {
		if(apps[appId]) {
			if(apps[appId]['status'] == 'active') {
				return(apps[appId]["ready"]);
			} else {
				return(false);
			}
		} else {
			return(false);
		}
	}
	
	this.startApp = function(appId) {
		if(apps[appId]) {
			if(apps[appId]['status'] == 'active') {
				if(apps[appId]['failedStarts'] <= 70) {
					if(apps[appId]['requirements']) {
						var requirementsLoaded = true;
						for(z1 = 0; z1 < apps[appId]['requirements'].length; z1++) {
							if(!this.isRequirementLoaded(apps[appId]['requirements'][z1])) {
								if(!this.isRequirementLoading(apps[appId]['requirements'][z1])) {
									path = apps[appId]['requirements'][z1];
		
									if(requirements[path]["type"] == 'Javascript') {
										this.loadScript(path);						
									} else if(requirements[path]["type"] == 'Stylesheet') {
										this.loadStylesheet(path);							
									}
									
									requirementsLoaded = false;
								} else {
									requirementsLoaded = false;
								}		
							}
						}
						
						if(requirementsLoaded) {
							apps[appId]['ready'] = true;
							if(apps[appId]['startParam']) {	
								eval(apps[appId]['onloadFunction'] + "('" + apps[appId]['startParam'] + "');");	
							} else {
								eval(apps[appId]['onloadFunction'] + "();");					
							}	
						} else {
							// Not all Requirements are loaded yet => try again later
							apps[appId]['failedStarts']++;							
							setTimeout('appManager.startApp("' + appId + '")',300);	
						}
					} else {
						// No Requirements => Start App
						apps[appId]['ready'] = true;
						if(apps[appId]['onloadFunction'] && apps[appId]['onloadFunction']!='false') {
							if(apps[appId]['startParam']) {
								eval(apps[appId]['onloadFunction'] + "('" + apps[appId]['startParam'] + "');");	
							} else {
								eval(apps[appId]['onloadFunction'] + "();");					
							}
						}
					}
				} else {
					// Some Requirements failed to load
					apps[appId]['status'] = 'inactive';

					// Try anyway
					if(apps[appId]['startParam']) {	
						eval(apps[appId]['onloadFunction'] + "('" + apps[appId]['startParam'] + "');");	
					} else {
						eval(apps[appId]['onloadFunction'] + "();");					
					}
				}
			} else {
				// App not active yet => Try again later
				apps[appId]['failedStarts']++;				
				setTimeout('appManager.startApp("' + appId + '")',300);
			}
		}
	}
		
	this.isRequirementLoaded = function(path) {
		if(requirements[path]) {
			if(requirements[path]["loaded"]) {
				return(true);
			} else {
				return(false);
			}
		} else {
			return(false);
		}
	}	
	
	this.isRequirementLoading = function(path) {
		if(requirements[path]) {
			if(requirements[path]["loading"]) {
				return(true);
			} else {
				return(false);
			}
		} else {
			return(false);
		}
	}
	
	this.loadStylesheet = function(path) {
		requirements[path]["loading"] = true;
		var documentHead = document.getElementsByTagName("head")[0];         
			
		var element = document.createElement('link');		
		element.type = 'text/css';
		element.rel = 'stylesheet';	
		element.href = '/styles/' + path;
		element.media = 'screen';
		documentHead.appendChild(element);		
		requirements[path]['loaded'] = true;
		requirements[path]['loading'] = false;
	}

	
	this.loadScript = function(path) {
		requirements[path]["loading"] = true;
		var documentHead = document.getElementsByTagName("head")[0];         
		
		var element = document.createElement('script');
		
		element.type = 'text/javascript';
				
		element.src = '/scripts/' + path;
		
		documentHead.appendChild(element);
		setTimeout('appManager.setRequirementLoaded("' + path + '")', 200);
	}
		
	this.setRequirementLoaded = function(path) {
		if(requirements[path]['type'] == 'Javascript') {
			eval("var type = typeof(" + path.replace(/\//g, "").replace(/\./g, "") + ")");
			if(type=='function') {
				setTimeout('appManager.setRequirementLoadedInt("' + path + '")', 200);
			} else {
				setTimeout('appManager.setRequirementLoaded("' + path + '")', 200);
			}
		} else {
			requirements[path]['loaded'] = true;
			requirements[path]['loading'] = false;
		}
	}

	this.setRequirementLoadedInt = function(path) {
		requirements[path]['loaded'] = true;
		requirements[path]['loading'] = false;	
	}
	
	this.runApp = function(startParam, app) {
		this.runningApps[startParam] = app;
	}
}

function MousePointerLabelClass() {
	var addedToDom = false;
	var visible = false;
	
	this.display = function(evt, value) {
		if(!addedToDom) {
			var mpContainer = document.createElement("DIV");
			mpContainer.id = "mpContainer";
			mpContainer.className = 'mpContainer';
			mpContainer.style.position = 'absolute';
			
			var mpValue = document.createElement("DIV");
			mpValue.id = "mpValue";
			mpValue.className = 'mpValue';

			mpContainer.appendChild(mpValue);

			document.getElementsByTagName("body")[0].appendChild(mpContainer);
			
			addedToDom = true;
		}
		
		visible = true;

		mousePosition = getMousePosition(evt);
		
		document.getElementById("mpContainer").style.top = Math.ceil(mousePosition["y"] + 20) + 'px';
		document.getElementById("mpContainer").style.left = Math.ceil(mousePosition["x"] - 100) + 'px';
		
		document.getElementById("mpValue").innerHTML = value;
		document.getElementById("mpContainer").style.visbility = 'hidden';
		document.getElementById("mpContainer").style.display = 'block';
		
		containerWidth = document.getElementById("mpContainer").offsetWidth;

		document.getElementById("mpContainer").style.left = Math.ceil(mousePosition["x"] - containerWidth / 2) + 'px';			
		document.getElementById("mpContainer").style.visbility = 'visible';
	}

	this.clear = function() {
		if(addedToDom) {
			document.getElementById("mpValue").innerHTML = '';
			document.getElementById("mpContainer").style.display = 'none';				
		}

		visible = false;
	}
}

var mousePointerLabel = new MousePointerLabelClass();

function iAmAt(objectType, objectId) {
	if(userLoggedIn) {
		var output = new Object();
		output.objectType = objectType;
		output.objectId = objectId;
			
		outputString = JSONstring.make(output);

		jsonPostData('json/places/savePlace.php', escape(outputString), 'iAmAtInt');			
	} else {
		this.messageWindow = new MessageWindowClass();
		this.messageWindow.className = 'eventCreatorMessageWindow';
		this.messageWindow.title = 'Bitte anmelden...';
		this.messageWindow.message = 'Du musst dich anmelden um diese Funktion benutzen zu k&ouml;nnen.<br /><br /><li><a href="/login"><b>Zur Anmeldung</b></a>';
		this.messageWindow.name = 'messageWindow';
		this.messageWindow.displayCurtain = false;
		this.messageWindow.display();			
	}
}

function iAmAtInt(Object) {
	if(Object) {
		if(Object["status"]) {
			if(Object["status"]=='ok') {
				this.messageWindow = new MessageWindowClass();
				this.messageWindow.className = 'eventCreatorMessageWindow';
				this.messageWindow.title = 'Gespeichert...';
				this.messageWindow.message = 'Erfolgreich gespeichert.';
				this.messageWindow.name = 'messageWindow';
				this.messageWindow.displayCurtain = false;
				this.messageWindow.display();				
			}
		}
	}
}
