
var newlines = Array();
var logfile = Array();
var ambiguelog = Array();
var words = 0;
var logstring = "";
var ambiguestring = "";

function wordcount ( str ) {
	word_count = 0;
	word_array = str.split(/\s+/g)
	word_count = (word_array.length-1);
	return word_count;
}


function replaceAll( str, replacements ) {

	for ( i = 0; i < replacements.length; i++ ) {

		var idx = str.indexOf( replacements[i][0] );

		while ( idx > -1 ) {
			str = str.replace( replacements[i][0], replacements[i][1]);
			idx = str.indexOf( replacements[i][0] );
		}

	}

	return str;
}



function replaceAllSpan( str, replacements, offset ) {

	var context = "";
	var transfrom = "";
	var transto = "";
	var idx = 0;

	// Loop door de woorden heen
	var replength = replacements.length

	for ( x=0; x<replength; x++ ) {

		transfrom = replacements[x][0];
		transto = replacements[x][1];
		ambigue = replacements[x][2];
		
		// Kijk of het woord aanwezig is.
		idx = str.indexOf( transfrom );

		// Vervang het woord, zo nodig meerdere malen.
		while ( idx > -1 ) {
		

			/**
			 * Bob merkt op: de volgende regel gaf problemen:
			 * if(str.substr((idx-1),1).match(re) && str.substr((idx+transfrom.length),1).match(re)) {
			 *
			 * hiermee werden geen matches direct voor een komma gevonden: "Mekka," glipte er tussendoor.
			 * ik heb dit nu als volgt opgelost:
			 */

			// re = /[^A-Za-z0-9çäëïöüáéíóúàèìòù-']/;
			// werkt niet in IE?
			
			re = /[a-zA-Z-]/;
			var trans_diff_length = 0;
			// alleen 'iets' doen als de karakters om het woord heen geen letters of koppeltekens zijn.
			if ( !(str.substr((idx-1),1).match(re)) && !(str.substr((idx+transfrom.length),1).match(re)) ) {
				if (ambigue != "A" || $('ambigu').checked) {
					
					// Bepaal de context.. vervang regeleinden..
					context = " (..." + str.substring(idx-20,idx+30) + "...)";
					context = replaceAll(context, [["\n", " "],["\r", ""]] );
				
					// Vervang het omgespelde woord.
					// FIXME: dit komt soms niet overeen met match
					//str = str.replace( transfrom, transto );
					pre_str=str.substr(0,idx);
					post_str=str.substring(idx+transfrom.length);
					str=pre_str + transto + post_str;
					//rekening houden met lengte van de string die in de plaats komt ivm offset
					trans_diff_length=transto.length - transfrom.length;
					// voeg toe aan log..
					addLog( (idx+offset) , transfrom + " => " + transto + context);
					
				} else {
					
					// Voeg toe aan de ambigueen
					addAmbigue(transfrom, transto);
					
				}

			}
			// skip huidige match
			idx = str.indexOf( transfrom, (idx+1+trans_diff_length) );

		}
	}

	return str;

}




/**
* Maak de array met alle newlines er in.
*/
function findNewLines( str ) {

	var idx = 0;

	while ( idx > -1 ) {
		newlines[ newlines.length ] = idx;
		idx = str.indexOf( "\n", (idx+1) );
	}

}

/**
* Geeft een regelnummer terug, aan de hand van de positie van een karakter..
*/
function matchNewline( pos ) {

	for (i=0 ; i<newlines.length ; i++ ) {
		if (newlines[i]>pos) {
			return i;
		}
	}

	return i;

}

/**
* verwijder de <span class='highlight'> en </span>
*/
function stripSpan( str ) {

	str = replaceAll( str, [ ["<span class='highlight'>", ""], ["</span>", ""] ]  );
	return str;

}


/**
* Vervang alle \n door <br />, zodat deze geprint kunnen worden, en dat regeleinden bewaard blijven..
*/
function nl2br( str ) {

	str = replaceAll( str, [ ["\n", "<br />"] ]  );
	return str;

}





/**
* Voeg een regel toe aan de 'logfile'.
*/
function addLog( char, str ) {

	var line = matchNewline(char);

	logfile[ char ] = line + ". " + str + "\n";

}




