var baseUrl = "http://www.kennisconsult.nl/";

/**
 * The function that is executed when a page in the Kennisconsult application is loaded
 * @return
 */
function initializeKennisconsult()
{
	initializeTabs();
	initializeSearchField();
	initializeSearchSuggestionContainer();
}

/**
 * This function registers an Event listener for the tabs on a page
 * When such a tab is clicked, the tabpage is switched
 */
function initializeTabs()
{
	var tabHeadersToActivate = $$('.activateTabOnLoad');
	
	tabHeadersToActivate.each(function(elem) {
		var tabId = elem.id.substring(9,elem.id.length);
		$(elem.id).addClassName('activetabheader');
		$('tab' + tabId).show();
		
		Event.observe(document.body, 'click', function(event) {
	  		var clickedElement = Event.element(event);
	  		if( (clickedElement.hasClassName("tabheader") && !clickedElement.hasClassName("activetabheader")) )
			{
				switchTab(clickedElement);
			}		
		});
		
	});
	/*
	if($('tabheader1') != undefined)
	{
		$('tabheader1').addClassName('activetabheader');
		$('tab1').show();
		
		Event.observe(document.body, 'click', function(event) {
	  		var clickedElement = Event.element(event);
	  		if( (clickedElement.hasClassName("tabheader") && !clickedElement.hasClassName("activetabheader")) )
			{
				switchTab(clickedElement);
			}		
		});
	}*/
}

function initializeSearchField()
{
	// Register the event listener for the search field
	if($('searchinputfield') != undefined)
	{
		$('searchinputfield').observe('click', function(event){
			if( $('searchinputfield').value == "Informatie zoeken over..." )
				$('searchinputfield').setValue("");
		});
	}
}

/**
 * The function that switches the tab page, depending on which header was clicked
 */
function switchTab(tabHeaderClicked)
{
	// We have to do several things here, first, change the active tab class in the tab headers
	// Determine the tabgroup, if set
	var tabGroupClicked = null;
	$w(tabHeaderClicked.className).each(function(elem) {
		if(elem.substring(0,8) == 'tabgroup')
			tabGroupClicked = elem;
	});	
	
	var previousActiveTabHeaders = $$('div.activetabheader');
	var previousActiveTabHeader;
	if(tabGroupClicked == null)
		previousActiveTabHeader = previousActiveTabHeaders[0];
	else
	{
		previousActiveTabHeaders.each(function(elem) {
			
			if(elem.hasClassName(tabGroupClicked))
				previousActiveTabHeader = elem;
			
		});
	}
		
	previousActiveTabHeader.removeClassName('activetabheader');
	tabHeaderClicked.addClassName('activetabheader');
	
	var clickedTabHeaderId = tabHeaderClicked.identify();
	var previousTabHeaderId = previousActiveTabHeader.identify();
	var newTabId = clickedTabHeaderId.substring(9,clickedTabHeaderId.length);
	var oldTabId = previousTabHeaderId.substring(9,previousTabHeaderId.length);
	
	// Hide the old and show the new tab
	$('tab'+oldTabId).hide();
	$('tab'+newTabId).show();
}

/**
 * A function that determines whether or not a form is correctly filled in
 * @return boolean	Whether or not the form can be submitted
 */
function submitForm( form )
{
	// Check whether or not all mandatory fields are set
	var validForm = true;
	var errorMessage	= "";
	var mandatoryFields = $$('.mandatory_form_field');	//document.getElementsByClassName("mandatory_form_field");
	mandatoryFields.each(function(mandatoryField) {
		if(!mandatoryField.present())
			validForm = false;
	});
	if(!validForm)
	{
		errorMessage		+= "U heeft een of meer verplichte velden niet of niet correct ingevuld. De verplichte velden zijn gemarkeerd met een *<br/>";
		errorMessage 		+= "Vul de verplichte velden in en probeer het opnieuw.<br/>";
	}
	
	// Check for email fields
	var emailFields = $$('.email_field'); // document.getElementsByClassName("email_field");
	var validEmail = true;
	emailFields.each(function(emailField) {
		if(!IsEmailValid(emailField.value))
		{
			validEmail = false;
			validForm = false;
		}
	});
	if(validEmail == false)
	{
		errorMessage		+= "Het email adres dat u heeft opgegeven is niet correct.<br/>";
	}
	
	// Check other form-specific stuff
	errorMessage += performFormSpecificValidation(form);
		
	// Show error message in dedicated div if possible, else in an alert
	if(!validForm)
	{
		
		if($('form_error_div') != undefined)
		{
			$('form_error_div').update(errorMessage);
			$('form_error_div').show();
			$('form_error_div').scrollIntoView(true);
		}
		else
			alert(errorMessage);
	}
	return validForm;
}

