(function (context, $) { "use strict"; context.JK = context.JK || {}; // TODO: MUCH OF THIS CLASS IS REPEATED IN THE FOLLOWING FILES: // createSession.js.erb // accounts_profiles.js context.JK.BandSetupScreen = function (app) { var NONE_SPECIFIED = 'None specified' var GENRE_STEP = 1 var SAMPLE_STEP = 3 var STEPS_COUNT = 5 var currentStep = 0 var ui = new context.JK.UIHelper(JK.app) var logger = context.JK.logger var profileUtils = context.JK.ProfileUtils var rest = context.JK.Rest() var inviteMusiciansUtil = null var invitationDialog = null var autoComplete = null var userNames = [] var userIds = [] var userPhotoUrls = [] var selectedFriendIds = {} var nilOptionStr = '' var nilOptionText = 'n/a' var bandId = '' var friendInput=null var bandType=null var bandStatus=null var concertCount=null var $screen=$("#band-setup") var $samples = $screen.find(".account-profile-samples") var $selectedInstruments=[] var accountProfileSamples = new JK.AccountProfileSamples(app, $screen, loadBandCallback, rest.updateBand) accountProfileSamples.initialize() function navBack() { var band = buildBand() if (currentStep>0) { saveBand(band, function() { currentStep-- renderCurrentPage() }) } } function navCancel() { resetForm() window.history.go(-1) return false } function navNext() { var band = buildBand() if (currentStep==GENRE_STEP) { band.genres = getSelectedGenres(); band.validate_genres = true } else { band.validate_genres = false } if (currentStep 0) ? instrumentText : NONE_SPECIFIED) } function showProfile(band_id) { context.location = "/client#/bandProfile/" + band_id; } function saveInvitations(response) { if (0 < $('#selected-friends-band .invitation').length) { createBandInvitations(response.id, function () { showProfile(response.id); }); } } function saveBand(band, saveBandSuccessFn) { unbindNavButtons() removeErrors() var saveBandFn = (isNewBand()) ? rest.createBand : rest.updateBand saveBandFn(band) .done(function (response) { bandId = response.id saveInvitations(response) if(saveBandSuccessFn) { saveBandSuccessFn(band) } }) .fail(function (jqXHR) { if(jqXHR.status == 422) { renderErrors(JSON.parse(jqXHR.responseText)) } else { app.notifyServerError(jqXHR, "Unable to create band") } }) .always(function (jqXHR) { bindNavButtons() }) } function createBandInvitations(bandId, onComplete) { var callCount = 0; var totalInvitations = 0; $('#selected-friends-band .invitation').each(function (index, invitation) { callCount++; totalInvitations++; var userId = $(invitation).attr('user-id'); rest.createBandInvitation(bandId, userId) .done(function (response) { callCount--; }).fail(app.ajaxError); }); function checker() { if (callCount === 0) { onComplete(); } else { context.setTimeout(checker, 10); } } checker(); return totalInvitations; } function beforeShow(data) { inviteMusiciansUtil.clearSelections(); bandId = data.id == 'new' ? '' : data.id; currentStep=0 if (data['d']) { var stepNum = data['d'].substring(4) if(stepNum) { currentStep=stepNum delete data['d']; } } resetForm(); } function afterShow(data) { inviteMusiciansUtil.loadFriends(); if (!isNewBand()) { $("#band-change-photo").html('Upload band photo.'); $('.band-photo').removeClass("hidden") // retrieve and initialize band profile data points loadBandDetails(); } else { loadGenres(); // Load geo settings: rest.getResolvedLocation().done(function (location) { loadCountries(location.country, function () { loadRegions(location.region, function () { loadCities(location.city); }); }); }); $('.band-photo').addClass("hidden") } renderCurrentPage() } function loadDesiredExperience() { } function loadBandDetails() { rest.getBand(bandId).done(function (band) { $("#band-name").val(band.name); $("#band-website").val(band.website); $("#band-biography").val(band.biography); bandType.val(band.band_type) bandStatus.val(band.band_status) concertCount.val(band.concert_count) if (band.add_new_members){ $("#new-member-no").iCheck('check').attr('checked', 'checked') } else { $("#new-member-yes").iCheck('check').attr('checked', 'checked') } if (band.paid_gigs) { $("#paid-gigs-no").iCheck('check').attr('checked', 'checked') } else { $("#paid-gigs-yes").iCheck('check').attr('checked', 'checked') } if (band.free_gigs) { $("#free-gigs-no").iCheck('check').attr('checked', 'checked') } else { $("#free-gigs-yes").iCheck('check').attr('checked', 'checked') } $('#touring-option').val(band.touring_option ? 'yes' : 'no') $("#play-commitment").val(band.play_commitment) $("#hourly-rate").val(profileUtils.normalizeMoneyForDisplay(band.hourly_rate)) $("#gig-minimum").val(profileUtils.normalizeMoneyForDisplay(band.gig_minimum)) // Initialize avatar if (band.photo_url) { $("#band-avatar").attr('src', band.photo_url); } loadGenres(band.genres); loadCountries(band.country, function () { loadRegions(band.state, function () { loadCities(band.city); }); }); renderOptionalControls(); $.each(band.instruments, function(index, instrument) { var h = {} h.id = instrument.instrument_id h.level = instrument.proficiency_level h.approve = true $selectedInstruments.push(h) }) renderDesiredExperienceLabel($selectedInstruments) accountProfileSamples.renderPlayer(band) }); } function loadGenres(selectedGenres) { $("#band-genres").empty(); rest.getGenres().done(function (genres) { $.each(genres, function (index, genre) { var genreTemplate = $('#template-band-setup-genres').html(); var selected = ''; if (selectedGenres) { var genreMatch = $.grep(selectedGenres, function (n, i) { return n.id === genre.id; }); if (genreMatch.length > 0) { selected = "checked"; } } var genreHtml = context.JK.fillTemplate(genreTemplate, { id: genre.id, description: genre.description, checked: selected }); $('#band-genres').append(genreHtml); }); }); } function loadCountries(initialCountry, onCountriesLoaded) { var countrySelect = $("#band-country"); var nilOption = $(nilOptionStr); nilOption.text(nilOptionText); countrySelect.append(nilOption); rest.getCountries().done(function (response) { $.each(response["countriesx"], function (index, countryx) { if (!countryx.countrycode) return; var option = $(nilOptionStr); option.text(countryx.countryname); option.attr("value", countryx.countrycode); if (initialCountry === countryx.countrycode) { option.attr("selected", "selected"); } countrySelect.append(option); }); context.JK.dropdown(countrySelect); if (onCountriesLoaded) { onCountriesLoaded(); } }); } function loadRegions(initialRegion, onRegionsLoaded) { var $region = $("#band-region"); var selectedCountry = $("#band-country").val(); $region.empty(); var nilOption = $(nilOptionStr); nilOption.text(nilOptionText); $region.append(nilOption); if (selectedCountry) { rest.getRegions({'country': selectedCountry}).done(function (response) { $region.empty(); var nilOption = $(nilOptionStr); nilOption.text(nilOptionText); $region.append(nilOption); $.each(response["regions"], function (index, region) { if (!region) return; var option = $(nilOptionStr); option.text(region['name']); option.attr("value", region['region']); if (initialRegion === region['region']) { option.attr("selected", "selected"); } $region.append(option); }); context.JK.dropdown($region); if (onRegionsLoaded) { onRegionsLoaded(); } }).error(function(err) { context.JK.dropdown($region); if (onRegionsLoaded) { onRegionsLoaded(); } }); } } function loadCities(initialCity) { var $city = $("#band-city"); $city.empty(); var selectedCountry = $("#band-country").val(); var selectedRegion = $("#band-region").val(); var nilOption = $(nilOptionStr); nilOption.text(nilOptionText); $city.append(nilOption); nilOption.attr('selected','selected'); if (selectedCountry && selectedRegion) { rest.getCities({'country': selectedCountry, 'region': selectedRegion}).done(function (response) { $.each(response["cities"], function (index, city) { if (!city) return; var option = $(nilOptionStr); option.text(city); option.attr("value", city); if (initialCity === city) { option.attr("selected", "selected"); } $city.append(option); }); context.JK.dropdown($city); }).error(function(err) { context.JK.dropdown($city); }); } else { context.JK.dropdown($city); } } function addInvitation(value, data) { if ($('#selected-band-invitees div[user-id=' + data + ']').length === 0) { var template = $('#template-band-invitation').html(); var invitationHtml = context.JK.fillTemplate(template, {userId: data, userName: value}); $('#selected-band-invitees').append(invitationHtml); $('#band-invitee-input').select(); selectedFriendIds[data] = true; } else { $('#band-invitee-input').select(); context.alert('Invitation already exists for this musician.'); } } function navigateToBandPhoto(evt) { evt.stopPropagation(); context.location = '/client#/band/setup/photo/' + bandId; return false; } function removeInvitation(evt) { delete selectedFriendIds[$(evt.currentTarget).parent().attr('user-id')]; $(evt.currentTarget).closest('.invitation').remove(); } function bindNavButtons() { $('#btn-band-setup-back').on("click", function (e) { e.stopPropagation() navBack() return false }) $('#btn-band-setup-cancel').on("click", function (e) { e.stopPropagation() navCancel() return false }) $('#btn-band-setup-next').on("click", function (e) { e.stopPropagation() navNext() return false }) $('#btn-band-setup-back').removeClass("disabled") $('#btn-band-setup-cancel').removeClass("disabled") $('#btn-band-setup-next').removeClass("disabled") } function unbindNavButtons() { $('#btn-band-setup-back').off("click") $('#btn-band-setup-cancel').off("click") $('#btn-band-setup-next').off("click") $('#btn-band-setup-back').addClass("disabled") $('#btn-band-setup-cancel').addClass("disabled") $('#btn-band-setup-next').addClass("disabled") } function events() { $('#selected-band-invitees').on("click", ".invitation a", removeInvitation); bindNavButtons(); // friend input focus $('#band-invitee-input').focus(function () { $(this).val(''); }); $('#band-country').on('change', function (evt) { evt.stopPropagation(); loadRegions(); loadCities(); return false; }); $('#band-region').on('change', function (evt) { evt.stopPropagation(); loadCities(); return false; }); $('#band-change-photo').click(navigateToBandPhoto); $('#band-setup .band-avatar-profile').click(navigateToBandPhoto); $('div[layout-id="band/setup"] .btn-email-invitation').click(function () { invitationDialog.showEmailDialog(); }); $('div[layout-id="band/setup"] .btn-gmail-invitation').click(function () { invitationDialog.showGoogleDialog(); }); $('div[layout-id="band/setup"] .btn-facebook-invitation').click(function () { invitationDialog.showFacebookDialog(); }); $('a#choose-desired-experience').on("click", chooseExperience) $('#band-setup').on('ifToggled', 'input[type="radio"].dependent-master', renderOptionalControls); $(friendInput).focus(function() { $(this).val(''); }) } function chooseExperience(e) { e.stopPropagation() ui.launchInstrumentSelectorDialog("new member(s)", $selectedInstruments, function(selectedInstruments) { $selectedInstruments = selectedInstruments renderDesiredExperienceLabel($selectedInstruments) return false }) return false } function loadBandCallback() { return (isNewBand()) ? {} : rest.getBand(bandId) } function initialize(invitationDialogInstance, friendSelectorDialog) { inviteMusiciansUtil = new JK.InviteMusiciansUtil(app) inviteMusiciansUtil.initialize(friendSelectorDialog) friendInput = inviteMusiciansUtil.inviteBandCreate('#band-setup-invite-musicians', "
If your bandmates are already on JamKazam, start typing their names in the box below, or click the Choose Friends button to select them.
") invitationDialog = invitationDialogInstance events() var screenBindings = { 'beforeShow': beforeShow, 'afterShow': afterShow } bandType=$("#band-type") bandStatus=$("#band-status") concertCount=$("#concert-count") app.bindScreen('band/setup', screenBindings) $screen.find('input[type=radio]').iCheck({ checkboxClass: 'icheckbox_minimal', radioClass: 'iradio_minimal', inheritClass: true }) profileUtils.initializeHelpBubbles() } this.initialize = initialize; this.afterShow = afterShow; return this; }; })(window, jQuery);