MediaWiki:Common.js: Difference between revisions

From Protoball
Jump to navigation Jump to search
No edit summary
(no date in club or ballgame case)
 
(788 intermediate revisions by the same user not shown)
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
/* Any JavaScript here will be loaded for all users on every page load. */
var google_api_key = "AIzaSyCQ-YHMywKy3nlIuZy0M17Xk8yoD8bKlBw";
var gamesAndClubs = []; // from json of all games and clubs
var api; // set in formPrep()
wgPageName = mw.config.get('wgPageName')
wgAction = mw.config.get('wgAction')
wgUserName = mw.config.get('wgUserName')
wgUserGroups = mw.config.get('wgUserGroups')
$.getScript( '/js/jquery.cookie.js', onCookieLib );
function onCookieLib() {
  show_predecessor_games = $.cookie('show_predecessor_games') == "true";
  show_additional_markers = $.cookie('show_additional_markers') == "true";
  spread_markers = $.cookie('spread_markers') == "true";
  set_map_trigger('cookies');
}
function ClassProp(css_class, property) {
  this.css_class = css_class;
  this.property = property;
}
function set_autocomplete(target_info, filter) {
  var values = get_autocomplete_values(target_info.property, filter);
  var target_input = $("." + target_info.css_class);
  target_input.autocomplete({
    source: get_autocomplete_source_function(values),
    select: function(event, ui) { event.preventDefault(); $(this).val(ui.item.value); $(this).change(); }
  });
}
function get_autocomplete_values(property, filter) {
  valueDict = {}
  for(var i = 0; i < gamesAndClubs.length; i++) {
    var thing = gamesAndClubs[i];
    if (filter && !filter(thing)) {
      continue;
    }
    valueDict[thing[property]] = true;
  }
  var values = Object.keys(valueDict);
  values.sort();
  return values;
}
function get_autocomplete_source_function(values) {
  return function(request, response) {
    var results = $.ui.autocomplete.filter(values, request.term);
    response(results.slice(0, 100));
  };
}
function parse_list(text) {
  if(text[0] == '\n') { return []; }
  return text.split("\n")[0].substring("<p>".length).split(",");
}
function api_parse(text, callback) {
  var data = {action: "parse", prop: "text", format: "json", text: text };
  $.getJSON("/api.php", data, callback);
}
function get_property_values(property, filter, callback) {
  var ask = "{{#arraydefine:array|{{#ask:" + filter + "|?" + property + "|link=none|mainlabel=-|headers=hide|limit=10000|sep=@}}|@|unique}}{{#arrayprint:array|,}}";
  api_parse(ask, callback);
}
function default_to_one_and_hide() {
  if(!$(this).val()) {
    $(this).val("1");
  }
  $(this).hide();
}
function modify_selected_values() {
  var input = $(this).parent().prev('span').children('input');
  var chk_value = this.value;
  var selected_values = input.val() ? input.val().split(/ *, */) : [];
  if(this.checked) {
    selected_values.push(this.value);
    selected_values.sort();
  } else {
    selected_values = $.grep(selected_values, function(value) { return value != chk_value; });
  }
  input.val(selected_values.join(", "));
}
function add_new_input() {
  var span = this;
  var input = $(this).children('input').first();
  var name = input.attr('name');
  var index =  "" + $(this).find('input').length - 1;
  name = name.replace("[is_list]", "[" + index + "]");
  var new_item = $('<span class="checkboxSpan"><span>&nbsp;<a href="" class="new_multi_property_link">new</a>&nbsp;</span><span style="display:none;">&nbsp;new&nbsp;<input name="' + name + '" /></span></span>');
  $(this).append(new_item);
  $(this).find(".new_multi_property_link").click(function(){ $(this).parent().parent().children('span').toggle(); return false; });
}
function set_salience_names() {
  var names = { 1: "Prominent", 2: "Noteworthy", 3: "Peripheral", 4: "Incomplete" };
  var inputs = $(this).find('input');
  for(var i = 1; i < 5; i++) {
    inputs[i].nextSibling.nodeValue = " " + names[i];
  }
}
function populate_chron_year_number() {
  var year = $('[name="Chronology Entry[Year]"]').val();
  if(!year) return;
  var defaultYear = $('[name="Chronology Entry[Year]"]').prop("defaultValue");
  if(year == defaultYear) {
    var defaultVal = $('[name="Chronology Entry[Year Number]"]').prop("defaultValue");
    $('[name="Chronology Entry[Year Number]"]').val(defaultVal);
    return;
  }
  var ask = "/Special:Ask/-5B-5BYear::" + year + "-5D-5D";
  ask += "/-3FYear-20Number/mainlabel%3D-2D/limit%3D1/order%3DDESC/sort%3DYear_Number/searchlabel%3D/format%3Djson";
  var data = {};
  var year_input = $('[name="Chronology Entry[Year Number]"]');
  $.getJSON(ask, data).done(function (data) {
    var num = 1;
    for(var r in data.results) {
      var year_num = data.results[r].printouts["Year Number"][0];
      if (year_num > num) {
          num = year_num + 1;
      }
    }
    year_input.val(num);
  }).fail(function() {year_input.val(1)});
}
function sort_eras_chronologically() {
  var spans = $(this).children('span');
  /* 1700s 1800s Contemporary Derivative Post-1900 Pre-1700 Predecessor */
  $(this).append(spans[6]);
  $(this).append(spans[3]);
  $(this).append(spans[5]);
  $(this).append(spans[0]);
  $(this).append(spans[1]);
  $(this).append(spans[4]);
  $(this).append(spans[2]);
  $(spans[3]).after("<br />");
}
function set_none_to_unknown_for_enumerated_radio_buttons() {
  var input = $(this).find('input')[0];
  input.nextSibling.nodeValue="Unknown";
}
function set_none_value_for_enumerated_radio_buttons() {
  var input = $(this).find('input')[0];
  input.value = "";
}
function set_date_by_type_of_date() {
  var type_of_date = $(this).val();
  if(type_of_date == "") { $(this).val("Day"); type_of_date = "Day"; }
  var day = $(this).parents("tr").find(".dayInput");
  var month = $(this).parents("tr").find(".monthInput");
  if(type_of_date == "Day") {
    day.show();
    month.show();
  } else {
    day.val("1");
    day.hide();
    if (type_of_date == "Month") {
      month.show();
    } else {
      month.hide();
      month.val("01");
    }
  }
}
function get_date_for_title() {
  var type_of_date = $(".type_of_date").val();
  var day = $(".dayInput").val();
  var month = $(".monthInput option:selected").text();
  var year = $(".yearInput").val();
  var date = "";
  if(type_of_date == "Day") {
    date = "on " + day + " " + month + " " + year;
  } else if(type_of_date == "Month") {
    date = "in " + month + " " + year;
  } else if(type_of_date == "Year") {
    date = "in " + year;
  } else if(type_of_date == "Circa") {
    date = "Circa " + year;
  }
  return date;
}
function set_ballgame_name() {
  var championship = $(".championship").val();
  var year = $(".yearInput").val();
  if(championship) {
    $(".ballgame_name").val(championship + " " + year);
    return;
  }
  var home_team = $(".home_team").val();
  var away_team = $(".away_team").val();
  var country = $(".country").val();
  var state = $(".state").val();
  var city = $(".city").val();
  var event = "";
  if(home_team != "") {
    event = home_team;
    if(away_team != "") {
      event += " v " + away_team;
    }
  }
  if(home_team.indexOf(" ") == -1) {
    var places = [city, state, country];
    for(var i in places) {
      if(places[i] != "") {
        event += (event.length > 0 ? " " : "") + "in " + places[i];
        break;
      }
    }
  }
  var date = get_date_for_title();
  var game_number = $(".game_number").val() || '';
  if(game_number) {
    game_number = " " + game_number;
  }
  $(".ballgame_name").val(event + " " + date + game_number);
}
/* Maps... */
var show_predecessor_games = false;
var show_additional_markers = false;
var spread_markers = false;
var load_search_markers = function() {};
function set_map() {
  var elysian_fields = new google.maps.LatLng(40.749885, -74.027172);
  var lat_long = $('#lat_long').text();
  lat_long = lat_long? lat_long: $('[name$="[Coordinates]"]').val();
  if(lat_long && lat_long.indexOf("error") == -1) {
    lat_long = lat_long.split(", ");
  } else {
    lat_long = null;
  }
  var coords = lat_long? new google.maps.LatLng(parseFloat(lat_long[0]), parseFloat(lat_long[1])) : elysian_fields;
  var map = $("#map")[0];
  map.infoWindow = new google.maps.InfoWindow();
  var isBallgamesAndClubs = $(map).hasClass("map_ballgames");
  var isMapSearch = $(map).hasClass("map_search");
  map.map = new google.maps.Map(map, {
    center: isBallgamesAndClubs || isMapSearch ? null: coords,
    zoom: isBallgamesAndClubs || isMapSearch ? null : 11, // zoom bug for boroughs
    mapTypeId: 'roadmap',
    scaleControl: true,
    scaleControlOptions: { position: google.maps.ControlPosition.LEFT_BOTTOM },
    zoomControl: true,
    zoomControlOptions: {
      position: google.maps.ControlPosition.LEFT_BOTTOM
    },
  });
  if(isBallgamesAndClubs || isMapSearch) {
    google.maps.event.addListener(map.infoWindow,'closeclick',function(){
      map.infoWindow.marker = null;
    });
    google.maps.event.addListener(map.map, 'zoom_changed', function(event) {
      if(map.infoWindow.marker) {
        map.map.setCenter(map.infoWindow.marker.getPosition());
      }
    });
  }
  if(isBallgamesAndClubs) {
    map.spread_markers = spread_markers;
    createOverlay("Spread Markers Each Location", function() {
      var map = $("#map")[0];
      $.cookie('spread_markers', this.checked);
      map.spread_markers = this.checked;
      map.infoWindow.close(map.map);
      map.infoWindow.marker = null;
      filter_map_years();
    }, spread_markers);
    createOverlay("Show Predecessor Games", function() {
      show_predecessor_games = this.checked;
      $.cookie('show_predecessor_games', this.checked);
      set_map_layer();
    }, show_predecessor_games);
    createOverlay("Show Additional Markers", function() {
      var map = $("#map")[0];
      $.cookie('show_additional_markers', this.checked);
      var set = this.checked ? map.map : null;
      for(i = 0; i < map.markers.length; i++) { if(!map.marker_in_filter(map.markers[i])) { map.markers[i].setMap(set); } }
    }, show_additional_markers);
    createOverlay('<img height="25px" src="' + marker_image_url("c", "FFCC00") + '" /> = Clubs, <img height="25px" src="' + marker_image_url("•", "FF867C") + '" /> = +Games');
    set_map_layer();
  } else if($(map).hasClass("map_picker")) {
    if(!lat_long) { set_map_marker(); }
    set_map_picker();
  } else if($(map).hasClass("map_search")) {
    map.marker_in_filter = function(marker) {
      return true;
    };
    load_search_markers();
  }
}
function createOverlay(label, callback, checked) {
  this.overlayCount = (this.overlayCount ? this.overlayCount: 0) + 1;
  var name = "overlay" + this.overlayCount;
  if(callback) {
    checked = checked ? 'checked="checked"' : "";
    label = '<input type="checkbox" ' + checked + ' name="' + name + '" id="' + name + '" /><label for="' + name + '">' + label + '</label>';
  }
  var overlay = $('<div class="google_map_inlay '+ name +'" id="' + name + '">' + label + '</div>')[0];
  if(callback) {
    $(overlay).children("input").change(callback);
  }
  map.map.controls[google.maps.ControlPosition.BOTTOM_RIGHT].push(overlay);
}
//var off_save_form_for_marker_change;
function set_map_picker() {
  var map = $("#map")[0];
  map.marker = new google.maps.Marker({
    map:map.map,
    //draggable:true,
    //animation: google.maps.Animation.DROP,
    position: map.map.center
  });
  if(!map.geocoder) {
    map.geocoder = new google.maps.Geocoder();
  }
/*
  setTimeout(function(){
    var map = $("#map")[0];
    map.infoWindow.setContent("<strong>Movable marker.</strong></br >" + (map.marker_not_set_by_default?"Type address to set.":"Move to change coordinates."));
    map.infoWindow.open(map.map, map.marker);
  }, 500);
  setTimeout(function(){
    var map = $("#map")[0];
    map.infoWindow.close(map.map);
    map.map.setCenter(map.marker.getPosition());
  }, 7000);
  google.maps.event.addListener(map.map, 'zoom_changed', function(event) {
    map.map.setCenter(map.marker.getPosition());
  });
  google.maps.event.addListener(map.marker, 'mouseup', function(event) {
    $('[name$="[Coordinates]"]').val(map.marker.position.lat() + ", " + map.marker.position.lng());
    if(off_save_form_for_marker_change) { clearTimeout(off_save_form_for_marker_change); }
    setTimeout(function(){
      var map = $("#map")[0];
      map.infoWindow.close(map.map);
      map.infoWindow.setContent("<strong>Coordinates changed.</strong></br >Save the whole form to save.");
      map.infoWindow.open(map.map, map.marker);
    }, 500);
    off_save_form_for_marker_change = setTimeout(function(){
      var map = $("#map")[0];
      map.infoWindow.close(map.map);
    }, 4500);
  });
*/
}
function set_map_marker() {
  var fields = $(".country, .state, .city, .modern_address");
  set_map_marker_for_fields(fields);
}
function set_map_marker_for_pics_location() {
  var fields = $(".pics-location");
  set_map_marker_for_fields(fields);
}
function set_map_marker_for_fields(fields) {
  var address = "";
  fields.each(function() { if($(this).val()) { address = $(this).val() + ", " + address; } });
  if(address) {
    if (fields.length > 1) {
      address = address.substring(0, address.length - 2);
    }
    var map = $("#map")[0];
    if(!map.geocoder) {
      map.geocoder = new google.maps.Geocoder();
    }
    map.geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        if(map.marker) {
          map.marker.position = results[0].geometry.location;
          map.marker.setMap(map.map);
          $('[name$="[Coordinates]"]').val(map.marker.position.lat() + ", " + map.marker.position.lng());
        } else {
          map.marker_not_set_by_default = true;
        }
        var spots = results[0].address_components.length;
        map.map.setZoom(spots > 2 ? 12 : spots == 2 ? 6 : 3);
        map.map.setCenter(results[0].geometry.location);
      }
    });
  }
}
/* Maps > Markers... */
function marker_image_url(letter, color) {
  return "https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=" + encodeURI(letter + "|" + color);
}
function custom_marker_and_shadow(letter, color) {
  var pinImage = new google.maps.MarkerImage(marker_image_url(letter, color),
    new google.maps.Size(21, 34), new google.maps.Point(0,0), new google.maps.Point(10, 34));
  var pinShadow = new google.maps.MarkerImage("https://chart.apis.google.com/chart?chst=d_map_pin_shadow",
    new google.maps.Size(40, 37), new google.maps.Point(0, 0), new google.maps.Point(12, 35));
  return [pinImage, pinShadow];
}
var _orange_bullet_marker_and_shadow;
function orange_bullet_marker_and_shadow() {
  if (!_orange_bullet_marker_and_shadow) {
    _orange_bullet_marker_and_shadow = custom_marker_and_shadow("c", "FFCC00");
  }
  return _orange_bullet_marker_and_shadow;
}
function marker_click_function(map, marker, infoWindow, info_function) {
    return function() {
        infoWindow.close(map)
        infoWindow.setContent(info_function(marker));
        infoWindow.open(map, marker);
  infoWindow.marker = marker;
    };
}
function get_address_info_from_marker(marker, domain) {
  var city = "", state = "", country = "", address = "", borough = "";
  if(marker.city) {
    address = marker.city + (marker.state ? ", " + marker.state : "") + (marker.country && marker.country != "United States" ? ", " + marker.country : "");
    city = '<a target="_blank" href="' + domain + address.replace(/ /g, "_") + '">' + marker.city + '</a>';
  }
  if(marker.borough) {
    address = marker.borough;
    borough = '<a target="_blank" href="' + domain + address.replace(/ /g, "_") + '">' + marker.borough + '</a>';
  }
  if(marker.state) {
    address = marker.state + (marker.country && marker.country != "United States" ? ", " + marker.country : "");
    state = '<a target="_blank" href="' + domain + address.replace(/ /g, "_") + '">' + marker.state + '</a>';
  }
  if(marker.country) {
    country = '<a target="_blank" href="' + domain + marker.country.replace(/ /g, "_") + '">' + marker.country + '</a>';
  }
  return ((city ? ", " + city : "") + (state ? ", " + state : "") + (country ? ", " + country : "")).replace(/^, /, "");
}
function ballgames_info(marker, domain) {
  var map = $("#map")[0];
  var domain = "https://" + document.domain + "/";
  var address = get_address_info_from_marker(marker, domain);
  var infoHtml = "";
  if(map.spread_markers || !marker.markers || marker.markers.length == 1) {
    infoHtml = '<strong><a target="_blank" href="' + domain + marker.title.replace(/ /g, "_") + '">' + marker.title + '</a></strong><br>';
    if(marker.source_type == "Club") {
      infoHtml += marker.date + "<br>";
    }
    infoHtml += address + "<br>";
    if(marker.modern_address) {
      infoHtml += marker.modern_address + "<br>";
    }
    if(marker.borough) {
      infoHtml += marker.borough + "<br>";
    }
    if(marker.source_type != "Club") {
      infoHtml += marker.info + "<br>";
    }
    if(marker.digger) {
      infoHtml += "Found by " + '<a target="_blank" href="' + domain + marker.digger.replace(/ /g, "_") + '">' + marker.digger + "</a><br>";
    }
    return infoHtml;
  } else {
    infoHtml = '<strong>' + address + '</strong><br>';
    infoHtml += marker.thingsTitle;
    infoHtml += "<br>";
    var things = [marker.clubs, marker.games];
    if(show_predecessor_games) { things.push(marker.predecessors) }
    for(var i in things) {
      for(var j in things[i]) {
        var thing = things[i][j];
        infoHtml += '<a target="_blank" href="' + domain + thing.title.replace(/ /g, "_") + '">' + thing.title + '</a>'
        infoHtml += (things[i] == marker.clubs) ? " est. " + thing.year : "";
        infoHtml += '<br>';
        if(thing.digger) {
          infoHtml += "&nbsp;Found by " + '<a target="_blank" href="' + domain + thing.digger.replace(/ /g, "_") + '">' + thing.digger + "</a><br>";
        }
      }
    }
    return infoHtml;
  }
}
/* ...Maps > Markers */
function spiral_coords(lat_long, i, zoom) {
  if(i <= 1) return lat_long;
    var angle = Math.sqrt(i);
  var a = 0;
  var b = 500;
  var r = 0.000002;
    var x = lat_long[1] + (r * (a + (b * angle)) * Math.cos(angle * 3));
    var y = lat_long[0] + (r * .8 * (a + (b * angle)) * Math.sin(angle * 3));
  return [y, x];
}
function set_map_layer() {
  var map = $("#map")[0];
  var classes = $(map).attr("class").split(" ");
  var map_types = [];
  for(var i in classes) {
    if(classes[i].indexOf("map") == 0) {
      map_types[map_types.length] = classes[i].substring("map_".length);
    }
  }
  var filter = '';
  map.filters = {};
  map.marker_in_filter = function(marker) {
    var pos = marker.getPosition();
    if(isNaN(pos.lat()) || isNaN(pos.lng())) {
      console.log('bad lat or lng', marker);
      return false;
    }
    for(var filter in map.filters) {
      if(!(map.filters[filter] == marker[filter] || (marker[filter] && map.filters[filter] == '+'))) {
        return false;
      }
    }
    var isPred = marker.source_type == "Predecessor Game";
    if(show_predecessor_games && !isPred) {
      return false;
    }
    if(!show_predecessor_games && isPred) {
      return false;
    }
    return true;
  };
  var filters = ['Country', 'State', 'Borough', 'City'];
  for(var i in filters) {
    var text = $("#" + filters[i]).text();
    if (!text) { continue; }
    map.filters[filters[i].toLowerCase()] = text;
  }
  ballgamesDataHandler(gamesAndClubs);
}
function ballgamesDataHandler(d) {
  var map = $("#map")[0];
  var zoom = map.map.getZoom();
  var reset = !!map.markers;
  if(reset) {
    for(var i in map.markers) {
      map.markers[i].setMap(null);
    }
    map.years = null;
  }
  if(map.infoWindow) map.infoWindow.marker = null;
  map.markers = [];
  var location_markers = {};
  for (var i = 0; i < d.length; i++) {
    var row = d[i];
    var location = row["Location"];
    var lat_long = location.split(" ");
    lat_long[0] = parseFloat(lat_long[0]);
    lat_long[1] = parseFloat(lat_long[1]);
    if(!(location in location_markers)) {
      location_markers[location] = [];
    }
    var spiral_number = location_markers[location].length + 1;
    var spiral_lat_long = spiral_coords(lat_long, spiral_number, zoom);
    var date = row["Date"];
    var year = date ? parseInt(date.substring(date.length - 5)) : "";
    var marker = new google.maps.Marker({
      lat_long: lat_long,
      location: location,
      spiral_number: spiral_number,
      spiral_zoom: zoom,
      position: new google.maps.LatLng(spiral_lat_long[0], spiral_lat_long[1]),
      title: row["Title"],
      date: date,
      year: year,
      city: row["City"],
      borough: row["Borough"],
      state: row["State"],
      country: row["Country"],
      info: row["Info"],
      source_type: row["Type"],
      modern_address: row["Modern Address"],
      digger: row["Digger"],
    });
    if(marker.source_type == "Club") {
      marker.set('icon', orange_bullet_marker_and_shadow()[0]);
      marker.set('shadow', orange_bullet_marker_and_shadow()[1]);
    }
    location_markers[location].push(marker);
    if(map.spread_markers || location_markers[location].length == 1) {
      var set = show_additional_markers || map.marker_in_filter(marker) ? map.map : null;
      marker.setMap(set);
    }
    if(year && map.marker_in_filter(marker)) {
      if(!map.years) {
        map.years = [year, year];
      } else {
        map.years = [Math.min(map.years[0], year), Math.max(map.years[1], year)];
      }
    }
    map.markers.push(marker);
    var click_function = marker_click_function(map.map, marker, map.infoWindow, ballgames_info);
    google.maps.event.addListener(marker, 'click', click_function);
  }
  if(map.years) {
    map.base_years = [map.years[0], map.years[1]];
    map.filter_years = [map.years[0], map.years[1]];
    set_map_boundries();
    if(reset && $("#slider")[0].is_setup) { slider_reset(); } else { slider_setup(); }
    set_marker_markers(location_markers);
  }
}
function set_map_boundries() {
  var map = $("#map")[0];
  var bounds = new google.maps.LatLngBounds();
  var some_bounds = false;
  for(var i in map.markers) {
    if(!map.marker_in_filter(map.markers[i])) continue;
    bounds.extend(map.markers[i].getPosition());
    some_bounds = true;
  }
  if (some_bounds) fitBounds(map.map, bounds);
}
function fitBounds(map, bounds) {
  if(!map.zoomListenerSet) {
    map.zoomListenerSet = true;
    google.maps.event.addListener(map, 'bounds_changed', function(event) {
      if (this.getZoom() > 13 && this.fitBoundsCall == true) {
            this.setZoom(13);
            this.fitBoundsCall = false;
      }
    });
  }
  map.fitBoundsCall = true;
  map.fitBounds(bounds);
}
function search_entries_data_handler(entries) {
  var map = $("#map")[0];
  var zoom = map.map.getZoom();
  map.markers = [];
  var location_markers = {};
  $.each(entries, function(index, entry) {
    var location = entry.coordinates;
    if(!location) {
      return;
    }
    var lat_long = location.split(" ");
    lat_long[0] = parseFloat(lat_long[0]);
    lat_long[1] = parseFloat(lat_long[1]);
    if(!(location in location_markers)) {
      location_markers[location] = [];
    }
    var spiral_number = location_markers[location].length + 1;
    var spiral_lat_long = spiral_coords(lat_long, spiral_number, zoom);
    var date = entry.date;
    var year = date ? parseInt(date.substring(0, 4)): null;
    var marker = new google.maps.Marker({
      lat_long: lat_long,
      location: location,
      spiral_number: spiral_number,
      spiral_zoom: zoom,
      position: new google.maps.LatLng(spiral_lat_long[0], spiral_lat_long[1])
    });
    if(year) {
      marker.year = year;
      marker.date = date;
    }
    marker.info_keys = [];
    $.each(entry, function(key, value) {
      marker[key] = entry[key];
      marker.info_keys.push(key);
    });
    location_markers[location].push(marker);
    if(map.spread_markers || location_markers[location].length == 1) {
      marker.setMap(map.map);
    }
    if(year) {
      if(!map.years) {
        map.years = [year, year];
      } else {
        map.years = [Math.min(map.years[0], year), Math.max(map.years[1], year)];
      }
    }
    map.markers.push(marker);
    var click_function = marker_click_function(map.map, marker, map.infoWindow, search_entry_info);
    google.maps.event.addListener(marker, 'click', click_function);
  });
  if(map.years) {
    map.base_years = [map.years[0], map.years[1]];
    map.filter_years = [map.years[0], map.years[1]];
    set_map_boundries();
    slider_setup();
    set_marker_markers(location_markers);
  }
}
function search_entry_info(marker) {
  var map = $("#map")[0];
  var domain = "https://" + document.domain + "/";
  var address = get_address_info_from_marker(marker, domain);
  var infoHtml = "";
  if(map.spread_markers || !marker.markers || marker.markers.length == 1) {
    infoHtml = '<strong><a target="_blank" href="' + domain + marker.title.replace(/ /g, "_") + '">' + (marker.title_text || marker.title) + '</a></strong><br>';
    if(marker.source_type == "Club") {
      infoHtml += marker.date + "<br>";
    }
    infoHtml += address + "<br>";
    if(marker.modern_address) {
      infoHtml += marker.modern_address + "<br>";
    }
    if(marker.borough) {
      infoHtml += marker.borough + "<br>";
    }
    $.each(marker.info_keys, function(index, key) {
      if(['title', 'city', 'borough', 'state', 'country', 'name', 'coordinates', 'source_type'].indexOf(key) == -1) {
        infoHtml += key + ": " + marker[key].substring(0,40) + (marker[key].length > 40 ? "..." : "") + "<br>";
      }
    })
    if(marker.digger) {
      infoHtml += "Found by " + '<a target="_blank" href="' + domain + marker.digger.replace(/ /g, "_") + '">' + marker.digger + "</a><br>";
    }
    return infoHtml;
  } else {
    infoHtml = '<strong>' + address + '</strong><br>';
    infoHtml += marker.thingsTitle;
    infoHtml += "<br>";
    var things = [marker.clubs, marker.games, marker.others];
    for(var i in things) {
      for(var j in things[i]) {
        var thing = things[i][j];
        infoHtml += '<a target="_blank" href="' + domain + thing.title.replace(/ /g, "_") + '">' + (thing.title_text || thing.title) + '</a>'
        infoHtml += (things[i] == marker.clubs) ? " est. " + thing.year : "";
        infoHtml += '<br>';
        if(thing.digger) {
          infoHtml += "&nbsp;Found by " + '<a target="_blank" href="' + domain + thing.digger.replace(/ /g, "_") + '">' + thing.digger + "</a><br>";
        }
      }
    }
    return infoHtml;
  }
}
function set_map_trigger(script) {
  this.scripts = this.scripts || {};
  this.scripts[script] = true;
  if (Object.keys(this.scripts).length == 3) {
    set_map();
  }
}
if($('#map').length > 0) {
  $.getScript('https://maps.googleapis.com/maps/api/js?sensor=false&async=2&key=' + google_api_key, function() {
    set_map_trigger('googleapis');
  });
  $.ajax({
    dataType: "json",
    url: '/games_and_clubs.json',
    cache: true,
    beforeSend: function(xhr) {
      xhr.setRequestHeader('Cache-Control', 'private');
      xhr.setRequestHeader('Pragma', 'cache=yes');
    },
    success: function(data) {
      gamesAndClubs = data;
      set_map_trigger('json');
    }
  });
}
/* Maps > UI slider... */
if($('.slider, .tabs').length > 0) {
  $.getScript('/jquery-ui/js/jquery-ui-1.8.23.custom.min.js', ui_setup);
}
function ui_setup() {
  $('.tabs').each(function() { $(this).tabs(); $(this).removeClass("ui-widget ui-widget-content"); $(this).find(".scrollable").removeClass("ui-widget-content"); });
  slider_setup();
}
function slider_setup() {
  if($("#map").length > 0 && $("#map")[0].years && $("#slider").slider && $("#slider").length > 0 && !$("#slider")[0].is_setup) {
    var map = $("#map")[0];
    $('<div id="slider-one-year" class="slider" style="display: none"></div>').insertAfter("#slider");
    $("#slider").slider({
      range: true,
      min: map.years[0],
      max: map.years[1],
      values: map.years,
      change: function( event, ui ) {
        map.years = [parseInt(ui.values[0]), parseInt(ui.values[1])];
      },
      slide: function( event, ui ) {
        var slider = $("#slider")[0];
        if(event) {
          var old_values = map.years;
          map.years = [parseInt(ui.values[0]), parseInt(ui.values[1])];
          if(slider.mode && slider.mode == "freeze_ranges") {
            var old_diff = old_values[1] - old_values[0];
            var new_diff = map.years[1] - map.years[0];
            if(old_diff != new_diff) {
              var index = (old_values[0] == map.years[0]) ? 0 : 1;
              var value = index == 0 ? Math.max(map.years[1] - old_diff, map.base_years[0]) : Math.min(map.years[0] + old_diff, map.base_years[1]);
              map.years[index] = value;
              $(slider).slider("values", index, value);
            }
          }
        } else if (slider.mode && slider.mode == "freeze_ranges") {
          if(map.years[0] == map.base_years[0] && map.years[1] == map.base_years[1]) {
            map.years[1] = Math.min(map.years[1], map.years[0] + 1);
            $(slider).slider("values", 1, map.years[1]);
          }
        }
        set_slider_text(map.years);
        map.filter_years = map.years;
        filter_map_years();
      }
    });
    $("#slider-one-year").slider({
      min: map.years[0],
      max: map.years[1],
      value: map.years[0],
      slide: function( event, ui ) {
        if(event) {
          map.year = parseInt(ui.value);
        } else if(!map.year) {
          map.year = map.years[0];
          $("#slider-one-year").slider("value", map.year);
        }
        set_slider_text([map.year]);
        map.filter_years = [map.year, map.year];
        filter_map_years();
      }
    });
    $("#slider")[0].is_setup = true;
    set_slider_text(map.years);
    $('<div class="slider_opts"><input type="radio" name="slider_group" value="standard" id="standard_slide" checked="checked" /> Standard  <input type="radio" name="slider_group" value="freeze_ranges" id="freeze_slide" /> Freeze Range <input type="radio" name="slider_group" value="one_year" id="one_year_slide" /> One Year At a Time</div>').insertBefore("#slider-values");
    $("#standard_slide, #freeze_slide").click(function() { var slider = $("#slider"); slider[0].mode = $(this).val(); $("#slider-one-year").hide(); slider.show(); slider.slider('option', 'slide').call(slider); });
    $("#one_year_slide").click(function() { var slider = $("#slider-one-year"); $("#slider").hide(); slider.show(); slider.slider('option', 'slide').call(slider); });
  }
}
function slider_reset() {
  var map = $("#map")[0];
  map.year = map.years[0];
  $("#slider, #slider-one-year").slider("option", "min", map.years[0] );
  $("#slider, #slider-one-year").slider("option", "max", map.years[1] );
  map.years = map.prev_years ? map.prev_years : map.years;
  map.year = map.prev_year ? map.prev_year : map.year;
  map.prev_years = $("#slider").slider("option", "values");
  map.prev_year = $("#slider-one-year").slider("option", "value");
  $("#slider").slider("option", "values", map.years);
  $("#slider-one-year").slider("option", "value", map.year);
  set_slider_text($("#one_year_slide")[0].checked ? [map.years[0]] : map.years);
}
function year_link(year, back_or_forwards, displayed, left_or_right) {
  back_or_forwards = displayed ? back_or_forwards : "nowhere";
  return '<a href="#" id="move_map_' + year + '_' + back_or_forwards + '" class="move_map_year"' + (displayed?'':' style="color:white;"') + '><i class="icon-chevron-' + left_or_right + '"></i></a>';
}
function set_slider_text(years) {
  var map = $("#map")[0];
  var label = years.length > 1 ? "Years: " : "Year: ";
  var link = "";
  var range_mode = years.length == 2;
  var frozen_range_mode = range_mode && $("#slider")[0].mode == "freeze_ranges";
  for(var i in years) {
    var handle = years.length == 1 ? "year" : "year" + i;
    var show_left_link = years[i] > map.base_years[0] && (!range_mode || !(i == 1 && years[0] == years[1])) && (!frozen_range_mode || i == 0);
    var show_right_link = years[i] < map.base_years[1] && (!range_mode || !(i == 0 && years[0] == years[1])) && (!frozen_range_mode || i == 1);
    if(i == 1) {
      link += " - ";
    }
    link += year_link(handle, "back", show_left_link, "left");
    link += ' ' + years[i] + ' ';
    link += year_link(handle, "forward", show_right_link, "right");
  }
  $("#slider-values").html(label + link);
  $(".move_map_year").click(adjust_map_by_one);
}
function adjust_map_by_one() {
  var map = $("#map")[0];
  var info = this.id.split("_");
  var handle = info[2];
  var move = info[3];
  if(move == "nowhere") return false;
  var slider;
  if(handle == "year") {
    map.year += move == "forward" ? 1: -1;
    slider = $("#slider-one-year");
    slider.slider("value", map.year);
  } else {
    slider = $("#slider");
    if(slider[0].mode == "freeze_ranges") {
      map.years[0] += move == "forward" ? 1: -1;
      map.years[1] += move == "forward" ? 1: -1;
    } else {
      var i = parseInt(handle.substr(4));
      map.years[i] += move == "forward" ? 1: -1;
    }
    slider.slider("values", map.years);
  }
  slider.slider('option', 'slide').call(slider);
  return false;
}
function filter_map_years() {
  var map = $("#map")[0];
  var zoom = map.map.getZoom();
  var location_markers = {};
  for(var i in map.markers) {
    var marker = map.markers[i];
    var on = false;
    var reset = false;
    if(marker.year) {
      // allow for markers beyond filter years to show when the range is at the extreme points
      if((map.base_years[0] == map.filter_years[0] || marker.year >= map.filter_years[0]) && (map.base_years[1] == map.filter_years[1] || marker.year <= map.filter_years[1])) {
        var location = marker.location;
        if(!(location in location_markers)) {
          location_markers[location] = [];
        }
        location_markers[location].push(marker);
        var location_count = location_markers[location].length;
        if(map.spread_markers || location_count == 1) {
          on = true;
          if(marker.spiral_number != location_markers[location].length || marker.spiral_zoom != zoom) {
            var spiral_lat_long = spiral_coords(marker.lat_long, location_count, zoom);
            marker.position = new google.maps.LatLng(spiral_lat_long[0], spiral_lat_long[1]);
            marker.spiral_number = location_count;
            marker.spiral_zoom = zoom;
            reset = true;
            if(marker.source_type == "Club") {
              marker.set('icon', orange_bullet_marker_and_shadow()[0]);
              marker.set('shadow', orange_bullet_marker_and_shadow()[1]);
            }
          }
        }
      }
    }
    if(on && (!marker.map || reset)) {
      var set = show_additional_markers || map.marker_in_filter(marker) ? map.map : null;
      marker.setMap(set);
    } else if(!on) {
      marker.setMap(null);
    }
  }
  set_marker_markers(location_markers);
}
function set_marker_markers(location_markers) {
  for(var location in location_markers) {
    var marker = location_markers[location][0];
    marker.markers = location_markers[location];
    if(marker.markers.length > 1) {
      marker.clubs = [];
      marker.games = [];
      marker.predecessors = [];
      marker.others = [];
      for(var i in marker.markers) {
        var thing = (marker.markers[i].source_type == "Club") ? marker.clubs
        : (marker.markers[i].source_type == "Ballgame") ? marker.games
        : (marker.markers[i].source_type == "Predecessor Game") ? marker.predecessors
        : marker.others;
        thing.push(marker.markers[i]);
      }
      marker.thingsTitle = "";
      if(marker.clubs.length > 0) {
        marker.thingsTitle += marker.clubs.length + " club" + (marker.clubs.length > 1?"s":"");
        if(marker.games.length == 0) {
          marker.set('icon', orange_bullet_marker_and_shadow()[0]);
          marker.set('shadow', orange_bullet_marker_and_shadow()[1]);
        }
      }
      if(marker.games.length > 0) {
        if(marker.thingsTitle) { marker.thingsTitle += (show_predecessor_games && marker.predecessors.length > 0) ? ", " : " and "; }
        marker.thingsTitle += marker.games.length + " ballgame" + (marker.games.length > 1?"s":"");
        marker.set('icon', null);
        marker.set('shadow', null); 
      }
      if(show_predecessor_games && marker.predecessors.length > 0) {
        if(marker.thingsTitle) { marker.thingsTitle += marker.thingsTitle.indexOf(",") > -1 ? ", and " : " and " }
        marker.thingsTitle += marker.predecessors.length + " predecessor game" + (marker.predecessors.length > 1?"s":"");
      }
      if(marker.others.length > 0) {
        if(marker.thingsTitle) { marker.thingsTitle += marker.thingsTitle.indexOf(",") > -1 ? ", and " : " and " }
        marker.thingsTitle += marker.others.length + " other" + (marker.others.length > 1?"s":"");
      }
      var address = marker.city + (marker.state ? ", " + marker.state : "") + (marker.country && marker.country != "United States" ? ", " + marker.country : "");
      if(marker.ee) { marker.ee.title = address + ": " + marker.thingsTitle; }
    } else {
      if(marker.ee) { marker.ee.title = marker.title; }
    }
    if(map.infoWindow.marker == marker) {
      map.infoWindow.close();
      map.infoWindow.marker = null;
    }
  }
}
/* ...Maps > slider UI */
/* ...Maps */
function tinymce_loaded() {
  if(!(is_admin || is_block_editor)) {
    setTimeout(function() {
        $("[name=Block\\[Title\\]").parents("form").find("textarea:not([name*=Comment]):not([name*=Query])").each(function() { var body = tinyMCE.get($(this).attr("id")).getBody();
  body.setAttribute('contenteditable', false);
  body.style.backgroundColor = "#eee";
});
        }, 100);
  }
}
var tinymce_changed_func = function(inst) {}
function tinymce_changed(inst) { tinymce_changed_func(inst); }
function listen_for_free_text() {
  var has = $('[name="Chronology Entry[Has Supplemental Text][value]"], [name="Game[Has Supplemental Text][value]"], [name="Club[Has Supplemental Text][value]"]')[0];
  tinymce_changed_func = function(inst) {
    if(inst.id == "sf_free_text") {
      var body = inst.getBody();
      text = tinymce.trim(body.innerText || body.textContent);
      has.checked = text.length > 0;
    }
  }
}
function setAutocompleteUsingMapValues() {
  if (!gamesAndClubs.length || !$ || !$.ui || !$.ui.autocomplete) {
    setTimeout(function() {
      setAutocompleteUsingMapValues();
    }, 100);
    return;
  }
  var city = new ClassProp("city", "City");
  var borough = new ClassProp("borough", "Borough");
  var state = new ClassProp("state", "State");
  var home_away = new ClassProp("home_team, .away_team", "Title");
  var field = new ClassProp("field", "Title");
  set_autocomplete(state);
  $(".state").change(function() {
    var stateInput = $(".state");
    var stateVal = stateInput.val();
    var stateFilter = !stateVal ? null : function(thing) {
      return thing["State"] == stateVal;
    }
    set_autocomplete(city, stateFilter);
    set_autocomplete(borough, stateFilter);
  }).change();
  set_autocomplete(home_away, function(thing) {
    return thing["Type"] == "Club";
  });
  //$(".city").change(function(){set_autocomplete(field, [city, state], "[[Category:" + "Fields]]")}).change();
}
function titleExistsCheck(title, callback) {
  api.get({action: "query", titles: [title]}).then(
  function(result) {
    callback(!result.query.pages[-1]);
  });
}
function notifyOnDupTitle(namespace, elem) {
  elem = elem || this;
  if(!$("#dupTitleNotification").length) {
    $(elem).closest("td").append("<div id='dupTitleNotification' style='display: none'>Title already exists!</div>");
    return;
  }
  if(elem.defaultValue == elem.value) {
    $("#dupTitleNotification").hide();
    return;
  }
  namespace = namespace || '';
  titleExistsCheck(namespace + elem.value, function(exists) {
    if (exists) {
      $("#dupTitleNotification").show();
    } else {
      $("#dupTitleNotification").hide();
    }
  });
}
function notifyOnProtoPixDupTitle() {
  notifyOnDupTitle('ProtoPix:', this);
}
function getProtoPixTitleFromImageUpload() {
  var titleField = $(".proto_pix_title");
  if (!titleField || titleField.val()) {
    return;
  }
  var fileName = $(".proto_pix_image").val();
  var extIndex = fileName.lastIndexOf(".");
  fileName = fileName.substring(0, extIndex);
  fileName = fileName.replace(/(_|\-|\.)/g, ' ');
  titleField.val(fileName);
}


