// TODO: http://groups.yahoo.com/group/wdf-dom/message/4531

var oForms = { // <form class="form">

		oWarnings : { // error protocol ( dansk, english, deutsch )
			string			: [ "Skal udfyldes", "Specify", "Fehlt" ],
			number 			: [ "Skriv kun tal", "Numbers only", "Nur Zahlen" ],
			number_or_empty : [ "Skriv kun tal", "Numbers only", "Nur Zahlen" ],
			integer 		: [ "Skriv kun hele tal", "Integers only", "Ganze Zahl" ],
			currency 		: [ "Format: 23.100.000,50", "Syntax: 23.000.000,50", "Währung: 23.000.000,50" ],
			email 			: [ "navn@adresse.dk", "name@address.com", "name@adresse.de" ],
			selection		: [ "Vælg mindst en", "Select", "Wählen" ],
			error			: [ "Fejl", "Error", "Fehler" ]
		},
	
		mInit : function () { // initialize
			
			// override default focus
			oForms.mFocus ();
			
			// init forms
			if ( document.forms.length > 0 ) {
				var oForm, a = 0;
				while (( oForm = document.forms [ a++ ]) != null ) {
					if ( oForm.className == "form" || oForm.className == "xForm" || oForm.className == "spot" || oForm.className == "block" ) {
						oForm.mUpdate 		= oForms.mUpdate;
						oForm.onmouseup 	= oForms.mRelate;
						oForm.onkeyup 		= oForms.mRelate;
						oForm.mValidate		= oForms.mValidate;
						oForm.onsubmit 		= oForm.mValidate;
						oForm.mCollect 		= oForms.mCollect;
						oForm.mCollectAll 	= oForms.mCollectAll;
						oForm.bClientside	= oForm.action.indexOf ( "javascript:" ) !=-1;
						oForm.aFieldsets 	= oForm.getElementsByTagName ( "fieldset" );
						oForm.aInputs		= oForm.getElementsByTagName ( "input" );
						for ( var i = 0; i < oForm.aInputs.length; i++ ) {
							var oInput = oForm.aInputs.item ( i );
							var sRelate = oInput.getAttribute ( "relate" );
							if ( sRelate ) oForm.mUpdate ( sRelate, oInput.checked );
						}
					}
				}
			}
		},
		
		mFocus : function () { // focus form fields by id="userfocus"
			var oFocus = document.getElementById ( "userfocus" );
			if ( oFocus ) {
				function userfocus () {
					try {
						setTimeout ( function () { oFocus.focus() }, 20 );
						if ( oFocus.value == " " ) oFocus.value = "";
					}
					catch ( exception ) {}
				}
				oGod.mSubscribe ( "hyperlink actions implemented", userfocus );
			}
		},
		
		mUpdate : function ( sRelate, bShow ) { // utility
			var i = 0; while ( i < this.aFieldsets.length ) {
				var oFieldset = this.aFieldsets.item ( i++ );
				if ( oFieldset.getAttribute ( "relate" ) == sRelate ) 
					oFieldset.style.display = bShow ? "block" : "none";
			}
			oGod.mBroadcast ( sRelate + " toggled " + ( bShow ? "on" : "off" ));
		},
		
		mRelate : function ( e, oNode ) { // mechanics
			if ( !oNode ) {
				e = e ? e : window.event;
				var keyCode = e.keyCode;
				if ( e.type == "keyup" && keyCode == 9 || keyCode == 16 ) return;
				oNode = e.target ? e.target : e.srcElement;
			}
			if ( oNode.nodeName.toLowerCase () == "label" ) {
				if( oNode.htmlFor != "" ) { 
					oNode = document.getElementById ( oNode.htmlFor );
				}
			}
			if ( !oNode ) return;
			if ( oNode.getAttribute ( "relate" )) {
				var sRelate = oNode.getAttribute ( "relate" );
				var oForm = e.currentTarget ? e.currentTarget : oTools.mGetAncestorByNodeName ( oNode, "form" );
				switch ( oNode.type ) {
					case "checkbox" :
						// adjust event flow
						var bState = !oNode.checked;
						oForm.mUpdate ( sRelate, bState );
						break;
					case "radio" :
						/*
						TODO: what is this code doing?
						var aInputs = oTools.mGetAncestorByNodeName ( oNode, "fieldset" ).getElementsByTagName ( "input" );
						for ( var i = 0; i < aInputs.length; i++ ) {
							if ( aInputs.item ( i ).getAttribute ( "relate" )) {
								oForm.mUpdate ( aInputs.item ( i ).getAttribute ( "relate" ), false );
							}
						}
						*/
						if ( sRelate != "false" ) oForm.mUpdate ( sRelate, true );
						break;
				}
				oLayout.mUpdate ();
			}
			if ( oNode.type == "radio" ) {
				var sName = oNode.name;
				oForm = e.currentTarget ? e.currentTarget : oTools.mGetAncestorByNodeName ( oNode, "form" );
				var i = 0; while ( i < oForm.aInputs.length ) {
					var oInput = oForm.aInputs.item ( i++ );
					if ( oInput.name == oNode.name && oInput.getAttribute ( "relate" ) && oInput != oNode ) 
						oForm.mUpdate ( oInput.getAttribute ( "relate" ), false );					
				}
				oLayout.mUpdate ();
			}
		},
		
		mValidate : function () { // validate form
			
			oForms.bValid = true;
			oForms.aFieldsets = this.getElementsByTagName ( "fieldset" );
			for ( var a = 0; a < oForms.aFieldsets.length; a++ ) {
				oForms.oFieldset = oForms.aFieldsets.item ( a );
				oForms.sValidate = oForms.oFieldset.getAttribute ( "validate" );
				if ( oForms.sValidate && oForms.oFieldset.style.display != "none" ) 
					switch ( oForms.mType ()) {
						case "text" 	: oForms.mCheck ( "text/textarea" ); 	break;
						case "file"	: oForms.mCheck ( "file" ); 	break;
						case "checkbox"	: oForms.mCheck ( "checkbox/radio" ); 	break;
						case "radio"	: oForms.mCheck ( "checkbox/radio" ); 	break;
						case "textarea"	: oForms.mCheck ( "text/textarea" ); 	break;
						case "select"	: oForms.mCheck ( "select" ); 			break;
						case "password"	: 
						
							
						
							/* oForms.mCheck ( "password" ); */
//							oForms.mPasswordTest();


							//alert(oForms.oCurrent.value);
							//alert(document.forms[0].password2.value);
							oForms.mPasswordTest(oForms.oCurrent.value, document.forms[0].password2.value);							
							break;
					}
			}
			if ( oForms.bValid && !this.bClientside ) { // discard non-displayed fieldsets
				var oFieldset, i = 0;
				while (( oFieldset = this.aFieldsets [ i++ ]) != null ) {
					if ( oFieldset.style.display == "none" ) {
						oFieldset.parentNode.removeChild ( oFieldset );
					}
				}
			}
			return oForms.bValid;
		},
		
		mType : function () { // typecast form controls
			var mNode = function ( sNode ) {
				try { 
					oForms.oCurrent = oForms.oFieldset.getElementsByTagName ( sNode ).item ( 0 );
					return oForms.oFieldset.getElementsByTagName ( sNode ).item ( 0 ); 
				}
				catch ( e ) {};
				return false;
			}
			if ( mNode ( "input" )) return mNode ( "input" ).type;
			else if ( mNode ( "select" )) return "select";
			else if ( mNode ( "password" )) return "password";
			else if ( mNode ( "textarea" )) return "textarea";
		},
		
		mCheck : function ( sType, bReverseflow ) { // check form controls
			switch ( sType ) {
				case "text/textarea" :
					if ( oForms.sValidate.charAt(0) == "/" ) oForms.mTest ( eval ( oForms.sValidate ), true );
					else switch ( oForms.sValidate ) {
						case "number"			: oForms.mTest ( /^[0-9]+(\,[0-9]+)?$/ ); break;
						case "number_or_empty"	: if(oForms.oCurrent.value.length > 0) oForms.mTest ( /^[0-9]*(\,[0-9]*)?$/ ); break;
						case "integer"			: oForms.mTest ( /^[0-9]+$/ ); break;
						case "currency"			: oForms.mTest ( /^[0-9]{1,3}(\.[0-9]{3})*(\,[0-9]{1,2})?$/ ); break;
						case "email"			: oForms.mTest ( /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/ ); break;
						case "string"			: oForms.mTest ( /[a-å]|[A-Å]|[0-9]/ ); break;
						/* case "password"			: oForms.mPasswordTest(); break; */
						default					: try { eval ( oForms.sValidate ); } catch ( exception ) {}; break;
					}
					break;
				case "file" :
						//alert( 'Value: ' + oForms.oCurrent.value );
						if(oForms.oCurrent.value.length > 3) {						
							//oForms.mClear ( true );
						//	oForms.oCurrent.style.backgroundColor = '';
						//	document.getElementById('msg_error_cv').style.display = 'none';

						} else { // display a validation error
						
							oForms.mClear ( false );
						//	oForms.oCurrent.style.backgroundColor = '#FF0000';							
							//document.getElementById('msg_error_cv').style.display = 'block';
							oForms.mWarn ( 'Der skal vedhæftes både ansøgning og CV.' );							
						}
					break;
				case "checkbox/radio" : 
					var bChecked = false;
					var aElements = oForms.oFieldset.getElementsByTagName ( "input" );
					for ( var b = 0; b < aElements.length; b++ ) {
						if ( aElements.item ( b ).checked ) bChecked = true;
					}
					if ( bReverseflow ? bChecked : !bChecked ) oForms.mWarn ( oForms.oWarnings [ "selection" ][ oGod.iLanguage ]);
					else oForms.mClear ( false );
					break;
				case "select" :
					if ( oForms.oCurrent.value == "" || oForms.oCurrent.selectedIndex <= 0 ) oForms.mWarn ( oForms.oWarnings [ "selection" ][ oGod.iLanguage ] );
					else oForms.mClear ( false );
					break;
			}
		},
		
		mTest : function ( oExpression ) { // test regular expression
			if ( oClient.bSafari ) {
			
				oForms.oCurrent.blur ();
			}
			
			if ( oForms.oCurrent.className.indexOf ( "warning" ) !=-1 ) {
			
				oForms.bValid = false;
			
			} else if ( !oExpression.test ( oForms.oCurrent.value ) || oForms.oCurrent.value.length<1) {
				
				var sWarning =  oForms.oWarnings [ ( oForms.oWarnings [ oForms.sValidate ] ? oForms.sValidate : "error" ) ][ oGod.iLanguage ];
				oForms.mWarn ( sWarning );
				
			} else {
				oForms.mClear ( false );
			}
		},
		
		mPasswordTest : function ( password1, password2 ) { // test passwords, the two passwords should match.
			
			if(password1 != password2) {
			
				oForms.mWarn ( 'Gentag samme adgangskode' );	
			}		
		},
		
		mListeners : function ( sType, bListen ) { // add-remove event listener bundle 
			switch ( sType ) {
				case "text" :
				case "textarea"	: 
				case "password"	: 				
					oTools.mListener ( bListen, oForms.oCurrent, "blur", oForms.mReset, false ); 
					break;
				case "file"	: 
					oTools.mListener ( bListen, oForms.oCurrent, "file", oForms.mReset, false ); 
					break;
				case "select" : 
					oTools.mListener ( bListen, oForms.oCurrent, "change", oForms.mReset, false ); 
					break;
				default : 
					oTools.mListener ( bListen, oForms.oFieldset.getElementsByTagName ( "fieldset" ).item ( 0 ), "mouseup", oForms.mReset, false ); 
					break;
			}
		},
		
		mWarn : function ( sWarning ) {
		
			oForms.bValid = false;
			
			if ( oForms.oFieldset.getAttribute ( "warning" )) {
				var aWarnings = oForms.oFieldset.getAttribute ( "warning" ).split ( ";" );
				sWarning = aWarnings [ oGod.iLanguage ];
			}
			var sType = oForms.mType ( oForms.oFieldset );
			if ( sType == "text" || sType == "textarea" ) {
				//oForms.oCurrent.style.width = oForms.oCurrent.offsetWidth + "px"; /* mozbug */
				oForms.oCurrent.sOriginalvalue = oForms.oCurrent.value; 
				oForms.oCurrent.className = oForms.oCurrent.className == "" ? "warning" : oForms.oCurrent.className + " warning";
				oForms.oCurrent.value = sWarning;
				oTools.mListener ( true, oForms.oCurrent, "focus", oForms.mClear, false ); 
			}
			else {

				if ( (oForms.oFieldset.lastChild.className == null) || (oForms.oFieldset.lastChild.className != "warning") ) {

					var oSpan = document.createElement ( "span" );
					oSpan.className = "warning";
					oSpan.appendChild ( document.createTextNode ( sWarning ));
					oForms.oFieldset.appendChild ( oSpan );
					oForms.mListeners ( oForms.mType (), true );
				}
			}
		}, 
		
		mClear : function ( e ) { // remove warning
			var oNode;
			if ( !e ) oNode = oForms.oCurrent;
			else { 
				e = e ? e : window.event;
				oNode = e.target ? e.target : e.srcElement;
			}
			if ( oNode.className.indexOf ( "warning" ) !=-1 ) {
				oNode.className = oForms.oCurrent.className == "warning" ? "" : oForms.oCurrent.className.split ( " warning" )[ 0 ];
				oNode.value = oNode.sOriginalvalue;
				oNode.select ();
				oTools.mListener ( false, oNode, "focus", oForms.mClear, false ); 
			}
			else if ( oForms.oFieldset.lastChild.className) {
			
				if( oForms.oFieldset.lastChild.className == "warning" ) {
					oForms.oFieldset.removeChild ( oForms.oFieldset.lastChild );
					oForms.mListeners ( oForms.mType (), false );
				}
			}
		},
		
		mReset : function ( e ) {
			if ( !e ) e = window.event;
			var oNode = e.target ? e.target : e.srcElement;
			while ( oNode.parentNode && !oNode.getAttribute ( "validate" )) oNode = oNode.parentNode;
			oForms.oFieldset = oNode;
			var nothing = oForms.mType ();
			oForms.sValidate = oForms.oFieldset.getAttribute ( "validate" );
			switch ( e.type) {
				case "file" 	: oForms.mCheck ( "file" ); break;
				case "change" 	: oForms.mCheck ( "select" ); break;
				case "blur" 	: oForms.mCheck ( "text/textarea" ); break;
				case "mouseup" 	: oForms.mCheck ( "checkbox/radio", oClient.bOpera || oClient.bSafari ? false : true ); break;
			}
		},
		
		// utility function for clientside forms: build querystring
		mCollect : function () {
			function encode ( value ) {
				var result;
				if ( window.encodeURIComponent ) result = encodeURIComponent ( value );
				else result = escape ( value );
				return result;
			}
			//kpr, 2006.01.09: added for multiple checkbox support
			function addURLParam(sParamName, sParamValue) {
				if(sQuerystring.indexOf("?")== -1)
					sQuerystring += "?";
				else if(sQuerystring.lastIndexOf("?")!= (sQuerystring.length -1) && sQuerystring.lastIndexOf("&")!= (sQuerystring.length -1))
					sQuerystring += "&";

				sQuerystring += encode(sParamName) + "=" + encode(sParamValue);
			}
			// end 2006.01.09
			var value, argument, sQuerystring = "?", a = 0;

			while (( argument = arguments [ a++ ]) != null ) {
				value = "";
				var oElement = this.elements [ argument ];
				
				if ( oElement ) {
					if ( oElement.length && !oElement.options ) { // radiobuttons
						var b = 0, element;
						//kpr, 2006.01.09: added for multiple checkbox & hidden fields support
						while (( element = oElement [ b++ ]) != null ) {
							if ( element.checked || element.type == "hidden") 
								addURLParam(argument, element.value);
						}
						// end 2006.01.09
					}
					else if ( oElement.length ) { // hidden
						alert(oElement.type);
						//var b = 0, element;
						//while (( element = oElement [ b++ ]) != null ) {
						//	addURLParam(argument, element.value);
						//}
					}
					else if ( oElement.options ) { // selectbox
						addURLParam(argument, oElement.options [ oElement.selectedIndex ].value);
					}	
					else 
						addURLParam(argument, oElement.value); // text+textarea
					/*if ( value != "" ) {
						function encode ( value ) {
							var result;
							if ( window.encodeURIComponent ) result = encodeURIComponent ( value );
							else result = escape ( value );
							return result;
						}
						sQuerystring += ( sQuerystring != "?" ? "&" : "" ) + encode ( argument ) + "=" + encode ( value );
					}*/
				}
			}
			return sQuerystring;
		}
}

// initialize
oGod.mOnload ( oForms.mInit );
