﻿///<reference path="dialogcommon.js" />
///<reference path="membership.js" />

if (Settings == null || typeof(Settings) != "object") { var Settings = new Object(); }
Settings.Alerts = new Object();

/*********************
	USER SETTINGS
*/
Settings.Init = function() {
	///<summary>Initiates the settings</summary>
	var user = Membership.CurrentUser;
	if (user) {
		$("txtSettingsFirstname").value = user.FirstName;
		$("txtSettingsLastname").value = user.LastName;
		$("txtSettingsMail").value = user.Email;
		$("txtSettingsOldPassword").value = "";
		$("txtSettingsNewPassword").value = "";
		$("txtSettingsRepeatPassword").value = "";
		$("txtSettingsMobile").value = user.Mobile;
		$("chkSettingsNewsletter").checked = user.Newsletter;
		Settings.ShowAlerts();
	}
}
Settings.ShowAlerts = function() {
	///<summary>Shows the alerts for the current users
	if (!(Membership.CurrentUser.Alerts))
		return;
		
	$$("#existingAlerts tr").each(function(tr) {
		if (tr.id != "alertGridHeader") tr.remove(); 
	});
	$$("#alertEditButtons tr").invoke("remove");
	Membership.CurrentUser.Alerts.each( function(a, index) {
		Settings.Alerts.Show(a, index);
	});
	$$("#existingAlerts tbody tr").each(function(tr, index) {
		if (index % 2 == 0)
			tr.addClassName("alt");
	});
}
Settings.DeleteUser = function() {
    var user = Membership.CurrentUser;
    if (confirm('Er du sikker på at du ønsker å slette brukeren din og deaktivere alle varslinger for denne?')) {
        Dialog.InvokeUserHandler("deleteuser", user, 
            function() { 
                Dialog.Close("personalSettingsBox","site"); 
                Dialog.InvokeUserHandler("logout", null, function() { document.location.reload(); }); 
            }, 
            function() { alert('Failed to delete user'); });
    }
}
Settings.Save = function() {
	///<summary>Saves the current user settings</summary>
	var errorLabel = "settingsError";
	
	if (!Validator.CheckRequired("txtSettingsFirstname", "Fornavn er ikke fylt ut", errorLabel))
		return;
	if (!Validator.CheckRequired("txtSettingsLastname", "Etternavn er ikke fylt ut", errorLabel))
		return;
	
	var user = Membership.CurrentUser;
	user.FirstName = $F("txtSettingsFirstname");
	user.LastName = $F("txtSettingsLastname");
	user.Newsletter = $("chkSettingsNewsletter").checked;
	
	Dialog.InvokeUserHandler("updateuser", user, 
		function() { Dialog.Close("txtSettingsFirstname", "site"); },
		function() { alert("Det oppstod en feil under oppdatering"); });
}
Settings.ChangePassword = function() {
	///<summary>Changes the password</summary>
	var errorLabel = "changePasswordError";
	if (!Validator.CheckRequired("txtSettingsOldPassword", "Gammelt passord er ikke fylt ut", errorLabel))
		return;
	if (!Validator.CheckRequired("txtSettingsNewPassword", "Nytt passord er ikke fylt ut", errorLabel))
		return;
	if (!Validator.CheckPassword("txtSettingsNewPassword", "Passordet må være minst 7 tegn", errorLabel))
		return;
	if (!Validator.CheckRequired("txtSettingsRepeatPassword", "Du må repetere passordet", errorLabel))
		return;
	if (!Validator.CheckEqual("txtSettingsRepeatPassword", "txtSettingsNewPassword", "Passordene er ikke like", errorLabel))
		return;
	
	Dialog.InvokeUserHandler("changepassword", { 
		oldpassword: $F("txtSettingsOldPassword"),
		newpassword: $F("txtSettingsNewPassword"),
		passwordrepeat: $F("txtSettingsRepeatPassword") },
		function(transport) { 
			if (transport.responseJSON) {
				var response = transport.responseJSON;
				if (response.Error && response.Error.length > 0) {
					Validator.ShowError(null, errorLabel, response.Message);
				}
			} else {
				Settings.CancelChangePassword();
			}
		},
		function(transport) { 
			alert("Feil under innlogging. Prøv igjen senere."); 
		});
}
Settings.ShowChangePassword = function() {
	///<summary>Shows the password change dialog
	var container = $("personalSettingsBox");
	container.style.height = container.getHeight() + "px";
	$("personalSettingsFieldset").up("td")
	Effect.Fade("personalSettingsFieldset", { duration:0.3, afterFinish: function() {
		Effect.Appear("changePasswordFieldset", { duration:0.3, afterFinish: function() {
			var lbbg = $("newAlertBG");
			var editor = $("alertEditor");
			var dialog = $("changePasswordFieldset");
			lbbg.absolutize();
			lbbg.clonePosition(editor);
			lbbg.style.zIndex = 1100;
			lbbg.style.height = (lbbg.getHeight() - dialog.getHeight() - 10) + "px";
			Effect.Appear(lbbg, {from:0, to:0.8, duration:0.3});
			$("btnChangePassword").hide();
			$("btnSettingsSave").hide();
		}});
	}});
}
Settings.CancelChangePassword = function() {
	///<summary>Cancels the password change dialog
	Effect.Fade("changePasswordFieldset", { duration:0.3, afterFinish: function() {
		Effect.Appear("personalSettingsFieldset", { duration:0.3, afterFinish: function() {
			$("txtSettingsOldPassword").value = "";
			$("txtSettingsNewPassword").value = "";
			$("txtSettingsRepeatPassword").value = "";
			Effect.Fade("newAlertBG");
			$("personalSettingsBox").style.height="";
			$("btnChangePassword").show();
			$("btnSettingsSave").show();
		}});
	}});
}



