/*******************************************************************************
 *
 * File       : verify_form.js 
 * Author     : Duco Dokter 
 * Created    : Sun Jan 27 14:07:01 2002 
 * CVS Version: $Id: verify_form.js,v 1.2 2003/08/08 09:55:03 dokter Exp $ 
 * Copyright  : Wyldebeast & Wunderliebe
 * License    : GPL
 * Contact us : dokter@wyldebeast-wunderliebe.com
 *
 * This is a generic form verification library. The function verify
 * does the main loop over the elements of the form specified as it's
 * argument, performs the checks specified and returns true or false,
 * depending on whether the form is filled in properly or not.
 *
 * Please check our website for examples and documentation:
 * http://www.wyldebeast-wunderliebe.com/projects/verify_form/verify_form.html
 *
 * LICENSE INFO:
 * ----------------------------------------------------------------------------- 
 * 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; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 ******************************************************************************/

function showhide(e) 
{
el=document.getElementById(e);
el.style.display=el.style.display == "block" ? "none" : "block";
return el.style.display;
}

/* Global variables holding the error message and header. */
var errorMsg;
var errorHeader = "";

//var language=langs;
var language="hu";
var cssURL="design/default.css";
var errWindow=null;

var dict = new Array();
dict["hu"] = new Array(5);
dict["en"] = new Array(5);
dict["ger"] = new Array(5);

dict["hu"]["error"]   = "Rossz vagy hiányos információt írt a piros mezőkbe, kérem, korrigálja!";
dict["hu"]["alt"]   = "Kötelező kitölteni!";
dict["hu"]["header"]   = "Nem lehet továbblépni a következo(k) miatt:";
dict["hu"]["required"] = " mezo kötelezo ";
dict["hu"]["requires"] = " szükséges ";
dict["hu"]["nomatch"]  = " nem egyezik ";
dict["hu"]["close"]    = "Bezárás";

dict["en"]["error"]   = "You have missed or entered wrong information to a field, please correct it!";
dict["en"]["alt"]   = "Required field!";
dict["en"]["header"]   = "This form was not submitted because of the errors listed.";
dict["en"]["required"] = " is required ";
dict["en"]["requires"] = " requires ";
dict["en"]["nomatch"]  = " doesn't match ";
dict["en"]["close"]    = "Close";

dict["ger"]["error"]   = "";
dict["ger"]["alt"]   = "";
dict["ger"]["header"]     = "Formulier niet verstuurd vanwege de volgende fouten:";
dict["ger"]["required"]   = " is verplicht ";
dict["ger"]["requires"]   = " veronderstelt ";
dict["ger"]["nomatch"]    = " voldoet niet aan ";
dict["ger"]["close"]      = "Sluiten";


/**
 * Verify the complete form for all values.
 * Synopsis: verify(form)
 */
function verify(form) {
	errorMsg = "<UL>\n";
    var formOK = true;

	for (var i= 0; i < form.length; i++) {
	var elt = form.elements[i];
	verifyItem(elt) || (formOK = false);
    }

	errorMsg += "</UL>\n";
/*
	if (!formOK) {
	alert(dict[language]["error"]);
    }
*/

    //return formOK;
	return true;
}

//------------
function verifyItem(formit) {
if (formit.title==dict[language]["alt"]){
		formit.title='';
}
if (!verifyField(formit)){
//	formit.focus();
//	formit.style.borderColor='#ff0000';
	formit.style.backgroundColor='#FE0000';
	
	if (formit.title==''){
		formit.title=dict[language]["alt"];
	}
	return false;
	}else{
//	formit.style.borderColor='#000000';
	formit.style.backgroundColor='';
	formit.title='';	
	return true;
	}
}
//------------

/**
 * Verification dispatcher
 */
function verifyField(elt) {

    /* Now do some element specific thingies
     */
    switch(elt.type) {
	
    case "text":
	return verifyText(elt);
    case "password":
	return verifyText(elt);
    case "hidden":
	return verifyText(elt);
    case "textarea":
	return verifyText(elt);
    case "radio":
	return  verifyRadio(elt);
    case "checkbox":
	return  verifyRadio(elt);
    case "select-one":
	return verifySelect(elt);
    case "select-multiple":
	return verifySelect(elt);
    default:
	return true;
    }
}


/**
 * Verification of a select element. The element is ok-ed when the 
 * value of the option is not empty.
 */
