/*--------------------------------------------------------------------------------------------
@Description These functions are used in the CookIIS Project from 2009 
			 http://cookiis.iis.uni-hildesheim.de:8080/ccc/index.jsp
			 
@Author written/modified Franziska Öllerer 
@Author edited Alexandre Hanft

@Date July 2010
--------------------------------------------------------------------------------------------*/

/*
@Description deletes all HTML Tags from a  String
*/
function stripHTML(str) { 
	return str.replace(/<[^>]*>/g, "");
}

/*
@Description deletes all (HTML-tagged) Ingredient Replacements and other HTML Tags from a  String
*/
function RemoveReplacementsStripHTML(str) { 
	//marked by <strike>oldingr</strike> <em>new ingr</em>other
	//deletess <strike>,</strike> Tags and complete Text between <em> </em>
	//alert(str + " nach " + stripHTML( str.replace(/<strike>/, "").replace(/<\/strike>/, "").replace(/<em>[^<]*<\/em>/g, "")));
	return stripHTML( str.toLowerCase().replace(/<strike>/, "").replace(/<\/strike>/, "").replace(/ <em>[^<]*<\/em>/g, ""));
}

/*
@Description löscht alle Zeilenumbrüche, Leerzeichen am Anfang und Ende und doppelten Leerzeichen.
 zur Zeit nicht benoetigt.
*/
function trim (str) {
    return str.replace(/[\n\r]/g, '').replace(/ +/g, ' ').replace(/^\s+/g, '').replace(/\s+$/g, '');
}


/*
@Name fade()
@param step - to reduce the visbility while step <= 100
@Description This functions change pictures in a header and shows them as a slideshow
id="slideShow" in the css-file and .next must be defined as well
reduce visibility while opacity > 1
@Author http://aktuell.de.selfhtml.org/artikel/javascript/fader-framework/bilderslideshow.htm 
@Modified Franziska Öllerer
@Date Juli 2009
--------------------------------------------------------------------------------------------*/
index = 0;
function fade(step) {

				var bilder = document.getElementById("slideShow").getElementsByTagName("img");

				step = step || 0;
	
				//reduce visibility while opacity > 1
				bilder[index].style.opacity = step/100;
	
				bilder[index].style.filter = "alpha(opacity=" + step + ")"; 
			
	//incremnt step
				step = step + 1;
	
	//while step is less or equals 100 reduce the visibility
				if (step <= 100) {
	
						window.setTimeout(function () { fade(step); }, 1);
		
				} else {
	
		//the start sec to the next pic
						window.setTimeout(next, 5000);
		
				}
}


/*
@Name next()

@Description This functions change pictures in a header and shows them as a slideshow
id="slideShow" in the css-file and .next must be defined as well

choses the next img-Element to reduce the visiblity by calling fade()
@Author http://aktuell.de.selfhtml.org/artikel/javascript/fader-framework/bilderslideshow.htm Juli 2009
@Modified Franziska Öllerer
@Date Juli 2009
--------------------------------------------------------------------------------------------*/
function next() {

// sets the array bilder the images
		var bilder = document.getElementById("slideShow").getElementsByTagName("img");
		
//to catch
		if (typeof(index) != "number") {
			index = 0;
		}

	 //calls fade() with the new image to reduce the visibility
		if(index < bilder.length-1){
			 index++;
			 fade();
				}           
};


/*
@Name show()
@Param nummer, to reference a certain recipe
@Description These function is used to show the recipes in the listview
@Author Franziska Öllerer 
@Date Juli 2009  
--------------------------------------------------------------------------------------------*/
function show(nummer) {
	if(document.getElementById("ve" + nummer)) {
	
		document.getElementById("ve" + nummer).style.display = "inline";
		
		}
	if(document.getElementById("da" + nummer)){ 
	
		document.getElementById("da" + nummer).style.display = "none";
		
	}
	if(document.getElementById("nd" + nummer)){
	
		document.getElementById("nd" + nummer).style.display = "inline";
		
	}
}


