// copyright ============================================================================//
// copyright 2003
// sander prins -- Pagelink Interactives
// copyright ============================================================================//


/**
 * 	@function		WizardButtonHandler
 *	@description	Handler van de buttons in een wizard. Zorgt voor navigatie welke middels die buttons mogelijk is.
 *	@input			theAction		:	De action om te handlen
 *						Action = next_wizard_step		:	XMLHTTP bericht naar server voor uitvoeren volgende stap
 *						Action = previous_wizard_step	:	XMLHTTP bericht naar server voor uitvoeren vorige stap
 *															in het scherm dat daar evt bijhoorde de gegevens die al ingevuld waren terugzetten
 *						Action = cancel_wizard			:	XMLHTTP bericht naar server voor uitvoeren einde proces
 *															Elke processtap krijgt een extra voorwaarde: if einde proces dan voer uit: de "einde-proces" processtap.
 *															In deze laatste stap wordt alles eventueel opgeruimd
 *						Action = end_wizard				:	Als laatste action mogelijk. Dan is er al geinstalleerd en dient de wizard als extra actie
 *															gewoon afgesloten te worden (window.close).
 *	@return 		none.
 */
function WizardButtonHandler( theAction ) {
	if ( theAction ) {
		var theValues	= this.GetUserInput( theAction );					//Haal de ingevulde gegevens uit dit scherm en valideer ze daarbij ook gelijk maar even!

		if( theValues['theGetUserInputResult'].toLowerCase()!=="false" ) {	//Was er wat om te versturen of hadden we een error bij validatie van de ingevulde gegevens?
			theValues['theGetUserInputResult'] == "";						//Flag is niet meer nodig, kan weg.
			wait ();
			theAnswer = this.handle_XMLHTTP_Request( theAction, theValues, WizardButtonHandler_2nd_part );

			// 'WizardButtonHandler_2nd_part was here'

		}//End if theValues
	}//End if theAction
}//End function

		function WizardButtonHandler_2nd_part (theAnswer) {
			endwait ();
			if ( theAnswer != false && theAnswer != "" ) {
				if( theAnswer.responsetext ) {
					window.document.body.innerHTML = theAnswer.responsetext;
					w(245);//
					theAnswer = null;
				}

//				 else {
//					window.document.body.innerHTML = "Error: No Server Response...";
//					theAnswer = null;
//				}//End if responsetext

			}//End if theAction
		}

/**
 * 	@function		Conditional_WizardButtonHandler
 *	@description	Handler van de buttons in een wizard. Zorgt voor navigatie welke middels die buttons mogelijk is.
 *	@input			theCriterium		:	De component naam van het component dat aangevinkt dient te zijn
 *	@return 		none.
 */
function Conditional_WizardButtonHandler( theAction, theCriterium ) {
	if ( theCriterium ) {
		if ( document.getElementById(theCriterium) ) {
			oComponent = document.getElementById(theCriterium);
			if (oComponent.checked) {
				this.WizardButtonHandler( theAction );
			}
		}
	} else {
		this.WizardButtonHandler( theAction );	//Geen criterium meegegeven, gewoon handlen misschien?
	}
}

/**
 * 	@function		ValidateXML
 *	@description	Valideert een XML dat gemaakt is middels het Microsoft.XMLDOM Object
 *	@input			xmlObject dat gevalideerd dient te worden
 *	@return 		{ true (alles correct) | ErrorTekst (fout in xmlObject) }
 */
function ValidateXML (theXML) {
	var XMLDOMDocument		= new ActiveXObject ("Microsoft.XMLDOM");
	//Load the XMLHTTP_Request in the XMLDOMDocument
	if ( XMLDOMDocument.loadXML(theXML) ) {
		//Validate the XMLDOMDocument
		if ( XMLDOMDocument.parseError.errorCode != 0 ) {
			return false;		//Geen correcte xml
		} else {
			return true;		//Wel correcte xml
		}
	} else {
		return false;			//Kon xml niet laden
	}
}//End function


