Source: item.js

/**
 * @class Item
 * @author Fabio Pavesi (fabio@adamassoft.it)
 *
 * @property {String} id - the ID
 * @property {String} elementId - ID of the element it belongs to
 * @property {String} path - output path in destination XML
 * @property {String} datatype - template's <hasDatatype>: e.g. codelist, string, date, dateRange, boundingBox, ...
 * @property {String} fixed - template's <isFixed>: "true" means the item cannot be modified by the user
 * @property {String} useCode - output URI value to {@link path} in XML
 * @property {String} useURN - output URN value to {@link path} in XML
 * @property {String} outIndex - output order for this item
 * @property {String} value - current value
 * @property {String} labelValue - language specific description
 * @property {String} codeValue - URN value
 * @property {String} urnValue - URN value
 * @property {String} languageNeutral - language neutral value
 * @property {String} listeningFor - UI element connected to this item
 * @property {String} isLanguageNeutral - use language neutral value from datasource for the {@link labelValue}

 */
var Item = (function() {

    var item = {
        id: undefined,
        elementId: undefined,
        path: undefined,
        datatype: undefined,
        fixed: undefined,
        useCode: undefined,
        useURN: undefined,
        outIndex: undefined,
        value: undefined,
        labelValue: undefined,
        codeValue: undefined,
        urnValue: undefined,
        languageNeutral: undefined,
        listeningFor: undefined,
        isLanguageNeutral: undefined,
        startListening: function() {
            var item = this;
            console.log("listening for " + "#" + item.id);
            item.listeningFor = "#" + item.id;
            // $("#" + item.id).unbind("change", update);
            $("#" + item.id).change(ediml.changeHandler);
        },
        /**
         * @method
         * @memberOf Item
         */
        isMandatory: function() {
            var element = ediml.getElement(elementId);
            return ( element.mandatory != "NA" );
        },
        /**
         * @method
         * @memberOf Item
         */
        getAlternativeElement: function() {
            var item = this;
            if ( typeof item.elementId === "undefined" ) {
                console.error("item " + item.id + " has no associated element");
                console.log(item);
                return;
            }
            var element = ediml.getElement(item.elementId);
            if ( element.alternativeTo ) {
                return ediml.getElement(element.alternativeTo);
            }
            return undefined;
        }
    };

    return item;
});