function verifySelect(elt) {
    
    var required = elt.getAttribute("required");
    var errmsg   = elt.getAttribute("errmsg");

    if (required != null && isEmpty(elt.value)) {
	
	if (errmsg == null || errmsg == "") {
	    errorMsg += "<LI>" + elt.name + dict[language]["required"] + "</LI>\n";
	}
	else {
	    errorMsg += "<LI>" + errmsg + "</LI>\n";
	}

	return false;
    }

    return true;
}


/**
 * Verification of a radio checks for dependent field, and checks
 * those accordingly.
 */
function verifyRadio(elt) {

    var ok   = true;
    var lErr = "";

    var requires = elt.getAttribute("requires");
    var check    = elt.getAttribute("check");
    var required = elt.getAttribute("required");
    var errmsg   = elt.getAttribute("errmsg");

    if (elt.checked && check != null) {

	var err = eval(check + "()");

	if (err != 0) {
	    lErr += "<LI>" + elt.name + ": " + err + "</LI>\n";
	    ok = false;
	}
    }

    if (requires != null && elt.checked) {
	
	var requiredFields = requires.split(',');
	
	for (var j= 0; j < requiredFields.length; j++) {

	    if (isEmpty(elt.form.elements[requiredFields[j]].value)) {

		lErr += "<LI>" + elt.name + dict[language]["requires"] + requiredFields[j] + "</LI>\n";
		ok = false;
	    }
	}
    }

    // Now check if the radio group itself is required
    if (required != null) {

	var noneOK = true;

	for (var i= 0; i < elt.form.elements[elt.name].length; i++) {
	    if (elt.form.elements[elt.name][i].checked) {
		noneOK = false;
		break;
	    }
	}

	if (noneOK) {
	    lErr += "<LI>" + elt.name + dict[language]["required"] + "</LI>\n";
	}

	ok = ! noneOK;
    }
    
    if (! ok) {
      if (errmsg != null && errmsg != "") {
	errorMsg += "<LI>" + errmsg + "</LI>\n";
      }
      else {
	errorMsg += lErr;
      }
    }

    return ok;
}


/**
 * Verify a text field. The field is OK if one of the following conditions is true:
 * 1. it's not required and empty;
 * 2. it's not empty and doesn't have a mask specified;
 * 3. it's not empty and satisfies it's specified mask.
 */
var nav4 = window.Event ? true : false;
//-------------------------
function useTextMask(con,e,mask,mlen) {
  if (nav4){ // Navigator 4.0x
    var whichCode = e.which;
    }else{ // Internet Explorer 4.0x
    var whichCode = e.keyCode;
	}

var strlen = con.value.length;

if (strlen>mlen)
  return false;

var strval = con.value;
var strchar = mask.substring(strlen,strlen+1);

if (strchar=='#'){
con.value = strval+String.fromCharCode(whichCode);
}else{
con.value = strval+ mask.substring(strlen,strlen+1) +String.fromCharCode(whichCode);
}}


//-------------------------
function useTextMask2(formit,e) {
if (nav4){ // Navigator 4.0x
var whichCode = e.which;
}else{ // Internet Explorer 4.0x
var whichCode = e.keyCode;
}	

nval = formit.value;
npos = nval.length+1;
newchar = String.fromCharCode(whichCode);

var mask = formit.getAttribute("mask");
mm=mask.split(/([\[\]{}])/);
mmpos=0;
j=1;

do{
mmax=mm[j+1].split(",");
mmaxnum = (!mmax[1]) ? mmax[0]  : mmax[1];
//alert(mmaxnum);
//mmpos= Number(mmpos) + Number(mm[j+1]);
mmpos= Number(mmpos) + Number(mmax[0]);
mval='['+mm[j]+']';
j=j+2;	
} 
while(mmpos<npos);

if (!verifyMask(newchar,mval)){
return false;	
}else{
return newchar;		
}

}
//-------------------------


