/*
	Tri-IT Information Services
	Auteur: Patrick Baanvinger
	Datum: 30-09-2005
	Filenaam: ContentBlok.js
	
	Implementatie van een Asynchrone verwerking met gebruik making van de BorgWorx Library (C).
	Deze file is bedoeld om de content pages van Bronnen Tot Bewoners te realiseren.
	
*/

/* 
	Globals
*/

	var g_ContentId			= 0;		// Nodig om het Content Id overal (ook in CallBack) te kunnen benaderen
	var g_TopContentId      = 0;
	var g_ContentWidth		= 420;		// Nodig om het Content Width overal (ook in CallBack) te kunnen benaderen
	var g_AdditionalWidth	= 242;		// Nodig om het Additional width overal (ook in CallBack) te kunnen benaderen

/*
	===================================================================================
	Start QueryString functionaliteit
	===================================================================================
*/

/*
	 Object PageQuery

	 Feitelijk is dit de object constructor
	 
	 Dit object krijgt het window location object search object door
	 De querystring variabelen worden in een Array gezet als value pairs
	 Hierna maakt het van PageQuery een object waaraan vier functies worden
	 toegevoegd. GetValue, GetParameters, GetLength en GetKeyValuePairs.
	 
	 Originele code (Variabele namen iets aangepast) met verdere verklaringen is te vinden 
	 op: http://www.eggheadcafe.com/articles/20020107.asp 
	 
	 (Dit geldt alleen voor de QueryString functionaliteit)
*/

function PageQuery(queryString) {
	
	if(queryString.length > 1){
		this.queryString = queryString.substring(1, queryString.length);
	}else {
		this.queryString = null;
	}
	
	this.keyValuePairs = new Array();
	
	if(queryString) {
		for(var i=0; i < this.queryString.split("&").length; i++) {
			this.keyValuePairs[i] = this.queryString.split("&")[i];
		}
	}
	
	/*
		 Deze functie retourneert de een KeyValue pair
	*/
	this.getKeyValuePairs = function() { 
		return this.keyValuePairs; 
	}

	/*
		 Deze functie retourneert een waarde voor een key met de naam Name
		 indien de key niet gevonden wordt, wordt false geretourneerd.
	*/
	this.getValue = function( Name ) {
	
		for(var j=0; j < this.keyValuePairs.length; j++) {
		
			if(this.keyValuePairs[j].split("=")[0] == Name )
				return this.keyValuePairs[j].split("=")[1];
				
		}
		
		return false;
	}
	
	/*
		Deze functie retourneert een array met alle parameters die
		in de QueryString te vinden zijn
	*/
	this.getParameters = function() {
		var arrayParam = new Array(this.getLength());
		for(var j=0; j < this.keyValuePairs.length; j++) {
			arrayParam[j] = this.keyValuePairs[j].split("=")[0];
		}
		return arrayParam;
	}
	this.getLength = function() { return this.keyValuePairs.length; }
}

/*
	Met deze functie wordt er een QueryString variabele uitgelezen
*/

function QueryString(key,defaultvar){
	var page = new PageQuery(window.location.search);
	var returnvalue = unescape(page.getValue(key));
	if( returnvalue== "false") returnvalue = defaultvar;
	
	return returnvalue;
}

/*
	Deze functie wordt gebruikt bij het laden van de pagina.
	Hier wordt de naam van het blok gezet en het icoonblokje verwijderd.
	
	Daarna wordt er een call gedaan om het de content op te halen voor
	de huidige ItemTypeCategory
*/
	function InitializePage()
	{
		try{
			document.getElementById("HeaderText").innerHTML = ContentBlok.GetPageName().value;
			var l_ContentId = 0;
			l_ContentId = QueryString("ContentId",0);
			g_TopContentId = ContentBlok.GetTopLevelContentId(ContentBlok.GetPageName().value).value;
			ContentBlok.GetTopLevelContent(l_ContentId, GetTopLevelContent_CallBack );
		}catch(error){
			var ErrorString="";
			
			ErrorString += "<TABLE CELLSPACING=5 CELLPADDING=5 BORDER=0><TR><TD>";
			ErrorString += "<FONT COLOR='Black'>Foutmelding:<BR>Er heeft zich een fout voorgedaan. ";
			ErrorString += "Dit is waarschijnlijk te wijten aan het feit dat deze website gebruik maakt van een aantal ";
			ErrorString += "functies die op uw browser niet beschikbaar zijn.<BR><BR>";
			ErrorString += "Door het veelvuldig gebruik van Javascript is het noodzakelijk dat deze functionaliteit beschikbaar is op uw browser<BR><BR>";
			ErrorString += "De website is getest op standaard installaties van:<BR>";
			ErrorString += "<LI>Internet Explorer 6.0 (Windows)";
			ErrorString += "<LI>Firefox 1.0.7 (Windows)";
			ErrorString += "<LI>Safari 2.0 (OSX)";
			ErrorString += "<LI>Firefox 1.0.7 (OSX)";
			ErrorString += "<BR><BR>Onze excuses voor het ongemak<BR><BR>"
			ErrorString += "</FONT>";
			ErrorString += "</TD></TR></TABLE>";
			document.getElementById("Content").innerHTML = ErrorString;
		}
	}