/**
* Voeg een regel toe aan de 'ambigue log'.
*/
function addAmbigue( transfrom, transto ) {

	var ambiguestr = "- " + transfrom + "/" + transto  + "\n" ;
	
	// Voorkom doublures in de gevonden ambigueen.
	for(i=0; i<ambiguelog.length; i++ ) {
		if (ambiguelog[i]==ambiguestr) {
			return;
		}
	}
		
	ambiguelog[ ambiguelog.length ] = ambiguestr;

}



/**
* Print de 'logfile'.
*/
function printLog( ) {

	var logstring = "";
	var ambiguestring = "";
	var omspellingen=0;

	// Logstring samenstellen
	for(i=0; i<logfile.length; i++ ) {
		if (isDefined(logfile[i])) {
			logstring += logfile[i];
			omspellingen++;
		}
	}

	// Ambiguestring samenstellen..
	for(i=0; i<ambiguelog.length ; i++ ) {
			ambiguestring += ambiguelog[i];
	}	
	
	// Tempstring samenstellen, deel 1.
	if (logfile.length>0) {
		percentage = Math.round(( omspellingen / words ) * 100 *100)/100;
		tempstring = "Regels verwerkt: " + newlines.length;
		tempstring += "\nWoorden: "+words;
		tempstring += "\nOmspellingen uitgevoerd: " + omspellingen;
		tempstring += "\nPercentage omspellingen: "+percentage + "%";
		tempstring += "\n\n";
		tempstring += "Vervangen:\nregelnummer 1995 => 2005 (context)\n\n"
		tempstring = tempstring+logstring;
	} else {
		tempstring = "Regels verwerkt: " + newlines.length;
		tempstring += "\nWoorden: "+words;
		tempstring += "\nGeen omspellingen uitgevoerd";
		tempstring += "\n\n";
	}

	// Tempstring samenstellen, deel 2.
	if (ambiguelog.length>0) {
		tempstring += "\n";
		tempstring += "In deze tekst staan ook onderstaande omspelparen waarvan beide schrijfwijzes kunnen voorkomen.\n"
		tempstring = tempstring+ambiguestring;
	}
	
	// Zet de 'logboek' in het browservenster.
	$('log').value = tempstring;

}


/**
* Check if a javascript variable has been defined.
*/
function isDefined( variable) {
	return (typeof(variable) == "undefined")?  false: true;
}


/**
* De functie die wordt aangeroepen, als je op de knop 'Vertaal!' klikt,
* en die regelt dat de dingen gebeuren.
*/
function vertaal() {
	// meerdere keren klikken zorgde ervoor dat het regelnummer opliep
	newlines = [];
	logfile = Array();
	ambiguelog = Array();
	
	// Nette melding tonen voor bezoekers.
	$('evengeduld').innerHTML = "Even geduld, alstublieft.";

	Form.disable('vertaalbutton');

	$('log').value = "";
	$('naar').value = "";

	// We wachten 1/20 seconde, zodat IE de tijd krijgt om het scherm bij te werken, en
	// 'even geduld' melding te tonen.. Als we dit niet doen, dan toont IE de melding
	// niet.
	window.setTimeout('vertaal_worker()', 50);

}

/**
* Waar het harde werk gebeurt
*/
function vertaal_worker() {
	if($('van').value!="") {
		var str = " "+$('van').value;
		var str_sub = "";
		var chunkcounter = 0;
		var omgespeld = "";
		var chunksize = 50000;
	
		str = replaceAll(str, [["\r", ""]] );
	
		findNewLines(str);
		words=wordcount(str);
	
		// Verwerk in blokken van 'chunksize'.
		while ( str.length > chunksize ) {

			str_sub = str.substr(0, chunksize);
			str = str.substr((chunksize), 10000000);

			omgespeld = omgespeld + replaceAllSpan(str_sub, omspelparen, chunkcounter*chunksize);

			chunkcounter++;

		}

		// En dan het restje nog..
		omgespeld = omgespeld + replaceAllSpan(str, omspelparen, chunkcounter*chunksize);

		// Zet de totale omgespelde tekst in het 'naar' veld.
		$('naar').value = omgespeld.substr(1,(omgespeld.length-1));

		// Print de logfile..
		printLog();
	}
		// Melding weer uitzetten..
	$('evengeduld').innerHTML = "&nbsp;";
	Form.enable('vertaalbutton');
	
}

