/**
 * JS für Suche
 * 
 * @author	Jens Gabrikowski <gabrikowski@silpion.de>
 * @version	
 * 
 */

//var RESULT_LIMIT = 800; muss dynamisch auf den aktuellen config Wert gesetzt werden

var options = {
    target:       '#search_hits',
    beforeSubmit: beforeSubmitHandler,
    success:      searchresultcallback,
    type:         'post',
    url:          '/expose/search/numofresults/?random=' + Math.floor((Math.random()*1000))
};

// Stadt, Ort vars
var reqCnt 			= 0;
var advs_state		= 0;
//var advs_surl 		= '/geodata/ajax/completezcqservice/';
var advs_surl 		= '/index.php?ajaxAction=completezcqservice&random=' + Math.floor((Math.random()*1000));
var advs_query		= '';
var advs_sresult	= {};
var advs_TimerId 	= 0;
var advs_KeyUpDelay = 500;
var advs_limit 		= 15;
var advs_limit_total= 1000;
var advs_hasFullResult = false;
var advs_querySeq	= 1;
var advs_data		= [];
var advs_filteredResultData = [];
var advs_EmptyInput = true;

// Strasse vars
var advstr_surl 		= '/index.php?ajaxAction=completestrservice&random=' + Math.floor((Math.random()*1000));
//var advstr_surl 		= '/geodata/ajax/completestrservice/';
var advstr_data		= [];


