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;
This page has been accessed 451 times.
This page was last modified 14:48, October 26, 2006 by Brian Beck.
About | Disclaimers