/**
 * A function that performs specific validations for forms within the application
 * @return 	string	A string containing error messages that should be displayed for this form
 */
function performFormSpecificValidation( form )
{
	var errorString = "";
	
	if(form.id == "abonneeformulier")
	{
		if( ($('abonneeformulier')['password'].value) != ($('abonneeformulier')['password2'].value) )
			errorString += "De opgegeven wachtwoorden komen niet overeen.<br/>";
		if( $('abonneeformulier')['password'].value.indexOf(' ') != -1 )
			errorString += "Het wachtwoord mag geen spatie bevatten.<br/>";
		if( $('abonneeformulier')['password'].value.length < 8 )
			errorString += "Het wachtwoord dient uit minstens 8 tekens te bestaan.<br/>";
	}
	
	if(form.id == "zoekserviceformulier")
	{
		if( ($('zoekserviceformulier')['andersa'].value) == "on" )
			if(!$('ander_type_info').present())
				errorString += "Geeft u aub. op wat voor andere informatie u wenst.<br/>";
	}
	
	return errorString;
}

/**
 * A function to check email address validity
 * @param	string	The email address to be checked
 * @return	boolean	Whether or not the email address is valid
 */
function IsEmailValid(checkThisEmail)
{
	var myEMailIsValid = true;
	var myAtSymbolAt = checkThisEmail.indexOf('@');
	var myLastDotAt = checkThisEmail.lastIndexOf('.');
	var mySpaceAt = checkThisEmail.indexOf(' ');
	var myLength = checkThisEmail.length;


	// at least one @ must be present and not before position 2
	// @yellow.com : NOT valid
	// x@yellow.com : VALID
	if (myAtSymbolAt < 1 )
	{
		myEMailIsValid = false
	}

	// at least one . (dot) afer the @ is required
	// x@yellow : NOT valid
	// x.y@yellow : NOT valid
	// x@yellow.org : VALID
	if (myLastDotAt < myAtSymbolAt) 
	{
		myEMailIsValid = false
	}

	// at least two characters [com, uk, fr, ...] must occur after the last . (dot)
	// x.y@yellow. : NOT valid
	// x.y@yellow.a : NOT valid
	// x.y@yellow.ca : VALID
	if (myLength - myLastDotAt <= 2) 
 	{
		myEMailIsValid = false
 	}

	// no empty space " " is permitted (one may trim the email)
	// x.y@yell ow.com : NOT valid
	if (mySpaceAt != -1) 
 	{
		myEMailIsValid = false
 	}
	return myEMailIsValid;
}

function initializeSearchSuggestionContainer()
{
	// Reposition the container on a resize of the window
	window.onresize = function() {
		positionSearchSuggestionContainer();
	};
	
	// Register key listeners
	Event.observe($('searchinputfield'), 'keyup', function(event) {
		if(event.keyCode == Event.KEY_UP && $('searchsuggestion-wrapper').visible())
			handleSearchSuggestionKeyPressUp();
		else if(event.keyCode == Event.KEY_DOWN && $('searchsuggestion-wrapper').visible())
			handleSearchSuggestionKeyPressDown();
		else if(event.keyCode == Event.KEY_ESC )
			$('searchsuggestion-wrapper').hide();
		else if(event.keyCode != Event.KEY_UP && event.keyCode != Event.KEY_DOWN && event.keyCode != Event.KEY_ESC )
			searchqueryChanged();
	});
	
	Event.observe($('searchsuggestion-wrapper'), 'click', function(event) {
	    // IE7 does not pass event to the function, get it from window instead
		if ( !event )
	        event = window.event;
	    // Determine the target, this is also different in IE7
		var target = event.target ? event.target : event.srcElement;
	    
		if( $('searchsuggestion-wrapper').visible() == true && target.id == "searchsuggestion" )
			window.location = baseUrl + '?action=zoeken&q=' + event.target.innerHTML;
	});
}