/*********************
	ALERT SETTINGS
*/
Settings.Alerts.Add = function() {
	///<summary>Adds a new alert</summary>
	Settings.Alerts.Edit(-1);
}
Settings.Alerts.Delete = function(index) {
	///<summary>Deletes an alert</summary>
	///<param name="index">Index of the alert to delete</param>
	if (confirm("Sikker på at du vil slette dette varselet?")) {
		Dialog.InvokeUserHandler("deletealert", { UserAlertId: Membership.CurrentUser.Alerts[index].Id },
		 function(transport) {
			if (transport.responseJSON) {
				var response = transport.responseJSON;
				if (response.Error && response.Error.length > 0) {
					alert(response.Message);
				} else {
					Membership.CurrentUser = response;
					Settings.ShowAlerts();
					// Reload MyAlerts
					var w = Widget.Find("MyAlerts");
					if (w) w.Reload();
					
				}
			} else {
				alert("Det oppstod en feil. Prøv igjen.");
			}
		 }
		 );
	}
}

Settings.Alerts._isEditorOpen = false;
Settings.Alerts.TargetTypes = { None: 0, SMS: 1, Email: 2 };
Settings.Alerts.Edit = function(index) {
    ///<summary>Edits an alert</summary>
    ///<param name="index">Index of the alert to delete</param>
    Settings.Alerts.ShowDialog();

    $("txtUserAlertId").value = "";

    if (!(Membership.CurrentUser.Alerts))
        return;

    var a = Membership.CurrentUser.Alerts[index];
    if (!a) {
        Settings.Alerts.ReloadLocation();
        return;
    }

    $("txtUserAlertId").value = a.Id;

    if (a.Category) Settings.Alerts.GetControl("selEventCategory").value = a.Category.Id;
    if (a.Severity) Settings.Alerts.GetControl("selSeverity").value = a.Severity;

    if (a.DayFrom) Settings.Alerts.GetControl("selDayFrom").value = a.DayFrom;
    if (a.DayTo) Settings.Alerts.GetControl("selDayTo").value = a.DayTo;
    if (a.TimeFrom) Settings.Alerts.GetControl("selTimeFrom").value = a.TimeFrom;
    if (a.TimeTo) Settings.Alerts.GetControl("selTimeTo").value = a.TimeTo;

    var roadId = (!!a.Road) ? a.Road.Id : null;
    var cityId = (!!a.City) ? a.City.Id : null;
    var regionId = (!!a.Region) ? a.Region.Id : null;
    var areaId = (!!a.Area) ? a.Area.Id : null;
    Settings.Alerts._loadLocation(roadId, cityId, regionId, areaId);

    if (a.SendTo) {
        if (a.SendTo & Settings.Alerts.TargetTypes.SMS) $("chkAlertSMS").checked = true;
        if (a.SendTo & Settings.Alerts.TargetTypes.Email) $("chkAlertEmail").checked = true;
    }
}
Settings.Alerts._NamingContainerPrefix = null;
Settings.Alerts.GetControl = function(localId) {
	///<summary>Gets a control from the settings box</summary>
	///<param name="localId">Local id (related to the settings box)</param>
	if (!Settings.Alerts._NamingContainerPrefix) {
		var wrapper = $("newAlertWrapper").up("div.content", 0);
		if (wrapper) {
			Settings.Alerts._NamingContainerPrefix = wrapper.identify().replace(/_content/, "");
		}
	}
	return $(Settings.Alerts._NamingContainerPrefix + "_" + localId);
}

