| 
/*
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: [email protected]
 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
 }
 });
 
 
 |