function formPrep() {
function formPrep() {
api = new mw.Api();
  if(wgPageName.indexOf("Special:FormEdit") > -1 || wgAction.indexOf("formedit") > -1) {
  if(wgPageName.indexOf("Special:FormEdit") > -1 || wgAction.indexOf("formedit") > -1) {
function copy_year_to_year_date() {
  $('.allow_new .checkboxesSpan').each(add_new_input);
var val = $('[name="Chronology Entry[Year]"]').val();
  $('.set_none_to_unknown_for_enumerated_radio_buttons .radioButtonSpan').each(set_none_to_unknown_for_enumerated_radio_buttons);
$('[name="Chronology Entry[Date][year]"]').val(val);
  $('.set_none_value_for_enumerated_radio_buttons .radioButtonSpan').each(set_none_value_for_enumerated_radio_buttons);
}
 
$(function () {
  /* for Chronology */
$('[name="Chronology Entry[Year]"]').keyup(copy_year_to_year_date).change(copy_year_to_year_date);
  $('.salience').each(set_salience_names);
});
  $('[name="Chronology Entry[Year]"]').change(populate_chron_year_number);
 
  /* for Games */
  $('.sort_eras_chronologically .checkboxesSpan').each(sort_eras_chronologically);
 
  /* for Diggers */
  $('[name="Digger Activity[Digger Activity Date][day]"]').each(default_to_one_and_hide);
 
  /* for Ballgames... */
  $(".type_of_date").change(set_date_by_type_of_date).change();
  $(".ballgame_name").parents("form").submit(set_ballgame_name);
  $($('.image-upload').get().reverse()).each(function(i) { if(i && !$(this).val()) {$(this).closest('tr').hide();} else { $(this).change() }});
  $('.image-upload').change(function() { if($(this).val()) { $(this).closest('tr').next().find('.image-upload').closest('tr').show(); } });
 
  setAutocompleteUsingMapValues();
  $(".country, .state, .city, .modern_address").change(set_map_marker);
  /* ...Ballgames */
 
  /* ProtoPix */
  $(".pics-location").change(set_map_marker_for_pics_location);
  $(".notify_on_proto_pix_dup_title").change(notifyOnProtoPixDupTitle).change();
  $(".proto_pix_image").change(getProtoPixTitleFromImageUpload);
  /* ...ProtoPix */
 
  /* Editors... */
  if(wgAction.indexOf("formedit") > -1) {
    $('textarea.wikiEditor_on_edit').attr('class','wikiEditor');
  }
 
  if($('textarea.wikiEditor').length > 0) {
    $(function(){mw.loader.using("ext.semanticforms.wikieditor",function(){$('textarea.wikiEditor').SemanticForms_registerInputInit(window.ext.wikieditor.init, null);});});
  }
 
  $('[name="Chronology Entry[Has Supplemental Text][value]"], [name="Game[Has Supplemental Text][value]"], [name="Club[Has Supplemental Text][value]"]').each(listen_for_free_text);
 
  if($('textarea.tinymce').length == 0) return;
  $.getScript("/tinymce/jscripts/tiny_mce/jquery.tinymce.js", function() {
    $('textarea.tinymce').each(function() {
      var id = this.id;
      var opts = {
        // Location of TinyMCE script
        script_url : '/tinymce/jscripts/tiny_mce/tiny_mce.js',
 
        // General options
        theme : "advanced",
        plugins : "pagebreak,style,layer,save,advhr,advimage,advlink,iespell,inlinepopups,insertdatetime,preview,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,table,spellchecker,heading",
 
        // Theme options
        theme_advanced_buttons1 : "spellchecker,|,tablecontrols" + ($(this).hasClass("with_headings") ? ",|,h2,h3,h4" : ""),
        theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,undo,redo,|,hr,nonbreaking,removeformat,visualaid,|,sub,sup,|,charmap,iespell,advhr,|,fullscreen",
        theme_advanced_buttons3 : "bold,italic,underline,strikethrough,|,bullist,numlist,|,link,unlink,|,outdent,indent,blockquote,|justifyleft,justifycenter,justifyright,justifyfull,|,cleanup,help,code" ,
 
        theme_advanced_toolbar_location : "top",
        theme_advanced_toolbar_align : "left",
        theme_advanced_statusbar_location : "bottom",
        theme_advanced_resizing : true,
        theme_advanced_path : false,
        spellchecker_languages : "+English=en",
        heading_clear_tag : "p",
        extended_valid_elements: "ref,references",
 
        content_css : "/tinymce/css/custom_content.css",
        theme_advanced_font_sizes: "10px,12px,13px,14px,16px,18px,20px",
        font_size_style_values : "10px,12px,13px,14px,16px,18px,20px",
 
        width: "600",
        oninit : "tinymce_loaded",
        onchange_callback : "tinymce_changed",
        gecko_spellcheck : true
      };
      if($(this).hasClass("simple")) {
        delete opts["theme_advanced_buttons2"];
        delete opts["theme_advanced_buttons3"];
        opts["theme_advanced_buttons1"] = "bold,italic,underline,|,sub,sup,|,link,unlink,|,spellchecker,|,cleanup,help,code";
      }


        $.getScript("/tinymce/jscripts/tiny_mce/jquery.tinymce.js", function() { $('textarea.tinymce').tinymce({
      $(this).tinymce(opts);
                // Location of TinyMCE script
    });
                script_url : '/tinymce/jscripts/tiny_mce/tiny_mce.js',
  });
  /* ...Editors */
}
}


                // General options
$('.field_me').replaceWith(function(){ return '<input type="hidden" name="' + $(this).data('name') + '" value="' + $(this).data('value') + '" />'; });
                theme : "advanced",
                plugins : "pagebreak,style,layer,save,advhr,advimage,advlink,iespell,inlinepopups,insertdatetime,preview,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template",


                // Theme options
$(".subnav_list_box a").each(function() { if(!this.href){ $(this).attr("href", "#"); $(this).click(function() { $(".subnav_list_items").toggle();  $(".subnav_add_items").hide(); return false; }) } });
                theme_advanced_buttons1 : "justifyleft,justifycenter,justifyright,justifyfull,|,hr,nonbreaking,removeformat,visualaid,|,sub,sup,|,charmap,iespell,advhr,|,fullscreen",
$(".subnav_add_box a").each(function() { if(!this.href){ $(this).attr("href", "#"); $(this).click(function() { $(".subnav_add_items").toggle(); $(".subnav_list_items").hide(); return false; }) } });
                theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,insertdate,inserttime,preview",
                theme_advanced_buttons3 : "bold,italic,underline,strikethrough,|,link,unlink,anchor,cleanup,help,code" ,
                theme_advanced_toolbar_location : "top",
                theme_advanced_toolbar_align : "left",
                theme_advanced_statusbar_location : "bottom",
                theme_advanced_resizing : true,


                content_css : "/tinymce/css/custom_content.css",
function changeEditLinksToTopLinks() {
                theme_advanced_font_sizes: "10px,12px,13px,14px,16px,18px,20px",
if(wgPageName.indexOf("List_of_Diggers") > -1) {
                font_size_style_values : "10px,12px,13px,14px,16px,18px,20px",
  $(".editsection a").attr("href", "#top").text("↑ top");
        })});
  }
  }
}
}