Settings.Alerts.ShowDialog = function() {
	///<summary>Shows the alert editor dialog</summary>
	var dialog = $("newAlert");
	Dialog.Clear(dialog);
	Effect.BlindDown(dialog, { duration:0.5, afterFinish: function() {
		element = $("newAlert");
		var lbbg = $("newAlertBG");
		var editor = $("alertEditor");
		lbbg.absolutize();
		lbbg.clonePosition(editor);
		lbbg.style.zIndex = 1100;
		Effect.Appear(lbbg, {from:0, to:0.8, duration:0.3});
	} });
	Settings.Alerts._isEditorOpen = true;
}
Settings.Alerts.CloseDialog = function() {
	///<summary>Closes the alert editor dialog</summary>
	if (Settings.Alerts._isEditorOpen) {
		Effect.BlindUp($("newAlert"), { duration:0.3 });
		Effect.Fade($("newAlertBG"), { from:0.8, to:0, duration:0.3});
		Settings.Alerts._isEditorOpen = false;
	}
}
Settings.Alerts.Save = function() {
	///<summary>Saves the current alert settings</summary>
	var errorLabel = "alertEditorError";
	Dialog.InvokeUserHandler("savealert", {
		UserAlertId: $F("txtUserAlertId"),
		RoadId: $F(Settings.Alerts.GetControl("selRoad")),
		CityId: $F(Settings.Alerts.GetControl("selCity")),
		RegionId: $F(Settings.Alerts.GetControl("selRegion")),
		AreaId: $F(Settings.Alerts.GetControl("selArea")),
		EventType: $F(Settings.Alerts.GetControl("selEventCategory")),
		Severity: $F(Settings.Alerts.GetControl("selSeverity")),
		DayFrom: $F(Settings.Alerts.GetControl("selDayFrom")),
		DayTo: $F(Settings.Alerts.GetControl("selDayTo")),
		TimeFrom: $F(Settings.Alerts.GetControl("selTimeFrom")),
		TimeTo: $F(Settings.Alerts.GetControl("selTimeTo")),
		AlertType: $F("chkAlertSMS") + "," + $F("chkAlertEmail")
	}, function(transport) {
		if (transport.responseJSON) {
			var response = transport.responseJSON;
			if (response.Error && response.Error.length > 0) {
				Validator.ShowError(null, errorLabel, response.Message);
			} else {
				Settings.Alerts.CloseDialog();
				Membership.CurrentUser = response;
				Settings.ShowAlerts();
				// Reload MyAlerts
				var w = Widget.Find("MyAlerts");
				if (w) w.Reload();
			}
		} else {
			Validator.ShowError(null, errorLabel, "Det oppstod en feil. Prøv igjen.");
		}
	});	
}
Settings.Alerts.Show = function(alertObject, index) {
	///<summary>Shows an alert in the grid</summary>
	///<param name="alertObject">The alert object</param>
	///<param name="index">Index of the alert</param>
	
	var table = $("existingAlerts");
	var buttonTable = $("alertEditButtons");
	var tbody = table.down("tbody", 0);
	if (!tbody) {
		tbody = Builder.node("tbody");
		table.appendChild(tbody);
	}
	
	var tr = Builder.node("tr");
	var tdType = Builder.node("td", Settings.Alerts._getAlertTypeText(alertObject));
	var tdLocation = Builder.node("td", Settings.Alerts._getAlertLocationText(alertObject));
	var tdCategory = Builder.node("td", Settings.Alerts._getAlertCategoryText(alertObject));
	var tdTime = Builder.node("td", Settings.Alerts._getAlertTimeText(alertObject));
	var tdTarget = Builder.node("td", {"class":"last-column"}, Settings.Alerts._getAlertTargetText(alertObject));
	
	tr.appendChild(tdType);
	tr.appendChild(tdLocation);
	tr.appendChild(tdCategory);
	tr.appendChild(tdTime);
	tr.appendChild(tdTarget);
	
	tbody.appendChild(tr);

	// Add button row
	var buttonTable = $("alertEditButtons");
	var buttonTBody = buttonTable.down("tbody", 0);
	if (!buttonTBody) {
		buttonTBody = Builder.node("tbody");
		buttonTable.appendChild(buttonTBody);
	}
	
	var btnTr = Builder.node("tr");
	var btnTd = Builder.node("td");
	var btnDel = Builder.node("a", { href:"#", "class":"button", onclick:"Settings.Alerts.Delete(" + index + "); return false;" });
	btnDel.appendChild(Builder.node("span", "Slett"));
	btnTd.appendChild(btnDel);	

	var btnEdit = Builder.node("a", { href:"#", "class":"button", onclick:"Settings.Alerts.Edit(" + index + "); return false" });
	btnEdit.appendChild(Builder.node("span", "Endre"));
	btnTd.appendChild(btnEdit);	
	
	btnTr.appendChild(btnTd);
	buttonTBody.appendChild(btnTr);
	
}
Settings.Alerts._getAlertTypeText = function(alertObject) {
	///<summary>Gets the display text for an alert type</summary>
	///<param name="alertObject">The alert object</param>
	return "Veimelding";
}
Settings.Alerts._getAlertLocationText = function(alertObject) {
	///<summary>Gets the display text for an alert location</summary>
	///<param name="alertObject">The alert object</param>
	var locationText = "";
	if (alertObject.Road) { 
		locationText += Settings.Alerts._getRoadTypeText(alertObject.Road) + alertObject.Road.Number 
	}
	if (alertObject.City) {
		if (locationText.length > 0) locationText += ", ";
		locationText += alertObject.City.Name;		
	}
	if (alertObject.Area) {
		if (locationText.length > 0) locationText += ", ";
		locationText += alertObject.Area.Description;
	}
	if (alertObject.Region) {
		if (locationText.length > 0) locationText += ", ";
		locationText += alertObject.Region.Name;
	}
	if (locationText.length == 0)
		locationText = "(Hele Norge)";
	return locationText;
}
Settings.Alerts._getAlertCategoryText = function(alertObject) {
	///<summary>Gets the display text for an alert category</summary>
	///<param name="alertObject">The alert object</param>
	var categoryDesc = "";
	if (alertObject.Category)
		categoryDesc = alertObject.Category.Description;
	else
		categoryDesc = "Alle meldinger";
	if (alertObject.Severity) {
		categoryDesc += ", " + Settings.Alerts._getSeverityText(alertObject.Severity);
	}
	return categoryDesc;
}
Settings.Alerts._getAlertTimeText = function(alertObject) {
	///<summary>Gets the display text for an alert time setting</summary>
	///<param name="alertObject">The alert object</param>
	if (alertObject.TimeFrom == 0 && alertObject.TimeTo == 0 && alertObject.DayFrom == "Man" && alertObject.DayTo == "Søn")
		return "Alltid";
	if (alertObject.TimeFrom == 0 && alertObject.TimeTo == 0)
		return "#{DayFrom} - #{DayTo}".interpolate(alertObject);
	else
		return "#{DayFrom} - #{DayTo}, #{TimeFrom} - #{TimeTo}".interpolate(alertObject);
}
Settings.Alerts._getAlertTargetText = function(alertObject) {
	///<summary>Gets the display text for an alert target</summary>
	///<param name="alertObject">The alert object</param>
	var targetString = "";
	switch (alertObject.SendTo) {
		case 1: targetString = "sms"; break; 
		case 2: targetString = "email"; break;
		case 3: targetString = "sms, email"; break;
	}
	return targetString.replace(/sms/gi, "SMS").replace(/email/gi, "E-post");
}
Settings.Alerts._getSeverityText = function(severityId) {
	///<summary>Gets the text for the severity</summary>
	///<param name="severityId">The severity id</param>
	switch (severityId) {
		case 1: return "normale";
		case 2: return "viktige";
		case 3: return "alvorlige";
		default: return "";
	}
}
Settings.Alerts._getRoadTypeText = function(road) {
	///<summary>Gets the text for the road type</summary>
	///<param name="road">The road</param>
	if (!(road && road.Type)) return "";
	switch (road.Type) {
		case 1: return "Rv";
		case 2: return "Fv";
		case 3: return "E";
		default: return "";
	}
}
Settings.Alerts.ReloadLocation = function() {
	///<summary>Reloads the location selectors based on the current selections</summary>
	var locEditor = $("locationEditor");
	if (!locEditor) return;
	
	var roadId = $F(Settings.Alerts.GetControl("selRoad"));
	var cityId = $F(Settings.Alerts.GetControl("selCity"));
	var regionId = $F(Settings.Alerts.GetControl("selRegion"));
	var areaId = $F(Settings.Alerts.GetControl("selArea"));
	
	Settings.Alerts._loadLocation(roadId, cityId, regionId, areaId);
}
Settings.Alerts._loadLocation = function(roadId, cityId, regionId, areaId) {
	new Ajax.Updater("locationEditor", "/locationEditor.aspx", {
		method:"post",
		parameters: {
			RoadId: roadId,
			CityId: cityId,
			RegionId: regionId,
			AreaId: areaId,
			prefix: Settings.Alerts._NamingContainerPrefix
		}
	});
}