changes for the home page redesign

This commit is contained in:
tworrall 2013-04-30 14:46:22 -04:00
parent a6eab19a96
commit 0d0b5ea48a
21 changed files with 9903 additions and 24 deletions

View file

@ -243,3 +243,9 @@ RDFService.languageFilter = true
# the individual's webpage presence. The following flag should be uncommented when implementing the multiple # the individual's webpage presence. The following flag should be uncommented when implementing the multiple
# views. # views.
#MultiViews.profilePageTypes=enabled #MultiViews.profilePageTypes=enabled
# Geo Focus Maps
# When the following flag is uncommented, the VIVO home page displays global and US maps highlighting the geographical
# focus of foaf:person individuals.
#homePage.geoFocusMaps=enabled

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View file

@ -0,0 +1,359 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
$(document).ready(function(){
var globalMapBuilt = false;
var usMapBuilt = false;
var stateMapBuilt = false;
var researchAreas = { "type": "FeatureCollection", "features": []};
$.extend(this, urlsBase);
getGeoJsonForMaps();
$('a#globalLink').click(function() {
buildGlobalMap();
$(this).addClass("selected");
$('a#usLink').removeClass("selected");
$('a#nyLink').removeClass("selected");
});
$('a#usLink').click(function() {
buildUSMap();
$(this).addClass("selected");
$('a#globalLink').removeClass("selected");
$('a#nyLink').removeClass("selected");
});
$('a#stateLink').click(function() {
buildStateMap();
$(this).addClass("selected");
$('a#usLink').removeClass("selected");
$('a#globalLink').removeClass("selected");
});
function getLatLong(country) {
var lat = [];
latLongJson.map(function (json) {
if ( json.name == country) {
lat.push(json.data["longitude"]);
lat.push(json.data["latitude"]);
}
});
if (lat.length == 0) {
lat.push(0.0);
lat.push(0.0);
}
return(lat);
}
function getMapType(country) {
var mt = "";
latLongJson.map(function (json) {
if ( json.name == country) {
mt = json.data["mapType"];
}
});
return(mt);
}
function onEachFeature(feature, layer) {
var popupContent = "";
var uri = "";
if (feature.properties && feature.properties.popupContent) {
popupContent += feature.properties.popupContent;
}
if (feature.properties && feature.properties.html) {
if ( feature.properties.html == "1") {
popupContent += ": " + feature.properties.html + " researcher";
}
else {
popupContent += ": " + feature.properties.html + " researchers";
}
}
layer.on('mouseover', function(e) {
e.target.bindPopup(popupContent,{closeButton:false}).openPopup();
});
layer.on('mouseout', function(e) {
e.target.closePopup();
});
if (feature.properties && feature.properties.uri) {
uri += feature.properties.uri;
layer.on('click', function(e) {
document.location.href = urlsBase + "/individual?uri=" + uri + "&#map";
});
}
}
function getDivIcon(feature) {
var htmlContent = "";
var myIcon;
if (feature.properties && feature.properties.html) {
htmlContent += feature.properties.html;
}
if ( htmlContent > 99 ) {
myIcon = L.divIcon({className: 'divIconCountPlus', html: htmlContent});
}
else {
myIcon = L.divIcon({className: 'divIconCount', html: htmlContent});
}
return myIcon;
}
function getMarkerRadius(feature) {
var radiusContent;
if (feature.properties && feature.properties.radius) {
radiusContent = feature.properties.radius;
}
return radiusContent;
}
function checkGlobalCoordinates(feature, layer) {
var theLatLng = new L.LatLng(feature.geometry.coordinates[0],feature.geometry.coordinates[1]);
var mt = feature.properties.mapType;
if ( !theLatLng.equals([0,0]) && mt == "global" ) {
return true;
}
return false;
}
function checkUSCoordinates(feature, layer) {
var theLatLng = new L.LatLng(feature.geometry.coordinates[0],feature.geometry.coordinates[1]);
var mt = feature.properties.mapType;
if ( !theLatLng.equals([0,0]) && mt == "US" ) {
return true;
}
return false;
}
function checkStateCoordinates(feature, layer) {
var theLatLng = new L.LatLng(feature.geometry.coordinates[0],feature.geometry.coordinates[1]);
var mt = feature.properties.mapType;
if ( !theLatLng.equals([0,0]) && mt == "state" ) {
return true;
}
return false;
}
function buildGlobalMap() {
$('div#mapGlobal').show();
$('div#mapUS').hide();
$('div#mapState').hide();
if ( !globalMapBuilt ) {
var mapGlobal = L.map('mapGlobal').setView([25.25, 23.20], 2);
L.tileLayer('http://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile\/{z}\/{y}\/{x}.png', {
maxZoom: 12,
minZoom: 1,
boxZoom: false,
doubleClickZoom: false,
attribution: 'Tiles &copy; <a href="http://www.esri.com/">Esri</a>'
}).addTo(mapGlobal);
L.geoJson(researchAreas, {
filter: checkGlobalCoordinates,
onEachFeature: onEachFeature,
pointToLayer: function(feature, latlng) {
return L.circleMarker(latlng, {
radius: getMarkerRadius(feature),
fillColor: "#fdf9cd", //fdf38a",
color: "none",
weight: 1,
opacity: 0.8,
fillOpacity: 0.8
});
}
}).addTo(mapGlobal);
L.geoJson(researchAreas, {
filter: checkGlobalCoordinates,
onEachFeature: onEachFeature,
pointToLayer: function(feature, latlng) {
return L.marker(latlng, {
icon: getDivIcon(feature)
});
}
}).addTo(mapGlobal);
globalMapBuilt = true;
}
getResearcherCount("global");
} // Canvas/World_Light_Gray_Base
function buildUSMap() {
$('div#mapGlobal').hide();
$('div#mapState').hide();
$('div#mapUS').show();
if ( !usMapBuilt ) {
var mapUS = L.map('mapUS').setView([46.0, -97.0], 3);
L.tileLayer('http://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile\/{z}\/{y}\/{x}.png', {
maxZoom: 30,
minZoom: 1,
boxZoom: false,
zIndex: 1,
doubleClickZoom: false,
attribution: 'Tiles &copy; <a href="http://www.esri.com/">Esri</a>'
}).addTo(mapUS);
L.geoJson(researchAreas, {
filter: checkUSCoordinates,
onEachFeature: onEachFeature,
pointToLayer: function(feature, latlng) {
return L.circleMarker(latlng, {
radius: getMarkerRadius(feature),
fillColor: "#fdf9cd", //fdf38a",
color: "none",
weight: 1,
opacity: 0.8,
fillOpacity: 0.8
});
}
}).addTo(mapUS);
L.geoJson(researchAreas, {
filter: checkUSCoordinates,
onEachFeature: onEachFeature,
pointToLayer: function(feature, latlng) {
return L.marker(latlng, {
icon: getDivIcon(feature)
});
}
}).addTo(mapUS);
usMapBuilt = true;
}
getResearcherCount("US");
} // Canvas/World_Light_Gray_Base - services/Reference/World_Boundaries_and_Places_Alternate/MapServer
function buildStateMap() {
$('div#mapGlobal').hide();
$('div#mapUS').hide();
$('div#mapState').show();
if ( !stateMapBuilt ) {
// CHANGE THE setView COORDINATES SO THAT THE STATE YOU WANT TO DISPLAY IS CENTERED CORRECTLY.
// THE COORDINATES BELOW ARE FOR NEW YORK.
var mapState = L.map('mapState').setView([42.83, -75.50], 7);
L.tileLayer('http://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile\/{z}\/{y}\/{x}.png', {
maxZoom: 12,
minZoom: 1,
boxZoom: false,
doubleClickZoom: false,
attribution: 'Tiles &copy; <a href="http://www.esri.com/">Esri</a>'
}).addTo(mapState);
L.tileLayer('http://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile\/{z}\/{y}\/{x}.png', {
maxZoom: 12,
minZoom: 1,
boxZoom: false,
doubleClickZoom: false
}).addTo(mapState);
L.geoJson(researchAreas, {
filter: checkStateCoordinates,
onEachFeature: onEachFeature,
pointToLayer: function(feature, latlng) {
return L.circleMarker(latlng, {
radius: getMarkerRadius(feature) + 3,
fillColor: "#fdf9cd",
color: "none",
weight: 1,
opacity: 0.8,
fillOpacity: 0.8
});
}
}).addTo(mapState);
L.geoJson(researchAreas, {
filter: checkStateCoordinates,
onEachFeature: onEachFeature,
pointToLayer: function(feature, latlng) {
return L.marker(latlng, {
icon: getDivIcon(feature)
});
}
}).addTo(mapState);
stateMapBuilt = true;
}
getResearcherCount("state");
}
function getGeoJsonForMaps() {
$.ajax({
url: urlsBase + "/homePageAjax",
dataType: "json",
data: {
action: "getGeoFocusLocations",
},
complete: function(xhr, status) {
var results = $.parseJSON(xhr.responseText);
$.each(results, function() {
var locale = this.properties.popupContent;
this.geometry.coordinates = getLatLong(locale);
this.properties.mapType = getMapType(locale);
researchAreas["features"].push(this);
});
buildGlobalMap();
$('div#timeIndicator').hide();
}
});
}
function getResearcherCount(area) {
var researcherCount = 0;
var areaCount = 0;
var text = "";
if ( area == "global" ) {
text = " countries and regions.";
}
else if ( area == "US" ) {
text = " states.";
}
else {
text = " state-wide locations.";
}
$.each(researchAreas.features, function() {
if ( this.properties.mapType == area ) {
researcherCount = researcherCount + this.properties.html ;
areaCount = areaCount + 1;
}
});
if ( areaCount == 1 && text == " states.") {
text = " state.";
}
$('div#researcherTotal').html("<font style='font-size:1.05em;color:#167093'>"
+ researcherCount.toString().replace(/(\d+)(\d{3})/, '$1'+','+'$2')
+ "</font> researchers in <font style='font-size:1.05em;color:#167093'>"
+ areaCount + "</font>" + text);
}
});

