// file: form.js
// version: 1.3
// author: KBE20100611



/*

	fieldArray must be an array of arrays containing:

	[ name, validation, mandatory, default, clearValue, legend, help, type, id ]

	name		=	<input>/<textarea> name parameter
	validation	= 	email				checks for email
					integer;min;max		checks for integer
					date				checks for date
					datetime			checks for date time
					time				checks for time
					cpr					checks for cpr number
	mandatory	=	true | false
	default		=	default value to be inserted if field is left empty
	clearValue	=	true | false
	legend		=	legend text
	help		=	help text
	type		=	text | textarea | radio | select | password | submit
	id			=	<input>/<textarea> id parameter

	example for a text field containing a mandatory zip code with values between 0 and 9999 where the field is cleared upon focus:

	[ 'zip', 'integer;0;9999', true, 'Your zip code', true, 'Zip code', 'Enter your zip code here', 'text', 'dfrm_input_zip' ]

*/



// ----- object: form
TECHHOUSE.form = {};



// ----- json: string
TECHHOUSE.form.string = {
	DK: {
		1000: 'Feltet indeholder ikke en e-mail-adresse (KONTO@DOMÆNE.DK).',
		1010: 'Feltet indeholder ikke et heltal.',
		1020: 'Feltet indeholder ikke et heltal mellem',
		1030: ' og ',
		1040: 'Feltet indeholder ikke en dato skrevet som \'DD-MM-YYYY\' eller \'DDMMYY\' eller \'DDMMYYYY\'.',
		1050: 'Feltet indeholder ikke en dato og et tidspunkt skrevet som \'DD-MM-YYYY HH:mm\' eller \'DDMMYY HHmm\' eller \'DDMMYYYYHHmm\'.',
		1060: 'Feltet indeholder ikke et tidspunkt skrevet som \'HH:mm\' eller \'HHmm\'.',
		1070: 'Feltet indeholder ikke et CPR-nummer skrevet som DDMMYY-CCCC.',
		1080: 'Feltet har en ukorrekt checksum.',
		1090: 'Feltet er obligatorisk.',
		1100: 'Gruppen er obligatorisk.'
		},
	UK: {
		1000: 'The field does not contain an e-mail address (ACCOUNT@DOMAIN.COM).',
		1010: 'The field does not contain an integer.',
		1020: 'The field does not contain an integer between',
		1030: ' and ',
		1040: 'The field does not contain a date written as \'DD-MM-YYYY\' or \'DDMMYY\' or \'DDMMYYYY\'.',
		1050: 'The field does not contain a date and a time written as \'DD-MM-YYYY HH:mm\' or \'DDMMYY HHmm\' or \'DDMMYYYYHHmm\'.',
		1060: 'The field does not containt a time written as \'HH:mm\' or \'HHmm\'.',
		1070: 'The field does not contain a danish social security number written as DDMMYY-CCCC.',
		1080: 'The field has an incorrect checksum.',
		1090: 'The field is mandatory.',
		1100: 'The group is mandatory.'
		}
	};