/**
 * 	@function		SendXmlMessage
 *	@description	Vertuurt het XML-bericht naar de server. Na versturing zijn de volgende gegevens bekend:
 *					xmlObj.responseObject.contenttype
 *					xmlObj.responseObject.responsetype
 *					xmlObj.responseObject.path
 *					xmlObj.responseObject.responsetext
 *					xmlObj.responseObject.responsexml
 *					xmlObj.responseObject.status
 *					xmlObj.responseObject.statustext
 *	@input			XMLDOMDocument:het te versturen XML-bericht in de vorm van een XMLDOMDocument
 *	@return 		xmlObj.responseObject
 */
function SendXmlMessage( XMLDOMDocument, callback ) {
	if( !xmlObj ) {																//Maak nieuw xmlobject aan als deze er nog niet is
		var xmlObj = new xml();
	}

	xmlObj.URL = xmlObj.default_URL + '/p3.php?PPID=100';						//Zet de URL goed voor deze wizard

//	alert( 'Sending this XML message:\n ' + XMLDOMDocument.xml.replace (/></g, '>\n<').replace (/<parameter/g, '\t<parameter') );
	xmlObj.dataConnection( XMLDOMDocument, callback );									//Stuur nu het bericht
//	alert( 'Recieved this text as an answer:\n '	+  xmlObj.responseObject.responsetext );

	var tmp = xmlObj.responseObject;
	xmlObj = null;
	return tmp;

}//end function

/**
 * 	@function		GetUserInput
 *	@description	Haalt de door een gebruiker ingevulde gegevens uit het scherm en geeft deze terug in een array.
 *					De gegevens worden uit tags gehaald die de volgende syntax bezitten :
 *					De volgende attributen zijn van belang: id, component_data_name. Voorbeeld van een component uit een wizard-scherm:
 *					<input type="text" name="co__2" id="co__2" component_data_name="achternaam" value="" size="20" maxlength="20">
 *	@input			none.
 *	@return 		{ Array met de values } daarbij ook een speciale flag: array['theGetUserInputResult'] = {true|false}
 */
function GetUserInput( theAction ){

	var theValues						= new Object ();
	theValues['theGetUserInputResult']	= "";
	Component_ID_Prefix					= "co__";
	theDataBox							= document.getElementById( "wizardview" );

	if ( theDataBox ) {
		//Loop all children (components) in this box
		var children = theDataBox.all;
		for (var i=0;i< children.length; i++){
			// For all childeren in the databox
			oCurcomponent = children[i];

			if ( oCurcomponent.tagName ) {

				if ( (oCurcomponent.tagName.toLowerCase()=="span") || (oCurcomponent.tagName.toLowerCase()=="div")  ) {
					//Hebben we een SPAN of een DIV? Kijk dan eerst of er geen groepje gegevens in staat dat gevalideerd dient te worden:
					component_data_validation = oCurcomponent.getAttribute("validationrules");

					if(component_data_validation) {
						if ( theAction.toLowerCase() != "previous_wizard_step"  ) {
							validationResult = WizardInputValidator(oCurcomponent,component_data_validation);
							if(!validationResult) {
								//Validation error
								theValues['theGetUserInputResult'] = "false";								//Error validation
								return theValues;
							}
						}//End if ! previous_wizard_step
					}

				}//End if Span of Div

				//Kijk nu ook nog ff naar het component_ID, als dat van de vorm "co__ <whatever> " is, dan moeten we de values e.d. meepikken!
				if ( oCurcomponent.getAttribute("id") ) {					//Heeftie wel een ID?
					var component_ID = oCurcomponent.getAttribute("id");	//Haal deze dan op
					if ( component_ID ) {

						//Does this ID start with the correct prefix?? (normally, this is: "co__")
						if( component_ID.indexOf( Component_ID_Prefix ) == 0 ) {
							component_data_name = oCurcomponent.getAttribute("component_data_name");
							if( !component_data_name ){
								component_data_name = component_ID;
							}

							//We zijn nu bezig met een component, controleer ook eventuele validaties bij dit specifieke component
							component_data_validation = oCurcomponent.getAttribute("validationrules");
							if(component_data_validation) {
								if ( theAction.toLowerCase() != "previous_wizard_step"  ) {
									validationResult = WizardInputValidator(oCurcomponent,component_data_validation);
									if(!validationResult) {
										theValues['theGetUserInputResult'] = "false";						//Fout bij validatie.
										return theValues;
									}
								}//End if theAction
							}
	
							theValues[component_data_name] = this.GetComponent_Value(oCurcomponent);		//Save deze waarde alvast

						}//End if component_id prefix

					}//End if Component_ID
				}//End if
			}//End if oCurcomponent.tagName
		}//End for

		theValues['theGetUserInputResult'] = "true";		//Geen error, alles OK!
		return theValues;

	} else {

		theValues['theGetUserInputResult'] = "false";		//Error, Databox niet gevonden
		return theValues;

	}//end if
}//End function



