User:Brian.Beck/case.js
Note: After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold down Shift while clicking Reload, or press Ctrl-Shift-R (Cmd-Shift-R on Apple Mac); IE: hold Ctrl while clicking Refresh, or press Ctrl-F5; Konqueror:: simply click the Reload button, or press F5; Opera users may need to completely clear their cache in Tools→Preferences.
var brianScript = {
'arcDegrees': function(arcminutes, arcseconds) {
arcminutes = parseFloat(arcminutes);
arcseconds = parseFloat(arcseconds);
return (arcminutes / 60.0 + arcseconds / 3600.0);
},
'parsePoint': function(str) {
var values = str.split(/, /);
var expr = /(\d+)(?:\D|(?:°))(\d+)(?:\D|(?:′))(\d+\.?\d*)(?:\D|(?:″)) ([NSEW])/;
var lat = values[0].match(expr);
var lng = values[1].match(expr);
var latitude = parseFloat(lat[1]) + brianScript.arcDegrees(lat[2], lat[3]);
var longitude = parseFloat(lng[1]) + brianScript.arcDegrees(lng[2], lng[3]);
if (lat[4] == 'S') {
latitude *= -1;
}
if (lng[4] == 'W') {
longitude *= -1;
}
return new GLatLng(latitude, longitude, true);
},
'handleHttpResponse': function() {
var request = brianScript._request;
var map = brianScript._map;
if (request.readyState == 4) {
var doc = request.responseXML;
var smwNS = "http://opensource.case.edu/projects/MediaWikiHacks/"
var nodes = doc.documentElement.getElementsByTagName('node');
var nodeMap = {};
// Build a node map once so we don't have to iterate
// it scanning for node IDs every time.
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
nodeMap[node.getAttribute('id')] = node;
}
// Build a relation map for every node.
var relationMap = brianScript.buildRelationMap(doc, nodeMap, 'Located in');
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
if (node.hasAttributeNS(smwNS, 'Coordinates')) {
var nodeID = node.getAttribute('id');
var nodeType = node.getAttribute('type');
var nodeTitle = node.getAttribute('title');
var nodePoint = node.getAttributeNS(smwNS, 'Coordinates');
var nodeURI = brianScript.makeNodeURI(node);
var html = '<div id="gmapInfoWindow">'
html += '<a href="' + nodeURI + '">' + nodeTitle + '</a><br/>';
html += '<strong>Location: </strong>' + nodePoint + '<br/>';
html += '<strong>(Using brianScript)</strong><br/>';
var related = relationMap[nodeID];
related = related ? related : new Array();
if (related.length) {
html += '<strong>Located here:</strong><br/>';
html += '<ul>';
for (var j = 0; j < related.length; j++) {
var relNode = related[j];
var relTitle = relNode.getAttribute('title');
var relURI = brianScript.makeNodeURI(relNode);
html += '<li><a href="' + relURI + '">' + relTitle + '</a></li>';
}
html += '</ul>';
}
html += '</div>';
var point = brianScript.parsePoint(nodePoint);
var marker = createMarker(point, html);
map.addOverlay(marker);
}
}
}
},
'makeNodeURI': function(node) {
var uri = node.getAttribute('title').replace(/ /g, '_');
if (node.getAttribute('type') == "category") {
uri = "Category:" + uri;
}
return '/' + uri;
},
'buildRelationMap': function(doc, nodeMap, relation) {
var relations = {};
if (doc.evaluate) {
var foundEdgesPattern = "/MediaWikiGraph/edge[@relation='" + relation + "']";
var resultEdges = doc.evaluate(foundEdgesPattern, doc.documentElement, null,
XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
var thisEdge = resultEdges.iterateNext();
while (thisEdge) {
var fromID = thisEdge.getAttribute('from');
var toID = thisEdge.getAttribute('to');
var node = nodeMap[fromID];
if (relations[toID]) {
relations[toID].push(node);
}
else {
relations[toID] = [node];
}
thisEdge = resultEdges.iterateNext();
}
}
else {
var edges = doc.documentElement.getElementsByTagName('edge');
for (var i = 0; i < edges.length; i++) {
var edge = edges[i];
var edgeRel = edge.getAttribute('relation');
if (edgeRel == relation) {
var fromID = edge.getAttribute('from');
var toID = edge.getAttribute('to');
var node = nodeMap[fromID];
if (relations[toID]) {
relations[toID].push(node);
}
else {
relations[toID] = [node];
}
}
}
}
return relations;
},
'renderMap': function(n) {
gmap_id = 'gmap_'+n;
form_id = 'mapform_'+n;
message_id = 'gmapmessage_'+n;
document.getElementById(gmap_id).style.width = document.getElementById(form_id).width.value;
document.getElementById(gmap_id).style.height = document.getElementById(form_id).height.value;
var map = new GMap2(document.getElementById(gmap_id));
map.addControl(new GSmallMapControl());
map.setCenter(new GLatLng(document.getElementById(form_id).lat.value, document.getElementById(form_id).lon.value, true), parseInt(document.getElementById(form_id).zoom.value), G_NORMAL_MAP);
if (document.getElementById(form_id).controls.value == 'yes') {
map.addControl(new GMapTypeControl());
}
if (document.getElementById(form_id).type.value == 'G_SATELLITE_MAP') {
map.setMapType(G_SATELLITE_MAP);
}
else if (document.getElementById(form_id).type.value == 'G_NORMAP_MAP') {
map.setMapType(G_NORMAL_MAP);
}
else if (document.getElementById(form_id).type.value == 'G_HYBRID_MAP') {
map.setMapType(G_HYBRID_MAP);
}
GEvent.addListener(map, "moveend", function() {
var center = map.getCenter();
var latLngStr = '(' + center.y + ', ' + center.x + ')';
document.getElementById(message_id).innerHTML = latLngStr;
});
if (document.getElementById(form_id).rss) {
//if the rss form element is defined, plot datapoints from an rss feed
feedarray = document.getElementById(form_id).rss.value.split('|');
for (var i = 0; i < feedarray.length; i++) {
renderRSSFeed(map, feedarray[i]);
}
}
else {
var request = GXmlHttp.create();
//the php script returns a very simple XML document
request.open("GET", "/Special:GraphStructure/xml/locations", true);
brianScript._map = map;
brianScript._request = request;
request.onreadystatechange = brianScript.handleHttpResponse;
request.send(null);
}
}
}
var brianRenderMap = brianScript.renderMap;
