2011-01-03 13:45:30 +00:00
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
var browseByVClass = {
// Initial page setup
onLoad : function ( ) {
this . mergeFromTemplate ( ) ;
this . initObjects ( ) ;
this . bindEventListeners ( ) ;
2011-07-18 17:03:40 +00:00
this . defaultVClass ( ) ;
2011-01-03 13:45:30 +00:00
} ,
// Add variables from menupage template
mergeFromTemplate : function ( ) {
$ . extend ( this , menupageData ) ;
} ,
// Create references to frequently used elements for convenience
initObjects : function ( ) {
2011-01-26 14:32:26 +00:00
this . vgraphVClasses = $ ( '#vgraph-classes' ) ;
this . vgraphVClassLinks = $ ( '#vgraph-classes li a' ) ;
this . browseVClasses = $ ( '#browse-classes' ) ;
this . browseVClassLinks = $ ( '#browse-classes li a' ) ;
this . alphaIndex = $ ( '#alpha-browse-individuals' ) ;
this . alphaIndexLinks = $ ( '#alpha-browse-individuals li a' ) ;
this . individualsInVClass = $ ( '#individuals-in-class ul' ) ;
this . individualsContainer = $ ( '#individuals-in-class' ) ;
2011-01-03 13:45:30 +00:00
} ,
// Event listeners. Called on page load
2011-07-15 19:06:57 +00:00
bindEventListeners : function ( ) {
2011-01-03 13:45:30 +00:00
// Listeners for vClass switching
this . vgraphVClassLinks . click ( function ( ) {
2011-07-15 19:06:57 +00:00
var uri = $ ( this ) . attr ( 'data-uri' ) ;
2011-01-03 13:45:30 +00:00
browseByVClass . getIndividuals ( uri ) ;
} ) ;
this . browseVClassLinks . click ( function ( ) {
2011-07-15 19:06:57 +00:00
var uri = $ ( this ) . attr ( 'data-uri' ) ;
2011-01-03 13:45:30 +00:00
browseByVClass . getIndividuals ( uri ) ;
return false ;
2011-01-26 14:32:26 +00:00
} ) ;
2011-01-03 13:45:30 +00:00
// Listener for alpha switching
this . alphaIndexLinks . click ( function ( ) {
2011-07-15 19:06:57 +00:00
var uri = $ ( '#browse-classes li a.selected' ) . attr ( 'data-uri' ) ;
var alpha = $ ( this ) . attr ( 'data-alpha' ) ;
2011-01-03 13:45:30 +00:00
browseByVClass . getIndividuals ( uri , alpha ) ;
return false ;
2011-01-26 14:32:26 +00:00
} ) ;
// Call the pagination listener
this . paginationListener ( ) ;
} ,
2011-01-28 18:25:21 +00:00
// Listener for page switching -- separate from the rest because it needs to be callable
2011-01-26 14:32:26 +00:00
paginationListener : function ( ) {
2011-02-03 13:54:36 +00:00
$ ( '.pagination li a' ) . click ( function ( ) {
2011-07-15 19:06:57 +00:00
var uri = $ ( '#browse-classes li a.selected' ) . attr ( 'data-uri' ) ;
var alpha = $ ( '#alpha-browse-individuals li a.selected' ) . attr ( 'data-alpha' ) ;
var page = $ ( this ) . attr ( 'data-page' ) ;
2011-01-26 14:32:26 +00:00
browseByVClass . getIndividuals ( uri , alpha , page ) ;
return false ;
} ) ;
2011-01-03 13:45:30 +00:00
} ,
// Load individuals for default class as specified by menupage template
defaultVClass : function ( ) {
2011-01-13 14:35:21 +00:00
if ( this . defaultBrowseVClassURI != "false" ) {
2011-01-31 04:03:32 +00:00
this . getIndividuals ( this . defaultBrowseVClassUri , "all" , 1 , false ) ;
2011-01-13 14:35:21 +00:00
}
2011-01-03 13:45:30 +00:00
} ,
2011-01-28 18:25:21 +00:00
// Where all the magic happens -- gonna fetch me some individuals
2011-01-31 04:03:32 +00:00
getIndividuals : function ( vclassUri , alpha , page , scroll ) {
2011-07-15 19:06:57 +00:00
var url = this . dataServiceUrl + encodeURIComponent ( vclassUri ) ;
2011-01-03 13:45:30 +00:00
if ( alpha && alpha != "all" ) {
2011-01-26 14:32:26 +00:00
url += '&alpha=' + alpha ;
}
if ( page ) {
url += '&page=' + page ;
} else {
page = 1 ;
2011-01-03 13:45:30 +00:00
}
2011-01-31 04:03:32 +00:00
if ( typeof scroll === "undefined" ) {
scroll = true ;
}
2011-01-03 13:45:30 +00:00
2011-02-03 13:54:36 +00:00
// Scroll to #menupage-intro page unless told otherwise
if ( scroll != false ) {
// only scroll back up if we're past the top of the #browse-by section
2011-07-15 19:06:57 +00:00
var scrollPosition = browseByVClass . getPageScroll ( ) ;
var browseByOffset = $ ( '#browse-by' ) . offset ( ) ;
2011-02-03 13:54:36 +00:00
if ( scrollPosition [ 1 ] > browseByOffset . top ) {
$ . scrollTo ( '#menupage-intro' , 500 ) ;
}
}
2011-01-03 13:45:30 +00:00
$ . getJSON ( url , function ( results ) {
2011-07-06 21:56:02 +00:00
var individualList = "" ;
2011-01-26 14:32:26 +00:00
2011-02-03 13:54:36 +00:00
// Catch exceptions when empty individuals result set is returned
// This is very likely to happen now since we don't have individual counts for each letter and always allow the result set to be filtered by any letter
if ( results . individuals . length == 0 ) {
browseByVClass . emptyResultSet ( results . vclass , alpha )
} else {
2011-07-15 19:06:57 +00:00
var vclassName = results . vclass . name ;
2011-02-03 13:54:36 +00:00
$ . each ( results . individuals , function ( i , item ) {
2011-07-06 21:56:02 +00:00
var individual ,
label ,
2011-07-15 19:06:57 +00:00
mostSpecificTypes ,
2011-07-06 21:56:02 +00:00
uri ,
profileUrl ,
image ,
listItem ;
individual = results . individuals [ i ] ;
label = individual . label ;
2011-07-15 19:06:57 +00:00
mostSpecificTypes = individual . mostSpecificTypes ;
moreInfo = browseByVClass . getMoreInfo ( mostSpecificTypes , vclassName ) ;
2011-07-06 21:56:02 +00:00
uri = individual . URI ;
profileUrl = individual . profileUrl ;
if ( individual . thumbUrl ) {
image = browseByVClass . baseUrl + individual . thumbUrl ;
2011-02-03 13:54:36 +00:00
}
// Build the content of each list item, piecing together each component
listItem = '<li class="individual" role="listitem" role="navigation">' ;
2011-07-06 21:56:02 +00:00
if ( typeof individual . thumbUrl !== "undefined" ) {
2011-02-11 16:01:31 +00:00
listItem += '<img src="' + image + '" width="90" alt="' + label + '" /><h1 class="thumb">' ;
2011-02-03 13:54:36 +00:00
} else {
listItem += '<h1>' ;
}
listItem += '<a href="' + profileUrl + '" title="View the profile page for ' + label + '">' + label + '</a></h1>' ;
2011-07-15 19:06:57 +00:00
if ( moreInfo != '' ) {
listItem += '<span class="title">' + moreInfo + '</span>' ;
}
2011-02-03 13:54:36 +00:00
listItem += '</li>' ;
individualList += listItem ;
} )
// Remove existing content
browseByVClass . wipeSlate ( ) ;
// And then add the new content
browseByVClass . individualsInVClass . append ( individualList ) ;
// Check to see if we're dealing with pagination
if ( results . pages . length ) {
2011-07-15 19:06:57 +00:00
var pages = results . pages ;
2011-02-03 13:54:36 +00:00
browseByVClass . pagination ( pages , page ) ;
2011-07-15 19:06:57 +00:00
}
2011-01-31 04:03:32 +00:00
}
2011-06-29 14:45:58 +00:00
// Set selected class, alpha and page
// Do this whether or not there are any results
$ ( 'h3.selected-class' ) . text ( results . vclass . name ) ;
browseByVClass . selectedVClass ( results . vclass . URI ) ;
browseByVClass . selectedAlpha ( alpha ) ;
2011-01-03 13:45:30 +00:00
} ) ;
} ,
2011-07-15 19:06:57 +00:00
// Handle mostSpecificType as array
// * remove requested class for redundancy
// * allow override by another property (passed as argument)
getMoreInfo : function ( mostSpecificTypes , requestedClass , override ) {
var requestedClassIndex = $ . inArray ( requestedClass , mostSpecificTypes ) ;
if ( requestedClassIndex > - 1 ) {
mostSpecificTypes . splice ( requestedClassIndex , 1 ) ;
}
var mostSpecificTypeCount = mostSpecificTypes . length ;
if ( typeof override !== "undefined" ) {
return override ;
} else {
if ( mostSpecificTypeCount > 1 ) {
var assembledList = '<ul class="mostSpecificTypes">' ;
$ . each ( mostSpecificTypes , function ( i , item ) {
assembledList += '<li>' + item + '</li>' ;
} )
assembledList += '</ul>' ;
return assembledList ;
} else {
return mostSpecificTypes ;
}
}
} ,
2011-02-03 13:54:36 +00:00
// getPageScroll() by quirksmode.org
getPageScroll : function ( ) {
var xScroll , yScroll ;
if ( self . pageYOffset ) {
yScroll = self . pageYOffset ;
xScroll = self . pageXOffset ;
} else if ( document . documentElement && document . documentElement . scrollTop ) {
yScroll = document . documentElement . scrollTop ;
xScroll = document . documentElement . scrollLeft ;
} else if ( document . body ) { // all other Explorers
yScroll = document . body . scrollTop ;
xScroll = document . body . scrollLeft ;
}
return new Array ( xScroll , yScroll )
} ,
2011-01-31 04:03:32 +00:00
// Print out the pagination nav if called
pagination : function ( pages , page ) {
2011-07-15 19:06:57 +00:00
var pagination = '<div class="pagination menupage">' ;
2011-01-31 04:03:32 +00:00
pagination += '<h3>page</h3>' ;
pagination += '<ul>' ;
$ . each ( pages , function ( i , item ) {
2011-07-15 19:06:57 +00:00
var anchorOpen = '<a class="round" href="#" title="View page ' + pages [ i ] . text + ' of the results" data-page="' + pages [ i ] . index + '">' ;
var anchorClose = '</a>' ;
2011-01-31 04:03:32 +00:00
2011-02-05 00:07:48 +00:00
pagination += '<li class="round' ;
2011-01-31 04:03:32 +00:00
// Test for active page
if ( pages [ i ] . text == page ) {
pagination += ' selected' ;
anchorOpen = "" ;
anchorClose = "" ;
}
pagination += '" role="listitem">' ;
pagination += anchorOpen ;
pagination += pages [ i ] . text ;
pagination += anchorClose ;
pagination += '</li>' ;
} )
pagination += '</ul>' ;
// Add the pagination above and below the list of individuals and call the listener
browseByVClass . individualsContainer . prepend ( pagination ) ;
browseByVClass . individualsContainer . append ( pagination ) ;
browseByVClass . paginationListener ( ) ;
} ,
2011-01-28 18:25:21 +00:00
// Toggle the active class so it's clear which is selected
2011-01-03 13:45:30 +00:00
selectedVClass : function ( vclassUri ) {
// Remove active class on all vClasses
2011-01-26 14:32:26 +00:00
$ ( '#browse-classes li a.selected' ) . removeClass ( 'selected' ) ;
2011-01-03 13:45:30 +00:00
// Add active class for requested vClass
2011-01-26 14:32:26 +00:00
$ ( '#browse-classes li a[data-uri="' + vclassUri + '"]' ) . addClass ( 'selected' ) ;
2011-01-03 13:45:30 +00:00
} ,
2011-01-28 18:25:21 +00:00
// Toggle the active letter so it's clear which is selected
2011-01-03 13:45:30 +00:00
selectedAlpha : function ( alpha ) {
// if no alpha argument sent, assume all
if ( alpha == null ) {
alpha = "all" ;
}
// Remove active class on all letters
2011-01-26 14:32:26 +00:00
$ ( '#alpha-browse-individuals li a.selected' ) . removeClass ( 'selected' ) ;
2011-01-03 13:45:30 +00:00
// Add active class for requested alpha
2011-01-26 14:32:26 +00:00
$ ( '#alpha-browse-individuals li a[data-alpha="' + alpha + '"]' ) . addClass ( 'selected' ) ;
2011-06-29 13:45:21 +00:00
return alpha ;
2011-02-03 13:54:36 +00:00
} ,
2011-06-24 09:16:49 +00:00
// Wipe the currently displayed individuals, no-content message, and existing pagination
2011-02-03 13:54:36 +00:00
wipeSlate : function ( ) {
browseByVClass . individualsInVClass . empty ( ) ;
$ ( 'p.no-individuals' ) . remove ( ) ;
$ ( '.pagination' ) . remove ( ) ;
} ,
// When no individuals are returned for the AJAX request, print a reasonable message for the user
emptyResultSet : function ( vclass , alpha ) {
2011-06-29 13:45:21 +00:00
var nothingToSeeHere ;
2011-02-03 13:54:36 +00:00
this . wipeSlate ( ) ;
2011-07-15 19:06:57 +00:00
var alpha = this . selectedAlpha ( alpha ) ;
2011-02-03 13:54:36 +00:00
2011-02-05 00:25:04 +00:00
if ( alpha != "all" ) {
nothingToSeeHere = '<p class="no-individuals">There are no ' + vclass . name + ' individuals whose name starts with <em>' + alpha . toUpperCase ( ) + '</em>.</p> <p class="no-individuals">Please try another letter or browse all.</p>' ;
} else {
nothingToSeeHere = '<p class="no-individuals">There are no ' + vclass . name + ' individuals in the system.</p> <p class="no-individuals">Please select another class from the list.</p>' ;
}
2011-06-29 13:45:21 +00:00
browseByVClass . individualsContainer . prepend ( nothingToSeeHere ) ;
2011-01-03 13:45:30 +00:00
}
2011-06-29 13:45:21 +00:00
2011-01-03 13:45:30 +00:00
} ;
2011-01-04 00:17:35 +00:00
$ ( document ) . ready ( function ( ) {
2011-01-03 13:45:30 +00:00
browseByVClass . onLoad ( ) ;
} ) ;