
var RefineResults = {
    /* XXX lots of hardcoded html(jquery) elements, should construct in some init method with "elements" array*/
    url: '/search',
    format: 'html',
    fields: {},
    propertyTypes: [],
    exactStaySliderValues: [],
    exactStaySliderLabelNames: [],
    arrivalDates: [],
    departureDates: [],
    mapSearch: false,
    callback: null,
    currentRequest: null,

    abort: function () {
        if (this.currentRequest != null) {
            this.currentRequest.abort ();
            this.currentRequest = null;
        }
    },

    collectSliderValues: function() {
        $(".sliderbody").each(function(){
            var id = $(this).attr('id');
            var refineParam = id.substr(0, id.indexOf('-') );
            var paramMin = $('#' + id + '-min').val();
            var paramLeft = parseInt($('#' + id + '-left').val(), 10);

            if ("stay-slider-strict" == id) {
                RefineResults.fields['stay'] = ( paramMin != paramLeft ||  paramMax != paramRight ) ? parseInt($('#' + id + '-left').val(), 10) : null;
                return;
            }

            paramMin = $('#' + id + '-min').val();
            paramLeft = parseInt($('#' + id + '-left').val(), 10);

            var paramMax = $('#' + id + '-max').val();
            var paramRight = parseInt($('#' + id + '-right').val(), 10);

            RefineResults.fields[refineParam + 'Min'] = ( paramMin != paramLeft ||  paramMax != paramRight ) ? parseInt($('#' + id + '-left').val(), 10) : null;
            RefineResults.fields[refineParam + 'Max'] = ( paramMin != paramLeft ||  paramMax != paramRight ) ? parseInt($('#' + id + '-right').val(), 10) : null;
        })
    },

    renew: function () {
        RefineResults.collectSliderValues();
        var data = RefineResults.collectData();

        this.abort ();
        globalLoader.setMessage(lang('Loading')+'...').show();

		this.currentRequest = $.post( this.url, data, function (data, status) {
			if (status == 'success') {

				// MBN and JR PART
				if(typeof map != "undefined") {
					map.clearOverlays();
					
					if (markerCluster)
						markerCluster.clearMarkers();
						
					var index = 1;					
					_bounds = new GLatLngBounds();

					var markers = [];
					$(data.points).each(function(k, v) {
					
						var o = $(v)
						if (typeof o == "object") {
							var point = new GLatLng(o.attr('lat'), o.attr('lng'));
							_bounds.extend(point);
							var marker = addSearchMarker(o.attr('lat'), o.attr('lng'),
									index,
									tinyPropertyBlock(
										{
											"id":o.attr('id'),
											"title":o.attr('title'),
											"lat":o.attr('lat'),
											"lng":o.attr('lng'),
											"sleeps":o.attr('sleeps'),
											"bathrooms":o.attr('bathrooms'),
											"bedrooms":o.attr('bedrooms'),
											"price_min":o.attr('price_min'),
											"price_max":o.attr('price_max'),
											"rating_round":o.attr('ratings_round'),
											"rating":o.attr('rating'),
											"image":o.attr('image'),
											"url":o.attr('url')
										} , ' kr'),
										{ "image":o.attr('image') }
									);
							markers.push(marker);
							index++;
						}
					});
					markerCluster = new MarkerClusterer(map, markers);					
					
					//map.setZoom( map.getBoundsZoomLevel( _bounds ) );
					map.panTo( _bounds.getCenter() );
					
				}
				// MBN and JR PART
				
				$('#list-tab').html (data.html);
				$('#propertiesCount').html (data.resultsCount);
				// Update number of properties in headline
				$('#headlinecount').html (data.resultsCount);
				// Update number of properties in <title>
				var title = document.title.substring( document.title.indexOf( ' ' ), document.title.length );
				document.title = data.resultsCount + " " + title;
				/* XXX property types is a part of controls, should update in setControlValues method*/
				$('#propertyTypeHolder').html (data.propertyTypes);
				if('function' == typeof RefineResults.callback){
					RefineResults.callback (data.points);
				}
				RefineResults.setControlValues(data.filters);
				this.currentRequest = null;
			}
			
			globalLoader.hide();
			favouriteProperties.markFavedLinks();
			favouriteProperties.addTooltips();
		}, 'json');
    },

    collectData: function () {
        var data = {};

        for( var id in this.fields ) {
            var field = this.fields[id];
            if ( null != field) {
                data[id] = field;
            }
        }

        for (i = 0; i < this.propertyTypes.length; i++) {
            data['p_t['+i+']'] = this.propertyTypes[i];
        }
        globalLoader.hide();
        return data;
    },

    collectPropertyTypes: function (obj, objArray) {
        if ($(obj).attr('checked')) {
            this.propertyTypes.push($(obj).val ());
        }
        else {
            var tmpArray = [];
            var removeVal = $(obj).val ();
            var checkboxes = $(objArray);
            for (i = 0; i < checkboxes.length; i++) {
                var currentCheckbox = $(checkboxes).eq(i);
                if (currentCheckbox.val() == removeVal || false == currentCheckbox.attr('checked')) continue;
                tmpArray.push ($(checkboxes).eq(i).val());
            }
            this.propertyTypes = tmpArray;
        }
        this.renew ();
    },

    setControlValues: function ( filters ) {
        /* setting up all checkboxes, inputs, radio buttons here*/
        if(typeof filters == 'undefined' || 0 == filters.length){
            return;
        };

        /* here setting common search controls */

        /* end here setting common search controls */

        /* is it exact search? */
        if ( typeof this.fields.is_exact_search == 'undefined' || null == this.fields.is_exact_search || 0 == this.fields.is_exact_search) {
            return;
        };

        RefineResults.setDurations( filters.durations );
        RefineResults.setArrivalDates( filters.arrivals );
        RefineResults.setDepartureDates( filters.departures );

    },

    setDurations:function ( durations ) {
        if(typeof durations == 'undefined' || 0 == durations.length || 0 == $("#stay-slider-strict").length){
            return;
        };

        /* change values and label arrays */
        RefineResults.exactStaySliderValues = durations.values;
        RefineResults.exactStaySliderLabelNames = durations.labels;

        /* set new max for slider, min is always 0*/
        var max  = durations.values.length - 1;
        $( "#stay-slider-strict" ).slider( "option", "max", max );

    },

    setArrivalDates:function ( arrivals ) {
        if(typeof arrivals == 'undefined' || 0 == arrivals.length || 0 == $("#start_visible").length){
            return;
        };

        RefineResults.arrivalDates = arrivals;

    },

    setDepartureDates:function ( departures ) {
        if(typeof departures == 'undefined' || 0 == departures.length || 0 == $("#finish_visible").length){
            return;
        };

        RefineResults.departureDates = departures;

    },

    beforeShowFinishDay: function(date, inst){
        var d = $.datepicker.formatDate('yy-mm-dd', date);
        if(d == $('#start').val()){
            return [ true, 'ui-arrival-selected'];
        }
        return [true];
    },

    doHiglightPeriod: function(el){
        el = $(el);
        //unhover previos
         $('.ui-datepicker-calendar td', '#ui-datepicker-div').removeClass('ui-hovered');
        //hover
        var fromIdx = $('.ui-datepicker-calendar td', '#ui-datepicker-div').index($('.ui-arrival-selected', '#ui-datepicker-div'));
        var toIdx =   $('.ui-datepicker-calendar td', '#ui-datepicker-div').index(el);
        if(fromIdx == -1 ){
            return;
            //fromIdx = 0;
        }
        var duration = toIdx - fromIdx;
        if(duration > 0){
            $('.ui-datepicker-calendar td:gt('+fromIdx+')', '#ui-datepicker-div').filter(':lt('+duration+')').addClass('ui-hovered');
        }
    },

    addPeriodHover:function(){
        $('.ui-datepicker-calendar td', '#ui-datepicker-div').live('mouseover', function(){
             RefineResults.doHiglightPeriod($(this));
        });
    },

    init: function(){
        if($.trim($('#start').val()).length > 0){
            $("#finish_visible")
                .datepicker("option", "beforeShowDay", RefineResults.beforeShowFinishDay)
                .datepicker("option", "beforeShow", RefineResults.addPeriodHover);
        }
    }
};

