/*
 * Dyn_aanbod - Verantwoordelijk voor het uitvoeren van ajax requests.
 * Author: Tommy Lesmeister & Stephan van Bloemendal
 * Company: Goes & Roos
 */

 var dyn_list_plaats = [];
  var dyn_list_types = [];
var dyn_list_prijzen = [];
var dyn_list_perceelopp = [];
var dyn_list_woonopp = [];
var dyn_list_kamers = [];
var dyn_pagenum = 0;
var dyn_sort = null, dyn_zoekterm = null, dyn_adres = null, dyn_postcode = null, dyn_openhuis = null;
var glbSearchCookieName = "DynSearchCookie";

/*
 * .arrayAdd( sep, arr ) push 1 of meerdere items in array
 */
if( !String.arrayAdd ) {
	String.prototype.arrayAdd = function( sep, arr ) {
		if( this.indexOf( sep ) == -1 ) { arr.push(this); }
		else {
			arr_tmp = this.split(sep);
			for(var t=0;t<arr_tmp.length;++t)
				arr.push(arr_tmp[t]);
		}
	};
}

/*
 * ToggleArrayItems( obj, arr ) toggle selectie + array
 */
function ToggleArrayItems( obj, arr ) {
	if( ( pos = arr.indexOf( obj.title ) ) !== -1 ) {
		arr.splice(pos, 1);
		obj.className = "filter_norm";
	} else {
		arr.push(obj.title);
		obj.className = "filter_sel";
	}
}

/*
 * GetItemsSearchStr( val, str, pos ) string tussen positie en het & teken, anders de lengte van de string
 */
function GetItemsSearchStr( val, str, pos ) {
	var c = val.length + 1;
	if(str.indexOf("&", pos+c) !== -1)
		return str.substring(pos+c, str.indexOf("&", pos+c) );
	else
		return str.substring(pos+c, str.length);
}

/*
 * Filter_search(), schoont de pagina`s op en doet een request.
 */
function Filter_search() {
	dyn_pagenum = 0;
    	if( document.getElementById("GoogleContainer").style.display != "none" ) {
		toggleSmartGMap('lijst', 'li_lijst', 'li_kaart');
	}
  
	Filter_update(null, "");
	document.getElementById("ObjectsContainer").innerHTML = "<div class=\"dyn_loader\"></div>";
	setTimeout( "Dyn_request()", 100 );
	Dyn_write();
}

/*
 * Dyn_request(), doet een xmlhttp request op de aanbod pagina.
 */
function Dyn_request() {
	this.dyn_str = document.getElementById("filter_search");
	this.dyn_result = document.getElementById("ObjectsContainer");
	this.dyn_title = document.getElementById("num");
	
	// Inlezen van de xml
	if( window.XMLHttpRequest )
		var xml_obj = new XMLHttpRequest();
	else
		var xml_obj = new ActiveXObject("Microsoft.XMLHTTP");
	
	xml_obj.onreadystatechange = function() {
		//alert('readyState: '+ xml_obj.readyState);
		if( xml_obj.readyState == 4 ) {
			if( xml_obj.status == 200 ) {
				//alert(xml_obj.responseText);
				document.getElementById("ObjectsContainer").innerHTML = xml_obj.responseText;
				Dyn_handle();
			} else {
				document.getElementById("ObjectsContainer").innerHTML = "";
				document.getElementById("num").innerHTML = "Er zijn geen objecten gevonden.";
			}
		}
	};
 		
	xml_obj.open("GET", "huizen/dynAanbod.asp?search="+this.dyn_str.value,true);	
	
	xml_obj.send(null);
	//alert('HTTP status: '+ xml_obj.status); 
}

/*
 * Filter_update(e,type) update de lijst met zoek criteria
 */
