class Utilities { //animation parameters static var animationSpeedFactor:Number = 0.55; //currency formatting parameters static var currencySymbol:String = "$"; static var currencySuffix:String = ""; static var negativeSymbol:String = "-"; static var thousandSeparatorSymbol:String = ","; static var decimalSeparatorSymbol:String = "."; static var addDecimalZeroesToWholeNumbers:Boolean = false; static function addToArrayIfNotAlready(obj:Object, arr:Array):Number { for (var n:Number = 0; n < arr.length; n++) { if (arr[n] == obj) { return 0; } } arr.push(obj); return 1; } static function animateRectangleTo(targetMc:MovieClip, speed:Number, easing:Boolean, callback:Function, shapeHeightStart:Number, shapeHeightEnd:Number, shapeWidthStart:Number, shapeWidthEnd:Number, cornerRadius:Number, fillColor1:Number, fillColor2:Number, fillAlpha:Number, shapeX:Number, shapeY:Number, lineColor:Number, lineThickness:Number, lineAlpha:Number):Void { fillColor2 = (fillColor2 != undefined) ? fillColor2 : fillColor1; fillAlpha = (fillAlpha != undefined) ? fillAlpha : 100; shapeX = (shapeX != undefined) ? shapeX : 0; shapeY = (shapeY != undefined) ? shapeY : 0; lineColor = (lineColor != undefined) ? lineColor : 0x000000; lineThickness = (lineThickness != undefined) ? lineThickness : 0; lineAlpha = (lineAlpha != undefined) ? lineAlpha : 0; targetMc.startH = shapeHeightStart; targetMc.startW = shapeWidthStart; targetMc.onEnterFrame = function() { if (easing) { //Animate values this.startH = Utilities.approach(this.startH, shapeHeightEnd, speed); this.startW = Utilities.approach(this.startW, shapeWidthEnd, speed); //When objects get close to destination values if (Math.round(this.startH) - shapeHeightEnd == 0 && Math.round(this.startW) - shapeWidthEnd == 0) { //Nudge objects into final values this.startH = shapeHeightEnd; this.startW = shapeWidthEnd; Utilities.drawRectangle(this, this.startH, this.startW, cornerRadius, fillColor1, fillColor2, fillAlpha, shapeX, shapeY, lineColor, lineThickness, lineAlpha); callback(); //Delete listener delete targetMc.onEnterFrame; } Utilities.drawRectangle(this, this.startH, this.startW, cornerRadius, fillColor1, fillColor2, fillAlpha, shapeX, shapeY, lineColor, lineThickness, lineAlpha); } else { this.startH += (this.startH < this.endH) ? speed : 0; this.startH = (this.startH >= this.endH) ? this.endH : this.startH; this.startW += (this.startW < this.endW) ? speed : 0; this.startW = (this.startW >= this.endW) ? this.endW : this.startW; if (this.startH >= this.endH && this.startW >= this.endW) { delete targetMc.onEnterFrame; callback(); } else { Utilities.drawRectangle(this, this.startH, this.startW, cornerRadius, fillColor1, fillColor2, fillAlpha, shapeX, shapeY, lineColor, lineThickness, lineAlpha); } } } } static function animateTo(clipObj:Object, destX:Number, destY:Number, destAlpha:Number, callback:Function):Void { var func:Function = (callback != undefined) ? callback : function() { }; //Closer to 1 = Slower / Closer to 0 = Faster var animationSpeed:Number = Utilities.animationSpeedFactor; //As a precaution delete any previous listeners delete clipObj.onEnterFrame; //Declare listener clipObj.onEnterFrame = function() { //Animate values clipObj._x = Utilities.approach(this._x, destX, Number(animationSpeed)); clipObj._y = Utilities.approach(this._y, destY, Number(animationSpeed)); clipObj._alpha = Utilities.approach(this._alpha, destAlpha, Number(animationSpeed)); //When objects get close to destination values if (Math.round(clipObj._y) - destY == 0 && Math.round(clipObj._x) - destX == 0 && Math.round(clipObj._alpha) - destAlpha == 0) { //Nudge objects into final values clipObj._x = destX; clipObj._y = destY; clipObj._alpha = destAlpha; //Callback func(); //Delete listener delete clipObj.onEnterFrame; } } } static function animateToFull(clipObj:Object, destX:Number, destY:Number, destXscale:Number, destYscale:Number, destRotation:Number, destAlpha:Number, animSpeed:Number, callback:Function):Void { var func:Function = (callback != undefined) ? callback : function() { }; //Closer to 1 = Slower / Closer to 0 = Faster var animationSpeed:Number = animSpeed; //As a precaution delete any previous listeners delete clipObj.onEnterFrame; //Declare listener clipObj.onEnterFrame = function() { //Animate values clipObj._x = Utilities.approach(this._x, destX, Number(animationSpeed)); clipObj._y = Utilities.approach(this._y, destY, Number(animationSpeed)); clipObj._xscale = Utilities.approach(this._xscale, destXscale, Number(animationSpeed)); clipObj._yscale = Utilities.approach(this._yscale, destYscale, Number(animationSpeed)); clipObj._rotation = Utilities.approach(this._rotation, destRotation, Number(animationSpeed)); clipObj._alpha = Utilities.approach(this._alpha, destAlpha, Number(animationSpeed)); //When objects get close to destination values if (Math.round(clipObj._y) - destY == 0 && Math.round(clipObj._x) - destX == 0 && Math.round(clipObj._xscale) - destXscale == 0 && Math.round(clipObj._yscale) - destYscale == 0 && Math.round(clipObj._rotation) - destRotation == 0 && Math.round(clipObj._alpha) - destAlpha == 0) { //Nudge objects into final values clipObj._x = destX; clipObj._y = destY; clipObj._xscale = destXscale; clipObj._yscale = destYscale; clipObj._rotation = destRotation; clipObj._alpha = destAlpha; //Callback func(); //Delete listener delete clipObj.onEnterFrame; } } } static function approach(number:Number, dest:Number, factor:Number):Number { return ((number - dest) * factor + dest); } static function drawButton(target:MovieClip, clipName:String, shapeHeight:Number, shapeWidth:Number, cornerRadius:Number, fillColorUp1:Number, fillColorUp2:Number, fillColorDown1:Number, fillColorDown2:Number, labelHtml:String, fontSize:Number, fontColor:Number, fontName:String, pressFunction:Function, value:String):MovieClip { //MAKE BUTTON CONTAINER CLIP var mc:MovieClip = target.createEmptyMovieClip(clipName, target.getNextHighestDepth()); //MAKE BACKING CONTAINER CLIP var backingMc:MovieClip = mc.createEmptyMovieClip("backing", mc.getNextHighestDepth()); //DEFINE GRADIENT FILL PARAMETERS var colorArray:Array = [fillColorUp1, fillColorUp2]; var alphaArray:Array = [100, 100]; var ratioArray:Array = [0, 255]; var matrixObject:Object = { matrixType:"box", x:0, y:0, w:shapeWidth, h:shapeHeight, r:Math.PI / 2 }; mc.draw = function(colArray:Array, alpArray:Array, ratArray:Array, matObject:Object) { with (this.backing) { //DRAW SHAPE clear(); // FILL TYPE, COLORS, OPACITY, RATIOS(COLOR POSITIONS), MATRIX beginGradientFill("linear", colArray, alpArray, ratArray, matObject); // THICKNESS, COLOR, OPACITY lineStyle(0, 0x000000, 0); moveTo(cornerRadius, 0); lineTo(shapeWidth - cornerRadius, 0); curveTo(shapeWidth, 0, shapeWidth, cornerRadius); lineTo(shapeWidth, cornerRadius); lineTo(shapeWidth, shapeHeight - cornerRadius); curveTo(shapeWidth, shapeHeight, shapeWidth - cornerRadius, shapeHeight); lineTo(shapeWidth - cornerRadius, shapeHeight); lineTo(cornerRadius, shapeHeight); curveTo(0, shapeHeight, 0, shapeHeight - cornerRadius); lineTo(0, shapeHeight - cornerRadius); lineTo(0, cornerRadius); curveTo(0, 0, cornerRadius,0); lineTo(cornerRadius, 0); endFill(); } } mc.draw(colorArray, alphaArray, ratioArray, matrixObject); //MAKE LABEL CONTAINER CLIP var labelMc:MovieClip = mc.createEmptyMovieClip("label", mc.getNextHighestDepth()); //MAKE LABEL TEXT FIELD var tf:TextField = labelMc.createTextField("tf", labelMc.getNextHighestDepth(), 0, 0, shapeHeight, shapeWidth); tf.antiAliasType = "advanced"; tf.selectable = false; tf.wordWrap = true; tf.multiline = true; tf.embedFonts = true; var fmt:TextFormat = new TextFormat(); fmt.align = 'center'; fmt.font = fontName; fmt.color = fontColor; fmt.size = fontSize; tf.setNewTextFormat(fmt); tf.html = true; tf.htmlText = labelHtml; tf.autoSize = "center"; tf._width = shapeWidth; //CENTER LABEL POSITION labelMc._x = (backingMc._width - labelMc._width) / 2; labelMc._y = (backingMc._height - labelMc._height) / 2; mc.isSelected = false; mc.callback = pressFunction; mc.val = value; mc.select = function() { var colArray:Array = [fillColorDown1, fillColorDown2]; var alpArray:Array = [100, 100]; var ratArray:Array = [0, 255]; var matObject:Object = { matrixType:"box", x:0, y:0, w:shapeWidth, h:shapeHeight, r:Math.PI / 2 }; this.draw(colArray, alpArray, ratArray, matObject); this.isSelected = true; } mc.unselect = function() { var colArray:Array = [fillColorUp1, fillColorUp2]; var alpArray:Array = [100, 100]; var ratArray:Array = [0, 255]; var matObject:Object = { matrixType:"box", x:0, y:0, w:shapeWidth, h:shapeHeight, r:Math.PI / 2 }; this.draw(colArray, alpArray, ratArray, matObject); this.isSelected = false; } mc.onPress = function() { if(!this.isSelected) { this.select(); this.callback(value); } else { this.unselect(); this.callback(""); } } return mc; } static function drawCircle(target:MovieClip, radius:Number, fillColor1:Number, fillColor2:Number, fillAlpha:Number, shapeX:Number, shapeY:Number, lineColor:Number, lineThickness:Number, lineAlpha:Number):Void { //MAKE SHAPE CONTAINER CLIP var shapeWidth:Number = radius * 2; var shapeHeight:Number = radius * 2; //DEFINE GRADIENT FILL PARAMETERS var colorArray:Array = [fillColor1, fillColor2]; var alphaArray:Array = [fillAlpha, fillAlpha]; var ratioArray:Array = [0, 255]; var matrixObject:Object = { matrixType:"box", x:shapeX, y:shapeY - radius, w:shapeWidth, h:shapeHeight, r:Math.PI / 2 }; with(target) { //DRAW SHAPE clear(); _x = 0; _y = 0; var pi:Number = Math.PI; var cos:Function = Math.cos; var sin:Function = Math.sin; beginGradientFill("linear", colorArray, alphaArray, ratioArray, matrixObject); lineStyle(lineThickness, lineColor, lineAlpha); moveTo(shapeX + radius, shapeY); for(var i:Number = 0; i < pi * .64; i += .01) { lineTo(shapeX + radius * cos(pi * i), shapeY + radius * sin(pi * i)); } lineTo(shapeX + radius, shapeY); endFill(); } } static function drawRectangle(target:MovieClip, shapeHeight:Number, shapeWidth:Number, cornerRadius:Number, fillColor1:Number, fillColor2:Number, fillAlpha:Number, shapeX:Number, shapeY:Number, lineColor:Number, lineThickness:Number, lineAlpha:Number):Void { //DEFINE GRADIENT FILL PARAMETERS var colorArray:Array = [fillColor1, fillColor2]; var alphaArray:Array = [fillAlpha, fillAlpha]; var ratioArray:Array = [0, 255]; var matrixObject:Object = { matrixType:"box", x:shapeX, y:0, w:shapeWidth, h:shapeHeight, r:Math.PI / 2 }; with(target) { //DRAW SHAPE clear(); // FILL TYPE, COLORS, OPACITY, RATIOS(COLOR POSITIONS), MATRIX beginGradientFill("linear", colorArray, alphaArray, ratioArray, matrixObject); // THICKNESS, COLOR, OPACITY lineStyle(lineThickness, lineColor, lineAlpha); moveTo(cornerRadius, 0); lineTo(shapeWidth - cornerRadius, 0); curveTo(shapeWidth, 0, shapeWidth, cornerRadius); lineTo(shapeWidth, cornerRadius); lineTo(shapeWidth, shapeHeight - cornerRadius); curveTo(shapeWidth, shapeHeight, shapeWidth - cornerRadius, shapeHeight); lineTo(shapeWidth - cornerRadius, shapeHeight); lineTo(cornerRadius, shapeHeight); curveTo(0, shapeHeight, 0, shapeHeight - cornerRadius); lineTo(0, shapeHeight - cornerRadius); lineTo(0, cornerRadius); curveTo(0, 0, cornerRadius,0); lineTo(cornerRadius, 0); endFill(); } //POSITION SHAPE CLIP target._x = shapeX; target._y = shapeY; } static function drawWedge(mc:MovieClip, radius:Number, sizeInDegrees:Number, startAngle:Number, strokeSize:Number, strokeColor:Number, strokeOpacity:Number, fillColor:Number, fillOpacity:Number) { mc.clear(); var segAngle:Number, theta:Number, angle:Number, angleMid:Number, segs:Number, ax:Number, ay:Number, bx:Number, by:Number, cx:Number, cy:Number, lstyle:Array, fstyle:Array; lstyle = [strokeSize, strokeColor, strokeOpacity]; fstyle = [fillColor, fillOpacity]; sizeInDegrees = (Math.abs(sizeInDegrees) > 360) ? 360 : sizeInDegrees; segs = Math.ceil(Math.abs(sizeInDegrees) / 45); segAngle = sizeInDegrees / segs; theta = -(segAngle / 180) * Math.PI; angle = -((startAngle + 90) / 180) * Math.PI; ax = Math.cos(angle) * radius; ay = Math.sin(angle) * radius; mc.lineStyle.apply(mc, lstyle); mc.beginFill.apply(mc, fstyle); mc.moveTo(0, 0); mc.lineTo(ax, ay); if(segs > 0) { for (var i:Number = 0; i < segs; i++) { angle += theta; angleMid = angle - (theta / 2); bx = Math.cos(angle) * radius; by = Math.sin(angle) * radius; cx = Math.cos(angleMid) * (radius / Math.cos(theta / 2)); cy = Math.sin(angleMid) * (radius / Math.cos(theta / 2)); mc.curveTo(cx, cy, bx, by); } } mc.endFill(); } static function duplicateArray(arr:Array):Array { return arr.concat(); } static function fadeInAndShow(mc:MovieClip):Boolean { if(mc._visible == false) { mc._alpha = 0; mc._visible = true; animateTo(mc, mc._x, mc._y, 100); return true; } return false } static function fadeOutAndHide(mc:MovieClip):Boolean { if(mc._visible == true) { var animationSpeed:Number = animationSpeedFactor; var destAlpha:Number = 0; //As a precaution delete any previous listeners delete mc.onEnterFrame; //Declare listener mc.onEnterFrame = function() { //Animate values mc._alpha = Utilities.approach(this._alpha, destAlpha, Number(animationSpeed)); //When objects get close to destination values if (Math.round(mc._alpha) - destAlpha == 0) { //Nudge objects into final values mc._alpha = destAlpha; mc._visible = false; //Delete listener delete mc.onEnterFrame; } } return true; } return false; } static function formatAsDollars(amt:Number):String { var amtStr:String = (String(amt) != "Infinity") ? String(amt) : '0'; var negativeText = ""; if(amtStr.substr(0,1) == "-") { amtStr = amtStr.slice(1); negativeText = negativeSymbol; } if (isNaN(amtStr)) { if(addDecimalZeroesToWholeNumbers == true) { return currencySymbol + "0" + decimalSeparatorSymbol + "00" + currencySuffix; } else { return currencySymbol + "0" + currencySuffix; } } var amount:Number = Math.round(Number(amtStr) * 100) / 100; var amount_str:String = String(amount); var amount_array:Array = amount_str.split("."); if (amount_array[1] == undefined && addDecimalZeroesToWholeNumbers == true) { amount_array[1] = "00"; } if (amount_array[1].length == 1) { amount_array[1] += "0"; } var dollar_array:Array = new Array(); var start:Number; var end:Number = amount_array[0].length; while (end > 0) { start = Math.max(end - 3, 0); dollar_array.unshift(amount_array[0].slice(start, end)); end = start; } amount_array[0] = dollar_array.join(thousandSeparatorSymbol); if (amount_array[1] == undefined) { return (negativeText + currencySymbol + amount_array.join("") + currencySuffix); } else { return (negativeText + currencySymbol + amount_array.join(decimalSeparatorSymbol) + currencySuffix); } } static function getArrayOfIntervals(startNum:Number, endNum:Number, intervalCountNum:Number):Array { var intervalArray = []; var interval = (endNum - startNum) / (intervalCountNum - 1); for(var n = 0; n < intervalCountNum; n++) { intervalArray.push((interval * n) + startNum); } return intervalArray; } static function getPositionInRangeArray(rangeSet:String, value:Number):Number { //EXAMPLE(rangeSet = 11-24^25-49^50-99^100-99999) //Split main array var ranges:Array = rangeSet.split("^"); //Split inner arrays for(var n:Number = 0; n < ranges.length; n++) { ranges[n] = ranges[n].split("-"); } //Find value for(var n:Number = 0; n < ranges.length; n++) { if(Number(value) >= Number(ranges[n][0]) && Number(value) <= Number(ranges[n][1])) { return n; } } } static function getPositionOfNumberInArray(arr:Array, num:Number):Number { for (var n:Number = 0; n < arr.length; n++) { if (arr[n] == num) { return n; } } return -1; } static function getPositionOfStringInArray(arr:Array, str:String):Number { for (var n:Number = 0; n < arr.length; n++) { if (arr[n] == str) { return n; } } return -1; } static function getUniqueArrayElements(arr:Array):Array { var newArr:Array = new Array(); var checker:Object = new Object(); for (var i:Number = 0; i < arr.length; i++) { var c:String = arr[i]; if (!checker.hasOwnProperty(c)) { newArr.push(c); checker[c] = true; } } return newArr; } static function getValueInRange(rangeSet:String, valueSet:String, currentRangePos:Number):Number { //EXAMPLE(rangeSet = 11-24^25-49^50-99^100-99999) //EXAMPLE(valueSet = 48^45^42^39) //Split main arrays var ranges:Array = rangeSet.split("^"); var values:Array = valueSet.split("^"); //Split inner arrays for(var n:Number = 0; n < ranges.length; n++) { ranges[n] = ranges[n].split("-"); } //Find value for(var n:Number = 0; n < ranges.length; n++) { if(Number(currentRangePos) >= Number(ranges[n][0]) && Number(currentRangePos) <= Number(ranges[n][1])) { return Number(values[n]); } } //If no valid results return -1; } static function getValueInRangeArray(rangeSet:String, valueSet:String, currentRangePos:Number):Array { //EXAMPLE(rangeSet = 11-24^25-49^50-99^100-99999) //EXAMPLE(valueSet = 48^45^42^39) //returnArray = [value, rangeStart, rangeEnd, total] var returnArray:Array = [0, 0, 0, 0]; //Split main arrays var ranges:Array = rangeSet.split("^"); var values:Array = valueSet.split("^"); //Split inner arrays for(var n:Number = 0; n < ranges.length; n++) { ranges[n] = ranges[n].split("-"); } //Find value for(var n:Number = 0; n < ranges.length; n++) { if(Number(currentRangePos) >= Number(ranges[n][0]) && Number(currentRangePos) <= Number(ranges[n][1])) { returnArray[0] = Number(values[n]); returnArray[1] = Number(ranges[n][0]); returnArray[2] = Number(ranges[n][1]); returnArray[3] = Number(currentRangePos) * Number(values[n]); if(n == ranges.length - 1) { returnArray[1] = Number(ranges[n][0]) + "+"; returnArray[2] = ""; } } } return returnArray; } static function isSet(value:Object):Boolean { return (value != undefined && value != null && value != "") ? true : false; } static function loadSmoothedImage(url:String, target:MovieClip):Void { var original:MovieClip = target.createEmptyMovieClip("original", target.getNextHighestDepth()); var listener:Object = new Object(); listener.target = target; listener.onLoadInit = function(orig:MovieClip) { orig._visible = false; var bitmap = new flash.display.BitmapData(orig._width, orig._height, true, 0x000000); this.target.attachBitmap(bitmap, this.target.getNextHighestDepth(), "auto", true); bitmap.draw(orig); removeMovieClip(original._target); delete this.target.loader; if(typeof(this.target.whenLoaded) == "function") { this.target.whenLoaded(); } } var loader:MovieClipLoader = new MovieClipLoader(); loader.addListener(listener); loader.loadClip(url, original); } static function removeSubstring(originalStr:String, strToRemove:String):String { var splittedArray:Array = originalStr.split(strToRemove); return splittedArray.join(""); } static function roundToNearestCent(num:Number):Number { var n:Number = Math.round(num * 100) / 100; return n; } static function searchAndRemoveFirstOccurrenceFromArray(searchedArray:Array, searchItem:Object):Void { for (var n:Number = 0; n < searchedArray.length; n++) { if (searchedArray[n] == searchItem) { searchedArray.splice(n, 1); break; } } } static function searchAndRemoveFromArray(searchedArray:Array, searchItem:Object):Void { for (var n:Number = 0; n < searchedArray.length; n++) { if (searchedArray[n] == searchItem) { searchedArray.splice(n, 1); n--; } } } static function searchAndReplaceString(stringToSearch:String, stringToReplace:String, replacementString:String):String { var stringArray:Array = stringToSearch.split(stringToReplace); var txt:String = ''; if(stringArray.length > 1) { txt = stringArray.join(replacementString); } else { txt = stringToSearch; } return txt; } static function stringArrayToNumberArray(strArray:Array):Array { var arr:Array = []; for(var n:Number = 0; n < strArray.length; n++) { arr.push(Number(strArray[n])); } return arr; } static function stripNonNumericalChars(originalStr:String):Number { var splittedArray:Array = originalStr.split(""); for(var n:Number = 0; n < splittedArray.length; n++) { if(splittedArray[n] != "." && isNaN(splittedArray[n]) && splittedArray[n] != "0") { splittedArray[n] = ""; } } var joined:String = splittedArray.join(""); return (joined.length >= 1) ? Number(joined) : 0; } }