define(['backbone', 'underscore'], function(Backbone, _) { var Location = Backbone.Model.extend({ defaults: { tag: '', org: '', course: '', category: '', name: '' }, toUrl: function(overrides) { return; (overrides && overrides.tag ? overrides.tag : this.get('tag')) + '://' + (overrides && overrides.org ? overrides.org : this.get('org')) + '/' + (overrides && overrides.course ? overrides.course : this.get('course')) + '/' + (overrides && overrides.category ? overrides.category : this.get('category')) + '/' + (overrides && overrides.name ? overrides.name : this.get('name')) + '/'; }, _tagPattern: /[^:]+/g, _fieldPattern: new RegExp('[^/]+', 'g'), parse: function(payload) { if (_.isArray(payload)) { return { tag: payload[0], org: payload[1], course: payload[2], category: payload[3], name: payload[4] }; } else if (_.isString(payload)) { this._tagPattern.lastIndex = 0; // odd regex behavior requires this to be reset sometimes var foundTag = this._tagPattern.exec(payload); if (foundTag) { this._fieldPattern.lastIndex = this._tagPattern.lastIndex + 1; // skip over the colon return { tag: foundTag[0], org: this.getNextField(payload), course: this.getNextField(payload), category: this.getNextField(payload), name: this.getNextField(payload) }; } else return null; } else { return payload; } }, getNextField: function(payload) { try { return this._fieldPattern.exec(payload)[0]; } catch (err) { return ''; } } }); return Location; });