(function($) {
	$.fn.extend({
		
		
		
		xploginpi3: function(options) {
			/**
			Default-Werte
			*/
			var defaults = {
				'ajaxURL': "index.php?eID=tx_xplogin_pi3_ajax",
				'loggedIn': false,
				'objStr': {
					'messages': 						'#tx_xplogin_pi3_messages',
					'login': 								'.loginForm',
					'login_submit': 				'#tx_xplogin_pi3_loginFormSubmit',
					'login_username': 			'#tx_xplogin_pi3_username',
					'login_password': 			'#tx_xplogin_pi3_password',
					'login_message': 				'.loginForm .message',
					'logout': 							'.logoutForm',
					'logout_submit': 				'#tx_xplogin_pi3_logoutFormSubmit',
					'logout_message': 			'.logoutForm .message',
					'changePassword': 			'.changePassword',
					'passwordLost': 				'.passwordLost',
					'postLoginFunction': 	function (data) {},
					'postLogoutFunction': 	function (data) {}
				}
			};
			
			
			/**
			"Globals"
			*/
			// Konfiguration
			var options =  $.extend(defaults, options);
			// HTML-Objekte
			var c, obj, login, logout, changePassword, passwordLost;
			// Objekte
			var messages = {};
			
			
			/**
			Funktionsbibliothek
			*/
			var fn = {
				tryLogin: function(params){ // fn.tryLogin
					if (params.username == "" || params.password == ""){
						$(c.objStr.login_message).html(fn.ll('ll_usernameOrPasswordMissing'));
						return false;
					}
					
					/**
					Login-Anfrage senden
					*/
					$(c.objStr.login_message).html(fn.ll('ll_progress'));
					$.get(
						c.ajaxURL, // URL
						{ 'tx_xplogin_pi3[action]': 'login', 'tx_xplogin_pi3[u]': params.username, 'tx_xplogin_pi3[p]': params.password, 'fuckIEAndCacheControl': Math.floor(Math.random()*11) }, // URL-Parameter
						function(data){
							if (!fn.objCount(data)){
								$(c.objStr.login_message).html(fn.ll('ll_noResponseFromServer'));
							} else if (data.status == "error") {
								switch (data.reason){
								case "usernameOrPasswordMissing":
									$(c.objStr.login_message).html(fn.ll('ll_usernameOrPasswordMissing'));
									break;
								case "userAlreadyLoggedIn":
									$(c.objStr.login_message).html(fn.ll('ll_userAlreadyLoggedIn'));
									break;
								case "userIsBanned":
									$(c.objStr.login_message).html(fn.ll('ll_userIsBanned'));
									break;
								case "loginFails":
									$(c.objStr.login_message).html(fn.ll('ll_loginFails'));
									passwordLost.show();
									break;
								}
							} else if (data.status == "success") {
								$(c.objStr.login_message).html(fn.ll('ll_loginGranted'));
								if (typeof c.postLoginFunction == "function"){
									changePassword.show();
									data.messages = messages;
									c.postLoginFunction(data);
								}
							}
						}, // callback
						"json" // type
					);
				}, // fn.tryLogin -->
				
				
				tryLogout: function(params){ // fn.tryLogout
					
					/**
					Logout-Anfrage senden
					*/
					$(c.objStr.logout_message).html(fn.ll('ll_progress'));
					$.get(
						c.ajaxURL, // URL
						{ 'tx_xplogin_pi3[action]': 'logout', 'fuckIEAndCacheControl': Math.floor(Math.random()*11) }, // URL-Parameter
						function(data){
							if (!fn.objCount(data)){
								$(c.objStr.login_message).html(fn.ll('ll_noResponseFromServer'));
							} else if (data.status == "error") {
								
							} else if (data.status == "success") {
								$(c.objStr.logout_message).html(fn.ll('ll_logoutDone'));
								if (typeof c.postLogoutFunction == "function"){
									data.messages = messages;
									c.postLogoutFunction(data);
								}
							}
						}, // callback
						"json" // type
					);
				}, // fn.tryLogout -->
				
				
				/**
				Liefert den Text
				*/
				ll: function (key) {
					if (fn.objCount(messages) < 1){
						/**
						Texte holen
						*/
						$(c.objStr.messages).find("li").each(function () {
								messages[$(this).attr("class")] = $(this).html();
						});
					}
					
					if (key && messages[key]) return messages[key];
					else return "";
				},
				
				
				/**
				Zaehlt die Elemente in einem Object
				*/
				objCount: function (obj){
					var objCount = 0;
					for (_obj in obj) objCount++;
					return objCount;
				}
			}; // fn -->
			
			
			/**
			Schleife fuer jedes gefundene Element
			*/
			return this.each(function() { 
				c 							= options;
				obj 						= $(this);
				login 					= obj.find(c.objStr.login);
				logout 					= obj.find(c.objStr.logout);
				changePassword = obj.find(c.objStr.changePassword);
				passwordLost 		= obj.find(c.objStr.passwordLost);
				
				$(c.objStr.login_message).html(fn.ll('ll_login'));
				$(c.objStr.logout_message).html(fn.ll('ll_logout'));
				
				
				passwordLost.hide();
				
				if (c.loggedIn){
					login.hide();
					logout.show();
					changePassword.show();
					$(c.objStr.logout_submit).click(function () {
							fn.tryLogout();
							return;
					});
				} else {
					login.show();
					changePassword.hide();
					// Login senden bei Klick auf den Button
					$(c.objStr.login_submit).click(function () {
							fn.tryLogin({
									'username': $(c.objStr.login_username).val(),
									'password': $(c.objStr.login_password).val()
							});
							return;
					});
					// ... beim Druecken von Enter
					$(c.objStr.login_username+', '+c.objStr.login_password).bind('keypress', function(e) {
							if ((e.keyCode || e.which) == 13) {
								fn.tryLogin({
										'username': $(c.objStr.login_username).val(),
										'password': $(c.objStr.login_password).val()
								});
							} 
					});

					
					logout.hide();
				}
			}); // Hauptprogramm -->
		}
	});

})(jQuery);

