|  |  | @ -60,15 +60,15 @@ function DataSet (data, options) { | 
			
		
	
		
			
				
					|  |  |  | // all variants of a Date are internally stored as Date, so we can convert | 
			
		
	
		
			
				
					|  |  |  | // from everything to everything (also from ISODate to Number for example) | 
			
		
	
		
			
				
					|  |  |  | if (this._options.type) { | 
			
		
	
		
			
				
					|  |  |  | for (var field in this._options.type) { | 
			
		
	
		
			
				
					|  |  |  | if (this._options.type.hasOwnProperty(field)) { | 
			
		
	
		
			
				
					|  |  |  | var value = this._options.type[field]; | 
			
		
	
		
			
				
					|  |  |  | if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') { | 
			
		
	
		
			
				
					|  |  |  | this._type[field] = 'Date'; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else { | 
			
		
	
		
			
				
					|  |  |  | this._type[field] = value; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | var fields = Object.keys(this._options.type); | 
			
		
	
		
			
				
					|  |  |  | for (var i = 0, len = fields.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | var field = fields[i]; | 
			
		
	
		
			
				
					|  |  |  | var value = this._options.type[field]; | 
			
		
	
		
			
				
					|  |  |  | if (value == 'Date' || value == 'ISODate' || value == 'ASPDate') { | 
			
		
	
		
			
				
					|  |  |  | this._type[field] = 'Date'; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else { | 
			
		
	
		
			
				
					|  |  |  | this._type[field] = value; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -184,7 +184,7 @@ DataSet.prototype._trigger = function (event, params, senderId) { | 
			
		
	
		
			
				
					|  |  |  | subscribers = subscribers.concat(this._subscribers['*']); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (var i = 0; i < subscribers.length; i++) { | 
			
		
	
		
			
				
					|  |  |  | for (var i = 0, len = subscribers.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | var subscriber = subscribers[i]; | 
			
		
	
		
			
				
					|  |  |  | if (subscriber.callback) { | 
			
		
	
		
			
				
					|  |  |  | subscriber.callback(event, params, senderId || null); | 
			
		
	
	
		
			
				
					|  |  | @ -340,7 +340,7 @@ DataSet.prototype.get = function (args) { | 
			
		
	
		
			
				
					|  |  |  | // build options | 
			
		
	
		
			
				
					|  |  |  | var type = options && options.type || this._options.type; | 
			
		
	
		
			
				
					|  |  |  | var filter = options && options.filter; | 
			
		
	
		
			
				
					|  |  |  | var items = [], item, itemId, i, len; | 
			
		
	
		
			
				
					|  |  |  | var items = [], item, itemIds, itemId, i, len; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // convert items | 
			
		
	
		
			
				
					|  |  |  | if (id != undefined) { | 
			
		
	
	
		
			
				
					|  |  | @ -361,12 +361,12 @@ DataSet.prototype.get = function (args) { | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else { | 
			
		
	
		
			
				
					|  |  |  | // return all items | 
			
		
	
		
			
				
					|  |  |  | for (itemId in this._data) { | 
			
		
	
		
			
				
					|  |  |  | if (this._data.hasOwnProperty(itemId)) { | 
			
		
	
		
			
				
					|  |  |  | item = me._getItem(itemId, type); | 
			
		
	
		
			
				
					|  |  |  | if (!filter || filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | items.push(item); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | itemIds = Object.keys(this._data); | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | itemId = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | item = me._getItem(itemId, type); | 
			
		
	
		
			
				
					|  |  |  | if (!filter || filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | items.push(item); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -391,9 +391,11 @@ DataSet.prototype.get = function (args) { | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // return the results | 
			
		
	
		
			
				
					|  |  |  | if (returnType == 'Object') { | 
			
		
	
		
			
				
					|  |  |  | var result = {}; | 
			
		
	
		
			
				
					|  |  |  | for (i = 0; i < items.length; i++) { | 
			
		
	
		
			
				
					|  |  |  | result[items[i].id] = items[i]; | 
			
		
	
		
			
				
					|  |  |  | var result = {}, | 
			
		
	
		
			
				
					|  |  |  | resultant; | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = items.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | resultant = items[i]; | 
			
		
	
		
			
				
					|  |  |  | result[resultant.id] = resultant; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | return result; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -422,6 +424,7 @@ DataSet.prototype.getIds = function (options) { | 
			
		
	
		
			
				
					|  |  |  | filter = options && options.filter, | 
			
		
	
		
			
				
					|  |  |  | order = options && options.order, | 
			
		
	
		
			
				
					|  |  |  | type = options && options.type || this._options.type, | 
			
		
	
		
			
				
					|  |  |  | itemIds = Object.keys(data), | 
			
		
	
		
			
				
					|  |  |  | i, | 
			
		
	
		
			
				
					|  |  |  | len, | 
			
		
	
		
			
				
					|  |  |  | id, | 
			
		
	
	
		
			
				
					|  |  | @ -434,29 +437,27 @@ DataSet.prototype.getIds = function (options) { | 
			
		
	
		
			
				
					|  |  |  | if (order) { | 
			
		
	
		
			
				
					|  |  |  | // create ordered list | 
			
		
	
		
			
				
					|  |  |  | items = []; | 
			
		
	
		
			
				
					|  |  |  | for (id in data) { | 
			
		
	
		
			
				
					|  |  |  | if (data.hasOwnProperty(id)) { | 
			
		
	
		
			
				
					|  |  |  | item = this._getItem(id, type); | 
			
		
	
		
			
				
					|  |  |  | if (filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | items.push(item); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | id = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | item = this._getItem(id, type); | 
			
		
	
		
			
				
					|  |  |  | if (filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | items.push(item); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | this._sort(items, order); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = items.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | ids[i] = items[i][this._fieldId]; | 
			
		
	
		
			
				
					|  |  |  | ids.push(items[i][this._fieldId]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else { | 
			
		
	
		
			
				
					|  |  |  | // create unordered list | 
			
		
	
		
			
				
					|  |  |  | for (id in data) { | 
			
		
	
		
			
				
					|  |  |  | if (data.hasOwnProperty(id)) { | 
			
		
	
		
			
				
					|  |  |  | item = this._getItem(id, type); | 
			
		
	
		
			
				
					|  |  |  | if (filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | ids.push(item[this._fieldId]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | id = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | item = this._getItem(id, type); | 
			
		
	
		
			
				
					|  |  |  | if (filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | ids.push(item[this._fieldId]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -466,25 +467,23 @@ DataSet.prototype.getIds = function (options) { | 
			
		
	
		
			
				
					|  |  |  | if (order) { | 
			
		
	
		
			
				
					|  |  |  | // create an ordered list | 
			
		
	
		
			
				
					|  |  |  | items = []; | 
			
		
	
		
			
				
					|  |  |  | for (id in data) { | 
			
		
	
		
			
				
					|  |  |  | if (data.hasOwnProperty(id)) { | 
			
		
	
		
			
				
					|  |  |  | items.push(data[id]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | id = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | items.push(data[id]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | this._sort(items, order); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = items.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | ids[i] = items[i][this._fieldId]; | 
			
		
	
		
			
				
					|  |  |  | ids.push(items[i][this._fieldId]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else { | 
			
		
	
		
			
				
					|  |  |  | // create unordered list | 
			
		
	
		
			
				
					|  |  |  | for (id in data) { | 
			
		
	
		
			
				
					|  |  |  | if (data.hasOwnProperty(id)) { | 
			
		
	
		
			
				
					|  |  |  | item = data[id]; | 
			
		
	
		
			
				
					|  |  |  | ids.push(item[this._fieldId]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | id = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | item = data[id]; | 
			
		
	
		
			
				
					|  |  |  | ids.push(item[this._fieldId]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -514,6 +513,9 @@ DataSet.prototype.forEach = function (callback, options) { | 
			
		
	
		
			
				
					|  |  |  | var filter = options && options.filter, | 
			
		
	
		
			
				
					|  |  |  | type = options && options.type || this._options.type, | 
			
		
	
		
			
				
					|  |  |  | data = this._data, | 
			
		
	
		
			
				
					|  |  |  | itemIds = Object.key(data), | 
			
		
	
		
			
				
					|  |  |  | i, | 
			
		
	
		
			
				
					|  |  |  | len, | 
			
		
	
		
			
				
					|  |  |  | item, | 
			
		
	
		
			
				
					|  |  |  | id; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
	
		
			
				
					|  |  | @ -521,7 +523,7 @@ DataSet.prototype.forEach = function (callback, options) { | 
			
		
	
		
			
				
					|  |  |  | // execute forEach on ordered list | 
			
		
	
		
			
				
					|  |  |  | var items = this.get(options); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (var i = 0, len = items.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = items.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | item = items[i]; | 
			
		
	
		
			
				
					|  |  |  | id = item[this._fieldId]; | 
			
		
	
		
			
				
					|  |  |  | callback(item, id); | 
			
		
	
	
		
			
				
					|  |  | @ -529,12 +531,11 @@ DataSet.prototype.forEach = function (callback, options) { | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else { | 
			
		
	
		
			
				
					|  |  |  | // unordered | 
			
		
	
		
			
				
					|  |  |  | for (id in data) { | 
			
		
	
		
			
				
					|  |  |  | if (data.hasOwnProperty(id)) { | 
			
		
	
		
			
				
					|  |  |  | item = this._getItem(id, type); | 
			
		
	
		
			
				
					|  |  |  | if (!filter || filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | callback(item, id); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | id = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | item = this._getItem(id, type); | 
			
		
	
		
			
				
					|  |  |  | if (!filter || filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | callback(item, id); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -556,15 +557,18 @@ DataSet.prototype.map = function (callback, options) { | 
			
		
	
		
			
				
					|  |  |  | type = options && options.type || this._options.type, | 
			
		
	
		
			
				
					|  |  |  | mappedItems = [], | 
			
		
	
		
			
				
					|  |  |  | data = this._data, | 
			
		
	
		
			
				
					|  |  |  | itemIds = Object.keys(data), | 
			
		
	
		
			
				
					|  |  |  | i, | 
			
		
	
		
			
				
					|  |  |  | len, | 
			
		
	
		
			
				
					|  |  |  | id, | 
			
		
	
		
			
				
					|  |  |  | item; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // convert and filter items | 
			
		
	
		
			
				
					|  |  |  | for (var id in data) { | 
			
		
	
		
			
				
					|  |  |  | if (data.hasOwnProperty(id)) { | 
			
		
	
		
			
				
					|  |  |  | item = this._getItem(id, type); | 
			
		
	
		
			
				
					|  |  |  | if (!filter || filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | mappedItems.push(callback(item, id)); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | id = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | item = this._getItem(id, type); | 
			
		
	
		
			
				
					|  |  |  | if (!filter || filter(item)) { | 
			
		
	
		
			
				
					|  |  |  | mappedItems.push(callback(item, id)); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
	
		
			
				
					|  |  | @ -588,17 +592,23 @@ DataSet.prototype._filterFields = function (item, fields) { | 
			
		
	
		
			
				
					|  |  |  | return item; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | var filteredItem = {}; | 
			
		
	
		
			
				
					|  |  |  | var filteredItem = {}, | 
			
		
	
		
			
				
					|  |  |  | itemFields = Object.keys(item), | 
			
		
	
		
			
				
					|  |  |  | len = itemFields.length, | 
			
		
	
		
			
				
					|  |  |  | i, | 
			
		
	
		
			
				
					|  |  |  | field; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if(Array.isArray(fields)){ | 
			
		
	
		
			
				
					|  |  |  | for (var field in item) { | 
			
		
	
		
			
				
					|  |  |  | if (item.hasOwnProperty(field) && (fields.indexOf(field) != -1)) { | 
			
		
	
		
			
				
					|  |  |  | for (i = 0; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | field = itemFields[i]; | 
			
		
	
		
			
				
					|  |  |  | if (fields.indexOf(field) != -1) { | 
			
		
	
		
			
				
					|  |  |  | filteredItem[field] = item[field]; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | }else{ | 
			
		
	
		
			
				
					|  |  |  | for (var field in item) { | 
			
		
	
		
			
				
					|  |  |  | if (item.hasOwnProperty(field) && fields.hasOwnProperty(field)) { | 
			
		
	
		
			
				
					|  |  |  | for (i = 0; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | field = itemFields[i]; | 
			
		
	
		
			
				
					|  |  |  | if (fields.hasOwnProperty(field)) { | 
			
		
	
		
			
				
					|  |  |  | filteredItem[fields[field]] = item[field]; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -715,17 +725,19 @@ DataSet.prototype.clear = function (senderId) { | 
			
		
	
		
			
				
					|  |  |  | */ | 
			
		
	
		
			
				
					|  |  |  | DataSet.prototype.max = function (field) { | 
			
		
	
		
			
				
					|  |  |  | var data = this._data, | 
			
		
	
		
			
				
					|  |  |  | itemIds = Object.keys(data), | 
			
		
	
		
			
				
					|  |  |  | max = null, | 
			
		
	
		
			
				
					|  |  |  | maxField = null; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (var id in data) { | 
			
		
	
		
			
				
					|  |  |  | if (data.hasOwnProperty(id)) { | 
			
		
	
		
			
				
					|  |  |  | var item = data[id]; | 
			
		
	
		
			
				
					|  |  |  | var itemField = item[field]; | 
			
		
	
		
			
				
					|  |  |  | if (itemField != null && (!max || itemField > maxField)) { | 
			
		
	
		
			
				
					|  |  |  | max = item; | 
			
		
	
		
			
				
					|  |  |  | maxField = itemField; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | maxField = null, | 
			
		
	
		
			
				
					|  |  |  | i, | 
			
		
	
		
			
				
					|  |  |  | len; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | var id = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | var item = data[id]; | 
			
		
	
		
			
				
					|  |  |  | var itemField = item[field]; | 
			
		
	
		
			
				
					|  |  |  | if (itemField != null && (!max || itemField > maxField)) { | 
			
		
	
		
			
				
					|  |  |  | max = item; | 
			
		
	
		
			
				
					|  |  |  | maxField = itemField; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
	
		
			
				
					|  |  | @ -739,17 +751,19 @@ DataSet.prototype.max = function (field) { | 
			
		
	
		
			
				
					|  |  |  | */ | 
			
		
	
		
			
				
					|  |  |  | DataSet.prototype.min = function (field) { | 
			
		
	
		
			
				
					|  |  |  | var data = this._data, | 
			
		
	
		
			
				
					|  |  |  | itemIds = Object.keys(data), | 
			
		
	
		
			
				
					|  |  |  | min = null, | 
			
		
	
		
			
				
					|  |  |  | minField = null; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (var id in data) { | 
			
		
	
		
			
				
					|  |  |  | if (data.hasOwnProperty(id)) { | 
			
		
	
		
			
				
					|  |  |  | var item = data[id]; | 
			
		
	
		
			
				
					|  |  |  | var itemField = item[field]; | 
			
		
	
		
			
				
					|  |  |  | if (itemField != null && (!min || itemField < minField)) { | 
			
		
	
		
			
				
					|  |  |  | min = item; | 
			
		
	
		
			
				
					|  |  |  | minField = itemField; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | minField = null, | 
			
		
	
		
			
				
					|  |  |  | i, | 
			
		
	
		
			
				
					|  |  |  | len; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | var id = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | var item = data[id]; | 
			
		
	
		
			
				
					|  |  |  | var itemField = item[field]; | 
			
		
	
		
			
				
					|  |  |  | if (itemField != null && (!min || itemField < minField)) { | 
			
		
	
		
			
				
					|  |  |  | min = item; | 
			
		
	
		
			
				
					|  |  |  | minField = itemField; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
	
		
			
				
					|  |  | @ -765,31 +779,33 @@ DataSet.prototype.min = function (field) { | 
			
		
	
		
			
				
					|  |  |  | */ | 
			
		
	
		
			
				
					|  |  |  | DataSet.prototype.distinct = function (field) { | 
			
		
	
		
			
				
					|  |  |  | var data = this._data; | 
			
		
	
		
			
				
					|  |  |  | var itemIds = Object.keys(data); | 
			
		
	
		
			
				
					|  |  |  | var values = []; | 
			
		
	
		
			
				
					|  |  |  | var fieldType = this._options.type && this._options.type[field] || null; | 
			
		
	
		
			
				
					|  |  |  | var count = 0; | 
			
		
	
		
			
				
					|  |  |  | var i; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (var prop in data) { | 
			
		
	
		
			
				
					|  |  |  | if (data.hasOwnProperty(prop)) { | 
			
		
	
		
			
				
					|  |  |  | var item = data[prop]; | 
			
		
	
		
			
				
					|  |  |  | var value = item[field]; | 
			
		
	
		
			
				
					|  |  |  | var exists = false; | 
			
		
	
		
			
				
					|  |  |  | for (i = 0; i < count; i++) { | 
			
		
	
		
			
				
					|  |  |  | if (values[i] == value) { | 
			
		
	
		
			
				
					|  |  |  | exists = true; | 
			
		
	
		
			
				
					|  |  |  | break; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | if (!exists && (value !== undefined)) { | 
			
		
	
		
			
				
					|  |  |  | values[count] = value; | 
			
		
	
		
			
				
					|  |  |  | count++; | 
			
		
	
		
			
				
					|  |  |  | var i, | 
			
		
	
		
			
				
					|  |  |  | j, | 
			
		
	
		
			
				
					|  |  |  | len; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = itemIds.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | var id = itemIds[i]; | 
			
		
	
		
			
				
					|  |  |  | var item = data[id]; | 
			
		
	
		
			
				
					|  |  |  | var value = item[field]; | 
			
		
	
		
			
				
					|  |  |  | var exists = false; | 
			
		
	
		
			
				
					|  |  |  | for (j = 0; j < count; j++) { | 
			
		
	
		
			
				
					|  |  |  | if (values[j] == value) { | 
			
		
	
		
			
				
					|  |  |  | exists = true; | 
			
		
	
		
			
				
					|  |  |  | break; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | if (!exists && (value !== undefined)) { | 
			
		
	
		
			
				
					|  |  |  | values[count] = value; | 
			
		
	
		
			
				
					|  |  |  | count++; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if (fieldType) { | 
			
		
	
		
			
				
					|  |  |  | for (i = 0; i < values.length; i++) { | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = values.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | values[i] = util.convert(values[i], fieldType); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -819,12 +835,14 @@ DataSet.prototype._addItem = function (item) { | 
			
		
	
		
			
				
					|  |  |  | item[this._fieldId] = id; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | var d = {}; | 
			
		
	
		
			
				
					|  |  |  | for (var field in item) { | 
			
		
	
		
			
				
					|  |  |  | if (item.hasOwnProperty(field)) { | 
			
		
	
		
			
				
					|  |  |  | var fieldType = this._type[field];  // type may be undefined | 
			
		
	
		
			
				
					|  |  |  | d[field] = util.convert(item[field], fieldType); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | var d = {}, | 
			
		
	
		
			
				
					|  |  |  | fields = Object.keys(item), | 
			
		
	
		
			
				
					|  |  |  | i, | 
			
		
	
		
			
				
					|  |  |  | len; | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = fields.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | var field = fields[i]; | 
			
		
	
		
			
				
					|  |  |  | var fieldType = this._type[field];  // type may be undefined | 
			
		
	
		
			
				
					|  |  |  | d[field] = util.convert(item[field], fieldType); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | this._data[id] = d; | 
			
		
	
		
			
				
					|  |  |  | this.length++; | 
			
		
	
	
		
			
				
					|  |  | @ -840,7 +858,7 @@ DataSet.prototype._addItem = function (item) { | 
			
		
	
		
			
				
					|  |  |  | * @private | 
			
		
	
		
			
				
					|  |  |  | */ | 
			
		
	
		
			
				
					|  |  |  | DataSet.prototype._getItem = function (id, types) { | 
			
		
	
		
			
				
					|  |  |  | var field, value; | 
			
		
	
		
			
				
					|  |  |  | var field, value, i, len; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // get the item from the dataset | 
			
		
	
		
			
				
					|  |  |  | var raw = this._data[id]; | 
			
		
	
	
		
			
				
					|  |  | @ -849,22 +867,22 @@ DataSet.prototype._getItem = function (id, types) { | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // convert the items field types | 
			
		
	
		
			
				
					|  |  |  | var converted = {}; | 
			
		
	
		
			
				
					|  |  |  | var converted = {}, | 
			
		
	
		
			
				
					|  |  |  | fields = Object.keys(raw); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if (types) { | 
			
		
	
		
			
				
					|  |  |  | for (field in raw) { | 
			
		
	
		
			
				
					|  |  |  | if (raw.hasOwnProperty(field)) { | 
			
		
	
		
			
				
					|  |  |  | value = raw[field]; | 
			
		
	
		
			
				
					|  |  |  | converted[field] = util.convert(value, types[field]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = fields.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | field = fields[i]; | 
			
		
	
		
			
				
					|  |  |  | value = raw[field]; | 
			
		
	
		
			
				
					|  |  |  | converted[field] = util.convert(value, types[field]); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else { | 
			
		
	
		
			
				
					|  |  |  | // no field types specified, no converting needed | 
			
		
	
		
			
				
					|  |  |  | for (field in raw) { | 
			
		
	
		
			
				
					|  |  |  | if (raw.hasOwnProperty(field)) { | 
			
		
	
		
			
				
					|  |  |  | value = raw[field]; | 
			
		
	
		
			
				
					|  |  |  | converted[field] = value; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | for (i = 0, len = fields.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | field = fields[i]; | 
			
		
	
		
			
				
					|  |  |  | value = raw[field]; | 
			
		
	
		
			
				
					|  |  |  | converted[field] = value; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | return converted; | 
			
		
	
	
		
			
				
					|  |  | @ -890,11 +908,11 @@ DataSet.prototype._updateItem = function (item) { | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // merge with current item | 
			
		
	
		
			
				
					|  |  |  | for (var field in item) { | 
			
		
	
		
			
				
					|  |  |  | if (item.hasOwnProperty(field)) { | 
			
		
	
		
			
				
					|  |  |  | var fieldType = this._type[field];  // type may be undefined | 
			
		
	
		
			
				
					|  |  |  | d[field] = util.convert(item[field], fieldType); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | var fields = Object.keys(item); | 
			
		
	
		
			
				
					|  |  |  | for (var i = 0, len = fields.length; i < len; i++) { | 
			
		
	
		
			
				
					|  |  |  | var field = fields[i]; | 
			
		
	
		
			
				
					|  |  |  | var fieldType = this._type[field];  // type may be undefined | 
			
		
	
		
			
				
					|  |  |  | d[field] = util.convert(item[field], fieldType); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | return id; | 
			
		
	
	
		
			
				
					|  |  |  |