﻿//pager
function jsPagerGeneratePager(currentPage, totalPages, prevNextCount, userFunction) {

    var outputHtml = '';
    currentPage = Number(currentPage);
    totalPages = Number(totalPages);
    prevNextCount = Number(prevNextCount);
    var userFunctionTemplate = userFunction + '({9})';
    var selectedItemWithFunction = jsPagerSelectedItemTemplate.replace('{1}', userFunctionTemplate);
    var unselectedItemWithFunction = jsPagerUnselectedItemTemplate.replace('{1}', userFunctionTemplate);
    if (totalPages <= 1)
        return outputHtml;
    outputHtml += jsPagerBeforeText;
    if (currentPage > 1)
        outputHtml += jsPagerPreviousTemplate.replace('{0}', userFunctionTemplate.replace('{9}', currentPage - 1));
    outputHtml += jsPagerSeparatorTemplate;

    outputHtml += '<span class="' + jsPagerPagesContainerCssClass + '">';

    if (currentPage == 1)
        outputHtml += jsPagerSelectedItemTemplate.replace('{0}', '1');
    else
        outputHtml += jsPagerUnselectedItemTemplate.replace('{0}', '1').replace('{1}', userFunctionTemplate.replace('{9}', '1'));
    //dodajemy kropki z przodu
    if (currentPage > prevNextCount + 2)
        outputHtml += jsPagerSeparatorTemplate + jsPagerDotsTemplate + jsPagerSeparatorTemplate;
    else
        outputHtml += jsPagerSeparatorTemplate;
    var startIndex = currentPage - prevNextCount <= 1 ? 2 : currentPage - prevNextCount;
    var endIndex = currentPage + prevNextCount >= totalPages ? totalPages - 1 : currentPage + prevNextCount;
    var useSeparator = false;


    for (var i = startIndex; i <= endIndex; i++) {
        if (currentPage == i)
            outputHtml += jsPagerSelectedItemTemplate.replace('{0}', String(i)).replace('{1}', '');
        else
            outputHtml += jsPagerUnselectedItemTemplate.replace('{0}', String(i)).replace('{1}', userFunctionTemplate.replace('{9}', i));
        if (i < endIndex)
            outputHtml += jsPagerSeparatorTemplate;
        useSeparator = true;
    }

    if (currentPage < totalPages - prevNextCount - 1)
        outputHtml += jsPagerSeparatorTemplate + jsPagerDotsTemplate + jsPagerSeparatorTemplate;
    else if (useSeparator)
        outputHtml += jsPagerSeparatorTemplate;
    if (currentPage == totalPages)
        outputHtml += jsPagerSelectedItemTemplate.replace('{0}', String(totalPages)).replace('{1}', '');
    else
        outputHtml += jsPagerUnselectedItemTemplate.replace('{0}', String(totalPages)).replace('{1}', userFunctionTemplate.replace('{9}', totalPages));
    outputHtml += jsPagerSeparatorTemplate
    outputHtml += '</span>';
    if (currentPage < totalPages)
        outputHtml += jsPagerNextTemplate.replace('{0}', userFunctionTemplate.replace('{9}', currentPage + 1));
    return outputHtml;
}
//*
String.format = function() {
    var s = arguments[0];
    for (var i = 0; i < arguments.length - 1; i++) {
        var reg = new RegExp("\\{" + i + "\\}", "gm");
        s = s.replace(reg, arguments[i + 1]);
    }
    return s;
}

// do wyszukiwania z menu kontekstowego
var contextmenu;
var clickedPosition;
var crossMarker = null;

// do wyszukiwania trasy złożonych z n odcinków,
// gdy wystąpił błąd podczas wyszukiwania po nazwach
var waypointsIndex = 0;
var waypointsTable;
var waypointsGeo = new GClientGeocoder();

var markersToChoose;

function checkLocationsAndLoad(response){
	if (!response || response.Status.code != 200) {
		SearchGasStation._noResults();
	}
    else {   	
    	if (response.Placemark.length == 1) {
    		waypointsTable[waypointsIndex] = 
    			new GLatLng(response.Placemark[0].Point.coordinates[1],response.Placemark[0].Point.coordinates[0]);
    		waypointsIndex++;
    		if (waypointsIndex < waypointsTable.length) { 
    			waypointsGeo.getLocations(waypointsTable[waypointsIndex],checkLocationsAndLoad); 
			}
			else SearchGasStation.LoadFromWaypoints();
    	}
    	else {
    	
			SearchGasStation.CenterMap();
      			
   			var slctChoosePlaceOptions = '';
   			var slctOption = "<option value='{0}'>{1}</option>";		      			
		      			
			markersToChoose = [];
      			
      		for (var i=0;i<response.Placemark.length && i<9;i++){
      			var iconImageSrc = String.format(SearchGasStation._params.choosePlaceIconSrc,i+1);
			      					        			
	        	var place = response.Placemark[i];
				        	        					        			
				var point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
      			var _icon = new GIcon(G_DEFAULT_ICON);			      			
       			_icon.image = iconImageSrc;
       			_icon.iconSize = new GSize(24, 38);
		        			
			    var mark = new GMarker(point, { icon:_icon} );
			    mark.locationAddress = place.address;
			    mark.locationCoordinates = place.Point.coordinates[1]+'|'+place.Point.coordinates[0];
						    						    
       			GEvent.addListener(mark, "click", function() {
	                this.openInfoWindowHtml(this.locationAddress);
	                jQuery('#slctChoosePlace'+waypointsIndex+' option[value="'+this.locationCoordinates+'"]').attr("selected","selected");
	            });
    			SearchGasStation._map.addOverlay(mark);
    			markersToChoose[i] = mark;
    			
    			slctChoosePlaceOptions += 
	  				String.format(slctOption,
    					place.Point.coordinates[1]+'|'+place.Point.coordinates[0],
    					place.address);
   			}
   			
			jQuery('#' + SearchGasStation._params.chooseLocationId).show();
   			
    		if (waypointsIndex == 0) {
    			jQuery('#' + SearchGasStation._params.txtFromId).hide();
	    		jQuery('#' + SearchGasStation._params.divChoosePlaceFromId).append(
	    			String.format(SearchGasStation._params.choosePlaceFromToHtml,waypointsIndex,slctChoosePlaceOptions)
	    		).show();
    		}
			else if (waypointsIndex == waypointsTable.length-1) {
				jQuery('#' + SearchGasStation._params.txtToId).hide();
	    		jQuery('#' + SearchGasStation._params.divChoosePlaceToId).append(
	    			String.format(SearchGasStation._params.choosePlaceFromToHtml,waypointsIndex,slctChoosePlaceOptions)
	    		).show();
			}
			else {
				jQuery('#divRouteAcross' + waypointsIndex).hide();
	    		jQuery('#divChoosePlace' + waypointsIndex).append(
	    			String.format(SearchGasStation._params.choosePlaceInRouteHtml,waypointsIndex,slctChoosePlaceOptions)
	    		).show();
			}
		}
	}
}