/*
	Dit is de callback routine voor GetTopLevelContent.
	Hier wordt de content geplaatst in het scherm en wordt de routine voor 
	de itemtypes geactiveerd
*/
	function GetTopLevelContent_CallBack( response )
	{
		SetContent( response );
		GetItemTypes();
	}

	function GetTopLevelTypes()
	{
		ContentBlok.GetTopLevelContent(g_TopContentId ,GetTopLevelContent_CallBack);
	}

/*
	Deze functie leegt het Header icoon en haalt alle itemtypes op
*/
	function GetItemTypes()
	{
		document.getElementById("HeaderText").innerHTML = ContentBlok.GetPageName().value;
		document.getElementById("HeaderIcon").innerHTML = "";
		ContentBlok.GetItemTypesData(GetItemTypesData_CallBack);
	}

/*
	Deze functie is de callback voor GetItemTypeData. Hier wordt de response text geplaatst in
	het document object TableItems. Dit is een volledige tabel.
*/

	function GetItemTypesData_CallBack( response )
	{
		if ( response.error != null )
		{
			document.getElementById("TableItems").innerHTML = response.error;
			return;
		}
		document.getElementById("TableItems").innerHTML =response.value;
	}	


/*
	Deze functie haalt voor een geselecteerd ItemType de bijbehorende items op.
	Tevens plaatst deze de  headernaam en het headericoon om een niveau terug te gaan.
*/
	function GetItems( HeaderName, ItemTypeId, ContentId )
	{
		if ( HeaderName.length > 0) document.getElementById("HeaderText").innerHTML = HeaderName;
		document.getElementById("HeaderIcon").innerHTML = "<A HREF='javascript:GetTopLevelTypes()'><IMG SRC='custom/vbtb/images/icons/icon_up.gif' BORDER='0' ALT='Niveau terug'></a>";
		// Global var zetten. Huidige context verdwijnt.
		g_ContentId = ContentId;
		document.getElementById("TableItems").innerHTML =ContentBlok.GetItems( ItemTypeId).value;
		//ContentBlok.GetContent( g_ContentId, GetContent_CallBack );
		SetContent(ContentBlok.GetContent( g_ContentId));
	}
	
/*
	Deze functie zet de Image link naar de dynamische page
*/
	function SetPicture( Id, AltTag )
	{
	
		return "<IMG SRC='DisplayImage.aspx?ParagraphId=" + Id + "' Alt='" + AltTag +  "'>";
	}

/*
	Functie om een Paragraaf Top picture te tonen
*/
	function SetPictureTop( Row )
	{
		var ReturnString ="";
		
		if(( Row.HasPicture == 1 ) && ( Row.PicturePositionValue == 'top')){
			ReturnString += "<TR><TD COLSPAN='2' ALIGN='Center'>";
			ReturnString += SetPicture ( Row.Id, Row.AltTag);
			ReturnString += "</TD></TR>";
		}
		
		return( ReturnString);
	}
	
/*
	Functie om een Paragraaf Left picture te tonen
*/

	function SetPictureLeft( Row )
	{
		var ReturnString ="";
		if(( Row.HasPicture == 1 ) && ( Row.PicturePositionValue == 'left')){
			ReturnString += "<TD VALIGN='Top'>";
			ReturnString += SetPicture ( Row.Id, Row.AltTag);
			ReturnString += "</TD>";
			
		}	
		return( ReturnString);
	}
	