function Filter_update(e, type) {
	if( type == "plaats" ) { 
		ToggleArrayItems( e, dyn_list_plaats ); 
	} else if( type == "provincies" ) {	
		ToggleArrayItems( e, dyn_list_provincies ); 
	} else if( type == "type" ) {	
		ToggleArrayItems( e, dyn_list_types ); 
	} else if( type == "prijs" ) { 
		ToggleArrayItems( e, dyn_list_prijzen ); 
	} else if( type == "perceelopp" ) { 
		ToggleArrayItems( e, dyn_list_perceelopp ); 
	} else if( type == "woonopp" ) { 
		ToggleArrayItems( e, dyn_list_woonopp ); 
	} else if( type == "kamers" ) { 
		ToggleArrayItems( e, dyn_list_kamers ); 
	} else if( type == "page" ) { 
		dyn_pagenum = e.title; 
	} else if( type == "sort" ) { 
		dyn_sort = e.value; 
	} else if( type == "openhuis" ) { 
		dyn_openhuis = e; 
	}
	
	// Done...

 	search_str = dyn_list_plaats.join(";")
  	search_str += "~" + dyn_list_types.join(";") + "~" + dyn_list_prijzen.join(";")+ "~" + dyn_list_perceelopp.join(";")+ "~" + dyn_list_woonopp.join(";")+ "~" + dyn_list_kamers.join(";");
	
	if( dyn_pagenum > 0 )
		search_str += "&pageNum="+dyn_pagenum;
		
	if( dyn_sort != null )
		search_str += "&sort="+dyn_sort;
	else {
		if( gr_objExists(document.getElementById("sort_order") ) ) {	
			search_str += "&sort="+document.getElementById("sort_order").value;
		} else {
			search_str += "&sort=Asc~Prijs";
		}
	}
		
	if( gr_objExists(document.getElementById("filter_prefilter") ) ) {
		search_str += "&prefilter="+document.getElementById("filter_prefilter").value;
	}

	if( gr_objExists(document.getElementById("zoekterm") ) ) {
		if( document.getElementById("zoekterm").validated) {
			search_str += "&zoekterm="+document.getElementById("zoekterm").value;
		} else if( dyn_zoekterm != null ) {
			search_str += "&zoekterm="+dyn_zoekterm;
			document.getElementById("zoekterm").value = dyn_zoekterm;
		}
	}

	if( gr_objExists(document.getElementById("adres") ) ) {
		if(document.getElementById("adres").validated) {
			search_str += "&adres="+document.getElementById("adres").value;
		} else if( dyn_adres != null ) {
			search_str += "&adres="+dyn_adres;
			document.getElementById("adres").value = dyn_adres;
		}
	}

	if( gr_objExists(document.getElementById("postcode") ) ) {
		if(document.getElementById("postcode").validated) {
			search_str += "&postcode="+document.getElementById("postcode").value;
		} else if( dyn_postcode != null ) {
			search_str += "&postcode="+dyn_postcode;
			document.getElementById("postcode").value = dyn_postcode;
		}
	}

	if( dyn_openhuis != null && dyn_openhuis.checked == true) {
		search_str += "&openhuis="+dyn_openhuis.checked;
	}

	//debug - search string	(select items + prefilters)
	//alert( search_str );
	document.getElementById("filter_search").value = search_str;

	// Hacky, voor pagina`s
	if( type == "page" ) {
	
	
		if( document.getElementById("GoogleContainer").style.display != "none" ) {
			toggleSmartGMap('lijst', 'li_lijst', 'li_kaart');
		}
	
	 

		Dyn_request();
		Dyn_write();
	}	
}

/*
 * Filter_clear(e, type) leegmaken.
 */
function Filter_clear(e, type) {
	if( type == "plaats" ) {
		dyn_list_plaats = [];
	} else if( type == "provincies" ) {
		dyn_list_provincies = [];
	} else if( type == "type" ) {
		dyn_list_types = [];
	} else if( type == "prijs" ) {
		dyn_list_prijzen = [];
	} else if( type == "perceelopp" ) {
		dyn_list_perceelopp = [];
	} else if( type == "woonopp" ) {
		dyn_list_woonopp = [];
	} else if( type == "kamers" ) {
		dyn_list_kamers = [];
	} 
	
	if( e.parentNode.tagName.toLowerCase() == "ul" ) {
		options = e.parentNode.getElementsByTagName("li");
		for(var o=0,l=options.length;o<l;++o) {
			option = options[o];
			if( option != e ) option.className = "filter_norm";
		}
	}
	
	// Updaten
	Filter_update(e, "");
}

/*
 * Filter_adv_search(e) Toggle advanced search methodes
 */
function Filter_adv_search(e) {
	// Toggle advanced search methodes
	adv_search = document.getElementById("attrSearchContainer");
	
	if(adv_search.style.display == "block" ) {
		adv_search.style.display="none";
		e.className = "Extensive";
	} else {
		adv_search.style.display="block";
		e.className = "Deducted";
	}
}