function handleSearchSuggestionKeyPressUp()
{
	var previouslySelectedSuggestion = $$('.searchsuggestionEffectByKeyPress');
	if(previouslySelectedSuggestion.length > 0)
	{
		var allSearchSuggestions = $$('.searchsuggestionOption');
		var counter = 0;
		var previouslyInvestigatedItem;
		
		allSearchSuggestions.each(function(elem) {
			counter++;
			// Previous not found yet, is this the one?
			if(counter > 1 && elem.hasClassName('searchsuggestionEffectByKeyPress'))
			{
				elem.removeClassName('searchsuggestionEffectByKeyPress');
				previouslyInvestigatedItem.addClassName('searchsuggestionEffectByKeyPress');
				$('searchform')['searchinputfield'].value = previouslyInvestigatedItem.innerHTML;
				return;
			}
			previouslyInvestigatedItem = elem;
		});
	}
}

function handleSearchSuggestionKeyPressDown()
{
	var previouslySelectedSuggestion = $$('.searchsuggestionEffectByKeyPress');
	if(previouslySelectedSuggestion.length > 0)
	{
		var allSearchSuggestions = $$('.searchsuggestionOption');
		var previousFound = false;
		var newOptionSelected = false;
		var counter = 0;
		allSearchSuggestions.each(function(elem) {
			counter++;
			if(previousFound && !newOptionSelected)
			{
				elem.addClassName('searchsuggestionEffectByKeyPress');
				$('searchform')['searchinputfield'].value = elem.innerHTML;
				newOptionSelected = true;
			}
			else
			{
				// Previous not found yet, is this the one?
				if(counter < allSearchSuggestions.length && elem.hasClassName('searchsuggestionEffectByKeyPress'))
				{
					previousFound = true;
					elem.removeClassName('searchsuggestionEffectByKeyPress');
				}
			}
		});
	}
	else
	{
		var allSearchSuggestions = $$('.searchsuggestionOption');
		allSearchSuggestions[0].addClassName('searchsuggestionEffectByKeyPress');
		$('searchform')['searchinputfield'].value = allSearchSuggestions[0].innerHTML;
	}
}

function searchqueryChanged()
{
	var searchQuery = $('searchform')['searchinputfield'].value;
	if(searchQuery.length > 2)
	{
		var url = baseUrl + '/suggest.php?q=' + searchQuery;
		new Ajax.Request(url, {
		  method: 'get',
		  onSuccess: function(transport) {
				var suggestionString = "";	
				var json = transport.responseText.evalJSON();
				if(json.length > 0)
				{
					json.each(function(elem) {
						suggestionString += '<div id="searchsuggestion" class="searchsuggestionOption searchsuggestionEffect">' + elem + '</div>';
					});
				}
				$('searchsuggestion-container').update(suggestionString);
			}
		});
		positionSearchSuggestionContainer();
		$('searchsuggestion-wrapper').show();
	}
	else
		$('searchsuggestion-wrapper').hide();
}

function positionSearchSuggestionContainer()
{
	var screenwidth = document.viewport.getWidth();
	var leftMargin = (((screenwidth-960)/2)+250);
	if(screenwidth < 960)
		leftMargin = 250;
	$('searchsuggestion-container').setStyle({
		left: leftMargin + 'px'
	});
}