/*
	Functie om een Paragraaf Bottom picture te tonen
*/

	function SetPictureBottom( Row )
	{
		var ReturnString ="";
		
		if(( Row.HasPicture == 1 ) && ( Row.PicturePositionValue == 'bottom')){
			ReturnString += "</TD></TR><TR><TD  COLSPAN='2' ALIGN='Center'>";
			ReturnString += SetPicture ( Row.Id, Row.AltTag);
		}	
		return( ReturnString);
	}

/*
	Functie om een Paragraaf Right picture te tonen
*/

	function SetPictureRight( Row )
	{
		var ReturnString ="";
		
		if(( Row.HasPicture == 1 ) && ( Row.PicturePositionValue == 'right')){
			ReturnString += "</TD><TD  VALIGN='Top'>";
			ReturnString +=  SetPicture ( Row.Id, Row.AltTag);
			
		}	
		return( ReturnString);		
	}

/*
	Deze functie processed een paragraaf en zet deze om naar HTML.
*/
	function ProcessContentRow( Row, RowCount )
	{
		var ReturnString = "";

		ReturnString += "<TR><TD COLSPAN='2' >";

		ReturnString +=  "<a name='" + Row.Id + "' Id='ParagraphTitle'>" + Row.Title;
		// Plaatjes staan voor de content in de page stream
		ReturnString +=SetPictureTop(Row);

		ReturnString += "<TR>";
		ReturnString += SetPictureLeft(Row);
		var boolDoubleColspan = (( Row.HasPicture == 0 )||( Row.PicturePositionName == 'Top')||( Row.PicturePositionName == 'Bottom'));
		ReturnString += (boolDoubleColspan)?"<TD COLSPAN='2' ID='ParagraphText'>" : "<TD ID='ParagraphText'>";
		// Daadwerkelijke content
		ReturnString += Row.Description+"";
		// Plaatjes staan achter de content in de page stream
		ReturnString += SetPictureRight( Row);
		ReturnString += SetPictureBottom(Row);

		ReturnString += "</TD></TR>";
		//Anchor back to top
		ReturnString += "<TR><TD COLSPAN='2'><A HREF='#header'  ID='AnchorTop'>Terug naar boven</A></TD></TR>";
		ReturnString += "<TR><TD COLSPAN='2' >&nbsp;</TD></TR>";

		return ReturnString;

	}


/*
	Deze function maakt een lijst van externe links
*/
	function ProcessExternalLinks( Rows )
	{
		var ReturnString = "";
		
		//ReturnString += "<tr><td Valign='top'>
		ReturnString += "<SPAN ID='LinkHeader'>Externe Links</SPAN><BR>"
		for( var i=0; i< Rows.length; i++)
		{
			
			ReturnString += "<A HREF='" + Rows[i].Url + "' id='ExternalLink'>" + Rows[i].Name + "</A><BR>";
		}
	//	ReturnString += "</td></tr>"
		return ReturnString;
	}