$(document).ready(function() 
{
	$('#streetClickLayer').bind('click', function() {
		$("#disabled_street").dialog('open');
	});
	
	$('#radiusClickLayer').bind('click', function() {
		$("#disabled_ambit").dialog('open');
	});
	
	$('#numberClickLayer').bind('click', function() {
		$("#disabled_number").dialog('open');
	});
	
	$('#disabled_street_dialog_complete_data').bind('click', function() {
		$("#disabled_street").dialog('close');
		$("#advSearchText").focus();
	});
	
	$('#disabled_ambit_dialog_complete_data').bind('click', function() {
		$("#disabled_ambit").dialog('close');
	});
	
	$('#disabled_number_dialog_complete_data').bind('click', function() {
		$("#disabled_number").dialog('close');
	});
	
	
	$(document).keyup(function(e) {
		if (e.keyCode == 27 && $('.advSearchBackLayer').css('display') != 'none' ) { 
			if(!$('div#advsResultContainer').hasClass('invisible')) {
	    		$('div#advsResultContainer').addClass('invisible');
	    	}
			$('#advSearchText').val('')	;
			$('.advSearchBackLayer').hide();
			$('#zimmer_min, #zimmer_max, #radius').show();
		}
	});
	
	
	$('.advSearchBackLayer').bind('click', function() {
		if(!$('div#advsResultContainer').hasClass('invisible')) {
    		$('div#advsResultContainer').addClass('invisible');
    	}
		$('#street').attr("disabled", "diabled"); 
		$('#street').css("background-color","#E5E6E7");
		$('#advSearchText').val('')	;
		$('.advSearchBackLayer').hide();
		$('#zimmer_min, #zimmer_max, #radius').show();
	});
	
	$('#doSearch').bind('click', noResultsDialogSubmitHandler);
	
	$('#noResults_dialog_complete_data').bind('click', function() {
		$('#noResults').dialog('close');
	});
	
	disableRadiusSearch();
	$('#number').attr("disabled", "diabled"); 
	$('#number').css("background-color","#E5E6E7");
	$('#street').attr("disabled", "diabled"); 
	$('#street').css("background-color","#E5E6E7");
	
	$('#btnOk').click(function() {
		advsSubmitSelectionHandler();
	});
	$('#advsResultActionsShowAll').hide();
	$('#advsResultActionsShowAll').click(function(){
			advsDoSearch(advs_limit_total, advs_limit_total, 'cityName', true);
    });
    
    $('#searchform').submit(function() {
        $('#advs_sresult').val($.toJSON(advs_sresult));
        $('#searchform .emptyonsubmit').val('');
        return true;
    });

    $('#searchform input:text').advancedInput({
        'modifiedClass': 'modified',
        'unmodifiedClass' : 'emptyonsubmit'
    });

    $('#zimmer_min, #zimmer_max').change(function (evt) {
        $(evt.target).removeClass('emptyonsubmit');
    });


    // Bundesland Select Listener
    $('select#state_select').bind('change', function(e) {

    	// Formular zuruecksetzen
    	$('#searchform').resetForm();
    	$('#searchform input:text').addClass('emptyonsubmit').removeClass('modified');
    	
    	advs_state = $(this).val();
    	advs_sresult = {};
    	// TODO: HIer sollte besser wieder der hint erscheinen
    	$('#advSearchText').val('');

    	if(!$('div#advsResultContainer').hasClass('invisible')) {
    		$('div#advsResultContainer').addClass('invisible');
    	}
    	$('div#advsResultOffers').empty();
    	
    	
    	// STrasse leeren
//    	$('#advs_sresult').val($.toJSON(advs_sresult));
//    	$('#advstr_sresult').val($.toJSON({}));

    	
    	// strassen suche deaktivieren
    	//advstrDoSearch();

    	// Umkreissuche verbieten
    	disableRadiusSearch();


    	if($("#state_select").val() != '#'){
        	$('.search_container_right_bg input, .search_container_right_bg select').removeAttr("disabled");
        	$('#disableMask').hide();
        }else{
        	$('.search_container_right_bg input, .search_container_right_bg select').attr("disabled", "diabled");
        	$('#disableMask').show();
       	}
    });

    // Stadt, Ort Listener
    $('#advSearchText').bind('focus', function(e) {
    	advs_EmptyInput = true;
    	advs_sresult = {};
    	$('#advSearchText').val('')	;
    	$('#doSearch').bind('click', noResultsDialogSubmitHandler);
    	$("#doSearch").removeClass('submit_form_orange');
		$("#doSearch").addClass('submit_form');
		$("#search_hits").html('0');
		triggerResultCountHandler('disable');
    	$('div#advsResultContainer').addClass('invisible');
    	disableRadiusSearch();
    	$('#number').attr("disabled", "diabled");
    	$('#number').css("background-color","#E5E6E7");
    	$('#radius').attr("disabled", "diabled");
    	$('#radius').css("background-color","#E5E6E7");
    	$('#street').attr("disabled", "diabled");
    	$('#street').css("background-color","#E5E6E7");
    	$('#street').val('')	;
    });

    $('#advSearchText').bind('keyup', function(e) 
    {
    	if(e.keyCode == 27)
    		return;
    	
    	var searchValue = $(this).attr('value');
    	advs_query = $(this).val();
    	
    	if(searchValue.length == 0)
    	{
    		advs_EmptyInput = true;
    		$('div#advsResultContainer').addClass('invisible');
    		$('.advSearchBackLayer').hide();
    		$('#zimmer_min, #zimmer_max, #radius').show();
    		// remove sresult
    		advs_sresult = {};
    	}
    	else if(searchValue.length < 3)
    	{
    		advs_EmptyInput = false;
    		advsDoSearch(advs_limit, advs_limit, '', false);
    	}
    	// bei einer zeichenlaenge von 3 alle treffer vom server holen
    	else if(searchValue.length == 3 || advs_hasFullResult == false || advs_EmptyInput == true)
    	{
    		advs_EmptyInput = false;
    		advsDoSearch(advs_limit_total, advs_limit, '', true);
    	}
    	// bei einer zeichenlaenge ueber 3 alle treffer client-seitig filtern
    	else if(searchValue.length > 3)
    	{
    		advs_EmptyInput = false;
    		var tmp_filteredResultData = advsGetFilteredResultData(searchValue);
    		tmp_filteredResultData = advsGetOrderedResultData(tmp_filteredResultData);
    		//console.log(advs_filteredResultData.length + " / " + tmp_filteredResultData.length);
    		if(advs_filteredResultData.length != tmp_filteredResultData.length)
    		{
    			advs_filteredResultData = tmp_filteredResultData;
    			advsDisplayDistrictSelectBox(advs_filteredResultData, advs_limit);
    		}
    	}
    	
    }); 
    
    //Strassen autocomplete Listener
    $('#street').autocomplete( advstr_surl, {
    	width: 260,
    	highlight: false,
    	selectFirst: true,
    	minChars: 1,
    	mustMatch: true,
    	autoFill: true,
    	cacheLength: 20,
    	extraParams: {	s: function () {return advs_state; },
    					region: function () { return $.toJSON(advs_sresult); }
    	}					
    });
    $('#street').result( function (event, data, formatted) {
    	// data :: [0] => label, [1] => id, [2] => type
    	//alert(var_dump(data));
    	if (data) {
    		// eine valide auswahl in street
    		$('#advstr_sresult').val(data[2]+'_'+data[1]);
    		// Umkreissuche, Hausnummer zulassen
    		enableRadiusSearch();
    		$('#numberClickLayer').hide();
    		$('#number').removeAttr("disabled");
    		$('#number').css("background-color","#FFFFFF");
    	}else{
    		// Keine valide Auswahl in street
    		$('#advstr_sresult').val('');
    		// Umkreissuche, Hausnummer verbieten
    		disableRadiusSearch();
    		$('#number').val('');
    		$('#numberClickLayer').show();
    		$('#number').attr("disabled", "disabled");
    		$('#number').css("background-color","#E5E6E7");
    	}
    	$('#searchform').ajaxSubmit(options);
    });
    $('#street').click( function() {
    	$('#street').val('');
    	$('#advstr_sresult').val('');
    	disableRadiusSearch();
    	$('#number').val('');
    	$('#numberClickLayer').show();
    	$('#number').attr("disabled", "disabled");
    	$('#number').css("background-color","#E5E6E7");
    });
});


