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 ( ) ;
} ,
// 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
bindEventListeners : function ( ) {
// Listeners for vClass switching
this . vgraphVClassLinks . click ( function ( ) {
2011-01-26 14:32:26 +00:00
uri = $ ( this ) . attr ( 'data-uri' ) ;
2011-01-03 13:45:30 +00:00
browseByVClass . getIndividuals ( uri ) ;
} ) ;
this . browseVClassLinks . click ( function ( ) {
2011-01-26 14:32:26 +00:00
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-01-26 14:32:26 +00:00
uri = $ ( '#browse-classes li a.selected' ) . attr ( 'data-uri' ) ;
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-01-26 14:32:26 +00:00
uri = $ ( '#browse-classes li a.selected' ) . attr ( 'data-uri' ) ;
alpha = $ ( '#alpha-browse-individuals li a.selected' ) . attr ( 'data-alpha' ) ;
2011-02-05 00:07:48 +00:00
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-01-03 13:45:30 +00:00
url = this . dataServiceUrl + encodeURIComponent ( vclassUri ) ;
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
scrollPosition = browseByVClass . getPageScroll ( ) ;
browseByOffset = $ ( '#browse-by' ) . offset ( ) ;
if ( scrollPosition [ 1 ] > browseByOffset . top ) {
$ . scrollTo ( '#menupage-intro' , 500 ) ;
}
}
2011-01-03 13:45:30 +00:00
$ . getJSON ( url , function ( results ) {
2011-02-03 13:54:36 +00:00
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 {
$ . each ( results . individuals , function ( i , item ) {
label = results . individuals [ i ] . label ;
moniker = results . individuals [ i ] . moniker ;
vclassName = results . individuals [ i ] . vclassName ;
uri = results . individuals [ i ] . URI ;
profileUrl = results . individuals [ i ] . profileUrl ;
if ( results . individuals [ i ] . thumbUrl ) {
image = browseByVClass . baseUrl + results . individuals [ i ] . thumbUrl ;
}
// Build the content of each list item, piecing together each component
listItem = '<li class="individual" role="listitem" role="navigation">' ;
if ( typeof results . individuals [ i ] . thumbUrl !== "undefined" ) {
listItem += '<img src="' + image + '" width="90" height="90" alt="' + label + '" /><h1 class="thumb">' ;
} else {
listItem += '<h1>' ;
}
listItem += '<a href="' + profileUrl + '" title="View the profile page for ' + label + '">' + label + '</a></h1>' ;
// Include the moniker only if it's not empty and not equal to the VClass name
if ( moniker != vclassName && moniker != "" ) {
listItem += '<span class="title">' + moniker + '</span>' ;
}
listItem += '</li>' ;
// browseByVClass.individualsInVClass.append(listItem);
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 ) {
pages = results . pages ;
browseByVClass . pagination ( pages , page ) ;
2011-01-14 15:12:35 +00:00
}
2011-02-03 13:54:36 +00:00
selectedClassHeading = '<h3 class="selected-class">' + results . vclass . name + '</h3>' ;
browseByVClass . individualsContainer . prepend ( selectedClassHeading ) ;
// Set selected class, alpha and page
browseByVClass . selectedVClass ( results . vclass . URI ) ;
browseByVClass . selectedAlpha ( alpha ) ;
2011-01-31 04:03:32 +00:00
}
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-02-03 13:54:36 +00:00
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-02-05 00:07:48 +00:00
anchorOpen = '<a class="round" href="#" title="View page ' + pages [ i ] . text + ' of the results" data-page="' + pages [ i ] . index + '">' ;
2011-01-31 04:03:32 +00:00
anchorClose = '</a>' ;
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-02-03 13:54:36 +00:00
} ,
// Wipe the currently displayed class heading, individuals, no-content message, and existing pagination
wipeSlate : function ( ) {
$ ( 'h3.selected-class' ) . remove ( ) ;
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 ) {
this . wipeSlate ( ) ;
this . selectedAlpha ( alpha ) ;
2011-02-03 16:06:07 +00:00
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>' ;
2011-02-03 13:54:36 +00:00
browseByVClass . individualsContainer . prepend ( nothingToSeeHere ) ;
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 ( ) ;
browseByVClass . defaultVClass ( ) ;
} ) ;