View file

@ -0,0 +1,113 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
$(document).ready(function(){
$.extend(this, urlsBase);
// $.extend(this, facultyMemberCount);
getFacultyMembers();
buildAcademicDepartments();
if ( $('section#home-geo-focus').length == 0 ) {
$('section#home-stats').css("display","inline-block").css("margin-top","20px");
}
function getFacultyMembers() {
// determine the row at which to start the solr query
var rowStart = Math.floor((Math.random()*facultyMemberCount)+1)-1;
var diff;
var pageSize = 4; // the number of faculty to display on the home page
// in case the random number is equal to or within 3 of the facultyMemberCount
if ( (rowStart + (pageSize-1)) > facultyMemberCount ) {
diff = (rowStart + (pageSize-1)) - facultyMemberCount;
if ( diff == 0 ) {
rowStart = rowStart - (pageSize-1);
}
else {
rowStart = rowStart - diff;
}
}
var dataServiceUrl = urlsBase + "/dataservice?getRandomSolrIndividualsByVClass=1&vclassId=";
var url = dataServiceUrl + encodeURIComponent("http://vivoweb.org/ontology/core#FacultyMember");
url += "&page=" + rowStart + "&pageSize=" + pageSize;
$.getJSON(url, function(results) {
var individualList = "";
if ( results == null || results.individuals.length == 0 ) {
individualList = "<p><li>No faculty records found.</li></p>";
$('div#tempSpacing').hide();
$('div#research-faculty-mbrs ul#facultyThumbs').append(individualList);
}
else {
var vclassName = results.vclass.name;
$.each(results.individuals, function(i, item) {
var individual = results.individuals[i];
individualList += individual.shortViewHtml;
});
$('div#tempSpacing').hide();
$('div#research-faculty-mbrs ul#facultyThumbs').append(individualList);
$.each($('div#research-faculty-mbrs ul#facultyThumbs li.individual'), function() {
if ( $(this).children('img').length == 0 ) {
var imgHtml = "<img width='60' alt='placeholder image' src='" + urlsBase + "/images/placeholders/person.bordered.thumbnail.jpg'>";
$(this).prepend(imgHtml);
}
else {
$(this).children('img').load( function() {
adjustImageHeight($(this));
});
}
});
var viewMore = "<ul id='viewMoreFac'><li><a href='"
+ urlsBase
+ "/people/%23http://vivoweb.org/ontology/core%23FacultyMember' alt='view all faculty'>"
+ "View all ...</a></li?</ul>";
$('div#research-faculty-mbrs').append(viewMore);
}
});
}
function adjustImageHeight(theImg) {
$img = theImg;
var hgt = $img.attr("height");
if ( hgt > 70 ) {
var liHtml = $img.parent('li').html();
liHtml = liHtml.replace("<img","<div id='adjImgHeight'><img");
liHtml = liHtml.replace("<h1","</div><h1");
$img.parent('li').html(liHtml);
}
}
function buildAcademicDepartments() {
var deptNbr = academicDepartments.length;
var html = "<ul>";
var index = Math.floor((Math.random()*deptNbr)+1)-1;
if ( deptNbr == 0 ) {
html += "<p><li>No academic departments found.</li></p>";
}
else if ( deptNbr > 6 ) {
for ( var i=0;i<6;i++) {
html += "<li><a href='${urls.base}/display"
+ academicDepartments[index].uri + "'>"
+ academicDepartments[index].name + "</a></li>";
index = Math.floor((Math.random()*deptNbr)+1)-1;
}
}
else {
for ( var i=0;i<deptNbr;i++) {
html += "<li><a href='${urls.base}/display"
+ academicDepartments[i].uri + "'>"
+ academicDepartments[i].name + "</a></li>";
}
}
if ( deptNbr > 0 ) {
html += "</ul><ul style='list-style:none'><li style='font-size:0.9em;text-align:right;padding: 6px 16px 0 0'><a href='" + urlsBase + "/organizations/%23http://vivoweb.org/ontology/core%23AcademicDepartment' alt='view all academic departments'>View all ...</a></li></ul>";
}
$('div#academic-depts').html(html);
}
});

