// Module for array conversion SVG.Array = function(array, fallback) { array = (array || []).valueOf() /* if array is empty and fallback is provided, use fallback */ if (array.length == 0 && fallback) array = fallback.valueOf() /* parse array */ this.value = this.parse(array) } SVG.extend(SVG.Array, { // Make array morphable morph: function(array) { this.destination = this.parse(array) /* normalize length of arrays */ if (this.value.length != this.destination.length) { var lastValue = this.value[this.value.length - 1] , lastDestination = this.destination[this.destination.length - 1] while(this.value.length > this.destination.length) this.destination.push(lastDestination) while(this.value.length < this.destination.length) this.value.push(lastValue) } return this } // Clean up any duplicate points , settle: function() { var i, seen = [] /* find all unique values */ for (i = this.value.length - 1; i >= 0; i--) if (seen.indexOf(this.value[i]) == -1) seen.push(this.value[i]) /* set new value */ return this.value = seen } // Get morphed array at given position , at: function(pos) { /* make sure a destination is defined */ if (!this.destination) return this /* generate morphed array */ for (var i = 0, il = this.value.length, array = []; i < il; i++) array.push(this.value[i] + (this.destination[i] - this.value[i]) * pos) return new SVG.Array(array) } // Convert array to string , toString: function() { return this.value.join(' ') } // Real value , valueOf: function() { return this.value } // Parse whitespace separated string , parse: function(array) { array = array.valueOf() /* if already is an array, no need to parse it */ if (Array.isArray(array)) return array return this.split(array) } // Strip unnecessary whitespace , split: function(string) { return string.replace(/\s+/g, ' ').replace(/^\s+|\s+$/g,'').split(' ') } })