(function(context,$) {
/**
* Javascript for managing genre selectors.
*/
"use strict";
context.JK = context.JK || {};
context.JK.GenreSelectorDeferred = null;
context.JK.GenreSelectorHelper = (function() {
var logger = context.JK.logger;
var _genres = []; // will be list of structs: [ {label:xxx, value:yyy}, {...}, ... ]
function reset(parentSelector, defaultGenre) {
defaultGenre = typeof(defaultGenre) == 'undefined' ? '' : defaultGenre;
$('select', parentSelector).val(defaultGenre);
}
function genresLoaded(response) {
$.each(response, function(index) {
_genres.push({
value: this.id,
label: this.description
});
});
}
function render(parentSelector, notSelectedString) {
if(!notSelectedString) {
notSelectedString = 'Unspecified'
}
$('select', parentSelector).empty();
$('select', parentSelector).append('');
var template = $('#template-genre-option').html();
$.each(_genres, function(index, value) {
// value will be a dictionary entry from _genres:
// { value: xxx, label: yyy }
var genreOptionHtml = context.JK.fillTemplate(template, value);
$('select', parentSelector).append(genreOptionHtml);
});
context.JK.dropdown($('select', parentSelector));
}
function render2($select, notSelectedString) {
if(!notSelectedString) {
notSelectedString = 'Any Genre'
}
$select.empty();
$select.append('');
var template = $('#template-genre-option').html();
$.each(_genres, function(index, value) {
// value will be a dictionary entry from _genres:
// { value: xxx, label: yyy }
var genreOptionHtml = context.JK.fillTemplate(template, value);
$select.append(genreOptionHtml);
});
context.JK.dropdown($select);
}
function getSelectedGenres(parentSelector) {
var selectedGenres = [];
var selectedVal = $('select', parentSelector).val();
if (selectedVal !== '') {
selectedGenres.push(selectedVal);
}
return selectedGenres;
}
function getSelectedGenresValues(parentSelector) {
var selectedGenres = [];
var selectedVal = $('select', parentSelector).get(0).options[$('select', parentSelector).get(0).selectedIndex].text;
if (selectedVal !== '') {
selectedGenres.push(selectedVal);
}
return selectedGenres;
}
function getNameForId(genreId) {
var name = null;
context._.each(_genres, function(genre) {
if(genreId == genre.value) {
name = genre.label;
return false;
}
});
if(!name) {
logger.warn("no genre found for genreId: " + genreId);
}
return name;
}
function setSelectedGenres(parentSelector, genreList) {
if (!genreList) {
return;
}
var values = [];
$.each(genreList, function(index, value) {
values.push(value.toLowerCase());
});
$('select', parentSelector).val(values[0]);
}
function initialize(app) {
// XXX; _instruments should be populated in a template, rather than round-trip to server
if(!context.JK.GenreSelectorDeferred) {
// this dance is to make sure there is only one server request instead of InstrumentSelector instances *
context.JK.GenreSelectorDeferred = rest.getGenres()
}
context.JK.GenreSelectorDeferred
.done(function(response) {genresLoaded(response)})
.fail(app.ajaxError)
return this;
}
var me = { // This will be our singleton.
initialize: initialize,
getSelectedGenres: getSelectedGenres,
setSelectedGenres: setSelectedGenres,
getNameForId : getNameForId,
getSelectedGenresValues: getSelectedGenresValues,
reset: reset,
render: function() {
var _args = arguments;
context.JK.GenreSelectorDeferred.done(function(){render.apply(self, _args)})
},
render2: function() {
var _args = arguments;
context.JK.GenreSelectorDeferred.done(function(){render2.apply(self, _args)})
}
};
return me;
})();
})(window,jQuery);