
//
// © Oscar Zander, www.67years.com
// 



// Innehåller funktioner som används av gemensamt, av båda sidorna:
//
// http://www.67years.com/index.php
// http://www.67years.com/your_savings.php
// 




// Anger om punkt- eller kommatecken skall användas. 
var point; 
// Namnet på det valda textfältet. 
var current_text_field_name;




// Testar userInput, så att där t.ex. inte finns några bokstäver. 
// @param text_field_name  namnet på textfältet, som skall kontrolleras.
function testUserInput(text_field_name)
{
	// Lagrar namnet på det nuvarande textfälet i ett fält. 
	current_text_field_name = text_field_name; 
	

	// Tar fram de olika felmeddeladerna.
	var error_message_1 = getErrorMessage1(); 
	var error_message_2 = getErrorMessage2();
	var error_message_3 = getErrorMessage3();

	// Tar fram själva textfältet. 
	var text_field = document.getElementById(text_field_name);
	// Tar fram "feltexten", som eventuellt skall visas.
	var error_text_name = text_field_name + "_error"; 
	var error_text = document.getElementById(error_text_name);
	
	// Ett extra mellanrum läggs till, så att "feltexten" hamnar
	// nedanför själva textfältet. 
	var extra_br = "<br />"; 
	
	// Användarens input.
	var user_input_correct = getCorrectUserInput(text_field); 
	
	// Försöker avrunda svaret om det går. (Gäller current_age. save_age, growth)
	if(isNaN(user_input_correct) == false && user_input_correct != 0)  {
		user_input_correct = roundNumber(user_input_correct);
	    // Lagrar det avrundade talet i textfältet på sidan också. 
	 	document.getElementById(getCurrentTextFieldName()).value = user_input_correct; 
	}
	
	// Om användarens input är OK (true/false). 
	var return_value = false; 
		
	// Kontrollerar om användarens svar är ett nummer.
	if(isNaN(user_input_correct))  {
		// Markerar textfältet och skriver ut felmeddelandet.
		text_field.style.backgroundColor="#E36157";
		text_field.select();
		error_text.innerHTML = extra_br + error_message_1; 
	}
	// Kontrollerar att användarens svar inte är för stort.
	else if(user_input_correct > 199.99 && text_field_name != "hannah_money"
	&& text_field_name != "amount")  {
		// Markerar textfältet och skriver ut felmeddelandet.
		text_field.style.backgroundColor="#E36157";
		text_field.select();
		error_text.innerHTML = extra_br + error_message_2; 
	}
	// Kontrollerar att användarens svar inte är negativt. 
	// (Om textfältet som kontrolleras är growth, så går det dock bra med negativt.)
	else if(user_input_correct <= 0 && text_field_name != "growth" )  {
		// Om användaren inte har svarat görs inget. 
		// (Om det inte gäller hannah_money.)
		if(text_field.value == "" && text_field_name != "hannah_money")  {	
		}
		// Markerar textfältet och skriver ut felmeddelandet.
		else  {
			// Om inget värde finns, så sätts en nolla in. 
			// (Gäller inte hannah_money.)
			if(text_field.value == "")  {
				text_field.value = 0;
			}
			text_field.style.backgroundColor="#E36157";
			text_field.select();
			error_text.innerHTML = extra_br + error_message_3; 
		}
	}
	




	// text_field är hannah_money eller amount. 
	else if(text_field_name == "hannah_money" || text_field_name == "amount")  {
	
		// För stort input.
		if(user_input_correct > 99999999999.99)  {
			// Markerar textfältet och skriver ut felmeddelandet. (För stort tal.)
			text_field.style.backgroundColor="#E36157";
			text_field.select();
			error_text.innerHTML = extra_br + error_message_2;
		}
		// OK. 
		else  {
			return_value = textFieldOK(text_field, error_text, user_input_correct);
		}
	}
	
    // text_field är growth. 
	else if(text_field_name == "growth")  {
		// För litet input.
		if(user_input_correct < -99.99)  {
			// user_input_correct blir 0. 
			user_input_correct = 0; 
		}
		// Eventuella felmeddelanden tas bort. 
		return_value = textFieldOK(text_field, error_text, user_input_correct);
	}
	
	
	
	
	// Kontrollerar att ålderna som pengarna sparas till är högre än 
	// användarens nuvarande ålder (denna kontroll görs endast om text_field
	// är "current_age" eller "save_age". 
	else if(text_field_name == "save_age")  {
		
		var current_age = document.getElementById("current_age");
		var current_age_number = new Number(current_age.value);
		var save_age = document.getElementById("save_age");
		var save_age_number = new Number(save_age.value); 
		
		// current_age är större än save_age.
		if(current_age_number > save_age_number && 
		current_age.value != "" && save_age.value != "")  {
			// Markerar save_age, och skriver ut felmeddelande. 
			save_age.style.backgroundColor="#E36157";
			save_age.select();
			document.getElementById("save_age_error").innerHTML = 
			extra_br + error_message_4; 
		}
		// Allt är OK.
		else  {
			return_value = textFieldOK(text_field, error_text, user_input_correct);
			
			var save_age_error = document.getElementById("save_age_error"); 
			// Kontrollerar att felmeddeladet för ålder säkert inte finns utskrivet.
			if(save_age_error.innerHTML.lastIndexOf(getErrorMessage4() > -1))  {
				// Ser till att bakgrundsfärgen blir vit.
				save_age.style.backgroundColor="#FFFFFF";
				// Tar bort eventuella "feltexter".
				save_age_error.innerHTML = "";
			}
		}
	}
	
	
	// text_field är current_age. 
	else if(text_field_name == "current_age")  {
		// Input för current_age är OK.
		return_value = textFieldOK(text_field, error_text, user_input_correct);
		
		// Testar dock även save_age. 
		testUserInput("save_age");
	}
	
	
	
	// Användarens input är helt OK.
	else  {
		return_value = textFieldOK(text_field, error_text, user_input_correct);

	}
	
	
	// Returnerar om användarens input är OK eller inte (true/false). 
	return return_value; 
}



