var API_BASE = "/1.0/", map; (function() { $(function() { initMap(); $('.tabButton').click(function() { if ($(this).hasClass("selected")) { return; } var $that = $(this); var name = $that.attr("data-name"); var $listWrapper = $('#' + name); if ($that.data("loaded")) { $.noop(); //dont load data } else { $that.data("loaded", true); var $list = $('#' + name + 'List'); var url = API_BASE + name + "/"; var $loadingLi = $('
').text("Loading...").appendTo($list); $.getJSON(url, {'srid': 3857}, function(items) { $loadingLi.remove(); $.each(items, function(i,v) { var $li = $('
') .addClass("listItem") .appendTo($list); var $txt = $('').addClass("listItemText").text(v).appendTo($li); }); }); } $('.listWrapper').hide(); $listWrapper.show(); $('.selected').removeClass("selected"); $that.addClass("selected"); }); $('.list').click(function(e) { var name = $(this).attr("id").replace("sList", ""); //FIXME: stick name in a data attr or so? var $target = $(e.target).parent(); //console.log($target); if (!$target.hasClass('listItem')) { return; } if ($target.data("loading")) { return; } if ($target.hasClass("selectedListItem")) { $target.find(".stopsList").hide().remove(); $target.removeClass("selectedListItem"); return; } $('.selectedListItem').find(".stopsList").hide().remove(); $('.selectedListItem').removeClass("selectedListItem"); $target.addClass("selectedListItem"); if ($target.data("hasList")) { var $stopsList = $target.find(".stopsList"); $stopsList.slideDown(); return; /* var $stopsList = $target.find(".stopsList"); if (!$stopsList.is(":visible")) { $stopsList.slideDown(); } else { $stopsList.slideUp(); $target.removeClass("selectedListItem"); } return; */ } var url = API_BASE + name + "/" + $target.find(".listItemText").text(); $target.data("loading", true); var $loading = $('').addClass("loadingSpan").text("Loading...").appendTo($target); $('#stopForm').remove(); $('#formCol').empty(); $.getJSON(url, {'srid': 3857}, function(obj) { //console.log("here", $target); $loading.remove(); var stopsGeojson = obj.stops; var stops = stopsGeojson.features; var $stopsList = getStopsList(stops); //console.log($stopsList); var stopsWithGeom = []; $.each(stops, function(i,v) { if (!$.isEmptyObject(v.geometry)) { stopsWithGeom.push(v); } }); stopsGeojson.features = stopsWithGeom; var currFeatures = jsonLayer.features; jsonLayer.removeFeatures(currFeatures); console.log(stopsWithGeom); if (stopsWithGeom.length !== 0) { jsonLayer.addFeatures(geojson_format.read(stopsGeojson)); var maxExtent = jsonLayer.getDataExtent(); //What you see here with the setTimeout is a sign of having given up - PLEASE PLEASE make this go away - you should not need to do this - but apparently there is some error being raised by map.zoomToExtent() ALTHOUGH it seems to be doing the right thing and calling it in a setTimeout makes the other code work alright. But it causes me to sleep a little less soundly at night. Please HELP. setTimeout(function() { map.zoomToExtent(maxExtent); }, 50); } //console.log("whoosh", $target); $target.append($stopsList); // $target.data("hasList", true); $target.data("loading", false); }); }); $('.listSearch').keyup(function(e) { var val = $(this).val(); var name = $(this).attr("id").replace("Search", ""); var $list = $('#' + name + "List"); $list.find(".listItem").each(function() { var $that = $(this); var txt = $that.find(".listItemText").text(); if (txt.indexOf(val) == -1) { $that.hide(); } else { $that.show(); } }); }); }); function getStopsList(stops) { var $ul = $('
    ') .addClass("stopsList") .click(function(e) { var $target = $(e.target); if ($target.hasClass("selectedStop")) { return; } // $('.selectedStop').removeClass("selectedStop"); // $target.addClass("selectedStop"); var props = $target.data("properties"); var geom = $target.data("geometry"); var $form = getStopForm(props, geom); var slug = $target.data("slug"); if ($target.hasClass("has_point")) { selectStopOnMap(slug); } else { selectStopNotOnMap(slug); } $('#formCol').find("#stopForm").remove(); $('#formCol').empty(); $('#formCol').append($form); }); $.each(stops, function(i,v) { var props = v.properties; var geom = v.geometry; var $li = $('
  • ') .addClass("stopItem") .data("slug", props.slug) .addClass(props.slug) //FIXME: please dont set data AND addClass AND include slug in properties. .data("properties", props) .data("geometry", geom) .text(props.display_name) .appendTo($ul); $.isEmptyObject(geom) ? $li.addClass("no_has_point") : $li.addClass("has_point"); }); return $ul; } function getStopForm(stop, geom) { // console.log(stop); // console.log(geom); var lon = !$.isEmptyObject(geom) ? geom.coordinates[0] : ''; var lat = !$.isEmptyObject(geom) ? geom.coordinates[1] : ''; var $div = $('
    '); var $displayName = $('

    ').text(stop.display_name).appendTo($div); var $slug = $('
    ').addClass("stopSlug").text(stop.slug).appendTo($div); var $road = $("
    ").addClass("stopRoad").text("Road: " + stop.road).appendTo($div); var $direction = $("
    ").addClass("stopDirection").text("Direction: " + stop.direction).appendTo($div); var $routes = $('
    ').text("Routes: " + stop.routes).appendTo($div); // var $formLabel = $("
    ").text("Edit:").appendTo($div); var $form = $('
    ').attr("id", "stopForm").appendTo($div); var $display_name_label = $('