//$Id: fillform.js,v 1.5 2004/02/16 11:02:23 honzam Exp $ /* Copyright (C) 2002 Association for Progressive Communications http://www.apc.org/ 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 2 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 (LICENSE); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* These are JavaScript functions used by the fillform script. They should run on Netscape 4.7 as well as Internet Explorer 5.0 and above. Created by Jakub Adamek, January 2002 */ myAlertCount = 0; function myAlert (x) { if (myAlertCount++ < 150) alert (x); } function dec2hex (dec) { if (dec <= 0) return "0"; hex = ""; while (dec > 0) { digit = dec % 16; if (digit < 10) hex = String.fromCharCode (digit + 48) + hex; // '0' is 48 ASCII else hex = String.fromCharCode (digit + 87) + hex; // 'a' is 97 ASCII dec = Math.floor (dec / 16); } return hex; } function unpackID (packedID) { retval = ""; for (i = 0; i < packedID.length; i ++) retval += dec2hex (packedID.charCodeAt (i)); return retval; } function hex2dec (hex) { hex = hex.toUpperCase(); dec = 0; for (i=0; i < hex.length; ++i) { dec *= 16; c = hex.charAt (i); if (c >= '0' && c <= '9') dec += hex.charCodeAt (i) - 48; // '0' is 48 ASCII else if (c >= 'A' && c <= 'F') dec += hex.charCodeAt (i) - 55; // 'A' is 65 ASCII else { /*alert ('Error: hex2dec called with ' + hex);*/ return 0; } } return dec; } function packID (unpackedID) { var packedID = new String (); for (j=0; j < unpackedID.length; j += 2) { code = hex2dec (unpackedID.substr (j,2)); if (code != 0) packedID += String.fromCharCode (code); else return ''; } return packedID; } /* prooves all given fields are filled params: fields = array of controls' names */ function prooveFilled (formName, fields) { var myform = document.forms[formName]; for (var i=0; i < fields.length; ++i) { val = getControlValue (formName, fields[i]); if (val == "") { myform[fields[i]].focus(); alert ("You didn't fill in some required field."); return false; } } return true; } /* gets array of 3-items arrays (field name, parent field name, parent field value) if (parent_field_name contains parent_field_value) or (parent_field_name is filled and parent_field_value is empty) then proove field_name is filled params: fields = array of controls' names */ function prooveFilledIf (formName, fields) { var myform = document.forms[formName]; for (var i=0; i < fields.length; ++i) { parVal = getControlValue (formName, fields[i][1]); val = fields[i][2]; proove = (val == "" && parVal != "") || (parVal == val); if (!proove) { myform[fields[i][0]].focus; alert ("You didn't fill in some required field."); return false; } } } function getSelected (selectBox) { return selectBox.options [selectBox.selectedIndex].value; } // the crazy Netscape returns 104 as year 2004 (hoping nobody will use it in the 21th century perhaps) function getYearNetscapeSafe (myDate) { year = myDate.getYear(); if (year < 200) year += 1900; return year; } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * A A D A T E F U N C T I O N Functions working with AA-like date: It is in three select boxes (day,month,year), which usually have the name in the form of tdctr_vUNPACKED_FIELD_NAME_day, .._month, .._year 'Cause it's used in public forms as well, we assume the web author added one option marking not used fields. */ /* saves the date value from an AA-like 3-field form to targetField in m/d/y format emptyValue in any of the 3 select-boxes means date is not set */ function saveDate (formName,dateField,targetField,emptyValue) { myDate = getAADate (formName,dateField,emptyValue); var myField = document.forms[formName][targetField]; if (myDate != 0) { var d = new Date(); d.setTime (myDate); year = getYearNetscapeSafe(d); month = d.getMonth()+1; myField.value = month+"/"+d.getDate()+"/"+year; } else myField.value = ""; } /* sets given date in an AA-like form params: startYear is the top year in the year select box */ function setDay (formName,dateField,startYear,myDate) { tryDate = new Date (2000,1,1); dayShift = 1-tryDate.getDate(); document.forms[formName][dateField+"_day"].selectedIndex = myDate.getDate()-dayShift-1; document.forms[formName][dateField+"_month"].selectedIndex = myDate.getMonth(); document.forms[formName][dateField+"_year"].selectedIndex = getYearNetscapeSafe(myDate)-startYear; } /* sets today's date in an AA-like form params: startYear is the top year in the year select box */ function setToday (formName,dateField, startYear) { setDay (formName,dateField,startYear, new Date()); } /* returns a date read from the fields of an AA-like form as Unix timestamp emptyValue in any of the day,month,year select boxes will return 0 */ function getAADate (formName,dateField,emptyValue) { var f = document.forms[formName]; month = getSelected(f[dateField+"_month"]); day = getSelected(f[dateField+"_day"]); year = getSelected(f[dateField+"_year"]); if (month != emptyValue && day != emptyValue && year != emptyValue) return new Date (year,month-1,day).getTime(); else return 0; } /* Function: setControlOrAADate Purpose: sets different control types in a common way Sets the control, trying: 1. given controlName - if succeeds, tries to set the HTML radio button as well 2. controlName + '[]' - usefull on multiple selectboxes, checkboxes, radios 3. AA date sets the AA like date in 3 select boxes: Params: datePrefix is usually tdctr_ on forms created from itemedit.php3, '' on search forms html is usually 'h' for HTML, 't' for Plain text, 0 when not needed */ function setControlOrAADate (formName, controlName, newValue, datePrefix, html, timeZone) { if (getControlByName (formName, controlName) != null) { setControl (formName, controlName, newValue); if (html) setControl (formName, controlName+'html', html); } else if (getControlByName (formName, controlName+"[]") != null) setControl (formName, controlName+"[]", newValue); else if (!isNaN (newValue)) { myName = datePrefix + controlName; if (getControlByName (formName, myName+'_day') != null) { var myDate = new Date (); var timeStamp = new Number(newValue); timeStamp += (myDate.getTimezoneOffset()/60 - timeZone) * 3600; myDate.setTime (timeStamp * 1000); //alert ("Date coming to JavaScript is "+timeStamp+". That means "+myDate); setControl(formName,myName+'_day',myDate.getDate()); setControl(formName,myName+'_month',myDate.getMonth()+1); setControl(formName,myName+'_year',getYearNetscapeSafe(myDate)); } } } /* E N D O F A A D A T E F U N C T I O N S */ /* moves the page to top avoiding display in frames returns true if the page is on top, false otherwise */ function setMeTop () { if (top.document.location.href != document.location.href) { top.document.location.href = document.location.href; return false; } else return true; } /* gets a control by name in IE and Netscape */ function getControlByName (formName, controlName) { if (document.forms[formName] == null) return null; return document.forms[formName][controlName]; } /* sets a control value to the given one - works fine with text fields, hidden fields, select boxes (multiple not tried, but should be OK) and check boxes (multiple OK) */ function setControl (formName, controlName, newValue) { var myControl = getControlByName (formName, controlName); if (myControl != null) { if (typeof (myControl.type) == "undefined") { // multiple checkboxes or radio buttons for (var iCtrl = 0; iCtrl < myControl.length; ++iCtrl) { if (myControl[iCtrl].value == newValue) { if (myControl[iCtrl].type == "checkbox" || myControl[iCtrl].type == "radio") myControl[iCtrl].checked = 1; break; } } } else if (myControl.type.substr (0,6) == "select") for (var i = 0; i < myControl.options.length; i++) { if ( (myControl.options[i].value == newValue) || ((myControl.options[i].value == "") && (myControl.options[i].text == newValue))) myControl.options[i].selected = true; } else if (myControl.type == "checkbox") myControl.checked = newValue != 0; else myControl.value = newValue; } } /* Function: setControlArray Purpose: sets multiple control types in a common way (multiple select box) ToDo: implement multiple check-boxes */ function setControlArray (formName, controlName, newArray) { var myControl = getControlByName (formName, controlName); if (myControl != null) { if (myControl.type == "select-multiple") { for (var j = 0; j < newArray.length; j++) { for (var i = 0; i < myControl.options.length; i++) { if ( (myControl.options[i].value == newArray[j]) || ((myControl.options[i].value == "") && (myControl.options[i].text == newArray[j]))) { myControl.options[i].selected = true; break; } } if (i == myControl.options.length) { opt = new Option(newArray[j],newArray[j],false,false); myControl.options [i] = opt; myControl.options[i].selected = true; } } } else { if (myControl[0].type == "checkbox") { for (var j = 0; j < newArray.length; j++) { for (var i = 0; i < myControl.length; i++) { if ( (myControl[i].value == newArray[j]) || ((myControl[i].value == "") && (myControl[i].text == newArray[j]))) { myControl[i].checked = true; break; } } if (i == myControl.length) { opt = new Option(newArray[j],newArray[j],false,false); myControl[i] = opt; myControl[i].checked = true; } } } } } } /* Function: getControlOrAADate Purpose: get value set in various form controls Works with: see getControlValue + AA three-select-boxes-date */ function getControlOrAADate (formName, controlName, datePrefix, emptyValue) { var myControl = getControlByName (formName, controlName); if (myControl != null) return getControlValue (formName, controlName); else { var myControl = getControlByName (formName, datePrefix + controlName + '_day'); if (myControl != null) return getAADate (formName, datePrefix + controlName, emptyValue) / 1000; else return null; } } /* Function: getControlValue Purpose: get value set in various form controls Works with: ,