// ----- function: enterField
TECHHOUSE.form.enterField = function( fieldArray, elem ) {

	var NAME = 0;
	var VALIDATION = 1;
	var MANDATORY = 2;
	var DEFAULT = 3;
	var CLEARVALUE = 4;
	var LEGEND = 5;
	var HELP = 6;
	var TYPE = 7;
	var ID = 8;

	var elemName, f, checkThis;
	var fieldElem, vType, validState, elem;
	var errStr;
	var helpElem;

	helpElem = document.getElementById( "dfrm_helpField" );

	if( elem ) {
		elemName = elem.name;
		}

	for( f = 0; f < fieldArray.length; f++ ) {
		checkThis = true;

		// if an element is specified, only validate this element
		if( elemName ) {
			if( elemName != fieldArray[ f ][ NAME ] ) {
				checkThis = false;
				}
			}

		// field must be checked
		if( checkThis ) {

			// get element if necessary
			if( elem ) {
				fieldElem = elem;
				}
			else {
				fieldElem = document.getElementById( fieldArray[ f ][ ID ] );
				}

			errStr = '';

			if( fieldElem ) {

				// clearvalue
				if( fieldArray[ f ][ CLEARVALUE ] ) {

					// field value is empty or identical to default value
					if( ( fieldElem.value == '' ) || ( fieldElem.value == fieldArray[ f ][ DEFAULT ] ) ) {

						// clear field
						fieldElem.value = '';
						fieldElem.select(); // just for IE

						// remove clearValue class
						fieldElem.className = fieldElem.className.replace( /dfrm_clearValue/g, '' );

						}

					}

				}

			// update help text
			if( helpElem ) {

				if( fieldElem.id == fieldArray[ f ][ ID ] ) {
					helpElem.innerHTML = '';
					if( fieldArray[ f ][ LEGEND ] ) {
						helpElem.innerHTML = '<span>'
							+ fieldArray[ f ][ LEGEND ]
							+ ': </span>';
						}
					helpElem.innerHTML += fieldArray[ f ][ HELP ];
					}

				}

			}

		}

	}