/*
	Deze functie toont de content van een item.
	
	Hiervoor bouwen we drie HTML blokken op:
	
	htmlContentBlock
	===================
	Hier staat de daarwerkelijke content in. Deze bestaat uit de paragrafen
	
	htmlAdditionalBlock
	===================
	In dit blok staan de extra infoText en de externe links.
	
	htmlHeaderBlock
	===================
	Dit blok bevat de title van het item en de eventuele anchorpoints
	
	Aan het einde van de routine wordt bepaald of het additionele blok getoond wordt of niet.
	Indien er geen extrainfo is, wordt het additionele blok uit of aangezet.
	
*/

	function SetContent( response )
	{
		var htmlContentBlock = "";
		var htmlAdditionalBlock = "";
		var htmlHeaderBlock = "";
		var htmlAssociationBlock ="";

		// Check of we een tables object hebben.
		if( typeof( response) == 'object' && typeof(response.value.Tables) == 'object'){
			if( response.value.Tables[0].Rows.length > 0){
				htmlHeaderBlock += "<TABLE ID='TableAnchorPoints'>";
				htmlHeaderBlock += "<TR><TD ID='HeaderTitle'><A NAME='header' id='HeaderTitle'>"+response.value.Tables[0].Rows[0].Name+"</A></TD></TR>";
				htmlHeaderBlock += "<TR><TD>&nbsp;</TD></TR>";
				htmlContentBlock += "<TABLE ID='TableParagraph' >";

				// Verwerken van de paragraphs
				for( var i=0; i < response.value.Tables[1].Rows.length; i++){
					//Setting anchors
					if( response.value.Tables[1].Rows.length>2) htmlHeaderBlock += "<TR><TD><A HREF='#" + response.value.Tables[1].Rows[i].Id + "' ID='HeaderAnchorPoint'>" + response.value.Tables[1].Rows[i].Title + "</A></TD></TR>";
					htmlContentBlock += ProcessContentRow( response.value.Tables[1].Rows[i], response.value.Tables[1].Rows.length );
				}
				
				// Vullen van het additionele blok voor de externe links
				if  (( response.value.Tables[2].Rows.length > 0 ) ){
					//Process external links
					htmlAdditionalBlock += ProcessExternalLinks( response.value.Tables[2].Rows );
				}
				
				if(  response.value.Tables[3].Rows.length > 0 ){
					
				//	htmlAssociationBlock +="<TR><TD>";
					htmlAssociationBlock += "<SPAN ID='LinkHeader'>Interne links</SPAN><BR>";
				
					// Interne Associaties
					for( var i=0; i < response.value.Tables[3].Rows.length; i++){
						htmlAssociationBlock +="<A HREF='javascript:SetContent(ContentBlok.GetContent("+response.value.Tables[3].Rows[i].ContentId+"));' id='ExternalLink'>" + 	response.value.Tables[3].Rows[i].Name + "</A><BR>";
					}
					htmlAssociationBlock +="<BR>";
					//htmlAdditionalBlock =htmlAssociationBlock +htmlAdditionalBlock;
					
				}
				htmlAdditionalBlock = "<tr><td Valign='top'>" + htmlAssociationBlock + htmlAdditionalBlock + "</tr></td>";
			// Check of er extra info is.
			//	alert( response.value.Tables[0].Rows[0].ExtraInfo.replace( /(\s+)/,"").length );
				if( (response.value.Tables[0].Rows[0].ExtraInfo != null)  ) {
					// Zo ja, plak deze achter de externe links en toon het additionele scherm
					if  ( response.value.Tables[2].Rows.length > 0 ) htmlAdditionalBlock += "" ;
					htmlAdditionalBlock = "<tr><td valign='top' id='ExtraInfoText' height='1'>" + response.value.Tables[0].Rows[0].ExtraInfo + "<BR><BR></td></tr>"+htmlAdditionalBlock;
					htmlAdditionalBlock = "<TABLE ID=TableAdditional border=0>" + htmlAdditionalBlock  + "</TABLE>"  ;
					
					AddtionalAan();
				}else{
					// Zo nee, plak dan de externe links achter het Contentblok en verberg het additionele blok.
					htmlContentBlock += "<BR><BR>" + "<TABLE>" + htmlAdditionalBlock + "</TABLE>" ;
					AddtionalUit();
				}
				
				// sluit alles netjes af
				htmlContentBlock += "</TABLE>";
				htmlHeaderBlock += "<TR><TD>&nbsp;</TD></TR>";
				htmlHeaderBlock += "</TABLE>";
				
				//En toon de data

				document.getElementById("Additional").innerHTML = htmlAdditionalBlock;
				document.getElementById("Content").innerHTML = htmlHeaderBlock + htmlContentBlock   ;
			}
		}else{
			// Toon de foutmelding indien aanwezig.
			if (response.error != null){
				document.getElementById("Content").innerHTML = "<FONT COLOR='RED'>Foutmelding:<BR>" + response.error + "</FONT>";
			}else{
				document.getElementById("Content").innerHTML = "<FONT COLOR='RED'>Foutmelding:<BR>Er heeft zich een algemene fout voorgedaan. Onze excuses.<BR><BR>Probeer het later nog eens.</FONT>";
			}
		}
	}
	
/*
	Deze functie zet het additionele blok aan en zet de juiste breedte waarden.
*/
	function AddtionalAan()
	{
		document.getElementById("TableAdditional").style.visibility = "visible";
		document.getElementById("Content").style.width = g_ContentWidth;
		document.getElementById("Additional").style.width = g_AdditionalWidth;
	}	

/*
	Deze functie zet het additionele blok uit en zet de juiste breedte waarden.
*/
	function AddtionalUit()
	{
		document.getElementById("TableAdditional").style.visibility = "hidden";
		document.getElementById("Content").style.width =g_ContentWidth + g_AdditionalWidth;
		document.getElementById("Additional").style.width =0;
	}

