Source: element.js

/**
 * @class
 * @author Fabio Pavesi (fabio@adamassoft.it)
 *
 * @property {String} id - ID of the element
 * @property {String} root - append point for the element in destination XML
 * @property {String} mandatory - can be "true" or "false"
 * @property {String} represents_element - if element is a clone, the base element it was cloned from, otherwise the ID
 * @property {Item[]} items - array of items inside this element
 */
var Element = (function() {
    function baseSortItems() {
        element.items.item.sort(function (a, b) {

            // convert to integers from strings
            a = a.hasIndex;
            b = b.hasIndex;
            if ( a && b ) {
                // compare
                if(a > b) {
                    return 1;
                } else if(a < b) {
                    return -1;
                } else {
                    return 0;
                }
            } else {
                return 0;
            }
        });
    }
    function sortItems() {
        element.items.item.sort(function (a, b) {

            // convert to integers from strings
            a = a.outIndex;
            b = b.outIndex;
            if ( a && b ) {
                // compare
                if(a > b) {
                    return 1;
                } else if(a < b) {
                    return -1;
                } else {
                    return 0;
                }
            } else {
                return 0;
            }
        });
    }
    var element = {
        id: undefined,
        root: undefined,
        mandatory: undefined,
        represents_element: undefined,
        items: {
            item: []
        },
        /**
         *
         * @method
         * @memberOf Element
         * @param item
         */
        addItem: function(item) {
            element.items.item.push(item);
            baseSortItems();
            sortItems();
        }
    };

    return element;
});