// 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() { // find all unique values for (var i = 0, il = this.value.length, seen = []; i < il; 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.trim().split(SVG.regex.delimiter).map(parseFloat) } // Reverse array , reverse: function() { this.value.reverse() return this } , clone: function() { var clone = new this.constructor() clone.value = array_clone(this.value) return clone } })