/*
@Name hide()
@Param nummer, to reference a certain recipe
@Description These function is used to hide the recipes in the listview
@Author Franziska Öllerer 
@Date Juli 2009  
--------------------------------------------------------------------------------------------*/
function hide(nummer) {

	if(document.getElementById("ve" + nummer)) {
	
		document.getElementById("ve" + nummer).style.display = "none";
		
	}
	if(document.getElementById("da" + nummer)){ 
	
		document.getElementById("da" + nummer).style.display = "inline";
		
	}
	
	if(document.getElementById("nd" + nummer)){ 
	
		document.getElementById("nd" + nummer).style.display = "none";
		
	}
}


/*
@Name showFeed()

@Param nummer, to reference a certain recipe

@Description These function is used to show the feedbackarea in the listview
			 
@Author Franziska Öllerer 

@Date Juli 2009  
--------------------------------------------------------------------------------------------*/
function showFeed(nummer) {

	if(document.getElementById("veFeed" + nummer)) {
	
		document.getElementById("veFeed" + nummer).style.display = "inline";
		
		}
	if(document.getElementById("daFeed" + nummer)){ 
	
		document.getElementById("daFeed" + nummer).style.display = "none";
		
	}
	if(document.getElementById("ndFeed" + nummer)){ 
	
		document.getElementById("ndFeed" + nummer).style.display = "inline";
	}
}


/*
@Name hideFeed()
@Param nummer, to reference a certain recipe
@Description These function is used to hide the feedbackarea in the listview
@Author Franziska Öllerer 
@Date Juli 2009  
--------------------------------------------------------------------------------------------*/
function hideFeed(nummer) {

	if(document.getElementById("veFeed" + nummer)){
	
		document.getElementById("veFeed" + nummer).style.display = "none";	
		
	}
	if(document.getElementById("daFeed" + nummer)){
	
		document.getElementById("daFeed" + nummer).style.display = "inline";
		
	}
	
	if(document.getElementById("ndFeed" + nummer)){
	
		document.getElementById("ndFeed" + nummer).style.display = "none";
		
	}
}


/*
@Name showSeasonsList()
@Description toggle optionlistview's visibility on/off, if a  certain index is selected in an other optionlistview in index.jsp.
@Author Franziska Öllerer 
@Author edited by Alexandre Hanft
@Date April 2010
--------------------------------------------------------------------------------------------*/
function DeselectNoneShowSeasonsList() {

	// if the specific index (0) for for "none", deselect all, because otherwise "none" counts and decreases similarity
	if(document.searchForm.Att_Extra_Diet.options[0].selected == true){
		document.searchForm.Att_Extra_Diet.selectedIndex = -1;
	}

	// if the specific index (2) for seasonal restrictions is selected
	if(document.searchForm.Att_Extra_Diet.options[2].selected == true){
		//show the other optionlistbox
		document.searchForm.season.style.visibility = "visible";
	}
	else {
		//if another index is selected or the index 2 is deselected, hide the optionlistbox
		document.searchForm.season.style.visibility = "hidden";
	}
}


/*
@Name showSeasonsListMenu()
@Description toggle optionlistview's visibility on/off, if a  certain index is selected in an other optionlistview in menu.jsp.
@Author Franziska Öllerer 
@Author edited by Alexandre Hanft
@Date April 2010  
--------------------------------------------------------------------------------------------*/
function DeselectNoneShowSeasonsListMenu() {

	// if the specific index (0) for for "none", deselect all, because otherwise "none" counts and decreases similarity
	if(document.menuForm.Att_Extra_Diet.options[0].selected == true){
		document.menuForm.Att_Extra_Diet.selectedIndex = -1;
	}

	// if the specific index (2) for seasonal restrictions is selected
	if(document.menuForm.Att_Extra_Diet.options[2].selected == true){
		//show the other optionlistbox
		document.menuForm.season.style.visibility = "visible";	
	}
	else{
		//if another index is selected or the index 2 is deselected, hide the optionlistbox
		document.menuForm.season.style.visibility = "hidden";
	}
}


