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 ) ;
2013-06-11 12:25:01 -04:00
$ . extend ( this , i18nStrings ) ;
2011-01-03 13:45:30 +00:00
} ,
// 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
} ) ;
2012-05-10 13:38:08 +00:00
// save the selected vclass in location hash so we can reset the selection
// if the user navigates with the back button
2012-05-09 20:08:01 +00:00
this . browseVClasses . children ( 'li' ) . each ( function ( ) {
$ ( this ) . find ( 'a' ) . click ( function ( ) {
// the extra space is needed to prevent odd scrolling behavior
location . hash = $ ( this ) . attr ( 'data-uri' ) + ' ' ;
} ) ;
} ) ;
2012-05-10 13:38:08 +00:00
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" ) {
2012-05-09 20:08:01 +00:00
if ( location . hash ) {
2012-05-10 13:38:08 +00:00
// remove the trailing white space
location . hash = location . hash . replace ( /\s+/g , '' ) ;
this . getIndividuals ( location . hash . substring ( 1 , location . hash . length ) , "all" , 1 , false ) ;
2012-05-09 20:08:01 +00:00
}
else {
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 ) {
2012-05-01 16:29:36 +00:00
var individual = results . individuals [ i ] ;
individualList += individual . shortViewHtml ;
2011-02-03 13:54:36 +00:00
} )
// 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-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">' ;
2013-06-11 12:25:01 -04:00
pagination += '<h3>' + browseByVClass . pageString + '</h3>' ;
2011-01-31 04:03:32 +00:00
pagination += '<ul>' ;
$ . each ( pages , function ( i , item ) {
2013-06-11 12:25:01 -04:00
var anchorOpen = '<a class="round" href="#" title="' + browseByVClass . viewPageString + ' '
+ pages [ i ] . text + ' '
+ browseByVClass . ofTheResults + ' " data-page="' + pages [ i ] . index + '">' ;
2011-07-15 19:06:57 +00:00
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" ) {
2013-06-11 12:25:01 -04:00
nothingToSeeHere = '<p class="no-individuals">' + browseByVClass . thereAreNo + ' ' + vclass . name + ' ' + browseByVClass . indNamesStartWith + ' <em>' + alpha . toUpperCase ( ) + '</em>.</p> <p class="no-individuals">' + browseByVClass . tryAnotherLetter + '</p>' ;
2011-02-05 00:25:04 +00:00
} else {
2013-06-11 12:25:01 -04:00
nothingToSeeHere = '<p class="no-individuals">' + browseByVClass . thereAreNo + ' ' + vclass . name + ' ' + browseByVClass . indsInSystem + '</p> <p class="no-individuals">' + browseByVClass . selectAnotherClass + '</p>' ;
2011-02-05 00:25:04 +00:00
}
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 ( ) ;
} ) ;