// Om textfältets input är OK, så tas eventuella felmeddelanden bort, 
// och textfältet blir vitt. 
// @param text_field - textfältet, vars värde är OK
// @param error_text - feltexten, som inte skall finnas. 
// @param user_input_correct - användarens korrekta input
function textFieldOK(text_field, error_text, user_input_correct)
{
	// Visar användarens slutgiltliga input. (Ersätter t.ex. 1,000 med 1 000).
	var final_input = getNumberFromUserInput(user_input_correct); 

	// Ser till att bakgrundsfärgen blir vit.
	text_field.style.backgroundColor="#FFFFFF";
	// Ser till att den "slutgiltliga inputen" visas. 
	text_field.value = final_input;
		
	// Tar bort eventuella "feltexter".
	error_text.innerHTML = "";

	return true; 
}




// Returnerar användarens "riktiga" svar. Ersätter t.ex. 1,000 med 1000.
// @param text_field  - textfältet, där användaren har skrivit in sin gissning
// @return  användarens "riktiga" svar
function getCorrectUserInput(text_field)
{
	// Använarens input. 
	var user_input = text_field.value;
	// Tar bort mellanrum.
	user_input = user_input.replace(/ /g, "");

	// Längden på användarens input. 
	var length = user_input.length;
	// Första "stället"(t.ex -1 eller 3) som , finns på
	var first_index_comma = user_input.indexOf(",");
	// Första "stället"(t.ex -1 eller 3) som . finns på
	var first_index_point = user_input.indexOf(".");
	// Sista "stället"(t.ex -1 eller 3) som , finns på
	var last_index_comma = user_input.lastIndexOf(",");
	// Sista "stället"(t.ex -1 eller 3) som . finns på
	var last_index_point = user_input.lastIndexOf(".");
	

	
	// Både punkter och komma-tecken finns.
	if(first_index_comma > -1 && first_index_point > -1)  {

		// Testar vilket som är "tusen-avskiljare" och vilket som är
		// "decimal-avskiljare". Tar sedan bort "tusen-avskiljaren". 
		if(first_index_comma < first_index_point)  {
			user_input = user_input.replace(/,/g, "");
		}
		else  {
			user_input = user_input.replace(/\./g, "");
		}
	}
	
	// Komma-tecken som används som "decimal-avskiljare" finns.
	if(last_index_comma >= (length-3) && last_index_comma == first_index_comma)  {
		user_input = user_input.replace(/,/g, "-decimal67");
	}
	// Ersätter eventuella komma-tecken som används som "tusen-avskiljare".
	else  {
		user_input = user_input.replace(/,/g, "");
	}
	
	// Punkter som används som "tusen-avskiljare" finns.
	if(last_index_point < (length-3))  {
		user_input = user_input.replace(/\./g, "");
	}

	// Ersätter "decimal-avskijaren" med .
	user_input = user_input.replace(/-decimal67/g, ".");
	

    // Ersätter alla eventuella "extra punkter". 
    while(user_input.indexOf(".") < user_input.lastIndexOf("."))  {
    	user_input = user_input.replace(/\./, "");
    }
    

    // Tar bort alla dollar-tecken.
    user_input = user_input.replace(/\$/g, "");
    // Tar bort alla euro-tecken.
    user_input = user_input.replace(/€/g, "");
    // Tar bort alla pund-tecken. 
    user_input = user_input.replace(/£/g, "");
    
    // Ser till att textfältet på sidan är uppdaterat.
	text_field.value = user_input; 
	// Returnerar user_input. 
	return user_input;
}