/*
@Name SetForbidden()
@Description setzt Text des Value einer checkbox in textarea ein bzw. löscht es wieder heraus uebergeben wird der elementname, der value wird selbst aus Element geholt
@Param check_elem_name:	the name of the check box
@Param forbidden_textarea:	text area wo der Text der verbotenen Zutat angefügt/entfernt wird
@Author Alexandre Hanft 
@Date 2010 -05-25
--------------------------------------------------------------------------------------------*/
function SetForbidden(check_elem_name, forbidden_textarea)
{	
	//alert(check_elem_name + " " + forbidden_textarea ) ;
	var sep = "\n";

	checkElement = document.getElementById( check_elem_name ); // geht nur wenn auch id nicht nur name gesetzt ist
	if( checkElement!= null ) {
		//alert(checkElement.value );
		forbiddenField=document.getElementById( forbidden_textarea );

		//ohne ReplacementMarkierungen und HTML, sonst nicht wieder gefunden
		var sNewForbiddenInTextarea = sep + RemoveReplacementsStripHTML( checkElement.name );

		//uebergebenen Text bei Forbidden eintragen oder rausloschen 
		if( checkElement.checked  ) {
			//nicht doppelt hinzufuegen, nur wenn noch nicht drin
			var posNewForbidden = forbiddenField.value.indexOf( sNewForbiddenInTextarea );
			if (posNewForbidden == -1)  //noch nicht drin
				forbiddenField.value = forbiddenField.value + sNewForbiddenInTextarea;
		}
		else
			forbiddenField.value = forbiddenField.value.replace( sNewForbiddenInTextarea, "" )
	}
}


/*
@Name SetForbiddenChangeIcon()
@Description setzt Text des Value (einer grafik+hidden elelment) in textarea ein bzw. löscht es wieder heraus uebergeben wird der elementname, der value wird selbst aus Element geholt
@Param check_elem_name:	the id of the hidden elemement and of the image
@Param forbidden_textarea:	text area wo der Text der verbotenen Zutat angefügt/entfernt wird
@Param bDetermineCheckValue:	optional, do nothing if ommitted, otherwise check value from forbidden_textarea
@Author Alexandre Hanft 
@Date 2010 -05-26
--------------------------------------------------------------------------------------------*/
function SetForbiddenChangeIcon(check_elem_name, forbidden_textarea, bDetermineCheckValue)
{	
	checkElement = document.getElementById( check_elem_name ); // geht nur wenn auch id gesetzt ist
	if( checkElement!= null ) {

		//alert(checkElement.value + " name: " + checkElement.name);
		forbiddenField= document.getElementById( forbidden_textarea );

		var sep = "\n";
		//ohne ReplacementMarkierungen und HTML, sonst nicht wieder gefunden
		var sNewForbiddenInTextarea = RemoveReplacementsStripHTML( checkElement.name );

		var posNewNurbeiAlt = checkElement.name.indexOf( "alt" ); //only for alerts

		if(bDetermineCheckValue != null) { //not ommitted // or arguments.lenth == 3){
			//determine value of check element
			var checkval = 'false';
			var posAlreadyThere =forbiddenField.value.indexOf( sNewForbiddenInTextarea );
			if( posAlreadyThere != -1) {
				checkval = 'true';
			}

			//if( posNewNurbeiAlt != -1)
			//	alert( check_elem_name + " for checkval: " + posNewNurbeiAlt + " = " + checkval + " <-- " + checkElement.value );
			
			if( checkElement.value != checkval)	// nur wenn etwas zu ändern ist
				ChangeIconCheckBox( check_elem_name ); //Setzt checkElement.value auf checkval

			//event loeschen, damit beim nächsten Laden der Grafik nicht nochmal
			document.images[check_elem_name].setAttribute ('onLoad', '');
		}
		else {
			//if( posNewNurbeiAlt != -1)
			//	alert( check_elem_name + " checkElement.value= " + checkElement.value );
			//change icon and value of checkbox
			ChangeIconCheckBox( check_elem_name );
			//alert(check_elem_name + " - " + forbidden_textarea ) ;
		}

		//uebergebenen Text bei Forbidden eintragen oder rausloschen 
		if( checkElement.value == 'true' ) {
			//nicht doppelt hinzufuegen, nur wenn noch nicht drin
			var posNewForbidden = forbiddenField.value.indexOf( sNewForbiddenInTextarea );
			if (posNewForbidden == -1)  //noch nicht drin
				forbiddenField.value = forbiddenField.value + sep + sNewForbiddenInTextarea;
		}
		else {
			forbiddenField.value = forbiddenField.value.replace( sep + sNewForbiddenInTextarea, "" );
			forbiddenField.value = forbiddenField.value.replace( sNewForbiddenInTextarea, "" );  //falls ohne \n
		}
	}
}