/*
 * Dyn_handle() update de elementen met de juist info
 */
function Dyn_handle() {
	var elementCount = 0;
	var pageNav;

	var list = document.getElementById("ObjectsContainer").getElementsByTagName("ul");
	for (var l =0; l < list.length; ++l) {
		if (list[l].className == "ssPageNav")
			pageNav = list[l];		
		else 
			continue;	
	}

	document.getElementById("pageNav").innerHTML = "";
	document.getElementById("pageNavBottom").innerHTML = "";
	
	// Pagina navigatie kopieeren.
	if( gr_objExists(pageNav) ) {
		document.getElementById("pageNav").appendChild(pageNav);
		document.getElementById("pageNavBottom").innerHTML = document.getElementById("pageNav").innerHTML;
	}
		
	// Aantal gevonden objecten ophalen.
	if( gr_objExists( document.getElementById("elementCount") ) ) {
		elementCount = document.getElementById("elementCount").value;
	}
	
	// Alleen uitvoeren als er meerdere elementen gevonden worden.
	if( elementCount > 0 ) {
		setTimeout('myGR_Tooltip._setup()', 100);
		setTimeout('grSmartFav.set_items()', 100);
	}
	
	Dyn_title( elementCount, {0:"Er zijn geen objecten gevonden.", 1:"Er is [num] object gevonden.", 2:"Er zijn [num] objecten gevonden."} );
	  

}

/*
 * Dyn_title(count,titles) update de title met de juist counter
 */
function Dyn_title( count, titles ) {
	var new_title = "";
		
	if( titles.length<2 ) return;
		
	if( count == 0 ) new_title = titles[0];
	else if( count == 1 ) new_title = titles[1];
	else new_title = titles[2];

	document.getElementById( "num" ).innerHTML = (new_title.indexOf("[num]")!=-1) ? new_title.replace("[num]", count ) : new_title;
}

/*
 * Filter_validate(id,type) validatie van input velden
 */
function Filter_validate(e, type) {
	if (e.value == "" ) {
		e.className = "validator_valid";
		return true;		
	} else {
		if( type == "postcode" ) {
			tmpStr = new String( e.value );
			if( !tmpStr.match( /^[1-9]{1}\d{3}\s?[a-zA-Z]{2}$/ ) ) {
				e.className = "validator_invalid";
				return false;
			}
			
			e.validated = true;
			e.className = "validator_valid";
			return true;
		
		}
		else {
			tmpStr = new String( e.value );
			if( !tmpStr.match( /^[a-zA-Z0-9-\s]{1,}$/ ) ) {
				e.className = "validator_invalid";
				return false;
			}
    	
			e.validated = true;
			e.className = "validator_valid";
			return true;
		}	
	}	
}	

/*
 *Dyn_write() wegschrijven van search string voor 5min.
 */
function Dyn_write() {
	var filter_search = document.getElementById("filter_search").value;
	setCookieMin( glbSearchCookieName, escape(filter_search), 5 );
}

/*
 * Dyn_load(), leest een cookie in onload voor het ophalen van search string
 */