addOnloadHook(formPrep);
// have searches use a get so the url can be shared
$('#sfForm[action="/Special:RunQuery/Chronology_Search"]').each(function(){this.method = "get";});
 
// runquery results don't use parser functions except for within the ask call
// so, we hide the header listings
// then reveal only the lines with any values
$(".hide_unless_span_content").each(function() {
  var text = $(this).children('span').text()
  if(text.length > 0 && text != "No") {
    $(this).show();
    if(text == "Yes") {
      $(this).children('span').hide();
    }
  }
});
 
var scroll_height = 0;
$(".scrollable").each(function() {
  if(!scroll_height) {
    scroll_height = $(window).height() - $(this).offset().top - 60;
  }
  $(this).css('height', scroll_height);
  $(this).css('overflow', "auto");
});
 
$('#searchform').append($("<input type='button' id='enhancedSearchButton' value='Enhanced'>").click(function() {window.location="/Special:EnhancedSearch?text=" + $('#searchInput').val(); return false;}))
 
$('.tip_link a').attr("target","_blank");
 
$('.stats').each(function() { $(this).find("td:not(:hidden):last").addClass("table_turner_container").append('<a href="" class="table_turner"><i class="icon-cut"></i></a>'); });
$(".table_turner").click(function() { turn_table($(this).parents(".stats")); return false; })
var chron_re = /^\d+.?\.\d+$/;
turn_table = function(table) {
  var offset = table.offset();
  var div = $('<div id="turned" style="position: absolute; z-index: 10; top: ' + Math.round(offset.top) + 'px; width: 400px; left: ' + (offset.left + Math.round(table.width()/2) - 200) + 'px"><a id="close_entry" href="#" style="font-size: 30px; display: block; text-align: right; position: relative; left: 1em;"><i class="icon-remove-circle"></i></a><iframe id="turned_list" style="height: 300px; width: 380px; background-color: white;" src="about:blank"></iframe></div>');
  $("body").append(div);
  var merge = function() {
    var inner = div.children("iframe").contents().find('body');
    var title = $("#firstHeading").text();
    inner.append($('<a target="_blank" href="' + window.location.href + '">' + window.location.href + '</a><br /><br />'));
    inner.append($('<b><a target="_blank" href="/' + title + '">' + (chron_re.test(title) ? "Protoball Chronology #" : "") + title + '</a></b><br /><br />'));
    var subtitle = $(".subtitle").text();
    if(subtitle) { inner.append($('<b>' + $(".subtitle").text() + '</b><br /><br />')); }
    var rows = table.find("tr:not(:hidden)");
    for(var i = 0; i < rows.length; i++) {
      var td = $(rows[i]).find("td");
      var text = td.html();
      var isPara = td.find("p").length > 0;
      var isCommentOrQuery = td.children().eq(0).prop("tagName") == "I";
      if(isCommentOrQuery) {
        continue;
      }
      inner.append($('<b>' + $(rows[i]).find("th").html()  + '</b>' + (isPara ? "" : '<br />') + text +  (isPara ? "" : '<br /><br />')));
    }
    inner.find(".hidden").remove();
    inner.find("i").filter(function(i, e) {return $(e).text().substr(0,4) == "Edit";}).remove();
  }
  setTimeout(merge, 500);
  div.find(".admin").remove(); 
  $("#close_entry").click(function() { $("#turned").remove(); return false; }); return false;
}
var pull_toggle_a = $("<a href='#' id='pull_toggle'>show</a>");
pull_toggle_a.click(function() { var text = $(this).text(); text = text == "show" ? "hide" : "show"; $(this).text(text); $(".pull_list").toggle(); if(text == "hide") {$("#pull_entry").empty();} return false; });
$(".pull_list_container span").append("[", pull_toggle_a, "]").addClass("toctoggle");
$(".pull_list").after('<div style="position:absolute; margin: 1em auto;" id="pull_entry"></div>');
$(".pull_list a").each(function() { this.entry_title = this.title; this.title ="Click to see entry"; $(this).click(function() { var entry = $(".chron_entry_side_text a[title='" + this.entry_title + "']").parents(".chron_entry_wrapper_outer").get(0); entry = $(entry).clone(); var x = $("<div style='position:absolute; right: 0; z-index: 10;'><a id='close_entry' href='#' style='font-size: 30px;'><i class='icon-remove-circle'></i></a></div>"); $("#pull_entry").empty().append(x, entry); $("#close_entry").click(function() { $("#pull_entry").empty(); return false; }); return false;}); });
 
