vitro/webapp/web/js/individual/manageLabelsForIndividual.js
2013-10-01 11:24:15 -04:00

289 lines
11 KiB
JavaScript

/* $This file is distributed under the terms of the license in /doc/license.txt$ */
var manageLabels = {
/* *** Initial page setup *** */
onLoad: function() {
this.mixIn();
this.initObjects();
this.initPage();
var selectedRadio;
},
mixIn: function() {
// Get the custom form data from the page
$.extend(this, customFormData);
$.extend(this, i18nStrings);
},
initObjects:function() {
this.addLabelForm = $('#addLabelForm');
this.showFormButtonWrapper = $('#showAddForm');
this.showFormButton = $("#showAddFormButton");
//button to return to profile - div with only cancel
this.showCancelOnlyButton = $("#showCancelOnly");
this.addLabelCancel = this.addLabelForm.find(".cancel");
this.submit = this.addLabelForm.find('input#submit');
this.labelLanguage = this.addLabelForm.find("#newLabelLanguage");
this.existingLabelsList = $("#existingLabelsList");
},
// Initial page setup. Called only at page load.
initPage: function() {
var disableSubmit = true;
if(this.submissionErrorsExist == "false") {
//hide the form to add label
this.addLabelForm.hide();
//If the number of available locales is zero, then hide the ability to show the form as well
if(this.numberAvailableLocales == 0) {
manageLabels.showFormButtonWrapper.hide();
this.showCancelOnlyButton.show();
} else {
//if the add label button is visible, don't need cancel only link
this.showCancelOnlyButton.hide();
}
} else {
//Display the form
this.onShowAddForm();
//Also make sure the save button is enabled in case there is a value selected for the drop down
if(this.labelLanguage.val() != "") {
disableSubmit = false;
}
}
if(disableSubmit) {
//disable submit until user selects a language
this.submit.attr('disabled', 'disabled');
this.submit.addClass('disabledSubmit');
}
this.bindEventListeners();
},
bindEventListeners: function() {
this.labelLanguage.change( function() {
//if language selected, allow submission, otherwise disallow
var selectedLanguage = manageLabels.labelLanguage.val();
if(selectedLanguage != "") {
manageLabels.submit.attr('disabled', '');
manageLabels.submit.removeClass('disabledSubmit');
} else {
manageLabels.submit.attr('disabled', 'disabled');
manageLabels.submit.addClass('disabledSubmit');
}
});
//enable form to add label to be displayed or hidden
this.showFormButton.click(function() {
//clear the inputs for the label if the button is being clicked
manageLabels.clearAddForm();
manageLabels.onShowAddForm();
});
//Check for clicking on existing labels list remove links
//Note addition will refresh the page and removing will remove the item so adding event listeners
//to remove links should keep remove link events in synch with page
this.existingLabelsList.find("a.remove").click(function(event) {
var message = "Are you sure you wish to delete this label?"
if (!confirm(message)) {
return false;
}
//First check with confirmation whether or not they want to delete
manageLabels.processLabelDeletion(this);
return false;
});
this.addLabelForm.find("a.cancel").click(function(event){
event.preventDefault();
//clear the add form
manageLabels.clearAddForm();
//hide the add form
manageLabels.onHideAddForm();
return false;
});
},
clearAddForm:function() {
//clear inputs and select
manageLabels.addLabelForm.find("input[type='text'],select").val("");
//set the button for save to be disabled again
manageLabels.submit.attr('disabled', 'disabled');
manageLabels.submit.addClass('disabledSubmit');
},
onShowAddForm:function() {
manageLabels.addLabelForm.show();
manageLabels.showFormButtonWrapper.hide();
manageLabels.addLabelCancel.click(function(){
//Canceling the add label form will hide the form
manageLabels.addLabelForm.hide();
manageLabels.showFormButtonWrapper.show();
});
},
onHideAddForm:function() {
manageLabels.addLabelForm.hide();
manageLabels.showFormButtonWrapper.show();
//manageLabels.addLabelCancel.unbind("click");
},
//Remove label
processLabelDeletion: function(selectedLink) {
// PrimitiveDelete only handles one statement, so we have to use PrimitiveRdfEdit to handle multiple
// retractions if they exist. But PrimitiveRdfEdit also handles assertions, so pass an empty string
// for "additions"
var add = "";
var labelValue = $(selectedLink).attr('labelValue');
var tagOrTypeValue = $(selectedLink).attr('tagOrType');
if(tagOrTypeValue == "untyped") {
tagOrTypeValue = "";
}
var retract = "<" + manageLabels.individualUri + "> <http://www.w3.org/2000/01/rdf-schema#label> "
+ "\"" + $(selectedLink).attr('labelValue') + "\"" + $(selectedLink).attr('tagOrType') + " ." ;
retract = retract.substring(0,retract.length -1);
$.ajax({
url: manageLabels.processingUrl,
type: 'POST',
data: {
additions: add,
retractions: retract
},
dataType: 'json',
context: selectedLink, // context for callback
complete: function(request, status) {
if (status == 'success') {
//Remove the label from the list
manageLabels.removeLabelFromList(selectedLink);
manageLabels.updateLocaleSelection();
}
else {
//Instead of alert, write error to template
alert(manageLabels.errorProcessingLabels);
}
}
});
},
removeLabelFromList:function(selectedLink) {
var languageName = $(selectedLink).attr("languageName");
$(selectedLink).parent().remove();
//See if there are any other remove link
if(languageName != "untyped") {
//find if there are any other remove links for the same language
var allRemoveLinks = manageLabels.existingLabelsList.find("a.remove");
var removeLinks = manageLabels.existingLabelsList.find("a.remove[languageName='" + languageName + "']");
if(removeLinks.length == 0) {
//if there aren't any other labels for this language, also remove the heading
manageLabels.existingLabelsList.find("h3[languageName='" + languageName + "']").remove();
}
//Check to see if there is only one label left on the page, if so remove or hide the remove link
if(allRemoveLinks.length == 1) {
allRemoveLinks.remove();
//These will be removed instead of hidden because currently add will reload the page
//whereas remove executes an ajax query and the page isn't reloaded
}
}
},
//Determine if there are new locales that can be added to the options once a delete has occurred
updateLocaleSelection:function() {
//Check what languages remain
var existingLanguages = {};
//Look at which languages are currently represented
manageLabels.existingLabelsList.find("a.remove").each(function(){
var languageCode = $(this).attr("languageCode");
if(!(languageCode in existingLanguages)) {
existingLanguages[languageCode] = true;
}
});
//Now check against full list, if any in full list not represented, will need to include in dropdown
//This is a list of
var availableLocalesList = [];
var listLen = selectLocalesFullList.length;
var i;
for(i = 0; i < listLen; i++) {
var possibleLanguageInfo = selectLocalesFullList[i];
var possibleLanguageCode = possibleLanguageInfo["code"];
var possibleLangaugeLabel = possibleLanguageInfo["label"];
if(!(possibleLanguageCode in existingLanguages)) {
//manageLabels.addLanguageCode(possibleLanguageCode, possibleLanguageLabel);
availableLocalesList.push(possibleLanguageInfo);
}
}
//Now sort this list by the label property on the object
availableLocalesList.sort(function(a, b) {
var compA = a["label"];
var compB = b["label"];
return compA < compB ? -1 : 1;
});
//Re-show the add button and the form if they were hidden before
if(availableLocalesList.length > 0 && manageLabels.showFormButtonWrapper.is(":hidden")) {
manageLabels.showFormButtonWrapper.show();
//hide the cancel only button
manageLabels.showCancelOnlyButton.hide();
}
//Now replace dropdown with this new list
manageLabels.generateLocalesDropdown(availableLocalesList);
},
generateLocalesDropdown:function(availableLocalesList) {
//First check if there are any available locales left, if not then hide the entire add form
//technically, this first part should never be invoked client side because
//this can only happen on ADD not remove, and add will refresh the page
//On the other hand the show add button etc. can be displayed
if(availableLocalesList.length == 0) {
//Hide the add form if there are no locales left that can be added
manageLabels.addLabelForm.hide();
manageLabels.showFormButtonWrapper.hide();
} else {
//There are some locales so generate the dropdown accordingly, removing all elements but the first
$("#newLabelLanguage option:gt(0)").remove();
var i;
var len = availableLocalesList.length;
for(i = 0; i < len; i++) {
var localeInfo = availableLocalesList[i];
manageLabels.addLocaleInfo(localeInfo);
}
//Put some value in that shows whether neither add button nor add form were shown
//because the form thought there were no available locales
}
},
addLocaleInfo:function(localeInfo) {
//Add code to dropdown
//Would we need to regenerate alphabetically? Argh.
manageLabels.labelLanguage.append("<option value='" + localeInfo["code"] + "'>" + localeInfo["label"] + "</option>");
}
};
$(document).ready(function() {
manageLabels.onLoad();
});