//---------------------------------------------------------------------------------------------------------------------
var filterDirections;
var filterPackCount = 10;

var filterPoint;
var filterZoomToMarkers;
var filterDistance;

var filterIndex;
var filterTab;
var filterResultIndex;
var filterResultTab;

var pageNumber;

function loadFilterGasStations(){
			
	for (i = 0; i < filterDirections.getNumRoutes(); i = i + 2) {
		if (filterDirections.getRoute(i).getDistance().meters / 1000 <= filterDistance) {
			filterResultTab[filterResultIndex] = filterTab[filterIndex + i / 2];
            filterResultTab[filterResultIndex].distance = filterDirections.getRoute(i).getDistance().meters / 1000;
			filterResultIndex++;
		}
	}
	
	filterIndex += filterPackCount;

	if (filterIndex >= filterTab.length){		
		if (filterResultTab.length == 0)
            SearchGasStation._noResults();
        else {
            SearchGasStation._renderNearestGasStations(filterResultTab);
            SearchGasStation.SetMarkers(filterResultTab, filterZoomToMarkers, filterPoint);
        }
        
        jQuery('#' + SearchGasStation._params.txtLink).val(SearchGasStation.GenerateLink());
        jQuery('#' + SearchGasStation._params.linkContainer).show();
        hideAjaxLoader();
	} 
	else {
		var routeTab = []; 
		routeTab[0] = filterPoint;
		
		for (var i = 0; i < filterPackCount && (i+filterIndex)<filterTab.length; i++) {
            var point = new GLatLng(Number(filterTab[i+filterIndex].Latitude), Number(filterTab[i+filterIndex].Longitude));
            routeTab[i * 2 + 1] = point;
            routeTab[i * 2 + 2] = filterPoint;
        }
				
		filterDirections.loadFromWaypoints(routeTab);
	}
}    
//---------------------------------------------------------------------------------------------------------------------

SearchGasStation = function(params) {

    this._params = params;
    if (this._params.icons == null) {
        var orlen = '1345'; //'< %= (int) GasStationConsts.GasStationType.Orlen %>';
        var bliska = '1346'; //'< %= (int) GasStationConsts.GasStationType.Bliska %>';
        var stopcafe = '1374-' + orlen; //'< %= GasStationConsts.STOP_CAFE_ID %>-' + orlen;
        var star = '1452';
        var lietuva = '1453';
        var ventus = '1454';
        var benzina = '1455';
        var benzinaPlus = '1456';

        var defaultIcon = new GIcon(G_DEFAULT_ICON);
        defaultIcon.shadow = '';
        //  defaultIcon.shadowSize = new GPoint(0, 0);

        defaultIcon.imageMap = [0, 0, 35, 0, 35, 40, 0, 40];
        defaultIcon.iconSize = new GSize(35, 40);
        defaultIcon.iconAnchor = new GPoint(17, 40);
        defaultIcon.infoWindowAnchor = new GPoint(17, 0);

        var defaultIconWide = new GIcon(G_DEFAULT_ICON);
        defaultIconWide.shadow = '';
        defaultIconWide.imageMap = [0, 0, 75, 0, 75, 40, 0, 40];
        defaultIconWide.iconSize = new GSize(75, 40);
        defaultIconWide.iconAnchor = new GPoint(37, 40);
        defaultIconWide.infoWindowAnchor = new GPoint(37, 0);


        var icons = new Array();
        icons[bliska] = new GIcon(defaultIcon);
        icons[bliska].image = "/Style library/_iMg/icoGoogleBliska2.gif";
        icons[orlen] = new GIcon(defaultIcon);
        icons[orlen].image = "/Style library/_iMg/icoGoogleOrlen2.gif";

        icons[stopcafe] = new GIcon(defaultIconWide);
        icons[stopcafe].image = "/Style library/_iMg/icoGoogleOrlenStopCafe2.gif";
        icons[bliska + '_' + orlen] = new GIcon(defaultIconWide);
        icons[bliska + '_' + orlen].image = "/Style library/_iMg/icoGoogleOrlenBliska2.gif";
        icons[stopcafe + '_' + bliska + '_' + orlen] = new GIcon(defaultIconWide);
        icons[stopcafe + '_' + bliska + '_' + orlen].image = "/Style library/_iMg/icoGoogleOrlenBliska2.gif";
        icons[stopcafe + '_' + orlen] = new GIcon(defaultIconWide);
        icons[stopcafe + '_' + orlen].image = "/Style library/_iMg/icoGoogleOrlenStopCafe2.gif";
        icons[stopcafe + '_' + bliska] = new GIcon(defaultIconWide);
        icons[stopcafe + '_' + bliska].image = "/Style library/_iMg/icoGoogleOrlenBliska2.gif";


        icons[star] = new GIcon(defaultIconWide);
        icons[star].image = "/Style library/_iMg/icoGoogleStar.gif";
        icons[lietuva] = new GIcon(defaultIconWide);
        icons[lietuva].image = "/Style library/_iMg/icoGoogleOrlenLietuva.gif";
        icons[ventus] = new GIcon(defaultIconWide);
        icons[ventus].image = "/Style library/_iMg/icoGoogleVentus.gif";
        icons[benzina] = new GIcon(defaultIconWide);
        icons[benzina].image = "/Style library/_iMg/icoGoogleBenzina.gif";
        icons[benzinaPlus] = new GIcon(defaultIconWide);
        icons[benzinaPlus].image = "/Style library/_iMg/icoGoogleBenzinaPlus.gif";
        icons[benzinaPlus + '_' + benzina] = new GIcon(defaultIconWide);
        icons[benzinaPlus + '_' + benzina].image = "/Style library/_iMg/icoGoogleBenzinaBenzinaPlus.gif";
        icons[ventus + '_' + lietuva] = new GIcon(defaultIconWide);
        icons[ventus + '_' + lietuva].image = "/Style library/_iMg/icoGoogleOrlenLVentus.gif";

        this._params.icons = icons;
    }
    this._searchType = '0';

}