/*
@Name ChangeIconCheckBox()
@Description ändert (hidden) checkbox.value und Grafik zur Simulation einer Checkbox mit 2 verschiedenen Grafiken
@Param feld):	the id of the image
@Param forbidden_textarea:	text area wo der Text der verbotenen Zutat angefügt/entfernt wird
@Author Alexandre Hanft 
@Date 2010 -04-15
--------------------------------------------------------------------------------------------*/
function ChangeIconCheckBox(feld)
{
	checkElement = document.getElementById( feld ); 
	//alert( localizedStrings.fmt_label_ttcookiis );
	if(checkElement.value == 'true')
	{
	checkElement.value = 'false';
	document.images[feld].src = 'images\\haken.png';
	//document.images[feld].setAttribute ('onmouseover', 'Tip(' + fmt_label_ExcludeInIngredientList + ', TITLE, ' + fmt_label_ttcookiis + ')' ); 'click to exclude this ingredient and query again.'
	document.images[feld].setAttribute ('onmouseover', 'Tip(\'' + localizedStrings.fmt_label_ExcludeInIngredientList + 
		'\', TITLE, \'' + localizedStrings.fmt_label_ttcookiis + '\')' );
	}
	else
	{
	checkElement.value = 'true';
	document.images[feld].src = 'images\\kreuz.png';
	//alert('Tip(' + fmt_label_IncludeAgainInIngredientList + ', TITLE, ' + fmt_label_ttcookiis + ')');
	//document.images[feld].setAttribute ('onmouseover', 'Tip(\'' + fmt_label_IncludeAgainInIngredientList + '\', TITLE, \'' + fmtlabelttcookiis + '\')' );  'click here and query again to revert excluding.'
	document.images[feld].setAttribute ('onmouseover', 'Tip(\'' + localizedStrings.fmt_label_IncludeAgainInIngredientList + 
		'\', TITLE, \'' + localizedStrings.fmt_label_ttcookiis + '\')' );
	}
}

/*
@Name saveUserAdaptation()
@Description saves given text in a file
@Param txt:	text 
@Param txt:	filename
@Author Alexandre Hanft 
@Date 2010-06-22
--------------------------------------------------------------------------------------------*/
function saveUserAdaptation(recipeID, oldIngr, newIngr)
{
	//z.B. auch System.getProperty(line.separator)
	//String mySep = ";";
	saveTextInFile(recipeID + ";" + oldIngr + ";" + newIngr + "\n", "useradaptation.txt" );
}