function Dyn_load() {

	// Inlezen van string in cookie
	var tmpStr = getCookie(glbSearchCookieName);

	// Omzetten van string naar splitsbare string
	var tmpStr = unescape(tmpStr);

	if( gr_objExists( document.getElementById("filter_selectfirst")) )
		var dyn_selectfirst = document.getElementById("filter_selectfirst").value;

	if ( gr_objExists(tmpStr) ) {

		// Inlezen van gebleven prefilter vanuit html
		if( gr_objExists( document.getElementById("filter_prefilter")) )
			var htmlPre = document.getElementById("filter_prefilter").value;

		// Inlezen van gebleven prefilter vanuit string
		if( pos = tmpStr.search(/prefilter/g ) )
			var strPre = GetItemsSearchStr( "prefilter", tmpStr, pos )	

		// Vergelijk of prefilter van de pagina overeen komen met cookie
		if (htmlPre != strPre && dyn_selectfirst == null) {
			removeCookie( glbSearchCookieName );
			return;
		} else if (htmlPre != strPre && dyn_selectfirst != null) {
			removeCookie( glbSearchCookieName );
		} 
	
		// Inlezen van gebleven pagina nummer vanuit string
		if( ( pos = tmpStr.search(/pageNum/g ) ) !== -1 )
			dyn_pagenum = GetItemsSearchStr( "pageNum", tmpStr, pos )	

		// Inlezen van zoekter vanuit string
		if( ( pos = tmpStr.search(/zoekterm/g) ) !== -1 )
			dyn_zoekterm = GetItemsSearchStr( "zoekterm", tmpStr, pos )	

		// Inlezen van adres vanuit string
		if( ( pos = tmpStr.search(/adres/g) ) !== -1 )
			dyn_adres = GetItemsSearchStr( "adres", tmpStr, pos )	

		// Inlezen van postcode vanuit string
		if( ( pos = tmpStr.search(/postcode/g) ) !== -1)
			dyn_postcode = GetItemsSearchStr( "postcode", tmpStr, pos )

		var tmp = [];
		var items = [];
		var list = document.getElementsByTagName("li");
	
		if( ( pos = tmpStr.indexOf("&") ) !== -1 )
			tmp = tmpStr.substring(0, pos).split( "~" );
	
		for( var i=0; i<tmp.length; ++i ) {
 			if(i==0 && gr_objExists(tmp[i]))
				tmp[i].arrayAdd( ";", dyn_list_plaats );
  			if(i==1 && gr_objExists(tmp[i]))
				tmp[i].arrayAdd( ";", dyn_list_types );
			if(i==2 && gr_objExists(tmp[i]))
				tmp[i].arrayAdd( ";", dyn_list_prijzen );
			if(i==3 && gr_objExists(tmp[i]))
				tmp[i].arrayAdd( ";", dyn_list_perceelopp );
			if(i==4 && gr_objExists(tmp[i]))
				tmp[i].arrayAdd( ";", dyn_list_woonopp );
			if(i==5 && gr_objExists(tmp[i]))
				tmp[i].arrayAdd( ";", dyn_list_kamers );
	
			items = tmp[i].split( ";" );	
			for ( var k=0; k<items.length; ++k ) {
				for(x in list) {
					if(list[x].title == "") continue;
					
					if (items[k] == list[x].title)	
						list[x].className = "filter_sel";
				}		
			}	
		}	
	
		if( gr_objExists(dyn_list_perceelopp[0]) || gr_objExists(dyn_list_woonopp[0]) || gr_objExists(dyn_list_kamers[0]) )
			Filter_adv_search(document.getElementById("ExtensiveSearch"));
	
	} else if( !gr_objExists(tmpStr) && dyn_selectfirst != "1") 
		return;
		
	// Updaten
	Filter_update(null, "");
	Dyn_request();
}	

if (window.addEventListener) {
	window.addEventListener( "load", Dyn_load, false );
} else if( window.attachEvent ) {
	window.attachEvent( "onload", Dyn_load );
} else {
	window.onload = function() { Dyn_load(); }
}

  function toggleSmartGMap( Id, On, Off ) {
	var mgmMarkerIDs;
	var container = { objects:null, maps:null };
	var tabs = { on:null, off:null };
	
	try {
		mgmMarkerIDs = document.getElementById("mgmMarkerIDs");
	} catch(e) {
		mgmMarkerIDs = null;
	}
	
	// Bestaat het element niet?
	if( mgmMarkerIDs == null ) {
		if( typeof Shadowbox != "undefined" ) {
			Shadowbox.open( { content: "<div id=\"ssDialog\">Er is geen selectie gemaakt.</div>", player:"html", title:"Googlemaps", height:100, width:300 } );
		}
		
		return;
	}
	
	try {
		container.objects = document.getElementById( "ObjectsContainer" );
		container.maps = document.getElementById( "GoogleContainer" );
	} catch(e) {
		container.objects = null;
		container.maps = null;
	}
	
	// Containers bestaat?
	if( container.objects == null || container.maps == null ) return;
	
	try {
		tabs.on = document.getElementById( On );
		tabs.off = document.getElementById( Off );
	} catch(e) {
		tabs.on = null;
		tabs.off = null;
	}
	
	if( tabs.on == null || tabs.off == null || tabs.on.className == "TabOn" ) return;
	
	tabs.on.className = "TabOn";
	tabs.off.className = "TabOff";

 	if( container.maps.style.display == 'none' ) {
		container.maps.style.display = "block";
		container.objects.style.display = "none";
		
		// Update onze maps
		smartMaps.update();
	} else {
		container.maps.style.display = "none";
		container.objects.style.display = "block";
	}
   
};