// ----- function: exitField
TECHHOUSE.form.exitField = function( fieldArray, elem, clearDefaults ) {

	var NAME = 0;
	var VALIDATION = 1;
	var MANDATORY = 2;
	var DEFAULT = 3;
	var CLEARVALUE = 4;
	var LEGEND = 5;
	var HELP = 6;
	var TYPE = 7;
	var ID = 8;

	var retval = true;
	var elemName, f, checkThis;
	var fieldElem, vType, validState, elem;
	var errLegend, errString;
	var errorElem;
	var radiogroups = [];
	var tmpArray = [];
	var t, tmpElem;
	var mandatoryState;
	var mustBeCleared = [];
	var tmpDT;

	errorElem = document.getElementById( "dfrm_errorField" );

	if( elem ) {
		elemName = elem.name;
		}

	for( f = 0; f < fieldArray.length; f++ ) {
		checkThis = true;
		mandatoryState = true;

		// if an element is specified, only validate this element
		if( elemName ) {
			if( elemName != fieldArray[ f ][ NAME ] ) {
				checkThis = false;
				}
			}

		// field must be checked
		if( checkThis ) {

			// get element if necessary
			if( elem ) {
				fieldElem = elem;
				}
			else {
				fieldElem = document.getElementById( fieldArray[ f ][ ID ] );
				}

			errStr = '';

			if( fieldElem ) {

				// reset field class
				fieldElem.className = '';

				/*	----------------------------------------
					PRIORITY 1 : set validState if field is registered for validation
					(field value must be valid according to validation flag)
					---------------------------------------- */

				if( fieldArray[ f ][ VALIDATION ] ) {

					// check for semicolon separated parameters
					if( fieldArray[ f ][ VALIDATION ].indexOf( ';' ) != -1 ) {
						tmpArray = fieldArray[ f ][ VALIDATION ].split( ';' );
						vType = tmpArray.shift();
						}
					else {
						vType = fieldArray[ f ][ VALIDATION ];
						}

					switch( vType ) {

						case 'email':
							if( fieldElem.value != fieldArray[ f ][ DEFAULT ] ) {
								validState = isEmail( fieldElem.value ); //isEmail() is in script.js
								if( ! validState ) {
									if( fieldArray[ f ][ LEGEND ] ) {
										errLegend = '<span>'
										+ fieldArray[ f ][ LEGEND ]
										+ ': </span>';
										}
									else {
										errLegend = '';
										}
									errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1000 ];
									}
								}
							break;

						case 'integer':
							if( fieldElem.value != fieldArray[ f ][ DEFAULT ] ) {
								validState = true;
								value = parseInt( fieldElem.value ) + 0;
								if( Math.floor( value ) != value ) {
									validState = false;

									if( fieldArray[ f ][ LEGEND ] ) {
										errLegend = '<span>'
										+ fieldArray[ f ][ LEGEND ]
										+ ': </span>';
										}
									else {
										errLegend = '';
										}
									errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1010 ];
									}
								else {
									if( ( fieldElem.value < parseInt( tmpArray[ 0 ] ) ) || ( fieldElem.value > parseInt( tmpArray[ 1 ] ) ) ) {
										validState = false;
										if( fieldArray[ f ][ LEGEND ] ) {
											errLegend = '<span>'
											+ fieldArray[ f ][ LEGEND ]
											+ ': </span>';
											}
										else {
											errLegend = '';
											}
										errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1020 ]
											+ ' '	
											+ tmpArray[ 0 ]
											+ TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1030 ]
											+ tmpArray[ 1 ]
											+ '.';
										}
									}
								}
							break;

						case 'date':
							if( fieldElem.value != fieldArray[ f ][ DEFAULT ] ) {
								tmpDT = isDate( fieldElem.value ); // isDate() is in script.js
								if( tmpDT == '' ) {
									validState = false;
									}
								else {
									validState = true;
									fieldElem.value = tmpDT;
									}
								if( ! validState ) {
									if( fieldArray[ f ][ LEGEND ] ) {
										errLegend = '<span>'
										+ fieldArray[ f ][ LEGEND ]
										+ ': </span>';
										}
									else {
										errLegend = '';
										}
									errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1040 ];
									}
								}
							break;

						case 'datetime':
							if( fieldElem.value != fieldArray[ f ][ DEFAULT ] ) {
								tmpDT = isDateTime( fieldElem.value ); // isDateTime() is in script.js
								if( tmpDT == '' ) {
									validState = false;
									}
								else {
									validState = true;
									fieldElem.value = tmpDT;
									}
								if( ! validState ) {
									if( fieldArray[ f ][ LEGEND ] ) {
										errLegend = '<span>'
										+ fieldArray[ f ][ LEGEND ]
										+ ': </span>';
										}
									else {
										errLegend = '';
										}
									errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1050 ];
									}
								}
							break;

						case 'time':
							if( fieldElem.value != fieldArray[ f ][ DEFAULT ] ) {
								tmpDT = isTime( fieldElem.value ); // isTime() is in script.js
								if( tmpDT == '' ) {
									validState = false;
									}
								else {
									validState = true;
									fieldElem.value = tmpDT;
									}
								if( ! validState ) {
									if( fieldArray[ f ][ LEGEND ] ) {
										errLegend = '<span>'
										+ fieldArray[ f ][ LEGEND ]
										+ ': </span>';
										}
									else {
										errLegend = '';
										}
									errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1060 ];
									}
								}
							break;

						case 'cpr':
							if( fieldElem.value != fieldArray[ f ][ DEFAULT ] ) {
								tmpArray = TECHHOUSE.isSocSecNum( fieldElem.value );
								validState = tmpArray[ 0 ];
								if( validState == false ) {

									switch( tmpArray[ 1 ] ) {

										case 1:
											if( fieldArray[ f ][ LEGEND ] ) {
												errLegend = '<span>'
												+ fieldArray[ f ][ LEGEND ]
												+ ': </span>';
												}
											else {
												errLegend = '';
												}
											errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1070 ];
											break;

										case 2:
											if( fieldArray[ f ][ LEGEND ] ) {
												errLegend = '<span>'
												+ fieldArray[ f ][ LEGEND ]
												+ ': </span>';
												}
											else {
												errLegend = '';
												}
											errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1080 ];
											break;

										}

									}

								else {

									// insert missing dash if necessary
									if( fieldElem.value.match( /[0-9]{10}/ ) ) {
										fieldElem.value = fieldElem.value.substring( 0, 6 )
											+ '-'
											+ fieldElem.value.substring( 6, 10 );
										}

									}
								}
							break;

						}

					if( validState == true ) {

						// remove any validateError class
						fieldElem.className = fieldElem.className.replace( /dfrm_validateError/g, "" );

						}

					else {

						// add validateError class
						if( fieldElem.className.indexOf( 'dfrm_validateError' ) == -1 ) {
							fieldElem.className = 'dfrm_validateError';
							}

						}

					}



				/*	----------------------------------------
					PRIORITY 2 : set mandatoryState if field is mandatory
					(field may not be empty or contain the default value)
					---------------------------------------- */

				if( fieldArray[ f ][ MANDATORY ] ) {

					// select
					if( fieldArray[ f ][ TYPE ] == 'select' ) {

						if( fieldElem ) {

							if( fieldElem.value == -1 ) {

								// add mandatoryError class
								fieldElem.className += ' dfrm_mandatoryError';
								if( fieldElem.className.indexOf( 'dfrm_mandatoryError' ) == -1 ) {
									fieldElem.className += ' dfrm_mandatoryError';
									}

								if( fieldArray[ f ][ LEGEND ] ) {
									errLegend = '<span>'
									+ fieldArray[ f ][ LEGEND ]
									+ ': </span>';
									}
								else {
									errLegend = '';
									}
								errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1090 ];
								mandatoryState = false;
								}

							else {

								// remove mandatoryError class
								fieldElem.className = fieldElem.className.replace( /dfrm_mandatoryError/g, "" );

								}

							}

						}

					// radio
					else if( fieldArray[ f ][ TYPE ] == 'radio' ) {

						// if the radio button group hasn't been met by the script before
						if( ! radiogroups.inArray( fieldArray[ f ][ NAME ] ) ) {

							// if the field is the same as the current field in the loop
							if( fieldElem.id == fieldArray[ f ][ ID ] ) {
								radiogroups.push( fieldArray[ f ][ NAME ] );

								// if no button in groups is set
								tmpArray = _drfm_getButtonsInRadioGroup( fieldArray, fieldArray[ f ][ NAME ] );
								if( ! _dfrm_isButtonSelected( tmpArray ) ) {

									// add mandatoryError class
									containerElem = document.getElementById( fieldArray[ f ][ ID ] ).parentNode;
									if( containerElem ) {
										if( containerElem.className.indexOf( 'dfrm_mandatoryError' ) == -1 ) {
											containerElem.className += ' dfrm_mandatoryError';
											}
										}

									if( fieldArray[ f ][ LEGEND ] ) {
										errLegend = '<span>'
										+ fieldArray[ f ][ LEGEND ]
										+ ': </span>';
										}
									else {
										errLegend = '';
										}
									errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1100 ];
									mandatoryState = false;
									}

								else {

									// remove mandatoryError class (from all buttons)
									for( t = 0; t < tmpArray.length; t++ ) {
										tmpElem = document.getElementById( tmpArray[ t ] );

										if( tmpElem ) {
											tmpElem.parentNode.className = tmpElem.parentNode.className.replace( /dfrm_mandatoryError/g, "" );
											}

										}

									}

								}

							}

						}

					// checkbox
					else if( fieldArray[ f ][ TYPE ] == 'checkbox' ) {

						if( ! fieldElem.checked ) {

							// add mandatoryError class
							if( fieldElem.parentNode.className.indexOf( 'dfrm_mandatoryError' ) == -1 ) {
								fieldElem.parentNode.className += ' dfrm_mandatoryError';
								}

							if( ! errStr ) {
									if( fieldArray[ f ][ LEGEND ] ) {
										errLegend = '<span>'
										+ fieldArray[ f ][ LEGEND ]
										+ ': </span>';
										}
									else {
										errLegend = '';
										}
									errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1090 ];
									mandatoryState = false;
								}
							else {
								errString += TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1090 ];
								}

							}

						else {

							// remove mandatoryError class
							fieldElem.parentNode.className = fieldElem.parentNode.className.replace( /dfrm_mandatoryError/g, "" );

							}

						}

					// text, textarea, password
					else {

						if( ( ! fieldElem.value ) || ( fieldElem.value == fieldArray[ f ][ DEFAULT ] ) ) {

							// restore default value
							fieldElem.value = fieldArray[ f ][ DEFAULT ];

							// add mandatoryError class
							if( fieldElem.className.indexOf( 'dfrm_mandatoryError' ) == -1 ) {
								fieldElem.className += ' dfrm_mandatoryError';
								}

							if( ! errStr ) {
								if( fieldArray[ f ][ LEGEND ] ) {
									errLegend = '<span>'
									+ fieldArray[ f ][ LEGEND ]
									+ ': </span>';
									}
								else {
									errLegend = '';
									}
								mandatoryState = false;
								errString = TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1090 ];
								}
							else {
								errString += TECHHOUSE.form.string[ TECHHOUSE.lang ][ 1090 ];
								}
							}

						else {

							// remove mandatoryError class
							fieldElem.className = fieldElem.className.replace( /dfrm_mandatoryError/g, "" );

							}
						}
					
					}



				/*	----------------------------------------
					PRIORITY 3 : add mandatory class
					---------------------------------------- */
				if( fieldArray[ f ][ MANDATORY ] ) {
					fieldElem.className += ' dfrm_mandatory';
					}



				/*	----------------------------------------
					PRIORITY 4 : restore default value to empty fields
					---------------------------------------- */

				if( fieldArray[ f ][ CLEARVALUE ] ) {

					// field value is empty or identical to default value
					if( ( ! fieldElem.value ) || ( fieldElem.value == fieldArray[ f ][ DEFAULT ] ) ) {

						//restore default value
						fieldElem.value = fieldArray[ f ][ DEFAULT ];

						//add clearValue class
						if( fieldElem.className.indexOf( 'dfrm_clearValue' ) == -1 ) {
							fieldElem.className += ' dfrm_clearValue';
							}

						}

					}

				}

			// if field is not mandatory and contains the default value,
			// remember to clear it before submission
			if( clearDefaults ) {
				if( ! fieldArray[ f ][ MANDATORY ] ) {
					if( fieldElem.value == fieldArray[ f ][ DEFAULT ] ) {
						if( ( fieldArray[ f ][ TYPE ] != 'submit' ) && ( fieldArray[ f ][ TYPE ] != 'radio' ) ) {
							mustBeCleared.push( fieldArray[ f ][ ID ] );
							}
						}
					}
				}

			// set message
			if( errorElem ) {
				if( errLegend ) {
					errorElem.innerHTML = errLegend;
					}
				if( errString ) {
					if( errLegend ) {
						errorElem.innerHTML += errString;
						}
					else {
						errorElem.innerHTML = errString;
						}
					}
				else {
					errorElem.innerHTML = '';
					}
				}

			// set retval
			if( ( validState == false ) || ( mandatoryState == false ) ) {
				retval = false;
				}

			}

		}

		// if form content is accepted for submission, then clear any default values
		if( retval && clearDefaults ) {
			for( f = 0; f < mustBeCleared.length; f++ ) {
				elem = document.getElementById( mustBeCleared[ f ] );
				if( elem ) {
					elem.value = '';
					elem.className = elem.className.replace( /dfrm_validateError/g, "" );
					}
				}
			}

	return retval;
	}



function _drfm_getButtonsInRadioGroup( fieldArray, name ) {

	var NAME = 0;
	var VALIDATION = 1;
	var MANDATORY = 2;
	var DEFAULT = 3;
	var CLEARVALUE = 4;
	var LEGEND = 5;
	var HELP = 6;
	var TYPE = 7;
	var ID = 8;

	var f;
	var buttonArray = [];

	for( f = 0; f < fieldArray.length; f++ ) {

		if( ( fieldArray[ f ][ NAME ] == name ) && ( fieldArray[ f ][ TYPE ] == 'radio' ) ) {
			buttonArray.push( fieldArray[ f ][ ID ] );
			}

		}

	return buttonArray;
	}



function _dfrm_isButtonSelected( buttonArray ) {

	var retval = false;
	var elem;
	var b;

	for( b = 0; b < buttonArray.length; b++ ) {
		elem = document.getElementById( buttonArray[ b ] );

		if( elem ) {

			if( elem.checked == true ) {
				retval = true;
				}

			}

		}


	return retval;
	}