function verifyText(elt) {

    var ok   = true;
    var lErr = "";

    var check    = elt.getAttribute("check");
    var mask     = elt.getAttribute("mask");
//    var required = elt.getAttribute("mandatory");
    var required = elt.getAttribute("required");
//    var mandatory = elt.getAttribute("mandatory");
    var errmsg   = elt.getAttribute("errmsg");
    var title   = elt.getAttribute("title");

//	elt.SetAttribute('background-color','#FF0000');
	//elt.SetAttribute("font-size","2");
//	alert(proba);
//		alert(required);

    if (! isEmpty(elt.value) && mask != null && ! verifyMask(elt.value, mask)) {
	ok = false;
	lErr += "<LI>" + elt.name + ": " + elt.value + dict[language]["nomatch"] + mask + "</LI>\n";
    }


    /* Perform extra check by evaluating CHECK attribute
     */
    if (! isEmpty(elt.value) && check != null) {

	var err = eval(check + "('" + elt.value + "')");

	if (err != 0) {
	    lErr += "<LI>" + elt.name + ": " + err + "</LI>\n";
	    ok = false;
	}
    }
    
//	if (required=='true'){
//		alert('aa');}
    if (title != '') {
	ok = false;
    }


    if (required != null && isEmpty(elt.value)) {
	ok = false;
	lErr += "<LI>" + elt.name + dict[language]["required"] + "</LI>\n";
    }

    if (errmsg != null && errmsg != "") {
	errorMsg += "<LI>" + errmsg + "</LI>\n";
    }
    else {
	errorMsg += lErr;
    }

    return ok;
}


/**
 * The text element may have a mask specified. This should take the form of a
 * regular expression. If the element doesn't match the mask, false is returned.
 */

function useMask(value, mask) {
	exp = new RegExp(mask);
	return exp.compile(value);
}


function verifyMask(value, mask) {
	exp = new RegExp(mask);
	return exp.test(value);
}


/**
 * Determine whether a value is empty. This is true when all characters in the
 * value are one of "\n, \t, ' '".
 */
function isEmpty(value) {
    
    for (var i= 0; i < value.length; i++) {
	var c = value.charAt(i);

	if ((c != ' ') && (c != '\n') && (c != '\t')) return false;
    }

    return true;
}


function requiresHandler(e) {

    var form;

    if (e.target != null) {
	form = e.target.form;
    }
    else {
	form = e.srcElement.form;
    }


    /* Find all fields that require other fields
     */
    for (var i= 0; i < form.length; i++) {

	var elt = form.elements[i];
	var requires          = elt.getAttribute("requires");
	var requiresHandler   = elt.getAttribute("requireshandler");
	var unrequiresHandler = elt.getAttribute("unrequireshandler");

	if (elt.checked && requires != null) {

	    if (requiresHandler != null) {
		eval(requiresHandler);;
	    }
	}
	else if (requires != null) {

	    if (unrequiresHandler != null) {
		eval(unrequiresHandler);;
	    }
	}
    }

    e.cancelBubble= true;
}



/**
 * Popup the error window if it's not already there, and write the errors.
 */ 
function showErrWindow(message) {

    if ( (errWindow != null && errWindow.closed) || (errWindow == null ) ) {
	errWindow = open("", "errors", "width=400,height=500,resizeable=no,menubar=no,locationbar=no,statusbar=no");
    }
    else {
	errWindow.focus();
    }

    errWindow.document.open();
    errWindow.document.write("<HTML>\n<HEAD>\n");

    if (cssURL != "") {
    	errWindow.document.write("<LINK REL=\"stylesheet\" TYPE=\"text/css\" HREF=\"" + cssURL + "\">\n");
    }

    errWindow.document.write("</HEAD>\n<BODY CLASS=\"vfErrMsg\">\n");
    errWindow.document.write("<P>" + dict[language]["header"] + "</P>\n");
    errWindow.document.write("<P>" + message + "</P>\n");
    errWindow.document.write("<TABLE><TR><TD><FORM>\n");
    errWindow.document.write("<INPUT TYPE=\"button\" NAME=\"\" VALUE=\"" + dict[language]["close"] + "\" ONCLICK=\"window.close();\">\n");
    errWindow.document.write("</TR></TD></TABLE></FORM>\n");
    errWindow.document.write("</BODY>\n</HTML>\n");
    errWindow.document.close();
}


/*******************************************************************************
 *
 * User functions to customize behaviour.
 *
 ******************************************************************************/

/**
 * Create an event listener for the form, that listens to changes, and applies the
 * required class to new required fields.
 */
function setRequiresHandler(form) {

    for (var i = 0; i < form.length; i++) {
	form.elements[i].onclick = requiresHandler;
    }
}


/**
 * Set you own error header
 */
function setErrorHeader(header) {
    dict[language]["header"] = header;
}


/**
 * Set the stylesheet to use for the error window.
 */
function setStylesheet(url) {
    cssURL = url;
}


/**
 * Set the language to use if it exists.
 */
function setLanguage(lang) {

    if (dict[lang] != null) {
	language = lang;
    }
}
