/*********************************************************
* Objekt an Mauszeiger ausrichten
*********************************************************/

(function(jQuery) {
	jQuery.fn.obj2MousePos = function( par ) { // Objekt an der Mausposition ausrichten 
		return this.each(function(){
			var posX = parseInt('0');
			var posY = parseInt('0');

			var e = par.curEvent;
			var holdInDocument = par.holdInDocument;

			var offW = jQuery(this).outerWidth();
			var offH = jQuery(this).outerHeight();
			
			var mouseX = e.pageX;
			var mouseY = e.pageY;

			var corX = ( par.corX ) ? parseInt(par.corX) : 0;
			var corY = ( par.corY ) ? parseInt(par.corY) : 0;

			var documentX = jQuery(document).width();
			var documentY = jQuery(document).height();

			if( holdInDocument ) {
				if(( mouseX + corX ) > 0 ) {
					posX = mouseX + corX;
				}
				if(( mouseX + corX + offW ) > documentX ) {
					posX = documentX - offW;
				}
				if(( mouseY + corY ) > 0 ) {
					posY = mouseY + corY;
				}
				if(( mouseY + corY + offH ) > documentY ) {
					posY = documentY - offH;
				}
			}
			else {
				posX = mouseX + corX;
				posY = mouseY + corY;
			}

			jQuery(this).css({ position: 'absolute', left: parseInt(posX), top: parseInt(posY) });
		});
	};
})(jQuery);


/*********************************************************
* Objekt zentrieren
*********************************************************/

(function(jQuery) {
	jQuery.fn.center = function() { // Absolute Zentrierung eines Elementes
		return this.each(function(){
			var posX = parseInt(jQuery(window).width()/2) - parseInt(jQuery(this).outerWidth()/2);
			var posY = parseInt(jQuery(window).height()/2) - parseInt(jQuery(this).outerHeight()/2);
		
			jQuery(this).css({ position: 'absolute', left: parseInt(posX + jQuery(document).scrollLeft()), top: parseInt(posY + jQuery(document).scrollTop()) });
		});
	};
})(jQuery);


/*********************************************************
* Web-App-Framework
*********************************************************/