if($(".sup_text").length) {
  $("#catlinks").before('<div class="chron_back_link"></div>');
}
var chron_back_links = $(".chron_back_link");
if(chron_back_links.length) {
  var referrer = document.referrer;
  if(referrer && (referrer.indexOf("Chronology:") > -1 || referrer.indexOf("Prominent") > -1)) {
    if(referrer.indexOf("#") == -1) {
      referrer += "#" + escape(chron_back_links.text().replace(/ /g, "_")).replace(/%/g, ".").replace(/\.3A/g, ":").replace(/\.22$/, "");
    }
    chron_back_links.html('<a href="' + referrer + '">Back to Chronology Listing</a>');
  }
}
var infobox_t = $('<div class="infobox_toggle"><a href="#">Toggle Subnav</a></div>');
infobox_t.click(function() { $('.infobox').toggle(); return false; });
$('.infobox').first().parent().append(infobox_t);
 
 
var add_pages = $(".nice .icon-plus-sign");
if(add_pages.length) {
  $("#mw-panel").append($('<div class="portal"><h5>Legend</h5><div class="body"><ul><li><a href="#"><i class="icon-plus-sign" style="font-size:200%; line-height: 1.5"></i></a></li><li>Click the item&#8217;s <i class="icon-plus-sign"></i> icon to add a new page of information for the item.</li></div>'));
}
 
$("#discussion_below").each(function() {
  $("#mw-content-text").append($(this));
  $(this).show();
});
 
$('.reveal').each(function() { var $this = $(this); $this.before($('<a href="#">' + ($this.data("title") || 'Reveal') + '</a>').click(function() { $this.show(); $(this).hide(); return false; }) ) });
 
function getRandomInt (min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}
$('.pick_random').each(function() { var $this = $(this); var lis = $this.find("li"); lis.hide(); var limit = $this.data("number"); for(var i = 0; i < limit; ) { var index = getRandomInt(0,lis.length -1);  var li = $(lis[index]); if(li.css('display') == 'none') { li.show(); i++; } } }).show();
 
var is_admin = isAdmin();
var is_editor = isEditor();
var is_super_editor = isSuperEditor();
var is_block_editor = isBlockEditor();
if(is_admin || is_super_editor) {
  $(".admin, .editsection").show();
} else {
  $(".new a").each(function() { this.href += "&namespace=new" });
}
if(is_admin || wgUserName == "JKittel") {
  $(".gloss_admin").show();
}
if(is_admin || is_super_editor) {
  $(".prepro_admin").show();
}
if(is_admin || is_block_editor) {
  $(".block_admin").show();
}
var is_editor = isEditor();
if(is_admin || is_editor) {
  $(".admin").show();
} else {
  $(".editsection").hide();
}
if(!(is_admin || is_block_editor)) {
  $("[name=Block\\[Title\\]").parents("form").find("input").attr('readonly', 'readonly');
  // see also tiny_mce_loaded
}
$('table.sortable').before("<div class='sortable_table_marquee'><div>Sortable</div></div>")
function appendBallgameStats() {
var table = $('table.ballgame-table');
if (!table.length) {
return;
}
var gamesWithScores = 0;
var runs = 0;
var winningRuns = 0;
var losingRuns = 0;
var rows = table.find('tbody tr');
for(var i = 0; i < rows.length; i++) {
var score = rows.eq(i).find("td").eq(7).text();
var scores = score.split(' - ');
if (scores.length < 2) {
continue;
}
gamesWithScores++;
var run1 = +scores[0];
var run2 = +scores[1];
runs += run1 + run2;
if (run1 > run2) {
winningRuns += run1;
losingRuns += run2;
} else {
winningRuns += run2;
losingRuns += run1;
}
}
if (!gamesWithScores) {
return;
}
var runsAvg100 = Math.round(100 * runs/(gamesWithScores * 2));
var winningRunsAvg100 = Math.round(100 * winningRuns/gamesWithScores);
var losingRunsAvg100 = Math.round(100 * losingRuns/gamesWithScores);
var text = " Ballgames with Scores: " + gamesWithScores;
text += ", Average Runs: " + format100(runsAvg100);
text += ", Average Winning Runs: " + format100(winningRunsAvg100);
text += ", Average Losing Runs: " + format100(losingRunsAvg100);
table.after('<div class="ballgame-table-stats">' + text + ' </div>')
}
function format100(x) {
var modulo = x % 100;
if (modulo < 10) {
modulo = '0' + modulo
}
return "" + Math.floor(x / 100) + '.' + modulo
}
appendBallgameStats();
 
function isRole(role) {
for(var i in wgUserGroups) { if(wgUserGroups[i] == role) return true; };
return false;
}
function isEditor() {
return isRole("editor");
}
function isSuperEditor() {
return isRole("supereditor");
}
function isAdmin() {
return isRole("sysop");
}
function isBlockEditor() {
return isRole("blockeditor");
}
$(function() {
  formPrep();
  changeEditLinksToTopLinks();
});
 