// Do a query for a predefined search question
// Refers user to new browser window
function doSearchQuery( searchString )
{
	var radioGrp = document['forms']['searchstringform']['searchstring'];
	var radioValue = "";
	if(radioGrp.length != undefined)
	{
		for(i=0; i < radioGrp.length; i++){
			if (radioGrp[i].checked == true) {
				radioValue = radioGrp[i].value;
		    }
		}
	}
	else
		radioValue = radioGrp.value;
	searchString = searchString.replace('<!S!>',radioValue);
	window.open(searchString,'searchString_window');
}

// Add a 'bouwsteen' as favorite
function doFavorite( id, title, type, caller, displayTitle )
{
	
	if(caller.hasClassName('active'))
	{
		jQuery.facebox('<br/><br/><br/><br/><br/>Wilt u ' + displayTitle + ' met de titel:\n\n' + title + '\n\n niet langer markeren als favoriet?<br/><br/></br><input type="button" id="searchinputbutton" value="OK" onclick="javascript:removeFavorite(\'' + id + '\', \'' + title + '\', \'' + type + '\', $(\'' + caller.identify() + '\'), \'' + displayTitle + '\')">&nbsp;&nbsp;<input type="button" id="searchinputbutton" value="Annuleren" onclick="javascript:jQuery(document).trigger(\'close.facebox\')">', 'my-groovy-style');
	}
	else
	{
		jQuery.facebox('<br/><br/><br/><br/><br/>Wilt u ' + displayTitle + ' met de titel:\n\n' + title + '\n\n markeren als favoriet?<br/><br/></br><input type="button" id="searchinputbutton" value="OK" onclick="javascript:addFavorite(\'' + id + '\', \'' + title + '\', \'' + type + '\', $(\'' + caller.identify() + '\'), \'' + displayTitle + '\')">&nbsp;&nbsp;<input type="button" id="searchinputbutton" value="Annuleren" onclick="javascript:jQuery(document).trigger(\'close.facebox\')">', 'my-groovy-style');
	}
}

function removeFavorite( id, title, type, caller, displayTitle )
{
		// Remove favorite
		// jQuery(document).trigger('close.facebox');
		//console.log(caller);	
	
		// Do webservice request
		var url = baseUrl + 'favorite.php?action=remove&id=' + id + '&type=' + type;
		new Ajax.Request(url, {
		  method: 'get',
		  onSuccess: function(transport) {	
				var json = transport.responseText.evalJSON();
				if(json[0] == 'true')
				{
					// alert('' + title + ' is niet langer gemarkeerd als favoriet.');
					jQuery.facebox('<br/><br/><br/><br/><br/><b>Gelukt!</b><br/>' + title + ' is niet langer gemarkeerd als favoriet.<br/><br/><input type="button" id="searchinputbutton" value="OK" onclick="javascript:jQuery(document).trigger(\'close.facebox\')">', 'my-groovy-style');
					caller.removeClassName('active');
				}
			}
		});
}

function addFavorite( id, title, type, caller, displayTitle )
{
	// Add favorite
	// jQuery(document).trigger('close.facebox');
	
	// Do webservice request
	var url = baseUrl + 'favorite.php?action=add&id=' + id + '&type=' + type;
	new Ajax.Request(url, {
	  method: 'get',
	  onSuccess: function(transport) {	
			var json = transport.responseText.evalJSON();
			if(json[0] == 'true')
			{
				// alert('' + title + ' is gemarkeerd als favoriet.');
				jQuery.facebox('<br/><br/><br/><br/><br/><b>Gelukt!</b><br/>' + title + ' is gemarkeerd als favoriet.<br/><br/><input type="button" id="searchinputbutton" value="OK" onclick="javascript:jQuery(document).trigger(\'close.facebox\')">', 'my-groovy-style');
				caller.addClassName('active');
			}
		}
	});
}

function displayCorrectSearchQuestionContainer( container )
{
	// First hide the open ones
	$jq('.' + container).fadeOut('slow', function(){ 
		var i = 0;
		if(container == 'zoekvraagcontainer0')
			i=1;
		$jq(".zoekvraagcontainer" + i).fadeIn('slow');
	});
	
	
}