/*
@Name buildLinksForUserAdaptation()
@Description builds UsaerAdaptationLinks,  called from <script > in index.jsp 
@Param orengeSystemID, from Case used to extract the RecipeID
@Author Alexandre Hanft
@Date June 2010
--------------------------------------------------------------------------------------------*/
function buildLinksForUserAdaptation(recipeID, adapttext ) 
{
	//var recipeID = extractRecipeID( orengeSystemID );
	var ret = recognizeAdaptation(recipeID, adapttext, "Please replace ", " through ", ".", ", ", true );
	ret = recognizeAdaptation(recipeID, ret, "Please exchange ", " through ", " (Community).", " or ", true );
	ret = recognizeAdaptation(recipeID, ret, "Please use ", " instead of ", ".", ", ", false );
	
	return ret;
}

/*
@Name recognizeAdaptation()
@Description extract single concepts from on adaptaation line and, called from buildLinksForUserAdaptation
@Param directionForward is true if OLD is before (and NEW after) patternMiddle [normal model-based, Community] 
	or false if the other way around [InsteadOf] 
@Author Alexandre Hanft
@Date 2010-07-17
--------------------------------------------------------------------------------------------*/
function recognizeAdaptation( recipeID, adapttext, patternStart, patternMiddle, patternEnd, splitter, directionForward ) 
{
	var ret= adapttext; //default if nothing to change
	var posOld = adapttext.indexOf( patternStart );
	var posNew = adapttext.indexOf( patternMiddle );
	var Komma = adapttext.indexOf(splitter, posNew);//after middle
	var splitArray; //outside if{}

	//only if more than one alternative and pattern found
	if( Komma != -1 && posOld != -1 ) { //if more than one Replacements and Pattern found
		//if( directionForward==false) alert(patternStart + posOld + patternMiddle+ posNew );
		//alert( adapttext + ' mit ' + patternStart + ' and \"' + splitter + '\" ' +  posOld + ' ' + posNew + ' ' + Komma );
		//alert(adapttext.indexOf( patternStart ));
		var conceptsBeforeMiddle = adapttext.substring(posOld + patternStart.length, posNew);

		posNew = posNew + patternMiddle.length; //starts after the pattern
		//alert(adapttext.indexOf( patternStart ) + ' ' + posNew + ' ' adapttext.substring(0,adapttext.indexOf( patternMiddle)+ patternMiddle.length );
		var conceptsAfterMiddle = adapttext.substring(posNew, adapttext.length - patternEnd.length); //. weg
		ret = adapttext.substring( 0, posNew); //copy from beginn to end of MiddlePattern, includes all OLDs

		//at first the same: only for enumeration after MiddlePattern
		if (directionForward == true) {
			splitArray = conceptsAfterMiddle.split(splitter);
		}
		else {
			splitArray = conceptsAfterMiddle.split(splitter); // [InsteadOf] 
		}
		//alert( "conceptsBeforeMiddle: " + conceptsBeforeMiddle + ", conceptsAfterMiddle: " + conceptsAfterMiddle );

		for(i = 0; i < splitArray.length; i++) {
			if (directionForward == true) {
				ret = ret + buildOneLink( recipeID, conceptsBeforeMiddle, splitArray[i], splitArray[i] ) + splitter;
				//alert( "forward: " + buildOneLink( recipeID, conceptsBeforeMiddle, splitArray[i]) + splitter );
			}
			else {
				ret = ret + buildOneLink( recipeID, splitArray[i], conceptsBeforeMiddle, splitArray[i]) + splitter; // [InsteadOf] 
				//alert( "backward: " + buildOneLink( recipeID, splitArray[i], conceptsBeforeMiddle, splitArray[i] ) + splitter); // [InsteadOf] 
			}
		}

		ret= ret.substring(0, ret.length - splitter.length) + patternEnd; // omit last ", "
	}

	//alert( ret );
	return ret;
}