function embedPdf(url, id) {
  var embed = function() {
      var myPDF = new PDFObject({
      url: url,
      pdfOpenParams: { view: 'FitH' }
    }).embed(id);
  };
  if(window.PDFObject) {
    embed();
  } else {
    $.getScript('/js/pdfobject.js', embed);
  }
}
 
(function boroughColumnAdjust() {
  var boroughTables = $(".borough_header").parents("table");
  boroughTables.each(function() {
    var pos = $(this).find(".borough_header").parent().index();
    if(pos == -1) return;
    var cellsWithInfo = $(this).find("td").filter( function() { return $(this).index() == pos && $.trim($(this).text()); }).length;
    if(!cellsWithInfo) {
      $(this).find("th, td").filter( function() { return $(this).index() == pos }).hide();
    }
  });
}());

Latest revision as of 15:30, 17 July 2024

/* Any JavaScript here will be loaded for all users on every page load. */

var google_api_key = "AIzaSyCQ-YHMywKy3nlIuZy0M17Xk8yoD8bKlBw";
var gamesAndClubs = []; // from json of all games and clubs
var api; // set in formPrep()

wgPageName = mw.config.get('wgPageName')
wgAction = mw.config.get('wgAction')
wgUserName = mw.config.get('wgUserName')
wgUserGroups = mw.config.get('wgUserGroups')

$.getScript( '/js/jquery.cookie.js', onCookieLib );
function onCookieLib() {
  show_predecessor_games = $.cookie('show_predecessor_games') == "true";
  show_additional_markers = $.cookie('show_additional_markers') == "true";
  spread_markers = $.cookie('spread_markers') == "true";
  set_map_trigger('cookies');
}

function ClassProp(css_class, property) {
  this.css_class = css_class;
  this.property = property;
}

function set_autocomplete(target_info, filter) {
  var values = get_autocomplete_values(target_info.property, filter);
  var target_input = $("." + target_info.css_class);
  target_input.autocomplete({
    source: get_autocomplete_source_function(values),
    select: function(event, ui) { event.preventDefault(); $(this).val(ui.item.value); $(this).change(); } 
  });
}

function get_autocomplete_values(property, filter) {
  valueDict = {}
  for(var i = 0; i < gamesAndClubs.length; i++) {
    var thing = gamesAndClubs[i];
    if (filter && !filter(thing)) {
      continue;
    }
    valueDict[thing[property]] = true;
  }
  var values = Object.keys(valueDict);
  values.sort();
  return values;
}

function get_autocomplete_source_function(values) {
  return function(request, response) {
    var results = $.ui.autocomplete.filter(values, request.term);
    response(results.slice(0, 100));
  };
}

function parse_list(text) {
  if(text[0] == '\n') { return []; }
  return text.split("\n")[0].substring("<p>".length).split(",");
}

function api_parse(text, callback) {
  var data = {action: "parse", prop: "text", format: "json", text: text };
  $.getJSON("/api.php", data, callback);
}

function get_property_values(property, filter, callback) {
  var ask = "{{#arraydefine:array|{{#ask:" + filter + "|?" + property + "|link=none|mainlabel=-|headers=hide|limit=10000|sep=@}}|@|unique}}{{#arrayprint:array|,}}";
  api_parse(ask, callback);
}

function default_to_one_and_hide() {
  if(!$(this).val()) {
    $(this).val("1");
  }
  $(this).hide();
}

function modify_selected_values() {
  var input = $(this).parent().prev('span').children('input');
  var chk_value = this.value;
  var selected_values = input.val() ? input.val().split(/ *, */) : [];
  if(this.checked) {
    selected_values.push(this.value);
    selected_values.sort();
  } else {
    selected_values = $.grep(selected_values, function(value) { return value != chk_value; });
  }
  input.val(selected_values.join(", "));
}

function add_new_input() {
  var span = this;
  var input = $(this).children('input').first();
  var name = input.attr('name');
  var index =  "" + $(this).find('input').length - 1;
  name = name.replace("[is_list]", "[" + index + "]");
  var new_item = $('<span class="checkboxSpan"><span>&nbsp;<a href="" class="new_multi_property_link">new</a>&nbsp;</span><span style="display:none;">&nbsp;new&nbsp;<input name="' + name + '" /></span></span>');
  $(this).append(new_item);
  $(this).find(".new_multi_property_link").click(function(){ $(this).parent().parent().children('span').toggle(); return false; });
}

function set_salience_names() {
  var names = { 1: "Prominent", 2: "Noteworthy", 3: "Peripheral", 4: "Incomplete" };
  var inputs = $(this).find('input');
  for(var i = 1; i < 5; i++) {
    inputs[i].nextSibling.nodeValue = " " + names[i];
  }
}

function populate_chron_year_number() {
  var year = $('[name="Chronology Entry[Year]"]').val();
  if(!year) return;
  var defaultYear = $('[name="Chronology Entry[Year]"]').prop("defaultValue");
  if(year == defaultYear) {
    var defaultVal = $('[name="Chronology Entry[Year Number]"]').prop("defaultValue");
    $('[name="Chronology Entry[Year Number]"]').val(defaultVal);
    return;
  }
  var ask = "/Special:Ask/-5B-5BYear::" + year + "-5D-5D";
  ask += "/-3FYear-20Number/mainlabel%3D-2D/limit%3D1/order%3DDESC/sort%3DYear_Number/searchlabel%3D/format%3Djson";
  var data = {};
  var year_input = $('[name="Chronology Entry[Year Number]"]');
  $.getJSON(ask, data).done(function (data) {
    var num = 1;
    for(var r in data.results) {
       var year_num = data.results[r].printouts["Year Number"][0];
       if (year_num > num) {
           num = year_num + 1;
       }
    }
    year_input.val(num);
  }).fail(function() {year_input.val(1)});
}

function sort_eras_chronologically() {
  var spans = $(this).children('span');
  /* 1700s 1800s Contemporary Derivative Post-1900 Pre-1700 Predecessor */
  $(this).append(spans[6]);
  $(this).append(spans[3]);
  $(this).append(spans[5]);
  $(this).append(spans[0]);
  $(this).append(spans[1]);
  $(this).append(spans[4]);
  $(this).append(spans[2]);
  $(spans[3]).after("<br />");
}

function set_none_to_unknown_for_enumerated_radio_buttons() {
  var input = $(this).find('input')[0];
  input.nextSibling.nodeValue="Unknown";
}

function set_none_value_for_enumerated_radio_buttons() {
  var input = $(this).find('input')[0];
  input.value = "";
}

function set_date_by_type_of_date() {
  var type_of_date = $(this).val();
  if(type_of_date == "") { $(this).val("Day"); type_of_date = "Day"; }
  var day = $(this).parents("tr").find(".dayInput");
  var month = $(this).parents("tr").find(".monthInput");
  if(type_of_date == "Day") {
    day.show();
    month.show();
  } else {
    day.val("1");
    day.hide();
    if (type_of_date == "Month") {
      month.show();
    } else {
      month.hide();
      month.val("01");
    }
  }
}


function get_date_for_title() {
  var type_of_date = $(".type_of_date").val();
  var day = $(".dayInput").val();
  var month = $(".monthInput option:selected").text();
  var year = $(".yearInput").val();
  var date = "";
  if(type_of_date == "Day") {
    date = "on " + day + " " + month + " " + year;
  } else if(type_of_date == "Month") {
    date = "in " + month + " " + year;
  } else if(type_of_date == "Year") {
    date = "in " + year;
  } else if(type_of_date == "Circa") {
    date = "Circa " + year;
  }
  return date;
}


function set_ballgame_name() {
  var championship = $(".championship").val();
  var year = $(".yearInput").val();
  if(championship) {
    $(".ballgame_name").val(championship + " " + year);
    return;
  }
  var home_team = $(".home_team").val();
  var away_team = $(".away_team").val();
  var country = $(".country").val();
  var state = $(".state").val();
  var city = $(".city").val();
  var event = "";
  if(home_team != "") {
    event = home_team;
    if(away_team != "") {
      event += " v " + away_team;
    }
  } 
  if(home_team.indexOf(" ") == -1) {
    var places = [city, state, country];
    for(var i in places) {
      if(places[i] != "") {
        event += (event.length > 0 ? " " : "") + "in " + places[i];
        break;
      }
    }
  }

  var date = get_date_for_title();

  var game_number = $(".game_number").val() || '';
  if(game_number) {
    game_number = " " + game_number;
  }

  $(".ballgame_name").val(event + " " + date + game_number);
}

/* Maps... */
var show_predecessor_games = false;
var show_additional_markers = false;
var spread_markers = false;
var load_search_markers = function() {};

function set_map() {
  var elysian_fields = new google.maps.LatLng(40.749885, -74.027172);
  var lat_long = $('#lat_long').text();
  lat_long = lat_long? lat_long: $('[name$="[Coordinates]"]').val();
  if(lat_long && lat_long.indexOf("error") == -1) {
    lat_long = lat_long.split(", ");
  } else {
    lat_long = null;
  }
  var coords = lat_long? new google.maps.LatLng(parseFloat(lat_long[0]), parseFloat(lat_long[1])) : elysian_fields;
  var map = $("#map")[0];
  map.infoWindow = new google.maps.InfoWindow();
  var isBallgamesAndClubs = $(map).hasClass("map_ballgames");
  var isMapSearch = $(map).hasClass("map_search");
  map.map = new google.maps.Map(map, {
    center: isBallgamesAndClubs || isMapSearch ? null: coords,
    zoom: isBallgamesAndClubs || isMapSearch ? null : 11, // zoom bug for boroughs
    mapTypeId: 'roadmap',
    scaleControl: true,
    scaleControlOptions: { position: google.maps.ControlPosition.LEFT_BOTTOM },
    zoomControl: true,
    zoomControlOptions: {
      position: google.maps.ControlPosition.LEFT_BOTTOM
    },
  });
  if(isBallgamesAndClubs || isMapSearch) {
    google.maps.event.addListener(map.infoWindow,'closeclick',function(){
      map.infoWindow.marker = null;
    });

    google.maps.event.addListener(map.map, 'zoom_changed', function(event) {
      if(map.infoWindow.marker) {
        map.map.setCenter(map.infoWindow.marker.getPosition());
      }
    });
  }

  if(isBallgamesAndClubs) {
    map.spread_markers = spread_markers;

    createOverlay("Spread Markers Each Location", function() {
      var map = $("#map")[0];
      $.cookie('spread_markers', this.checked);
      map.spread_markers = this.checked;
      map.infoWindow.close(map.map);
      map.infoWindow.marker = null;
      filter_map_years();
    }, spread_markers);


    createOverlay("Show Predecessor Games", function() { 
      show_predecessor_games = this.checked;
      $.cookie('show_predecessor_games', this.checked);
      set_map_layer();
    }, show_predecessor_games);

    createOverlay("Show Additional Markers", function() {
      var map = $("#map")[0];
      $.cookie('show_additional_markers', this.checked);
      var set = this.checked ? map.map : null;
      for(i = 0; i < map.markers.length; i++) { if(!map.marker_in_filter(map.markers[i])) { map.markers[i].setMap(set); } }
    }, show_additional_markers);

    createOverlay('<img height="25px" src="' + marker_image_url("c", "FFCC00") + '" /> = Clubs, <img height="25px" src="' + marker_image_url("•", "FF867C") + '" /> = +Games');

    set_map_layer();
  } else if($(map).hasClass("map_picker")) {
    if(!lat_long) { set_map_marker(); }
    set_map_picker();
  } else if($(map).hasClass("map_search")) {
    map.marker_in_filter = function(marker) { 
      return true;
    };
    load_search_markers();
  }
}

function createOverlay(label, callback, checked) {
  this.overlayCount = (this.overlayCount ? this.overlayCount: 0) + 1;
  var name = "overlay" + this.overlayCount;
  if(callback) {
    checked = checked ? 'checked="checked"' : "";
    label = '<input type="checkbox" ' + checked + ' name="' + name + '" id="' + name + '" /><label for="' + name + '">' + label + '</label>';
  }
  var overlay = $('<div class="google_map_inlay '+ name +'" id="' + name + '">' + label + '</div>')[0];
  if(callback) {
    $(overlay).children("input").change(callback);
  }
  map.map.controls[google.maps.ControlPosition.BOTTOM_RIGHT].push(overlay);
}
//var off_save_form_for_marker_change;
function set_map_picker() {
  var map = $("#map")[0];
  map.marker = new google.maps.Marker({
    map:map.map,
    //draggable:true,
    //animation: google.maps.Animation.DROP,
    position: map.map.center
  });
  if(!map.geocoder) {
    map.geocoder = new google.maps.Geocoder();
  }
/*
  setTimeout(function(){
    var map = $("#map")[0];
    map.infoWindow.setContent("<strong>Movable marker.</strong></br >" + (map.marker_not_set_by_default?"Type address to set.":"Move to change coordinates."));
    map.infoWindow.open(map.map, map.marker);
  }, 500);
  setTimeout(function(){
    var map = $("#map")[0];
    map.infoWindow.close(map.map);
    map.map.setCenter(map.marker.getPosition());
  }, 7000);
  google.maps.event.addListener(map.map, 'zoom_changed', function(event) {
     map.map.setCenter(map.marker.getPosition());
  });
  google.maps.event.addListener(map.marker, 'mouseup', function(event) {
    $('[name$="[Coordinates]"]').val(map.marker.position.lat() + ", " + map.marker.position.lng());
    if(off_save_form_for_marker_change) { clearTimeout(off_save_form_for_marker_change); }
    setTimeout(function(){
      var map = $("#map")[0];
      map.infoWindow.close(map.map);
      map.infoWindow.setContent("<strong>Coordinates changed.</strong></br >Save the whole form to save.");
      map.infoWindow.open(map.map, map.marker);
    }, 500);
    off_save_form_for_marker_change = setTimeout(function(){
      var map = $("#map")[0];
      map.infoWindow.close(map.map);
    }, 4500);
  });
*/
}


function set_map_marker() {
  var fields = $(".country, .state, .city, .modern_address");
  set_map_marker_for_fields(fields);
}

function set_map_marker_for_pics_location() {
  var fields = $(".pics-location");
  set_map_marker_for_fields(fields);
}

