/*global $, window, FB */
var ELISAVIIHDE = ELISAVIIHDE || {};

$(function () {
	// DOM ready	
	ELISAVIIHDE.destinationURL = "";
	
	ELISAVIIHDE.login = {
		// ajax login init
	    inited:false,
		initAjaxLogin: function(url) {
		    if(this.inited === false){
	            var username = $("#username"), password = $("#password"),
	            savelogin = $("#savelogin"),
	            allFields = $([]).add(username).add(password);
	            ELISAVIIHDE.destinationURL = url !== "login.sl" ? url: location.href.split("#")[0];

	            $("#evlogin_ajax").live("submit", function() {
	                ELISAVIIHDE.login.doAjaxLogin(allFields, username, password, savelogin);
	            });
	            this.inited = true;		        
		    }
		    $("#loginmessage").hide();
			// get captcha parameters from server
			$.get('captcha.sl?count', function (data) {
			    var element = $("#captcha");
				if ('DISABLED' === data) {
				    element.data('disabled', true);
				}

				element.data('loginCount', data.loginCount);
				element.data('maxLoginCount', data.maximumLoginCount);
				//console.log(data.loginCount + " response count")
				ELISAVIIHDE.login.updateCaptcha();
			});
		},
		
		formHelper: function() {
			var me = this;
			
			me.timestamp = "";
			me.spinner = "";
			me.usernameInput = "username";
			me.passwordInput = "password";

			$.ajax({
				type: "GET",
				url: "login.sl",
				data: { "getspinner" : "true" },
				dataType: "json",
				async: false,
				success: function(data, status, xmlreq) {
					me.timestamp = data.timestamp;
					me.spinner = data.spinner;
					me.usernameInput = data.usernameInput;
					me.passwordInput = data.passwordInput;
				},
				error: function(xmlreq, status, err) {
					//updateMsg("Login error: " + status);
				}
			});
			
			return me;
		},
		
		checkLength: function(o,min,max) {
			if ( o.val().length > max || o.val().length < min ) {
				o.addClass('ui-state-error');
				return false;
			} else {
				return true;
			}
		},
		
		updateMsg: function(t) {
			var loginmsg = $("#loginmessage");
			
			loginmsg.text(t).show();
			setTimeout(function() {
				$.colorbox.resize();
			}, 200);
		},
		
		updateCaptcha: function() {
			var count, maximumCount, element = $("#captcha");
			// Counting is also done server-side. Counts are initialized to server value first.
			if (element.data('disabled')) {
			    element.hide();
				return;
			}
			
			count = element.data('loginCount') || 0;
			maximumCount = element.data('maximumLoginCount') || 3;
			//console.log(count + "/" + maximumCount)
			
			if (count >= maximumCount)
				ELISAVIIHDE.login.displayCaptcha();
			else
			    element.hide();

			element.data('loginCount', ++count)
		},
		
		displayCaptcha: function() {
			function captchaUrl () { return 'captcha.sl?refresh&' + Math.floor(Math.random()*100) }
			var element = $("#captcha");
			var elementImg = $("#captchaImg");
			element.show();
			
			if (elementImg.find('img').size() == 0) {
			    elementImg.append($('<img />'));
				// reload captcha with mouse click
			    elementImg.find('img').click(function () { 
					$(this).hide()
					.attr('src', captchaUrl())
			        .fadeIn();
				});
			}
			
			elementImg.find('img').click();
		},
		
		hideCaptcha: function() {
			$('#captcha').hide().data('count', 0);
		},

		// submit ajax login
		doAjaxLogin: function(allFields, username, password, savelogin) {
			var bValid = true, loginurl, spinner, timestamp, usernameInput,
			passwordInput, logindata = {},
			formHelper = ELISAVIIHDE.login.formHelper();
			
			$("#evlogin_ajax input[type='submit']").addClass("button_disabled").attr("disabled", "disabled");
			$("#evlogin_ajax .ajax_loader").removeClass("hidden");
			
			allFields.removeClass('ui-state-error');
			bValid = ELISAVIIHDE.login.checkLength(username, 3, 16) && ELISAVIIHDE.login.checkLength(password, 3, 16) ? true : ELISAVIIHDE.login.checkLength(password, 3, 16) ? true : false;

			if (bValid) {
				// ajax login
				loginurl = "login.sl";
				spinner = formHelper.spinner;
				timestamp = formHelper.timestamp;
				usernameInput = formHelper.usernameInput;
				passwordInput = formHelper.passwordInput;
				
				logindata = {
					"spinner" : spinner,
					"__timestamp" : timestamp,
					"ajax" : "true",
					"captcha" : $('#captcha input[name="captcha"]').attr("value")
				}
				
				logindata[usernameInput] = username.attr("value");
				logindata[passwordInput] = password.attr("value");
				
				if (savelogin.is(":checked")) logindata.savelogin = "true";

				$.ajax({
					type: "POST",
					url: loginurl,
					data: logindata,
					dataType: "text",
					success: function(data, status, xmlreq) {
						if (data == "TRUE") {
							ELISAVIIHDE.login.loginSuccess();
						} else {
							ELISAVIIHDE.login.loginFail();
						}
					},
					error: function(xmlreq, status, err) {
					    ELISAVIIHDE.login.updateMsg("Login error: " + status);
						$("#evlogin_ajax input[type='submit']").removeClass("button_disabled").removeAttr("disabled");
						$("#evlogin_ajax .ajax_loader").addClass("hidden");
					}
				});
			}else{
			    ELISAVIIHDE.login.loginFail();
			}
		},
		
		loginSuccess: function() {
			
			document.location.href = ELISAVIIHDE.destinationURL;
			ELISAVIIHDE.login.hideCaptcha();
		},
		
		loginFail: function() {
			ELISAVIIHDE.login.updateCaptcha();
			ELISAVIIHDE.login.updateMsg($("#login_dialog").attr("data-error_message"));
			$("#evlogin_ajax input[type='submit']").removeClass("button_disabled").removeAttr("disabled");
			$("#evlogin_ajax .ajax_loader").addClass("hidden");
		},
		
		// login page init
		init: function() {
			var uname = $("#username").val();
			if (uname == null || uname == "") {
		  		$("#username").focus();
			} else {
		   		$("#password").focus();
			}
			$("#evlogin").submit(function(){
				$("#evlogin input[type='submit']").addClass("button_disabled").attr("disabled", "disabled");
				$("#evlogin .ajax_loader").removeClass("hidden");
				$("#hash").val(location.hash);
				return true;
			});
		}
	};
});
