1. Made changes to style of the person level elements.

2. Made changes as to how the URI for "download data" & "view full timeline n/w" were generated.
This commit is contained in:
cdtank 2010-07-02 01:06:46 +00:00
parent 12a005ea96
commit a8d6b13c3d
7 changed files with 250 additions and 259 deletions

View file

@ -43,7 +43,7 @@ public class VisualizationCodeGenerator {
private VisVOContainer valueObjectContainer;
public VisualizationCodeGenerator(String requestURI,
public VisualizationCodeGenerator(String contextPath,
String individualURIParam,
String visMode,
String visContainer,
@ -56,7 +56,7 @@ public class VisualizationCodeGenerator {
this.valueObjectContainer = valueObjectContainer;
this.log = log;
generateVisualizationCode(requestURI,
generateVisualizationCode(contextPath,
individualURIParam,
visMode,
visContainer,
@ -65,7 +65,7 @@ public class VisualizationCodeGenerator {
}
private void generateVisualizationCode(String requestURI,
private void generateVisualizationCode(String contextPath,
String individualURIParam,
String visMode,
String visContainer,
@ -76,7 +76,7 @@ public class VisualizationCodeGenerator {
visContainer));
valueObjectContainer.setSparklineContext(getVisualizationContextCode(requestURI,
valueObjectContainer.setSparklineContext(getVisualizationContextCode(contextPath,
individualURIParam,
visMode));
@ -144,7 +144,7 @@ public class VisualizationCodeGenerator {
numOfYearsToBeRendered = currentYear - minPubYearConsidered + 1;
visualizationCode.append("<style type='text/css'>" +
/*"." + visualizationStyleClass + " table{" +
"." + visualizationStyleClass + " table{" +
" margin: 0;" +
" padding: 0;" +
" width: auto;" +
@ -152,7 +152,7 @@ public class VisualizationCodeGenerator {
" border-spacing: 0;" +
" vertical-align: inherit;" +
"}" +
"#sparkline_data_table {" +
/*"#sparkline_data_table {" +
"width: auto;" +
"}" +
"#sparkline_data_table tfoot {" +
@ -404,13 +404,13 @@ public class VisualizationCodeGenerator {
"</script>\n";
}
private String getVisualizationContextCode(String uri, String individualURI, String visMode) {
private String getVisualizationContextCode(String contextPath, String individualURI, String visMode) {
String visualizationContextCode = "";
if (SHORT_SPARKLINE_MODE_URL_HANDLE.equalsIgnoreCase(visMode)) {
visualizationContextCode = generateShortVisContext(uri, individualURI);
visualizationContextCode = generateShortVisContext(contextPath, individualURI);
} else {
visualizationContextCode = generateFullVisContext(uri, individualURI);
visualizationContextCode = generateFullVisContext(contextPath, individualURI);
}
@ -425,7 +425,7 @@ public class VisualizationCodeGenerator {
return visualizationContextCode;
}
private String generateFullVisContext(String uri,
private String generateFullVisContext(String contextPath,
String individualURI) {
StringBuilder divContextCode = new StringBuilder();
@ -436,7 +436,8 @@ public class VisualizationCodeGenerator {
if (yearToPublicationCount.size() > 0) {
String downloadURL = uri.toString()
String downloadURL = contextPath
+ "/admin/visQuery"
+ "?" + VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE
+ "=" + URLEncoder.encode(individualURI,
VisualizationController.URL_ENCODING_SCHEME).toString()
@ -470,7 +471,7 @@ public class VisualizationCodeGenerator {
}
private String generateShortVisContext(String uri,
private String generateShortVisContext(String contextPath,
String individualURI) {
StringBuilder divContextCode = new StringBuilder();
@ -479,19 +480,40 @@ public class VisualizationCodeGenerator {
String fullTimelineLink;
if (yearToPublicationCount.size() > 0) {
String fullTimelineNetworkURL = uri.toString() + "?" +
VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE +
"=" + URLEncoder.encode(individualURI,
VisualizationController.URL_ENCODING_SCHEME).toString() +
"&" +
"vis" +
"=" + URLEncoder.encode(VisualizationController
.PERSON_PUBLICATION_COUNT_VIS_URL_VALUE,
VisualizationController.URL_ENCODING_SCHEME).toString() +
"&" +
VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE +
"=" + URLEncoder.encode(VisualizationFrameworkConstants.STANDALONE_RENDER_MODE_URL_VALUE,
VisualizationController.URL_ENCODING_SCHEME).toString();
// String fullTimelineNetworkURL = uri.toString() + "?" +
// VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE +
// "=" + URLEncoder.encode(individualURI,
// VisualizationController.URL_ENCODING_SCHEME).toString() +
// "&" +
// "vis" +
// "=" + URLEncoder.encode(VisualizationController
// .PERSON_PUBLICATION_COUNT_VIS_URL_VALUE,
// VisualizationController.URL_ENCODING_SCHEME).toString() +
// "&" +
// VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE +
// "=" + URLEncoder.encode(VisualizationFrameworkConstants.STANDALONE_RENDER_MODE_URL_VALUE,
// VisualizationController.URL_ENCODING_SCHEME).toString();
String fullTimelineNetworkURL = contextPath
+ "/admin/visQuery"
+ "?"
+ VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE
+ "=" + URLEncoder.encode(individualURI,
VisualizationController.URL_ENCODING_SCHEME).toString()
+ "&"
+ VisualizationFrameworkConstants.VIS_TYPE_URL_HANDLE
+ "=" + URLEncoder.encode("person_level",
VisualizationController.URL_ENCODING_SCHEME).toString()
+ "&"
+ VisualizationFrameworkConstants.VIS_CONTAINER_URL_HANDLE
+ "=" + URLEncoder.encode("ego_sparkline",
VisualizationController.URL_ENCODING_SCHEME).toString()
+ "&"
+ VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE
+ "=" + URLEncoder.encode(VisualizationFrameworkConstants.STANDALONE_RENDER_MODE_URL_VALUE,
VisualizationController.URL_ENCODING_SCHEME).toString();
fullTimelineLink = "<a href='" + fullTimelineNetworkURL + "'>View full timeline and network.</a><br />";
valueObjectContainer.setFullTimelineNetworkLink(fullTimelineNetworkURL);

View file

@ -113,7 +113,7 @@ public class VisualizationRequestHandler {
VisVOContainer valueObjectContainer = new VisVOContainer();
VisualizationCodeGenerator visualizationCodeGenerator =
new VisualizationCodeGenerator(vitroRequest.getRequestURI(),
new VisualizationCodeGenerator(vitroRequest.getContextPath(),
individualURIParam,
visMode,
visContainer,

View file

@ -55,6 +55,7 @@ public class VisualizationRequestHandler {
String profileInfoMode = "PROFILE_INFO";
String profileVisMode = "PROFILE_URL";
String coAuthorVisMode = "COAUTHORSHIP_URL";
String personLevelVisMode = "PERSON_LEVEL_URL";
String imageVisMode = "IMAGE_URL";
String resultFormatParam = "RS_TEXT";
@ -182,6 +183,34 @@ public class VisualizationRequestHandler {
prepareVisualizationQueryResponse(preparedURL);
return;
} else if (personLevelVisMode.equalsIgnoreCase(visMode)) {
/*
* By default we will be generating profile url else some specific url like coAuthorShip vis
* url for that individual.
* */
preparedURL += request.getContextPath()
+ "/admin/visQuery"
+ "?"
+ VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE
+ "=" + URLEncoder.encode(individualURIParam,
VisualizationController.URL_ENCODING_SCHEME).toString()
+ "&"
+ VisualizationFrameworkConstants.VIS_TYPE_URL_HANDLE
+ "=" + URLEncoder.encode("person_level",
VisualizationController.URL_ENCODING_SCHEME).toString()
+ "&"
+ VisualizationFrameworkConstants.VIS_CONTAINER_URL_HANDLE
+ "=" + URLEncoder.encode("ego_sparkline",
VisualizationController.URL_ENCODING_SCHEME).toString()
+ "&"
+ VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE
+ "=" + URLEncoder.encode(VisualizationFrameworkConstants.STANDALONE_RENDER_MODE_URL_VALUE,
VisualizationController.URL_ENCODING_SCHEME).toString();
prepareVisualizationQueryResponse(preparedURL);
return;
} else {
preparedURL += request.getContextPath()

View file

@ -83,11 +83,11 @@ $.fn.image = function(src, successFunc, failureFunc){
function setProfileImage(imageContainerID, rawPath, contextPath) {
if (imageContainerID == "") {
return;
}
var imageLink = contextPath + rawPath;
var imageContainer = $("#" + imageContainerID);
@ -175,21 +175,12 @@ function createTable(tableID, tableContainer, tableData) {
var table = $('<table>');
table.attr('id', tableID);
// var columns = {'Author', 'Count'};
table.append($('<caption>').html("Co-Authorships"));
var header = $('<thead>');
var row = $('<tr>');
// Loop thru our columns collection and add each one to the header row
// for (columnName in columns) {
// header.append($('<th>').html(columnName));
// }
row.append($('<th>').html("Author"));
row.append($('<th>').html("Count"));
@ -202,33 +193,22 @@ function createTable(tableID, tableContainer, tableData) {
var row = $('<tr>');
// console.log(item.name + " - " +
// item.number_of_authored_works);
row.append($('<td>').html(item.name));
row.append($('<td>').html(item.number_of_authored_works));
table.append(row);
});
// var footer = $('<tr>');
// var addIcon = $('<img>').attr('src','path/to/add.gif').click(AddRow);
// footer.append($('<td>').append(addIcon));
// for (i in columns)
// footer.append($('<td>'));
// table.append(footer);
table.prependTo('#' + tableContainer);
// return false; // Return false so the link doesn't try to go anywhere
$('#' + tableContainer + " #loadingData").remove();
}
function nodeClickedJS(json){
var obj = jQuery.parseJSON(json);
$("#newsLetter").attr("style","visibility:visible");
$("#dataPanel").attr("style","visibility:visible");
$("#authorName").empty().append(obj.name);
$("#works").empty().append(obj.number_of_authored_works);
@ -251,33 +231,16 @@ function nodeClickedJS(json){
$("#coAuthorName").empty().append(obj.name);
$("#coAuthors").empty().append(obj.num_coauthors);
$("#firstPublication").empty().append((obj.earliest_publication)?obj.earliest_publication+" First Publication":"");
$("#lastPublication").empty().append((obj.latest_publication)?obj.latest_publication+" Last Publication":"");
$("#firstPublication").empty().append(obj.earliest_publication);
(obj.earliest_publication)?$("#fPub").attr("style","visibility:visible"):$("#fPub").attr("style","visibility:hidden");
$("#lastPublication").empty().append(obj.latest_publication);
(obj.latest_publication)?$("#lPub").attr("style","visibility:visible"):$("#lPub").attr("style","visibility:hidden");
// obj.url:the url parameter for node
}
function renderSparklineVisualization(visualizationURL) {
$(document).ready(function() {
// $("#ego_sparkline").empty().html('<img src="${loadingImageLink}" />');
$.ajax({
url: visualizationURL,
dataType: "html",
success:function(data){
$("#ego_sparkline").html(data);
}
});
});
}
function renderCoAuthorshipVisualization() {
// Version check for the Flash Player that has the ability to start Player
@ -300,7 +263,7 @@ function renderCoAuthorshipVisualization() {
"src", "playerProductInstall",
"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
"width", "600",
"height", "800",
"height", "840",
"align", "middle",
"id", "CoAuthor",
"quality", "high",
@ -315,10 +278,10 @@ function renderCoAuthorshipVisualization() {
// embed the Flash Content SWF when all tests are passed
AC_FL_RunContent(
"src", swfLink,
"flashVars", "graphmlUrl=" + egoCoAuthorshipDataURL,
"flashVars", "graphmlUrl=" + egoCoAuthorshipDataFeederURL,
"width", "600",
"height", "800",
"align", "middle",
"height", "840",
"align", "top",
"id", "CoAuthor",
"quality", "high",
"bgcolor", "#ffffff",

View file

@ -1,4 +1,5 @@
<%@ page import="edu.cornell.mannlib.vitro.webapp.visualization.personpubcount.VisVOContainer" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<c:set var='sparkline' value='${requestScope.sparklineVO}'/>

View file

@ -2,7 +2,10 @@
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<c:set var="portalBean" value="${requestScope.portalBean}" />
<c:set var="themeDir"><c:out value="${portalBean.themeDir}" /></c:set>
<c:url var="visImageContextPath" value="/${themeDir}site_icons/visualization/" />
<c:url var="loadingImageLink" value="/${themeDir}site_icons/visualization/ajax-loader.gif"></c:url>
<c:set var='sparkline' value='${requestScope.sparklineVO}' />
@ -18,152 +21,130 @@
<c:param name="uri" value="${requestScope.egoURIParam}" />
</c:url>
<div id="body"><%-- Label --%>
<div class="datatypePropertyValue">
<div class="statementWrap"><span id="ego_label"
class="author_name"></span></div>
<div id="body">
<style type="text/css">
#ego_profile {
padding:10px;
}
#ego_label {
font-size:1.1em;
margin-left:100px;
margin-top:9px;
position:absolute;
}
#ego_moniker {
margin-left:100px;
margin-top:27px;
position:absolute;
}
#ego_profile_image {
width: 100px;
}
#ego_sparkline {
cursor:pointer;
height:36px;
margin-left:10px;
margin-top:69px;
position:absolute;
width:471px;
}
</style>
<div id="ego_profile">
<%-- Label --%>
<span id="ego_label" class="author_name"></span>
<%-- Moniker--%>
<span id="ego_moniker" class="author_moniker"></span>
<%-- Image --%>
<span id="ego_profile_image" class="thumbnail"></span>
<%-- Sparkline --%>
<span id="ego_sparkline">${sparkline.sparklineContent}</span>
</div>
<%-- Moniker--%>
<div class="datatypeProperties">
<div class="datatypePropertyValue">
<div class="statementWrap"><span id="ego_moniker"
class="author_moniker"></span></div>
</div>
</div>
<%-- Image --%>
<div class="datatypeProperties">
<div class="datatypePropertyValue">
<div id="ego_profile_image" class="statementWrap thumbnail"></div>
</div>
</div>
<%-- Sparkline --%>
<div class="datatypeProperties">
<div class="datatypePropertyValue">
<div id="ego_sparkline">${sparkline.sparklineContent}</div>
</div>
</div>
<div id="topShadow"></div>
<div id="bodyPannel" style="height: 900px;"><br class="spacer" />
<div id="visPanel" style="float: left; width: 610px;">
<script type="text/javascript">
<!--
renderCoAuthorshipVisualization();
//-->
</script></div>
<div id="dataPanel" style="float: left; width: 150px;"><br />
<br />
<br />
<br />
<br />
<br />
<div id="newsLetter" style="visibility: hidden"><span
class="nltop"></span>
<div class="middle" id="nodeData">
<div id="profileImage"></div>
<div class="bold"><strong><span id="authorName"
class="author_name">&nbsp;</span></strong></div>
<div class="italicize"><span id="profileMoniker"
class="author_moniker"></span></div>
<div class="works"><span class="numbers" style="width: 40px;"
id="works">6</span>&nbsp;&nbsp;<span class="title">Works</span></div>
<div class="works"><span class="numbers" style="width: 40px;"
id="coAuthors">78</span>&nbsp;&nbsp;<span>Co-author(s)</span></div>
<br />
<div id="firstPublication"><span></span>&nbsp;<span>First
Publication</span></div>
<div id="lastPublication"><span></span>&nbsp;Last Publication</div>
<br />
<div><a href="#" id="profileUrl">VIVO profile</a></div>
<br />
<div><a href="#" id="coAuthorshipVisUrl">Co-author network of
<span id="coAuthorName"></span></a></div>
</div>
<br class="spacer"> <span class="nlbottom"></span>
</div>
</div>
<span class="no_href_styles"> <a href="${coAuthorshipDownloadFile}"><img
src="${visImageContextPath}download_graphml.png" width="91" height="25" /></a>
<div id="bodyPannel" style="height: 900px;">
<br class="spacer" />
<div id="visPanel" style="float: left; width: 610px;">
<script language="JavaScript" type="text/javascript">
<!--
renderCoAuthorshipVisualization();
//-->
</script>
</div>
<div id="dataPanel" style="float: left; width: 150px;" style="visibility:hidden;" >
<br /><br /><br /><br /><br /><br />
<div id="profileImage"></div>
<div class="bold"><strong><span id="authorName" class="author_name">&nbsp;</span></strong></div>
<div class="italicize"><span id="profileMoniker" class="author_moniker"></span></div>
<br />
<div class="works"><span class="numbers" style="width: 40px;" id="works"></span>&nbsp;&nbsp;<span class="title">Works</span></div>
<div class="works"><span class="numbers" style="width: 40px;" id="coAuthors"></span>&nbsp;&nbsp;<span>Co-author(s)</span></div>
<div class="works" id="fPub" style="visibility:hidden"><span class="numbers" style="width:40px;" id="firstPublication"></span>&nbsp;&nbsp;<span>First Publication</span></div>
<div class="works" id="lPub" style="visibility:hidden"><span class="numbers" style="width:40px;" id="lastPublication"></span>&nbsp;&nbsp;<span>Last Publication</span></div>
<br /><br />
<div><a href="#" id="profileUrl">VIVO profile</a></div>
<br />
<div><a href="#" id="coAuthorshipVisUrl">Co-author network of <span id="coAuthorName"></span></a></div>
</div>
<span class="no_href_styles"><a href="${coAuthorshipDownloadFile}">
<img src="${visImageContextPath}download_graphml.png" width="91" height="25" /></a>
</span>
<div id="bottomShadow"></div>
<br class="spacer">
</div>
</div>
<br class="spacer" />
<style type="text/css">
.vis-stats {
width: 760px;
margin: 0;
padding: 0;
}
.vis-tables {
width: 25%;
padding: 5px;
margin: 5px;
background-color: #FFF;
border: 1px solid #ddebf1;
float: left;
}
p.datatable {
font-size: 12px;
display: block;
margin: 2px;
padding: 0
}
.datatable table {
text-align: left;
}
.datatable img {
float: right;
cursor: pointer;
}
.datatable table caption {
color: #16234c;
margin: 0;
padding: 0;
font-size: 14px;
}
</style>
<div class="vis-stats">
<div class="vis-tables">
<p class="datatable">${sparkline.table}
<a href="${egoSparklineDataURL}" class="no_href_styles">
<img src="${visImageContextPath}download_csv.png" width="91" height="25" />
</a>
</p>
</div>
<div class="vis-tables">
<p id="coauth_table_container" class="datatable"></p>
</div>
<div class="vis-tables">
<p class="datatable">
${sparkline.table}
<a href="${egoSparklineDataURL}" class="no_href_styles">
<img src="${visImageContextPath}download_csv.png" width="91" height="25" />
</a>
</p>
</div>
<div class="vis-tables">
<p id="coauth_table_container" class="datatable"></p>
</div>
</div>
</div>
<script>
<script language="JavaScript" type="text/javascript">
$(document).ready(function(){
$("#coauth_table_container").empty().html('<img id="loadingData" with="auto" src="${loadingImageLink}" />');
processProfileInformation("ego_label",
"ego_moniker",
"ego_profile_image",

View file

@ -1,56 +1,51 @@
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<c:set var="portalBean" value="${requestScope.portalBean}" />
<c:set var="themeDir">
<c:out value="${portalBean.themeDir}" />
</c:set>
<c:set var="contextPath">
<c:out value="${pageContext.request.contextPath}" />
</c:set>
<c:url var="egoCoAuthorshipDataFeederURL" value="/admin/visQuery">
<c:param name="vis" value="coauthorship" />
<c:param name="render_mode" value="data" />
<c:param name="uri" value="${requestScope.egoURIParam}" />
<c:param name="labelField" value="name" />
</c:url>
<c:url var="swfLink" value="/${themeDir}site_icons/visualization/coauthorship/CoAuthor.swf" />
<c:url var="jquery" value="/js/jquery.js"/>
<c:url var="adobeFlashDetector" value="/js/visualization/coauthorship/AC_OETags.js" />
<c:url var="googleVisualizationAPI" value="http://www.google.com/jsapi?autoload=%7B%22modules%22%3A%5B%7B%22name%22%3A%22visualization%22%2C%22version%22%3A%221%22%2C%22packages%22%3A%5B%22areachart%22%2C%22imagesparkline%22%5D%7D%5D%7D"/>
<c:url var="coAuthorShipJavaScript" value="/js/visualization/personlevel/person_level.js" />
<script type="text/javascript" src="${adobeFlashDetector}"></script>
<script type="text/javascript" src="${jquery}"></script>
<script type="text/javascript" src="${googleVisualizationAPI}"></script>
<script language="JavaScript" type="text/javascript">
<!--
// -----------------------------------------------------------------------------
// Globals
// Major version of Flash required
var requiredMajorVersion = 10;
// Minor version of Flash required
var requiredMinorVersion = 0;
// Minor version of Flash required
var requiredRevision = 0;
// -----------------------------------------------------------------------------
var swfLink = "${swfLink}";
var egoCoAuthorshipDataFeederURL = "${egoCoAuthorshipDataFeederURL}";
var contextPath = "${contextPath}";
// -->
</script>
<script type="text/javascript" src="${coAuthorShipJavaScript}"></script>
<c:url var="coAuthorStyle" value="/${themeDir}css/visualization/personlevel/coauthor_style.css" />
<c:url var="pageStyle" value="/${themeDir}css/visualization/personlevel/page.css" />
<link href="${coAuthorStyle}" rel="stylesheet" type="text/css" />
<link href="${pageStyle}" rel="stylesheet" type="text/css" />
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<c:set var="portalBean" value="${requestScope.portalBean}" />
<c:set var="themeDir"><c:out value="${portalBean.themeDir}" /></c:set>
<c:set var="contextPath"><c:out value="${pageContext.request.contextPath}" /></c:set>
<c:url var="egoCoAuthorshipDataFeederURL" value="/admin/visQuery">
<c:param name="vis" value="coauthorship" />
<c:param name="render_mode" value="data" />
<c:param name="uri" value="${requestScope.egoURIParam}" />
<c:param name="labelField" value="name" />
</c:url>
<c:url var="swfLink" value="/${themeDir}site_icons/visualization/coauthorship/CoAuthor.swf" />
<c:url var="jquery" value="/js/jquery.js"/>
<c:url var="adobeFlashDetector" value="/js/visualization/coauthorship/AC_OETags.js" />
<c:url var="googleVisualizationAPI" value="http://www.google.com/jsapi?autoload=%7B%22modules%22%3A%5B%7B%22name%22%3A%22visualization%22%2C%22version%22%3A%221%22%2C%22packages%22%3A%5B%22areachart%22%2C%22imagesparkline%22%5D%7D%5D%7D"/>
<c:url var="coAuthorShipJavaScript" value="/js/visualization/personlevel/person_level.js" />
<script type="text/javascript" src="${adobeFlashDetector}"></script>
<script type="text/javascript" src="${jquery}"></script>
<script type="text/javascript" src="${googleVisualizationAPI}"></script>
<script language="JavaScript" type="text/javascript">
<!--
// -----------------------------------------------------------------------------
// Globals
// Major version of Flash required
var requiredMajorVersion = 10;
// Minor version of Flash required
var requiredMinorVersion = 0;
// Minor version of Flash required
var requiredRevision = 0;
// -----------------------------------------------------------------------------
var swfLink = "${swfLink}";
var egoCoAuthorshipDataFeederURL = "${egoCoAuthorshipDataFeederURL}";
var contextPath = "${contextPath}";
// -->
</script>
<script type="text/javascript" src="${coAuthorShipJavaScript}"></script>
<c:url var="coAuthorStyle" value="/${themeDir}css/visualization/personlevel/coauthor_style.css" />
<c:url var="pageStyle" value="/${themeDir}css/visualization/personlevel/page.css" />
<link href="${coAuthorStyle}" rel="stylesheet" type="text/css" />
<link href="${pageStyle}" rel="stylesheet" type="text/css" />