function set_map_marker_for_fields(fields) {
  var address = "";
  fields.each(function() { if($(this).val()) { address = $(this).val() + ", " + address; } });
  if(address) {
    if (fields.length > 1) {
      address = address.substring(0, address.length - 2);
    }
    var map = $("#map")[0];
    if(!map.geocoder) {
      map.geocoder = new google.maps.Geocoder();
    }
    map.geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        if(map.marker) {
          map.marker.position = results[0].geometry.location;
          map.marker.setMap(map.map);
          $('[name$="[Coordinates]"]').val(map.marker.position.lat() + ", " + map.marker.position.lng());
        } else {
          map.marker_not_set_by_default = true; 
        }
        var spots = results[0].address_components.length;
        map.map.setZoom(spots > 2 ? 12 : spots == 2 ? 6 : 3);
        map.map.setCenter(results[0].geometry.location);
      }
    });
  }
}

/* Maps > Markers... */

function marker_image_url(letter, color) {
  return "https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=" + encodeURI(letter + "|" + color);
}

function custom_marker_and_shadow(letter, color) {
  var pinImage = new google.maps.MarkerImage(marker_image_url(letter, color),
    new google.maps.Size(21, 34), new google.maps.Point(0,0), new google.maps.Point(10, 34));
  var pinShadow = new google.maps.MarkerImage("https://chart.apis.google.com/chart?chst=d_map_pin_shadow",
    new google.maps.Size(40, 37), new google.maps.Point(0, 0), new google.maps.Point(12, 35));
  return [pinImage, pinShadow];
}

var _orange_bullet_marker_and_shadow;
function orange_bullet_marker_and_shadow() {
  if (!_orange_bullet_marker_and_shadow) {
    _orange_bullet_marker_and_shadow = custom_marker_and_shadow("c", "FFCC00");
  }
  return _orange_bullet_marker_and_shadow;
}

function marker_click_function(map, marker, infoWindow, info_function) {
    return function() {
        infoWindow.close(map)
        infoWindow.setContent(info_function(marker));
        infoWindow.open(map, marker);
  infoWindow.marker = marker;
    };
}

function get_address_info_from_marker(marker, domain) {
  var city = "", state = "", country = "", address = "", borough = "";
  if(marker.city) {
    address = marker.city + (marker.state ? ", " + marker.state : "") + (marker.country && marker.country != "United States" ? ", " + marker.country : "");
    city = '<a target="_blank" href="' + domain + address.replace(/ /g, "_") + '">' + marker.city + '</a>';
  }
  if(marker.borough) {
    address = marker.borough;
    borough = '<a target="_blank" href="' + domain + address.replace(/ /g, "_") + '">' + marker.borough + '</a>';
  }
  if(marker.state) {
    address = marker.state + (marker.country && marker.country != "United States" ? ", " + marker.country : "");
    state = '<a target="_blank" href="' + domain + address.replace(/ /g, "_") + '">' + marker.state + '</a>';
  }
  if(marker.country) {
    country = '<a target="_blank" href="' + domain + marker.country.replace(/ /g, "_") + '">' + marker.country + '</a>';
  }
  return ((city ? ", " + city : "") + (state ? ", " + state : "") + (country ? ", " + country : "")).replace(/^, /, "");
}

function ballgames_info(marker, domain) {
  var map = $("#map")[0];
  var domain = "https://" + document.domain + "/";
  var address = get_address_info_from_marker(marker, domain);
  var infoHtml = "";
  if(map.spread_markers || !marker.markers || marker.markers.length == 1) {
    infoHtml = '<strong><a target="_blank" href="' + domain + marker.title.replace(/ /g, "_") + '">' + marker.title + '</a></strong><br>';
    if(marker.source_type == "Club") {
      infoHtml += marker.date + "<br>";
    }
    infoHtml += address + "<br>";
    if(marker.modern_address) {
      infoHtml += marker.modern_address + "<br>";
    }
    if(marker.borough) {
      infoHtml += marker.borough + "<br>";
    }
    if(marker.source_type != "Club") {
      infoHtml += marker.info + "<br>";
    }
    if(marker.digger) {
      infoHtml += "Found by " + '<a target="_blank" href="' + domain + marker.digger.replace(/ /g, "_") + '">' + marker.digger + "</a><br>";
    }
    return infoHtml;
  } else {
    infoHtml = '<strong>' + address + '</strong><br>';
    infoHtml += marker.thingsTitle;
    infoHtml += "<br>";
    var things = [marker.clubs, marker.games];
    if(show_predecessor_games) { things.push(marker.predecessors) }
    for(var i in things) {
      for(var j in things[i]) {
        var thing = things[i][j];
        infoHtml += '<a target="_blank" href="' + domain + thing.title.replace(/ /g, "_") + '">' + thing.title + '</a>'
        infoHtml += (things[i] == marker.clubs) ? " est. " + thing.year : "";
        infoHtml += '<br>';
        if(thing.digger) {
          infoHtml += "&nbsp;Found by " + '<a target="_blank" href="' + domain + thing.digger.replace(/ /g, "_") + '">' + thing.digger + "</a><br>";
        }
      }
    }
    return infoHtml;
  }
}

/* ...Maps > Markers */

function spiral_coords(lat_long, i, zoom) {
  if(i <= 1) return lat_long;
    var angle = Math.sqrt(i);
  var a = 0;
  var b = 500;
  var r = 0.000002;
    var x = lat_long[1] + (r * (a + (b * angle)) * Math.cos(angle * 3));
    var y = lat_long[0] + (r * .8 * (a + (b * angle)) * Math.sin(angle * 3));
  return [y, x];
}


function set_map_layer() {
  var map = $("#map")[0];
  var classes = $(map).attr("class").split(" ");
  var map_types = [];
  for(var i in classes) {
    if(classes[i].indexOf("map") == 0) {
      map_types[map_types.length] = classes[i].substring("map_".length);
    }
  }
  var filter = '';
  map.filters = {};
  map.marker_in_filter = function(marker) { 
    var pos = marker.getPosition();
    if(isNaN(pos.lat()) || isNaN(pos.lng())) {
      console.log('bad lat or lng', marker);
      return false;
    }
    for(var filter in map.filters) {
      if(!(map.filters[filter] == marker[filter] || (marker[filter] && map.filters[filter] == '+'))) {
        return false;
      }
    }
    var isPred = marker.source_type == "Predecessor Game";
    if(show_predecessor_games && !isPred) {
      return false;
    }
    if(!show_predecessor_games && isPred) {
      return false;
    }
    return true;
  };

  var filters = ['Country', 'State', 'Borough', 'City'];
  for(var i in filters) {
    var text = $("#" + filters[i]).text();
    if (!text) { continue; }
    map.filters[filters[i].toLowerCase()] = text;
  }
  ballgamesDataHandler(gamesAndClubs);
}



function ballgamesDataHandler(d) {
  var map = $("#map")[0];
  var zoom = map.map.getZoom();
  var reset = !!map.markers;
  if(reset) {
    for(var i in map.markers) {
      map.markers[i].setMap(null);
    }
    map.years = null;
  }
  if(map.infoWindow) map.infoWindow.marker = null;
  map.markers = [];

  var location_markers = {};

  for (var i = 0; i < d.length; i++) {
    var row = d[i];
    var location = row["Location"];
    var lat_long = location.split(" ");
    lat_long[0] = parseFloat(lat_long[0]);
    lat_long[1] = parseFloat(lat_long[1]);
    if(!(location in location_markers)) {
      location_markers[location] = [];
    }
    var spiral_number = location_markers[location].length + 1;
    var spiral_lat_long = spiral_coords(lat_long, spiral_number, zoom);
    var date = row["Date"];
    var year = date ? parseInt(date.substring(date.length - 5)) : "";
    var marker = new google.maps.Marker({
      lat_long: lat_long,
      location: location,
      spiral_number: spiral_number,
      spiral_zoom: zoom,
      position: new google.maps.LatLng(spiral_lat_long[0], spiral_lat_long[1]),
      title: row["Title"],
      date: date,
      year: year,
      city: row["City"],
      borough: row["Borough"],
      state: row["State"],
      country: row["Country"],
      info: row["Info"],
      source_type: row["Type"],
      modern_address: row["Modern Address"],
      digger: row["Digger"],
    });
    if(marker.source_type == "Club") {
      marker.set('icon', orange_bullet_marker_and_shadow()[0]);
      marker.set('shadow', orange_bullet_marker_and_shadow()[1]);
    }
    location_markers[location].push(marker);
    if(map.spread_markers || location_markers[location].length == 1) {
      var set = show_additional_markers || map.marker_in_filter(marker) ? map.map : null; 
      marker.setMap(set);
    }
    if(year && map.marker_in_filter(marker)) {
      if(!map.years) {
        map.years = [year, year];
      } else {
        map.years = [Math.min(map.years[0], year), Math.max(map.years[1], year)];
      }
    }
    map.markers.push(marker);
    var click_function = marker_click_function(map.map, marker, map.infoWindow, ballgames_info);
    google.maps.event.addListener(marker, 'click', click_function);
  }
  if(map.years) {
    map.base_years = [map.years[0], map.years[1]];
    map.filter_years = [map.years[0], map.years[1]];
    set_map_boundries();
    if(reset && $("#slider")[0].is_setup) { slider_reset(); } else { slider_setup(); }
    set_marker_markers(location_markers);
  }
}

function set_map_boundries() {
  var map = $("#map")[0];
  var bounds = new google.maps.LatLngBounds();
  var some_bounds = false;
  for(var i in map.markers) {
    if(!map.marker_in_filter(map.markers[i])) continue;
    bounds.extend(map.markers[i].getPosition());
    some_bounds = true;
  }
  if (some_bounds) fitBounds(map.map, bounds);
}

function fitBounds(map, bounds) {
  if(!map.zoomListenerSet) {
    map.zoomListenerSet = true;
    google.maps.event.addListener(map, 'bounds_changed', function(event) {
      if (this.getZoom() > 13 && this.fitBoundsCall == true) {
            this.setZoom(13);
            this.fitBoundsCall = false;
      }
    });
  }
  map.fitBoundsCall = true;
  map.fitBounds(bounds);
}

function search_entries_data_handler(entries) {
  var map = $("#map")[0];
  var zoom = map.map.getZoom();
  map.markers = [];

  var location_markers = {};
  $.each(entries, function(index, entry) {
    var location = entry.coordinates;
    if(!location) {
      return;
    }
    var lat_long = location.split(" ");
    lat_long[0] = parseFloat(lat_long[0]);
    lat_long[1] = parseFloat(lat_long[1]);
    if(!(location in location_markers)) {
      location_markers[location] = [];
    }
    var spiral_number = location_markers[location].length + 1;
    var spiral_lat_long = spiral_coords(lat_long, spiral_number, zoom);
    var date = entry.date;
    var year = date ? parseInt(date.substring(0, 4)): null;
    var marker = new google.maps.Marker({
      lat_long: lat_long,
      location: location,
      spiral_number: spiral_number,
      spiral_zoom: zoom,
      position: new google.maps.LatLng(spiral_lat_long[0], spiral_lat_long[1])
    });
    if(year) {
      marker.year = year;
      marker.date = date;
    }
    marker.info_keys = [];
    $.each(entry, function(key, value) {
      marker[key] = entry[key];
      marker.info_keys.push(key);
    });
    location_markers[location].push(marker);
    if(map.spread_markers || location_markers[location].length == 1) {
      marker.setMap(map.map);
    }
    if(year) {
      if(!map.years) {
        map.years = [year, year];
      } else {
        map.years = [Math.min(map.years[0], year), Math.max(map.years[1], year)];
      }
    }
    map.markers.push(marker);
    var click_function = marker_click_function(map.map, marker, map.infoWindow, search_entry_info);
    google.maps.event.addListener(marker, 'click', click_function);
  });
  if(map.years) {
    map.base_years = [map.years[0], map.years[1]];
    map.filter_years = [map.years[0], map.years[1]];
    set_map_boundries();
    slider_setup(); 
    set_marker_markers(location_markers);
  }
}

function search_entry_info(marker) {
  var map = $("#map")[0];
  var domain = "https://" + document.domain + "/";
  var address = get_address_info_from_marker(marker, domain);
  var infoHtml = "";
  if(map.spread_markers || !marker.markers || marker.markers.length == 1) {
    infoHtml = '<strong><a target="_blank" href="' + domain + marker.title.replace(/ /g, "_") + '">' + (marker.title_text || marker.title) + '</a></strong><br>';
    if(marker.source_type == "Club") {
      infoHtml += marker.date + "<br>";
    }
    infoHtml += address + "<br>";
    if(marker.modern_address) {
      infoHtml += marker.modern_address + "<br>";
    }
    if(marker.borough) {
      infoHtml += marker.borough + "<br>";
    }
    $.each(marker.info_keys, function(index, key) {
      if(['title', 'city', 'borough', 'state', 'country', 'name', 'coordinates', 'source_type'].indexOf(key) == -1) {
        infoHtml += key + ": " + marker[key].substring(0,40) + (marker[key].length > 40 ? "..." : "") + "<br>";
      }
    })
    if(marker.digger) {
      infoHtml += "Found by " + '<a target="_blank" href="' + domain + marker.digger.replace(/ /g, "_") + '">' + marker.digger + "</a><br>";
    }
    return infoHtml;
  } else {
    infoHtml = '<strong>' + address + '</strong><br>';
    infoHtml += marker.thingsTitle;
    infoHtml += "<br>";
    var things = [marker.clubs, marker.games, marker.others];
    for(var i in things) {
      for(var j in things[i]) {
        var thing = things[i][j];
        infoHtml += '<a target="_blank" href="' + domain + thing.title.replace(/ /g, "_") + '">' + (thing.title_text || thing.title) + '</a>'
        infoHtml += (things[i] == marker.clubs) ? " est. " + thing.year : "";
        infoHtml += '<br>';
        if(thing.digger) {
          infoHtml += "&nbsp;Found by " + '<a target="_blank" href="' + domain + thing.digger.replace(/ /g, "_") + '">' + thing.digger + "</a><br>";
        }
      }
    }
    return infoHtml;
  }
}

function set_map_trigger(script) {
  this.scripts = this.scripts || {};
  this.scripts[script] = true;
  if (Object.keys(this.scripts).length == 3) {
    set_map();
  }
}

if($('#map').length > 0) {
  $.getScript('https://maps.googleapis.com/maps/api/js?sensor=false&async=2&key=' + google_api_key, function() {
    set_map_trigger('googleapis');
  });
  $.ajax({
    dataType: "json",
    url: '/games_and_clubs.json',
    cache: true,
    beforeSend: function(xhr) {
      xhr.setRequestHeader('Cache-Control', 'private');
      xhr.setRequestHeader('Pragma', 'cache=yes');
    },
    success: function(data) {
      gamesAndClubs = data;
      set_map_trigger('json');
    }
  });
}