function triggerResultCountHandler(status) {
	// calculate result count on form changes
	var debug = status;
    $('#searchform :input').each( function() 
    {
    	if($(this).attr('name') != '' && $(this).attr('name') != 'advSearchText' && $(this).attr('name') != 'street' && $(this).attr('name') != 'flaeche_min' && $(this).attr('name') != 'flaeche_max' && $(this).attr('name') != 'kaltmiete_min' && $(this).attr('name') != 'kaltmiete_max' && $(this).attr('name') != 'number' && $(this).attr('name') != 'doSearch')
    	{
    		debug += ".";
    		if(status == 'enable')
    			$(this).bind('click', enableResultCountHandler)
    		else
    			$(this).unbind('click', enableResultCountHandler);
    	}
    	else if($(this).attr('name') == 'flaeche_min' || $(this).attr('name') != 'flaeche_max' || $(this).attr('name') != 'kaltmiete_min' || $(this).attr('name') != 'kaltmiete_max' || $(this).attr('name') != 'number')
    	{
    		debug += ".";
    		if(status == 'enable')
    			$(this).bind('change', enableResultCountHandler)
    		else
    			$(this).unbind('change', enableResultCountHandler);
    	}
    });
    //console.log(debug);
}

function enableResultCountHandler() {
	$('#searchform').ajaxSubmit(options);
}

function beforeSubmitHandler(formData, jqForm, options) {

    // beschreibende Textinhalte entfernen
 	jQuery.each(jqForm[0], function(i, elem) {
		if ($(elem).hasClass('emptyonsubmit')) {
			jQuery.each(formData, function(j, param) {
				if ($(elem).attr('name')==param['name']) {
					param['value'] = '';
				}
			});
		}
 	});
 	
 	if($("#street").val() != "" && parseInt($("#radius").val()) > 0)
 		$("#doRadiusSearch").val("true");

 	$('#advs_sresult').val($.toJSON(advs_sresult));

	return true;
} 