(function(jQuery) {
	var options; // Objekt für Optionen
	var appProtection = {}; // Objekt für Ladekontrolle von Apps
	
	jQuery.fn.webFramework = function(parameter) {
		parameter = jQuery.extend({}, jQuery.fn.webFramework.defaults, parameter); // Parameter um Standardwerte erweitern, die nicht angegeben wurden
		options = parameter;
		
		return this.each(function() { // Objektliste durchlaufen
			_init(jQuery(this));
		});
		
		function _init(el) { // Funktionsaufruf pro App
			if(!appProtection[jQuery(el).attr('id')]) { // jede App nur einmal initiieren
				_initGlobalEvents(el); // Globale Events registrieren
				if(options.loadCSS) { // Wenn loadCSS gesetzt, dann CSS vorladen
					_loadCSS(el);
				}
			}	
		}
		
		function loadApp(el, e, appPos) { // App laden
			if(!appProtection[jQuery(el).attr('id')]) { // Nur einmal einbetten und Events registrieren
				_loadInitHTML(el); // HTML ins DOM laden
				_registerAppEvents(el); // App-spezifische Events laden
				appProtection[jQuery(el).attr('id')] = true; // App sperren
			}
			
			if(jQuery(el).is(':hidden')) { // Wenn App nicht sichtbar: öffnen
				openApp(el, e, appPos);
			}
			else { // andernfalls: schließen
				closeApp(el);
			}
		}
		
		function loadContentData(el, curEl) { // Daten in den Content-Bereich laden
			var curURL = jQuery(curEl).attr('href'); // URL des geklickten Menüpunktes
			
			jQuery(el).find(options.menuPath).find('li.' + options.currentMenuClass).removeClass(options.currentMenuClass);
			jQuery(curEl).closest('li').addClass(options.currentMenuClass);
			
			/* Ersetzen mit AJAX-Funktion – Start */
			switch(curURL) {
				case '/spez/':
					var html = $.("#toolbox-content").html();
				break;
				case '/kontakt/':
					var html = $.("#toolbox-contact").html();					
				break;
				case '/notizen/':
					var html = 'Notizen machen';
				break;
			}
			
			$(el).find(options.contentPath).html(html);
			/* Ersetzen mit AJAX-Funktion – Ende */
			
			/* AJAX Start
			$.getJSON(options.serverPath + '?action=contentHTML&url=' + curURL + '&random' + '=' + Math.random() * 100000, function(data){
				var html = ( data.contentHTML == null || data.contentHTML == 'false' || data.contentHTML == '0' ) ? '' : data.contentHTML;
				$(el).find(options.contentPath).html(html);
			});
			AJAX ENDE */
		}
		
		function openApp(el, e, appPos) { // App öffnen
			if(jQuery(el).is(':hidden')) {
				if(appPos == 'center') {
					jQuery(el).center();
				}
				else {
					jQuery(el).obj2MousePos({ // An Mausposition ausrichten
						curEvent: e,
						holdInDocument: true, // Element darf nicht aus dem Dokument „springen“
						corX: options.mouseCorrectionX, // Positionskorrektur X – App-Fenster entsprechend unter dem Mauszeiger platzieren
						corY: options.mouseCorrectionY // Positionskorrektur Y – App-Fenster entsprechend unter dem Mauszeiger platzieren
					});
				}
				jQuery(el).fadeIn(); // App einblenden
			}	
		}
		
		function closeApp(el) { // App schließen
			if(!jQuery(el).is(':hidden')) {
				jQuery(el).fadeOut(); // App ausblenden
			}	
		}
		
		function _loadInitHTML(el) {
			
			/* AJAX Start
			$.getJSON(options.serverPath + '?action=initHTML&random' + '=' + Math.random() * 100000, function(data){
				var html = ( data.initHTML == null || data.initHTML == 'false' || data.initHTML == '0' ) ? '' : data.initHTML;
				jQuery(el).append(html);
				jQuery(el).css({display: 'none', position: 'absolute'});
			});
			AJAX Ende */
			
			/* Ersetzen mit AJAX-Funktion – Start */
			var html = '<div class="header"><div class="handle">Webraumfahrer Menü-Box</div><div class="close"><a href="#">X</a></div></div><ul class="menu"><li><a href="/spez/">Spez. Inhalt</a></li><li><a href="/kontakt/">Kontakt</a></li><li><a href="/notizen/">Notizen</a></li></ul><div class="content"><p>Standard-Inhalte</p></div>';
			jQuery(el).append(html);
			jQuery(el).css({display: 'none', position: 'absolute'});
			/* Ersetzen mit AJAX-Funktion – Ende */
		}
		
		function _loadCSS(el) { // App-spezifische CSS-Datei einbetten
			jQuery('head').append('<link rel="stylesheet" href="' + options.rootURL + '/' + options.cssDir + '/webapp.css" type="text/css" media="screen,projection" charset="utf-8" />');
		}
		
		function _modifier(e) { // Sind Modifier-Tasten (ALT || SHIFT || STRG) gedrückt?
			altPressed = ( e.altKey ) ? true : false; // Alt-Taste gedrückt
			shiftPressed = ( e.shiftKey ) ? true : false; // Shift-Taste gedrückt
			ctrlPressed = ( e.ctrlKey ) ? true : false; // Shift-Taste gedrückt

			return (altPressed || shiftPressed || ctrlPressed) ? true : false;
		}
		
		function _initGlobalEvents(el) { // Globale, nicht App-Fenster spezifische Events registrieren
			jQuery(document).dblclick(function(e){ // Doppelklick zum Aufrufen der App
				loadApp(el, e);
				if (document.selection) { // Eventuelle Selektionen des Doppelklicks deselektieren
					document.selection.empty();
				}
				else {
					window.getSelection().removeAllRanges();
				}
				return false;
			});
			jQuery(document).keydown(function(e){ // Tastenkürzel definieren
				if(e.keyCode == 83 && document.activeElement.nodeName != 'INPUT' && document.activeElement.nodeName != 'TEXTAREA' && !_modifier(e)) { // Aufruf der App, wenn „s“ gedrückt wird (und Fokus nicht auf input oder Textfeld liegt)
					loadApp(el, e, 'center');
					return false;
				}
				
				if(e.keyCode == 27) { // Schließen der App, wenn „Esc“ gedrückt wurde
					closeApp(el);
					return false;
				}
			});
		}
		
		function _registerAppEvents(el) { // App-Fenste spezifische Events registrieren
			if(options.handlePath) {
				jQuery(el).draggable({ // Drag&Drop-Verhalten
					handle: jQuery(el).find(options.handlePath),
					cursor: 'move',
					containment: 'parent'
				});
			}
			
			if(options.closePath) { // Schließen-Button
				jQuery(el).find(options.closePath).click(function(){ // Schließen-Button
					closeApp(el);
					return false;
				});
			}
			
			if(options.menuPath) { // Inhaltswechsler
				jQuery(el).find(options.menuPath).find('a').click(function(){
					loadContentData(el, $(this));
					return false;
				});
			}
		}	
	}
	
	jQuery.fn.webFramework.defaults = { // Standardwerte festlegen
		serverPath: 'http://www.sadano.de', // Pfad zur Server-Route-Datei
		handlePath: '.handle', // Pfad zum Drag-handle-Element
		closePath: '.close', // Pfad zum Schließen-Button
		menuPath: '.menu', // Pfad zum Menü
		contentPath: '.content', // Pfad zum Inhaltsbereich
		rootURL: (window.location.hostname) ? window.location.hostname : '.', // Root-URL für CSS-Einbettung
		loadCSS: true, // CSS-Dateien automatisch laden?
		cssDir: 'css', // Pfad zum Stylesheet-Ordner
		mouseCorrectionX: 0, // Mauszeigerkorrektur X
		mouseCorrectionY: 0, // Mauszeigerkorrektur Y
		currentMenuClass: 'chosen' // Klassenname für den aktuell gewählten Menüpunkt
	};
})(jQuery);


/*********************************************************
* Start Web-App-Framework
*********************************************************/

function startWebFramework() {	
	$('body').prepend('<div id="web-app-frame"></div>');
	$('#web-app-frame').webFramework({
		mouseCorrectionX: -100,
		mouseCorrectionY: -10,
		rootURL: '.'
	});
}


/*********************************************************
* Document-Ready
*********************************************************/

$(document).ready(function() { // Wenn DOM geladen, dann ...
	startWebFramework(); // Start Web-App-Framework
});