/**
 * 	@function		GetComponent_Value
 *	@description	Haalt de waarde (value op van een component
 *	@input			oCurcomponent
 *	@return 		{ de waarde | False}
 */
 function GetComponent_Value(oCurcomponent){
 	if(oCurcomponent && oCurcomponent!="") {

		theValue = "";
		component_type = oCurcomponent.getAttribute("type");

		if( component_type ) {
			switch ( component_type.toLowerCase() ){
				case "select":
					theValue = oCurcomponent.value;
					break;
				case "checkbox":
					if (oCurcomponent.checked) {			//Was dit componentje aangevinkt?
						theValue = oCurcomponent.value;		//pak dan de value bij dit component
					} else {
						theValue = "";						//Dit componentje was NIET aangevinkt: expliciet leegmaken dus.
					}
					break;
				case "radio":
					if (oCurcomponent.checked) {			//Was dit componentje aangevinkt?
						theValue = oCurcomponent.value;		//pak dan de value bij dit component
					}
					break;
				default:
					theValue = oCurcomponent.value;
					break;
			}//End switch
		}//End if component_type

		return theValue;

	}//End if oCurcomponent
}//End function



/**
 * 	@function		WizardInputValidator
 *	@description	
 *	@input			
 *	@return 		
 */
 function WizardInputValidator(oCurcomponent,component_data_validations){
	if (component_data_validations) {
		if ( !PPElementValidation(oCurcomponent) ) {//Then validate that.
			return false;//Validation was not successfull... Return a false
		}
	}
	return true;
}//End function


/**
 * 	@function		toggle
 *	@description	Speciaal voor gebruik in de wizard, toggelt de button met de naam nbutton ("volgende"-knop) zodat gebruikers
 *					eerst bijvoorbeeld akkoord zullen moeten gaan met voorwaarden door een vinkvakje aan te vinken.
 *	@input			none.
 *	@return 		none.
 */
function toggle(){
	if ( document.getElementById('nbutton') ) {
		whatObject = document.getElementById('nbutton');
		if(whatObject.disabled==true) {
			whatObject.disabled=false;
		} else if (whatObject.disabled==false){
			whatObject.disabled=true;
		}
	}
}//End function