// Returnerar användarens svar som nummer. Lägger till mellanslag, t.ex 1 000
// @param old_input  -  användarens "gamla" input.
// @return  användarens svar som nummer
function getNumberFromUserInput(old_input)
{
	// Skapar ett svar med max två decimaler.
	var number_space = new Number(old_input);
	number_space = number_space.toFixed(2);
	// Tar bort onödiga nollor i slutet. (.00 skrivs \.00 för 
	// om det hade skrivits bara .00 så är . ett "wild card".)
	number_space = number_space.replace(/\.00/g, "");
	

	// Det nya numret, med mellanslag.
	var new_number_space = "";	
	// Punkten, där talet skall delas upp, och mellanslag sättas in.
	var split_point = number_space.length - 3;

	// Om "." finns i talet (det är då ett decimaltal), 
	// så flyttas split_point två steg till vänster. Samtidigt läggs decimalerna till.
	if(number_space.search(/\./) > -1)  {
		split_point = split_point - 3;
		new_number_space = number_space.slice(number_space.length - 3, 
		number_space.length)
	}
	

	var end_loop = false;
	// 3 siffror eller mindre. Inga mellanrum skall göras. 
	if(split_point <= 0)  {
		 end_loop = true;
	}
     
    // Sätter in mellanrum i svaret. 
	while(end_loop == false)  {
		var three_numbers = number_space.slice(split_point, split_point + 3);

    	// Om new_number_space för tillfället bara består av decimaler, 
    	// så skall inget mellanrum läggas till. 
    	if(new_number_space.length == 3 && number_space.search(/\./) > -1)  {
    		new_number_space = three_numbers + new_number_space; 
    	}
    	// Lägg till mellanrum. 
    	else { 
    		new_number_space = three_numbers + " " + new_number_space; 
    	}
	    
	    // Inga fler mellanrum skall sättas in.
		if(split_point <= 3)  {
			// Lägger till början av användarens input. 
			number_space = number_space.slice(0, split_point) +
			" " + new_number_space;
	    	end_loop = true;
		}
		else {
	    	split_point = split_point - 3;
		}    
	}
	
	
	// Avrundar svaret, om det är current_age, save_age eller growth. 
	number_space = roundNumber(number_space); 
	
	
	// Byter eventuellt ut punkttecken mot komma-tecken. T.ex. 1,000 (US) 1.000 (SWE)
	number_space = point_comma(number_space);

	// Returnerar "numret med mellanslag".
	return number_space; 
}



// Avrundar. (Om det valda textfältet är current_age, save_age eller growth.) 
// @param number - talet, som skall avrundas
// @return det avrundade numret
function roundNumber(number)
{
	if(getCurrentTextFieldName() == "current_age" || 
	   getCurrentTextFieldName() == "save_age"  ||
	   getCurrentTextFieldName() == "growth")  {
		number = Math.round(number); 
	}

	return number; 
}


// Bestämmer vilket som skall vara det nuvarande textfältet. 
// @param name_text_field  - namnet på det nuvarande textfältet
function setCurrentTextFieldName(name_text_field)
{
	current_text_field_name = name_text_field; 
}

// Returnerar namnet på det nuvarande textfältet.
// @return  - namnet på det nuvarande textfältet
function getCurrentTextFieldName()  
{
	return current_text_field_name; 
}


	
	
	

// Byter eventuellt ut punkttecken mot komma-tecken. 
// T.ex. 1,000 (US) 1.000 (SWE)  samt  99.99 (US) och 99,99 (SWE)
// @param number_space - det talet som skall kontrolleras  
function point_comma(number_space)
{
	// Ser till att number_space helt säkert är en sträng. 
	number_space = "" + number_space;
	
	// Gör inget. 
	if(point == true)  {
	}
	// Byter ut punkt mot komma. (Och tvärtom.)
	// Ett mellansteg (point67, comma67) måste göras för att det skall fungera.
	else  {
		number_space = number_space.replace(/\./g, "-point67");
		number_space = number_space.replace(/,/g, "-comma67");
		
		number_space = number_space.replace(/-point67/g, ",");
		number_space = number_space.replace(/-comma67/g, ".");
	}
	
	return number_space; 
}

	
	
// Bestämmer om punkt- eller kommatecken skall användas. 
// @param true_false - true/false, om punkttecken skall användas. 
function setPoint(true_false) 
{
	point = true_false; 
}

// Returnerar om punkt- eller kommatecken skall användas. 
// @return point  - om punkttecken skall användas. 
function getPoint()
{
	return point; 
}



	
	
	
	