// Submit Button Changer
function decorateSubmitButton(state, searchResultCount)
{
	switch (state)
	{
		case 'doSearch':
			$("#doSearch").unbind('click', noResultsDialogSubmitHandler);
			$("#doSearch").unbind('click', saveAgentDialogSubmitHandler);
			$('#doSearch').val(FORM_BUTTON_SHOW_HITS);
			$("#doSearch").addClass('submit_form_orange');
			$("#doSearch").removeClass('submit_form_agent');
			$("#doSearch").removeClass('submit_form');
			break;
			
		case 'saveAgent':
			$("#doSearch").unbind('click', noResultsDialogSubmitHandler);
			$('#doSearch').bind('click', saveAgentDialogSubmitHandler);
			$('#doSearch').val(FORM_BUTTON_SAVE_AGENT);
			$("#doSearch").addClass('submit_form_orange');
			$('#doSearch').addClass('submit_form');
			$('#doSearch').addClass('submit_form_agent');
			break;
		
		case 'noResult':
		default:
			$("#doSearch").unbind('click', saveAgentDialogSubmitHandler);
			$('#doSearch').bind('click', noResultsDialogSubmitHandler);
			$('#doSearch').val(FORM_BUTTON_SHOW_HITS);
			$("#doSearch").removeClass('submit_form_orange');
			$("#doSearch").removeClass('submit_form_agent');
			$("#doSearch").addClass('submit_form');
			break;
	}

	if (searchResultCount > RESULT_LIMIT) {	
		$('#search_hits').hide();
		$('#search_hits_limit').show();
	} else {
		$('#search_hits').show();
		$('#search_hits_limit').hide();			
	}
}

// result count handler
function searchresultcallback(responseText, statusText)
{
	// enable/disable modalDialog click event
	// and function and decoration of submit button
	var searchResultCount = parseInt(responseText);
	if(searchResultCount > 0) {
		// Show results
		decorateSubmitButton('doSearch', searchResultCount);
	
	} else if(searchResultCount == -1) { // User tried to search without city -> illegal search -> do not offer option to save
		// Suppress output
		$("#search_hits").html('0');
	} else {
		// Save Agent
		decorateSubmitButton('saveAgent');
	}
	
    if (reqCnt > 1) {
        reqCnt = 1;
        //$('#searchform').ajaxSubmit(options);        
    } else {
        reqCnt = 0;
    }
}

function noResultsDialogSubmitHandler()
{
	$('#noResults').dialog('open');
	return false;
}

// ----------------
// Suchagent
var ajaxAgentOptions = {
	    beforeSubmit: beforeSubmitHandler,
	    success:      ajaxAgentSuccessCallback,
	    dataType:	  'json',
	    url:          '/search/agent/save/?doSearch=doSearch'
	};		

function ajaxAgentSuccessCallback(data)
{
	if (data.searchagentmsg)
	{
		if (data.searchagentmsg.error)
		{	
			if (data.searchagentmsg.bNotLoggedIn) {
				window.location.href='/register/light';
			} else {
				$('#dSaveAgentError .ui-dialog-right-text').html(data.searchagentmsg.msg);
				$('#dSaveAgentError').dialog('open');
			}
			
		} else {
			//alert ('ok: '+data.searchagentmsg.msg);
			$('#dSaveAgentOk .ui-dialog-right-text').html(data.searchagentmsg.msg);
			$('#dSaveAgentOk').dialog('open');
		}
	}
}

function saveAgentDialogSubmitHandler()
{
	// Button should stay in agentmode. If the button should return to "no hits" enable next line
	// decorateSubmitButton('noResult'); 
	$('#searchform').ajaxSubmit(ajaxAgentOptions);
	// fillaftersubmit();	
	
	return false;
}

// Dialogbehandlung saveAgent
$("#dSaveAgentError .submit_form_big").click(function(){
    $("#dSaveAgentError").dialog('close');
    return false;
});

$("#dSaveAgentOk .submit_form_big").click(function(){
    $("#dSaveAgentOk").dialog('close');
    return false;
});	

//----------------


  



