/* global define */
define(['jquery', 'underscore', 'backbone', 'uuid',
'collections/Units',
'models/metadata/ScienceMetadata',
'models/DataONEObject',
'models/metadata/eml211/EMLGeoCoverage',
'models/metadata/eml211/EMLKeywordSet',
'models/metadata/eml211/EMLTaxonCoverage',
'models/metadata/eml211/EMLTemporalCoverage',
'models/metadata/eml211/EMLDistribution',
'models/metadata/eml211/EMLEntity',
'models/metadata/eml211/EMLDataTable',
'models/metadata/eml211/EMLOtherEntity',
'models/metadata/eml211/EMLParty',
'models/metadata/eml211/EMLProject',
'models/metadata/eml211/EMLText',
'models/metadata/eml211/EMLMethods',
'models/metadata/eml211/BaseEML211'
],
function($, _, Backbone, uuid, Units, ScienceMetadata, DataONEObject,
EMLGeoCoverage, EMLKeywordSet, EMLTaxonCoverage, EMLTemporalCoverage,
EMLDistribution, EMLEntity, EMLDataTable, EMLOtherEntity, EMLParty,
EMLProject, EMLText, EMLMethods, BaseEML211) {
/**
* Overrides BaseEML211.createXML() to set 'system' to 'ess-dive'
*
* An EML211 object represents an Ecological Metadata Language
* document, version 2.1.1
* @type {void|*}
*/
var EML211 = BaseEML211.extend({
/**
* Override defaults
* @returns {*}
*/
defaults: function(){
return _.extend(BaseEML211.prototype.defaults(), {
id: DataONEObject.generateEssDiveId(),
intellectualRights:"This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/."
});
},
createXML: function(){
// Generate the xml string from the base class
var xml = BaseEML211.prototype.createXML.apply(this);
// Create the EML html object
var eml = $($.parseHTML(xml));
// Override the system value
eml.attr("system","ess-dive")
// Generate the new EML string
var emlString = $(document.createElement("div")).append(eml.clone()).html();
return emlString;
},
/*
* Cleans up the given text so that it is XML-valid by escaping reserved characters, trimming white space, etc.
*
* @param {string} textString - The string to clean up
* @return {string} - The cleaned up string
*/
cleanXMLText: function(textString){
if( typeof textString != "string" )
return;
textString = textString.trim();
return textString;
},
/**
* Extend save function to add default publication year
*
* Saves the EML document to the server using the DataONE API
*
* @param attributes
* @param options
* @returns {boolean}
*/
save: function(attributes, options){
// Set missing publication Date before saving
if ( ! this.get("pubDate") ) {
this.set("pubDate",(new Date()).getFullYear().toString())
}
// Make sure there is only one additionaInfo/Reference Papers section
if ( this.get("additionalInfo") &&
_.isArray(this.get("additionalInfo")) && this.get("additionalInfo").length >= 1)
{
var additionalInfo = this.get("additionalInfo");
if (_.isArray(this.get("additionalInfo")) && this.get("additionalInfo").length >= 1){
additionalInfo = this.get("additionalInfo")[0]
}
if (additionalInfo.get("section") && _.isArray(additionalInfo.get("section")) &&
additionalInfo.get("section").length >0)
{
this.set("additionalInfo", new EMLText({
text:[],
section: new EMLText({
type: "section",
title: "Related References",
text: additionalInfo.get("section")[0].text
})
}));
}
}
return BaseEML211.prototype.save.apply(this, [attributes, options]);
},
/**
* Overrides base class to add Funding Organization Validation
* Checks if this EML model has all the required values necessary to save to the server
*
* @returns {*|{formatString}|{name}|string}
*/
validate: function() {
var errors = BaseEML211.prototype.validate.apply(this);
if (!errors){
errors={};
}
// get the target from the EML Model
var keywordSet = _.find(this.get("keywordSets"),
function(keywordSet){
return keywordSet.get("thesaurus").indexOf("CATEGORICAL") >=0
});
if (typeof keywordSet == "undefined")
{
errors.keywordCategoricalSets = "Provide at least one keyword or variable.";
}
//Validate the Funding Organizations models
var fundingOrganizations = _.filter(this.get("associatedParty"),
function(party){ return party.get("role") == "fundingOrganization" });
if(!fundingOrganizations.length){
errors.fundingOrganization = "At least one funding organization is required.";
}
//Validate the Project
if(!this.get("project") || !this.get("project").get("title")){
errors.project = "Please enter a project title.";
}
if( Object.keys(errors).length )
{
return errors;
}
else{
return;
}
}
});
return EML211;
}
);