/**
 * 	@function		checkDomainnameAvailability
 *	@description	Controleert of ingevulde domeinnaam nog beschikbaar is. Hier wordt een XMLHTTP-bericht voor gebruikt,
 *					indien het xmlobject aanwezig is in de browser.
 *	@input			Object om te checken
 *	@return 		{ true | false }
 */
 function checkDomainnameAvailability(theCompinentID){
 	if(theCompinentID && theCompinentID!="" ){
		oCurcomponent						= document.getElementById( theCompinentID );
		if(oCurcomponent) {

			// Valideer eerst de input, voordat er bericht naar de server wordt gestuurt (voor een whois vraag)
			component_data_validation = oCurcomponent.getAttribute("validationrules");
			if(component_data_validation) {
				validationResult = WizardInputValidator(oCurcomponent,component_data_validation);
				if(!validationResult) {
					return false;
				}
			}

			//We zijn nu bezig met een component, controleer eerst of dit veld voor validatie aan PP gegeven moet worden:
			component_data_name				= oCurcomponent.getAttribute("component_data_name");
			if(component_data_name && component_data_name!="" ) {
				tempValues					= new Object ();
				if(oCurcomponent.value && oCurcomponent.value!="" ) {

					tempValues[component_data_name]	= oCurcomponent.value;
					var theAction			= "check_domain_availability";					//"check_domain_availability" Is tegelijkertijd de step-voorwaarde van de ProcessManager

				var myObj = this;

				myObj.checkDomainnameAvailability_2nd_part = function (theAnswer) { // inline function
					if(theAnswer != false && theAnswer != "" ) {
						if(theAnswer.responsetext) {

							if( (theAnswer.responsetext.indexOf('true') > -1) && (theAnswer.responsetext.indexOf('true') < 6) ) {

//								//Button uitzetten als 'ie al aan was gezet bij een vorige check.
//								if ( document.getElementById('nbutton') ) {
//									whatObject = document.getElementById('nbutton');
//									if( whatObject.disabled==true ) {
//										myObj.toggle();	//"volgende" button aan, domeinnaam was beschkbaar.
//									}//End if
//								}//End if

								//Hidden field zetten in de wizard, zodat geflagd kan worden dat de domeinnaamaanvraag (mail naar SIDN) de deur uit gaat.
								if ( document.getElementById('co__domainnamefree') ) {
									whatObject = document.getElementById('co__domainnamefree');	//Pak het hiddenfield op
									if(whatObject) {
										whatObject.value==true									//En vuldat met true.
									}
								}//End if

								alert("Deze domeinnaam is voorlopig goedgekeurd en kan worden aangevraagd. Klik op 'Volgende pagina' om verder te gaan.");
								return true;

							} else {

//								//Button uitzetten als 'ie al aan was gezet bij een vorige check.
//								if ( document.getElementById('nbutton') ) {
//									whatObject = document.getElementById('nbutton');
//									if( whatObject.disabled==false ) {
//										myObj.toggle();	//"volgende" button weer uit, domeinnaam was NIET beschkbaar.
//									}//End if
//								}//End if

								//Hidden field zetten in de wizard, zodat geflagd kan worden dat de domeinnaamaanvraag (mail naar SIDN) NIET de deur uit gaat.
								if ( document.getElementById('co__domainnamefree') ) {
									whatObject = document.getElementById('co__domainnamefree');	//Pak het hiddenfield op
									if(whatObject) {
										whatObject.value==false									//En vuldat met false.
									}
								}//End if

								alert("Deze domeinnaam is niet meer beschibaar. Kiest u a.u.b. een andere naam uit en probeer het opnieuw.");
								return false;

							}//End if

						} else {

							//Button uitzetten als 'ie al aan was gezet bij een vorige check.
							if ( document.getElementById('nbutton') ) {
								whatObject = document.getElementById('nbutton');
								if(whatObject.disabled==false) {
									myObj.toggle();	//"volgende" button weer uit, domeinnaam was niet beschkbaar.
								}//End if
							}//End if

							alert("Deze domeinnaam is niet meer beschibaar. Kiest u a.u.b. een andere naam uit en probeer het opnieuw.");
							return false;

						}//End if responsetext
					
					
					
					} else {
						alert("Foutsituatie: domeinnaam is niet gekontroleerd. probeer het opnieuw.");
						return false
					}//End if theAnswer
				} // inline function

					theAnswer = this.handle_XMLHTTP_Request( theAction, tempValues , this.checkDomainnameAvailability_2nd_part);		//STUUR EEN XMLHTTP-BERICHT


					// 'checkDomainnameAvailability_2nd_part was here'
				} else {
					alert("Foutsituatie: domeinnaam is niet gekontroleerd (geen value bekend). probeer het opnieuw.");
					return false
				}//End if oCurcomponent.value
			}//End if
		}//End if oCurcomponent
	} else {
		return false;		//theCompinentID niet meegegeven of niet gevuld! 
	}//End if

}//End function