function advsDoSearch(serverLimit, displayLimit, orderBy, flagHasFullResult)
{	
	// Sequenz für diesen Request anlegen
	var seq = ++advs_querySeq;
	
	$.getJSON(advs_surl, {q: advs_query, s: advs_state, l:serverLimit, o:orderBy }, function(data) {
		// Daten nur übernehmen wenn es noch keinen neueren Request gibt.
		if (seq>=advs_querySeq){
			advs_data = data;
			// Wenn die Daten angekommen sind, können wir den Status der Daten flaggen
			advs_hasFullResult = flagHasFullResult;
			advsDisplayDistrictSelectBox(advsGetFilteredResultData($('#advSearchText').attr('value')), displayLimit);
			//advsDisplayDistrictSelectBox(data);
			if(data.length>0) {
				$('div#advsResultContainer').removeClass('invisible');
				$('.advSearchBackLayer').show();
				$('#street').removeAttr("disabled");
				$('#street').css("background-color","#FFFFFF");
				$('#street').val('');
			}
			else {
				$('#zimmer_min, #zimmer_max, #radius').show();
			}
		}
	});
}

function advsGetFilteredResultData(inputString)
{
	var data = new Array();
	var itemLabel = '';
	var foundInputSubString = true;

	if(inputString == "")
		return data;

	// inputStringArr fuer die suche vorbereiten
	regExArr = new Array();
	$.each(inputString.split(" "), function(i,inputSubString)
	{
		inputSubString = inputSubString.replace(/,/, "");
		regExArr.push(new RegExp(inputSubString,'i'));
	});
	
	if(advs_data.length > 0) 
	{
		for( i=0; i < advs_data.length; i++) 
		{
			foundInputSubString = true;
			// item {id, label, type, results}
			itemLabel = advs_data[i].label;
			for( j=0; j < regExArr.length; j++) 
			{
				if(itemLabel.search(regExArr[j]) == -1)
				{
					foundInputSubString = false;
					break;
				}
			}
			if(foundInputSubString == true)
				data.push(advs_data[i]);
		}
	}
	return data;
}

// return all ordered city results
function advsGetOrderedResultData(myData)
{
	var outputData = myData.copy();
	outputData.sort(advsSortCityLabelAscendingHandler);
	return outputData;
}

// extends array objects with an copy() function
Array.prototype.copy = function() 
{
    return this.slice(0, this.length);
}

function isNumeric(strString) {
	var strValidChars = "0123456789";
	var strChar;
	var blnResult = true;
	
	if (strString.length == 0) return false;
	
	//  test strString consists of valid characters listed above
	for (i = 0; i < strString.length && blnResult == true; i++) {
	   strChar = strString.charAt(i);
	   if (strValidChars.indexOf(strChar) == -1)
	      {
	      blnResult = false;
	      }
	   }
	return blnResult;
}


function var_dump(obj) {
	if(typeof obj == "object")
		return "Type: "+typeof(obj)+((obj.constructor) ? "\nConstructor: "+obj.constructor : "")+"\nValue: " + obj;
	else
		return "Type: "+typeof(obj)+"\nValue: "+obj;
}


function advsSortCityLabelAscendingHandler(thisObject,thatObject) 
{	
	if (thisObject.label > thatObject.label)
		return 1;
	else if (thisObject.label < thatObject.label)
		return -1;
	return 0;
}

function advsDisplayDistrictSelectBox(data, limit)
{
	var advs_result_cnt = 0;
	var html 			= '';
	
	
	
	//$('div#advsResultOffers').empty();

	$('#zimmer_min, #zimmer_max, #radius').hide();//bgiframe funktioniert hier leider nicht, weil die Länge nicht korrekt bestimmt wird $('#advsResultOffers').bgiframe(); // {top: -30, left: -40, height: 1000, width: 1000, opacity: false}

	if(data.length>0) 
	{
		if(data.length >= limit && $('#advSearchText').val().length >= 3 )
			$('#advsResultActionsShowAll').show();
		else
			$('#advsResultActionsShowAll').hide();
		if(limit == 0 || data.length < limit)
			limit = data.length;
		html += '<ul id="searchResult">';
		for( i=0; i < limit; i++) 
		{
			advs_result_cnt = (advs_result_cnt + parseInt(data[i].results));
			html += '<li><input class="advsCk" name="advsCk[]" id="advsCk_'+ data[i].type +'_'+ data[i].id +'" type="checkbox" value="'+ data[i].type +'_'+ data[i].id +'"/><p>'+ data[i].label +'</p>';
			html += '<p class="sCnt">('+ data[i].results + SEARCH_AUTOCPLT_HITS_LABEL +')</p></li>';
		}
		html += '</ul>';
		//html = '<div class="padding_top_0px"><div class="float_right">('+advs_result_cnt+' Angebote)</div></div>' + html;
						
		$('div#advsResultOffers').html(html);
	}
}