SearchGasStation.prototype =
{
    Init: function() {
        if (GBrowserIsCompatible())  // sprawdzamy, czy przeglądarka jest kompatybilna
        {
            var zoom = this._params.zoom;
            G_PHYSICAL_MAP.getMinimumResolution = function() { return zoom; };
            G_NORMAL_MAP.getMinimumResolution = function() { return zoom; };
            G_SATELLITE_MAP.getMinimumResolution = function() { return zoom; };
            G_HYBRID_MAP.getMinimumResolution = function() { return zoom; };


            this._map = new GMap2(document.getElementById(this._params.mapContainer));
            this._map.setCenter(new GLatLng(this._params.centerLat, this._params.centerLng),
            this._params.zoom);
            this._map.setUIToDefault();
            this._clusterOptions = {
                clusterMarkerTitle: this._params.clusterMarkerTitle,
                gasStationIcons: this._params.icons,
                clusteringEnabled: true //(this._params.clusteringEnabled === false) ? false : true
            };
            //domyslnie zaznaczenie typow stacji
            jQuery("input[name='cbGasStationType']").attr('checked', 'checked');

            this.InitContextMenu();
        } else alert('Browser is incompatible');
    },

    InitContextMenu: function() {
        contextmenu = document.getElementById(this._params.contextMenu);
        
        if (contextmenu == null) return;
        
        this._map.getContainer().appendChild(contextmenu);
        var obj = this;
        GEvent.addListener(this._map, "singlerightclick", function(pixel, source, overlay) {
            if (overlay) {
                if (overlay instanceof GMarker) {
                    GEvent.trigger(overlay, "SingleRightClick");
                }
            }
            else {
                if (crossMarker != null) obj._map.removeOverlay(crossMarker);
                clickedPosition = obj._map.fromContainerPixelToLatLng(pixel);

                var _icon = new GIcon(G_DEFAULT_ICON);
                _icon.image = "http://maps.google.com/intl/en_us/mapfiles/ms/micons/blue-dot.png";
                _icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
                _icon.iconSize = new GSize(32, 32);
                _icon.iconAnchor = new GPoint(16, 32);

                crossMarker = new GMarker(clickedPosition, { icon: _icon });

                obj._map.addOverlay(crossMarker);
                var x = pixel.x;
                var y = pixel.y;
                if (x > obj._map.getSize().width - jQuery(contextmenu).width()) { x = obj._map.getSize().width - jQuery(contextmenu).width() }
                if (y > obj._map.getSize().height - jQuery(contextmenu).height()) { y = obj._map.getSize().height - jQuery(contextmenu).height() }
                var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(x, y));
                pos.apply(contextmenu);
                contextmenu.style.visibility = "visible";
            }
        });

        GEvent.addListener(this._map, "click", function() {
            contextmenu.style.visibility = "hidden";

            if (crossMarker != null) obj._map.removeOverlay(crossMarker);
        });
    },

    DefaultSearch: function() {

        var mr = jQuery(document).getUrlParam('mr');
        if (mr) {
            toggleAdvancedSearchOptions();
        }
        var st = jQuery(document).getUrlParam('st');
        if (st) {
            this._searchType = st;
        }
        var services = jQuery(document).getUrlParam('s');
        if (services) {
            this._setCheckbox(unescape(services), 'cbServices');
        }
        var types = jQuery(document).getUrlParam('t');
        if (types) {
            this._uncheckCheckbox('cbGasStationType');
            this._setCheckbox(unescape(types), 'cbGasStationType');
        }
        var templates = jQuery(document).getUrlParam('m');
        if (templates)
            this._setCheckbox(unescape(templates), 'cbTemplates');

        this.TemplateChange();
        var kw = jQuery(document).getUrlParam('kw');
        if (kw) {
            jQuery('#' + this._params.txtKeyWordId).val(unescape(kw));
            jQuery('#' + this._params.txtToId).val(unescape(kw));
        }
        var from = jQuery(document).getUrlParam('from');
        if (from)
            jQuery('#' + this._params.txtFromId).val(unescape(from));
        var to = jQuery(document).getUrlParam('to');
        if (to)
            jQuery('#' + this._params.txtToId).val(unescape(to));
        var dst = jQuery(document).getUrlParam('dst');
        if (dst) {
            jQuery('#' + this._params.chkDistance).attr('checked', 'checked');
            jQuery('#' + this._params.ddlDistance).removeAttr('disabled');
            jQuery('#' + this._params.ddlDistance + ' option[value=' + dst + ']').attr('selected', 'selected');
        }

        if (this._searchType == '1') {
            toggleSearchTab('route');

            var wp = jQuery(document).getUrlParam('wp');
            if (wp) {
                var tbl = wp.split(';');
                for (var i = 0; i < tbl.length; i++)
                    this.InsertAcrossRouteDiv(unescape(tbl[i]));
            }

            if (to && from || jQuery(document).getUrlParam('gs') != null)
                this.SearchRoute();
        }
        else {
            toggleSearchTab('address');
            var ps = jQuery(document).getUrlParam('ps');

            if (ps) {
                var point = new GLatLng(Number(ps.split(';')[0]), Number(ps.split(';')[1]));
                this.SearchAfterDrag(point);
            }
            else {
                if (mr == null && (kw || jQuery(document).getUrlParam('gs') != null))
                    this.Search();
            }
        }
    },
    TemplateChange: function(source) {
        var tab = jQuery("input[name='cbTemplates']");
        if (source) {
            var sv = jQuery(source).val().split('|');
            for (var j = 0; j < sv.length; j++) {
                var cb1 = jQuery("#cbServices_" + sv[j] + ",#cbFood_" + sv[j]);
                if (cb1)
                    cb1.attr('checked', '');
            }
        }
        var stopCafe;
        for (var i = 0; i < tab.length; i++) {
            var cb = jQuery(tab[i]);
            if (cb.attr('checked')) {
                if (cb.attr('id') == 'cbTemplates_1350')
                    stopCafe = cb;
                var values = jQuery(tab[i]).val().split('|');
                for (var j = 0; j < values.length; j++) {
                    var cb1 = jQuery("#cbServices_" + values[j] + ",#cbFood_" + values[j]);
                    if (cb1)
                        cb1.attr('checked', 'checked');
                }
            }
        }
        //specjalnie dla stopcafe!
        if (stopCafe) {
            jQuery("input[id^='cbFood']").attr('checked', '');
            var values = stopCafe.val().split('|');
            for (var j = 0; j < values.length; j++) {
                var cb1 = jQuery("#cbFood_" + values[j]);
                if (cb1)
                    cb1.attr('checked', 'checked');
            }
        }
    },
    SetMarkers: function(tab, zoomToMarkers, center) {
        var markersArray = [];
        for (var i = 0; i < tab.length; i++) {
            var point = new GLatLng(Number(tab[i].Latitude),
                Number(tab[i].Longitude));
            var m = this._createMarker(point, tab[i].Id, tab[i].Type);
            markersArray.push(m);
            tab[i].marker = m;
        }
        this._cluster = new ClusterMarker(this._map, this._clusterOptions);
        this._cluster.addMarkers(markersArray);
        if (zoomToMarkers) 
	        if (center != null) {
	          	var obj = this;
	            var m = new GMarker(center, { icon: G_DEFAULT_ICON, draggable: true });
	            m.enableDragging();
	            GEvent.addListener(m, "click", function() {
	                m.openInfoWindowHtml(obj._params.yoursLocationText);
	            });
	            GEvent.addListener(m, "dragend", function(position) {
	                obj.SearchAfterDrag(position);
	            });
	
	            this._map.clearOverlays();
	            this._map.addOverlay(m);
	
	            this._map.setCenter(center);
	            this._zoomToMinimumMarkersCount();
	        } 
	        else {
	            this._cluster.fitMapToMarkers();
	        }
        else
            this._cluster.refresh();
        this._map.savePosition();
    },
    _renderGrid: function(searchResults) {
        var outputHtml = '';
        //{0} - id, {1} - StreetAddress {2} - StreetNumber, {3} - PostalCode {4} - City {5} -phone
        //{6} - GasStationType {7} - LocalId
        for (var i = 0; i < searchResults.GasStations.length; i++) {
            outputHtml += String.format(this._params.gridRowTemplate,
           searchResults.GasStations[i].Id, searchResults.GasStations[i].StreetAddress,
           searchResults.GasStations[i].StreetNumber, searchResults.GasStations[i].PostalCode,
           searchResults.GasStations[i].City, searchResults.GasStations[i].Phone,
           searchResults.GasStations[i].GasStationType, searchResults.GasStations[i].LocalId);
        }
        //ahShow
        jQuery('#' + this._params.gridContainerId).html(outputHtml);
        var obj = this;
        for (var i = 0; i < searchResults.GasStations.length; i++) {
            jQuery('#ahShow' + searchResults.GasStations[i].Id).bind('click', searchResults.GasStations[i], function(e) {
                obj._map.setCenter(e.data.marker.getLatLng(), 14);
                GEvent.trigger(e.data.marker, 'click');
            });
        }
        var pagers = jQuery(this._params.pagerClass);
        var total = Math.ceil(searchResults.TotalCount / searchResults.RowsOnPage);
        if (total > 2) {
            pagers.show();
            pagers.html(jsPagerGeneratePager(searchResults.PageNumber, total, 2,
            'SearchGasStation.GetGasStationsGrid'));
        }
        else
            pagers.hide();
    },
    GetGasStationsGrid: function(_pageNumber) {
        showAjaxLoader();
        this._map.clearOverlays();
        if (this._cluster)
            this._cluster.removeMarkers();
        this._cluster = null;
        jQuery.post(this._params.srvUrl + '/SearchText',
        { keyWords: this.curentKeyWords, pageNumber: _pageNumber }, searchComplete);
        var obj = this;
        function searchComplete(response) {

            var gs = eval('({"objects": ' + response + '})').objects;
            if (gs.TotalCount == 0) {
                obj._noResults(true);
                jQuery(obj._params.pagerClass).hide();
                jQuery('#' + obj._params.gridContainerId).html('');
            }
            else {
                obj.SetMarkers(gs.GasStations, true, null);
                obj._renderGrid(gs);
            }
            hideAjaxLoader();
        }

    },

    GetGasStations: function(_polyLine, _keyWords, _options, _gasStationType,
        zoomToMarkers, _point, _food, _distance) {
        contextmenu.style.visibility = "hidden";
        var p = "";
        var _topN = "";
        var ifDistance = (_distance != undefined);
        if (ifDistance) {
            if (_point) p = _point.lat() + ' ' + _point.lng();
            _topN = this._params.topN;
        }
        else _distance = '';

        if (ifDistance)
            jQuery.post(this._params.srvUrl + '/SearchGasStationsWithCoordinates', { polyline: _polyLine, keyWords: _keyWords, options: _options, gasStationType: _gasStationType, point: p, food: _food, distance: _distance, topN: _topN }, searchWithDistanceComplete)
        else
            jQuery.post(this._params.srvUrl + '/Search', { polyline: _polyLine, keyWords: _keyWords, options: _options, gasStationType: _gasStationType, point: p, food: _food, distance: _distance, topN: _topN }, searchComplete)

        var obj = this;
        var ifSearchRoute = (_polyLine != '');
        function searchComplete(response) {
            if (response == '[]')
                obj._noResults();
            else {
                var tab = eval('({"objects": ' + response + '})').objects;
                obj.SetMarkers(tab, zoomToMarkers, _point);
            }
            jQuery('#' + obj._params.gasStationsList).hide();
            jQuery('#' + obj._params.txtLink).val(obj.GenerateLink());
            jQuery('#' + obj._params.linkContainer).show();
            hideAjaxLoader();
            if (ifSearchRoute) jQuery('#' + obj._params.routeInfoContainerId).hide().show();
            else jQuery('#' + obj._params.routeInfoContainerId).hide();
        }

        function searchWithDistanceComplete(response) {
            var gs = eval('({"objects": ' + response + '})').objects;

            if (gs.GasStations.length == 0) {
                obj._noResults();
                jQuery('#' + obj._params.txtLink).val(obj.GenerateLink());
                jQuery('#' + obj._params.linkContainer).show();
                hideAjaxLoader();
                jQuery('#' + obj._params.routeInfoContainerId).hide();
            }
            else {
                var tab = gs.GasStations;
                obj.FilterGasStations(tab, zoomToMarkers, _point, jQuery('#' + obj._params.ddlDistance).val());
            }
        }
    },

    FilterGasStations: function(tab, zoomToMarkers, _point, distance) {

		filterDirections = new GDirections(null, null);

		filterPoint = _point;
		filterZoomToMarkers = zoomToMarkers;
		filterDistance = distance;

		filterIndex = 0;
		filterTab = tab;

		filterResultIndex= 0;
		filterResultTab = [];
		
		var routeTab = new Array(); 
		
		routeTab[0] = filterPoint;
		
		for (var i = filterIndex; i < filterIndex+filterPackCount && i<filterTab.length; i++) {
            var point = new GLatLng(Number(filterTab[i].Latitude), Number(filterTab[i].Longitude));
            routeTab[i * 2 + 1] = point;
            routeTab[i * 2 + 2] = filterPoint;
        }
		
		GEvent.addListener(filterDirections, "load", loadFilterGasStations);
	
		GEvent.addListener(filterDirections, "error", function(){

			alert('Wystąpił błąd podczas obliczania odległości do stacji. Część wyników została utracona.');
		
			if (filterResultTab.length == 0)
	            SearchGasStation._noResults();
	        else {
	            SearchGasStation._renderNearestGasStations(filterResultTab);
	            SearchGasStation.SetMarkers(filterResultTab, filterZoomToMarkers, filterPoint);
	        }
        
	        jQuery('#' + SearchGasStation._params.txtLink).val(SearchGasStation.GenerateLink());
	        jQuery('#' + SearchGasStation._params.linkContainer).show();
	        hideAjaxLoader();
		})
	
		filterDirections.loadFromWaypoints(routeTab);
    },

    SearchRoute: function() {
   	    this._searchType = '1';
	    this.ClearChoosePlaceInRoute();
    
		var obj = this;
		
		var txtFrom = jQuery('#' + this._params.txtFromId).val();
        var txtTo = jQuery('#' + this._params.txtToId).val();
        if ((txtFrom == this._params.defaultText) || (txtTo == this._params.defaultText)) return;

        waypointsTable= new Array();
        waypointsTable[0] = txtFrom;

		var i = 1;
		jQuery('input.routeAcross').each(function(){
			if (jQuery(this).val() != obj._params.defaultText){			
				var routeItem = jQuery(this).parents('.routeAcrossOneItem');				
				routeItem.attr('id','divRouteAcross'+i);
				if (routeItem.next().is('.choosePlaceOneItem'))
					routeItem.next().attr('id','divChoosePlace'+i);
				
				jQuery(this).attr('id','routeAcross'+i);
				waypointsTable[i] = jQuery(this).val();
				i++;
			}
			else obj.RemoveAcrossRouteDiv(jQuery(this));			
		})		
		waypointsTable[i] = txtTo;
		
		waypointsIndex = 0;
		waypointsGeo.getLocations(waypointsTable[waypointsIndex],checkLocationsAndLoad);
    },

    Search: function() {
        
        var txtKeyWord = jQuery('#' + this._params.txtKeyWordId);                
        if (txtKeyWord.is(':visible')==false) return;        
        
        jQuery('#' + this._params.hfPosition).val('');

        this._searchType = '0';
        this.ClearMap();
        var obj = this;
        
        var geo = new GClientGeocoder();
        
        if (txtKeyWord.val() == this._params.defaultText) {
        	this.SearchAfterChoose();
        	return;
        }

        geo.getLocations(txtKeyWord.val(),
        	function(response){
	        	if (!response || response.Status.code != 200) {
	        		obj.SearchAfterChoose();
	        	}
	        	else{
	        		if (response.Placemark.length==1){
	        			obj.SearchAfterChoose(response.Placemark[0].Point.coordinates[1],response.Placemark[0].Point.coordinates[0]);
	        		}
	        		else {        			
						obj._map.setCenter(new GLatLng(obj._params.centerLat, obj._params.centerLng),obj._params.zoom);
		      			
		      			var slctChoosePlaceOptions = '';
		      			var slctOption = "<option value='{0}'>{1}</option>";		      			
		      			
		      			markersToChoose = [];
		      				      			
		        		for (var i=0;i<response.Placemark.length && i<9;i++){
			      			var iconImageSrc = String.format(obj._params.choosePlaceIconSrc,i+1);
			      					        			
				        	var place = response.Placemark[i];
		        			
			        		var point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
			      			var _icon = new GIcon(G_DEFAULT_ICON);			      			
		        			_icon.image = iconImageSrc;
		        			_icon.iconSize = new GSize(24, 38);
		        			
						    var mark = new GMarker(point, { icon:_icon} );
						    mark.locationAddress = place.address;
						    mark.locationCoordinates = place.Point.coordinates[1]+'|'+place.Point.coordinates[0];
						    						    
   		        			GEvent.addListener(mark, "click", function() {
				                this.openInfoWindowHtml(this.locationAddress);
				                jQuery('#slctChoosePlace option[value="'+this.locationCoordinates+'"]').attr("selected","selected");
				            });

			    			obj._map.addOverlay(mark);
			    			markersToChoose[i] = mark;
			    			
			    			slctChoosePlaceOptions += 
			    				String.format(slctOption,
			    					place.Point.coordinates[1]+'|'+place.Point.coordinates[0],
			    					place.address);
		    			}

						jQuery('#' + obj._params.chooseLocationId).show();
		    			
		    			jQuery('#' + obj._params.txtKeyWordId).hide();
			    		jQuery('#' + obj._params.divChoosePlaceId).append(
			    			String.format(obj._params.choosePlaceHtml,slctChoosePlaceOptions)
			    		).show();
						
	    			}
    			}
        	}
        )
    },
    
    ChoosePlace: function(){
    	var selectedOption = jQuery('#slctChoosePlace :selected');
    	
    	if (selectedOption.val()!=''){	    	
    		var coordinates = selectedOption.val().split('|');
    		
    		this.ClearChoosePlace();
   	
    		this.SearchAfterChoose(coordinates[0],coordinates[1],selectedOption.text());    		
    	}    
    },
    
    ChoosePlaceInRoute: function(){
    	var selectedOption = jQuery('#slctChoosePlace'+waypointsIndex+' :selected');
    	
    	if (selectedOption.val()!=''){	    	
    		var coordinates = selectedOption.val().split('|');
    		this.ClearChoosePlaceInRoute();
    		
    		if (waypointsIndex == 0) {   			
   				jQuery('#' + this._params.txtFromId).val(selectedOption.text());	    		
   			}
			else if (waypointsIndex == waypointsTable.length-1) {
				jQuery('#' + this._params.txtToId).val(selectedOption.text());    		
			}
			else {
				jQuery('#divRouteAcross' + waypointsIndex+' input').val(selectedOption.text());
			}
    	
	    	waypointsTable[waypointsIndex] = new GLatLng(Number(coordinates[0]),Number(coordinates[1]));
    		waypointsIndex++;
    		if (waypointsIndex < waypointsTable.length) { 
    			waypointsGeo.getLocations(waypointsTable[waypointsIndex],checkLocationsAndLoad); 
			}
			else this.LoadFromWaypoints();
    	} 
    },
    
	ChoosePlaceFromSelect: function(i){
		if (i>0){
			GEvent.trigger(markersToChoose[i-1],'click');
			//document.getElementById('searchGasStationMap').scrollIntoView(true);
		}
	},
  
    SearchAfterChoose: function(latitude,longitude,address){   
    
	    showAjaxLoader();
	    
		this.ClearMap(false);
		
		if (address!=undefined){
			jQuery('#' + this._params.txtKeyWordId).val(address);
		}
    
    	if ((latitude==undefined) || (longitude==undefined)){
    		this.GetGasStations('', '', this._getServices(), this._getGasStationType(), true, null, this._getFood());
    	}
    	else {
	    	var point = new GLatLng(Number(latitude),Number(longitude));
	    
	    	if (jQuery('#' + this._params.chkDistance).is(':checked'))
	            this.GetGasStations('', '', this._getServices(), this._getGasStationType(), true, point, this._getFood(), jQuery('#' + this._params.ddlDistance).val());
	        else
	            this.GetGasStations('', '', this._getServices(), this._getGasStationType(), true, point, this._getFood());        
    	}
    },
    	    
    LoadFromWaypoints: function() {
	    showAjaxLoader();
    
    	var directions = new GDirections(SearchGasStation._map, document.getElementById(SearchGasStation._params.routeInfoContainerId));

	    GEvent.addListener(directions, "load", function() {
			var linia = directions.getPolyline();
            var tmp = "";
            for (var i = 0; i < linia.getVertexCount(); i++) {
				var p = linia.getVertex(i);
                tmp += p.lat() + ' ' + p.lng() + ', ';
            }
            SearchGasStation.GetGasStations(tmp, '', SearchGasStation._getServices(), SearchGasStation._getGasStationType(),
                false, null, SearchGasStation._getFood());
         });
         directions.loadFromWaypoints(waypointsTable);
    },
    	
    SearchFromContextMenu: function() {
        showAjaxLoader();
        this._searchType = '0';
        this.ClearMap(true);

        jQuery('#' + this._params.hfPosition).val(clickedPosition.lat() + ';' + clickedPosition.lng());

        if (jQuery('#' + this._params.chkDistance).is(':checked'))
            this.GetGasStations('', '', this._getServices(), this._getGasStationType(), true, clickedPosition, this._getFood(), jQuery('#' + this._params.ddlDistance).val());
        else
            this.GetGasStations('', '', this._getServices(), this._getGasStationType(), true, clickedPosition, this._getFood());
    },

    SearchAfterDrag: function(position) {
        showAjaxLoader();
        this._searchType = '0';
        this.ClearMap(true);
        var geo = new GClientGeocoder();

        jQuery('#' + this._params.hfPosition).val(position.lat() + ';' + position.lng());

        if (jQuery('#' + this._params.chkDistance).is(':checked'))
            this.GetGasStations('', '', this._getServices(), this._getGasStationType(), true, position, this._getFood(), jQuery('#' + this._params.ddlDistance).val());
        else
            this.GetGasStations('', '', this._getServices(), this._getGasStationType(), true, position, this._getFood());
    },

    SearchText: function() {
        this._searchType = '0';
        this.ClearMap();
        var obj = this;
        var txtKeyWord = jQuery('#' + this._params.txtKeyWordId).val();
        if (txtKeyWord == this._params.defaultText)
            txtKeyWord = '';
        obj.curentKeyWords = txtKeyWord;
        obj.GetGasStationsGrid('1');
    },

    ClearMap: function(doNotClearOverlays) {
        if ((doNotClearOverlays == undefined) || (doNotClearOverlays == false))
            this._map.clearOverlays();
        if (this._cluster)
            this._cluster.removeMarkers();
        this._cluster = null;
        jQuery('#' + this._params.routeInfoContainerId).html('');
        jQuery('#' + this._params.noResultsId).hide();
    },

    GenerateLink: function() {
        var link = window.location.toString();
        var i = link.indexOf('?');
        if (i > 0) link = link.substr(0, i);
        return link + '?' + this._getUrlParams().substr(1);
    },

    InsertAcrossRouteDiv: function(txt) {

		this.ClearChoosePlaceInRoute();

        if (txt == undefined) txt = this._params.defaultText;

        if (jQuery('input.routeAcross').length < (this._params.maxWaypoints - 2)) {
            var div =
                '<div class="oneColumn routeAcrossOneItem">' +
                    '<input type="text" onfocus="changeDefaultText(this)" onblur="changeDefaultText(this)" class="text routeAcross" value="' + txt + '" />'+
                    '<a href="javascript:void(0)" onclick="SearchGasStation.RemoveAcrossRouteDiv(this)" class="removeBtn">usuń</a>'+
				'</div>'+
            	'<div class="oneColumn choosePlaceOneItem"></div>';
            	
            jQuery('#searchRouteAcross').append(div);
            if (jQuery('#searchRouteAcross').is(':hidden'))
                jQuery('#searchRouteAcross').show();
        }
        else {
            jQuery('#' + this._params.hlkAddWaypoint).hide();
        }
    },

    RemoveAcrossRouteDiv: function(closeLink,fromChoosePlace) {
        jQuery('#' + this._params.hlkAddWaypoint).show();
        
        if ((fromChoosePlace!=undefined) && (fromChoosePlace)){
	        var routeItem = jQuery(closeLink).parents('.choosePlaceOneItem');				
			if (routeItem.prev().is('.routeAcrossOneItem'))
				routeItem.prev().remove();
			routeItem.remove();        
        }
        else {
	        var routeItem = jQuery(closeLink).parents('.routeAcrossOneItem');				
			if (routeItem.next().is('.choosePlaceOneItem'))
				routeItem.next().remove();
			routeItem.remove();
        }
        
        this.ClearChoosePlaceInRoute();
       
        if (jQuery('#searchRouteAcross:has(div)').length == 0)
            jQuery('#searchRouteAcross').hide();
    },
       
    ClearChoosePlace: function(){
    	this.ClearMap(false);
    	jQuery('#' + this._params.divChoosePlaceId).hide().empty();
    	jQuery('#' + this._params.txtKeyWordId).show();
   		jQuery('#' + this._params.chooseLocationId).hide();
    },
    
    ClearChoosePlaceInRoute: function(){
	    this.ClearMap(false);
	    if (waypointsIndex == 0) {
   			jQuery('#' + this._params.divChoosePlaceFromId).hide().empty();
   			jQuery('#' + this._params.txtFromId).show();	    		
   		}
		else if (waypointsIndex == waypointsTable.length-1) {
    		jQuery('#' + this._params.divChoosePlaceToId).hide().empty();
			jQuery('#' + this._params.txtToId).show();    		
		}
		else {
    		jQuery('#divChoosePlace' + waypointsIndex).hide().empty();
			jQuery('#divRouteAcross' + waypointsIndex).show();
		}
  		jQuery('#' + this._params.chooseLocationId).hide();

    },
    
    CenterMap: function(){
		this._map.setCenter(new GLatLng(this._params.centerLat, this._params.centerLng),this._params.zoom);   
    },

    _renderNearestGasStations: function(filteredTab) {
        var container = jQuery('#' + this._params.gasStationsList);
        container.empty();
        if (filteredTab.length > 0) {
            filteredTab.sort(function(a, b) { return a.distance - b.distance; });

			var pageContainer = jQuery('<div class="divPage"></div>');

            for (var i = 0; i < filteredTab.length; i++) {
            	
            	if ((i+1) % 10 == 0){
            		container.append(pageContainer);
            		pageContainer = jQuery('<div class="divPage"></div>');
            	}	
            
                var gs = filteredTab[i];

                var htmlElement = String.format(this._params.gasStationOnListTemplate, gs.Id, gs.StreetAddress +
                    ' ' + gs.StreetNumber + ' ' + gs.PostalCode + ' ' + gs.City, gs.Latitude + ' ' + gs.Longitude, gs.distance, gs.GasStationType, gs.LocalId);
                pageContainer.append(htmlElement);
            }
            
            container.append(pageContainer);

            var obj = this;
            for (var i = 0; i < filteredTab.length; i++) {
                var gs = filteredTab[i];
                jQuery('#show' + gs.Id).bind('click', gs, function(e) {
                    obj._map.setCenter(e.data.marker.getLatLng(), 14);
                    GEvent.trigger(e.data.marker, 'click');
                });
            }

			container.pager('.divPage',{
				navId: 'nav1', navId2: 'nav2',
				navAttach: 'prepend',
				prevText: '< poprzednia',
				nextText: 'następna >',
				navClass: 'pager jsPager',
				highlightClass: 'activePage'				
			});
			
			container.pager('.divPage',{
				navId: 'nav2', navId2: 'nav1',
				navAttach: 'append',
				prevText: '< poprzednia',
				nextText: 'następna >',
				navClass: 'pager jsPager',
				highlightClass: 'activePage'				
			});


            container.show();
        }
        else
            container.hide();
    },

    _createMarker: function(point, id, type) {
        var markerOptions = { icon: G_DEFAULT_ICON };
        if (this._params.icons[type] != null)
            markerOptions.icon = this._params.icons[type];
        var m = new GMarker(point, markerOptions);
        m.gsId = id;
        m.gsType = type;
        var obj = this;
        GEvent.addListener(m, "click", function() {
            jQuery.post(obj._params.srvUrl + '/GetGasStation', { id: m.gsId },
              function(result) {
                  m.openInfoWindowHtml(obj._createGsInfoHtml(result));
              });
        });
        return m;
    },
    _createGsInfoHtml: function(data) {
        var gs = eval('({"objects": ' + data + '})').objects;
        var tmp = '';
        if (this._params.allTemplatesId != null) {
            var temp = eval('({"objects": ' +
        jQuery('#' + this._params.allTemplatesId).val() + '})').objects;
	        var hideStopCafe = false;
			for (var j = 0; j < gs.Services.length; j++) {
				if (gs.Services[j].DictionaryItemId == '1411')
					hideStopCafe = true;
			}        

            for (var i = 0; i < temp.length; i++) {
            	if ((temp[i].DictionaryItemId == '1350') && (hideStopCafe))
            		continue;
            		
                var b = false;
                for (var j = 0; j < gs.Services.length; j++) {               
                    if (temp[i].DictionaryItemId == gs.Services[j].DictionaryItemId) {
                        b = true;
                        tmp += ' <img src="/Style library/_iMg/icoGasStationSmall' +
                    gs.Services[j].DictionaryItemId + '.png" alt="' + gs.Services[j].Name + '" />';
                        break;
                    }
                }
                if (!b)
                    tmp += ' <img src="/Style library/_iMg/icoGasStationSmallGray' +
                    temp[i].DictionaryItemId + '.png" alt="' + temp[i].Name + '" />';

            }
        }
        return String.format(this._params.gasStationInfoTemplate, gs.Id, gs.StreetAddress + ' ' +
        gs.StreetNumber + ' ' + gs.PostalCode + ' ' + gs.City, gs.Phone, tmp, this._getUrlParams(), gs.GasStationType, gs.LocalId);
    },
    _getFood: function() {
        return this._getCheckboxValues('cbFood');
    },
    _getServices: function() {
        return this._getCheckboxValues('cbServices');
    },
    _getGasStationType: function() {
        return this._getCheckboxValues('cbGasStationType');
    },
    _getWaypoints: function() {
        var wp = '';
        jQuery('input.routeAcross').each(function() {
            wp = wp + ';' + escape(jQuery(this).val());
        });
        if (wp != '') return wp.substr(1);
        return wp;
    },
    _getTemplate: function() {
        var tab = jQuery("input[name='cbTemplates']");
        var tmp = "";
        for (var i = 0; i < tab.length; i++) {
            var cb = jQuery(tab[i]);
            if (cb.attr('checked'))
                tmp += ',' + cb.attr('id').split('_')[1];
        }
        if (tmp != '')
            return tmp.substring(1);
        return tmp;
    },
    _getCheckboxValues: function(name) {
        var tab = jQuery("input[name^='" + name + "']");
        var tmp = "";
        for (var i = 0; i < tab.length; i++) {
            var cb = jQuery(tab[i]);
            if (cb.attr('checked'))
                tmp += ',' + cb.val();
        }
        if (tmp != '')
            return tmp.substring(1);
        return '';
    },
    _setCheckbox: function(values, name) {
        var tab = values.split(',');

        for (var i = 0; i < tab.length; i++) {
            var cb = jQuery("input[id='" + name + "_" + tab[i] + "']");
            if (cb)
                cb.attr('checked', 'checked');
        }
    },
    _uncheckCheckbox: function(name) {
        var cb = jQuery("input[id^='" + name + "']");
        if (cb) cb.removeAttr('checked');
    },
    _getUrlParams: function() {
        if (this._params.txtToId != null) {
            var tmp = "&kw={0}&from={1}&to={2}&s={3}&t={4}&m={5}&st={6}&wp={7}&dst={8}&ps={9}";

            var dst = '';
            if (jQuery('#' + this._params.chkDistance).is(':checked'))
                dst = jQuery('#' + this._params.ddlDistance).val();

            var ps = '';
            if (jQuery('#' + this._params.hfPosition).val() != '')
                ps = jQuery('#' + this._params.hfPosition).val();

            return String.format(tmp, escape(jQuery('#' + this._params.txtKeyWordId).val()), escape(jQuery('#' + this._params.txtFromId).val()),
                escape(jQuery('#' + this._params.txtToId).val()), this._getServices(), this._getGasStationType(), this._getTemplate(),
                this._searchType, this._getWaypoints(), dst, ps)
        } else
            return '';
    },
    _noResults: function(centerMap) {
        jQuery('#' + this._params.gasStationsList).hide();
        jQuery('#' + this._params.noResultsId).show();
        if (this._searchType == '0' || centerMap) {
            this._map.setCenter(new GLatLng(this._params.centerLat, this._params.centerLng),
            this._params.zoom);
            this._map.setUIToDefault();
            this._map.clearOverlays();
        }
    },
    _zoomToMinimumMarkersCount: function() {
        for (var z = 15; z >= this._params.zoom; z--) {
            this._map.setZoom(z);
            var c = false;
            for (var j = 0; j < this._cluster._mapMarkers.length; j++) {
                if (this._cluster._mapMarkers[j]._isVisible) {
                    c = true;
                    break;
                }
            }
            if (c) {
                if (z == this._params.zoom)
                    this._map.setZoom(z);
                else
                    this._map.setZoom(z - 1);
                break;
            }
        }
    }    
}