/**
 * 	@function		doTheToggle
 *	@description	Button uitzetten als 'ie al aan was gezet bij een vorige check en
 *					wanneer de focus weer aan het domeinnaamveld wordt toegekend.
 *	@input			none.
 *	@return 		none.
 */
//function doTheToggle() {
//	if ( document.getElementById('nbutton') ) {
//		whatObject = document.getElementById('nbutton');
//		if( whatObject.disabled==false ) {
//			this.toggle();	//"volgende" button weer uit zetten. Eerst een goede domeinnaam invullen.
//		}//End if
//	}//End if
//}//End function

//==========================================================================


/**
 * 	@function		handle_XMLHTTP_Request
 *	@description	Maak een XMLHTTP_Request aan en verstuur 'm
 *	@input			theAction		:	
 *					theValues		:	
 *	@return 		none.
 */
function handle_XMLHTTP_Request( theAction, theValues, callback ) {

	if ( theAction ) {
		if(theValues) {									//Was er wat om te versturen of hadden we een error bij validatie van de ingevulde gegevens?

			x				= new xmlrequest();												//Alles was in orde. Maak request aan in een XMLDOMDocument
			XMLDOMDocument	= x.create_Wizard_Request( theAction, theValues );				//Processmanager de verzamelde gegevens doorsturen
			if( ValidateXML(XMLDOMDocument.xml)==false ) {									//Valideer dit DOMDocument eerst:
				alert('Error validating XML (wizard.js : ValidateXML)');					//Oeps, niet goed...
				XMLDOMDocument = null;
				x = null;
				return false;
			} else {
				var theAnswer = "";
				theAnswer = this.SendXmlMessage( XMLDOMDocument, callback );							//Verstuur het nu
				XMLDOMDocument = null;
				x = null;
				return theAnswer;
			}//End if validate

		}//End if theValues
	}//End if theAction

}//End function


/**
 * 	@function		SetFlag
 *	@description	Stel de aangegeven flag in met de meegegeven waarde
 *	@input			FlagName		:	De Flag om te zetten
 *					theValue		:	De gewenste waarde voor deze flag
 *	@return 		none.
 */
function SetFlag( FlagName, theValue ) {
	if(FlagName && FlagName!="" ){
		oComponent = document.getElementById( FlagName );
		if(oComponent) {
			if (theValue) {
				if(oComponent.value) {
					oComponent.value = theValue;
				}//End if
			}//End if
		}//End if
	}//End if
}//End function


//==========================================================================


/**
 * 	@function		w
 *	@description	
 *	@input			
 *	@return 		
 */
var w = function (m) {
	var d =  document.getElementById('wizardview');
	var h =  document.body.clientHeight;
	if (!m)	
		if (document.m)
			var m = document.m;
		else
			var m = 0;
	if (d && h) {
		d.style.height = Math.abs(h - m);
		d.style.width = '100%';
	}
	document.body.onresize = w;
	document.m = m;
}//End function

function donothing () {
	window.event.cancelBubble=true;
}

function wait () {
//	document.body.style.cursor = 'wait';
	var el = document.getElementById ('wait_div');
	if (el == null) {
		var el = document.createElement ('DIV');
		el.setAttribute ('id', 'wait_div');
		el.onclick = donothing;
		document.body.appendChild (el);
	}
	el.style.width = '100%';
	el.style.position = 'absolute';
/*	el.style.background = 'url(/images/loading.gif) no-repeat scroll center';*/
	el.style.top = '0px';
	el.style.left = '0px';
	el.style.height = '100%';
	el.style.zIndex = 10000;
	el.style.cursor = 'wait';
}

function endwait () {
//	document.body.style.cursor = '';
	var el = document.getElementById ('wait_div');
	if (el != null) {
		document.body.removeChild (el);
	}
}