/*
@Name buildOneLink()
@Description baut Link für eine Ersetzung, welcher im Format beim Klick AddUserAdaptationHiddenField( SessionID, RecipeID OLD, NEW) aufruft
@Author Alexandre Hanft 
@Date 2010-07-17
--------------------------------------------------------------------------------------------*/
function buildOneLink(recipeID, oldIngr, newIngr, linkText) 
{
	var ret ="<a href=\"#\" onClick=\"AddUserAdaptationHiddenField( \'InputUserRevision\',  \'" + 
		localizedStrings.fmt_session_id  + " \', " + recipeID + ", \'" + oldIngr + "\', \'" + 
		newIngr + "\' ); return false;\">" + linkText + "</a>";
	//alert( ret );
	return ret;
}

/*
@Name AddUserAdaptationHiddenField()
@Description setzt Text des Value (einer grafik+hidden elelment) in textarea ein bzw. löscht es wieder heraus uebergeben wird der elementname, der value wird selbst aus Element geholt
@Param forbidden_textarea:	text area wo der Text der verbotenen Zutat angefügt/entfernt wird
@Author Alexandre Hanft 
@Date 2010 -07-16
--------------------------------------------------------------------------------------------*/
function AddUserAdaptationHiddenField(forbidden_textarea, sessionID, recipeID, oldIngr, newIngr)
{	
	var lineSep = "\n"; //sometimes not work
	var convertToLineSep = "--"; //will be convertet to \n in Java Pipelet to assure, that two user revs are always separated
	var elemSep = "|";
	//alert("Take in recipe " + recipeID + " for " + oldIngr + " the " + newIngr );

	//alert(checkElement.value + " name: " + checkElement.name);
	var userAdaptField= document.getElementById( forbidden_textarea );
	if( userAdaptField!= null ) {
		var userAdaptFieldText = userAdaptField.value;
		var newUserAdaptText = sessionID + elemSep + recipeID + elemSep + oldIngr + elemSep;//erst mal für evtl zu ersetzendes + newIngr +lineSep;

		//wenn altes drin, loeschen
		var posNewUserAdapt = userAdaptFieldText.indexOf( newUserAdaptText );
		if (posNewUserAdapt != -1) { //schon anderes Paar im Text: herausloeschen (das wird auch  bei exakt gleicher Zeile mit gleichem newIngr greifen
			var posEndOldAdapt = userAdaptFieldText.indexOf( lineSep, posNewUserAdapt );
			if (posEndOldAdapt != -1) {//sollte immer gefunden werden - Test noetig?
				var oldStr = 
				userAdaptFieldText = userAdaptFieldText.replace( userAdaptFieldText.substring( posNewUserAdapt, posEndOldAdapt+1), "");
			}
		}
		newUserAdaptText = newUserAdaptText + newIngr +lineSep; //jetzt erst komplettieren
		userAdaptFieldText= userAdaptFieldText + convertToLineSep + /*lineSep + */ newUserAdaptText;//"--"  exchanged throug \n in IngrPipelet
		userAdaptField.value = userAdaptFieldText.replace( convertToLineSep +convertToLineSep, convertToLineSep); //entfernt die beim Entfernen alter Eintraege enstandenden Doppelungen
		//alert( "new value: " + userAdaptField.value);
	} //if( userAdaptField!= null 
}

/*
@Name AddUserAdaptationHiddenField()
@Description setzt Text des Value (einer grafik+hidden elelment) in textarea ein bzw. löscht es wieder heraus uebergeben wird der elementname, der value wird selbst aus Element geholt
@Param forbidden_textarea:	text area wo der Text der verbotenen Zutat angefügt/entfernt wird
@Author Alexandre Hanft 
@Date 2010-06-30
--------------------------------------------------------------------------------------------*/
function extractRecipeID(orengeSystemID)
{	
	var posDir = orengeSystemID.lastIndexOf( "/" );
	var posFileExtension = orengeSystemID.indexOf( ".xml", posDir );
	//alert(orengeSystemID + '--> ' + posDir + ' ' + posFileExtension + ' ' + orengeSystemID.lastIndexOf( "casebase" ));

	if( posFileExtension != -1 && posDir != -1) {
		return orengeSystemID.substring(posDir +1, posFileExtension);
	}
	else return "99999";// default
}