function advsSubmitSelectionHandler()
{
	// strasse loeschen
	$('#advstr_sresult').val('');
	$('#street').val('');
	
	$('.advSearchBackLayer').hide();
	$('#zimmer_min, #zimmer_max, #radius').show()
	$('#streetClickLayer').hide();
	
	//Weil bgiframe nicht funktioniert...
	//$('#zimmer_min, #zimmer_max').show();
	triggerResultCountHandler('enable');
	
	advs_sresult= {};
	var iter	= 0;
	var tmpLabel 	= '';
	var label 	= '';
	var bAtLeastOneSelected = false;
	$('div#advsResultOffers').find('li').each( function (index) 
	{
		chk = $(this).find('.advsCk');
		if (chk.attr('checked') == true )
		{
			tmpLabel = $(this).find('p').html();
			if(isNumeric(tmpLabel)) {
				advs_sresult["4ZI_" + tmpLabel]=1;
			} else {
				advs_sresult[chk.val()]=1;
			}
			label = label+ tmpLabel+' ;';
			bAtLeastOneSelected = true;
		}
	});
	
	$('div#advsResultContainer').addClass('invisible');

	label = label.substr(0,Math.min(80, label.length-1));
	$('#advSearchText').val(label);
	// Do not get count if user did not select anything
	if (!bAtLeastOneSelected) {
		return;
	}
	
	// Die Trefferzahl ermitteln und auf der Seite aktualisieren
	$('#advs_sresult').val($.toJSON(advs_sresult));
	$('#searchform').ajaxSubmit(options);
}

function enableRadiusSearch()
{
	if ( $('#street').val() != '')
	{
		$('#radiusClickLayer').hide();
		$('#radius').removeAttr("disabled");
    	$("#doRadiusSearch").val("true");
    	$('#radius').css("background-color","#FFFFFF");
	}
}

function disableRadiusSearch() 
{
	
	if ( $('#advstr_sresult').val() == '')
	{
		$('#radius').css("background-color","#E5E6E7");
		$('#radiusClickLayer').show();
		$('#radius').val('');
    	$('#radius').attr("disabled", "disabled");
    	$("#doRadiusSearch").val("false");
	}
}
// -----------------------------------------
// homeSearch von der Starseite
//-----------------------------------------
$(document).ready(function() 
{
	$('#homeSearch').bind('click', homeSearch_buttonClickHandler);
	
	$('#homesearchform').bind('submit', homeSearch_beforeSubmitHandler);
	
    $('#homesearchform input:text').advancedInput({
        'modifiedClass': 'modified',
        'unmodifiedClass' : 'emptyonsubmit'
    });
});

function homeSearch_buttonClickHandler ()
{
	// Testen ob eine Region gewählt wurde.
	var hasSelectedRegion = false;
	$('div#advsResultOffers').find('li').each( function (index) 
		{
			chk = $(this).find('.advsCk');
			hasSelectedRegion |= chk.attr('checked');
		});
	if (hasSelectedRegion) 
	{
		$('#homesearchform').submit();
	}else{
		// show modal dialog
		$("#noResults").dialog('open');
	}
}

function homeSearch_beforeSubmitHandler()
{
    $('#homesearchform .emptyonsubmit').val('');
    return true;	
}
