/*
twzToDoList.js Javascript for twzToDoList.class.php
Copyright (C) 2019 Tony Phelps
---------------------------------------------------------------------
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
---------------------------------------------------------------------
email: dev@tweezy.net.au
post: P O Box 200 Kingston Tas 7051 AUSTRALIA
---------------------------------------------------------------------
*/
var isDirty = false;
document.addEventListener("DOMContentLoaded", function() {
var clearChkExpand = function () {
var elem = document.getElementById("chkExpand");
if(elem) { elem.checked = false; }
};
var expandTextarea = function (elem) {
if(elem && elem.value != '' && elem.scrollHeight > 55)
{
elem.style.height = "1px";
elem.style.height = (5 + elem.scrollHeight)+"px";
}
};
var showTaskInfo = function (taskInfo) {
taskInfo.style.display = "block";
// expand textarea to fit initial content..
// ..we can't do this on page load because if textarea is hidden its scrollHeight is zero!
expandTextarea(taskInfo.getElementsByTagName("textarea")[0]);
};
// ______________________________
// expand ProjectDescn textarea..
expandTextarea(document.getElementById("ProjectDescn"));
// __________________________
// toggle extra task fields..
var task = document.getElementsByClassName("TaskState");
for(var i=0; i < task.length; i++)
{
task[i].style.cursor = "pointer";
task[i].addEventListener("click", function(){
var info = this.parentNode.getElementsByClassName("taskInfo")[0];
if(info.style.display == "block")
{ info.style.display = "none"; }
else
{ showTaskInfo(info); }
//clearChkExpand(); // something odd here - see TODO list [9/6/19]
});
}
// ____________________________________________________
// show extra task fields if TaskSeq|TaskName changes..
var task = document.getElementsByClassName("tasktrigger");
for(var i=0; i < task.length; i++)
{
task[i].addEventListener("input", function(){
var info = this.parentNode.getElementsByClassName("taskInfo")[0];
showTaskInfo(info);
clearChkExpand();
});
}
// _________________________________________
// set taskDirty[] when any task input changes..
// we don't worry if any field is changed back to its defaultValue; once changed we'll assume it's dirty
var tasklist = document.getElementById("tasklist");
if(tasklist)
{
var input = tasklist.querySelectorAll("input[type=text],textarea");
for(var i=0; i < input.length; i++)
{
input[i].oninput = function(){ // setting .oninput (not addEventListener) so it can be called by setnow
var index = this.name.replace(/[^0-9]/g,''); // extracts 34 from fldName[34] .. BUT we must ensure no digits except inside [] !!
document.getElementsByName("taskDirty["+index+"]")[0].value=1;
isDirty = true;
};
}
}
// _________________________________________
// set prDirty when project|preset data changes..
var input = document.getElementsByClassName("prData");
for(var i=0; i < input.length; i++)
{
input[i].oninput = function(){ // setting .oninput (not addEventListener) so it can be called by setnow
document.getElementsByName("prDirty")[0].value=1;
isDirty = true;
};
}
// chkArchive should also trigger this
var elem = document.getElementById("chkArchive");
if(elem)
{
elem.addEventListener("change", function(){
document.getElementsByName("prDirty")[0].value=1;
isDirty = true;
});
}
// _________________________________________
// tasks expander..
var elem = document.getElementById("chkExpand");
if(elem)
{
elem.addEventListener("change", function(){
var info = document.getElementsByClassName("taskInfo");
for(var i=0; i < info.length; i++)
{
if(this.checked)
{ showTaskInfo(info[i]); }
else
{ info[i].style.display = "none"; }
}
});
}
// _________________________________________
// hide/show tasklist depending on lstPreset combo..
var elem = document.getElementById("lstPreset");
if(elem)
{
elem.addEventListener("change", function(){
isDirty = true;
document.getElementById("tasklist").style.display = (this.value == 0) ? 'block' : 'none';
});
}
// _________________________________________
// search box..
var elem = document.getElementById("findText");
if(elem)
{
elem.addEventListener("focus", function(){
if(this.value!="") { document.getElementById("SearchExtra").style.display = "block"; }
});
elem.addEventListener("input", function(){
document.getElementById("SearchExtra").style.display = (this.value=="") ? "none" : "block";
});
}
// _________________________________________
// set datetime field to 'now'..
var elem = document.getElementsByClassName("setnow");
for(var i=0; i < elem.length; i++)
{
elem[i].title="set date to now";
elem[i].addEventListener("click", function(e){
var inp = this.parentNode.querySelector("input[type=text]");
if(inp)
{
inp.value = "now";
inp.oninput.apply(inp); // call oninput to trigger taskDirty/isDirty
}
e.preventDefault();
});
}
// _________________________________________
// clear isDirty on form submit..
var elem = document.getElementsByTagName("form");
for(var i=0; i < elem.length; i++)
{ elem[i].addEventListener("submit", function() { isDirty = false; }); }
// _________________________________________
// change favicon if any due/overdue..
var icon = "favicon.ico";
var elem = document.getElementsByClassName("status-overdue");
if(elem.length > 0) { icon = "favicon_late.ico"; }
else
{
elem = document.getElementsByClassName("status-due");
if(elem.length > 0) { icon = "favicon_due.ico"; }
}
var link = document.querySelector("link[rel*=icon]") || document.createElement("link");
link.type = "image/x-icon";
link.rel = "shortcut icon";
link.href = icon;
document.getElementsByTagName("head")[0].appendChild(link);
}); // end DOMContentLoaded
window.addEventListener("beforeunload", function(e) {
if(isDirty)
{
var msg = "Changes have not been saved. Are you sure you want to leave this page?";
e.returnValue = msg; // Gecko and Trident
return msg; // Gecko and WebKit
// 1/6/19: none of Firefox|Edge|Chrome actually show this msg; just a generic one - ok
}
});
|