define(["jquery", "underscore", "backbone",
    "models/metadata/eml211/EMLNonNumericDomain",
    "models/metadata/eml211/EMLNumericDomain",
        "models/metadata/eml211/EMLDateTimeDomain"],
    function($, _, Backbone, EMLNonNumericDomain, EMLNumericDomain, EMLDateTimeDomain) {

        /**
        * @class EMLMeasurementScale
         * @classdesc EMLMeasurementScale is a measurement scale factory that returns
         * an EMLMeasurementScale subclass of either EMLNonNumericDomain,
         * EMLNumericDomain, or EMLDateTimeDomain, depending on the
         * domain name found in the given measurementScaleXML
         * @classcategory Models/Metadata/EML211
         */
        var EMLMeasurementScale = Backbone.Model.extend({},
          /** @lends EMLMeasurementScale.prototype */
        {
            /*
             * Get an instance of an EMLMeasurementScale subclass
             * given the measurementScaleXML fragment
             */
            getInstance: function(measurementScaleXML) {
                var instance = {};

                if(measurementScaleXML && measurementScaleXML.indexOf("<") > -1){
                    var objectDOM = $(measurementScaleXML)[0];
                	var domainName = $(objectDOM).children()[0].localName;
                	var options = {parse: true};
                }
                //If it's not an XML string, then it must be the domainName itself
                else if(measurementScaleXML && measurementScaleXML.indexOf("<") == -1){
                	var domainName = measurementScaleXML;
                	var options = {};
                	measurementScaleXML = null;
                }

                // Return the appropriate sub class of EMLMeasurementScale
                switch ( domainName ) {
                    case "nominal":
                        instance = new EMLNonNumericDomain({
                            "measurementScale": domainName,
                            "objectDOM": $(measurementScaleXML)[0]
                        }, options);
                        break;
                    case "ordinal":
                        instance = new EMLNonNumericDomain({
                            "measurementScale": domainName,
                            "objectDOM": $(measurementScaleXML)[0]
                        }, options);
                        break;
                    case "interval":
                        instance = new EMLNumericDomain({
                            "measurementScale": domainName,
                            "objectDOM": $(measurementScaleXML)[0]
                        }, options);
                        break;
                    case "ratio":
                        instance = new EMLNumericDomain({
                            "measurementScale": domainName,
                            "objectDOM": $(measurementScaleXML)[0]
                        }, options);
                        break;
                    case "datetime":
                        instance = new EMLDateTimeDomain({
                            "measurementScale": domainName,
                            "objectDOM": $(measurementScaleXML)[0]
                        }, options);
                        break;
                    default:
                        instance = new EMLNonNumericDomain({
                            "measurementScale": domainName,
                            "objectDOM": $(measurementScaleXML)[0]
                        }, options);
                }

                return instance;
            }
        });

        return EMLMeasurementScale;
    }
);