/* Maps > UI slider... */

if($('.slider, .tabs').length > 0) {
  $.getScript('/jquery-ui/js/jquery-ui-1.8.23.custom.min.js', ui_setup);
}

function ui_setup() {
  $('.tabs').each(function() { $(this).tabs(); $(this).removeClass("ui-widget ui-widget-content"); $(this).find(".scrollable").removeClass("ui-widget-content"); });
  slider_setup();
}

function slider_setup() {
  if($("#map").length > 0 && $("#map")[0].years && $("#slider").slider && $("#slider").length > 0 && !$("#slider")[0].is_setup) {
    var map = $("#map")[0];
    $('<div id="slider-one-year" class="slider" style="display: none"></div>').insertAfter("#slider");
    $("#slider").slider({
      range: true,
      min: map.years[0],
      max: map.years[1],
      values: map.years,
      change: function( event, ui ) {
        map.years = [parseInt(ui.values[0]), parseInt(ui.values[1])];
      },
      slide: function( event, ui ) {
        var slider = $("#slider")[0];
        if(event) {
          var old_values = map.years;
          map.years = [parseInt(ui.values[0]), parseInt(ui.values[1])];
          if(slider.mode && slider.mode == "freeze_ranges") {
            var old_diff = old_values[1] - old_values[0];
            var new_diff = map.years[1] - map.years[0];
            if(old_diff != new_diff) {
              var index = (old_values[0] == map.years[0]) ? 0 : 1;
              var value = index == 0 ? Math.max(map.years[1] - old_diff, map.base_years[0]) : Math.min(map.years[0] + old_diff, map.base_years[1]);
              map.years[index] = value;
              $(slider).slider("values", index, value);
            }
          }
        } else if (slider.mode && slider.mode == "freeze_ranges") {
          if(map.years[0] == map.base_years[0] && map.years[1] == map.base_years[1]) {
            map.years[1] = Math.min(map.years[1], map.years[0] + 1);
            $(slider).slider("values", 1, map.years[1]);
          }
        }
        set_slider_text(map.years);
        map.filter_years = map.years;
        filter_map_years();
      }
    });
    $("#slider-one-year").slider({
      min: map.years[0],
      max: map.years[1],
      value: map.years[0],
      slide: function( event, ui ) {
        if(event) {
          map.year = parseInt(ui.value);
        } else if(!map.year) {
          map.year = map.years[0];
          $("#slider-one-year").slider("value", map.year);
        }
        set_slider_text([map.year]);
        map.filter_years = [map.year, map.year];
        filter_map_years();
      }
    });
    $("#slider")[0].is_setup = true;
    set_slider_text(map.years);
    $('<div class="slider_opts"><input type="radio" name="slider_group" value="standard" id="standard_slide" checked="checked" /> Standard  <input type="radio" name="slider_group" value="freeze_ranges" id="freeze_slide" /> Freeze Range <input type="radio" name="slider_group" value="one_year" id="one_year_slide" /> One Year At a Time</div>').insertBefore("#slider-values");
    $("#standard_slide, #freeze_slide").click(function() { var slider = $("#slider"); slider[0].mode = $(this).val(); $("#slider-one-year").hide(); slider.show(); slider.slider('option', 'slide').call(slider); });
    $("#one_year_slide").click(function() { var slider = $("#slider-one-year"); $("#slider").hide(); slider.show(); slider.slider('option', 'slide').call(slider); });
  }
}

function slider_reset() {
  var map = $("#map")[0];
  map.year = map.years[0];
  $("#slider, #slider-one-year").slider("option", "min", map.years[0] );
  $("#slider, #slider-one-year").slider("option", "max", map.years[1] );
  map.years = map.prev_years ? map.prev_years : map.years;
  map.year = map.prev_year ? map.prev_year : map.year;
  map.prev_years = $("#slider").slider("option", "values");
  map.prev_year = $("#slider-one-year").slider("option", "value");
  $("#slider").slider("option", "values", map.years);
  $("#slider-one-year").slider("option", "value", map.year);
  set_slider_text($("#one_year_slide")[0].checked ? [map.years[0]] : map.years);
}

function year_link(year, back_or_forwards, displayed, left_or_right) {
  back_or_forwards = displayed ? back_or_forwards : "nowhere";
  return '<a href="#" id="move_map_' + year + '_' + back_or_forwards + '" class="move_map_year"' + (displayed?'':' style="color:white;"') + '><i class="icon-chevron-' + left_or_right + '"></i></a>';
}

function set_slider_text(years) {
  var map = $("#map")[0];
  var label = years.length > 1 ? "Years: " : "Year: ";
  var link = "";
  var range_mode = years.length == 2;
  var frozen_range_mode = range_mode && $("#slider")[0].mode == "freeze_ranges";
  for(var i in years) {
    var handle = years.length == 1 ? "year" : "year" + i;
    var show_left_link = years[i] > map.base_years[0] && (!range_mode || !(i == 1 && years[0] == years[1])) && (!frozen_range_mode || i == 0);
    var show_right_link = years[i] < map.base_years[1] && (!range_mode || !(i == 0 && years[0] == years[1])) && (!frozen_range_mode || i == 1);
    if(i == 1) {
      link += " - ";
    }
    link += year_link(handle, "back", show_left_link, "left");
    link += ' ' + years[i] + ' ';
    link += year_link(handle, "forward", show_right_link, "right");
  }
  $("#slider-values").html(label + link);
  $(".move_map_year").click(adjust_map_by_one);
}

function adjust_map_by_one() {
  var map = $("#map")[0];
  var info = this.id.split("_");
  var handle = info[2];
  var move = info[3];
  if(move == "nowhere") return false;
  var slider;
  if(handle == "year") {
    map.year += move == "forward" ? 1: -1;
    slider = $("#slider-one-year");
    slider.slider("value", map.year);
  } else {
    slider = $("#slider");
    if(slider[0].mode == "freeze_ranges") {
      map.years[0] += move == "forward" ? 1: -1;
      map.years[1] += move == "forward" ? 1: -1;
    } else {
      var i = parseInt(handle.substr(4));
      map.years[i] += move == "forward" ? 1: -1;
    }
    slider.slider("values", map.years);
  }
  slider.slider('option', 'slide').call(slider);
  return false;
}

function filter_map_years() {
  var map = $("#map")[0];
  var zoom = map.map.getZoom();
  var location_markers = {};
  for(var i in map.markers) {
    var marker = map.markers[i];
    var on = false;
    var reset = false;
    if(marker.year) {
      // allow for markers beyond filter years to show when the range is at the extreme points
      if((map.base_years[0] == map.filter_years[0] || marker.year >= map.filter_years[0]) && (map.base_years[1] == map.filter_years[1] || marker.year <= map.filter_years[1])) {
        var location = marker.location;
        if(!(location in location_markers)) {
          location_markers[location] = [];
        }
        location_markers[location].push(marker);
        var location_count = location_markers[location].length;
        if(map.spread_markers || location_count == 1) {
          on = true;
          if(marker.spiral_number != location_markers[location].length || marker.spiral_zoom != zoom) {
            var spiral_lat_long = spiral_coords(marker.lat_long, location_count, zoom);
            marker.position = new google.maps.LatLng(spiral_lat_long[0], spiral_lat_long[1]);
            marker.spiral_number = location_count;
            marker.spiral_zoom = zoom;
            reset = true;
            if(marker.source_type == "Club") {
              marker.set('icon', orange_bullet_marker_and_shadow()[0]);
              marker.set('shadow', orange_bullet_marker_and_shadow()[1]);
            }
          }
        }
      }
    }
    if(on && (!marker.map || reset)) {
      var set = show_additional_markers || map.marker_in_filter(marker) ? map.map : null; 
      marker.setMap(set);
    } else if(!on) {
      marker.setMap(null);
    }
  }
  set_marker_markers(location_markers);
}

function set_marker_markers(location_markers) {
  for(var location in location_markers) {
    var marker = location_markers[location][0];
    marker.markers = location_markers[location];
    if(marker.markers.length > 1) {
      marker.clubs = [];
      marker.games = [];
      marker.predecessors = [];
      marker.others = [];
      for(var i in marker.markers) {
        var thing = (marker.markers[i].source_type == "Club") ? marker.clubs 
        : (marker.markers[i].source_type == "Ballgame") ? marker.games
        : (marker.markers[i].source_type == "Predecessor Game") ? marker.predecessors
        : marker.others;
        thing.push(marker.markers[i]);
      }
      marker.thingsTitle = "";
      if(marker.clubs.length > 0) {
        marker.thingsTitle += marker.clubs.length + " club" + (marker.clubs.length > 1?"s":"");
        if(marker.games.length == 0) {
          marker.set('icon', orange_bullet_marker_and_shadow()[0]);
          marker.set('shadow', orange_bullet_marker_and_shadow()[1]);
        }
      }
      if(marker.games.length > 0) {
        if(marker.thingsTitle) { marker.thingsTitle += (show_predecessor_games && marker.predecessors.length > 0) ? ", " : " and "; }
        marker.thingsTitle += marker.games.length + " ballgame" + (marker.games.length > 1?"s":"");
        marker.set('icon', null);
        marker.set('shadow', null);   
      }
      if(show_predecessor_games && marker.predecessors.length > 0) {
        if(marker.thingsTitle) { marker.thingsTitle += marker.thingsTitle.indexOf(",") > -1 ? ", and " : " and " }
        marker.thingsTitle += marker.predecessors.length + " predecessor game" + (marker.predecessors.length > 1?"s":"");
      }
      if(marker.others.length > 0) {
        if(marker.thingsTitle) { marker.thingsTitle += marker.thingsTitle.indexOf(",") > -1 ? ", and " : " and " }
        marker.thingsTitle += marker.others.length + " other" + (marker.others.length > 1?"s":"");
      }
      var address = marker.city + (marker.state ? ", " + marker.state : "") + (marker.country && marker.country != "United States" ? ", " + marker.country : "");
      if(marker.ee) { marker.ee.title = address + ": " + marker.thingsTitle; }
    } else {
      if(marker.ee) { marker.ee.title = marker.title; }
    }
    if(map.infoWindow.marker == marker) {
      map.infoWindow.close();
      map.infoWindow.marker = null;
    }
  }
}

/* ...Maps > slider UI */

/* ...Maps */

function tinymce_loaded() {
  if(!(is_admin || is_block_editor)) {
    setTimeout(function() {
        $("[name=Block\\[Title\\]").parents("form").find("textarea:not([name*=Comment]):not([name*=Query])").each(function() { var body = tinyMCE.get($(this).attr("id")).getBody();
   body.setAttribute('contenteditable', false);
   body.style.backgroundColor = "#eee";
});
        }, 100);
  }
}
var tinymce_changed_func = function(inst) {}
function tinymce_changed(inst) { tinymce_changed_func(inst); }
function listen_for_free_text() {
  var has = $('[name="Chronology Entry[Has Supplemental Text][value]"], [name="Game[Has Supplemental Text][value]"], [name="Club[Has Supplemental Text][value]"]')[0];
  tinymce_changed_func = function(inst) {
    if(inst.id == "sf_free_text") {
      var body = inst.getBody();
      text = tinymce.trim(body.innerText || body.textContent);
      has.checked = text.length > 0;
    }
  }
}
function setAutocompleteUsingMapValues() {
  if (!gamesAndClubs.length || !$ || !$.ui || !$.ui.autocomplete) {
    setTimeout(function() {
      setAutocompleteUsingMapValues();
    }, 100);
    return;
  }
  var city = new ClassProp("city", "City");
  var borough = new ClassProp("borough", "Borough");
  var state = new ClassProp("state", "State");
  var home_away = new ClassProp("home_team, .away_team", "Title");
  var field = new ClassProp("field", "Title");
  set_autocomplete(state);
  $(".state").change(function() {
    var stateInput = $(".state");
    var stateVal = stateInput.val();
    var stateFilter = !stateVal ? null : function(thing) {
      return thing["State"] == stateVal;
    }
    set_autocomplete(city, stateFilter);
    set_autocomplete(borough, stateFilter);
  }).change();
  set_autocomplete(home_away, function(thing) {
    return thing["Type"] == "Club";
  });

  //$(".city").change(function(){set_autocomplete(field, [city, state], "[[Category:" + "Fields]]")}).change();
}

function titleExistsCheck(title, callback) {
  api.get({action: "query", titles: [title]}).then(
  function(result) { 
    callback(!result.query.pages[-1]);
  });
}

function notifyOnDupTitle(namespace, elem) {
  elem = elem || this;
  if(!$("#dupTitleNotification").length) {
    $(elem).closest("td").append("<div id='dupTitleNotification' style='display: none'>Title already exists!</div>");
    return;
  }
  if(elem.defaultValue == elem.value) {
    $("#dupTitleNotification").hide();
    return;
  }
  namespace = namespace || '';
  titleExistsCheck(namespace + elem.value, function(exists) {
    if (exists) {
      $("#dupTitleNotification").show();
    } else {
      $("#dupTitleNotification").hide();
    }
  });
}

function notifyOnProtoPixDupTitle() {
  notifyOnDupTitle('ProtoPix:', this);
}

function getProtoPixTitleFromImageUpload() {
  var titleField = $(".proto_pix_title");
  if (!titleField || titleField.val()) {
    return;
  }
  var fileName = $(".proto_pix_image").val();
  var extIndex = fileName.lastIndexOf(".");
  fileName = fileName.substring(0, extIndex);
  fileName = fileName.replace(/(_|\-|\.)/g, ' ');
  titleField.val(fileName); 
}

