let am = new AccountManager(localStorage);
let activeUser = am.getActiveUser();
let carSel = document.getElementById("car");
let sigSel = document.getElementById("signals");
let sigPendingSel = document.getElementById("signalsPending");
let sigAccSel = document.getElementById("signalsAccepted");
let sigClosedSel = document.getElementById("signalsClosed");
let teamSel = document.getElementById("teams");
let teamPenSel = document.getElementById("teamsPendingSignal");
let teamSigSel = document.getElementById("signalTeam");
window.onload = () => {
let isEnter = (am.checkForEnterUser() == 'true');
if (isEnter) {
let role = activeUser.role;
document.getElementById("fname").innerHTML = "Име: " + activeUser.fname;
document.getElementById("lname").innerHTML = "Фамилия: " + activeUser.lname;
switch (Number(role)) {
case 0:
role = "Потребител";
break;
case 1:
role = "Пожарникар";
break;
case 2:
role = "Диспечер";
break;
case 3:
role = "Админ";
break;
}
document.getElementById("role").innerHTML = "Роля: " + role;
document.getElementById("region").innerHTML = "Регион: " + activeUser.region;
//If user is firefighter
if (activeUser.role == 1) {
initFirefighter();
document.getElementById("firefighter-stats").style.display = 'block';
document.getElementById("firefighterTeamManagment").style.display = "block";
} else {
document.getElementById("firefighter-stats").style.display = 'none';
document.getElementById("firefighterTeamManagment").style.display = "none";
}
//If user is dispatcher
if (activeUser.role == 2) {
document.getElementById("signalDiv").style.display = "block";
document.getElementById("sendSignalDiv").style.display = "block";
document.getElementById("dispatcherTabs").style.display = "block";
getNames();
initMapForSignal();
if (am.getSignals() != null) {
forEachOption(sigSel, am.getSignalsWithoutTeamSelected(), "Изберете сигнал");
forEachOption(sigPendingSel, am.getSignalsWithTeamSelected(), "Изберете сигнал");
forEachOption(sigAccSel, am.getAcceptedSignals(), "Изберете сигнал");
forEachOption(sigClosedSel, am.getClosedSignals(), "Изберете сигнал");
}
reloadSel();
let ids = ["displaySignal", "displayPendingSignal", "displayAcceptedSignal", "displayClosedSignal"];
for (const id of ids) {
document.getElementById(id).style.display = "none";
}
} else {
document.getElementById("signalDiv").style.display = "none";
document.getElementById("sendSignalDiv").style.display = "none";
document.getElementById("dispatcherTabs").style.display = "none";
}
let ids = ["registerEmployee", "registerCar", "registerTeam", "adminTabs"];
//If user is admin
if (activeUser.role == 3) {
document.getElementById("deleteAll").style.display = "inline";
document.getElementById("deleteAcc").style.display = "none";
for (const id of ids) {
document.getElementById(id).style.display = "block";
}
document.getElementById("registerCar").parentElement.classList.add("is-hidden");
document.getElementById("registerTeam").parentElement.classList.add("is-hidden");
forEachCar(carSel);
} else {
document.getElementById("deleteAll").style.display = "none";
document.getElementById("deleteAcc").style.display = "inline";
for (const id of ids) {
document.getElementById(id).style.display = "none";
}
}
} else {
window.location.href = "../index.html";
}
// Initialize all input of type date
var calendars = bulmaCalendar.attach('[type="date"]', {
dateFormat: 'DD/MM/YYYY',
lang: 'bg',
minDate: new Date(),
weekStart: 1
})
}
/**
* Function that initalise firefighter systems
*/
function initFirefighter() {
if (activeUser.team == undefined || activeUser.team == null) {
document.getElementById("team").innerHTML = "Отбор: няма";
document.getElementById("signalP").innerHTML = "Сигнали: няма";
document.getElementById("signalWorkButtons").style.display = "none";
document.getElementById("fireMapSignal").classList.remove('map');
} else {
document.getElementById("team").innerHTML = "Отбор: " + activeUser.team;
let team = am.getTeamWithId(activeUser.team);
let car = am.getCarWithId(team.car);
document.getElementById("teamCar").innerHTML = "Кола: " + car.model + " " + car.registrationPlate;
let memberInTeamP = document.getElementById("membersInTeam");
memberInTeamP.innerHTML = "Съотборници:";
let iterations = team.employees.length;
for (const member of team.employees) {
let user = am.getUserWithId(member);
if (!--iterations) {
memberInTeamP.innerHTML += " " + user.fname + " " + user.lname;
} else {
memberInTeamP.innerHTML += " " + user.fname + " " + user.lname + ",";
}
}
document.getElementById("startOfDay").innerHTML = "Начало на смяната: " + team.starOfWorkingDay;
document.getElementById("endOfDay").innerHTML = "Край на смяната: " + team.endOfWorkingDay;
let workingDaysP = document.getElementById("workingDays");
workingDaysP.innerHTML = "Работни дни:";
for (let i = 1; i <= 6; i++) {
if (team.shifts.includes(i.toString())) {
switch (i) {
case 1:
workingDaysP.innerHTML += " Понеделник";
break;
case 2:
workingDaysP.innerHTML += " Вторник";
break;
case 3:
workingDaysP.innerHTML += " Сряда";
break;
case 4:
workingDaysP.innerHTML += " Четвъртък";
break;
case 5:
workingDaysP.innerHTML += " Петък";
break;
case 6:
workingDaysP.innerHTML += " Събота";
break;
}
}
}
if (team.shifts.includes("0")) {
workingDaysP.innerHTML += " Неделя";
}
document.getElementById("holidayP").innerHTML = "Почивни дни: " + team.holidays;
document.getElementById("sickLeaveP").innerHTML = "Болнични: " + team.sickLeaves;
document.getElementById("BusinessTripP").innerHTML = "Командировка: " + team.businessTrips;
if (team.signal != null) {
signal = am.getSignalsWithId(team.signal)
document.getElementById("signalP").innerHTML = "Сигнал: " + signal.id;
document.getElementById("signalNameP").innerHTML = "Заглавие: " + signal.title;
document.getElementById("signalTypeP").innerHTML = "Тип: " + signal.type;
document.getElementById("signalDesP").innerHTML = "Описание: " + signal.description;
initMap(signal.coordinatesX, signal.coordinatesY, "fireMapSignal");
if (signal.isClosed) {
document.getElementById("startWorkingButton").style.display = "none";
document.getElementById("endWorkingButton").style.display = "none";
} else {
if (signal.start == null) {
document.getElementById("startWorkingButton").style.display = "block";
document.getElementById("endWorkingButton").style.display = "none";
} else {
document.getElementById("startWorkingButton").style.display = "none";
document.getElementById("endWorkingButton").style.display = "block";
}
}
} else {
document.getElementById("signalP").innerHTML = "Сигнал: няма";
document.getElementById("signalWorkButtons").style.display = "none";
document.getElementById("fireMapSignal").classList.remove('map');
}
}
}
/**
* Loads cars in the selected elemend
* @param {DOMElement} selectElement
*/
function forEachCar(selectElement) {
let cars = am.getCars();
for (i = selectElement.length - 1; i >= 0; i--) {
selectElement.remove(i);
}
selectElement.options[0] = new Option("Изберете кола", "");
if (cars != null) {
cars.forEach(element => {
if (element.inTeam == false) {
selectElement.options[selectElement.options.length] = new Option(element.model + " " + element.registrationPlate, element.numberOfSeats + " " + element.id);
}
});
}
}
/**
* Loads what function gives
* in the selected elemend
* @param {DOMElement} optionSelect
* @param {func} func
* @param {string} firstOption First option in the select element
*/
function forEachOption(optionSelect, func, firstOption) {
let options = func;
for (i = optionSelect.length - 1; i >= 0; i--) {
optionSelect.remove(i);
}
optionSelect.options[0] = new Option(firstOption, "");
if (options != null) {
options.forEach(element => {
optionSelect.options[optionSelect.options.length] = new Option(element.title ?? element.id, element.id);
});
}
}
/**
* Function to get the names
* of the user, which is entered
*/
function getNames() {
document.getElementById("Signalnames").value = activeUser.fname + " " + activeUser.lname;
}
/**
* initalise a map for the signal form
*/
function initMapForSignal() {
document.getElementById("mapSignal").innerHTML = "";
let map = new ol.Map({
target: 'mapSignal',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: ol.proj.fromLonLat([27.461014, 42.510578]),
zoom: 12
})
});
setTimeout(function () { map.updateSize(); }, 200);
map.on('click', (m) => {
map.getLayers().getArray()
.filter(layer => layer.get('name') === 'Marker')
.forEach(layer => map.removeLayer(layer));
let layer = new ol.layer.Vector({
source: new ol.source.Vector({
features: [
new ol.Feature({
geometry: new ol.geom.Point([m.coordinate[0], m.coordinate[1]])
})
]
}),
name: 'Marker'
});
map.addLayer(layer);
coordinatesX = m.coordinate[0];
coordinatesY = m.coordinate[1];
});
}
/**
* Intialise a map into div element
* @param {string} coordinatesX Longitude
* @param {string} coordinatesY Latitude
* @param {string} id Id of the element
*/
function initMap(coordinatesX, coordinatesY, id) {
document.getElementById(id).innerHTML = "";
let map = new ol.Map({
target: id,
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
}),
new ol.layer.Vector({
source: new ol.source.Vector({
features: [
new ol.Feature({
geometry: new ol.geom.Point([coordinatesX, coordinatesY])
})
]
}),
name: 'Marker'
})
],
view: new ol.View({
center: [coordinatesX, coordinatesY],
zoom: 12
})
});
setTimeout(function () { map.updateSize(); }, 200);
}
/**
* Place firefighter to chose from
*/
function updateCarSel() {
let form = document.forms.registerTeam;
let parentDiv = document.getElementById("teamMembers");
parentDiv.innerHTML = ""
let firefightersArray = am.getFirefighters();
for (let i = 1; i <= form.elements.car.value.split(" ")[0]; i++) {
let newSelect = document.createElement("Select");
let newLabel = document.createElement("Label");
let controlDiv = document.createElement("div");
let selectDiv = document.createElement("div");
newSelect.setAttribute("name", i);
newSelect.setAttribute("id", i);
newLabel.setAttribute("for", i);
newLabel.classList.add("label");
controlDiv.classList.add("control");
selectDiv.classList.add("select")
newLabel.innerHTML = "Пожарникар " + i + ":";
parentDiv.appendChild(newLabel);
parentDiv.appendChild(controlDiv);
controlDiv.appendChild(selectDiv);
selectDiv.appendChild(newSelect);
newSelect.options[0] = new Option("Изберете пожарникар", "");
parentDiv.appendChild(document.createElement("br"));
if (firefightersArray == 0) {
continue;
}
for (const firefighter of firefightersArray) {
if (firefighter.team == null) {
newSelect.options[newSelect.options.length] = new Option(firefighter.fname + " " + firefighter.lname + " " + firefighter.email, firefighter.id);
}
}
}
}
/**
* Hide/Unhide element
* @param {DOM} parentDiv The element
* @param {string} id
*/
function chengeParentDivDisplay(parentDiv, id) {
if (id == "") {
parentDiv.style.display = "none";
} else {
parentDiv.style.display = "block";
}
}
carSel.onchange = updateCarSel;
/**
* Arrow function that loads select element
*/
sigSel.onchange = () => {
let id = document.forms.signalForm.elements.signals.value;
let parentDiv = document.getElementById("displaySignal");
let titleP = document.getElementById("title");
let namesP = document.getElementById("names");
let typeP = document.getElementById("type");
let desP = document.getElementById("des");
let signal = am.getSignalsWithId(id);
if (signal != undefined) {
initMap(signal.coordinatesX, signal.coordinatesY, "map");
}
chengeParentDivDisplay(parentDiv, id);
if (signal != undefined) {
titleP.innerHTML = "Заглавие: " + signal.title;
namesP.innerHTML = "Име на изпратилия сигнала: " + signal.names;
typeP.innerHTML = "Тип: " + signal.type;
desP.innerHTML = "Описание: " + signal.description;
}
}
/**
* Arrow function that loads select element
*/
sigPendingSel.onchange = () => {
let id = document.forms.signalPendingForm.elements.signalsPending.value;
let parentDiv = document.getElementById("displayPendingSignal");
let titleP = document.getElementById("titlePendingSignal");
let teamP = document.getElementById("teamPendingSignal");
let namesP = document.getElementById("namesPendingSignal");
let typeP = document.getElementById("typePendingSignal");
let desP = document.getElementById("desPendingSignals");
let signal = am.getSignalsWithId(id);
if (signal != undefined) {
initMap(signal.coordinatesX, signal.coordinatesY, "mapPendingSignal");
}
chengeParentDivDisplay(parentDiv, id);
if (signal != undefined) {
titleP.innerHTML = "Заглавие: " + signal.title;
teamP.innerHTML = "Отбор: " + signal.team;
namesP.innerHTML = "Име на изпратилия сигнала: " + signal.names;
typeP.innerHTML = "Тип: " + signal.type;
desP.innerHTML = "Описание: " + signal.description;
}
}
/**
* Arrow function that loads select element
*/
sigAccSel.onchange = () => {
let id = document.forms.signalAcceptedForm.elements.signals.value;
let parentDiv = document.getElementById("displayAcceptedSignal");
let titleP = document.getElementById("titleAcceptedSignal");
let teamP = document.getElementById("teamAcceptedSignal");
let namesP = document.getElementById("namesAcceptedSignal");
let typeP = document.getElementById("typeAcceptedSignal");
let desP = document.getElementById("desAcceptedSignals");
let startP = document.getElementById("startOfWorkingAccSig");
let signal = am.getSignalsWithId(id);
if (signal != undefined) {
initMap(signal.coordinatesX, signal.coordinatesY, "mapAcceptedSignal");
}
chengeParentDivDisplay(parentDiv, id);
let startDate = new Date(signal.start);
if (signal != undefined) {
titleP.innerHTML = "Заглавие: " + signal.title;
teamP.innerHTML = "Отбор: " + signal.team;
namesP.innerHTML = "Име на изпратилия сигнала: " + signal.names;
typeP.innerHTML = "Тип: " + signal.type;
desP.innerHTML = "Описание: " + signal.description;
startP.innerHTML = "Начало на работа по сигнала: " + startDate.getHours() + ":" + startDate.getMinutes();
}
}
/**
* Arrow function that loads select element
*/
sigClosedSel.onchange = () => {
let id = document.forms.signalClosedForm.elements.signals.value;
let parentDiv = document.getElementById("displayClosedSignal");
let titleP = document.getElementById("titleClosedP");
let namesP = document.getElementById("namesClosedP");
let typeP = document.getElementById("typeClosedP");
let desP = document.getElementById("desClosedP");
let startP = document.getElementById("startOfWorkingClosedP");
let endP = document.getElementById("endOfWorkingClosedP");
let timeP = document.getElementById("timeTakenP");
let signal = am.getSignalsWithId(id);
if (signal != undefined) {
initMap(signal.coordinatesX, signal.coordinatesY, "mapClosedMap");
}
chengeParentDivDisplay(parentDiv, id);
let startDate = new Date(signal.start);
let endDate = new Date(signal.end);
if (signal != undefined) {
titleP.innerHTML = "Заглавие: " + signal.title;
namesP.innerHTML = "Име на изпратилия сигнала: " + signal.names;
typeP.innerHTML = "Тип: " + signal.type;
desP.innerHTML = "Описание: " + signal.description;
startP.innerHTML = "Начало на работа по сигнала: " + startDate.getHours() + ":" + startDate.getMinutes();
endP.innerHTML = "Край на работа по сигнала: " + endDate.getHours() + ":" + endDate.getMinutes();
timeP.innerHTML = "Времетраене: " + signal.timeToComplete;
}
}
/**
* reload select elements
*/
function reloadSel() {
let sels = [teamSel, teamPenSel, teamSigSel];
for (const sel of sels) {
forEachOption(sel, am.getTeamsForSignals(), "Изберете отбор");
}
}
/**
* reload select elements
*/
function reloadSigSel() {
if (am.getSignals() != null) {
forEachOption(sigSel, am.getSignalsWithoutTeamSelected(), "Изберете сигнал");
forEachOption(sigPendingSel, am.getSignalsWithTeamSelected(), "Изберете сигнал");
}
}
/**
* Process the input from forms and send it to the backend
* @param {number} input
* @param {number} form
*/
function getInput(input, form = null) {
switch (input) {
case 1:
am.logOut();
window.location.href = "../index.html";
break;
case 2:
am.deleteAccount();
window.location.href = "../index.html";
break;
case 3:
am.deleteAllAccount();
window.location.href = "../index.html";
break;
case 4:
let employeeForm = document.forms.registerEmployee;
let employeeOutput = am.registerUser(
am.escapeHtml(employeeForm.elements.fname.value),
am.escapeHtml(employeeForm.elements.lname.value),
am.escapeHtml(employeeForm.elements.email.value),
am.escapeHtml(employeeForm.elements.pass.value),
am.escapeHtml(employeeForm.elements.role.value),
"Бургас"
);
let employeeError = document.getElementById("employeeError");
switch (employeeOutput) {
case 0:
updateCarSel();
employeeError.innerHTML = "Работникът е регестриран успешно!";
break;
case 1:
employeeError.innerHTML = "Първото име трябва да започва с главна буква!";
break;
case 2:
employeeError.innerHTML = "Фамилното име трябва да започва с главна буква!";
break;
case 3:
employeeError.innerHTML = "Паролата трябва да е най-малко 8 символа!";
break;
case 4:
employeeError.innerHTML = "Вече има регестриран потребител с такъв e-mail!";
break;
case 5:
employeeError.innerHTML = "Въведеният e-mail е невалиден!";
break;
default:
console.log("A wild error appeared");
break;
}
break;
case 5:
let carForm = document.forms.registerCar;
let carOutput = am.registerCar(
am.escapeHtml(carForm.elements.model.value),
am.escapeHtml(carForm.elements.registration.value),
am.escapeHtml(carForm.elements.seats.value),
"Бургас"
);
let carError = document.getElementById("carError");
switch (carOutput) {
case 0:
forEachCar(carSel);
carError.innerHTML = "Колата е регестрирана успешно!";
break;
case 1:
carError.innerHTML = "Броят на местата трябва да е по-голям от 0!";
break;
case 2:
carError.innerHTML = "Вече има кола регестрирана с този регистрационен номер!";
break;
case 3:
carError.innerHTML = "Моля посочете модел!";
break;
case 4:
carError.innerHTML = "Моля посочете регистрационен номер!";
break;
default:
console.log("A wild error appeared");
break;
}
break;
case 6: {
let teamForm = document.forms.registerTeam;
let checkboxes = document.querySelectorAll(`input[name=days]:checked`);
let firefightersArray = [];
let shifts = [];
for (let i = 1; i <= teamForm.elements.car.value.split(" ")[0]; i++) {
if (teamForm.elements[i].value != "") {
firefightersArray.push(teamForm.elements[i].value);
}
}
checkboxes.forEach((elements) => {
shifts.push(elements.value);
});
let teamOutput = am.registerTeam(
firefightersArray,
am.escapeHtml(teamForm.elements.car.value.split(" ")[1]),
am.escapeHtml(teamForm.elements.startTime.value),
am.escapeHtml(teamForm.elements.endTime.value),
shifts,
am.escapeHtml(teamForm.elements.holiday.value),
am.escapeHtml(teamForm.elements.sick.value),
am.escapeHtml(teamForm.elements.trip.value)
);
let teamError = document.getElementById("teamError");
switch (teamOutput) {
case 0:
forEachCar(carSel);
updateCarSel();
teamError.innerHTML = "Отборът е регестриран успешно!";
break;
case 1:
teamError.innerHTML = "Има работник с повече от една позиция!";
break;
case 2:
teamError.innerHTML = "Трябва да изберете поне един пожарникар!";
break;
case 3:
teamError.innerHTML = "Трябва да изберете кола за екипа!";
break;
case 4:
teamError.innerHTML = "Трябва да изберете час за начало на смяната!";
break;
case 5:
teamError.innerHTML = "Трябва да изберете час за край на смяната!!";
break;
case 6:
teamError.innerHTML = "Трябва да изберете дни, през които отбора ще е на работа!";
break;
case 7:
teamError.innerHTML = "Трябва да изберете дни за отпуска!";
break;
case 8:
teamError.innerHTML = "Трябва да изберете дни за болнични!";
break;
case 9:
teamError.innerHTML = "Трябва да изберете дни за командировка!";
break;
default:
console.log("A wild error appeared");
break;
}
break;
}
case 7:
let signalForm;
if (form == 1) {
signalForm = document.forms.signalForm;
} else if (form == 2) {
signalForm = document.forms.signalPendingForm
}
let signalOutput1 = am.assignTeamForSignal(
am.escapeHtml(signalForm.elements.signals.value),
am.escapeHtml(signalForm.elements.teams.value)
)
switch (signalOutput1) {
case 0:
document.getElementById("displaySignal").style.display = "none";
document.getElementById("displayPendingSignal").style.display = "none";
reloadSigSel()
reloadSel();
break;
case 1:
document.getElementById("signalError").innerHTML = "Няма избран сигнал!";
document.getElementById("signalPendingError").innerHTML = "Няма избран сигнал!";
break;
case 2:
document.getElementById("signalError").innerHTML = "Няма избран отбор!";
document.getElementById("signalPendingError").innerHTML = "Няма избран отбор!";
break;
default:
console.log("A wild error appeared");
break;
}
break;
case 8:
let signalForm2;
if (form == 1) {
signalForm2 = document.forms.signalForm;
} else if (form == 2) {
signalForm2 = document.forms.signalPendingForm
}
let signalOutput2 = am.deleteSignal(signalForm2.elements.signals.value);
switch (signalOutput2) {
case 0:
reloadSigSel();
document.getElementById("displaySignal").style.display = "none";
document.getElementById("displayPendingSignal").style.display = "none";
reloadSel();
break;
case 1:
document.getElementById("signalError").innerHTML = "Няма избран сигнал!";
document.getElementById("signalPendingError").innerHTML = "Няма избран сигнал!";
break;
default:
console.log("A wild error appeared");
break;
}
break;
case 11:
let signalForm5 = document.forms.signalSubmitForm;
let output = am.submitSignalForm(
am.escapeHtml(signalForm5.elements.title.value),
am.escapeHtml(signalForm5.elements.names.value),
am.escapeHtml(signalForm5.elements.type.value),
coordinatesX,
coordinatesY,
am.escapeHtml(signalForm5.elements.des.value),
am.escapeHtml(signalForm5.elements.teams.value)
);
let error = document.getElementById("error");
switch (output) {
case 0:
reloadSigSel();
document.getElementById("displaySignal").style.display = "none";
document.getElementById("displayPendingSignal").style.display = "none";
reloadSel();
getNames();
error.innerHTML = "Сигналът е изпратен!";
break;
case 1:
error.innerHTML = "Сигналът трябва да има име!";
break;
case 2:
error.innerHTML = "Моля, попълнете вашите имена!";
break;
case 3:
error.innerHTML = "Сигналът трябва да има тип!";
break;
case 4:
error.innerHTML = "Моля, изберете адрес от картата!";
break;
case 5:
error.innerHTML = "Сигналът трябва да има описание!";
break;
default:
console.log("A wild error appeared");
break;
}
break;
case 12:
let team = am.getTeamWithId(activeUser.team);
let signal = am.getSignalsWithId(team.signal)
if (signal.start == null) {
if (confirm("Наистина ли искате да започнете да работите?")) {
am.startWorking(signal.id);
}
} else {
if (confirm("Наистина ли искат да спрете да работите?")) {
am.endWorking(signal.id);
}
}
location.reload();
break;
default:
console.log("A wild error appeared");
break;
}
}