| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| |
| |
| dojo.provide("dojo.charting.Series"); |
| dojo.require("dojo.lang.common"); |
| dojo.require("dojo.charting.Plotters"); |
| dojo.charting.Series = function (kwArgs) { |
| var args = kwArgs || {length:1}; |
| this.dataSource = args.dataSource || null; |
| this.bindings = {}; |
| this.color = args.color; |
| this.label = args.label; |
| if (args.bindings) { |
| for (var p in args.bindings) { |
| this.addBinding(p, args.bindings[p]); |
| } |
| } |
| }; |
| dojo.extend(dojo.charting.Series, {bind:function (src, bindings) { |
| this.dataSource = src; |
| this.bindings = bindings; |
| }, addBinding:function (name, binding) { |
| this.bindings[name] = binding; |
| }, evaluate:function (kwArgs) { |
| var ret = []; |
| var a = this.dataSource.getData(); |
| var l = a.length; |
| var start = 0; |
| var end = l; |
| if (kwArgs) { |
| if (kwArgs.between) { |
| for (var i = 0; i < l; i++) { |
| var fld = this.dataSource.getField(a[i], kwArgs.between.field); |
| if (fld >= kwArgs.between.low && fld <= kwArgs.between.high) { |
| var o = {src:a[i], series:this}; |
| for (var p in this.bindings) { |
| o[p] = this.dataSource.getField(a[i], this.bindings[p]); |
| } |
| ret.push(o); |
| } |
| } |
| } else { |
| if (kwArgs.from || kwArgs.length) { |
| if (kwArgs.from) { |
| start = Math.max(kwArgs.from, 0); |
| if (kwArgs.to) { |
| end = Math.min(kwArgs.to, end); |
| } |
| } else { |
| if (kwArgs.length < 0) { |
| start = Math.max((end + length), 0); |
| } else { |
| end = Math.min((start + length), end); |
| } |
| } |
| for (var i = start; i < end; i++) { |
| var o = {src:a[i], series:this}; |
| for (var p in this.bindings) { |
| o[p] = this.dataSource.getField(a[i], this.bindings[p]); |
| } |
| ret.push(o); |
| } |
| } |
| } |
| } else { |
| for (var i = start; i < end; i++) { |
| var o = {src:a[i], series:this}; |
| for (var p in this.bindings) { |
| o[p] = this.dataSource.getField(a[i], this.bindings[p]); |
| } |
| ret.push(o); |
| } |
| } |
| if (ret.length > 0 && typeof (ret[0].x) != "undefined") { |
| ret.sort(function (a, b) { |
| if (a.x > b.x) { |
| return 1; |
| } |
| if (a.x < b.x) { |
| return -1; |
| } |
| return 0; |
| }); |
| } |
| return ret; |
| }, trends:{createRange:function (values, len) { |
| var idx = values.length - 1; |
| var length = (len || values.length); |
| return {"index":idx, "length":length, "start":Math.max(idx - length, 0)}; |
| }, mean:function (values, len) { |
| var range = this.createRange(values, len); |
| if (range.index < 0) { |
| return 0; |
| } |
| var total = 0; |
| var count = 0; |
| for (var i = range.index; i >= range.start; i--) { |
| total += values[i].y; |
| count++; |
| } |
| total /= Math.max(count, 1); |
| return total; |
| }, variance:function (values, len) { |
| var range = this.createRange(values, len); |
| if (range.index < 0) { |
| return 0; |
| } |
| var total = 0; |
| var square = 0; |
| var count = 0; |
| for (var i = range.index; i >= range.start; i--) { |
| total += values[i].y; |
| square += Math.pow(values[i].y, 2); |
| count++; |
| } |
| return (square / count) - Math.pow(total / count, 2); |
| }, standardDeviation:function (values, len) { |
| return Math.sqrt(this.getVariance(values, len)); |
| }, max:function (values, len) { |
| var range = this.createRange(values, len); |
| if (range.index < 0) { |
| return 0; |
| } |
| var max = Number.MIN_VALUE; |
| for (var i = range.index; i >= range.start; i--) { |
| max = Math.max(values[i].y, max); |
| } |
| return max; |
| }, min:function (values, len) { |
| var range = this.createRange(values, len); |
| if (range.index < 0) { |
| return 0; |
| } |
| var min = Number.MAX_VALUE; |
| for (var i = range.index; i >= range.start; i--) { |
| min = Math.min(values[i].y, min); |
| } |
| return min; |
| }, median:function (values, len) { |
| var range = this.createRange(values, len); |
| if (range.index < 0) { |
| return 0; |
| } |
| var a = []; |
| for (var i = range.index; i >= range.start; i--) { |
| var b = false; |
| for (var j = 0; j < a.length; j++) { |
| if (values[i].y == a[j]) { |
| b = true; |
| break; |
| } |
| } |
| if (!b) { |
| a.push(values[i].y); |
| } |
| } |
| a.sort(); |
| if (a.length > 0) { |
| return a[Math.ceil(a.length / 2)]; |
| } |
| return 0; |
| }, mode:function (values, len) { |
| var range = this.createRange(values, len); |
| if (range.index < 0) { |
| return 0; |
| } |
| var o = {}; |
| var ret = 0; |
| var median = Number.MIN_VALUE; |
| for (var i = range.index; i >= range.start; i--) { |
| if (!o[values[i].y]) { |
| o[values[i].y] = 1; |
| } else { |
| o[values[i].y]++; |
| } |
| } |
| for (var p in o) { |
| if (median < o[p]) { |
| median = o[p]; |
| ret = p; |
| } |
| } |
| return ret; |
| }}}); |
| |