function formPrep() {
 api = new mw.Api();

 if(wgPageName.indexOf("Special:FormEdit") > -1 || wgAction.indexOf("formedit") > -1) {
  $('.allow_new .checkboxesSpan').each(add_new_input);
  $('.set_none_to_unknown_for_enumerated_radio_buttons .radioButtonSpan').each(set_none_to_unknown_for_enumerated_radio_buttons);
  $('.set_none_value_for_enumerated_radio_buttons .radioButtonSpan').each(set_none_value_for_enumerated_radio_buttons);

  /* for Chronology */
  $('.salience').each(set_salience_names);
  $('[name="Chronology Entry[Year]"]').change(populate_chron_year_number);

  /* for Games */
  $('.sort_eras_chronologically .checkboxesSpan').each(sort_eras_chronologically);

  /* for Diggers */
  $('[name="Digger Activity[Digger Activity Date][day]"]').each(default_to_one_and_hide);

  /* for Ballgames... */
  $(".type_of_date").change(set_date_by_type_of_date).change();
  $(".ballgame_name").parents("form").submit(set_ballgame_name);
  $($('.image-upload').get().reverse()).each(function(i) { if(i && !$(this).val()) {$(this).closest('tr').hide();} else { $(this).change() }});
  $('.image-upload').change(function() { if($(this).val()) { $(this).closest('tr').next().find('.image-upload').closest('tr').show(); } });

  setAutocompleteUsingMapValues();
  $(".country, .state, .city, .modern_address").change(set_map_marker);
  /* ...Ballgames */

  /* ProtoPix */
  $(".pics-location").change(set_map_marker_for_pics_location);
  $(".notify_on_proto_pix_dup_title").change(notifyOnProtoPixDupTitle).change();
  $(".proto_pix_image").change(getProtoPixTitleFromImageUpload);
  /* ...ProtoPix */

  /* Editors... */
  if(wgAction.indexOf("formedit") > -1) {
     $('textarea.wikiEditor_on_edit').attr('class','wikiEditor');
  }

  if($('textarea.wikiEditor').length > 0) {
    $(function(){mw.loader.using("ext.semanticforms.wikieditor",function(){$('textarea.wikiEditor').SemanticForms_registerInputInit(window.ext.wikieditor.init, null);});});
  }

  $('[name="Chronology Entry[Has Supplemental Text][value]"], [name="Game[Has Supplemental Text][value]"], [name="Club[Has Supplemental Text][value]"]').each(listen_for_free_text);

  if($('textarea.tinymce').length == 0) return;
  $.getScript("/tinymce/jscripts/tiny_mce/jquery.tinymce.js", function() { 
    $('textarea.tinymce').each(function() { 
      var id = this.id;
      var opts = {
        // Location of TinyMCE script
        script_url : '/tinymce/jscripts/tiny_mce/tiny_mce.js',

        // General options
        theme : "advanced",
        plugins : "pagebreak,style,layer,save,advhr,advimage,advlink,iespell,inlinepopups,insertdatetime,preview,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,table,spellchecker,heading",

        // Theme options
        theme_advanced_buttons1 : "spellchecker,|,tablecontrols" + ($(this).hasClass("with_headings") ? ",|,h2,h3,h4" : ""),
        theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,undo,redo,|,hr,nonbreaking,removeformat,visualaid,|,sub,sup,|,charmap,iespell,advhr,|,fullscreen",
        theme_advanced_buttons3 : "bold,italic,underline,strikethrough,|,bullist,numlist,|,link,unlink,|,outdent,indent,blockquote,|justifyleft,justifycenter,justifyright,justifyfull,|,cleanup,help,code" ,

        theme_advanced_toolbar_location : "top",
        theme_advanced_toolbar_align : "left",
        theme_advanced_statusbar_location : "bottom",
        theme_advanced_resizing : true,
        theme_advanced_path : false,
        spellchecker_languages : "+English=en",
        heading_clear_tag : "p",
        extended_valid_elements: "ref,references",

        content_css : "/tinymce/css/custom_content.css",
        theme_advanced_font_sizes: "10px,12px,13px,14px,16px,18px,20px",
        font_size_style_values : "10px,12px,13px,14px,16px,18px,20px",

        width: "600",
        oninit : "tinymce_loaded",
        onchange_callback : "tinymce_changed",
        gecko_spellcheck : true
      };
      if($(this).hasClass("simple")) {
        delete opts["theme_advanced_buttons2"];
        delete opts["theme_advanced_buttons3"];
        opts["theme_advanced_buttons1"] = "bold,italic,underline,|,sub,sup,|,link,unlink,|,spellchecker,|,cleanup,help,code";
      }

      $(this).tinymce(opts);
    });
  });
  /* ...Editors */
 }
}

$('.field_me').replaceWith(function(){ return '<input type="hidden" name="' + $(this).data('name') + '" value="' + $(this).data('value') + '" />'; });

$(".subnav_list_box a").each(function() { if(!this.href){ $(this).attr("href", "#"); $(this).click(function() { $(".subnav_list_items").toggle();  $(".subnav_add_items").hide(); return false; }) } });
$(".subnav_add_box a").each(function() { if(!this.href){ $(this).attr("href", "#"); $(this).click(function() { $(".subnav_add_items").toggle(); $(".subnav_list_items").hide(); return false; }) } });

function changeEditLinksToTopLinks() {
 if(wgPageName.indexOf("List_of_Diggers") > -1) {
  $(".editsection a").attr("href", "#top").text("↑ top");
 }
}

// have searches use a get so the url can be shared
$('#sfForm[action="/Special:RunQuery/Chronology_Search"]').each(function(){this.method = "get";});

// runquery results don't use parser functions except for within the ask call
// so, we hide the header listings
// then reveal only the lines with any values
$(".hide_unless_span_content").each(function() {
  var text = $(this).children('span').text()
  if(text.length > 0 && text != "No") {
    $(this).show();
    if(text == "Yes") {
      $(this).children('span').hide();
    }
  }
});

var scroll_height = 0;
$(".scrollable").each(function() {
  if(!scroll_height) {
    scroll_height = $(window).height() - $(this).offset().top - 60;
  }
  $(this).css('height', scroll_height);
  $(this).css('overflow', "auto");
});

$('#searchform').append($("<input type='button' id='enhancedSearchButton' value='Enhanced'>").click(function() {window.location="/Special:EnhancedSearch?text=" + $('#searchInput').val(); return false;}))

$('.tip_link a').attr("target","_blank");

$('.stats').each(function() { $(this).find("td:not(:hidden):last").addClass("table_turner_container").append('<a href="" class="table_turner"><i class="icon-cut"></i></a>'); });
$(".table_turner").click(function() { turn_table($(this).parents(".stats")); return false; })
var chron_re = /^\d+.?\.\d+$/;
turn_table = function(table) { 
  var offset = table.offset(); 
  var div = $('<div id="turned" style="position: absolute; z-index: 10; top: ' + Math.round(offset.top) + 'px; width: 400px; left: ' + (offset.left + Math.round(table.width()/2) - 200) + 'px"><a id="close_entry" href="#" style="font-size: 30px; display: block; text-align: right; position: relative; left: 1em;"><i class="icon-remove-circle"></i></a><iframe id="turned_list" style="height: 300px; width: 380px; background-color: white;" src="about:blank"></iframe></div>'); 
  $("body").append(div); 
  var merge = function() {
    var inner = div.children("iframe").contents().find('body'); 
    var title = $("#firstHeading").text(); 
    inner.append($('<a target="_blank" href="' + window.location.href + '">' + window.location.href + '</a><br /><br />'));
    inner.append($('<b><a target="_blank" href="/' + title + '">' + (chron_re.test(title) ? "Protoball Chronology #" : "") + title + '</a></b><br /><br />'));
    var subtitle = $(".subtitle").text(); 
    if(subtitle) { inner.append($('<b>' + $(".subtitle").text() + '</b><br /><br />')); } 
    var rows = table.find("tr:not(:hidden)"); 
    for(var i = 0; i < rows.length; i++) { 
      var td = $(rows[i]).find("td");
      var text = td.html();
      var isPara = td.find("p").length > 0;
      var isCommentOrQuery = td.children().eq(0).prop("tagName") == "I";
      if(isCommentOrQuery) {
        continue;
      }
      inner.append($('<b>' + $(rows[i]).find("th").html()  + '</b>' + (isPara ? "" : '<br />') + text +  (isPara ? "" : '<br /><br />')));
    } 
    inner.find(".hidden").remove();
    inner.find("i").filter(function(i, e) {return $(e).text().substr(0,4) == "Edit";}).remove();
  }
  setTimeout(merge, 500); 
  div.find(".admin").remove();  
  $("#close_entry").click(function() { $("#turned").remove(); return false; }); return false; 
}
var pull_toggle_a = $("<a href='#' id='pull_toggle'>show</a>");
pull_toggle_a.click(function() { var text = $(this).text(); text = text == "show" ? "hide" : "show"; $(this).text(text); $(".pull_list").toggle(); if(text == "hide") {$("#pull_entry").empty();} return false; });
$(".pull_list_container span").append("[", pull_toggle_a, "]").addClass("toctoggle");
$(".pull_list").after('<div style="position:absolute; margin: 1em auto;" id="pull_entry"></div>');
$(".pull_list a").each(function() { this.entry_title = this.title; this.title ="Click to see entry"; $(this).click(function() { var entry = $(".chron_entry_side_text a[title='" + this.entry_title + "']").parents(".chron_entry_wrapper_outer").get(0); entry = $(entry).clone(); var x = $("<div style='position:absolute; right: 0; z-index: 10;'><a id='close_entry' href='#' style='font-size: 30px;'><i class='icon-remove-circle'></i></a></div>"); $("#pull_entry").empty().append(x, entry); $("#close_entry").click(function() { $("#pull_entry").empty(); return false; }); return false;}); });

if($(".sup_text").length) {
  $("#catlinks").before('<div class="chron_back_link"></div>');
}
var chron_back_links = $(".chron_back_link");
if(chron_back_links.length) {
  var referrer = document.referrer;
  if(referrer && (referrer.indexOf("Chronology:") > -1 || referrer.indexOf("Prominent") > -1)) {
    if(referrer.indexOf("#") == -1) {
      referrer += "#" + escape(chron_back_links.text().replace(/ /g, "_")).replace(/%/g, ".").replace(/\.3A/g, ":").replace(/\.22$/, "");
    }
    chron_back_links.html('<a href="' + referrer + '">Back to Chronology Listing</a>');
  }
}
var infobox_t = $('<div class="infobox_toggle"><a href="#">Toggle Subnav</a></div>');
infobox_t.click(function() { $('.infobox').toggle(); return false; });
$('.infobox').first().parent().append(infobox_t);


var add_pages = $(".nice .icon-plus-sign");
if(add_pages.length) {
  $("#mw-panel").append($('<div class="portal"><h5>Legend</h5><div class="body"><ul><li><a href="#"><i class="icon-plus-sign" style="font-size:200%; line-height: 1.5"></i></a></li><li>Click the item&#8217;s <i class="icon-plus-sign"></i> icon to add a new page of information for the item.</li></div>'));
}

$("#discussion_below").each(function() {
  $("#mw-content-text").append($(this));
  $(this).show();
});

$('.reveal').each(function() { var $this = $(this); $this.before($('<a href="#">' + ($this.data("title") || 'Reveal') + '</a>').click(function() { $this.show(); $(this).hide(); return false; }) ) });

function getRandomInt (min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}
$('.pick_random').each(function() { var $this = $(this); var lis = $this.find("li"); lis.hide(); var limit = $this.data("number"); for(var i = 0; i < limit; ) { var index = getRandomInt(0,lis.length -1);  var li = $(lis[index]); if(li.css('display') == 'none') { li.show(); i++; } } }).show();

var is_admin = isAdmin();
var is_editor = isEditor();
var is_super_editor = isSuperEditor();
var is_block_editor = isBlockEditor();
if(is_admin || is_super_editor) {
  $(".admin, .editsection").show();
} else {
  $(".new a").each(function() { this.href += "&namespace=new" });
}
if(is_admin || wgUserName == "JKittel") {
  $(".gloss_admin").show();
}
if(is_admin || is_super_editor) {
  $(".prepro_admin").show();
}
if(is_admin || is_block_editor) {
  $(".block_admin").show();
}
var is_editor = isEditor();
if(is_admin || is_editor) {
  $(".admin").show();
} else {
  $(".editsection").hide();
}
if(!(is_admin || is_block_editor)) {
  $("[name=Block\\[Title\\]").parents("form").find("input").attr('readonly', 'readonly');
  // see also tiny_mce_loaded
}
$('table.sortable').before("<div class='sortable_table_marquee'><div>Sortable</div></div>")
function appendBallgameStats() {
	var table = $('table.ballgame-table');
	if (!table.length) {
		return;
	}
	var gamesWithScores = 0;
	var runs = 0;
	var winningRuns = 0;
	var losingRuns = 0;
	var rows = table.find('tbody tr');
	for(var i = 0; i < rows.length; i++) {
		var score = rows.eq(i).find("td").eq(7).text();
		var scores = score.split(' - ');
		if (scores.length < 2) {
			continue;
		}
		gamesWithScores++;
		var run1 = +scores[0];
		var run2 = +scores[1];
		runs += run1 + run2;
		if (run1 > run2) {
			winningRuns += run1;
			losingRuns += run2;
		} else {
			winningRuns += run2;
			losingRuns += run1;
		}
	}
	if (!gamesWithScores) {
		return;
	}
	var runsAvg100 = Math.round(100 * runs/(gamesWithScores * 2));
	var winningRunsAvg100 = Math.round(100 * winningRuns/gamesWithScores);
	var losingRunsAvg100 = Math.round(100 * losingRuns/gamesWithScores);
	var text = " Ballgames with Scores: " + gamesWithScores;
	text += ", Average Runs: " + format100(runsAvg100);
	text += ", Average Winning Runs: " + format100(winningRunsAvg100);
	text += ", Average Losing Runs: " + format100(losingRunsAvg100);
	table.after('<div class="ballgame-table-stats">' + text + ' </div>')
}
function format100(x) {
	var modulo = x % 100;
	if (modulo < 10) {
		modulo = '0' + modulo
	}
	return "" + Math.floor(x / 100) + '.' + modulo
}
appendBallgameStats();

function isRole(role) {
for(var i in wgUserGroups) { if(wgUserGroups[i] == role) return true; };
return false;
}
function isEditor() {
return isRole("editor");
}
function isSuperEditor() {
return isRole("supereditor");
}
function isAdmin() {
return isRole("sysop");
}
function isBlockEditor() {
return isRole("blockeditor");
}
$(function() {
  formPrep();
  changeEditLinksToTopLinks();
});

function embedPdf(url, id) {
  var embed = function() {
      var myPDF = new PDFObject({ 
      url: url,
      pdfOpenParams: { view: 'FitH' }
    }).embed(id); 
  };
  if(window.PDFObject) {
    embed();
  } else {
    $.getScript('/js/pdfobject.js', embed);
  }
}

(function boroughColumnAdjust() {
  var boroughTables = $(".borough_header").parents("table");
  boroughTables.each(function() {
    var pos = $(this).find(".borough_header").parent().index();
    if(pos == -1) return;
    var cellsWithInfo = $(this).find("td").filter( function() { return $(this).index() == pos && $.trim($(this).text()); }).length;
    if(!cellsWithInfo) {
      $(this).find("th, td").filter( function() { return $(this).index() == pos }).hide();
    }
  });
}());