/* * @author Galaburda Oleg a_[w] * http://actualwave.com/ * */ package aw.data{ import flash.net.URLVariables; /** * Упаковывает объекты в формат GET запроса. В отличии от стандартного метода, позволяет упаковывать массивы и объекты(ассоциативные массивы). * * * * @playerversion Flash 9.0.28.0 * @langversion 3.0 */ public class URLPacker extends Object{ /** * * @private (constant) */ static public const SPACER:String = '&'; /** * * @private (constant) */ static public const IDENTIFIER:String = '?'; /** * * @private (constant) */ static public const LBRACKET:String = '['; /** * * @private (constant) */ static public const RBRACKET:String = ']'; /** * * @private (constant) */ static public const EQUAL:String = '='; /** * * @private (constant) */ static public const TRUE:String = 'true'; /** * * @private (constant) */ static public const FALSE:String = 'false'; /** * * @public */ static public var useNumberInsteadOfBoolean:Boolean = false; /** * Упаковка данных в строку формата GET запроса. * * @param o * @return String * @playerversion Flash 9.0.28.0 * @langversion 3.0 */ static public function pack(o:Object):String{ return packObject(o, '').substr(1); } /** * * @private * @param o * @param nm * @return String * @playerversion Flash 9.0.28.0 * @langversion 3.0 */ static private function packObject(o:Object, nm:String):String{ var ret:String = ''; var name:String; var value:*; for(var p:String in o){ value = o[p]; name = nm ? nm+LBRACKET+encodeURI(p)+RBRACKET : encodeURI(p); if(value is Number || value is String){ ret += SPACER+name+EQUAL+encodeURI(String(value)); }else if(value is Boolean){ ret += SPACER+name+EQUAL; if(useNumberInsteadOfBoolean) ret += String(value ? 1 : 0); else ret += String(value); }else if(value===null) ret += SPACER+name+EQUAL; else if(!value) continue; else ret += packObject(value, name); } return ret; } /** * Упаковка данных в объект URLVariables, для отправки запроса. * * @param input * @param output * @param encodeValue * @return String * @playerversion Flash 9.0.28.0 * @langversion 3.0 */ static public function packInto(input:Object, output:Object=null, encodeValue:Boolean=false):Object{ if(!output) output = new URLVariables(); packObjectInto(input, '', output, encodeValue); return output; } /** * * @private * @param input * @param name * @param output * @param encodeValue * @return String * @playerversion Flash 9.0.28.0 * @langversion 3.0 */ static private function packObjectInto(input:Object, nm:String, output:Object, encodeValue:Boolean=true):void{ var name:String; var value:*; for(var p:String in input){ value = input[p]; name = nm ? nm+LBRACKET+encodeURI(p)+RBRACKET : encodeURI(p); if(value is Number || value is String){ output[name] = encodeValue ? encodeURI(value) : value; }else if(value is Boolean){ if(useNumberInsteadOfBoolean) output[name] = String(value ? 1 : 0); else output[name] = String(value); }else if(value===null) output[name] = null; else if(!value) continue; else packObjectInto(value, name, output, encodeValue); } } /** * Распаковка данных из строки формата GET запроса. * @public * @param str * @return Object * @playerversion Flash 9.0.28.0 * @langversion 3.0 */ static public function unpack(str:String, output:Object=null):Object{ if(str.charAt(0)==IDENTIFIER) str = str.substr(1); if(!output) output = {}; var arr:Array = str.split(SPACER); var len:int = arr.length; for(var i:int=0; i