File diff suppressed because one or more lines are too long

23
productMods/js/leaflet/LICENSE Executable file
View file

@ -0,0 +1,23 @@
Copyright (c) 2010-2013, Vladimir Agafonkin
Copyright (c) 2010-2011, CloudMade
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are
permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of
conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list
of conditions and the following disclaimer in the documentation and/or other materials
provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

BIN
productMods/js/leaflet/dist/images/layers.png vendored Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 973 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 B

8339
productMods/js/leaflet/dist/leaflet-src.js vendored Executable file

File diff suppressed because it is too large Load diff

457
productMods/js/leaflet/dist/leaflet.css vendored Executable file
View file

@ -0,0 +1,457 @@
/* required styles */
.leaflet-map-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-pane,
.leaflet-overlay-pane,
.leaflet-shadow-pane,
.leaflet-marker-pane,
.leaflet-popup-pane,
.leaflet-overlay-pane svg,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
position: absolute;
left: 0;
top: 0;
}
.leaflet-container {
overflow: hidden;
-ms-touch-action: none;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
/* map is broken in FF if you have max-width: 100% on tiles */
.leaflet-container img {
max-width: none !important;
}
/* stupid Android 2 doesn't understand "max-width: none" properly */
.leaflet-container img.leaflet-image-layer {
max-width: 15000px !important;
}
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
width: 0;
height: 0;
}
.leaflet-tile-pane { z-index: 2; }
.leaflet-objects-pane { z-index: 3; }
.leaflet-overlay-pane { z-index: 4; }
.leaflet-shadow-pane { z-index: 5; }
.leaflet-marker-pane { z-index: 6; }
.leaflet-popup-pane { z-index: 7; }
/* control positioning */
.leaflet-control {
position: relative;
z-index: 7;
pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
position: absolute;
z-index: 1000;
pointer-events: none;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
float: left;
clear: both;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
/* zoom and fade animations */
.leaflet-fade-anim .leaflet-tile,
.leaflet-fade-anim .leaflet-popup {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
-o-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-tile-loaded,
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
-o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1);
transition: transform 0.25s cubic-bezier(0,0,0.25,1);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile,
.leaflet-touching .leaflet-zoom-animated {
-webkit-transition: none;
-moz-transition: none;
-o-transition: none;
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
/* cursors */
.leaflet-clickable {
cursor: pointer;
}
.leaflet-container {
cursor: -webkit-grab;
cursor: -moz-grab;
}
.leaflet-popup-pane,
.leaflet-control {
cursor: auto;
}
.leaflet-dragging,
.leaflet-dragging .leaflet-clickable,
.leaflet-dragging .leaflet-container {
cursor: move;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
}
/* visual tweaks */
.leaflet-container {
background: #ddd;
outline: 0;
}
.leaflet-container a {
color: #0078A8;
}
.leaflet-container a.leaflet-active {
outline: 2px solid orange;
}
.leaflet-zoom-box {
border: 2px dotted #05f;
background: white;
opacity: 0.5;
}
/* general typography */
.leaflet-container {
font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
}
/* general toolbar styles */
.leaflet-bar {
box-shadow: 0 0 8px rgba(0,0,0,0.4);
border: 1px solid #888;
-webkit-border-radius: 5px;
border-radius: 5px;
}
.leaflet-bar-part {
background-color: rgba(255, 255, 255, 0.8);
border-bottom: 1px solid #aaa;
}
.leaflet-bar-part-top {
-webkit-border-radius: 4px 4px 0 0;
border-radius: 4px 4px 0 0;
}
.leaflet-bar-part-bottom {
-webkit-border-radius: 0 0 4px 4px;
border-radius: 0 0 4px 4px;
border-bottom: none;
}
.leaflet-touch .leaflet-bar {
-webkit-border-radius: 10px;
border-radius: 10px;
}
.leaflet-touch .leaflet-bar-part {
border-bottom: 4px solid rgba(0,0,0,0.3);
}
.leaflet-touch .leaflet-bar-part-top {
-webkit-border-radius: 7px 7px 0 0;
border-radius: 7px 7px 0 0;
}
.leaflet-touch .leaflet-bar-part-bottom {
-webkit-border-radius: 0 0 7px 7px;
border-radius: 0 0 7px 7px;
border-bottom: none;
}
/* zoom control */
.leaflet-container .leaflet-control-zoom {
margin-left: 13px;
margin-top: 12px;
}
.leaflet-control-zoom a {
width: 22px;
height: 22px;
text-align: center;
text-decoration: none;
color: black;
}
.leaflet-control-zoom a,
.leaflet-control-layers-toggle {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-control-zoom a:hover {
background-color: #fff;
color: #777;
}
.leaflet-control-zoom-in {
font: bold 18px/24px Arial, Helvetica, sans-serif;
}
.leaflet-control-zoom-out {
font: bold 23px/20px Tahoma, Verdana, sans-serif;
}
.leaflet-control-zoom a.leaflet-control-zoom-disabled {
cursor: default;
background-color: rgba(255, 255, 255, 0.8);
color: #bbb;
}
.leaflet-touch .leaflet-control-zoom a {
width: 30px;
height: 30px;
}
.leaflet-touch .leaflet-control-zoom-in {
font-size: 24px;
line-height: 29px;
}
.leaflet-touch .leaflet-control-zoom-out {
font-size: 28px;
line-height: 24px;
}
/* layers control */
.leaflet-control-layers {
box-shadow: 0 1px 7px rgba(0,0,0,0.4);
background: #f8f8f9;
-webkit-border-radius: 8px;
border-radius: 8px;
}
.leaflet-control-layers-toggle {
background-image: url(images/layers.png);
width: 36px;
height: 36px;
}
.leaflet-touch .leaflet-control-layers-toggle {
width: 44px;
height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
padding: 6px 10px 6px 6px;
color: #333;
background: #fff;
}
.leaflet-control-layers-selector {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
}
.leaflet-control-layers-separator {
height: 0;
border-top: 1px solid #ddd;
margin: 5px -10px 5px -6px;
}
/* attribution and scale controls */
.leaflet-container .leaflet-control-attribution {
background-color: rgba(255, 255, 255, 0.7);
box-shadow: 0 0 5px #bbb;
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
padding: 0 5px;
color: #333;
}
.leaflet-container .leaflet-control-attribution,
.leaflet-container .leaflet-control-scale {
font-size: 11px;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
border: 2px solid #777;
border-top: none;
color: black;
line-height: 1.1;
padding: 2px 5px 1px;
font-size: 11px;
text-shadow: 1px 1px 1px #fff;
background-color: rgba(255, 255, 255, 0.5);
box-shadow: 0 -1px 5px rgba(0, 0, 0, 0.2);
white-space: nowrap;
overflow: hidden;
}
.leaflet-control-scale-line:not(:first-child) {
border-top: 2px solid #777;
border-bottom: none;
margin-top: -2px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-control-zoom {
box-shadow: none;
}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-control-zoom {
border: 4px solid rgba(0,0,0,0.3);
}
/* popup */
.leaflet-popup {
position: absolute;
text-align: center;
}
.leaflet-popup-content-wrapper {
padding: 1px;
text-align: left;
-webkit-border-radius: 20px;
border-radius: 20px;
}
.leaflet-popup-content {
margin: 14px 20px;
line-height: 1.4;
}
.leaflet-popup-content p {
margin: 18px 0;
}
.leaflet-popup-tip-container {
margin: 0 auto;
width: 40px;
height: 20px;
position: relative;
overflow: hidden;
}
.leaflet-popup-tip {
width: 15px;
height: 15px;
padding: 1px;
margin: -8px auto 0;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
.leaflet-popup-content-wrapper, .leaflet-popup-tip {
background: white;
box-shadow: 0 3px 14px rgba(0,0,0,0.4);
}
.leaflet-container a.leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
padding: 4px 5px 0 0;
text-align: center;
width: 18px;
height: 14px;
font: 16px/14px Tahoma, Verdana, sans-serif;
color: #c3c3c3;
text-decoration: none;
font-weight: bold;
background: transparent;
}
.leaflet-container a.leaflet-popup-close-button:hover {
color: #999;
}
.leaflet-popup-scrolled {
overflow: auto;
border-bottom: 1px solid #ddd;
border-top: 1px solid #ddd;
}
/* div icon */
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
.leaflet-editing-icon {
-webkit-border-radius: 2px;
border-radius: 2px;
}

57
productMods/js/leaflet/dist/leaflet.ie.css vendored Executable file
View file

@ -0,0 +1,57 @@
.leaflet-vml-shape {
width: 1px;
height: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
.leaflet-control {
display: inline;
}
.leaflet-popup-tip {
width: 21px;
_width: 27px;
margin: 0 auto;
_margin-top: -3px;
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
}
.leaflet-popup-tip-container {
margin-top: -1px;
}
.leaflet-popup-content-wrapper, .leaflet-popup-tip {
border: 1px solid #999;
}
.leaflet-popup-content-wrapper {
zoom: 1;
}
.leaflet-control-zoom,
.leaflet-control-layers {
border: 3px solid #999;
}
.leaflet-control-zoom a {
background-color: #eee;
}
.leaflet-control-zoom a:hover {
background-color: #fff;
}
.leaflet-control-layers-toggle {
}
.leaflet-control-attribution,
.leaflet-control-layers,
.leaflet-control-scale-line {
background: white;
}
.leaflet-zoom-box {
filter: alpha(opacity=50);
}
.leaflet-control-attribution {
border-top: 1px solid #bbb;
border-left: 1px solid #bbb;
}

8
productMods/js/leaflet/dist/leaflet.js vendored Executable file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,131 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#-- Macros used to build the statistical information on the home page -->
<#-- Get the classgroups so they can be used to qualify searches -->
<#macro allClassGroupNames classGroups>
<#list classGroups as group>
<#-- Only display populated class groups -->
<#if (group.individualCount > 0)>
<li role="listitem"><a href="" title="${group.uri}">${group.displayName?capitalize}</a></li>
</#if>
</#list>
</#macro>
<#-- We need the faculty count in order to randomly select 4 faculty using a solr query -->
<#macro facultyMemberCount classGroups>
<#assign foundClassGroup = false />
<#list classGroups as group>
<#if (group.individualCount > 0) && group.displayName == "people" >
<#list group.classes as class>
<#if (class.name == "Faculty Member") >
<#assign foundClassGroup = true />
<#if (class.individualCount > 0) >
<script>var facultyMemberCount = ${class.individualCount?string?replace(",","")};</script>
<#else>
<script>var facultyMemberCount = 0;</script>
</#if>
</#if>
</#list>
</#if>
</#list>
<#if !foundClassGroup>
<script>var facultyMemberCount = 0;</script>
</#if>
</#macro>
<#-- builds the "stats" section of the home page, i.e., class group counts -->
<#macro allClassGroups classGroups>
<#-- Loop through classGroups first so we can account for situations when all class groups are empty -->
<#assign selected = 'class="selected" ' />
<#assign classGroupList>
<#list classGroups as group>
<#-- Only display populated class groups -->
<#if (group.individualCount > 0)>
<#-- Catch the first populated class group. Will be used later as the default selected class group -->
<#if !firstPopulatedClassGroup??>
<#assign firstPopulatedClassGroup = group />
</#if>
<#-- Determine the active (selected) group -->
<#assign activeGroup = "" />
<#if !classGroup??>
<#if group_index == 0>
<#assign activeGroup = selected />
</#if>
<#elseif classGroup.uri == group.uri>
<#assign activeGroup = selected />
</#if>
<#if group.displayName != "equipment" && group.displayName != "locations" && group.displayName != "courses" >
<li>
<a href="#">
<p class="stats-count">
<#if (group.individualCount > 10000) >
<#assign overTen = group.individualCount/1000>
${overTen?round}<span>k</span>
<#elseif (group.individualCount > 1000)>
<#assign underTen = group.individualCount/1000>
${underTen?string("0.#")}<span>k</span>
<#else>
${group.individualCount}<span>&nbsp;</span>
</#if>
</p>
<p class="stats-type">${group.displayName?capitalize}</p>
</a>
</li>
</#if>
</#if>
</#list>
</#assign>
<#-- Display the class group browse only if we have at least one populated class group -->
<#if firstPopulatedClassGroup??>
${classGroupList}
<#else>
<h3>There is currently no content in the system, or you need to create class groups and assign your classes to them.</h3>
<#if user.loggedIn>
<#if user.hasSiteAdminAccess>
<p>You can <a href="${urls.siteAdmin}" title="Manage content">add content and manage this site</a> from the Site Administration page.</p>
</#if>
<#else>
<p>Please <a href="${urls.login}" title="log in to manage this site">log in</a> to manage content.</p>
</#if>
</#if>
</#macro>
<#-- builds the "research" box on the home page -->
<#macro researchClasses classGroups=vClassGroups>
<#assign foundClassGroup = false />
<#list classGroups as group>
<#if (group.individualCount > 0) && group.displayName == "research" >
<#assign foundClassGroup = true />
<#list group.classes as class>
<#if (class.name == "Academic Article" || class.name == "Book" || class.name == "Conference Paper" ||class.name == "Media Contribution" || class.name == "Report" || class.name == "Library Collection") && (class.individualCount > 0)>
<li role="listitem"><span>${class.individualCount!}</span>&nbsp;<a href='${urls.base}/individuallist?vclassId=${class.uri?replace("#","%23")!}'>${class.name}s</a></li>
</#if>
</#list>
<li><a href="${urls.base}/research" alt="view all research">View all ...</a></li>
</#if>
</#list>
<#if !foundClassGroup>
<p><li>No research records found.</li></p>
</#if>
</#macro>
<#-- builds the "academic departments" box on the home page -->
<#macro academicDepartments>
<script>
var academicDepartments = [
<#if academicDeptDG?has_content>
<#list academicDeptDG as resultRow>
<#assign uri = resultRow["deptURI"] />
<#assign label = resultRow["name"] />
<#assign localName = uri?substring(uri?last_index_of("/")) />
{"uri": "${localName}", "name": "${label}"}<#if (resultRow_has_next)>,</#if>
</#list>
</#if>
];
var urlsBase = "${urls.base}";
</script>
</#macro>

View file

@ -0,0 +1,12 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#-- Template for scripts and css relating to the geographic focus maps on the home page. -->
<link rel="stylesheet" href="${urls.base}/js/leaflet/dist/leaflet.css" />
<!--[if lte IE 8]>
<link rel="stylesheet" href="${urls.base}/js/leaflet/dist/leaflet.ie.css" />
<![endif]-->
<link rel="stylesheet" href="${urls.base}/css/home-page-maps.css" />
<script src="${urls.base}/js/leaflet/dist/leaflet.js"></script>
<script type="text/javascript" src="${urls.base}/js/latLongJson.js?version=1"></script>
<script type="text/javascript" src="${urls.base}/js/homePageMaps.js?version=x"></script>

View file

@ -0,0 +1,150 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.ajax;
import java.io.IOException;
import java.lang.Integer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.RDFNode;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.ajax.VitroAjaxController;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils;
public class GeoFocusMapLocations extends AbstractAjaxResponder {
private static final Log log = LogFactory.getLog(GeoFocusMapLocations.class.getName());
private List<Map<String,String>> geoLocations;
private static String GEO_FOCUS_QUERY = ""
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n"
+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \n"
+ "PREFIX core: <http://vivoweb.org/ontology/core#> \n"
+ "PREFIX foaf: <http://xmlns.com/foaf/0.1/> \n"
+ "PREFIX vivoc: <http://vivo.library.cornell.edu/ns/0.1#> \n"
+ "SELECT DISTINCT ?label ?location (COUNT(?person) AS ?count) \n"
+ "WHERE { {"
+ " ?location rdf:type core:GeographicRegion . \n"
+ " ?location rdfs:label ?label . "
+ " ?location core:geographicFocusOf ?person . \n"
+ " ?person rdf:type foaf:Person \n"
+ " FILTER (! regex(str(?location), \"dbpedia\")) \n"
+ "} UNION { \n "
+ " ?sublocation rdf:type vivoc:DomesticGeographicalRegion . \n"
+ " ?sublocation core:geographicFocusOf ?person . \n"
+ " ?person rdf:type foaf:Person \n"
+ " bind((\"United States of America\"^^<http://www.w3.org/2001/XMLSchema#string>) AS ?label) \n"
+ " bind(<http://aims.fao.org/aos/geopolitical.owl#United_States_of_America> AS ?location) \n"
+ "} } \n"
+ "GROUP BY ?label ?location \n"
+ "ORDER BY ?label ?location \n";
public GeoFocusMapLocations(HttpServlet parent, VitroRequest vreq,
HttpServletResponse resp) {
super(parent, vreq, resp);
}
@Override
public String prepareResponse() throws IOException, JSONException {
try {
geoLocations = getGeoLocations(vreq);
// String response = "{\"type\": \"FeatureCollection\",\"features\": [";
String response = "[";
String geometry = "{\"geometry\": {\"type\": \"Point\",\"coordinates\": \"\"},";
String typeProps = "\"type\": \"Feature\",\"properties\": {\"mapType\": \"\",";
String previousLabel = "";
for (Map<String, String> map: geoLocations) {
String label = map.get("label");
String html = map.get("count");
String uri = UrlBuilder.urlEncode(map.get("location"));
Integer count = Integer.parseInt(map.get("count"));
String radius = String.valueOf(calculateRadius(count));
if ( !label.equals(previousLabel) ) {
String tempStr = geometry; //+label
tempStr += typeProps //+ label
+ "\"popupContent\": \""
+ label
+ "\",\"html\":"
+ html
+ ",\"radius\":"
+ radius
+ ",\"uri\": \""
+ uri
+ "\"}},";
response += tempStr;
previousLabel = label;
}
}
response = response.substring(0, response.lastIndexOf(","));
response += " ]";
log.debug(response);
return response;
} catch (Exception e) {
log.error("Failed geographic focus locations", e);
return EMPTY_RESPONSE;
}
}
private List<Map<String,String>> getGeoLocations(VitroRequest vreq) {
String queryStr = GEO_FOCUS_QUERY;
log.debug("queryStr = " + queryStr);
List<Map<String,String>> locations = new ArrayList<Map<String,String>>();
try {
ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
locations.add(QueryUtils.querySolutionToStringValueMap(soln));
}
} catch (Exception e) {
log.error(e, e);
}
return locations;
}
private Integer calculateRadius(Integer count) {
int radius = 8;
if ( count != null ) {
if ( count < 4 ) {
radius = 8;
}
else if ( count < 7 ) {
radius = 10;
}
else if ( count < 10 ) {
radius = 12;
}
else if ( count < 16 ) {
radius = 14;
}
else if ( count < 21 ) {
radius = 16;
}
else if ( count < 26 ) {
radius = 18;
}
else {
radius = 20;
}
}
return radius;
}
}

View file

@ -0,0 +1,42 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.ajax;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.ajax.VitroAjaxController;
/**
* Handle the AJAX functions that are specific to the "new" home page sections, at
* this point just the mapping of geographic locations.
*/
public class HomePageAjaxController extends VitroAjaxController {
private static final Log log = LogFactory
.getLog(HomePageAjaxController.class);
private static final String PARAMETER_ACTION = "action";
@Override
protected void doRequest(VitroRequest vreq, HttpServletResponse resp)
throws ServletException, IOException {
try {
String function = vreq.getParameter(PARAMETER_ACTION);
if ("getGeoFocusLocations".equals(function)) {
new GeoFocusMapLocations(this, vreq, resp).processRequest();
} else {
resp.getWriter().write("[]");
}
} catch (Exception e) {
log.error(e, e);
resp.getWriter().write("[]");
}
}
}

View file

@ -594,14 +594,14 @@ ul#main-nav {
width: 930px; width: 930px;
margin: 0 auto; margin: 0 auto;
background: #fff; background: #fff;
min-height: 700px; min-height: 710px;
padding: 20px; padding: 20px;
} }
/* INTRO-BLURB ------> */ /* INTRO-BLURB ------> */
#intro { #intro {
float: left; float: left;
width: 570px; width: 570px;
padding-bottom: 40px; padding-bottom: 50px;
} }
body.loggedIn #intro { body.loggedIn #intro {
width: 98%; width: 98%;
@ -909,11 +909,21 @@ a.view-all-style {
} }
/* HOME STATS-----> */ /* HOME STATS-----> */
#home-stats { .home-sections {
border-top: 1px dotted #dbe3e3; /* stroke */ border-top: 1px dotted #dbe3e3; /* stroke */
border-bottom: 1px dotted #dbe3e3; /* stroke */ border-bottom: 1px dotted #dbe3e3; /* stroke */
background-color: #fff; /* layer fill content */ background-color: #fff; /* layer fill content */
} }
.home-sections h4 {
border-top: 1px solid rgba(220,228,227,.42); /* stroke */
border-bottom: 1px solid rgba(220,228,227,.42); /* stroke */
background-color: #395d7f; /* layer fill content */
border-bottom: 2px solid #62b6d7;
color: #fff;
}
#home-stats {
margin-top: 30px;
}
#home-stats h4 { #home-stats h4 {
border-top: 1px solid rgba(220,228,227,.42); /* stroke */ border-top: 1px solid rgba(220,228,227,.42); /* stroke */
border-bottom: 1px solid rgba(220,228,227,.42); /* stroke */ border-bottom: 1px solid rgba(220,228,227,.42); /* stroke */
@ -941,8 +951,118 @@ a.view-all-style {
color: #fff; color: #fff;
opacity: .5; opacity: .5;
} }
#home-research {
width: 297px;
float: left;
clear: both;
}
#home-research h4 {
width: 100px;
}
#home-research ul {
padding: 0.7em 0 0.6em 0.75em;
}
#home-research li {
line-height: 1.25em;
margin-top: 0.7em;
font-size: 0.9em;
}
#home-research li:last-child {
text-align:right;
padding: 4px 16px 0 0;
}
#home-research li span {
color: #fff;
background: url(../../../images/count-background.png) no-repeat;
width: 65px;
height: 27px;
display: inline-block;
padding: 6px 8px 0 0;
margin-left: 4px;
text-align: center;
}
#home-academic-depts {
width: 297px;
margin-left: 15px;
float: left;
}
#home-academic-depts h4 {
width: 136px;
}
#home-academic-depts ul {
list-style: disc outside url(../../../images/arrowIcon.gif);
padding: 0.4em 0 0.6em 1.8em;
}
#home-academic-depts li {
line-height: 1.25em;
padding-top: 1.0em;
padding-right: 4px;
font-size: 0.9em;
}
#home-faculty-mbrs {
width: 297px;
margin: 0 0 20px 15px;
float: left;
}
#home-faculty-mbrs h4 {
width: 86px;
}
div#tempSpacing {
height:325px;
}
div#research-faculty-mbrs {
font-size: 0.9em;
line-height: 16px;
}
div#research-faculty-mbrs li.individual {
clear: both;
}
div#research-faculty-mbrs ul li.individual:first-child {
clear: both;
padding-top: 20px
}
div#research-faculty-mbrs li h1 {
padding: 6px 0 2px 0;
}
div#research-faculty-mbrs li img {
width: 60px;
float: left;
padding: 0px 8px 10px 10px;
}
div#research-faculty-mbrs li span.title {
display: block;
font-size: 0.825em;
line-height: 1.25em;
padding-bottom: 8px;
}
div#research-faculty-mbrs ul#viewMoreFac {
list-style:none;
}
div#research-faculty-mbrs ul#viewMoreFac li {
text-align:right;
padding: 0 16px 8px 0;
clear:both;
}
div#adjImgHeight {
height:65px;
overflow:hidden;
float:left;
margin-bottom:10px;
}
#home-geo-focus {
clear: both;
display: inline-block;
margin-top: 10px;
height: 632px;
width: 921px;
}
#home-geo-focus h4 {
width: 172px;
}
#home-geo-focus div#timeIndicator {
text-align:center;
margin-top:100px;
}
/* FOOTER------> */ /* FOOTER------> */
footer { footer {
clear: both; clear: both;

View file

@ -1,20 +1,36 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> <#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<@widget name="login" include="assets" /> <@widget name="login" include="assets" />
<#--
With release 1.6, the home page no longer uses the "browse by" class group/classes display.
If you prefer to use the "browse by" display, replace the import statement below with the
following include statement:
<#include "browse-classgroups.ftl"> <#include "browse-classgroups.ftl">
Also ensure that the homePage.geoFocusMaps flag in the runtime.properties file is commented
out.
-->
<#import "lib-home-page.ftl" as lh>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<#include "head.ftl"> <#include "head.ftl">
<#if geoFocusMapsEnabled >
<#include "geoFocusMapScripts.ftl">
</#if>
<script type="text/javascript" src="${urls.base}/js/homePageUtils.js?version=x"></script>
</head> </head>
<body class="${bodyClasses!}" onload="${bodyOnload!}"> <body class="${bodyClasses!}" onload="${bodyOnload!}">
<#-- supplies the faculty count to the js function that generates a random row number for the solr query -->
<@lh.facultyMemberCount vClassGroups! />
<#include "identity.ftl"> <#include "identity.ftl">
<#include "menu.ftl"> <#include "menu.ftl">
<section id="intro" role="region"> <section id="intro" role="region">
<h2>Welcome to VIVO</h2> <h2>Welcome to VIVO</h2>
@ -28,19 +44,16 @@
<legend>Search form</legend> <legend>Search form</legend>
<form id="search-homepage" action="${urls.search}" name="search-home" role="search" method="post" > <form id="search-homepage" action="${urls.search}" name="search-home" role="search" method="post" >
<div id="search-home-field"> <div id="search-home-field">
<input type="text" name="querytext" class="search-homepage" value="${querytext!}" autocapitalize="off" /> <input type="text" name="querytext" class="search-homepage" value="" autocapitalize="off" />
<input type="submit" value="Search" class="search" /> <input type="submit" value="Search" class="search" />
<input type="hidden" name="classgroup" class="search-homepage" value="" autocapitalize="off" />
</div> </div>
<a class="filter-search filter-default" href="#" title="Filter search"><span class="displace">filter search</span></a> <a class="filter-search filter-default" href="#" title="Filter search"><span class="displace">filter search</span></a>
<ul id="filter-search-nav"> <ul id="filter-search-nav">
<li><a class="active" href="">All</a></li> <li><a class="active" href="">All</a></li>
<li><a href="">People</a></li> <@lh.allClassGroupNames vClassGroups! />
<li><a href="">Organizations</a></li>
<li><a href="">Research</a></li>
<li><a href="">Events</a></li>
<li><a href="">Topics</a></li>
</ul> </ul>
</form> </form>
</fieldset> </fieldset>
@ -50,21 +63,60 @@
<@widget name="login" /> <@widget name="login" />
<#--<@allClassGroups vClassGroups! />--> <section id="home-research" class="home-sections">
<h4>Research</h4>
<ul>
<@lh.researchClasses />
<section id="home-stats"> </ul>
<h4>Stats</h4> </section>
<section id="home-faculty-mbrs" class="home-sections" >
<h4>Faculty</h4>
<div id="tempSpacing">&nbsp;</div>
<div id="research-faculty-mbrs">
<!-- populated via an ajax call -->
<ul id="facultyThumbs">
</ul>
</div>
</section>
<section id="home-academic-depts" class="home-sections">
<h4>Departments</h4>
<div id="academic-depts"></div>
</section>
<#if geoFocusMapsEnabled >
<section id="home-geo-focus" class="home-sections">
<h4>Geographic Focus</h4>
<div id="mapControls">
<a id="globalLink" class="selected" href="javascript:">Global Research</a>&nbsp;|&nbsp;
<a id="usLink" href="javascript:">US Research</a>&nbsp;|&nbsp;
<#-- <a id="stateLink" href="javascript:">NY Research</a> -->
</div>
<div id="researcherTotal"></div>
<div id="timeIndicator">
<span>Loading map information . . .&nbsp;&nbsp;&nbsp;
<img src="${urls.images}/indicatorWhite.gif">
</span>
</div>
<div id="mapGlobal" class="mapArea"></div>
<div id="mapUS" class="mapArea"></div>
<div id="mapState" class="mapArea"></div>
</section>
</#if>
<section id="home-stats" class="home-sections" >
<h4>Statistics</h4>
<ul id="stats"> <ul id="stats">
<li><a href="#"><p class="stats-count">19<span>k</span></p><p class="stats-type">People</p></a></li> <@lh.allClassGroups vClassGroups! />
<li><a href="#"><p class="stats-count">128<span>k</span></p><p class="stats-type">Research</p></a></li>
<li><a href="#"><p class="stats-count">22<span>k</span></p><p class="stats-type">Organizations</p></a></li>
<li><a href="#"><p class="stats-count">29<span>k</span></p><p class="stats-type">Events</p></a></li>
<li><a href="#"><p class="stats-count">1.9<span>k</span></p><p class="stats-type">Topics</p></a></li>
<li><a href="#"><p class="stats-count">6.5<span>k</span></p><p class="stats-type">Activities</p></a></li>
</ul> </ul>
</section> </section>
<#include "footer.ftl"> <#include "footer.ftl">
<#-- builds a json object that is used by js to render the academic departments section -->
<@lh.academicDepartments />
</body> </body>
</html> </html>